diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
index 0d97c9d3c7a6..584b3f145de0 100644
--- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
+++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm
@@ -1138,7 +1138,6 @@
/obj/effect/turf_decal/siding/purple{
dir = 9
},
-/obj/machinery/monkey_recycler,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/dark,
/area/misc/anomaly_research)
diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
index 3cbe3ca2ddc3..fb1cc9c069e9 100644
--- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
+++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm
@@ -375,9 +375,8 @@
/turf/open/floor/carpet/black,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"jC" = (
-/mob/living/simple_animal/slime{
- colour = "bluespace";
- rabid = 1
+/mob/living/basic/slime{
+ current_color = /datum/slime_color/bluespace
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/titanium/tiled/purple,
@@ -903,9 +902,8 @@
/turf/open/floor/mineral/titanium/tiled/white,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"wY" = (
-/mob/living/simple_animal/slime{
- colour = "bluespace";
- rabid = 1
+/mob/living/basic/slime{
+ current_color = /datum/slime_color/bluespace
},
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
@@ -1610,7 +1608,6 @@
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"JW" = (
/obj/machinery/light/broken/directional/north,
-/obj/machinery/monkey_recycler,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"Kd" = (
@@ -2192,9 +2189,8 @@
dir = 10
},
/obj/effect/decal/cleanable/dirt,
-/mob/living/simple_animal/slime{
- colour = "bluespace";
- rabid = 1
+/mob/living/basic/slime{
+ current_color = /datum/slime_color/bluespace
},
/turf/open/floor/mineral/titanium/tiled/purple,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
@@ -2330,9 +2326,8 @@
/turf/open/floor/wood,
/area/ruin/space/has_grav/powered/hilbertresearchfacility)
"Ze" = (
-/mob/living/simple_animal/slime{
- colour = "bluespace";
- rabid = 1
+/mob/living/basic/slime{
+ current_color = /datum/slime_color/bluespace
},
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/plastitanium,
diff --git a/_maps/map_files/Basketball/lusty_xenomorphs.dmm b/_maps/map_files/Basketball/lusty_xenomorphs.dmm
index 6aa3dae075e7..0be3c0688e97 100644
--- a/_maps/map_files/Basketball/lusty_xenomorphs.dmm
+++ b/_maps/map_files/Basketball/lusty_xenomorphs.dmm
@@ -218,7 +218,7 @@
/turf/open/floor/engine,
/area/centcom/basketball)
"pu" = (
-/mob/living/simple_animal/slime/random,
+/mob/living/basic/slime/random,
/turf/open/floor/engine,
/area/centcom/basketball)
"qU" = (
@@ -529,18 +529,6 @@
/obj/structure/window/reinforced/spawner/directional/south,
/turf/open/floor/iron/white,
/area/centcom/basketball)
-"Se" = (
-/obj/machinery/computer/camera_advanced/xenobio,
-/turf/open/floor/iron/white,
-/area/centcom/basketball)
-"Tc" = (
-/obj/machinery/monkey_recycler,
-/turf/open/floor/iron/white,
-/area/centcom/basketball)
-"Uq" = (
-/obj/machinery/processor/slime,
-/turf/open/floor/iron/white,
-/area/centcom/basketball)
"Uv" = (
/obj/effect/decal/cleanable/xenoblood/xgibs/torso,
/turf/open/floor/engine,
@@ -820,7 +808,7 @@ Hu
(9,1,1) = {"
Hu
Lu
-Tc
+JM
ly
AI
LS
@@ -901,7 +889,7 @@ Hu
(12,1,1) = {"
Hu
Lu
-Se
+JM
OB
Vr
Vr
@@ -982,7 +970,7 @@ Hu
(15,1,1) = {"
Hu
Lu
-Uq
+JM
ly
rU
LS
diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index 94e420487727..c157be159a4e 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -81,13 +81,15 @@
/turf/open/floor/iron/white,
/area/station/medical/medbay/aft)
"abS" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
+/obj/machinery/camera/directional/west{
+ c_tag = "Xenobiology - Secure Cell Interior";
+ name = "xenobiology camera";
+ network = list("ss13","xeno","rd")
},
-/turf/open/floor/plating/reinforced,
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"abT" = (
/obj/machinery/computer/records/security,
@@ -900,25 +902,21 @@
/area/station/maintenance/port/fore)
"arJ" = (
/obj/effect/turf_decal/stripes/line{
- dir = 6
+ dir = 8
},
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door";
- req_access = list("xenobiology")
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/iron/large,
+/obj/machinery/duct,
+/turf/open/floor/carpet/neon/simple/green,
/area/station/science/xenobiology)
"arL" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Science - Xenobiology, Pen 8";
- network = list("ss13","rd","xeno");
- name = "science camera";
- dir = 10
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 8
},
-/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"arN" = (
@@ -1597,7 +1595,6 @@
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology/hallway)
"aEh" = (
@@ -2234,19 +2231,6 @@
/obj/structure/filingcabinet/security,
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/engineering)
-"aQd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"aQt" = (
/obj/structure/cable,
/obj/machinery/power/smes,
@@ -3350,7 +3334,12 @@
/turf/open/floor/iron/freezer,
/area/station/service/kitchen/coldroom)
"bii" = (
-/obj/machinery/processor/slime,
+/obj/machinery/biomass_recycler,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"bir" = (
@@ -3913,21 +3902,6 @@
/obj/machinery/duct,
/turf/open/floor/iron/dark,
/area/station/security/prison/safe)
-"brC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 10"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"brU" = (
/obj/machinery/computer/telecomms/server{
dir = 4;
@@ -5474,19 +5448,6 @@
/obj/machinery/washing_machine,
/turf/open/floor/iron/cafeteria,
/area/station/commons/dorms/laundry)
-"bQH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"bQL" = (
/obj/effect/turf_decal/siding/thinplating{
dir = 1
@@ -6920,7 +6881,6 @@
"cot" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology/hallway)
"cou" = (
@@ -7069,21 +7029,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
-"csD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 2"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"csE" = (
/obj/effect/turf_decal/trimline/neutral/filled/warning{
dir = 4
@@ -8290,17 +8235,11 @@
/turf/open/floor/iron/dark/textured,
/area/station/hallway/primary/central)
"cOo" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+/obj/machinery/corral_corner{
+ mapping_id = "6"
},
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 7"
+/obj/machinery/slime_pen_controller{
+ mapping_id = "6"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -9086,13 +9025,13 @@
/area/station/ai_monitored/security/armory)
"cZL" = (
/obj/machinery/newscaster/directional/south,
-/obj/structure/table/glass,
/obj/machinery/reagentgrinder{
pixel_y = 5
},
/obj/item/stack/sheet/mineral/plasma{
amount = 5
},
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"cZU" = (
@@ -9334,16 +9273,10 @@
/turf/open/floor/wood,
/area/station/service/library/lounge)
"deQ" = (
-/obj/effect/turf_decal/stripes/line{
+/obj/machinery/light/neon_lining{
dir = 8
},
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 2";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"deW" = (
/obj/effect/turf_decal/trimline/neutral/filled/corner{
@@ -9823,12 +9756,11 @@
/turf/open/floor/plating,
/area/station/maintenance/solars/port/aft)
"dnc" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/disposaloutlet{
- dir = 4
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "6";
+ dir = 2
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"dnd" = (
@@ -9977,10 +9909,7 @@
/obj/machinery/power/apc/auto_name/directional/south,
/obj/structure/cable,
/obj/effect/mapping_helpers/apc/cell_5k,
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder{
- pixel_y = 8
- },
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"doW" = (
@@ -10323,13 +10252,13 @@
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
"dwq" = (
-/obj/structure/table/glass,
/obj/machinery/camera/autoname/directional/north,
/obj/structure/sign/warning/biohazard/directional/north,
/obj/item/wirecutters,
/obj/item/screwdriver,
/obj/item/storage/box/lights/mixed,
/obj/item/toy/plush/slimeplushie,
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"dws" = (
@@ -14963,18 +14892,6 @@
/obj/structure/sign/warning/secure_area/directional/east,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"fcs" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"fcR" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -15595,7 +15512,8 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"fnK" = (
/obj/structure/disposalpipe/segment{
@@ -16335,18 +16253,6 @@
/obj/machinery/duct,
/turf/open/floor/wood/large,
/area/station/security/prison/safe)
-"fDu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/electric_shock/directional/west,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"fDB" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/item/kirbyplants/random,
@@ -16467,15 +16373,9 @@
/turf/open/floor/iron/kitchen,
/area/station/security/prison/mess)
"fFr" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 3";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/obj/structure/cable,
+/obj/machinery/duct,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"fFP" = (
/obj/machinery/firealarm/directional/west,
@@ -16811,15 +16711,6 @@
dir = 9
},
/area/station/service/hydroponics)
-"fLw" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"fLA" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
@@ -17558,12 +17449,6 @@
/obj/machinery/light/directional/west,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central)
-"fYf" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"fYg" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -18278,16 +18163,8 @@
/turf/open/floor/iron/dark/textured,
/area/station/security/warden)
"gmo" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"gmC" = (
/obj/machinery/airalarm/directional/west,
@@ -18460,7 +18337,13 @@
name = "Containment Blast Doors";
req_access = list("xenobiology")
},
-/obj/machinery/computer/camera_advanced/xenobio,
+/obj/structure/table/reinforced/plasmarglass,
+/obj/item/vacuum_pack,
+/obj/item/vacuum_pack,
+/obj/item/vacuum_pack,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/disk/vacuum_upgrade/biomass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"gpq" = (
@@ -19913,13 +19796,12 @@
/turf/open/floor/iron/dark,
/area/station/commons/fitness)
"gLB" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Science - Xenobiology, Pen 7";
- network = list("ss13","rd","xeno");
- name = "science camera";
- dir = 6
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 4
},
-/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"gLF" = (
@@ -20511,7 +20393,11 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/machinery/light/neon_lining{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"gUf" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -20779,18 +20665,6 @@
/obj/effect/mapping_helpers/airlock/access/all/service/chapel_office,
/turf/open/floor/iron/dark/textured,
/area/station/service/chapel/office)
-"gZg" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 9"
- },
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"gZw" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -21725,7 +21599,7 @@
/area/station/security/evidence)
"hqM" = (
/obj/machinery/airalarm/directional/south,
-/obj/item/kirbyplants/random,
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"hqN" = (
@@ -21768,18 +21642,6 @@
},
/turf/open/floor/iron/dark/telecomms,
/area/station/science/server)
-"hrA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/electric_shock/directional/east,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"hrH" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 8;
@@ -22056,15 +21918,6 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/dark,
/area/station/security/prison/workout)
-"hvv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"hvz" = (
/obj/structure/closet/emcloset/anchored,
/turf/open/floor/iron/dark/smooth_large,
@@ -23694,17 +23547,6 @@
},
/turf/open/floor/iron/dark/side,
/area/station/commons/locker)
-"hZI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 4"
- },
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"hZS" = (
/obj/effect/turf_decal/delivery/red,
/obj/structure/cable,
@@ -25144,16 +24986,10 @@
/turf/open/floor/iron/dark,
/area/station/hallway/primary/port)
"iwr" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "4"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"iwL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -25162,16 +24998,13 @@
/turf/open/floor/iron/dark,
/area/station/security/prison/garden)
"iwO" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "4"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/slime_pen_controller{
+ mapping_id = "4"
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"iwZ" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -25898,17 +25731,8 @@
/turf/open/floor/iron/dark,
/area/station/hallway/primary/fore)
"iJI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 4";
- req_access = list("xenobiology")
+/obj/machinery/corral_corner{
+ mapping_id = "1"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -26401,17 +26225,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"iRM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"iRQ" = (
/obj/effect/turf_decal/box,
/obj/effect/turf_decal/stripes/corner,
@@ -26520,7 +26333,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
-/turf/open/floor/iron/white,
+/obj/machinery/light/neon_lining{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"iUB" = (
/turf/closed/wall/r_wall,
@@ -27256,14 +27072,6 @@
/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"jje" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Science - Xenobiology, Pen 4";
- network = list("ss13","rd","xeno");
- name = "science camera"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"jjk" = (
/obj/machinery/camera/autoname/directional/west,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -28545,17 +28353,13 @@
/turf/open/floor/iron/dark,
/area/station/security/prison)
"jGx" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door";
- req_access = list("xenobiology")
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "4";
+ dir = 1;
+ pixel_y = 0
},
-/turf/open/floor/iron/large,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"jGA" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -28931,17 +28735,13 @@
/area/station/ai_monitored/turret_protected/aisat/atmos)
"jLQ" = (
/obj/effect/turf_decal/stripes/line{
- dir = 10
+ dir = 8
},
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/machinery/firealarm/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door";
- req_access = list("xenobiology")
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/iron/large,
+/obj/machinery/firealarm/directional/north,
+/turf/open/floor/carpet/neon/simple/green,
/area/station/science/xenobiology)
"jLR" = (
/obj/effect/turf_decal/trimline/brown/filled/warning{
@@ -29477,19 +29277,10 @@
/turf/open/floor/iron/dark,
/area/station/hallway/primary/fore)
"jWq" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 9";
- req_access = list("xenobiology")
+/obj/machinery/light/neon_lining{
+ dir = 4
},
-/turf/open/floor/engine,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"jWy" = (
/turf/closed/wall/r_wall,
@@ -29582,16 +29373,8 @@
/turf/open/floor/plating,
/area/station/maintenance/department/science)
"jXV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 1"
- },
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"jYc" = (
/obj/machinery/light/small/broken/directional/west,
@@ -30367,18 +30150,6 @@
"kmq" = (
/turf/open/floor/engine/vacuum,
/area/station/science/ordnance/burnchamber)
-"kmM" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"kmO" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 9
@@ -30457,7 +30228,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/obj/machinery/door/airlock/maintenance,
/obj/effect/mapping_helpers/airlock/access/any/science/xenobio,
-/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
"knX" = (
@@ -31360,12 +31130,11 @@
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
"kEN" = (
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/structure/disposaloutlet{
- dir = 8
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "5";
+ dir = 2
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"kEX" = (
@@ -31721,14 +31490,12 @@
/area/station/maintenance/starboard/aft)
"kLj" = (
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 8
},
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 8"
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/turf/open/floor/carpet/neon/simple/green,
/area/station/science/xenobiology)
"kLr" = (
/turf/closed/wall/r_wall,
@@ -32021,13 +31788,13 @@
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"kPJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "1"
},
-/turf/open/floor/plating/reinforced,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"kPL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -32106,16 +31873,13 @@
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
"kQP" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "3"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/slime_pen_controller{
+ mapping_id = "3"
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"kQR" = (
/obj/effect/turf_decal/bot,
@@ -32391,18 +32155,6 @@
/obj/item/hfr_box/core,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/hfr_room)
-"kVf" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 10";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"kVi" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
@@ -32431,16 +32183,11 @@
/turf/open/floor/plating,
/area/station/maintenance/department/security/brig)
"kVq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/duct,
+/obj/machinery/light/neon_lining{
+ dir = 8
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"kVD" = (
/obj/structure/closet/crate,
@@ -33399,13 +33146,11 @@
/turf/open/floor/carpet,
/area/station/hallway/secondary/entry)
"lmK" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/structure/disposaloutlet{
- dir = 8
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "1";
+ dir = 1
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"lmX" = (
@@ -35281,21 +35026,6 @@
},
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/entry)
-"lUf" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 5";
- req_access = list("xenobiology")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"lUr" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -36030,7 +35760,12 @@
/turf/open/floor/iron/white,
/area/station/maintenance/department/science)
"mhS" = (
-/obj/machinery/light/small/directional/east,
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 4
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"mih" = (
@@ -36087,19 +35822,6 @@
/obj/machinery/camera/autoname/directional/west,
/turf/open/floor/iron/dark/smooth_large,
/area/station/engineering/main)
-"miO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"miX" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/random/trash/bin,
@@ -36777,18 +36499,6 @@
},
/turf/open/floor/catwalk_floor/iron_dark,
/area/station/engineering/transit_tube)
-"mtj" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"mtH" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{
dir = 5
@@ -36909,9 +36619,6 @@
/obj/structure/flora/tree/jungle/style_random,
/turf/open/floor/grass,
/area/station/hallway/secondary/exit/departure_lounge)
-"mvz" = (
-/turf/open/floor/circuit/green,
-/area/station/science/xenobiology)
"mvA" = (
/obj/machinery/light/directional/east,
/obj/effect/turf_decal/tile/purple/fourcorners,
@@ -38488,17 +38195,13 @@
/area/station/maintenance/department/medical)
"nax" = (
/obj/effect/turf_decal/stripes/line{
- dir = 9
+ dir = 8
},
-/obj/machinery/firealarm/directional/south,
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door";
- req_access = list("xenobiology")
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/floor/iron/large,
+/obj/machinery/firealarm/directional/south,
+/turf/open/floor/carpet/neon/simple/green,
/area/station/science/xenobiology)
"naB" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -40579,12 +40282,9 @@
/turf/open/floor/iron,
/area/station/service/hydroponics)
"nJb" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Science - Xenobiology, Pen 1";
- network = list("ss13","rd","xeno");
- name = "science camera"
- },
-/turf/open/floor/engine,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"nJc" = (
/obj/effect/mapping_helpers/broken_floor,
@@ -40898,13 +40598,12 @@
/area/station/maintenance/department/science)
"nNV" = (
/obj/structure/sign/xenobio_guide/directional/north,
-/obj/structure/table/glass,
-/obj/item/slime_scanner,
/obj/item/clothing/gloves/latex,
/obj/item/clothing/glasses/science,
/obj/item/experi_scanner{
pixel_x = 4
},
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"nOj" = (
@@ -41576,11 +41275,11 @@
/turf/open/floor/engine,
/area/station/maintenance/disposal/incinerator)
"oak" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Science - Xenobiology, Pen 10";
- network = list("ss13","rd","xeno");
- name = "science camera";
- dir = 6
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 4
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -41599,19 +41298,6 @@
/obj/machinery/cassette/mailbox,
/turf/open/floor/wood,
/area/station/service/library/lounge)
-"oaA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"oaC" = (
/obj/effect/turf_decal/tile/orange/fourcorners,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -42017,7 +41703,12 @@
/turf/open/floor/engine,
/area/station/ai_monitored/turret_protected/ai)
"ohk" = (
-/obj/machinery/light/small/directional/west,
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"ohm" = (
@@ -44749,9 +44440,20 @@
/turf/open/floor/iron/dark,
/area/station/security/processing)
"peN" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/preopen{
+ id = "xenobiomain";
+ name = "Containment Blast Door"
+ },
/obj/machinery/duct,
-/turf/open/floor/iron/white,
+/turf/open/floor/iron/white/textured,
/area/station/science/xenobiology)
"peO" = (
/obj/machinery/firealarm/directional/south,
@@ -45780,11 +45482,11 @@
/turf/open/floor/iron/dark/textured,
/area/station/hallway/secondary/exit/departure_lounge)
"pwn" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Science - Xenobiology, Pen 9";
- network = list("ss13","rd","xeno");
- name = "science camera";
- dir = 10
+/obj/machinery/corral_corner{
+ mapping_id = "5"
+ },
+/obj/machinery/light/neon_lining{
+ dir = 8
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -46098,16 +45800,10 @@
/turf/open/floor/carpet/purple,
/area/station/security/prison/safe)
"pBX" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/corral_corner{
+ mapping_id = "3"
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"pCb" = (
/obj/effect/spawner/random/trash/graffiti,
@@ -49413,13 +49109,10 @@
/turf/open/floor/iron/dark/side,
/area/station/commons/dorms)
"qNL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "6"
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"qNM" = (
/obj/effect/turf_decal/stripes/line,
@@ -50865,7 +50558,13 @@
/turf/open/floor/iron/textured,
/area/station/maintenance/starboard/aft)
"rnm" = (
-/obj/machinery/monkey_recycler,
+/obj/machinery/light/directional/north,
+/obj/machinery/button/door/directional/north{
+ id = "xenobiomain";
+ name = "Containment Blast Doors";
+ req_access = list("xenobiology")
+ },
+/obj/machinery/computer/slime_market,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"rnp" = (
@@ -51000,17 +50699,11 @@
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"rpt" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/corral_corner{
+ mapping_id = "5"
},
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 8";
- req_access = list("xenobiology")
+/obj/machinery/slime_pen_controller{
+ mapping_id = "5"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -51067,17 +50760,8 @@
/area/station/ai_monitored/turret_protected/aisat/atmos)
"rpP" = (
/obj/machinery/camera/autoname/directional/north,
-/obj/structure/table/glass,
-/obj/item/paper_bin{
- pixel_y = 4
- },
-/obj/item/folder/white{
- pixel_y = 4
- },
-/obj/item/pen{
- pixel_y = 4
- },
/obj/structure/sign/warning/biohazard/directional/north,
+/obj/machinery/slime_market_pad,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"rpT" = (
@@ -52152,13 +51836,9 @@
/turf/open/floor/plating,
/area/station/security/prison/garden)
"rHD" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Science - Xenobiology, Pen 6";
- network = list("ss13","rd","xeno");
- name = "science camera";
- dir = 6
+/obj/machinery/light/neon_lining{
+ dir = 4
},
-/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"rHG" = (
@@ -52236,6 +51916,9 @@
network = list("ss13","rd","xeno");
name = "science camera"
},
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"rIR" = (
@@ -52283,7 +51966,6 @@
/area/station/maintenance/starboard/aft)
"rJM" = (
/obj/machinery/firealarm/directional/north,
-/obj/structure/table/glass,
/obj/item/stack/sheet/mineral/plasma{
pixel_x = -6;
pixel_y = 6
@@ -52305,6 +51987,7 @@
/obj/item/reagent_containers/dropper{
pixel_y = -4
},
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"rKd" = (
@@ -52943,19 +52626,6 @@
/obj/effect/spawner/random/structure/chair_maintenance,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"rWh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"rWp" = (
/obj/structure/chair,
/obj/effect/landmark/start/shaft_miner,
@@ -53601,14 +53271,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/evidence)
-"siS" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Science - Xenobiology, Pen 2";
- network = list("ss13","rd","xeno");
- name = "science camera"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"sjk" = (
/obj/effect/decal/cleanable/cobweb,
/obj/structure/closet/emcloset,
@@ -53930,7 +53592,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology/hallway)
"soB" = (
@@ -54373,7 +54034,6 @@
},
/area/station/command/gateway)
"sxx" = (
-/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
"sxJ" = (
@@ -55981,21 +55641,6 @@
},
/turf/open/floor/engine/co2,
/area/station/engineering/atmos)
-"taz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door"
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 1";
- req_access = list("xenobiology")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"taA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -56343,7 +55988,11 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"tgq" = (
/obj/machinery/door/firedoor/border_only{
@@ -56902,18 +56551,6 @@
/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
-"trf" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/electric_shock/directional/west,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"trg" = (
/obj/machinery/light/small/directional/north,
/obj/structure/dresser,
@@ -58395,15 +58032,15 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"tSd" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
+/obj/machinery/camera/directional/east{
+ c_tag = "Xeniobiology - Xenobiology Computers";
+ name = "xenobiology camera";
+ network = list("ss13","xeno","rd")
},
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 7";
- req_access = list("xenobiology")
+/obj/machinery/light/neon_lining{
+ dir = 4
},
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"tSx" = (
/obj/structure/table,
@@ -58549,13 +58186,8 @@
/turf/open/floor/iron,
/area/station/cargo/warehouse)
"tVD" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
- },
-/turf/open/floor/plating/reinforced,
+/obj/machinery/duct,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"tVM" = (
/obj/effect/turf_decal/stripes/line{
@@ -58671,17 +58303,6 @@
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central)
-"tXO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"tXP" = (
/obj/effect/turf_decal/stripes/line{
dir = 6
@@ -59206,21 +58827,6 @@
/obj/effect/landmark/navigate_destination/eva,
/turf/open/floor/iron/dark/textured,
/area/station/ai_monitored/command/storage/eva)
-"ugI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 6"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"ugN" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -60357,18 +59963,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/command/storage/eva)
-"uyX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/obj/structure/sign/warning/electric_shock/directional/east,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"uze" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -60942,13 +60536,13 @@
/turf/open/floor/iron/dark,
/area/station/security/checkpoint/medical)
"uKL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "2"
},
-/turf/open/floor/plating/reinforced,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"uKO" = (
/obj/effect/decal/cleanable/dirt,
@@ -61389,12 +60983,12 @@
/turf/open/floor/iron/dark/textured,
/area/station/command/gateway)
"uRW" = (
-/obj/structure/chair/comfy/black{
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "3";
dir = 1
},
-/obj/effect/landmark/start/scientist,
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"uSp" = (
/obj/effect/landmark/generic_maintenance_landmark,
@@ -61926,13 +61520,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 5"
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
+/turf/open/floor/carpet/neon/simple/green,
/area/station/science/xenobiology)
"vaO" = (
/obj/structure/table/wood,
@@ -62015,12 +61606,11 @@
/turf/open/floor/iron/dark,
/area/station/security/office)
"vbB" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Science - Xenobiology, Pen 3";
- network = list("ss13","rd","xeno");
- name = "science camera"
+/obj/machinery/duct,
+/obj/machinery/light/neon_lining{
+ dir = 4
},
-/turf/open/floor/engine,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"vbD" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -62710,7 +62300,10 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"vmA" = (
/obj/structure/reagent_dispensers/fueltank,
@@ -62722,10 +62315,6 @@
/obj/item/toy/plush/slimeplushie,
/turf/open/floor/wood,
/area/station/maintenance/starboard/fore)
-"vmU" = (
-/obj/machinery/duct,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"vmV" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron,
@@ -63038,13 +62627,11 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"vse" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/disposaloutlet{
- dir = 4
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "2";
+ dir = 1
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"vsk" = (
@@ -64172,19 +63759,6 @@
/obj/effect/landmark/start/cook,
/turf/open/floor/iron/kitchen,
/area/station/service/kitchen)
-"vOh" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"vOj" = (
/obj/effect/turf_decal/box,
/obj/machinery/portable_atmospherics/pump,
@@ -64688,18 +64262,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/prison/safe)
-"vVI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/door/window/right/directional/west{
- name = "Containment Pen 6";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/light/floor/has_bulb,
-/turf/open/floor/iron/large,
-/area/station/science/xenobiology)
"vVN" = (
/obj/effect/turf_decal/tile/green/half/contrasted,
/obj/machinery/newscaster/directional/north,
@@ -65195,7 +64757,6 @@
"wgd" = (
/obj/machinery/light/directional/south,
/obj/item/radio/intercom/directional/south,
-/obj/structure/table/glass,
/obj/structure/microscope{
pixel_x = -1;
pixel_y = 2
@@ -65208,6 +64769,7 @@
pixel_x = 14;
pixel_y = 4
},
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"wgn" = (
@@ -65243,27 +64805,9 @@
/obj/item/extinguisher,
/turf/open/floor/iron/white,
/area/station/science/xenobiology/hallway)
-"wgN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"wgR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
- },
-/obj/machinery/door/window/left/directional/east{
- req_access = list("xenobiology");
- name = "Containment Pen 3"
+/obj/machinery/corral_corner{
+ mapping_id = "2"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -65830,13 +65374,13 @@
receive_ore_updates = 1;
supplies_requestable = 1
},
-/obj/structure/table/glass,
/obj/item/book/manual/wiki/cytology{
pixel_x = -4;
pixel_y = 4
},
/obj/item/book/manual/wiki/plumbing,
/obj/item/storage/box/petridish,
+/obj/structure/table/reinforced/plasmarglass,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"wrx" = (
@@ -66472,15 +66016,6 @@
/obj/machinery/portable_atmospherics/canister/plasma,
/turf/open/floor/iron/dark,
/area/station/security/execution)
-"wDL" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"wDM" = (
/obj/effect/turf_decal/trimline/red/filled/warning{
dir = 1
@@ -66509,11 +66044,9 @@
/obj/item/storage/box/syringes{
pixel_y = 5
},
-/obj/item/storage/box/monkeycubes{
- pixel_x = 2;
- pixel_y = -2
+/obj/machinery/reagentgrinder{
+ pixel_y = 8
},
-/obj/item/storage/box/monkeycubes,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"wEs" = (
@@ -66879,10 +66412,6 @@
dir = 6
},
/area/station/commons/dorms)
-"wKd" = (
-/mob/living/simple_animal/slime,
-/turf/open/floor/circuit/green,
-/area/station/science/xenobiology)
"wKg" = (
/obj/effect/spawner/random/structure/table_or_rack,
/obj/effect/spawner/random/maintenance/two,
@@ -67290,18 +66819,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible/layer4,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
-"wQh" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating/reinforced,
-/area/station/science/xenobiology)
"wQk" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
@@ -67371,11 +66888,6 @@
/obj/effect/spawner/random/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"wRH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/machinery/duct,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
"wRJ" = (
/obj/effect/turf_decal/box,
/obj/machinery/holopad,
@@ -67398,7 +66910,9 @@
/turf/closed/wall,
/area/station/maintenance/starboard/fore)
"wSl" = (
-/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/light/neon_lining{
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"wSn" = (
@@ -68775,7 +68289,6 @@
/area/station/tcommsat/server)
"xsC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"xsR" = (
@@ -69104,7 +68617,6 @@
/area/station/engineering/storage/tech)
"xxX" = (
/obj/machinery/light/small/directional/east,
-/obj/machinery/duct,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
"xyc" = (
@@ -70158,7 +69670,8 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"xRO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -71235,13 +70748,10 @@
/turf/open/floor/iron/dark,
/area/station/hallway/primary/central)
"yiC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "5"
},
-/turf/open/floor/plating/reinforced,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"yiI" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -112704,7 +112214,7 @@ hOU
hOU
hOU
xxX
-wRH
+gXk
cDv
oMK
oMK
@@ -113203,20 +112713,20 @@ tdv
aaN
cDv
pwn
-ohk
-dYt
+wSl
+abS
+wSl
+pwn
arL
-ohk
-dYt
wSl
-ohk
-rIN
wSl
+rIN
+arL
ohk
-jje
+wSl
+abS
wSl
ohk
-nJb
wtF
xsC
xsC
@@ -113460,23 +112970,23 @@ ajt
mCg
cDv
dYt
-mvz
dYt
-wSl
-mvz
+gmo
+dYt
+dYt
+dYt
+dYt
+dYt
dYt
-wSl
-mvz
dYt
-wSl
-wKd
dYt
-wSl
-mvz
+dYt
+gmo
+dYt
dYt
wtF
dwq
-vmU
+bIc
bIc
dzj
bIc
@@ -113719,21 +113229,21 @@ cDv
dYt
dYt
kEN
-wSl
-dYt
-kEN
-wSl
+tVD
+tVD
+tVD
+tVD
+uRW
dYt
-kEN
-lmK
dYt
dYt
+tVD
lmK
dYt
dYt
wtF
gpi
-uRW
+wPA
rph
xTL
lNG
@@ -113974,23 +113484,23 @@ sfh
gzR
wtF
yiC
-jWq
-wQh
-hvv
+dYt
+dYt
+dYt
rpt
pBX
-wgN
-lUf
-mtj
+tVD
+dYt
+dYt
kQP
iJI
tVD
-kVq
-taz
+dYt
+dYt
kPJ
wtF
nNV
-peN
+rph
rph
dzj
bIc
@@ -114230,26 +113740,26 @@ ntI
sfh
jKn
wtF
-jGx
-gZg
-trf
-oaA
kLj
-trf
+kLj
+kLj
+kLj
+kLj
+kLj
arJ
vaG
-tXO
-fDu
-hZI
-bQH
-fDu
-jXV
-aQd
+kLj
+kLj
+kLj
+arJ
+kLj
+kLj
+kLj
wtF
rJM
-peN
+rph
bIc
-dzj
+fFr
doR
sEO
sEO
@@ -114487,26 +113997,26 @@ qpO
sfh
eTt
gOv
-bIc
-dzj
-bIc
+deQ
+deQ
+deQ
vmu
-bIc
-bIc
-bIc
-dzj
-bIc
-bIc
-bIc
+deQ
+deQ
+kVq
+deQ
+deQ
+deQ
+deQ
tgl
-bIc
-dzj
-bIc
+deQ
+deQ
+deQ
gOv
bIc
-fYf
+gAj
eTt
-dzj
+fFr
cTs
sEO
gTp
@@ -114759,12 +114269,12 @@ xRJ
xRJ
fnI
xRJ
-bXQ
-xRJ
+peN
+qjq
qjq
rYV
hyd
-hyd
+nJb
vhh
sos
cot
@@ -115001,26 +114511,26 @@ iqb
feY
lNG
gOv
-bIc
-dzj
-bIc
+jWq
+jWq
+jWq
iUz
-bIc
-bIc
-bIc
-dzj
-bIc
-bIc
-bIc
+jWq
+jWq
+vbB
+jWq
+jWq
+jWq
+jWq
gTL
-bIc
-dzj
-bIc
+jWq
+jWq
+jWq
gOv
bIc
gAj
lNG
-dzj
+fFr
lns
sEO
wgM
@@ -115259,25 +114769,25 @@ mIP
jZt
wtF
jLQ
-kVf
-uyX
-miO
-tSd
-uyX
-iRM
-vVI
-vOh
-hrA
-fFr
-rWh
-hrA
-deQ
+kLj
+kLj
+kLj
+kLj
+kLj
+arJ
+vaG
+kLj
+kLj
+kLj
+arJ
+kLj
+kLj
nax
wtF
-rnm
-ifN
bIc
-dzj
+ifN
+jXV
+fFr
hqM
sEO
sEO
@@ -115516,19 +115026,19 @@ xTL
bHS
wtF
qNL
-brC
-gmo
-abS
+dYt
+dYt
+dYt
cOo
iwr
-kmM
-ugI
-fLw
+tVD
+dYt
+dYt
iwO
wgR
-wDL
-fcs
-csD
+tVD
+dYt
+dYt
uKL
wtF
wDY
@@ -115775,21 +115285,21 @@ cDv
dYt
dYt
dnc
-wSl
-dYt
-dnc
-vse
-dYt
+tVD
+tVD
+tVD
+tVD
+jGx
dYt
-vse
dYt
dYt
+tVD
vse
dYt
dYt
wtF
-gpi
-wPA
+rnm
+bIc
ifN
qds
eTt
@@ -116030,19 +115540,19 @@ iIy
uio
cDv
dYt
-mvz
dYt
-wSl
-mvz
+gmo
+dYt
+dYt
+dYt
dYt
-wSl
-wKd
dYt
-wSl
-wKd
dYt
-wSl
-mvz
+dYt
+dYt
+dYt
+gmo
+dYt
dYt
wtF
rpP
@@ -116287,20 +115797,20 @@ dmt
rGH
cDv
oak
-mhS
-dYt
+rHD
+tSd
+rHD
+oak
gLB
-mhS
-dYt
rHD
+tSd
+rHD
+gLB
mhS
-dYt
-wSl
-mhS
-vbB
-wSl
+rHD
+tSd
+rHD
mhS
-siS
wtF
bIc
bIc
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index a74120117135..ad46d78631c0 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -235,8 +235,12 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/turf/open/floor/iron,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"acG" = (
/obj/structure/table/reinforced,
@@ -2627,6 +2631,13 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
+"aDe" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"aDg" = (
/obj/effect/turf_decal/delivery,
/obj/structure/closet/crate{
@@ -2644,14 +2655,13 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
"aDR" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/button/door{
- id = "xeno4";
- name = "Containment Control";
- req_access = list("xenobiology")
+/obj/machinery/corral_corner{
+ mapping_id = "1"
},
-/turf/open/floor/iron,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"aDZ" = (
/obj/machinery/door/firedoor,
@@ -4872,21 +4882,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/general,
/turf/open/floor/iron,
/area/station/security/checkpoint/escape)
-"bgH" = (
-/obj/machinery/door/window/brigdoor{
- dir = 1;
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xeno2";
- name = "Creature Cell #2"
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"bgK" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
@@ -5474,17 +5469,6 @@
/obj/machinery/light_switch/directional/south,
/turf/open/floor/iron,
/area/station/command/gateway)
-"bnd" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/button/door{
- id = "xeno3";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"bnt" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -7228,21 +7212,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
-"bIh" = (
-/obj/machinery/door/window/brigdoor{
- dir = 1;
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno4";
- name = "Creature Cell #4"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"bIk" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
@@ -8662,18 +8631,6 @@
},
/turf/open/floor/carpet/blue,
/area/station/commons/dorms)
-"bXL" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"bXX" = (
/obj/structure/bookcase/random/fiction,
/obj/effect/turf_decal/siding/wood{
@@ -10378,18 +10335,6 @@
/obj/machinery/light/small/directional/west,
/turf/open/floor/engine/plasma,
/area/station/engineering/atmos)
-"csY" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 1
- },
-/obj/machinery/camera/directional/south{
- c_tag = "Xenobiology - Cell 8";
- name = "xenobiology camera";
- network = list("ss13","xeno","rd")
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"ctw" = (
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=engi1";
@@ -10414,11 +10359,6 @@
/obj/effect/turf_decal/trimline/purple,
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
-"ctW" = (
-/obj/structure/cable,
-/mob/living/simple_animal/slime,
-/turf/open/floor/circuit/green,
-/area/station/science/xenobiology)
"cug" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -11435,15 +11375,6 @@
/obj/effect/landmark/navigate_destination/incinerator,
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
-"cGA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno6";
- name = "Creature Cell #6"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"cGJ" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
@@ -12721,6 +12652,10 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"cYh" = (
@@ -12961,15 +12896,6 @@
},
/turf/open/floor/iron/grimy,
/area/station/security/detectives_office)
-"dbo" = (
-/obj/effect/landmark/event_spawn,
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/white/textured,
-/area/station/science/xenobiology)
"dbw" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -13155,9 +13081,8 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/escape)
"ddW" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners,
-/turf/open/floor/iron/dark,
+/obj/machinery/camera/directional/west,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"dea" = (
/obj/structure/table,
@@ -14363,15 +14288,13 @@
/turf/open/floor/iron,
/area/station/science/circuits)
"duq" = (
-/obj/structure/disposaloutlet{
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "1";
dir = 1
},
-/obj/structure/disposalpipe/trunk,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 1
- },
-/turf/open/floor/iron/dark,
+/obj/machinery/light/floor/has_bulb,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"dux" = (
/obj/structure/table,
@@ -14711,11 +14634,8 @@
/area/station/security/brig)
"dxU" = (
/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron/white/textured,
+/obj/machinery/duct,
+/turf/open/floor/glass/reinforced,
/area/station/science/xenobiology)
"dxV" = (
/obj/effect/decal/cleanable/dirt,
@@ -15654,18 +15574,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/construction,
/turf/open/floor/iron,
/area/station/engineering/break_room)
-"dLh" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 8
- },
-/obj/machinery/camera/directional/north{
- c_tag = "Xenobiology - Cell 3";
- name = "xenobiology camera";
- network = list("ss13","xeno","rd")
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"dLq" = (
/obj/machinery/porta_turret/ai,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -16842,11 +16750,13 @@
/area/station/service/kitchen)
"eaO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
+/obj/structure/cable,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"eaQ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -18207,10 +18117,12 @@
/turf/open/floor/iron,
/area/station/cargo/sorting)
"esm" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners,
-/turf/open/floor/iron/dark,
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "4"
+ },
+/obj/machinery/light/floor/has_bulb,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"eso" = (
/obj/effect/turf_decal/trimline/yellow/filled/warning,
@@ -18513,6 +18425,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/grimy,
/area/station/service/chapel/office)
+"evj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"evp" = (
/obj/machinery/computer/records/medical{
dir = 8
@@ -22622,6 +22541,8 @@
},
/obj/item/storage/box/petridish,
/obj/effect/turf_decal/siding/purple,
+/obj/item/vacuum_pack,
+/obj/item/vacuum_pack,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"fva" = (
@@ -22974,6 +22895,9 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"fzv" = (
@@ -23673,6 +23597,8 @@
name = "xenobiology camera";
network = list("ss13","xeno","rd")
},
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/disk/vacuum_upgrade/biomass,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"fIY" = (
@@ -23906,9 +23832,7 @@
/turf/open/floor/iron/dark,
/area/station/service/chapel/funeral)
"fMl" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/cable,
-/turf/open/floor/iron/dark,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"fMn" = (
/obj/effect/turf_decal/tile/neutral{
@@ -24030,22 +23954,11 @@
/obj/effect/turf_decal/stripes/box,
/turf/open/floor/iron/dark,
/area/station/security/office)
-"fNY" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno3";
- name = "Creature Cell #3"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"fOp" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 4
+/obj/machinery/corral_corner{
+ mapping_id = "3"
},
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/iron/dark,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"fOw" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -24937,6 +24850,13 @@
/obj/structure/sink/directional/south,
/turf/open/floor/iron/dark,
/area/station/science/genetics)
+"fZo" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"fZp" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/trimline/blue/filled/warning{
@@ -25060,21 +24980,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron,
/area/station/maintenance/port/aft)
-"gbj" = (
-/obj/machinery/door/window/brigdoor{
- dir = 1;
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno3";
- name = "Creature Cell #3"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"gbo" = (
/obj/machinery/airalarm/directional/south,
/obj/structure/table/wood,
@@ -25620,15 +25525,6 @@
},
/turf/open/floor/iron,
/area/station/maintenance/department/eva/abandoned)
-"ghQ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno1";
- name = "Creature Cell #1"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"ghU" = (
/obj/structure/rack,
/obj/item/book/manual/wiki/engineering_hacking{
@@ -26883,6 +26779,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
+"gvX" = (
+/obj/machinery/duct,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"gwd" = (
/obj/machinery/washing_machine,
/obj/effect/turf_decal/tile/dark_blue/fourcorners,
@@ -27473,16 +27373,6 @@
/obj/structure/displaycase_chassis,
/turf/open/floor/wood/large,
/area/station/service/library/abandoned)
-"gDU" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno7";
- name = "Creature Cell #7"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"gDV" = (
/turf/closed/wall,
/area/station/service/library/lounge)
@@ -27538,16 +27428,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"gED" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno1";
- name = "Creature Cell #1"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"gEF" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -29118,15 +28998,6 @@
},
/turf/open/space/basic,
/area/space)
-"gZx" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno8";
- name = "Creature Cell #8"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"gZz" = (
/obj/structure/table/wood,
/obj/item/folder/red,
@@ -31489,14 +31360,6 @@
/obj/effect/mapping_helpers/airlock/access/all/service/kitchen,
/turf/open/floor/iron/freezer,
/area/station/service/kitchen/coldroom)
-"hFS" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/white/textured,
-/area/station/science/xenobiology)
"hFZ" = (
/obj/item/reagent_containers/cup/beaker,
/obj/item/reagent_containers/syringe/antiviral,
@@ -32015,7 +31878,6 @@
name = "xenobiology camera";
network = list("ss13","xeno","rd")
},
-/obj/structure/chair/office/light,
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted,
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron,
@@ -34532,6 +34394,13 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/station/engineering/storage)
+"irh" = (
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"irl" = (
/turf/closed/wall/r_wall,
/area/station/service/lawoffice)
@@ -36070,6 +35939,10 @@
"iLr" = (
/turf/closed/wall,
/area/station/service/theater/abandoned)
+"iLv" = (
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"iLB" = (
/obj/structure/sign/directions/evac{
pixel_y = -8
@@ -36838,21 +36711,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/quartermaster)
-"iWX" = (
-/obj/machinery/door/window/brigdoor{
- dir = 1;
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xeno1";
- name = "Creature Cell #1"
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"iXc" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -38880,16 +38738,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
-"juv" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno4";
- name = "Creature Cell #4"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"juC" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -40269,17 +40117,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay)
-"jKZ" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xeno7";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/directional/south,
-/obj/structure/window/reinforced/spawner/directional/east,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"jLa" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/green{
@@ -40466,15 +40303,13 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"jNn" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xeno8";
- name = "Containment Control";
- req_access = list("xenobiology")
+/obj/machinery/corral_corner{
+ mapping_id = "3"
},
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"jNx" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -43728,15 +43563,6 @@
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"kBO" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno2";
- name = "Creature Cell #2"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"kBR" = (
/obj/machinery/door/window{
dir = 8;
@@ -45041,14 +44867,6 @@
"kSu" = (
/turf/closed/wall,
/area/station/command/teleporter)
-"kSA" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"kSB" = (
/obj/machinery/portable_atmospherics/canister,
/obj/machinery/light/small/directional/west,
@@ -45298,13 +45116,6 @@
/obj/structure/sign/poster/contraband/random/directional/south,
/turf/open/floor/plating,
/area/station/service/kitchen/abandoned)
-"kWi" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 8
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"kWv" = (
/obj/effect/landmark/event_spawn,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -45499,16 +45310,6 @@
"kYn" = (
/turf/open/floor/iron/dark,
/area/station/service/abandoned_gambling_den/gaming)
-"kYq" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno5";
- name = "Creature Cell #5"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"kYu" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -45665,6 +45466,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/checkpoint/escape)
+"laX" = (
+/obj/machinery/camera/directional/east{
+ c_tag = "Xeniobiology - Xenobiology Computers";
+ name = "xenobiology camera";
+ network = list("ss13","xeno","rd")
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"lbi" = (
/obj/structure/lattice/catwalk,
/obj/structure/transit_tube/curved/flipped{
@@ -45843,9 +45652,11 @@
/turf/open/floor/iron/grimy,
/area/station/command/heads_quarters/captain)
"lcK" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"lcO" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -49656,13 +49467,6 @@
},
/turf/open/floor/iron,
/area/station/security/prison/safe)
-"lYw" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"lYJ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -49837,13 +49641,10 @@
/turf/open/floor/iron,
/area/station/medical/pathology)
"mca" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
+/obj/effect/turf_decal/stripes/line{
dir = 4
},
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/iron/dark,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mck" = (
/obj/structure/chair/office,
@@ -51353,6 +51154,7 @@
dir = 8
},
/obj/effect/landmark/start/hangover,
+/obj/machinery/slime_extract_requestor,
/turf/open/floor/iron/white,
/area/station/science/lobby)
"muW" = (
@@ -53514,8 +53316,8 @@
/turf/open/floor/grass,
/area/station/medical/psychology)
"mVe" = (
-/obj/machinery/processor/slime,
/obj/effect/turf_decal/bot_red,
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"mVi" = (
@@ -53620,16 +53422,6 @@
/obj/effect/spawner/structure/window/reinforced/plasma,
/turf/open/floor/plating,
/area/station/engineering/supermatter)
-"mWy" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno2";
- name = "Creature Cell #2"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"mWB" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -53832,16 +53624,6 @@
/obj/effect/spawner/random/structure/crate,
/turf/open/floor/plating,
/area/station/maintenance/port)
-"mZd" = (
-/obj/machinery/door/window/brigdoor{
- dir = 1;
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"mZj" = (
/obj/machinery/atmospherics/components/trinary/mixer{
color = "#FFFF00";
@@ -54015,17 +53797,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/warden)
-"nbo" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/button/door{
- id = "xeno2";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"nbv" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
@@ -54138,15 +53909,6 @@
/obj/machinery/airalarm/directional/south,
/turf/open/floor/iron/dark/textured_large,
/area/station/engineering/atmos/storage/gas)
-"ncJ" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno4";
- name = "Creature Cell #4"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"ncQ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -54292,18 +54054,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/robotics/mechbay)
-"nfT" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 1
- },
-/obj/machinery/camera/directional/south{
- c_tag = "Xenobiology - Cell 6";
- name = "xenobiology camera";
- network = list("ss13","xeno","rd")
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"nfX" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -54595,20 +54345,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"nkj" = (
-/obj/machinery/door/window/brigdoor{
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno6";
- name = "Creature Cell #6"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"nkn" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden,
@@ -55461,11 +55197,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/security/prison)
-"nwV" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/sign/warning/secure_area/directional/west,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"nwW" = (
/obj/structure/sign/nanotrasen{
pixel_x = -32
@@ -55756,12 +55487,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/supermatter/room)
-"nzt" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"nzw" = (
/obj/machinery/disposal/bin,
/obj/effect/turf_decal/bot,
@@ -56915,25 +56640,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos/storage/gas)
-"nNR" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno5";
- name = "Creature Cell #5"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
-"nNT" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno6";
- name = "Creature Cell #6"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"nNU" = (
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/firealarm/directional/south,
@@ -57792,13 +57498,10 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"nYS" = (
-/obj/machinery/door/window/brigdoor{
- name = "Creature Pen";
- req_access = list("research")
+/obj/machinery/corral_corner{
+ mapping_id = "1"
},
-/obj/structure/cable,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"nYV" = (
/obj/effect/turf_decal/tile/yellow{
@@ -58896,6 +58599,13 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"omu" = (
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"omv" = (
/obj/structure/table,
/obj/item/flashlight/lamp,
@@ -59612,17 +59322,6 @@
},
/turf/open/floor/iron/dark,
/area/station/maintenance/port)
-"oyp" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xeno6";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/light/directional/south,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"oyy" = (
/obj/effect/turf_decal/trimline/blue/filled/warning{
dir = 1
@@ -61017,6 +60716,14 @@
},
/turf/open/floor/iron,
/area/station/security/checkpoint/medical/medsci)
+"oQS" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"oRk" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -62084,6 +61791,13 @@
/obj/structure/closet/l3closet/virology,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
+"pff" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"pfh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -62617,15 +62331,6 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/main)
-"pla" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno7";
- name = "Creature Cell #7"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"plh" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -62722,18 +62427,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"pmw" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 8
- },
-/obj/machinery/camera/directional/north{
- c_tag = "Xenobiology - Cell 1";
- name = "xenobiology camera";
- network = list("ss13","xeno","rd")
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"pmz" = (
/obj/effect/turf_decal/tile/red{
dir = 4
@@ -63714,6 +63407,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
+"pAi" = (
+/obj/structure/cable,
+/obj/machinery/duct,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"pAs" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -63842,16 +63541,6 @@
/obj/machinery/atm,
/turf/open/floor/iron,
/area/station/cargo/lobby)
-"pBB" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno3";
- name = "Creature Cell #3"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"pBH" = (
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -63966,14 +63655,12 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"pDf" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 1
},
/obj/structure/sign/xenobio_guide/directional/south,
+/obj/machinery/slime_market_pad,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"pDi" = (
@@ -64013,6 +63700,10 @@
/area/station/engineering/atmos)
"pDM" = (
/obj/structure/cable,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"pDS" = (
@@ -65176,12 +64867,13 @@
/turf/open/floor/iron,
/area/station/service/kitchen/abandoned)
"pQz" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 4
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "2";
+ dir = 1
},
-/turf/open/floor/iron/dark,
+/obj/machinery/light/floor/has_bulb,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"pQN" = (
/obj/machinery/duct,
@@ -65247,13 +64939,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
-"pRz" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 1
- },
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"pRG" = (
/obj/effect/turf_decal/tile/purple/fourcorners,
/obj/effect/spawner/random/engineering/tracking_beacon,
@@ -65814,17 +65499,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/service/abandoned_gambling_den/gaming)
-"pWL" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"pWO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -67377,16 +67051,6 @@
/obj/structure/chair/stool/bar/directional/south,
/turf/open/floor/carpet/green,
/area/station/commons/lounge)
-"qrU" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/end{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/turf/open/floor/iron/white/textured_large,
-/area/station/science/xenobiology)
"qrY" = (
/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/line{
@@ -69702,6 +69366,12 @@
},
/turf/open/floor/iron,
/area/station/security/courtroom)
+"qUa" = (
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"qUi" = (
/obj/structure/disposalpipe/sorting/mail{
name = "Engineering Junction"
@@ -70571,18 +70241,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/department/crew_quarters/bar)
-"rhi" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"rhw" = (
/obj/structure/chair/office/light{
dir = 8
@@ -73244,11 +72902,13 @@
/turf/open/floor/plating,
/area/station/science/research)
"rOY" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"rPc" = (
/obj/effect/turf_decal/stripes/line{
@@ -73741,20 +73401,6 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
-"rUl" = (
-/obj/machinery/door/window/brigdoor{
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno8";
- name = "Creature Cell #8"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"rUn" = (
/obj/structure/sign/departments/science/directional/west,
/obj/effect/turf_decal/tile/purple{
@@ -74676,10 +74322,6 @@
},
/turf/open/floor/engine/vacuum,
/area/station/engineering/atmos)
-"shO" = (
-/obj/structure/cable,
-/turf/open/floor/circuit/green,
-/area/station/science/xenobiology)
"shP" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
@@ -75726,13 +75368,6 @@
/obj/structure/sign/poster/random/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"svD" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"svI" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -76192,16 +75827,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
/turf/open/floor/plating,
/area/station/engineering/atmos/mix)
-"sBt" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno8";
- name = "Creature Cell #8"
- },
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"sBE" = (
/obj/machinery/door/firedoor/heavy,
/obj/effect/turf_decal/stripes/line{
@@ -78256,12 +77881,12 @@
/turf/open/floor/iron,
/area/station/engineering/atmos/storage/gas)
"sZi" = (
-/obj/machinery/smartfridge/extract/preloaded,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 1
},
/obj/machinery/light/directional/south,
+/obj/machinery/computer/slime_market,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"sZn" = (
@@ -78347,8 +77972,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/turf/open/floor/iron/dark,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"taL" = (
/obj/structure/table/wood,
@@ -78500,6 +78125,13 @@
},
/turf/open/floor/circuit/green/telecomms/mainframe,
/area/station/tcommsat/server)
+"tcQ" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/structure/cable,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"tcT" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -79343,6 +78975,11 @@
},
/turf/open/floor/iron,
/area/station/security/checkpoint/engineering)
+"tpS" = (
+/obj/structure/cable,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"tpZ" = (
/turf/closed/wall,
/area/station/maintenance/starboard/fore)
@@ -80488,9 +80125,6 @@
/turf/open/floor/iron/large,
/area/station/science/research)
"tDG" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 1
@@ -80507,6 +80141,7 @@
pixel_x = -6;
req_access = list("science")
},
+/obj/machinery/smartfridge/extract/preloaded,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"tDK" = (
@@ -81099,10 +80734,7 @@
/area/station/medical/medbay)
"tLp" = (
/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
+/turf/open/floor/glass/reinforced,
/area/station/science/xenobiology)
"tLx" = (
/obj/structure/cable,
@@ -83592,16 +83224,6 @@
/obj/effect/spawner/random/structure/girder,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"uoY" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/end{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/turf/open/floor/iron/white/textured_large,
-/area/station/science/xenobiology)
"upe" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/stripes/line{
@@ -83742,18 +83364,6 @@
"urt" = (
/turf/closed/wall/r_wall,
/area/station/science/circuits)
-"urx" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/obj/effect/turf_decal/tile/neutral/half/contrasted,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"urH" = (
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
@@ -84326,11 +83936,6 @@
/obj/machinery/vending/dinnerware,
/turf/open/floor/iron/dark,
/area/station/service/kitchen)
-"uyy" = (
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/structure/sign/warning/secure_area/directional/east,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"uyB" = (
/obj/effect/turf_decal/tile/purple/fourcorners,
/obj/effect/turf_decal/stripes/line{
@@ -84776,15 +84381,6 @@
/obj/structure/sign/nanotrasen,
/turf/closed/wall,
/area/station/service/chapel/funeral)
-"uDQ" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"uDR" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
@@ -85886,6 +85482,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/storage)
+"uSs" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"uSL" = (
/obj/effect/turf_decal/box/white{
color = "#9FED58"
@@ -90180,13 +89784,13 @@
/turf/open/floor/plating,
/area/station/cargo/drone_bay)
"vVD" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
+/obj/machinery/corral_corner{
+ mapping_id = "2"
},
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"vVH" = (
/obj/effect/turf_decal/tile/yellow{
@@ -91889,17 +91493,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
-"wox" = (
-/obj/structure/table/reinforced,
-/obj/machinery/button/door{
- id = "xeno5";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/directional/south,
-/obj/structure/window/reinforced/spawner/directional/east,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"woB" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/delivery,
@@ -92241,8 +91834,13 @@
/turf/open/floor/iron,
/area/station/engineering/atmos)
"wsd" = (
-/obj/machinery/monkey_recycler,
/obj/effect/turf_decal/bot_red,
+/obj/machinery/biomass_recycler,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"wse" = (
@@ -92354,6 +91952,12 @@
},
/turf/open/floor/iron/dark,
/area/station/service/theater)
+"wts" = (
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"wtv" = (
/obj/structure/bed,
/obj/item/bedsheet/medical,
@@ -92780,6 +92384,14 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
+"wxz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"wxF" = (
/obj/structure/chair/office,
/obj/structure/sign/poster/random/directional/north,
@@ -93501,17 +93113,6 @@
},
/turf/open/floor/plating,
/area/station/service/abandoned_gambling_den)
-"wFX" = (
-/obj/structure/table/reinforced,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/button/door{
- id = "xeno1";
- name = "Containment Control";
- req_access = list("xenobiology")
- },
-/obj/machinery/light/directional/north,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"wGa" = (
/obj/structure/disposalpipe/junction{
dir = 8
@@ -96174,15 +95775,12 @@
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
"xsN" = (
-/obj/structure/disposaloutlet,
-/obj/structure/disposalpipe/trunk{
- dir = 1
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "3"
},
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/box/white/corners{
- dir = 8
- },
-/turf/open/floor/iron/dark,
+/obj/machinery/light/floor/has_bulb,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"xsP" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -96689,13 +96287,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
-"xzo" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"xzq" = (
/obj/structure/table/reinforced,
/obj/item/computer_disk/ordnance{
@@ -97100,7 +96691,6 @@
/turf/open/floor/iron/dark,
/area/station/service/abandoned_gambling_den)
"xDz" = (
-/obj/structure/chair/office/light,
/obj/structure/sign/warning/secure_area/directional/west,
/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{
dir = 8
@@ -99058,20 +98648,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"ycY" = (
-/obj/machinery/door/window/brigdoor{
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno5";
- name = "Creature Cell #5"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"ydb" = (
/obj/effect/landmark/start/hangover,
/obj/effect/turf_decal/tile/red{
@@ -99345,20 +98921,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron,
/area/station/cargo/lobby)
-"ygV" = (
-/obj/machinery/door/window/brigdoor{
- name = "Creature Pen";
- req_access = list("research")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xeno7";
- name = "Creature Cell #7"
- },
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron/dark,
-/area/station/science/xenobiology)
"ygW" = (
/obj/machinery/vending/hydroseeds,
/obj/effect/turf_decal/bot,
@@ -120991,18 +120553,18 @@ qZb
dhB
gwK
pTC
-nzt
-nwV
-lYw
-ncJ
+nYS
+fMl
+ddW
+fMl
aDR
-jKx
-rTW
+oQS
+tpS
taA
jNn
-gZx
+fMl
ddW
-nwV
+fMl
fOp
mAt
ifk
@@ -121248,19 +120810,19 @@ uTb
hHK
kGj
mQO
+iLv
fMl
-shO
fMl
-bIh
-nYS
-rhi
+fMl
+fMl
+oQS
tLp
-pWL
-mZd
-rUl
+taA
+fMl
fMl
-ctW
fMl
+fMl
+iLv
oVW
oUe
jET
@@ -121505,19 +121067,19 @@ qZb
feF
gcr
pTC
-kWi
-sfN
+iLv
+gvX
duq
-juv
-vVD
-eaO
-uoY
-acD
-rOY
-sBt
+fMl
+fMl
+oQS
+tLp
+taA
+fMl
+fMl
xsN
-sfN
-csY
+gvX
+iLv
mAt
aAx
nxt
@@ -121762,19 +121324,19 @@ pTC
hhS
iQF
pTC
-svD
-lcK
-pQz
-fNY
-bnd
-eaO
-hFS
-acD
-jKZ
-pla
-esm
-lcK
-mca
+iLv
+gvX
+fMl
+fMl
+fMl
+oQS
+tLp
+taA
+fMl
+fMl
+fMl
+gvX
+iLv
mAt
xIw
pVk
@@ -122019,19 +121581,19 @@ pTC
hWk
gcr
mQO
+tcQ
+gvX
fMl
-shO
fMl
-gbj
nYS
-uDQ
-dxU
-kSA
-mZd
-ygV
+oQS
+tLp
+taA
+fOp
fMl
-shO
fMl
+gvX
+fZo
oVW
wFP
pKd
@@ -122276,19 +121838,19 @@ pTC
ezY
iQF
pTC
-dLh
-sfN
-duq
-pBB
-vVD
+evj
+uSs
+uSs
+uSs
+uSs
eaO
dxU
acD
-rOY
-gDU
-xsN
-sfN
-pRz
+uSs
+uSs
+uSs
+uSs
+evj
mAt
udV
qYr
@@ -122533,19 +122095,19 @@ pTC
elH
iQF
pTC
-svD
+pff
lcK
-pQz
-kBO
-nbo
-eaO
+mca
+mca
+mca
+wxz
dxU
-acD
-oyp
-cGA
-esm
-lcK
+aDe
+mca
mca
+mca
+lcK
+pff
mAt
ilU
qYr
@@ -122790,19 +122352,19 @@ pTC
eDZ
rrU
mQO
+irh
+gvX
fMl
-shO
fMl
-bgH
-nYS
-uDQ
+wts
+oQS
dxU
-kSA
-mZd
-nkj
+taA
+qUa
fMl
-ctW
fMl
+gvX
+omu
oVW
fmi
qYr
@@ -123047,19 +122609,19 @@ pTC
woj
qcM
pTC
-kWi
-sfN
-duq
-mWy
-vVD
-eaO
-dbo
-acD
-rOY
-nNT
-xsN
-sfN
-nfT
+iLv
+gvX
+fMl
+fMl
+fMl
+oQS
+dxU
+taA
+fMl
+fMl
+fMl
+gvX
+iLv
mAt
kzt
xQq
@@ -123304,19 +122866,19 @@ pTC
woj
rrU
pTC
-svD
-lcK
+iLv
+gvX
pQz
-ghQ
-wFX
-eaO
-qrU
-acD
-wox
-nNR
+fMl
+fMl
+oQS
+dxU
+taA
+fMl
+fMl
esm
-lcK
-mca
+gvX
+iLv
mAt
cZl
mPF
@@ -123561,19 +123123,19 @@ pTC
eDZ
rwI
mQO
+iLv
fMl
-ctW
fMl
-iWX
-nYS
-bXL
-xzo
-urx
-mZd
-ycY
fMl
-shO
fMl
+oQS
+dxU
+taA
+fMl
+fMl
+fMl
+fMl
+iLv
oVW
oTD
dOO
@@ -123818,19 +123380,19 @@ pTC
aMM
fwJ
pTC
-pmw
-uyy
-duq
-gED
+wts
+fMl
+laX
+fMl
vVD
-jKx
-rTW
+oQS
+pAi
taA
rOY
-kYq
-xsN
-uyy
-pRz
+fMl
+laX
+fMl
+qUa
mAt
iIn
srI
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index af37b013b6a6..654803b415a7 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -176,13 +176,6 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai_upload)
-"aey" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Xenobiology Pens - Starboard Fore";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"aez" = (
/obj/structure/table,
/obj/item/clothing/mask/gas,
@@ -1048,17 +1041,6 @@
/obj/item/storage/crayons,
/turf/open/floor/iron,
/area/station/commons/dorms)
-"asb" = (
-/obj/structure/sink/directional/west,
-/obj/structure/cable,
-/obj/machinery/button/door/directional/east{
- id = "xenobio10";
- layer = 4;
- name = "Xenobio Pen 10 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"asg" = (
/obj/structure/closet,
/obj/effect/spawner/random/maintenance/two,
@@ -1138,6 +1120,14 @@
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"atw" = (
+/obj/machinery/camera/directional/east{
+ c_tag = "Xeniobiology - Xenobiology Computers";
+ name = "xenobiology camera";
+ network = list("ss13","xeno","rd")
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"aty" = (
/obj/structure/urinal/directional/north,
/obj/effect/landmark/start/hangover,
@@ -1429,13 +1419,6 @@
},
/turf/open/floor/iron/freezer,
/area/station/command/heads_quarters/captain)
-"axD" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"axF" = (
/obj/effect/spawner/random/structure/billboard/nanotrasen,
/turf/open/lava/plasma/ice_moon,
@@ -1881,15 +1864,6 @@
/obj/effect/mapping_helpers/airlock/access/all/security/brig,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"aHz" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"aHC" = (
/obj/machinery/light/directional/south,
/obj/machinery/power/apc/auto_name/directional/south,
@@ -1990,6 +1964,15 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"aIV" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"aJh" = (
/obj/item/kirbyplants/random,
/turf/open/floor/iron,
@@ -2123,15 +2106,6 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"aLA" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"aLJ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -2686,6 +2660,10 @@
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
/area/station/maintenance/starboard/upper)
+"aUq" = (
+/mob/living/basic/slime,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"aUr" = (
/obj/effect/turf_decal/bot,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -2907,7 +2885,6 @@
/area/station/ai_monitored/turret_protected/aisat/hallway)
"aXY" = (
/obj/structure/rack,
-/obj/item/circuitboard/machine/monkey_recycler,
/obj/structure/sign/poster/random/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
@@ -3674,19 +3651,6 @@
/obj/effect/turf_decal/tile/red/full,
/turf/open/floor/iron/dark/smooth_large,
/area/station/security/checkpoint/medical)
-"bjn" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 11";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio11";
- name = "Xenobio Pen 11 Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"bjp" = (
/turf/open/floor/iron/dark/textured_edge{
dir = 4
@@ -3907,19 +3871,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/medical/medbay/aft)
-"bnh" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 7";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
- },
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"bnl" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -5433,17 +5384,6 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"bKI" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"bKN" = (
/obj/machinery/door/airlock/security/glass{
name = "Brig Control"
@@ -5659,6 +5599,11 @@
},
/turf/open/floor/engine,
/area/station/engineering/atmos/hfr_room)
+"bOq" = (
+/obj/structure/railing,
+/obj/machinery/slime_extract_requestor,
+/turf/open/floor/iron,
+/area/station/hallway/primary/starboard)
"bOu" = (
/obj/effect/turf_decal/siding/wood{
dir = 5
@@ -6064,17 +6009,11 @@
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"bUK" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "5"
},
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 5";
- req_access = list("xenobiology")
+/obj/machinery/slime_pen_controller{
+ mapping_id = "5"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -7185,14 +7124,7 @@
/turf/open/floor/iron,
/area/station/science/ordnance/testlab)
"clW" = (
-/obj/structure/cable,
-/obj/machinery/button/door/directional/west{
- id = "xenobio1";
- layer = 4;
- name = "Xenobio Pen 1 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"cma" = (
/obj/structure/closet/firecloset,
@@ -7910,9 +7842,13 @@
/turf/open/floor/wood,
/area/station/maintenance/port/aft)
"cyh" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
+/obj/machinery/light/floor/has_bulb,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"cyo" = (
/obj/machinery/stasis{
@@ -8821,8 +8757,10 @@
/turf/open/floor/iron/dark/side,
/area/station/security/processing)
"cKA" = (
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 2
+/obj/machinery/camera/directional/west{
+ c_tag = "Xenobiology - Secure Cell Interior";
+ name = "xenobiology camera";
+ network = list("ss13","xeno","rd")
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -9060,18 +8998,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"cNI" = (
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"cNQ" = (
/obj/structure/closet/wardrobe/grey,
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -9627,20 +9553,6 @@
},
/turf/open/floor/iron,
/area/station/maintenance/disposal/incinerator)
-"cXX" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 11";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"cXZ" = (
/obj/structure/table/wood,
/obj/machinery/computer/security/wooden_tv,
@@ -10567,15 +10479,8 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"dmj" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/machinery/button/door/directional/east{
- id = "xenobio11";
- layer = 4;
- name = "Xenobio Pen 11 Blast DOors";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"dms" = (
/obj/structure/closet/crate,
@@ -10710,15 +10615,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat_interior)
-"doK" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio8";
- layer = 4;
- name = "Xenobio Pen 8 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"doT" = (
/obj/item/hand_labeler,
/obj/item/assembly/timer,
@@ -11932,19 +11828,6 @@
},
/turf/open/floor/iron,
/area/station/security/prison/garden)
-"dIS" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"dIZ" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 5
@@ -11954,13 +11837,13 @@
/turf/open/floor/iron/dark,
/area/station/medical/pathology)
"dJx" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "3"
},
-/turf/open/floor/plating,
+/obj/machinery/slime_pen_controller{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"dJy" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{
@@ -12070,12 +11953,10 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"dLr" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/disposaloutlet{
- dir = 4
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "4";
+ dir = 1;
+ pixel_y = 0
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -12299,16 +12180,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"dPy" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Kill Chamber";
- network = list("ss13","rd","xeno")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"dPP" = (
/obj/structure/closet/toolcloset,
/turf/open/floor/plating,
@@ -12353,20 +12224,6 @@
/obj/structure/sign/departments/rndserver/directional/south,
/turf/open/floor/iron/white,
/area/station/science/research)
-"dQZ" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 9";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"dRc" = (
/obj/structure/table,
/obj/machinery/firealarm/directional/west,
@@ -14874,7 +14731,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
-/turf/open/floor/iron/freezer,
+/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
"eGW" = (
/obj/effect/turf_decal/tile/red{
@@ -15796,21 +15653,6 @@
/obj/machinery/light_switch/directional/east,
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
-"eWh" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 2";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"eWi" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/landmark/event_spawn,
@@ -16298,10 +16140,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"ffz" = (
-/obj/machinery/processor/slime,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"ffQ" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 10
@@ -16535,19 +16373,6 @@
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/iron/grimy,
/area/station/maintenance/aft/greater)
-"fjt" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 9";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
- },
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"fjw" = (
/obj/machinery/smartfridge,
/turf/closed/wall,
@@ -16692,9 +16517,11 @@
/turf/open/lava/plasma/ice_moon,
/area/icemoon/underground/explored)
"fma" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"fmc" = (
/turf/closed/wall,
@@ -17274,10 +17101,6 @@
"fwB" = (
/turf/closed/mineral/snowmountain/coldroom,
/area/station/service/kitchen/coldroom)
-"fwC" = (
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"fwD" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 6
@@ -18318,13 +18141,6 @@
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"fPv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"fPx" = (
/obj/docking_port/stationary/random/icemoon{
dir = 8;
@@ -19220,6 +19036,13 @@
/obj/item/food/piedough,
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
+"gdf" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "6";
+ dir = 2
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"gdg" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/components/unary/passive_vent{
@@ -19459,15 +19282,6 @@
/obj/effect/turf_decal/trimline/yellow/line,
/turf/open/floor/iron/dark/side,
/area/station/security/prison/workout)
-"giP" = (
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/structure/disposaloutlet{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"giQ" = (
/obj/item/radio/intercom/directional/north,
/obj/structure/cable,
@@ -20167,6 +19981,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
},
+/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"guS" = (
@@ -20499,21 +20314,6 @@
/obj/structure/sign/warning/cold_temp/directional/west,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"gBb" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 3";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio3";
- name = "Xenobio Pen 3 Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"gBc" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -20612,14 +20412,9 @@
/turf/open/floor/iron,
/area/station/command/heads_quarters/hop)
"gCo" = (
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/structure/window/reinforced/spawner/directional/north{
- pixel_y = 2
- },
-/obj/structure/disposaloutlet{
- dir = 8
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "1";
+ dir = 1
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -21155,10 +20950,6 @@
"gKQ" = (
/turf/closed/wall,
/area/station/security/courtroom)
-"gLj" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"gLk" = (
/obj/structure/extinguisher_cabinet/directional/south,
/turf/open/floor/iron,
@@ -21289,6 +21080,12 @@
/obj/item/reagent_containers/dropper,
/turf/open/floor/iron/cafeteria,
/area/station/science/lab)
+"gND" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"gNH" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
@@ -22997,18 +22794,6 @@
/obj/structure/girder,
/turf/closed/wall,
/area/station/maintenance/starboard/aft)
-"htp" = (
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"hty" = (
/obj/item/stack/rods,
/turf/open/misc/asteroid/snow/icemoon,
@@ -23629,18 +23414,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"hEW" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"hEZ" = (
/obj/structure/ladder,
/turf/open/floor/plating,
@@ -23840,19 +23613,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/fore)
-"hJi" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 6";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
- },
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"hJx" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
@@ -24135,13 +23895,6 @@
/obj/effect/turf_decal/tile/brown/fourcorners,
/turf/open/floor/iron/white,
/area/station/medical/break_room)
-"hOU" = (
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Pens - Port Fore";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"hOX" = (
/obj/machinery/camera/directional/west{
c_tag = "Atmospherics - North West"
@@ -24648,7 +24401,9 @@
},
/area/station/security/prison/rec)
"hWu" = (
-/obj/machinery/light/directional/east,
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"hWP" = (
@@ -24758,6 +24513,13 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/grimy,
/area/station/commons/vacant_room/office)
+"hZT" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "5";
+ dir = 2
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"iag" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
@@ -24767,15 +24529,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
/turf/closed/wall/r_wall,
/area/station/science/ordnance/burnchamber)
-"iar" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"iav" = (
/obj/structure/closet/secure_closet/labor_camp_security,
/obj/effect/turf_decal/tile/red/half/contrasted,
@@ -24965,6 +24718,12 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/nospawn)
+"ibX" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"ica" = (
/obj/machinery/door/firedoor,
/turf/open/floor/iron/dark,
@@ -25328,15 +25087,6 @@
},
/turf/open/floor/wood,
/area/station/hallway/secondary/service)
-"ihN" = (
-/obj/machinery/button/door/directional/west{
- id = "xenobio4";
- layer = 4;
- name = "Xenobio Pen 4 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"iig" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -26361,20 +26111,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
/turf/open/floor/plating,
/area/station/maintenance/solars/port/fore)
-"izA" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 8";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"izC" = (
/turf/closed/wall,
/area/station/service/bar/atrium)
@@ -26640,18 +26376,6 @@
},
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
-"iDG" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 3";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"iDQ" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
@@ -26702,20 +26426,11 @@
/turf/open/floor/plating/icemoon,
/area/station/security/execution/education)
"iER" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
+/obj/machinery/light/floor/has_bulb,
/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/cable,
-/obj/machinery/camera/directional/south{
- c_tag = "Xenobiology Pens Hall - Aft";
- network = list("ss13","rd","xeno_pens")
+ dir = 4
},
-/turf/open/floor/iron,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"iFc" = (
/obj/effect/turf_decal/tile/red/half{
@@ -27776,7 +27491,9 @@
/turf/open/floor/iron/dark/textured,
/area/station/security/prison)
"iVT" = (
-/obj/machinery/computer/camera_advanced/xenobio,
+/obj/structure/table/glass,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/vacuum_pack,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"iVU" = (
@@ -29489,18 +29206,6 @@
/obj/structure/flora/grass/both/style_random,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
-"jAF" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 5";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"jAO" = (
/obj/effect/turf_decal/siding/yellow{
dir = 8
@@ -30075,12 +29780,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"jKI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"jKJ" = (
/obj/effect/mapping_helpers/airlock/unres{
dir = 1
@@ -30670,10 +30369,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/maintenance/central/greater)
-"jSW" = (
-/mob/living/simple_animal/slime,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"jTf" = (
/obj/structure/fence{
dir = 1
@@ -31064,16 +30759,6 @@
},
/turf/open/floor/iron,
/area/mine/laborcamp)
-"kaW" = (
-/obj/machinery/light/directional/east,
-/obj/machinery/button/door/directional/east{
- id = "xenobio9";
- layer = 4;
- name = "Xenobio Pen 9 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"kaX" = (
/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron/white/side{
@@ -33151,6 +32836,13 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/lobby)
+"kGV" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "2";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"kHb" = (
/obj/structure/closet/secure_closet/personal{
anchored = 1
@@ -34670,15 +34362,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/engineering/supermatter/room)
-"lfs" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"lfF" = (
/obj/structure/sign/warning/cold_temp/directional/west,
/obj/structure/sign/warning/gas_mask/directional/east,
@@ -36010,20 +35693,6 @@
},
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/prison)
-"lBZ" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 7";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"lCb" = (
/obj/effect/landmark/start/assistant,
/obj/structure/cable,
@@ -36337,6 +36006,13 @@
/obj/item/storage/toolbox/emergency,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"lGB" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"lGK" = (
/obj/machinery/vending/cigarette,
/obj/machinery/button/door{
@@ -36567,19 +36243,6 @@
},
/turf/open/floor/wood,
/area/station/service/lawoffice)
-"lMu" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
- },
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"lMC" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -36610,16 +36273,6 @@
},
/turf/open/floor/iron/dark/textured_edge,
/area/station/security/prison)
-"lNo" = (
-/obj/machinery/light/directional/east,
-/obj/machinery/button/door/directional/east{
- id = "xenobio6";
- layer = 4;
- name = "Xenobio Pen 6 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"lNy" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -37294,12 +36947,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/office)
-"lZX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"mae" = (
/obj/structure/statue/snow/snowman,
/turf/open/misc/asteroid/snow/icemoon,
@@ -37310,15 +36957,15 @@
/turf/open/floor/iron,
/area/station/commons/dorms)
"maO" = (
-/obj/machinery/disposal/bin,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
+/obj/machinery/light/floor/has_bulb,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
},
-/obj/structure/disposalpipe/trunk{
+/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/turf/open/floor/iron,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"maQ" = (
/obj/machinery/door/airlock/external{
@@ -38251,6 +37898,13 @@
dir = 4
},
/area/station/security/brig/entrance)
+"mqK" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "3";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"mqO" = (
/obj/machinery/power/port_gen/pacman,
/turf/open/floor/plating,
@@ -38669,6 +38323,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
+"myS" = (
+/obj/machinery/duct,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"myZ" = (
/obj/structure/lattice/catwalk,
/turf/open/openspace/icemoon/keep_below,
@@ -39876,6 +39534,10 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/work)
+"mVO" = (
+/obj/machinery/duct,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"mVY" = (
/obj/effect/turf_decal/tile/neutral/diagonal_edge,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -41045,18 +40707,6 @@
/obj/effect/mapping_helpers/airlock/access/any/service/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"nmj" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"nmk" = (
/obj/structure/window/reinforced/spawner/directional/north,
/turf/open/floor/engine,
@@ -43922,18 +43572,10 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"odd" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 6";
- req_access = list("xenobiology")
- },
/obj/effect/turf_decal/stripes/line{
- dir = 8
+ dir = 4
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"odi" = (
/obj/item/toy/snowball{
@@ -44249,19 +43891,6 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
-"oir" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"oiy" = (
/turf/closed/wall/r_wall,
/area/station/ai_monitored/turret_protected/aisat/service)
@@ -44633,11 +44262,6 @@
/obj/effect/mapping_helpers/iannewyear,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hop)
-"ooo" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/processor/slime,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"oop" = (
/obj/machinery/door/airlock/external{
name = "External Access"
@@ -45086,7 +44710,7 @@
"ouP" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"ouX" = (
@@ -45287,6 +44911,14 @@
/obj/structure/table,
/turf/open/floor/wood,
/area/station/command/meeting_room)
+"oyt" = (
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"oyy" = (
/obj/effect/turf_decal/trimline/green/filled/corner{
dir = 1
@@ -46359,15 +45991,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
-"oQo" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio5";
- name = "Xenobio Pen 5 Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"oQp" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -46785,15 +46408,6 @@
"oXq" = (
/turf/open/floor/iron/white,
/area/station/medical/cryo)
-"oXr" = (
-/obj/machinery/door/airlock/research/glass{
- name = "Kill Chamber";
- normalspeed = 0
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"oXs" = (
/obj/effect/turf_decal/trimline/green/filled/line{
dir = 9
@@ -47787,6 +47401,7 @@
"ppp" = (
/obj/structure/railing,
/obj/effect/turf_decal/stripes/line,
+/obj/machinery/computer/slime_market,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"ppq" = (
@@ -47955,15 +47570,6 @@
/obj/machinery/telecomms/server/presets/security,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
-"prH" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio11";
- name = "Xenobio Pen 11 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"psb" = (
/turf/closed/wall/ice,
/area/icemoon/underground/explored)
@@ -50186,18 +49792,6 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/mine/laborcamp)
-"qbq" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio11";
- name = "Xenobio Pen 11 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"qbA" = (
/obj/structure/cable,
/obj/machinery/airalarm/directional/east,
@@ -51809,9 +51403,9 @@
"qEv" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 1
- },
+/obj/structure/table/glass,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/vacuum_pack,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"qEz" = (
@@ -53493,19 +53087,6 @@
/obj/item/flashlight/flare/candle,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"reT" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 8";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
- },
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"rfh" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -53796,15 +53377,6 @@
/obj/structure/sign/poster/official/random/directional/north,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"rjT" = (
-/obj/machinery/button/door/directional/west{
- id = "xenobio3";
- layer = 4;
- name = "Xenobio Pen 3 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"rkc" = (
/obj/effect/turf_decal/siding/yellow,
/obj/effect/turf_decal/siding/yellow{
@@ -54037,18 +53609,6 @@
/obj/effect/spawner/random/trash/janitor_supplies,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"roA" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 4";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"roH" = (
/obj/structure/chair/pew/right,
/turf/open/floor/wood,
@@ -54214,14 +53774,6 @@
/obj/effect/landmark/generic_maintenance_landmark,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"rsC" = (
-/obj/machinery/light/directional/west,
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Pens - Port Mid";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"rsL" = (
/obj/structure/cable,
/turf/open/floor/circuit,
@@ -54519,17 +54071,13 @@
/turf/open/floor/iron/white/smooth_large,
/area/station/service/kitchen/diner)
"rxM" = (
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
+/obj/machinery/corral_corner{
+ mapping_id = "4"
},
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/slime_pen_controller{
+ mapping_id = "4"
},
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"rxW" = (
/turf/closed/mineral/random/snow,
@@ -55292,16 +54840,10 @@
/turf/open/floor/plating,
/area/station/engineering/main)
"rJe" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 1";
- req_access = list("xenobiology")
- },
/obj/effect/turf_decal/stripes/line{
- dir = 4
+ dir = 8
},
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"rJv" = (
/obj/machinery/bluespace_beacon,
@@ -56083,13 +55625,8 @@
/turf/open/floor/iron/smooth,
/area/mine/mechbay)
"rXD" = (
-/obj/machinery/button/door/directional/east{
- id = "xenobio7";
- layer = 4;
- name = "Xenobio Pen 7 Blast DOors";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/glass/reinforced,
/area/station/science/xenobiology)
"rXN" = (
/obj/machinery/door/firedoor,
@@ -56543,6 +56080,7 @@
"sfv" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
+/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"sfy" = (
@@ -56891,15 +56429,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"slp" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"slv" = (
/obj/structure/cable,
/obj/effect/turf_decal/siding/green/corner{
@@ -59689,16 +59218,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"tiQ" = (
-/obj/structure/sink/directional/east,
-/obj/machinery/button/door/directional/west{
- id = "xenobio2";
- layer = 4;
- name = "Xenobio Pen 2 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tiV" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -59847,7 +59366,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 5
},
-/turf/open/floor/iron/freezer,
+/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
"tkS" = (
/obj/item/radio/intercom/directional/east,
@@ -60233,10 +59752,6 @@
/obj/structure/disposalpipe/junction/flip,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
-"tsa" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"tsh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -61691,19 +61206,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/station/cargo/lobby)
-"tOf" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"tOi" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -62035,15 +61537,6 @@
/obj/effect/spawner/random/trash/soap,
/turf/open/floor/plating,
/area/station/maintenance/department/chapel)
-"tWd" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"tWp" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -62468,21 +61961,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron/dark,
/area/station/science/breakroom)
-"ucl" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 4";
- req_access = list("xenobiology")
- },
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio4";
- name = "Xenobio Pen 4 Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"ucn" = (
/obj/item/toy/snowball{
pixel_x = 9;
@@ -65478,17 +64956,6 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/station/cargo/miningdock)
-"vdr" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"vds" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -65649,11 +65116,16 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/underground/explored)
"vfq" = (
-/obj/machinery/monkey_recycler,
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 5
},
+/obj/machinery/biomass_recycler,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"vfI" = (
@@ -67447,12 +66919,10 @@
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
"vIk" = (
-/obj/machinery/light/directional/north,
-/obj/machinery/atmospherics/components/unary/passive_vent,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/turf/open/floor/iron/freezer,
+/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
"vIm" = (
/obj/structure/closet/emcloset,
@@ -67770,21 +67240,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"vPD" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 1";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio1";
- name = "Xenobio Pen 1 Blast Door"
- },
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"vPE" = (
/obj/structure/table,
/obj/item/clothing/gloves/latex,
@@ -68705,18 +68160,6 @@
},
/turf/open/floor/glass,
/area/station/service/library)
-"wgr" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio9";
- name = "Xenobio Pen 9 Blast Door"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"wgs" = (
/obj/structure/cable,
/mob/living/basic/sloth/paperwork,
@@ -69203,9 +68646,8 @@
/turf/open/floor/iron/dark,
/area/station/security/execution/education)
"wnB" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Xenobiology Pens - Starboard Aft";
- network = list("ss13","rd","xeno")
+/obj/machinery/corral_corner{
+ mapping_id = "2"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -69363,12 +68805,6 @@
},
/turf/open/floor/iron/dark,
/area/station/science/ordnance/office)
-"wpv" = (
-/obj/structure/sign/warning/cold_temp,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"wpx" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/newscaster/directional/west,
@@ -69672,7 +69108,9 @@
/turf/open/floor/iron,
/area/station/engineering/lobby)
"wva" = (
-/obj/machinery/light/directional/west,
+/obj/machinery/corral_corner{
+ mapping_id = "5"
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"wvb" = (
@@ -69954,14 +69392,6 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/security/prison/mess)
-"wyU" = (
-/obj/machinery/light/directional/west,
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Pens - Port Aft";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"wzc" = (
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
@@ -70456,17 +69886,13 @@
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"wGN" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/corral_corner{
+ mapping_id = "2"
},
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio6";
- name = "Xenobio Pen 6 Blast Door"
+/obj/machinery/slime_pen_controller{
+ mapping_id = "2"
},
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/warning/electric_shock,
-/turf/open/floor/plating,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"wGO" = (
/obj/machinery/light/directional/south,
@@ -70498,13 +69924,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/pathology)
-"wHb" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/freezer,
-/area/station/science/xenobiology)
"wHc" = (
/turf/closed/wall/r_wall,
/area/station/command/heads_quarters/rd)
@@ -71355,10 +70774,8 @@
/turf/open/floor/iron,
/area/station/construction/mining/aux_base)
"wUz" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/machinery/camera/directional/east{
- c_tag = "Xenobiology Pens - Starboard Mid";
- network = list("ss13","rd","xeno")
+/obj/machinery/corral_corner{
+ mapping_id = "4"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -71582,20 +70999,6 @@
/obj/effect/spawner/random/trash/grille_or_waste,
/turf/open/floor/plating,
/area/station/maintenance/department/medical/morgue)
-"wXX" = (
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 8;
- icon_state = "right";
- name = "Containment Pen 10";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"wYb" = (
/obj/structure/table,
/obj/effect/turf_decal/stripes/red/line{
@@ -71702,19 +71105,6 @@
/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"wZv" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/machinery/camera{
- c_tag = "Xenobiology Pens Hall - Fore";
- dir = 9;
- network = list("ss13","rd","xeno")
- },
-/obj/structure/sign/xenobio_guide/directional/north,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"wZL" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/yellow{
@@ -72034,6 +71424,12 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"xfz" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/slime_market_pad,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"xfB" = (
/obj/machinery/atmospherics/pipe/smart/simple/green/visible,
/turf/open/floor/iron,
@@ -72217,18 +71613,6 @@
/obj/effect/turf_decal/tile/yellow/opposingcorners,
/turf/open/floor/iron/white,
/area/station/maintenance/port/fore)
-"xhv" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 2";
- req_access = list("xenobiology")
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"xhw" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -72737,16 +72121,12 @@
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
"xqu" = (
-/obj/machinery/door/window/left/directional/north{
- dir = 4;
- name = "Containment Pen 10";
- req_access = list("xenobiology")
+/obj/machinery/corral_corner{
+ mapping_id = "6"
},
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio10";
- name = "Xenobio Pen 10 Blast Door"
+/obj/machinery/slime_pen_controller{
+ mapping_id = "6"
},
-/obj/structure/cable,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"xqy" = (
@@ -72873,6 +72253,14 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/station/maintenance/disposal)
+"xsU" = (
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"xtc" = (
/obj/effect/turf_decal/trimline/blue/filled/warning{
dir = 1
@@ -72955,15 +72343,6 @@
"xuo" = (
/turf/open/floor/plating/snowed/icemoon,
/area/icemoon/underground/explored)
-"xur" = (
-/obj/structure/cable,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio8";
- name = "Xenobio Pen 8 Blast Door"
- },
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"xuA" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/textured,
@@ -73226,6 +72605,7 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/obj/structure/cable,
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"xyx" = (
@@ -73486,15 +72866,6 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/station/security/courtroom)
-"xCh" = (
-/obj/machinery/button/door/directional/west{
- id = "xenobio5";
- layer = 4;
- name = "Xenobio Pen 5 Blast Door";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"xCj" = (
/obj/structure/sign/departments/holy,
/turf/closed/wall,
@@ -75405,15 +74776,6 @@
/obj/effect/spawner/random/maintenance/two,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"yjA" = (
-/obj/structure/cable,
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"yjK" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/generic,
@@ -183661,27 +183023,27 @@ abe
abe
biI
abe
+abe
eOS
-qLY
eGN
-lZX
-dPy
-qLY
-hOU
wva
abe
cKA
abe
+wva
+xsU
+ibX
abe
cKA
-rsC
abe
-cKA
abe
+ibX
+xsU
+gND
abe
cKA
-wyU
abe
+gND
rnQ
nPI
wzg
@@ -183918,25 +183280,25 @@ abe
cku
uUn
xNa
+abe
eOS
-qLY
vIk
-tsa
-wHb
-qLY
abe
-jSW
abe
-cKA
-jSW
+aUq
+abe
+abe
+lGB
abe
-cKA
abe
abe
-cKA
abe
abe
-cKA
+abe
+lGB
+abe
+abe
+aUq
abe
abe
rnQ
@@ -184175,24 +183537,24 @@ abe
abe
bOT
abe
+abe
eLb
-qLY
tkP
-fPv
-jKI
-qLY
-giP
abe
abe
-gCo
-abe
-abe
-gCo
-abe
+hZT
+myS
+myS
+oyt
+myS
+myS
+mqK
abe
-gCo
abe
abe
+oyt
+myS
+myS
gCo
abe
abe
@@ -184435,24 +183797,24 @@ abe
ctF
qLY
qLY
-oXr
-wpv
-qLY
-lMu
+wva
+abe
+abe
+abe
bUK
-oQo
-nmj
-ucl
-aHz
-dIS
-gBb
+oyt
+ibX
+abe
+abe
+abe
+abe
dJx
-htp
-eWh
-yjA
-tOf
-vPD
-lqU
+oyt
+gND
+abe
+abe
+abe
+aIV
mDg
nPI
alM
@@ -184692,23 +184054,23 @@ cZT
cZT
pXj
qLY
-wZv
-axD
-qLY
-hEW
-jAF
-fma
-vdr
-roA
-fma
-vdr
-iDG
fma
+rJe
+rJe
+rJe
+rJe
maO
-xhv
-fma
+rJe
+rJe
+rJe
+rJe
+rJe
+rJe
maO
rJe
+rJe
+rJe
+rJe
fma
ffe
nPI
@@ -184946,26 +184308,26 @@ pMF
mqe
hRC
euM
-pMF
+mVO
sfv
xyn
dmj
-wPd
-fwC
-asb
-pMF
-xCh
-kaW
-pMF
-ihN
-doK
-pMF
-rjT
rXD
-pMF
-tiQ
-lNo
-pMF
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+rXD
+fvk
+fvk
+fvk
+fvk
clW
rkl
nPI
@@ -185206,23 +184568,23 @@ niy
gtF
ouP
gLS
+iER
+odd
+odd
+odd
+odd
cyh
-cXX
-bKI
-cyh
-wXX
-bKI
-cyh
-dQZ
-bKI
-cyh
-izA
-bKI
-cyh
-lBZ
-bKI
+odd
+odd
+odd
+odd
+odd
+odd
cyh
odd
+odd
+odd
+odd
iER
ffe
nPI
@@ -185463,23 +184825,23 @@ qWS
wPd
ygE
qLY
-prH
-bjn
-qbq
-iar
+hWu
+abe
+abe
+abe
xqu
-oir
-slp
-fjt
-wgr
-xur
-reT
+oyt
+wUz
+abe
+abe
+abe
+abe
rxM
-aLA
-bnh
-cNI
-tWd
-hJi
+oyt
+wnB
+abe
+abe
+abe
wGN
mDg
pQG
@@ -185722,22 +185084,22 @@ iQM
qLY
abe
abe
+gdf
+myS
+myS
+oyt
+myS
+myS
dLr
abe
abe
-dLr
-abe
-abe
-dLr
-abe
-abe
-dLr
-abe
abe
-dLr
+oyt
+myS
+myS
+kGV
abe
abe
-lfs
pjr
nPI
nPI
@@ -185979,21 +185341,21 @@ qLY
qLY
abe
abe
-gLj
+aUq
+abe
abe
-jSW
-gLj
+lGB
abe
abe
-gLj
abe
abe
-gLj
abe
abe
-gLj
+lGB
abe
abe
+aUq
+abe
abe
pjr
tRd
@@ -186234,23 +185596,23 @@ xwd
qLY
vgf
qLY
+hWu
abe
+atw
abe
-gLj
-aey
hWu
-gLj
+xsU
+wUz
abe
+atw
abe
-gLj
abe
-hWu
wUz
+xsU
+wnB
abe
+atw
abe
-gLj
-abe
-hWu
wnB
pjr
tRd
@@ -250242,7 +249604,7 @@ xJj
lvh
iVT
ogl
-ffz
+xJj
bzB
diL
vTJ
@@ -250746,7 +250108,7 @@ ehd
ehd
ehd
wmX
-ooo
+lva
rtn
qEv
vDu
@@ -251769,7 +251131,7 @@ jbU
kHN
kra
qhL
-ppp
+xfz
xJG
ily
ily
@@ -254315,7 +253677,7 @@ eha
aJQ
aJQ
lso
-lZi
+bOq
qaE
mBQ
eag
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index 620765d9e8dc..63d1b8f7a7eb 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -15126,9 +15126,6 @@
"fjh" = (
/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced/spawner/directional/south,
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/machinery/button/door/directional/north{
id = "xeno3";
name = "Creature Cell 3 Toggle";
@@ -26868,7 +26865,6 @@
"iKn" = (
/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced/spawner/directional/north,
-/obj/machinery/processor/slime,
/obj/machinery/button/door/directional/south{
id = "xeno4";
name = "Creature Cell 4 Toggle";
@@ -50051,9 +50047,6 @@
/turf/open/floor/iron,
/area/station/security/brig)
"qEj" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 4
- },
/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced/spawner/directional/south,
/obj/machinery/light/directional/north,
@@ -64153,10 +64146,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
-"vhx" = (
-/mob/living/simple_animal/slime,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"vhK" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -68244,7 +68233,6 @@
"wqR" = (
/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced/spawner/directional/south,
-/obj/machinery/monkey_recycler,
/obj/item/radio/intercom/directional/north,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 8
@@ -110474,13 +110462,13 @@ wpw
ieb
xcf
wpw
-vhx
+qmW
nQx
qmW
uXM
qmW
nQx
-vhx
+qmW
lZi
qdM
nmu
@@ -113048,7 +113036,7 @@ qmW
nQx
qmW
wpw
-vhx
+qmW
nQx
qmW
lDu
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 69de29167952..741217d5d372 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -664,13 +664,13 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"amV" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"amY" = (
/obj/effect/turf_decal/tile/yellow{
@@ -805,6 +805,15 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/iron/white,
/area/station/science/xenobiology/hallway)
+"apT" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/aft)
"apZ" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/north,
@@ -1375,12 +1384,6 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"azS" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/starboard/fore)
"aAb" = (
/obj/structure/table/wood,
/obj/item/lipstick{
@@ -1588,10 +1591,8 @@
/turf/open/floor/iron/freezer,
/area/station/commons/toilet/restrooms)
"aDQ" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/machinery/chem_heater/withbuffer,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"aDR" = (
@@ -1915,12 +1916,6 @@
/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
-"aJE" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/lab)
"aJI" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -1955,13 +1950,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/surgery/theatre)
-"aJQ" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 4;
- name = "killroom vent"
- },
-/turf/open/floor/circuit/telecomms,
-/area/station/science/xenobiology)
"aJS" = (
/turf/closed/wall/r_wall,
/area/station/ai_monitored/turret_protected/ai_upload)
@@ -2613,11 +2601,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/ai_monitored/command/storage/eva)
-"aUT" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"aVd" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -2652,6 +2635,15 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai)
+"aVx" = (
+/obj/machinery/corral_corner{
+ mapping_id = "5"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "5"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"aVX" = (
/obj/machinery/door/airlock/hatch{
name = "Telecomms Server Room"
@@ -2858,6 +2850,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/security/prison)
+"aYt" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "XenoPens";
+ name = "Xenobiology Lockdown"
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"aYw" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Three";
@@ -2987,6 +2988,13 @@
/obj/effect/landmark/start/scientist,
/turf/open/floor/iron/white,
/area/station/science/circuits)
+"bae" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"bau" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -3058,13 +3066,6 @@
/obj/effect/spawner/random/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"bbL" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"bbO" = (
/obj/structure/window/reinforced/spawner/directional/north{
layer = 2.9
@@ -3682,17 +3683,6 @@
/obj/structure/transit_tube/diagonal,
/turf/open/space,
/area/space/nearstation)
-"bnp" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/cable,
-/obj/structure/chair/stool/directional/south,
-/obj/machinery/camera/directional/west{
- c_tag = "Solar Maintenance - Aft Starboard"
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"bnr" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/obj/structure/chair/sofa/corp/right{
@@ -3824,12 +3814,6 @@
},
/turf/open/floor/iron/dark,
/area/station/service/chapel/funeral)
-"bnQ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"bnU" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/chair/office/light,
@@ -3990,6 +3974,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/iron/white,
/area/station/science/cytology)
"bqX" = (
@@ -4146,6 +4131,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
+"btB" = (
+/obj/machinery/power/terminal,
+/obj/machinery/light/small/directional/east,
+/obj/item/radio/intercom/directional/east,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"btH" = (
/obj/structure/table,
/obj/item/reagent_containers/cup/beaker{
@@ -4322,11 +4314,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
-"bxg" = (
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"bxj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/camera/directional/west{
@@ -4403,16 +4390,6 @@
/obj/effect/landmark/start/assistant,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"byP" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"byR" = (
/obj/structure/sign/warning/secure_area/directional/north,
/obj/effect/turf_decal/tile/blue{
@@ -5197,8 +5174,8 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
-/obj/machinery/smartfridge/extract/preloaded,
/obj/effect/turf_decal/bot_white,
+/obj/machinery/slime_market_pad,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"bQY" = (
@@ -5210,6 +5187,16 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
+"bRc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"bRG" = (
/obj/machinery/shower/directional/west,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -5273,13 +5260,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"bSu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"bSA" = (
/obj/machinery/door/window/right/directional/south{
name = "First Aid Supplies";
@@ -5607,14 +5587,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"caf" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"can" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/structure/cable,
@@ -5654,6 +5626,15 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/aft)
+"cbn" = (
+/obj/machinery/door/poddoor/preopen{
+ id = "Xenolab";
+ name = "Test Chamber Blast Door"
+ },
+/obj/structure/cable,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"cbz" = (
/turf/closed/wall,
/area/station/cargo/storage)
@@ -5738,8 +5719,8 @@
/area/station/hallway/secondary/command)
"ces" = (
/obj/effect/turf_decal/trimline/purple/filled/line,
-/obj/machinery/processor/slime,
/obj/effect/turf_decal/bot_white,
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"cez" = (
@@ -5807,11 +5788,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
-"cgd" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"cgi" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/dark/side{
@@ -5974,6 +5950,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
+"cjT" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "2";
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"cke" = (
/obj/structure/showcase/machinery/tv{
dir = 1;
@@ -6134,6 +6118,28 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"cnF" = (
+/obj/structure/cable,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/stack/sheet/glass/fifty,
+/obj/structure/closet/crate/engineering/electrical,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"cnK" = (
/turf/closed/wall,
/area/station/engineering/main)
@@ -6187,15 +6193,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"cpl" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"cpn" = (
/obj/structure/table,
/obj/machinery/newscaster/directional/north,
@@ -6331,6 +6328,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/service/bar)
+"cqQ" = (
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "6"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"crg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
@@ -6462,6 +6468,17 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
+"ctN" = (
+/obj/structure/cable,
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"ctO" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -6704,6 +6721,32 @@
/obj/effect/turf_decal/tile/blue/half/contrasted,
/turf/open/floor/iron/dark,
/area/station/command/bridge)
+"cxi" = (
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/stack/sheet/glass/fifty,
+/obj/structure/closet/crate/engineering/electrical,
+/obj/item/stack/cable_coil,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/machinery/camera/directional/north{
+ c_tag = "Solar Maintenance - Aft Port"
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"cxj" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
@@ -7080,6 +7123,12 @@
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
/area/station/commons/storage/primary)
+"cFw" = (
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"cFU" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
@@ -7103,6 +7152,15 @@
},
/turf/open/floor/iron,
/area/station/service/bar)
+"cFW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"cGj" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -7183,6 +7241,10 @@
},
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
+"cHV" = (
+/obj/machinery/camera/directional/east,
+/turf/closed/wall/r_wall,
+/area/station/science/xenobiology)
"cId" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -7817,6 +7879,11 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
+"cVQ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"cWr" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -7946,17 +8013,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/port)
-"cZs" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/spawner/random/trash/garbage{
- spawn_scatter_radius = 1
- },
-/obj/structure/sign/poster/contraband/random/directional/east,
-/obj/effect/mapping_helpers/burnt_floor,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/lesser)
"cZu" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -8010,14 +8066,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
-"dac" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"das" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -8200,15 +8248,20 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
"ddK" = (
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
+"ddN" = (
+/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"ddO" = (
/obj/effect/turf_decal/trimline/green/filled/corner,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -8372,10 +8425,8 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/item/radio/intercom/directional/north,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"dgD" = (
/turf/closed/wall,
@@ -8503,15 +8554,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/chemistry)
-"diq" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/south{
- dir = 8;
- name = "Maximum Security Test Chamber";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"diC" = (
/obj/machinery/door/airlock/maintenance{
name = "Atmospherics Maintenance"
@@ -8824,10 +8866,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/wood,
/area/station/commons/dorms)
-"dqw" = (
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"dqx" = (
/obj/structure/closet/emcloset,
/turf/open/floor/plating,
@@ -9054,14 +9092,6 @@
"duI" = (
/turf/closed/wall,
/area/station/command/bridge)
-"duN" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/obj/structure/fans/tiny,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"dvk" = (
/obj/structure/table,
/obj/machinery/light/directional/west,
@@ -9104,6 +9134,16 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/aft/lesser)
+"dvT" = (
+/obj/structure/sign/warning/vacuum/external/directional/south,
+/obj/machinery/power/solar_control{
+ dir = 4;
+ id = "aftport";
+ name = "Port Quarter Solar Control"
+ },
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"dvV" = (
/obj/machinery/nuclearbomb/beer{
pixel_x = 2;
@@ -9159,8 +9199,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"dxe" = (
/obj/effect/landmark/event_spawn,
@@ -9308,6 +9349,9 @@
/obj/machinery/power/port_gen/pacman/pre_loaded,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"dAJ" = (
+/turf/closed/wall,
+/area/space)
"dBV" = (
/obj/docking_port/stationary/escape_pod{
dir = 4
@@ -9544,6 +9588,10 @@
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/turf/open/floor/engine,
/area/station/science/explab)
+"dGk" = (
+/obj/effect/spawner/random/vending/snackvend,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"dGq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/stairs/left{
@@ -9731,17 +9779,6 @@
/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"dKh" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"dKl" = (
/obj/structure/sign/warning/pods,
/turf/closed/wall/r_wall,
@@ -9933,6 +9970,12 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
+"dMA" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"dMH" = (
/obj/machinery/light/small/directional/west,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -10040,6 +10083,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/white/corner,
/area/station/hallway/secondary/entry)
+"dPw" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"dPy" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -10101,8 +10148,18 @@
pixel_y = 1;
req_access = list("xenobiology")
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen2"
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"dQb" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"dQA" = (
/obj/machinery/computer/rdservercontrol{
dir = 4
@@ -10188,6 +10245,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"dRR" = (
+/obj/structure/sign/warning/vacuum/external/directional/east,
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"dRY" = (
/obj/structure/chair/office,
/obj/effect/landmark/start/hangover,
@@ -10304,13 +10367,6 @@
},
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"dUk" = (
-/obj/machinery/power/terminal,
-/obj/machinery/light/small/directional/east,
-/obj/item/radio/intercom/directional/east,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"dUB" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -10380,6 +10436,15 @@
/obj/effect/spawner/random/aimodule/harmless,
/turf/open/floor/circuit/green,
/area/station/ai_monitored/turret_protected/ai_upload)
+"dWA" = (
+/obj/machinery/light/small/directional/south,
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"dWF" = (
/obj/machinery/light/directional/north,
/obj/machinery/camera/directional/north{
@@ -11029,17 +11094,6 @@
/obj/machinery/atmospherics/components/unary/bluespace_sender,
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"eha" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"ehg" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
@@ -11331,6 +11385,15 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"elT" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"elV" = (
/obj/machinery/airalarm/directional/north,
/obj/item/clothing/under/misc/assistantformal,
@@ -11377,6 +11440,14 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
+"eml" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "1";
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"emv" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -11870,16 +11941,6 @@
},
/turf/open/floor/iron,
/area/station/commons/dorms)
-"evD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"evE" = (
/obj/effect/turf_decal/siding/purple{
dir = 10
@@ -11976,13 +12037,6 @@
},
/turf/open/floor/iron,
/area/station/security/warden)
-"ewF" = (
-/obj/machinery/power/terminal,
-/obj/machinery/light/small/directional/east,
-/obj/item/radio/intercom/directional/east,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"ewR" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/engineering{
@@ -12022,11 +12076,6 @@
/obj/item/pen,
/turf/open/floor/wood,
/area/station/service/lawoffice)
-"exu" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"exC" = (
/obj/effect/turf_decal/plaque{
icon_state = "L3"
@@ -12408,13 +12457,6 @@
/obj/effect/spawner/random/vending/colavend,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"eHN" = (
-/obj/effect/landmark/event_spawn,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/lesser)
"eHR" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -12425,14 +12467,6 @@
/obj/effect/mapping_helpers/burnt_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"eIc" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/structure/fans/tiny,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"eIw" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -12487,11 +12521,9 @@
/turf/open/floor/plating,
/area/station/science/research)
"eJI" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/box,
-/obj/machinery/portable_atmospherics/canister,
-/turf/open/floor/iron,
+/obj/structure/chair/sofa/corp/right,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"eJM" = (
/obj/machinery/camera/directional/east{
@@ -12756,6 +12788,10 @@
name = "Containment Pen #6";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen2";
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"eOQ" = (
@@ -12953,19 +12989,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/break_room)
-"eSC" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/table,
-/obj/machinery/button/door{
- id = "xenobio7";
- layer = 3.3;
- name = "Xenobio Pen 7 Blast Doors";
- pixel_y = 4;
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"eSR" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -12982,6 +13005,10 @@
/obj/machinery/light/no_nightlight/directional/south,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
+"eTk" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"eTn" = (
/obj/structure/chair{
dir = 4
@@ -13384,14 +13411,6 @@
/obj/effect/spawner/random/decoration/showcase,
/turf/open/floor/carpet,
/area/station/command/corporate_showroom)
-"faD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"fbf" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -13479,7 +13498,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/iron/white,
+/obj/machinery/light/directional/west,
+/obj/machinery/duct,
+/obj/machinery/camera/directional/west,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"fee" = (
/obj/structure/lattice/catwalk,
@@ -14011,6 +14033,15 @@
},
/turf/open/floor/iron,
/area/station/engineering/main)
+"flp" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "XenoPens";
+ name = "Xenobiology Lockdown"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"flu" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -14114,6 +14145,13 @@
},
/turf/open/floor/iron/white,
/area/station/science/ordnance/storage)
+"fmR" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "3"
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"fmS" = (
/obj/structure/sign/directions/security{
dir = 1;
@@ -14165,12 +14203,6 @@
},
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/storage)
-"foV" = (
-/obj/structure/sign/warning/vacuum/external/directional/east,
-/obj/effect/decal/cleanable/cobweb/cobweb2,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"fpj" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -14268,12 +14300,10 @@
/area/station/science/xenobiology/hallway)
"frt" = (
/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/effect/turf_decal/bot,
/obj/machinery/light/small/directional/south,
+/obj/machinery/chem_master,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"fru" = (
@@ -14368,16 +14398,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
-"fuF" = (
-/obj/machinery/door/airlock/engineering{
- name = "Port Quarter Solar Access"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/obj/effect/landmark/navigate_destination/common/portquartersolar,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"fvE" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/medical/central)
@@ -14959,17 +14979,11 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/command/teleporter)
-"fHe" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
+"fHs" = (
+/obj/machinery/light/floor/has_bulb,
+/obj/structure/chair/sofa/corp,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"fHC" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 6
@@ -15039,6 +15053,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hop)
+"fJq" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"fJs" = (
/obj/structure/chair/stool/directional/west,
/obj/effect/mapping_helpers/broken_floor,
@@ -15225,14 +15246,6 @@
/obj/effect/turf_decal/tile/purple/opposingcorners,
/turf/open/floor/iron/white,
/area/station/science/circuits)
-"fMF" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"fMN" = (
/obj/machinery/firealarm/directional/west,
/obj/structure/disposalpipe/segment{
@@ -15395,16 +15408,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
-"fPB" = (
-/obj/machinery/door/airlock/engineering{
- name = "Starboard Quarter Solar Access"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/obj/effect/landmark/navigate_destination/common/starboardquartersolar,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"fPD" = (
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
@@ -15534,6 +15537,13 @@
/obj/effect/spawner/random/structure/grille,
/turf/open/floor/plating,
/area/station/maintenance/fore)
+"fRZ" = (
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/machinery/light_switch/directional/south,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"fSd" = (
/obj/structure/chair/stool/directional/west,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -15609,15 +15619,6 @@
/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/station/command/bridge)
-"fUq" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"fUr" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -15631,9 +15632,15 @@
},
/obj/effect/turf_decal/bot_white,
/obj/structure/cable,
-/obj/machinery/smartfridge/organ,
+/obj/machinery/computer/slime_market,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"fUH" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"fUM" = (
/obj/machinery/light/small/directional/south,
/obj/machinery/libraryscanner,
@@ -16010,6 +16017,15 @@
},
/turf/open/floor/iron/white,
/area/station/medical/storage)
+"gbm" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"gbq" = (
/obj/machinery/vending/wardrobe/chef_wardrobe,
/obj/effect/turf_decal/trimline/brown/warning{
@@ -16201,12 +16217,6 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics/garden)
-"gfc" = (
-/obj/structure/sign/warning/vacuum/external/directional/east,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"gfh" = (
/obj/structure/sign/poster/random/directional/east,
/obj/effect/mapping_helpers/airlock/access/any/science/maintenance,
@@ -16258,6 +16268,20 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
+"gga" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/airlock/hatch{
+ name = "Xenobiology Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"ggi" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -16377,14 +16401,6 @@
},
/turf/open/floor/engine,
/area/station/science/ordnance/burnchamber)
-"git" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"giz" = (
/obj/machinery/conveyor/inverted{
dir = 10;
@@ -16451,6 +16467,10 @@
name = "Containment Pen #5";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen3";
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"gjF" = (
@@ -16633,6 +16653,12 @@
/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/dark,
/area/station/security/lockers)
+"gmB" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"gmG" = (
/obj/structure/table,
/obj/item/plate,
@@ -16714,6 +16740,14 @@
},
/turf/open/floor/iron,
/area/station/security/execution/transfer)
+"gnL" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"gnS" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -16947,6 +16981,15 @@
},
/turf/open/floor/plating/airless,
/area/station/science/ordnance/bomb)
+"grI" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/fore)
"grZ" = (
/obj/structure/chair,
/obj/machinery/camera/directional/north{
@@ -17127,8 +17170,14 @@
/turf/closed/wall,
/area/station/commons/storage/primary)
"gva" = (
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "XenoPens";
+ name = "Xenobiology Lockdown"
+ },
+/obj/machinery/duct,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"gvg" = (
/obj/structure/table/reinforced,
@@ -17288,6 +17337,7 @@
id = "xenobio8";
name = "Xenobio Pen 8 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"gyK" = (
@@ -17452,14 +17502,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
-"gCE" = (
-/obj/structure/cable,
-/obj/machinery/power/solar{
- id = "starboardquarter";
- name = "Starboard Quarter Solar Array"
- },
-/turf/open/floor/iron/solarpanel/airless,
-/area/station/solars/starboard/aft)
"gCS" = (
/obj/structure/window/reinforced/spawner/directional/south,
/obj/structure/showcase/cyborg/old{
@@ -17606,6 +17648,13 @@
},
/turf/open/space/basic,
/area/space)
+"gFd" = (
+/obj/machinery/power/terminal,
+/obj/machinery/light/small/directional/east,
+/obj/item/radio/intercom/directional/east,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"gFi" = (
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
@@ -17841,17 +17890,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"gKD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/camera/directional/west{
- c_tag = "Xenobiology Lab - Central East";
- network = list("ss13","rd","xeno")
- },
-/obj/machinery/firealarm/directional/west,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"gKK" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 1
@@ -18244,6 +18282,11 @@
/obj/item/reagent_containers/cup/watering_can,
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"gRY" = (
+/obj/machinery/light/floor/has_bulb,
+/obj/machinery/plumbing/ooze_compressor,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"gSn" = (
/obj/item/wrench,
/turf/open/floor/iron,
@@ -18277,7 +18320,6 @@
/turf/open/floor/circuit/telecomms/server,
/area/station/science/server)
"gSM" = (
-/obj/structure/window/reinforced/spawner/directional/south,
/obj/effect/turf_decal/delivery,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/line,
@@ -18286,6 +18328,7 @@
id = "XenoPens";
name = "Xenobiology Lockdown"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"gTh" = (
@@ -18362,12 +18405,14 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"gTS" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/obj/structure/reagent_dispensers/fueltank,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/machinery/shower/directional/north,
+/obj/item/radio/intercom/directional/south,
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"gTU" = (
/obj/effect/turf_decal/siding/purple/corner{
dir = 4
@@ -18534,6 +18579,12 @@
/obj/effect/spawner/structure/window/reinforced/plasma,
/turf/open/floor/plating,
/area/station/engineering/atmos)
+"gWH" = (
+/obj/effect/spawner/random/maintenance,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/lesser)
"gWL" = (
/obj/effect/turf_decal/siding/wood,
/turf/open/floor/wood,
@@ -18611,20 +18662,16 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating/airless,
/area/station/solars/port/aft)
-"gXs" = (
-/obj/machinery/power/solar_control{
- id = "forestarboard";
- name = "Starboard Bow Solar Control"
- },
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"gXu" = (
/turf/open/floor/plating,
/area/station/engineering/main)
"gXw" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/turf/open/floor/circuit/telecomms,
+/obj/machinery/light/floor/has_bulb,
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "5";
+ dir = 1
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"gXz" = (
/obj/machinery/duct,
@@ -19027,6 +19074,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
+"heo" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"hep" = (
/obj/effect/landmark/blobstart,
/obj/effect/mapping_helpers/burnt_floor,
@@ -19239,14 +19296,6 @@
},
/turf/open/floor/iron/kitchen_coldroom/freezerfloor,
/area/station/service/kitchen/coldroom)
-"hja" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/chem_master,
-/obj/effect/turf_decal/tile/purple/fourcorners,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"hjo" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
@@ -19542,11 +19591,6 @@
},
/turf/open/floor/plating,
/area/station/engineering/main)
-"hoc" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"hod" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -19609,6 +19653,12 @@
},
/turf/open/floor/iron/cafeteria,
/area/station/commons/dorms)
+"hoV" = (
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/firealarm/directional/west,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"hoY" = (
/obj/structure/chair/office{
dir = 4
@@ -19744,6 +19794,14 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/station/service/bar)
+"hsp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/fore)
"hsF" = (
/obj/machinery/door/airlock{
id_tag = "AuxToilet3";
@@ -20319,11 +20377,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/pharmacy)
-"hCw" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/cable,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"hCK" = (
/obj/effect/decal/cleanable/oil/slippery,
/obj/effect/turf_decal/siding/purple{
@@ -20815,6 +20868,7 @@
id = "xenobio1";
name = "Xenobio Pen 1 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"hMy" = (
@@ -21065,6 +21119,14 @@
},
/turf/open/floor/iron,
/area/station/service/hydroponics)
+"hRU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"hRW" = (
/obj/machinery/light/directional/east,
/obj/machinery/airalarm/directional/east,
@@ -21241,6 +21303,10 @@
name = "Containment Pen #8";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen1";
+ dir = 4
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"hVE" = (
@@ -21627,6 +21693,7 @@
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 4
},
+/obj/machinery/slime_extract_requestor,
/turf/open/floor/iron/white,
/area/station/science/lobby)
"ibz" = (
@@ -21714,17 +21781,10 @@
/turf/open/floor/plating,
/area/station/commons/fitness/recreation)
"idA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/cable,
-/obj/structure/sign/warning/electric_shock,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/engine,
/area/station/science/xenobiology)
-"idF" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/filingcabinet/chestdrawer,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"ied" = (
/obj/structure/table,
/obj/item/paper/fluff/holodeck/disclaimer,
@@ -21890,6 +21950,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"igH" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 1
+ },
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/box,
+/obj/machinery/camera/directional/south,
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"igP" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/siding/wood{
@@ -22273,6 +22343,10 @@
name = "Containment Pen #3";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen5";
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"imU" = (
@@ -22586,15 +22660,6 @@
/obj/machinery/light/directional/west,
/turf/open/floor/grass,
/area/station/security/prison/garden)
-"irp" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"irL" = (
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
@@ -22899,6 +22964,14 @@
/obj/structure/closet/crate,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"ivK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/fore)
"ivM" = (
/obj/effect/decal/cleanable/cobweb,
/obj/machinery/photocopier,
@@ -22957,8 +23030,10 @@
/area/station/science/robotics/lab)
"iwO" = (
/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"iwX" = (
/obj/structure/cable,
@@ -23044,6 +23119,9 @@
pixel_y = 4;
req_access = list("xenobiology")
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen3"
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"ixT" = (
@@ -23355,6 +23433,12 @@
/obj/structure/cable,
/turf/open/floor/iron/cafeteria,
/area/station/service/kitchen)
+"iCZ" = (
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"iDh" = (
/obj/machinery/computer/communications{
dir = 8
@@ -23716,6 +23800,17 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/hallway/secondary/command)
+"iJm" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/fore)
"iJt" = (
/obj/structure/extinguisher_cabinet/directional/east,
/obj/machinery/camera/directional/east{
@@ -23773,16 +23868,6 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating/airless,
/area/space/nearstation)
-"iJJ" = (
-/obj/machinery/door/airlock/engineering{
- name = "Starboard Bow Solar Access"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/obj/effect/landmark/navigate_destination/common/starboardbowsolar,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"iJK" = (
/obj/item/radio/intercom/directional/south,
/obj/effect/turf_decal/tile/neutral{
@@ -24017,13 +24102,6 @@
/mob/living/basic/lizard/wags_his_tail,
/turf/open/floor/plating,
/area/station/service/janitor)
-"iMR" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"iMS" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/stripes/line,
@@ -24149,8 +24227,8 @@
/turf/open/floor/carpet,
/area/station/security/detectives_office)
"iOZ" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"iPb" = (
@@ -24523,6 +24601,16 @@
/obj/effect/landmark/start/depsec/science,
/turf/open/floor/iron,
/area/station/security/checkpoint/science)
+"iTV" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/obj/machinery/camera/directional/north,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"iTX" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
@@ -24553,6 +24641,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai_upload_foyer)
+"iUk" = (
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"iUm" = (
/turf/closed/wall,
/area/station/hallway/secondary/exit/departure_lounge)
@@ -24617,12 +24711,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/station/commons/dorms)
-"iVn" = (
-/obj/structure/cable,
-/obj/machinery/light_switch/directional/north,
-/obj/machinery/power/apc/auto_name/directional/east,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"iVs" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
@@ -24667,10 +24755,6 @@
/obj/effect/landmark/start/hangover/closet,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
-"iWc" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"iWj" = (
/obj/effect/turf_decal/tile/red{
dir = 8
@@ -24885,6 +24969,15 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"jau" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"jay" = (
/obj/structure/chair{
dir = 4
@@ -24931,18 +25024,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/science/research)
-"jbk" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/camera{
- c_tag = "Xenobiology Lab - Central South";
- dir = 9;
- network = list("ss13","rd","xeno")
- },
-/obj/machinery/status_display/ai/directional/north,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"jbq" = (
/turf/closed/wall/r_wall,
/area/station/hallway/primary/aft)
@@ -25022,6 +25103,13 @@
/obj/structure/window/fulltile,
/turf/open/floor/grass,
/area/station/hallway/secondary/exit/departure_lounge)
+"jdj" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"jdn" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/structure/disposalpipe/segment{
@@ -25177,6 +25265,13 @@
"jfG" = (
/turf/closed/wall,
/area/station/maintenance/disposal)
+"jfJ" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"jfN" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -25339,6 +25434,15 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
+"jhX" = (
+/obj/machinery/corral_corner{
+ mapping_id = "5"
+ },
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"jhY" = (
/obj/machinery/firealarm/directional/east,
/obj/structure/bed/dogbed,
@@ -25378,12 +25482,14 @@
/turf/open/floor/iron/dark,
/area/station/command/bridge)
"jjj" = (
-/obj/structure/chair/comfy/black{
- dir = 4
- },
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/vacuum_pack,
+/obj/item/vacuum_pack,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/structure/table/glass,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"jjm" = (
@@ -25615,6 +25721,11 @@
/obj/structure/bookcase,
/turf/open/floor/wood,
/area/station/command/bridge)
+"jnv" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"jnA" = (
/obj/machinery/newscaster/directional/west,
/obj/structure/easel,
@@ -26163,14 +26274,6 @@
},
/turf/open/floor/iron,
/area/station/science/research)
-"jvX" = (
-/obj/effect/turf_decal/bot,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/shower/directional/north,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"jwg" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 8
@@ -26288,13 +26391,14 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/structure/cable,
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/structure/sign/xenobio_guide/directional/west,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"jxS" = (
/obj/effect/decal/cleanable/dirt,
@@ -26392,7 +26496,11 @@
"jzw" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"jzC" = (
/obj/machinery/door/window/right/directional/north{
@@ -26525,12 +26633,6 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/turf/open/floor/plating,
/area/station/maintenance/disposal)
-"jCO" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"jDb" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/blobstart,
@@ -26895,6 +26997,14 @@
},
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
+"jKa" = (
+/obj/effect/turf_decal/tile/purple/fourcorners,
+/obj/machinery/door/airlock/maintenance{
+ name = "Research Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/general,
+/turf/open/floor/iron/white,
+/area/station/science/lab)
"jKq" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Two";
@@ -27190,6 +27300,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"jOI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"jON" = (
/obj/effect/turf_decal/tile/purple,
/obj/structure/disposalpipe/segment{
@@ -27383,15 +27502,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/station/commons/lounge)
-"jSj" = (
-/obj/machinery/door/airlock/research{
- glass = 1;
- name = "Slime Euthanization Chamber";
- opacity = 0
- },
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"jSm" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/directional/south,
@@ -27526,12 +27636,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"jUK" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/fans/tiny,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"jUP" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -27672,6 +27776,11 @@
},
/turf/open/floor/wood,
/area/station/service/cafeteria)
+"jXe" = (
+/obj/structure/lattice,
+/obj/item/wirecutters,
+/turf/open/space/basic,
+/area/space/nearstation)
"jXq" = (
/obj/machinery/door/airlock/maintenance,
/obj/structure/cable,
@@ -27918,13 +28027,6 @@
},
/turf/open/floor/iron/dark,
/area/station/security/evidence)
-"kbn" = (
-/obj/structure/chair/stool/directional/north,
-/obj/machinery/camera/directional/west{
- c_tag = "Solar Maintenance - Fore Starboard"
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"kbo" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -28209,6 +28311,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/security/checkpoint/engineering)
+"khw" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "4"
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"khA" = (
/turf/closed/wall,
/area/station/commons/storage/art)
@@ -28365,6 +28474,17 @@
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
+"kkT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"kkU" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/camera/directional/west{
@@ -28471,6 +28591,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 6
},
+/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"klL" = (
@@ -28680,14 +28801,6 @@
/obj/structure/sign/warning/vacuum/external/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
-"kqj" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"kqm" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/blue/filled/warning{
@@ -28883,6 +28996,12 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
+"ktG" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"ktK" = (
/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{
dir = 10
@@ -29012,14 +29131,8 @@
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
"kvT" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/effect/turf_decal/trimline/purple/filled/line,
-/obj/effect/turf_decal/bot_white,
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/iron,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"kvV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -29127,12 +29240,16 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmos)
-"kyh" = (
-/obj/machinery/power/apc/auto_name/directional/east,
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
+"kxW" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/spawner/random/trash/garbage{
+ spawn_scatter_radius = 1
+ },
+/obj/structure/sign/poster/contraband/random/directional/east,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/lesser)
"kyl" = (
/obj/item/radio/intercom/directional/south,
/obj/machinery/light/directional/south,
@@ -29330,6 +29447,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/station/command/teleporter)
+"kCw" = (
+/obj/machinery/duct,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"kCC" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/disposalpipe/segment,
@@ -29546,14 +29667,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
-"kHt" = (
-/obj/machinery/camera{
- c_tag = "Xenobiology Lab - Pen #2";
- dir = 9;
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"kHM" = (
/obj/effect/turf_decal/siding/thinplating_new/dark,
/obj/effect/turf_decal/trimline/brown/line,
@@ -29653,6 +29766,14 @@
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/iron/white,
/area/station/security/prison)
+"kKG" = (
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"kKT" = (
/obj/item/reagent_containers/cup/bottle/multiver{
pixel_x = 7;
@@ -29851,6 +29972,16 @@
/obj/effect/turf_decal/trimline/yellow/filled/end,
/turf/open/floor/iron/textured,
/area/station/medical/medbay/central)
+"kNV" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Port Quarter Solar Access"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/obj/effect/landmark/navigate_destination/common/portquartersolar,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"kOf" = (
/obj/machinery/telecomms/broadcaster/preset_right,
/turf/open/floor/circuit/telecomms/mainframe,
@@ -29927,6 +30058,15 @@
"kOR" = (
/turf/closed/wall,
/area/station/hallway/primary/aft)
+"kOV" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"kOX" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -30842,6 +30982,11 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
+"lek" = (
+/obj/machinery/power/smes,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"lfc" = (
/obj/machinery/newscaster/directional/north,
/obj/effect/turf_decal/stripes/corner{
@@ -31002,15 +31147,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/science/robotics/lab)
-"lhX" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/lesser)
"lia" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -31293,6 +31429,14 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/command/nuke_storage)
+"lmK" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"lmL" = (
/obj/structure/cable,
/obj/effect/mapping_helpers/airlock/abandoned,
@@ -31730,6 +31874,13 @@
},
/turf/open/floor/iron/dark,
/area/station/security/lockers)
+"ltg" = (
+/obj/structure/chair/stool/directional/north,
+/obj/machinery/camera/directional/west{
+ c_tag = "Solar Maintenance - Fore Starboard"
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"ltm" = (
/obj/machinery/atmospherics/components/tank/oxygen{
dir = 4
@@ -31855,6 +32006,14 @@
},
/turf/open/floor/iron,
/area/station/security/range)
+"lvs" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/unres,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/lesser)
"lvu" = (
/obj/machinery/door/window/left/directional/west{
dir = 4;
@@ -32065,6 +32224,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
+"lzJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"lzL" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -32144,13 +32310,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/disposal)
-"lBt" = (
-/obj/structure/cable,
-/obj/machinery/light_switch/directional/south,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"lBv" = (
/obj/effect/spawner/random/structure/closet_maintenance,
/turf/open/floor/iron/dark,
@@ -32270,6 +32429,12 @@
},
/turf/open/floor/iron/dark,
/area/station/medical/break_room)
+"lFe" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"lFo" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -32311,11 +32476,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"lGN" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/starboard/fore)
"lGR" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -32409,6 +32569,18 @@
"lJa" = (
/turf/open/floor/grass,
/area/station/service/hydroponics/garden)
+"lJg" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/light/directional/west,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"lJh" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -32749,13 +32921,21 @@
/turf/open/floor/iron/dark,
/area/station/medical/medbay/central)
"lOY" = (
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder{
+ pixel_x = -1;
+ pixel_y = 8
},
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/box,
-/turf/open/floor/iron,
+/obj/machinery/button/door{
+ id = "XenoPens";
+ layer = 3.3;
+ name = "Xenobiology Lockdown";
+ pixel_y = 0;
+ req_access = list("xenobiology");
+ pixel_x = -24
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"lOZ" = (
/obj/machinery/power/port_gen/pacman/pre_loaded,
@@ -32960,15 +33140,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
-"lTi" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/camera/directional/south{
- c_tag = "Xenobiology Lab - Central North";
- network = list("ss13","rd","xeno")
- },
-/obj/machinery/status_display/ai/directional/south,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"lTj" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -33050,16 +33221,6 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/white/side,
/area/station/medical/treatment_center)
-"lTY" = (
-/obj/machinery/door/airlock/engineering{
- name = "Port Bow Solar Access"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/obj/effect/landmark/navigate_destination/common/portbowsolar,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"lTZ" = (
/obj/effect/decal/cleanable/dirt,
/obj/vehicle/sealed/mecha/working/ripley/cargo,
@@ -33126,16 +33287,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/commons/dorms)
-"lUM" = (
-/obj/structure/sign/warning/vacuum/external/directional/south,
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "aftport";
- name = "Port Quarter Solar Control"
- },
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"lUP" = (
/obj/machinery/button/crematorium{
id = "crematoriumChapel";
@@ -33417,6 +33568,16 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/service/bar)
+"lYY" = (
+/obj/machinery/duct,
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"lZk" = (
/obj/machinery/power/turbine/inlet_compressor{
dir = 4
@@ -33582,14 +33743,14 @@
/turf/open/floor/iron/vaporwave,
/area/station/service/library)
"mdo" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/door/airlock/hatch{
- name = "Xenobiology Maintenance"
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"mdp" = (
/obj/structure/sign/warning/yes_smoking,
/turf/closed/wall,
@@ -33641,6 +33802,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hos)
+"meQ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"mfh" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -34007,6 +34175,28 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"mmF" = (
+/obj/machinery/light/small/directional/east,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/stack/sheet/glass/fifty,
+/obj/structure/closet/crate/engineering/electrical,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"mmR" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -34261,6 +34451,15 @@
/obj/item/lighter,
/turf/open/floor/carpet,
/area/station/command/bridge)
+"mrJ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/station/hallway/primary/central)
"mrL" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/chair,
@@ -34291,11 +34490,6 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating,
/area/station/maintenance/department/science/xenobiology)
-"msR" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"msT" = (
/obj/structure/table,
/obj/item/food/mint,
@@ -34848,6 +35042,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/engineering/break_room)
+"mBj" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/white,
+/area/station/science/cytology)
"mBw" = (
/obj/machinery/power/emitter,
/obj/machinery/light/small/directional/south,
@@ -34906,14 +35104,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/command/nuke_storage)
-"mCj" = (
-/obj/machinery/camera{
- c_tag = "Xenobiology Lab - Pen #7";
- dir = 5;
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"mCn" = (
/obj/structure/rack,
/obj/effect/spawner/random/maintenance/two,
@@ -35258,6 +35448,16 @@
"mHT" = (
/turf/closed/wall,
/area/station/engineering/atmos)
+"mIg" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Port Bow Solar Access"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/obj/effect/landmark/navigate_destination/common/portbowsolar,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/fore)
"mIi" = (
/obj/machinery/navbeacon{
codes_txt = "patrol;next_patrol=9.2-Escape-2";
@@ -35345,6 +35545,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/command/bridge)
+"mJQ" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/duct,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"mJT" = (
/obj/effect/turf_decal/tile/purple/fourcorners,
/obj/structure/table/reinforced,
@@ -35498,10 +35703,10 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/light/directional/west,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mMl" = (
/obj/structure/cable,
@@ -35530,12 +35735,14 @@
/turf/open/floor/iron,
/area/station/commons/dorms)
"mMK" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mMM" = (
/obj/structure/table/reinforced,
@@ -35843,12 +36050,6 @@
},
/turf/closed/wall,
/area/station/science/lobby)
-"mSU" = (
-/obj/machinery/power/smes,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"mTg" = (
/obj/structure/cable,
/obj/machinery/door/airlock/hatch{
@@ -36005,13 +36206,6 @@
/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
/turf/open/floor/plating,
/area/station/engineering/atmos)
-"mVR" = (
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/directional/west,
-/obj/machinery/light_switch/directional/south,
-/obj/effect/mapping_helpers/burnt_floor,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"mVW" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -36452,7 +36646,6 @@
/turf/open/floor/iron,
/area/station/engineering/main)
"ncF" = (
-/obj/structure/window/reinforced/spawner/directional/north,
/obj/effect/turf_decal/delivery,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/line{
@@ -36862,6 +37055,9 @@
pixel_y = 4;
req_access = list("xenobiology")
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen5"
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"nkD" = (
@@ -36969,6 +37165,10 @@
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/dark,
/area/station/command/teleporter)
+"nmy" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"nmH" = (
/obj/effect/landmark/event_spawn,
/obj/structure/cable,
@@ -37188,6 +37388,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"nqk" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"nqo" = (
/obj/structure/cable,
/obj/structure/disposalpipe/segment{
@@ -37431,6 +37638,14 @@
},
/turf/open/floor/engine,
/area/station/science/explab)
+"ntM" = (
+/obj/machinery/power/solar_control{
+ id = "foreport";
+ name = "Port Bow Solar Control"
+ },
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"ntP" = (
/obj/machinery/door/airlock/security/glass{
name = "Brig Control"
@@ -37857,6 +38072,10 @@
/area/station/engineering/atmospherics_engine)
"nBa" = (
/obj/structure/cable,
+/obj/machinery/power/solar{
+ id = "aftport";
+ name = "Aft-Port Solar Array"
+ },
/turf/open/floor/iron/solarpanel/airless,
/area/station/solars/starboard/aft)
"nBf" = (
@@ -38035,6 +38254,13 @@
/obj/item/clothing/glasses/science,
/turf/open/floor/iron,
/area/station/science/xenobiology)
+"nEe" = (
+/obj/structure/cable,
+/obj/machinery/light_switch/directional/south,
+/obj/machinery/power/apc/auto_name/directional/west,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"nEf" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -38348,14 +38574,6 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
-"nLX" = (
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/spawner/random/trash/garbage{
- spawn_scatter_radius = 1
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/starboard/fore)
"nLZ" = (
/obj/item/toy/beach_ball/branded,
/turf/open/space/basic,
@@ -38496,6 +38714,13 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/central)
+"nOh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"nOi" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -38645,13 +38870,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
-"nQl" = (
-/obj/effect/landmark/generic_maintenance_landmark,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"nQw" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 1
@@ -38723,6 +38941,27 @@
/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"nRz" = (
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/stack/sheet/glass/fifty,
+/obj/structure/closet/crate/engineering/electrical,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"nRR" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/light/directional/east,
@@ -38749,14 +38988,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/aisat_interior)
-"nSC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/chem_heater/withbuffer,
-/obj/effect/turf_decal/tile/purple/fourcorners,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"nTd" = (
/obj/structure/rack,
/obj/effect/spawner/random/food_or_drink/seed,
@@ -38992,14 +39223,13 @@
/turf/open/space/basic,
/area/space/nearstation)
"nYL" = (
-/obj/machinery/door/airlock/hatch{
- name = "Xenobiology Maintenance"
- },
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"nYO" = (
/obj/item/reagent_containers/spray/plantbgone,
/obj/item/reagent_containers/spray/pestspray{
@@ -39174,6 +39404,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"obi" = (
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"obk" = (
/obj/item/target/alien,
/turf/open/floor/plating,
@@ -39364,6 +39603,11 @@
"oew" = (
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
+"oeO" = (
+/obj/effect/landmark/generic_maintenance_landmark,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"oeQ" = (
/obj/structure/table,
/obj/item/paper_bin/construction,
@@ -39486,6 +39730,15 @@
/obj/effect/turf_decal/tile/bar,
/turf/open/floor/iron,
/area/station/commons/lounge)
+"ogF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"ogJ" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -39559,6 +39812,7 @@
id = "xenobio6";
name = "Xenobio Pen 6 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"ohE" = (
@@ -40187,10 +40441,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/security/prison/work)
-"otR" = (
-/obj/machinery/light/small/directional/east,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"ouc" = (
/obj/structure/closet/crate,
/obj/structure/cable,
@@ -40513,6 +40763,16 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/dark,
/area/station/science/ordnance)
+"ozs" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Starboard Bow Solar Access"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/obj/effect/landmark/navigate_destination/common/starboardbowsolar,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/fore)
"ozB" = (
/obj/item/cigbutt,
/obj/structure/table/reinforced,
@@ -40839,6 +41099,12 @@
dir = 8
},
/area/station/engineering/atmos)
+"oFv" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"oFz" = (
/turf/closed/wall,
/area/station/science/explab)
@@ -41653,6 +41919,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/floor/has_bulb,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"oWb" = (
@@ -41733,6 +42000,23 @@
/obj/item/clothing/glasses/sunglasses,
/turf/open/floor/wood,
/area/station/service/lawoffice)
+"oXJ" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/structure/cable,
+/obj/structure/closet/crate/engineering/electrical,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/solar_assembly,
+/obj/item/stack/cable_coil,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"oXL" = (
/obj/machinery/disposal/bin,
/obj/structure/cable,
@@ -42166,8 +42450,8 @@
/area/station/science/robotics/lab)
"pfP" = (
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light_switch/directional/south,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"pfR" = (
/obj/machinery/portable_atmospherics/canister/air,
@@ -42204,15 +42488,13 @@
/obj/effect/spawner/random/entertainment/lighter,
/turf/open/floor/wood,
/area/station/commons/dorms)
-"pgM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
+"pgJ" = (
+/obj/structure/chair/stool/directional/north,
+/obj/machinery/camera/directional/west{
+ c_tag = "Solar Maintenance - Fore Port"
},
-/obj/structure/cable,
-/obj/structure/sink/directional/west,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"pgP" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/stasis,
@@ -42261,6 +42543,10 @@
pixel_x = 10;
pixel_y = -1
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen1";
+ dir = 2
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"phN" = (
@@ -42294,15 +42580,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
/turf/open/floor/iron/kitchen_coldroom/freezerfloor,
/area/station/service/kitchen/coldroom)
-"phT" = (
-/obj/structure/cable,
-/obj/machinery/power/solar_control{
- dir = 1;
- id = "starboardsolar";
- name = "Starboard Quarter Solar Control"
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"pic" = (
/obj/structure/table,
/obj/machinery/recharger,
@@ -42495,6 +42772,11 @@
"pma" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/solars/port/fore)
+"pms" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"pmZ" = (
/obj/machinery/light_switch/directional/west{
pixel_y = 26
@@ -42636,6 +42918,7 @@
/obj/effect/turf_decal/tile/purple/anticorner/contrasted{
dir = 8
},
+/obj/machinery/smartfridge/petri/preloaded,
/turf/open/floor/iron/white,
/area/station/science/cytology)
"ppD" = (
@@ -42746,13 +43029,6 @@
/obj/structure/closet/l3closet,
/turf/open/floor/iron/dark,
/area/station/medical/storage)
-"pro" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"prv" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -42804,12 +43080,6 @@
/obj/structure/cable,
/turf/open/floor/iron/white/side,
/area/station/science/lobby)
-"psc" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"psl" = (
/obj/machinery/meter,
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
@@ -42894,6 +43164,10 @@
name = "Containment Pen #1";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen7";
+ dir = 4
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"psV" = (
@@ -42920,11 +43194,6 @@
/obj/effect/turf_decal/tile/red/anticorner/contrasted,
/turf/open/floor/iron/dark,
/area/station/security/lockers)
-"ptn" = (
-/obj/machinery/power/smes,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"ptH" = (
/obj/effect/turf_decal/siding/purple{
dir = 4
@@ -43083,18 +43352,23 @@
},
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"pwy" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"pwM" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/commons/dorms)
"pwZ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/duct,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"pxj" = (
/obj/machinery/door/airlock/research/glass{
@@ -43400,20 +43674,6 @@
/obj/machinery/power/apc/auto_name/directional/east,
/turf/open/floor/iron/grimy,
/area/station/tcommsat/computer)
-"pDl" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- icon_state = "right";
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio7";
- name = "Xenobio Pen 7 Blast Door"
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"pDs" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -43780,10 +44040,10 @@
/turf/open/floor/iron/dark/textured_half,
/area/station/bitrunning/den)
"pJf" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"pJi" = (
/obj/machinery/firealarm/directional/south,
@@ -43811,12 +44071,12 @@
/turf/open/floor/iron/freezer,
/area/station/security/prison/shower)
"pJA" = (
-/obj/structure/closet/secure_closet/cytology,
/obj/structure/extinguisher_cabinet/directional/west,
/obj/machinery/light/directional/west,
/obj/effect/turf_decal/tile/purple/half/contrasted{
dir = 8
},
+/obj/machinery/smartfridge/organ,
/turf/open/floor/iron/white,
/area/station/science/cytology)
"pJE" = (
@@ -44070,13 +44330,6 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/testlab)
-"pOo" = (
-/obj/effect/spawner/random/maintenance,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/lesser)
"pOv" = (
/obj/effect/turf_decal/siding/purple{
dir = 1
@@ -44094,6 +44347,12 @@
},
/turf/open/floor/circuit/green/off,
/area/station/science/research)
+"pOF" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/aft)
"pOK" = (
/obj/structure/table/wood,
/obj/item/paper_bin{
@@ -44163,7 +44422,10 @@
dir = 10
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"pQu" = (
/obj/machinery/door/window/right/directional/east{
@@ -44425,6 +44687,11 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/grimy,
/area/station/security/interrogation)
+"pUX" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"pVi" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light_switch/directional/north,
@@ -44462,20 +44729,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/security/brig)
-"pVR" = (
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/table,
-/obj/item/storage/box/gloves{
- pixel_x = -4;
- pixel_y = 8
- },
-/obj/item/storage/box/masks{
- pixel_x = 4;
- pixel_y = 4
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"pVZ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 4
@@ -44567,17 +44820,6 @@
/obj/machinery/status_display/evac/directional/south,
/turf/open/floor/iron,
/area/station/service/hydroponics)
-"pXo" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
- dir = 8;
- initialize_directions = 4;
- name = "euthanization chamber freezer"
- },
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"pXA" = (
/obj/structure/chair/comfy/brown{
dir = 8
@@ -44613,6 +44855,10 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/turf/open/floor/iron/white,
/area/station/medical/surgery/theatre)
+"pYh" = (
+/obj/structure/cable,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"pYn" = (
/obj/structure/sign/plaques/kiddie/library{
pixel_y = -32
@@ -44646,13 +44892,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/science/lobby)
-"pZi" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 1;
- name = "killroom vent"
- },
-/turf/open/floor/circuit/telecomms,
-/area/station/science/xenobiology)
"pZn" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -44664,6 +44903,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/security/prison)
+"pZG" = (
+/obj/machinery/power/solar_control{
+ id = "forestarboard";
+ name = "Starboard Bow Solar Control"
+ },
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"pZI" = (
/obj/effect/landmark/navigate_destination/library,
/turf/open/floor/carpet,
@@ -44679,6 +44926,7 @@
dir = 8
},
/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/closet/secure_closet/cytology,
/turf/open/floor/holofloor/dark,
/area/station/science/cytology)
"qag" = (
@@ -44765,14 +45013,6 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
-"qbO" = (
-/obj/machinery/power/solar_control{
- id = "foreport";
- name = "Port Bow Solar Control"
- },
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"qbZ" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -44926,16 +45166,6 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
-"qfl" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/station/hallway/primary/central)
"qfp" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -45191,14 +45421,6 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
-"qiD" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"qjf" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -45329,12 +45551,6 @@
/obj/effect/landmark/start/hangover/closet,
/turf/open/floor/iron/dark,
/area/station/commons/fitness/recreation)
-"qll" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"qlG" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -45609,6 +45825,12 @@
/obj/effect/spawner/random/engineering/flashlight,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
+"qqq" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"qrg" = (
/obj/machinery/light_switch/directional/north,
/turf/open/floor/circuit/green{
@@ -45887,6 +46109,10 @@
name = "Containment Pen #4";
req_access = list("xenobiology")
},
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "pen4";
+ dir = 8
+ },
/turf/open/floor/engine,
/area/station/science/xenobiology)
"qvY" = (
@@ -45931,6 +46157,11 @@
/obj/structure/chair/stool/directional/west,
/turf/open/floor/iron,
/area/station/commons/dorms)
+"qwM" = (
+/obj/machinery/power/smes,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"qwR" = (
/obj/structure/sign/directions/evac{
pixel_y = 1
@@ -46145,6 +46376,16 @@
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space)
+"qAr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/door/airlock/hatch{
+ name = "Xenobiology Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/xenobiology)
"qAA" = (
/obj/machinery/newscaster/directional/east,
/obj/machinery/computer/security/mining{
@@ -46379,11 +46620,6 @@
/obj/effect/mapping_helpers/airlock/access/all/medical/general,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"qFc" = (
-/obj/machinery/power/smes,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"qFj" = (
/obj/structure/table,
/obj/effect/turf_decal/delivery,
@@ -46535,15 +46771,6 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/plating,
/area/station/maintenance/starboard/greater)
-"qIc" = (
-/obj/effect/turf_decal/tile/purple/fourcorners,
-/obj/machinery/door/airlock/maintenance{
- name = "Research Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/access/all/science/general,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/lab)
"qIl" = (
/turf/closed/wall,
/area/station/hallway/secondary/command)
@@ -46593,6 +46820,14 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/starboard/fore)
+"qID" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/duct,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"qIK" = (
/obj/effect/spawner/structure/window,
/obj/machinery/door/poddoor/preopen{
@@ -47565,6 +47800,17 @@
},
/turf/open/floor/iron,
/area/station/hallway/primary/port)
+"qZV" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"rab" = (
/obj/structure/cable,
/obj/structure/disposalpipe/sorting/mail/flip{
@@ -47799,6 +48045,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/security/lockers)
+"rff" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/fore)
"rft" = (
/turf/closed/wall/r_wall,
/area/station/security/prison/mess)
@@ -48233,6 +48486,12 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
+"roL" = (
+/obj/effect/landmark/event_spawn,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/lesser)
"rps" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 4
@@ -48354,6 +48613,7 @@
id = "xenobio4";
name = "Xenobio Pen 4 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"rrT" = (
@@ -48472,6 +48732,12 @@
dir = 1
},
/area/station/science/lobby)
+"rtO" = (
+/obj/structure/cable,
+/obj/machinery/light_switch/directional/north,
+/obj/machinery/power/apc/auto_name/directional/east,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"rtP" = (
/obj/structure/rack,
/obj/effect/turf_decal/bot,
@@ -48677,6 +48943,7 @@
id = "xenobio3";
name = "Xenobio Pen 3 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"rwE" = (
@@ -48877,11 +49144,6 @@
/obj/item/multitool,
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tech)
-"rzz" = (
-/obj/structure/sign/warning/cold_temp,
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"rzB" = (
/obj/structure/cable,
/obj/effect/decal/cleanable/dirt,
@@ -49512,18 +49774,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
-"rKg" = (
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -2;
- pixel_y = 6
- },
-/obj/item/pen{
- pixel_x = -2;
- pixel_y = 5
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"rKh" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -49677,11 +49927,11 @@
/turf/open/floor/iron/white,
/area/station/science/research)
"rMu" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/space_heater,
-/obj/effect/mapping_helpers/broken_floor,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"rMz" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/tile/green{
@@ -49718,6 +49968,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
/area/station/security/office)
+"rNf" = (
+/obj/structure/cable,
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"rNs" = (
/obj/machinery/light/small/directional/east,
/obj/effect/turf_decal/tile/blue{
@@ -49981,6 +50236,17 @@
},
/turf/open/floor/iron/dark,
/area/station/ai_monitored/security/armory)
+"rRB" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/fore)
"rRR" = (
/obj/structure/sign/warning/vacuum/external/directional/south,
/obj/machinery/light/small/directional/north,
@@ -50188,6 +50454,17 @@
},
/turf/open/floor/carpet,
/area/station/command/heads_quarters/captain/private)
+"rUT" = (
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/structure/chair/stool/directional/south,
+/obj/machinery/camera/directional/west{
+ c_tag = "Solar Maintenance - Aft Starboard"
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"rUU" = (
/obj/machinery/light/directional/north,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
@@ -50388,6 +50665,16 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
+"rYq" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
+"rYy" = (
+/obj/machinery/power/smes,
+/obj/structure/cable,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"rYA" = (
/obj/machinery/porta_turret/ai,
/obj/machinery/flasher/directional/north{
@@ -50923,6 +51210,14 @@
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/button/door{
+ id = "XenoPens";
+ layer = 3.3;
+ name = "Xenobiology Lockdown";
+ pixel_y = 0;
+ req_access = list("xenobiology");
+ pixel_x = 24
+ },
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"sgB" = (
@@ -50987,10 +51282,11 @@
/turf/open/floor/engine,
/area/station/science/xenobiology)
"sie" = (
-/obj/effect/turf_decal/stripes/corner,
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"siz" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -51244,7 +51540,7 @@
dir = 1
},
/obj/effect/turf_decal/bot_white,
-/obj/machinery/smartfridge/petri/preloaded,
+/obj/machinery/smartfridge/extract/preloaded,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"soa" = (
@@ -51288,13 +51584,6 @@
},
/turf/open/floor/iron,
/area/station/commons/locker)
-"spk" = (
-/obj/structure/chair/stool/directional/north,
-/obj/machinery/camera/directional/west{
- c_tag = "Solar Maintenance - Fore Port"
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"spH" = (
/obj/item/radio/intercom/directional/south,
/obj/effect/turf_decal/tile/neutral{
@@ -51498,6 +51787,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark/telecomms,
/area/station/tcommsat/server)
+"ssE" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"ssI" = (
/obj/machinery/power/emitter,
/turf/open/floor/plating,
@@ -51948,6 +52244,11 @@
/obj/item/pillow/random,
/turf/open/floor/wood,
/area/station/commons/dorms)
+"sBd" = (
+/obj/structure/lattice,
+/obj/item/stack/cable_coil,
+/turf/open/space/basic,
+/area/space/nearstation)
"sBL" = (
/obj/structure/chair/stool/directional/west,
/obj/effect/mapping_helpers/broken_floor,
@@ -52027,6 +52328,7 @@
id = "xenobio5";
name = "Xenobio Pen 5 Blast Door"
},
+/obj/machinery/duct,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"sCz" = (
@@ -52832,13 +53134,6 @@
/obj/structure/disposalpipe/trunk,
/turf/open/floor/wood,
/area/station/cargo/quartermaster)
-"sRI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"sRJ" = (
/obj/structure/extinguisher_cabinet/directional/east,
/obj/item/kirbyplants{
@@ -53763,15 +54058,6 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/station/science/robotics/lab)
-"tgm" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tgo" = (
/obj/effect/turf_decal/tile/neutral{
dir = 4
@@ -53850,17 +54136,11 @@
/area/station/cargo/storage)
"thT" = (
/obj/structure/cable,
-/obj/machinery/camera/directional/east{
- c_tag = "Xenobiology Lab - Central West";
- network = list("ss13","rd","xeno")
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
/obj/structure/disposalpipe/segment,
-/obj/machinery/button/door/directional/east{
- id = "XenoPens";
- name = "Xenobiology Shutters";
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"thY" = (
/obj/effect/spawner/random/structure/grille,
@@ -54339,14 +54619,6 @@
/obj/effect/spawner/random/clothing/costume,
/turf/open/floor/plating,
/area/station/maintenance/port)
-"tqw" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/window/reinforced/spawner/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tqx" = (
/obj/machinery/door/window/left/directional/south{
dir = 1;
@@ -54423,19 +54695,6 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/atmospherics_engine)
-"trL" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/table,
-/obj/machinery/button/door{
- id = "xenobio2";
- layer = 3.3;
- name = "Xenobio Pen 2 Blast Doors";
- pixel_y = 1;
- req_access = list("xenobiology")
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"trM" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -55110,12 +55369,9 @@
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"tGS" = (
-/obj/structure/cable,
-/obj/machinery/door/window/left/directional/north{
- dir = 2;
- name = "Containment Pen #2";
- req_access = list("xenobiology")
- },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/duct,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"tGX" = (
@@ -55175,10 +55431,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/research)
-"tIe" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tIk" = (
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty,
@@ -55497,13 +55749,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/station/engineering/atmos/storage/gas)
-"tMI" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tMJ" = (
/obj/structure/toilet/greyscale{
dir = 4
@@ -55693,6 +55938,15 @@
/obj/effect/mapping_helpers/airlock/access/all/medical/virology,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
+"tQJ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable,
+/obj/machinery/door/poddoor/preopen{
+ id = "Xenolab";
+ name = "Test Chamber Blast Door"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"tRb" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/cable,
@@ -56100,15 +56354,6 @@
},
/turf/open/floor/plating,
/area/station/command/heads_quarters/rd)
-"tYR" = (
-/obj/machinery/light/small/directional/south,
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/structure/cable,
-/obj/structure/chair/stool/directional/west,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"tYS" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Two";
@@ -56932,6 +57177,10 @@
/obj/effect/turf_decal/tile/blue,
/turf/open/floor/iron/dark,
/area/station/engineering/transit_tube)
+"unx" = (
+/obj/structure/cable,
+/turf/closed/wall/r_wall,
+/area/station/maintenance/department/science/xenobiology)
"unL" = (
/turf/closed/wall,
/area/station/maintenance/starboard/greater)
@@ -57586,12 +57835,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/security/brig)
-"uyg" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/lab)
"uyi" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -57685,6 +57928,14 @@
},
/turf/open/floor/iron,
/area/station/cargo/storage)
+"uAC" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/port/aft)
"uAE" = (
/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -57709,6 +57960,12 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port)
+"uAV" = (
+/obj/machinery/corral_corner{
+ mapping_id = "5"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"uBg" = (
/obj/structure/window/spawner/directional/south,
/obj/machinery/computer/atmos_control/carbon_tank{
@@ -57956,15 +58213,6 @@
/obj/effect/turf_decal/tile/red/half/contrasted,
/turf/open/floor/iron,
/area/station/security/checkpoint/customs)
-"uFn" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/mapping_helpers/airlock/unres,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
-/obj/structure/cable,
-/turf/open/floor/plating,
-/area/station/maintenance/starboard/lesser)
"uFq" = (
/obj/machinery/door/window/left/directional/south{
dir = 8;
@@ -58200,6 +58448,15 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/station/engineering/atmospherics_engine)
+"uIi" = (
+/obj/structure/cable,
+/obj/machinery/power/solar_control{
+ dir = 1;
+ id = "starboardsolar";
+ name = "Starboard Quarter Solar Control"
+ },
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/starboard/aft)
"uIs" = (
/turf/closed/wall,
/area/station/service/kitchen)
@@ -58278,11 +58535,6 @@
/obj/structure/chair/stool/directional/east,
/turf/open/floor/iron,
/area/station/commons/locker)
-"uJL" = (
-/obj/machinery/power/smes,
-/obj/structure/cable,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"uKa" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
dir = 6
@@ -58340,21 +58592,6 @@
/obj/machinery/power/apc/auto_name/directional/south,
/turf/open/floor/iron/white,
/area/station/security/medical)
-"uKW" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- base_state = "right";
- dir = 2;
- icon_state = "right";
- name = "Containment Pen #2";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
- name = "Xenobio Pen 2 Blast Door"
- },
-/turf/open/floor/iron,
-/area/station/science/xenobiology)
"uLa" = (
/obj/effect/spawner/random/structure/table_or_rack,
/obj/effect/spawner/random/maintenance/two,
@@ -58475,19 +58712,10 @@
/area/station/medical/psychology)
"uNs" = (
/obj/effect/turf_decal/delivery,
-/obj/machinery/door/firedoor,
-/obj/structure/cable,
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/door/poddoor/shutters/preopen{
- dir = 8;
- id = "XenoPens";
- name = "Xenobiology Lockdown"
- },
-/turf/open/floor/iron,
+/turf/closed/wall/r_wall,
/area/station/science/xenobiology)
"uND" = (
/obj/effect/decal/cleanable/dirt,
@@ -58596,15 +58824,6 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
-"uQu" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/structure/sign/xenobio_guide/directional/north,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"uQF" = (
/obj/structure/lattice,
/obj/item/stack/rods,
@@ -58634,6 +58853,15 @@
},
/turf/open/floor/iron/dark,
/area/station/security/evidence)
+"uRa" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/fore)
"uRh" = (
/obj/structure/window/spawner/directional/south,
/obj/machinery/airalarm/directional/east,
@@ -58837,6 +59065,11 @@
},
/turf/open/floor/iron/dark/textured,
/area/station/engineering/atmos)
+"uVk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"uVm" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -59021,11 +59254,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port)
"uYP" = (
-/obj/structure/cable,
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
+/obj/machinery/duct,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"uYT" = (
@@ -59196,6 +59425,11 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/science/ordnance/storage)
+"vdE" = (
+/obj/structure/lattice,
+/obj/item/stack/rods,
+/turf/open/space/basic,
+/area/space)
"vdJ" = (
/obj/structure/closet/crate/freezer,
/obj/item/reagent_containers/blood/random,
@@ -59726,6 +59960,17 @@
},
/turf/open/floor/iron,
/area/station/science/robotics/lab)
+"vlZ" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance"
+ },
+/obj/structure/cable,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/aft)
"vmm" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table,
@@ -60186,6 +60431,14 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/station/service/lawoffice)
+"vul" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"vun" = (
/turf/closed/wall,
/area/station/medical/storage)
@@ -60227,13 +60480,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden,
/turf/open/floor/iron,
/area/station/hallway/primary/starboard)
-"vvD" = (
-/obj/machinery/camera/directional/east{
- c_tag = "Xenobiology Lab - Euthanasia Chamber";
- network = list("ss13","rd","xeno")
- },
-/turf/open/floor/circuit/telecomms,
-/area/station/science/xenobiology)
"vvH" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/engineering/glass{
@@ -60275,7 +60521,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port)
"vxa" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"vxi" = (
@@ -60429,13 +60675,13 @@
/turf/open/floor/iron,
/area/station/commons/dorms)
"vAa" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/cable,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"vAc" = (
/obj/structure/sign/poster/official/cleanliness{
@@ -60618,18 +60864,6 @@
/obj/item/storage/backpack/duffelbag/med/surgery,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
-"vDV" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/structure/table/glass,
-/obj/machinery/reagentgrinder{
- pixel_x = -1;
- pixel_y = 8
- },
-/obj/effect/turf_decal/tile/purple/fourcorners,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"vEd" = (
/obj/effect/decal/cleanable/blood/old,
/obj/machinery/processor{
@@ -60933,15 +61167,6 @@
/obj/machinery/duct,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"vJl" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"vJt" = (
/obj/structure/cable,
/obj/machinery/firealarm/directional/west,
@@ -61558,7 +61783,10 @@
/area/station/hallway/primary/central)
"vVx" = (
/obj/structure/cable,
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/corner,
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"vVy" = (
/obj/structure/disposalpipe/segment,
@@ -61730,14 +61958,16 @@
/area/station/medical/treatment_center)
"vXi" = (
/obj/structure/window/reinforced/spawner/directional/east,
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 8
- },
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/effect/turf_decal/bot,
/obj/machinery/light/small/directional/north,
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder{
+ pixel_x = -1;
+ pixel_y = 8
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"vXt" = (
@@ -61780,6 +62010,14 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"vYc" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"vYg" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
@@ -61917,6 +62155,13 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/starboard/greater)
+"was" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"waB" = (
/obj/machinery/door/airlock/external/glass{
name = "Supply Door Airlock"
@@ -62120,6 +62365,10 @@
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
+"weG" = (
+/obj/structure/chair/sofa/corp/left,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"weJ" = (
/obj/machinery/door/airlock{
name = "Central Emergency Storage"
@@ -62421,6 +62670,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/ai_monitored/command/storage/eva)
+"wjT" = (
+/obj/machinery/power/smes,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/aft)
"wjV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -62560,6 +62815,16 @@
/obj/structure/window/reinforced/spawner/directional/east,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
+"wmJ" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"wmL" = (
/turf/closed/wall/r_wall,
/area/station/science/xenobiology/hallway)
@@ -63042,9 +63307,6 @@
/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
-"wwc" = (
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/aft)
"wwj" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -63381,13 +63643,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/aisat/exterior)
-"wCH" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/light/directional/west,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"wCL" = (
/obj/structure/chair/stool/directional/south,
/obj/effect/turf_decal/siding/wood{
@@ -63448,6 +63703,16 @@
/obj/structure/cable,
/turf/open/floor/iron/grimy,
/area/station/service/chapel/office)
+"wEu" = (
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"wEz" = (
/obj/item/stack/sheet/cardboard,
/obj/effect/spawner/random/trash/janitor_supplies,
@@ -63745,6 +64010,9 @@
pixel_y = 1;
req_access = list("xenobiology")
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen7"
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"wKX" = (
@@ -64082,14 +64350,6 @@
/obj/structure/sign/poster/contraband/random/directional/west,
/turf/open/floor/plating,
/area/station/maintenance/starboard/lesser)
-"wPY" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"wPZ" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{
dir = 1
@@ -64226,17 +64486,6 @@
},
/turf/open/floor/iron/white,
/area/station/medical/surgery/theatre)
-"wSc" = (
-/obj/structure/cable,
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"wSe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -64890,6 +65139,17 @@
/obj/effect/mapping_helpers/airlock/access/any/supply/mining,
/turf/open/floor/iron,
/area/station/cargo/miningoffice)
+"xea" = (
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/effect/turf_decal/bot_white,
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/light_switch/directional/south,
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"xej" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -64904,11 +65164,14 @@
/turf/open/floor/plating,
/area/station/maintenance/central)
"xen" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/xenobiology)
+/obj/structure/cable,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"xew" = (
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -65002,10 +65265,6 @@
},
/turf/open/floor/plating,
/area/station/maintenance/port/greater)
-"xfK" = (
-/obj/machinery/drone_dispenser/preloaded,
-/turf/open/floor/plating,
-/area/station/maintenance/department/science/central)
"xga" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -65176,6 +65435,14 @@
/obj/effect/turf_decal/tile/yellow/half/contrasted,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
+"xiC" = (
+/obj/machinery/light/floor/has_bulb,
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "6";
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"xiL" = (
/turf/closed/wall/r_wall,
/area/station/maintenance/department/science/xenobiology)
@@ -65888,14 +66155,6 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/plating,
/area/station/cargo/storage)
-"xvy" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/structure/cable,
-/obj/structure/fans/tiny,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"xvI" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -66191,6 +66450,16 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron,
/area/station/construction/storage_wing)
+"xBw" = (
+/obj/machinery/door/airlock/engineering{
+ name = "Starboard Quarter Solar Access"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
+/obj/effect/landmark/navigate_destination/common/starboardquartersolar,
+/turf/open/floor/plating,
+/area/station/maintenance/solars/starboard/aft)
"xBx" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -66620,6 +66889,14 @@
/obj/effect/landmark/start/cargo_technician,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
+"xJa" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/plating,
+/area/station/maintenance/starboard/lesser)
"xJi" = (
/obj/machinery/flasher/portable,
/obj/effect/turf_decal/tile/blue/half/contrasted{
@@ -66728,15 +67005,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/primary/central)
-"xMr" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/fore)
"xMx" = (
/obj/structure/chair/office,
/turf/open/floor/iron,
@@ -66786,6 +67054,14 @@
/obj/structure/cable,
/turf/open/floor/grass,
/area/station/medical/pathology)
+"xNm" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/duct,
+/obj/structure/sign/xenobio_guide/directional/east,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"xNo" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -67058,22 +67334,11 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos,
/turf/open/floor/plating,
/area/station/engineering/atmos)
-"xRk" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"xRB" = (
/obj/structure/window/reinforced/spawner/directional/east,
/obj/effect/spawner/random/trash/mess,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"xRH" = (
-/obj/structure/lattice/catwalk,
-/obj/structure/cable,
-/turf/open/space/basic,
-/area/station/solars/starboard/aft)
"xRZ" = (
/turf/open/floor/iron,
/area/station/engineering/atmos/pumproom)
@@ -67154,17 +67419,6 @@
},
/turf/closed/wall/r_wall,
/area/station/hallway/primary/fore)
-"xUC" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/structure/cable,
-/obj/effect/mapping_helpers/airlock/access/all/engineering/general,
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/starboard/fore)
"xUE" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -67228,8 +67482,28 @@
dir = 1
},
/area/station/engineering/atmos/pumproom)
+"xVr" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/obj/machinery/camera{
+ c_tag = "Xenobiology Lab - Pen #7";
+ dir = 5;
+ network = list("ss13","rd","xeno")
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"xVu" = (
-/turf/closed/wall,
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"xVA" = (
/obj/machinery/atmospherics/components/binary/pump{
@@ -67301,6 +67575,10 @@
/obj/effect/mapping_helpers/broken_floor,
/turf/open/floor/plating,
/area/station/maintenance/aft/greater)
+"xWJ" = (
+/obj/machinery/drone_dispenser,
+/turf/open/floor/plating,
+/area/station/maintenance/department/science/central)
"xWQ" = (
/obj/machinery/status_display/door_timer{
id = "Cell 2";
@@ -67459,6 +67737,12 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"xZy" = (
+/obj/structure/sign/warning/vacuum/external/directional/east,
+/obj/structure/cable,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/catwalk_floor/iron_dark,
+/area/station/maintenance/solars/port/fore)
"xZB" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
@@ -67490,7 +67774,12 @@
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/effect/turf_decal/bot_white,
/obj/structure/cable,
-/obj/machinery/monkey_recycler,
+/obj/machinery/biomass_recycler,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
/turf/open/floor/iron,
/area/station/science/xenobiology)
"yaj" = (
@@ -67659,13 +67948,6 @@
},
/turf/open/floor/iron/dark,
/area/station/engineering/storage/tcomms)
-"ycA" = (
-/obj/effect/mapping_helpers/broken_floor,
-/obj/machinery/camera/directional/north{
- c_tag = "Solar Maintenance - Aft Port"
- },
-/turf/open/floor/catwalk_floor/iron_dark,
-/area/station/maintenance/solars/port/aft)
"ycM" = (
/turf/closed/wall/r_wall,
/area/station/security/warden)
@@ -67775,6 +68057,18 @@
/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics,
/turf/open/floor/plating,
/area/station/service/hydroponics)
+"yeL" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "XenoPens";
+ name = "Xenobiology Lockdown"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/iron/white,
+/area/station/science/xenobiology)
"yeS" = (
/obj/item/retractor,
/obj/item/hemostat{
@@ -67879,6 +68173,9 @@
req_access = list("xenobiology");
sync_doors = 4
},
+/obj/machinery/slime_pen_controller{
+ mapping_id = "pen4"
+ },
/turf/open/floor/iron,
/area/station/science/xenobiology)
"ygR" = (
@@ -67940,6 +68237,14 @@
/obj/structure/marker_beacon/purple,
/turf/open/space/basic,
/area/space/nearstation)
+"yig" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/box,
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/camera/directional/north,
+/turf/open/floor/iron,
+/area/station/science/xenobiology)
"yih" = (
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/shower/directional/west,
@@ -78221,11 +78526,11 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rrt
+rrt
+rrt
+rrt
+rrt
aaa
aaa
aaa
@@ -78479,9 +78784,9 @@ aaa
aaa
aaa
rrt
-rrt
-rrt
-rrt
+aaa
+aaa
+aaa
rrt
aaa
aaa
@@ -78726,27 +79031,27 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
rrt
-aaa
-aaa
-aaa
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
rrt
aaa
+kuK
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+rrt
+aUn
+aUn
+aUn
+aUn
+aUn
+aUn
+aUn
aaa
aaa
aaa
@@ -78984,28 +79289,28 @@ aaa
aaa
aaa
rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
aaa
-kuK
+lMJ
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+dPw
+aaa
+aIw
+aaa
+lMJ
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
aaa
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
-rrt
aaa
aaa
aaa
@@ -79240,35 +79545,35 @@ aaa
aaa
aaa
aaa
+rrt
aaa
+lMJ
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+xuK
+xuK
+xuK
+aYN
lMJ
-aaa
aIw
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+lMJ
+aYN
+xuK
+xuK
+xuK
+lMJ
+lMJ
+lMJ
+lMJ
+lMJ
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
blx
aaa
blx
@@ -79503,17 +79808,17 @@ lMJ
aaa
aaa
aaa
-xuK
-xuK
-xuK
+eqf
+eqf
+eqf
aYN
-lMJ
-aIw
-lMJ
+aaa
+raz
+aaa
+aYN
+aYN
+eqf
aYN
-xuK
-xuK
-xuK
aaa
aaa
aaa
@@ -79760,29 +80065,29 @@ lMJ
lMJ
lMJ
lMJ
-eqf
+xuK
+xuK
+xuK
aYN
eqf
-aYN
-aaa
raz
-aaa
-aYN
-aYN
eqf
aYN
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+xuK
+xuK
+xuK
+dJN
+lMJ
+rNf
+rNf
+lMJ
+lMJ
+jXe
+lMJ
+lMJ
+dJN
+dJN
+dJN
dJN
aaa
lMJ
@@ -80017,17 +80322,17 @@ lMJ
aaa
aaa
aaa
-xuK
-xuK
-xuK
eqf
eqf
+eqf
+bOr
+aaa
raz
+aaa
+aYN
+aYN
eqf
aYN
-xuK
-xuK
-xuK
aaa
aaa
aaa
@@ -80274,17 +80579,17 @@ lMJ
aaa
aaa
aaa
-eqf
-aYN
-aYN
-bOr
-aaa
-raz
-aaa
-aYN
+xuK
+xuK
+xuK
aYN
-eqf
+lMJ
+fzl
+vdE
aYN
+xuK
+xuK
+xuK
aaa
aaa
aaa
@@ -80531,17 +80836,17 @@ lMJ
aaa
aaa
aaa
-xuK
-xuK
-xuK
-aYN
+aaa
+aaa
+aaa
lMJ
-fzl
-uQF
-aYN
-xuK
-xuK
-xuK
+aaa
+aIw
+aaa
+sBd
+aaa
+aaa
+aaa
aaa
aaa
aaa
@@ -82337,7 +82642,7 @@ lMJ
aaa
fzl
aaa
-lMJ
+uQF
aaa
aaa
aaa
@@ -82594,7 +82899,7 @@ aYN
aaa
riK
aaa
-aYN
+bOr
xuK
xuK
xuK
@@ -82844,8 +83149,8 @@ aaa
aaa
aaa
aaa
-aYN
-aYN
+eqf
+eqf
eqf
aYN
aaa
@@ -83358,8 +83663,8 @@ aaa
aaa
aaa
aaa
-aYN
-aYN
+eqf
+eqf
eqf
aYN
aaa
@@ -83620,7 +83925,7 @@ xuK
xuK
aYN
aaa
-aIw
+raz
aaa
aYN
xuK
@@ -84136,7 +84441,7 @@ aYN
aaa
riK
aaa
-aYN
+bOr
xuK
xuK
xuK
@@ -84386,8 +84691,8 @@ lMJ
aaa
aaa
aaa
-aYN
-aYN
+eqf
+eqf
eqf
aYN
aaa
@@ -84901,7 +85206,7 @@ aaa
aaa
aaa
eqf
-aYN
+eqf
eqf
aYN
aaa
@@ -85535,7 +85840,7 @@ aaa
aaa
aaa
sGL
-fHe
+qZV
sGL
aaa
aaa
@@ -85792,7 +86097,7 @@ aaa
aaa
aaa
sGL
-eIc
+uAC
sGL
aaa
aaa
@@ -86049,7 +86354,7 @@ tSw
tSw
gAf
sGL
-wSc
+ctN
sGL
sGL
lMJ
@@ -86305,9 +86610,9 @@ qEf
gXF
gmS
bhS
-ycA
-pro
-lUM
+cxi
+jfJ
+dvT
ecz
aaa
aaa
@@ -86561,10 +86866,10 @@ drm
drm
tSw
mnN
-fuF
-wPY
-nQl
-tYR
+kNV
+gnL
+dQb
+dWA
ecz
aaa
aaa
@@ -86712,9 +87017,9 @@ aaa
tOm
tOm
tOm
-qbO
-spk
-mVR
+ntM
+pgJ
+fRZ
hZQ
ybi
twr
@@ -86819,9 +87124,9 @@ tSw
tSw
vUM
bhS
-iVn
-dqw
-mSU
+rtO
+cnF
+wjT
ecz
aaa
aaa
@@ -86966,13 +87271,13 @@ aaa
raz
raz
raz
-xMr
-xvy
-eha
-bbL
-hoc
-qll
-lTY
+grI
+hsp
+iJm
+lzJ
+oeO
+ktG
+mIg
qMD
vMd
fUr
@@ -87226,9 +87531,9 @@ aaa
tOm
tOm
tOm
-gfc
-ewF
-uJL
+xZy
+btB
+qwM
srk
qGP
sHu
@@ -96312,7 +96617,7 @@ lPx
wOS
orv
dPY
-xfK
+xWJ
kQe
cId
rQl
@@ -99379,7 +99684,7 @@ rHE
dbd
aBJ
jXK
-aJE
+sQB
gLU
uDO
oOB
@@ -99636,7 +99941,7 @@ wXF
wXF
wXF
dlG
-uyg
+ipM
rsD
qos
cQr
@@ -99884,16 +100189,16 @@ aKb
aKb
wpx
htd
-qfl
-uFn
-lhX
-cZs
-pOo
-eHN
+mrJ
+lvs
+xJa
+kxW
+gWH
+roL
mxI
eBw
gbS
-uyg
+ipM
dYT
tCT
bpA
@@ -100150,7 +100455,7 @@ tUn
hKV
wXF
jLm
-aJE
+sQB
lqL
psT
wqj
@@ -100407,7 +100712,7 @@ tUn
hKV
wIo
jBi
-aJE
+sQB
gIi
iPe
mJG
@@ -100664,7 +100969,7 @@ tUn
hKV
wXF
mvR
-qIc
+jKa
mvR
mvR
mvR
@@ -104815,15 +105120,15 @@ aaa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
@@ -105071,17 +105376,17 @@ aaa
aaa
aaa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
+nBa
cKn
-gCE
+nBa
aaa
aaa
aaa
@@ -105328,17 +105633,17 @@ aaa
aaa
aaa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
aaa
aaa
@@ -105585,17 +105890,17 @@ aaa
aaa
aaa
aaa
-gCE
+nBa
cKn
-gCE
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
aaa
aaa
@@ -105833,9 +106138,9 @@ fwP
imU
fPD
oWc
-qFc
-bnp
-phT
+rYy
+rUT
+uIi
gDT
gDT
gDT
@@ -105843,7 +106148,7 @@ aaa
aaa
aaa
aaa
-xRH
+cKn
aaa
aaa
aaa
@@ -105851,7 +106156,7 @@ cKn
aaa
aaa
aaa
-xRH
+cKn
aaa
aaa
lMJ
@@ -106089,25 +106394,25 @@ egs
ftK
ixV
pTu
-fPB
-git
-kqj
-cgd
-fUq
-jUK
-dKh
+xBw
+hRU
+lmK
+pms
+apT
+pOF
+vlZ
+rxH
+rxH
+rxH
+rxH
rxH
rxH
rxH
rxH
-uYi
rxH
-uYi
rxH
rxH
rxH
-uYi
-uYi
uYi
rxH
rxH
@@ -106271,11 +106576,11 @@ qXB
fwG
ldO
oQb
-lGN
-azS
-lGN
-nLX
-lGN
+psZ
+mSB
+psZ
+edC
+psZ
psZ
qXB
ttA
@@ -106347,9 +106652,9 @@ bLd
ixd
bLd
oWk
-bxg
-otR
-wwc
+oXJ
+mmF
+nRz
gDT
gDT
gDT
@@ -106361,11 +106666,11 @@ cKn
aaa
aaa
aaa
-xRH
+cKn
aaa
aaa
aaa
-xRH
+cKn
aaa
aaa
lMJ
@@ -106613,17 +106918,17 @@ aaa
aaa
aaa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
aaa
aaa
@@ -106870,17 +107175,17 @@ aaa
aaa
aaa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
+nBa
cKn
-gCE
+nBa
aaa
aaa
aaa
@@ -107127,17 +107432,17 @@ aaa
aaa
aaa
aaa
-gCE
-xRH
-gCE
+nBa
+cKn
+nBa
aaa
-gCE
-xRH
+nBa
+cKn
nBa
aaa
-gCE
+nBa
cKn
-gCE
+nBa
aaa
aaa
aaa
@@ -107385,15 +107690,15 @@ aaa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
-gCE
+nBa
aaa
aaa
aaa
@@ -109926,18 +110231,20 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
lMJ
lMJ
lMJ
oMA
lSw
+oMA
+oMA
wmL
gUS
qBo
gUS
wmL
+oMA
+oMA
lSw
oMA
aox
@@ -109963,8 +110270,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
lKu
aaa
aaa
@@ -110182,8 +110487,6 @@ lMJ
lMJ
lMJ
lMJ
-lMJ
-lMJ
lFq
oMA
oMA
@@ -110192,7 +110495,11 @@ oMA
eYu
agN
bXs
+hzL
+hzL
tLc
+hjw
+hjw
juH
pJA
hLJ
@@ -110276,8 +110583,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(165,1,1) = {"
aaa
@@ -110438,8 +110743,6 @@ aaa
aaa
lMJ
aaa
-lMJ
-aaa
aaa
uaR
oue
@@ -110449,8 +110752,12 @@ qad
xfm
nHG
hjw
+hjw
+hjw
bqJ
hzL
+hzL
+hzL
wNO
tml
mez
@@ -110533,8 +110840,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(166,1,1) = {"
aaa
@@ -110695,8 +111000,6 @@ aaa
aaa
dxK
aaa
-dxK
-aaa
aaa
oMA
sKf
@@ -110706,7 +111009,11 @@ vhZ
tsy
sRa
ppC
+hjw
+hjw
twu
+mBj
+mBj
mKD
hxY
nae
@@ -110790,8 +111097,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(167,1,1) = {"
aaa
@@ -110952,8 +111257,6 @@ aaa
aaa
lMJ
aaa
-lMJ
-aaa
aaa
uaR
jHX
@@ -110963,7 +111266,11 @@ toR
syV
jsi
eoZ
+hjw
+hjw
jjm
+hjw
+hjw
nui
wWV
vsp
@@ -110986,8 +111293,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
lKu
aaa
aaa
@@ -111210,8 +111515,6 @@ lMJ
lMJ
lMJ
lMJ
-lMJ
-lMJ
jlU
jlU
jlU
@@ -111220,9 +111523,13 @@ jlU
jlU
snZ
lVB
+ycv
+ycv
bsE
-uHD
kvT
+kvT
+uHD
+xea
jlU
jlU
jlU
@@ -111304,8 +111611,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(169,1,1) = {"
aaa
@@ -111466,8 +111771,6 @@ aaa
aaa
aaa
aaa
-lMJ
-aaa
aaa
aaa
cXP
@@ -111477,7 +111780,11 @@ plp
gog
fUx
pst
+pYh
+pYh
fkk
+pYh
+pYh
vuK
yag
hFz
@@ -111561,8 +111868,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(170,1,1) = {"
aaa
@@ -111721,25 +112026,27 @@ eoU
aaf
aaa
aaa
-aaa
-aaa
lMJ
aaa
aaa
aaa
cXP
mtu
-vxa
+mtu
mtu
jfS
bQQ
lVB
+ycv
+ycv
oWa
-iWc
+ycv
+ycv
+mJQ
ces
elm
mtu
-vxa
+mtu
mtu
cXP
aaa
@@ -111751,8 +112058,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
lKu
aaa
aaa
@@ -111977,8 +112282,6 @@ sUo
eoU
aaf
aaa
-aaa
-aaa
rrt
rrt
lMJ
@@ -111991,7 +112294,11 @@ ycd
gog
jjj
jNo
+min
+jOI
sgk
+min
+min
klK
aDQ
hFz
@@ -112075,8 +112382,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(172,1,1) = {"
aaa
@@ -112162,9 +112467,9 @@ aav
sxo
sxo
sxo
-gXs
-kbn
-lBt
+pZG
+ltg
+nEe
tCS
dOY
psZ
@@ -112234,28 +112539,30 @@ eoU
eoU
aaf
aaa
-aaa
-aaa
rrt
aaa
aaa
bPB
kWc
-xiL
+jlU
gTK
hMv
wKT
vGq
vXi
ncF
+flp
+yeL
uNs
+flp
+flp
gSM
frt
vGq
qko
gyI
phI
-xiL
+jlU
kvO
bPB
aaa
@@ -112332,8 +112639,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(173,1,1) = {"
aaa
@@ -112416,13 +112721,13 @@ jhd
rQw
rQw
jhd
-cpl
-duN
-xUC
-sRI
-aUT
-xRk
-iJJ
+uRa
+ivK
+rRB
+rff
+jnv
+pwy
+ozs
etA
psZ
tCS
@@ -112489,31 +112794,33 @@ aaf
aaf
aaf
aaf
-aaf
-aaa
rrt
aox
aox
aox
hbK
hbK
+oFv
+jlU
rMu
-xiL
-jCO
-fdZ
-mMK
+nOh
mLW
-mMK
+lJg
+mLW
+mLW
+cFW
mMK
jxH
-tMI
+pwZ
pwZ
dxc
+bRc
fdZ
-fdZ
-jvX
-xiL
+nOh
+nOh
gTS
+jlU
+nqk
hbK
hbK
lMJ
@@ -112589,8 +112896,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(174,1,1) = {"
aaa
@@ -112676,9 +112981,9 @@ aav
sxo
sxo
sxo
-foV
-dUk
-ptn
+dRR
+gFd
+lek
buk
cNi
wrn
@@ -112746,31 +113051,33 @@ eoU
eoU
eoU
eoU
-lMJ
-aaa
rrt
lAu
lAu
lMJ
wrc
oyj
+qAr
+uVk
xen
mdo
vAa
-vJl
+iwO
amV
vVx
-kyh
+iwO
iwO
pQj
-jzw
+thT
thT
jzw
sie
-pgM
-qiD
+nYL
+nYL
nYL
ddK
+hoV
+gga
hAN
wrc
aaa
@@ -112818,38 +113125,36 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-"}
-(175,1,1) = {"
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+"}
+(175,1,1) = {"
aaa
aaa
aaa
@@ -113004,29 +113309,31 @@ jRg
jRg
eoU
lMJ
-aaa
-lMJ
lMJ
lMJ
lMJ
wrc
oyj
xiL
-xiL
+fUH
+mtu
+mtu
idA
-xVu
+lYY
dgz
-tIe
-xVu
-hja
-vDV
-nSC
-xVu
+eTk
+uAV
+mtu
+mtu
+mtu
+aVx
pJf
pfP
xVu
-idA
-xiL
+mtu
+mtu
+mtu
+iUk
xiL
lmn
wrc
@@ -113103,8 +113410,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(176,1,1) = {"
aaa
@@ -113260,8 +113565,6 @@ pnE
wit
lPa
eoU
-lMJ
-aaa
rrt
lAu
lAu
@@ -113269,21 +113572,25 @@ lMJ
hbK
uhs
xiL
-kHt
-iOZ
-idF
-faD
-lTi
-xVu
-cXP
-cXP
-cXP
-xVu
-jbk
-iWc
-pVR
-hCw
-mCj
+mtu
+mtu
+mtu
+idA
+mtu
+dgz
+eTk
+mtu
+mtu
+mtu
+mtu
+mtu
+pJf
+pfP
+mtu
+mtu
+mtu
+mtu
+mtu
xiL
lmn
hbK
@@ -113360,8 +113667,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
"}
(177,1,1) = {"
aaa
@@ -113519,34 +113824,34 @@ jRg
eoU
lMJ
aaa
-rrt
-aox
-aox
-aox
+aaa
+aaa
wrc
oyj
xiL
eSr
+vxa
+fmR
tGS
-uKW
-faD
-iWc
-cXP
-aJQ
+uYP
+dgz
+pfP
+uYP
+uYP
gXw
-pZi
-cXP
-lVB
-iWc
-pDl
+mtu
+mtu
+pJf
+pfP
+uYP
uYP
+cjT
+vxa
ljF
xiL
lmn
wrc
-lMJ
-lMJ
-mxQ
+aaa
aaa
aaa
aaa
@@ -113776,34 +114081,34 @@ eoU
eoU
lMJ
aaa
-rrt
-lAu
-lAu
-lMJ
-hbK
+aaa
+aaa
+wrc
oyj
xiL
mtu
+mtu
+mtu
iOZ
-trL
-faD
-iWc
-cXP
-gXw
-gXw
-vvD
-cXP
-lVB
-iWc
-eSC
-hCw
+mtu
+dgz
+eTk
+mtu
+mtu
+mtu
+mtu
+mtu
+pJf
+pfP
+mtu
+mtu
+mtu
+mtu
mtu
xiL
lmn
-hbK
-aaa
+wrc
aaa
-lMJ
aaa
aaa
aaa
@@ -114033,34 +114338,34 @@ wJw
eoU
lMJ
aaa
-lMJ
-lMJ
-lMJ
-lMJ
-wrc
+aaa
+aaa
+hbK
oyj
xiL
-xiL
-idA
-xVu
-uQu
-iWc
-xVu
-pXo
-jSj
-rzz
-xVu
-lVB
-exu
-xVu
-idA
-xiL
+iTV
+mtu
+mtu
+iOZ
+gbm
+dgz
+rYq
+jhX
+mtu
+mtu
+mtu
+jhX
+meQ
+pfP
+kOV
+mtu
+mtu
+mtu
+xVr
xiL
lmn
-wrc
-aaa
+hbK
aaa
-mxQ
aaa
aaa
aaa
@@ -114288,37 +114593,37 @@ cGV
hDe
xEg
eoU
-lMJ
-aaa
rrt
-lAu
-lAu
-lMJ
+aaa
+aaa
+aaa
wrc
oyj
-oyj
xiL
-nEb
-bSu
-caf
-tgm
-gKD
-fdZ
-fdZ
-fdZ
-iMR
-bnQ
-psc
-wCH
-rKg
+mtu
+mtu
+mtu
+iOZ
+mtu
+dgz
+eTk
+mtu
+mtu
+mtu
+mtu
+mtu
+pJf
+pfP
+mtu
+mtu
+mtu
+mtu
+mtu
xiL
lmn
-lmn
wrc
aaa
aaa
-mxQ
-aaa
aaa
aaa
aaa
@@ -114545,33 +114850,35 @@ wEf
ojv
wJw
eoU
-lMJ
-aaa
rrt
aox
aox
aox
-hbK
-hbK
+wrc
oyj
xiL
-nkq
-rwx
-byP
-dac
-evD
+eSr
+vxa
+khw
+lFe
+uYP
+dgz
+pfP
+uYP
+uYP
+xiC
+mtu
+mtu
pJf
-ycv
-tIe
-min
-min
-tqw
-ohD
-dQa
+pfP
+uYP
+uYP
+eml
+vxa
+ljF
xiL
lmn
-hbK
-hbK
+wrc
lMJ
lMJ
mxQ
@@ -114611,44 +114918,42 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-"}
-(182,1,1) = {"
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+aaa
+"}
+(182,1,1) = {"
aaa
aaa
aaa
@@ -114803,31 +115108,34 @@ eoU
eoU
eoU
lMJ
-aaa
-aaa
-aaa
-rrt
-aaa
-aaa
-wrc
+lAu
+lAu
+lMJ
+hbK
oyj
xiL
-jgq
-imw
-aft
-ygF
-rrL
-fMF
-min
-irp
-sCv
-ixR
-shY
-eOP
-jgq
+mtu
+mtu
+mtu
+idA
+mtu
+dgz
+eTk
+mtu
+mtu
+mtu
+mtu
+mtu
+pJf
+pfP
+mtu
+mtu
+mtu
+mtu
+mtu
xiL
lmn
-wrc
+hbK
aaa
aaa
lMJ
@@ -114901,9 +115209,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
"}
(183,1,1) = {"
aaa
@@ -115059,38 +115364,38 @@ yfx
ets
ets
eoU
-lMJ
-aaa
-aaa
-aaa
rrt
-aaa
-aaa
+lMJ
+lMJ
+lMJ
wrc
oyj
xiL
+cFw
mtu
mtu
-vHm
-shY
-qvQ
-aft
-diq
-shY
-gjv
-aft
-xCA
+idA
+obi
+dgz
+eTk
+iCZ
+mtu
+mtu
+mtu
+cqQ
+pJf
+pfP
+jau
mtu
mtu
+mtu
+dMA
xiL
lmn
wrc
aaa
aaa
-rrt
-aaa
-aaa
-aaa
+mxQ
aaa
aaa
aaa
@@ -115316,38 +115621,38 @@ oiI
rvx
dzY
eoU
-lMJ
-aaa
-aaa
-aaa
rrt
-rrt
-rrt
-hbK
+lAu
+lAu
+lMJ
+wrc
oyj
xiL
-rTi
-iXS
-vHm
-xCA
-mtu
-vHm
-gva
-xCA
-vxa
-vHm
-xCA
-iXS
-lWM
xiL
+nEb
+bae
+elT
+heo
+ddN
+fJq
+gmB
+gmB
+gmB
+gmB
+gmB
+was
+ssE
+nOh
+vYc
+wmJ
+ogF
+xiL
+unx
lmn
-hbK
-lMJ
-lMJ
-rrt
-aaa
+wrc
aaa
aaa
+mxQ
aaa
aaa
aaa
@@ -115573,38 +115878,38 @@ aLr
aJe
ets
eoU
-lMJ
-aaa
-aaa
-aaa
-aaa
-aaa
aaa
+aox
+aox
+aox
hbK
oyj
+oyj
xiL
-xiL
-xiL
-xiL
-weD
-mtu
-vHm
-gva
-xCA
-mtu
-fVV
-xiL
-xiL
-xiL
+nkq
+rwx
+wEu
+vul
+kkT
+jdj
+xNm
+jdj
+jdj
+jdj
+jdj
+qID
+jdj
+qqq
+kKG
+ohD
+dQa
xiL
lmn
+lmn
hbK
-aaa
-aaa
-aaa
-aaa
-lKu
-aaa
+lMJ
+lMJ
+mxQ
aaa
aaa
aaa
@@ -115830,37 +116135,37 @@ eoU
eoU
eoU
eoU
-lMJ
-aaa
-aaa
-aaa
aaa
aaa
+rrt
aaa
+dAJ
hbK
oyj
-oyj
-goW
-msN
xiL
+jgq
+imw
+aft
+ygF
+rrL
+cHV
jlU
-gEu
-lKd
+aYt
gva
-iZJ
-rDd
+aYt
+jlU
jlU
+sCv
+ixR
+shY
+eOP
+jgq
xiL
-qxr
lmn
-lmn
-hAN
hbK
+dAJ
aaa
-aaa
-aaa
-aaa
-aaa
+lMJ
aaa
aaa
aaa
@@ -116087,34 +116392,37 @@ xWn
kwZ
kwZ
eoU
-lMJ
-aaa
-aaa
aaa
aaa
+rrt
aaa
aaa
-hbK
-rDf
-rDf
-rDf
-uhs
-fjd
-jlU
+wrc
+oyj
+xiL
+mtu
+mtu
+vHm
+shY
+qvQ
+aft
eJI
-sZN
-msR
-xkv
+ycv
+kCw
+ycv
lOY
-jlU
-iOJ
+shY
+gjv
+aft
+xCA
+mtu
+mtu
+xiL
lmn
-rDf
-rDf
-utD
-hbK
+wrc
aaa
aaa
+rrt
aaa
aaa
aaa
@@ -116186,11 +116494,8 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-"}
-(188,1,1) = {"
+"}
+(188,1,1) = {"
aaa
aaa
aaa
@@ -116344,37 +116649,37 @@ iiL
kwZ
aWa
eoU
-lMJ
-nYJ
-lMJ
+aaa
+aaa
rrt
rrt
rrt
-lMJ
-hbK
-hbK
-wMz
-rDf
-eUe
-eSb
-nnc
-hdy
-nnc
-rvK
-nnc
-hdy
-aWp
-eSb
-udp
-wHd
-uLa
hbK
+oyj
+xiL
+rTi
+iXS
+vHm
+xCA
+mtu
+vHm
+fHs
+ycv
+kCw
+kCw
+gRY
+xCA
+mtu
+vHm
+xCA
+iXS
+lWM
+xiL
+lmn
hbK
-aaa
-aaa
-aaa
-aaa
-aaa
+lMJ
+lMJ
+rrt
aaa
aaa
aaa
@@ -116601,39 +116906,39 @@ tDR
aNB
kwZ
eoU
-lMJ
aaa
aaa
-lMJ
aaa
aaa
aaa
-lMJ
-hbK
-hbK
hbK
-mgS
-hbK
-jlU
-mtu
-mtu
-gyK
+oyj
+xiL
+xiL
+xiL
+xiL
+weD
mtu
+vHm
+weG
+ycv
+ycv
+ycv
+dGk
+xCA
mtu
-jlU
-hbK
-mTg
-hbK
-hbK
+fVV
+xiL
+xiL
+xiL
+xiL
+lmn
hbK
-lMJ
-aaa
-aaa
-aaa
aaa
aaa
aaa
aaa
+lKu
aaa
aaa
aaa
@@ -116858,29 +117163,33 @@ eoU
eoU
eoU
eoU
-lMJ
-aaa
aaa
-lMJ
aaa
aaa
aaa
-lMJ
aaa
hbK
-tmU
-fGy
-wyo
+oyj
+oyj
+goW
+msN
+xiL
jlU
-dLm
-mtu
-gyK
-mtu
-mtu
+gEu
+lKd
+ycv
+ycv
+ycv
+ycv
+ycv
+iZJ
+rDd
jlU
-qgn
-mCV
-wyo
+xiL
+qxr
+lmn
+lmn
+hAN
hbK
aaa
aaa
@@ -116956,10 +117265,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
"}
(191,1,1) = {"
aaa
@@ -117116,28 +117421,32 @@ lMJ
lMJ
lMJ
lMJ
-lMJ
-rrt
-nYJ
-rrt
-rrt
-rrt
-lMJ
-lMJ
+aaa
+aaa
+aaa
+aaa
hbK
-pWT
rDf
-uLa
+rDf
+rDf
+uhs
+fjd
jlU
-eSr
-mtu
-jQz
-nJr
-ljF
+yig
+sZN
+pUX
+nmy
+cVQ
+nmy
+pUX
+xkv
+igH
jlU
-lUS
-pHt
+iOJ
+lmn
rDf
+rDf
+utD
hbK
aaa
aaa
@@ -117213,10 +117522,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
"}
(192,1,1) = {"
aaa
@@ -117373,33 +117678,33 @@ aaa
aaa
lMJ
aaa
-aaa
-aaa
-lMJ
-aaa
-aaa
-aaa
+rrt
+rrt
+rrt
lMJ
-aaa
-bPB
hbK
-wrc
-wrc
-jlU
-mtu
-mtu
-mtu
-mtu
-mtu
-jlU
-wrc
-wrc
hbK
-bPB
-lMJ
-aaa
-aaa
-aaa
+wMz
+rDf
+eUe
+eSb
+nnc
+hdy
+cbn
+tQJ
+tQJ
+rvK
+tQJ
+tQJ
+nnc
+hdy
+aWp
+eSb
+udp
+wHd
+uLa
+hbK
+hbK
aaa
aaa
aaa
@@ -117630,25 +117935,32 @@ aaa
aaa
nYJ
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
lMJ
aaa
aaa
aaa
-aaa
lMJ
+hbK
+hbK
+hbK
+mgS
+hbK
jlU
+mtu
+mtu
+mtu
+mtu
+gyK
+mtu
+mtu
+mtu
+mtu
jlU
-bPu
-asL
-kcu
-jlU
-jlU
+hbK
+mTg
+hbK
+hbK
+hbK
lMJ
aaa
aaa
@@ -117724,13 +118036,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
"}
(194,1,1) = {"
aaa
@@ -117886,32 +118191,32 @@ rrt
rrt
rrt
rrt
-lMJ
-lMJ
-rrt
-rrt
-lAu
-rrt
-rrt
-rrt
-rrt
-rrt
rrt
lMJ
-lMJ
-lMJ
-jlU
-jlU
-jlU
-jlU
-jlU
-lMJ
-aaa
-aaa
aaa
aaa
aaa
+lMJ
aaa
+hbK
+tmU
+fGy
+wyo
+jlU
+dLm
+mtu
+mtu
+mtu
+gyK
+mtu
+mtu
+mtu
+mtu
+jlU
+qgn
+mCV
+wyo
+hbK
aaa
aaa
aaa
@@ -118144,31 +118449,31 @@ aaa
aaa
lMJ
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-lMJ
-lMJ
-lMJ
+nYJ
+rrt
+rrt
+rrt
lMJ
lMJ
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+hbK
+pWT
+rDf
+uLa
+jlU
+eSr
+mtu
+mtu
+mtu
+jQz
+mtu
+mtu
+nJr
+ljF
+jlU
+lUS
+pHt
+rDf
+hbK
aaa
aaa
aaa
@@ -118401,23 +118706,31 @@ aaa
aaa
lMJ
aaa
+lMJ
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-lKu
-aaa
-aaa
-lMJ
-aaa
lMJ
aaa
+bPB
+hbK
+wrc
+wrc
+jlU
+mtu
+mtu
+mtu
+mtu
+mtu
+mtu
+mtu
+mtu
+mtu
+jlU
+wrc
+wrc
+hbK
+bPB
lMJ
aaa
aaa
@@ -118494,14 +118807,6 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
"}
(197,1,1) = {"
aaa
@@ -118658,28 +118963,28 @@ rrt
rrt
rrt
rrt
+lMJ
aaa
aaa
aaa
+lMJ
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-rrt
lMJ
-aaa
-lMJ
-aaa
+jlU
+jlU
+bPu
+mtu
+mtu
+asL
+mtu
+mtu
+kcu
+jlU
+jlU
lMJ
-rrt
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -118915,27 +119220,27 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-dxK
-aaa
+rrt
+lAu
+rrt
+rrt
+rrt
+rrt
+rrt
+rrt
+lMJ
+lMJ
+lMJ
+jlU
+jlU
+jlU
+jlU
+jlU
+jlU
+jlU
+jlU
+jlU
lMJ
-aaa
-dxK
-aaa
-aaa
-aaa
aaa
aaa
aaa
@@ -119183,15 +119488,15 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+lMJ
lMJ
aaa
aaa
+lMJ
aaa
aaa
+lMJ
+lMJ
aaa
aaa
aaa
@@ -119437,18 +119742,18 @@ aaa
aaa
aaa
aaa
+lKu
aaa
aaa
+lMJ
aaa
aaa
aaa
-aaa
-aaa
-yib
-aaa
+lMJ
aaa
aaa
aaa
+lMJ
aaa
aaa
aaa
@@ -119696,17 +120001,17 @@ aaa
aaa
aaa
aaa
+rrt
+lMJ
aaa
aaa
aaa
+lMJ
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+lMJ
+rrt
aaa
aaa
aaa
@@ -119954,15 +120259,15 @@ aaa
aaa
aaa
aaa
+dxK
aaa
aaa
aaa
+lMJ
aaa
aaa
aaa
-aaa
-aaa
-aaa
+dxK
aaa
aaa
aaa
@@ -120215,7 +120520,7 @@ aaa
aaa
aaa
aaa
-aaa
+lMJ
aaa
aaa
aaa
@@ -120472,7 +120777,7 @@ aaa
aaa
aaa
aaa
-aaa
+yib
aaa
aaa
aaa
diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm
index bd13c17ff159..056d85d90db0 100644
--- a/_maps/map_files/NorthStar/north_star.dmm
+++ b/_maps/map_files/NorthStar/north_star.dmm
@@ -13122,11 +13122,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/station/science/lobby)
-"drB" = (
-/obj/machinery/processor/slime,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/pod/light,
-/area/station/maintenance/floor3/starboard)
"drD" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/structure/disposalpipe/segment{
@@ -28195,7 +28190,7 @@
/turf/open/floor/iron/cafeteria,
/area/station/commons/locker)
"hBX" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/grass,
/area/station/science/xenobiology)
"hBY" = (
@@ -51144,9 +51139,6 @@
/turf/open/floor/pod/light,
/area/station/maintenance/floor2/port/aft)
"nyc" = (
-/obj/machinery/computer/camera_advanced/xenobio{
- dir = 4
- },
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"nyd" = (
@@ -53900,7 +53892,7 @@
/turf/open/floor/iron/dark,
/area/station/hallway/floor1/fore)
"oiH" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/grass,
/area/station/maintenance/floor3/starboard)
"oiJ" = (
@@ -58698,7 +58690,7 @@
/turf/open/floor/iron/white,
/area/station/science/circuits)
"pBw" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/obj/machinery/camera/directional/south{
c_tag = "Xenobiology - Slime Pens"
},
@@ -72640,7 +72632,6 @@
/turf/open/floor/iron,
/area/station/hallway/floor4/fore)
"tuA" = (
-/obj/machinery/monkey_recycler,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/circuit,
@@ -80706,7 +80697,7 @@
/area/station/science/xenobiology/hallway)
"vHn" = (
/obj/machinery/light/cold/no_nightlight/directional/east,
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/grass,
/area/station/science/xenobiology)
"vHq" = (
@@ -82841,7 +82832,6 @@
/turf/open/floor/iron,
/area/station/security/prison)
"wlb" = (
-/obj/machinery/processor/slime,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/circuit,
@@ -250465,7 +250455,7 @@ fNq
iKT
xNf
mpy
-drB
+iKT
iHm
rGl
vIh
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index bc8c8c3ac4c6..e5b29c800e85 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -11295,7 +11295,6 @@
/obj/effect/turf_decal/stripes/end{
dir = 4
},
-/obj/machinery/processor/slime,
/turf/open/floor/mineral/titanium/tiled/yellow,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"FD" = (
@@ -13990,7 +13989,6 @@
/turf/open/floor/engine/cult,
/area/centcom/wizard_station)
"MT" = (
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/structure/noticeboard/directional/east,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
@@ -14835,7 +14833,6 @@
/obj/effect/turf_decal/stripes/end{
dir = 8
},
-/obj/machinery/monkey_recycler,
/turf/open/floor/mineral/titanium/tiled/yellow,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"Pv" = (
@@ -17344,7 +17341,7 @@
/turf/open/floor/wood/large,
/area/centcom/central_command_areas/medical)
"Ww" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/circuit/red/off,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"Wx" = (
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 2a033325c5ca..50c02b52bfe5 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -1525,7 +1525,11 @@
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"aeu" = (
/obj/effect/landmark/start/shaft_miner,
@@ -2243,20 +2247,6 @@
/obj/structure/chair/stool/bar/directional/east,
/turf/open/floor/wood/large,
/area/station/service/barber)
-"ahk" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
-"ahl" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez4";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"ahm" = (
/turf/open/openspace/airless/planetary,
/area/station/asteroid)
@@ -2276,11 +2266,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2,
/turf/open/floor/plating/airless,
/area/station/asteroid)
-"ahp" = (
-/obj/effect/turf_decal/stripes/corner,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"ahr" = (
/obj/effect/turf_decal/sand/plating,
/obj/effect/spawner/random/structure/girder,
@@ -3325,7 +3310,12 @@
"aqB" = (
/obj/effect/turf_decal/trimline/purple/filled/corner,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"aqM" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -4085,10 +4075,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/hallway/secondary/command)
-"ayN" = (
-/obj/machinery/light/directional/north,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"ayQ" = (
/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{
dir = 1
@@ -5369,7 +5355,7 @@
/turf/open/floor/engine/cult,
/area/station/service/library)
"aJT" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/engine,
/area/station/science/xenobiology)
"aJV" = (
@@ -6139,18 +6125,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron/white,
/area/station/medical/pathology)
-"aPz" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/button/door{
- id = "containdeez5";
- name = "Cell Containment Toggle Button"
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"aPB" = (
/obj/machinery/firealarm/directional/east{
pixel_y = 6
@@ -7296,8 +7270,10 @@
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
"bgH" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"bgN" = (
/obj/effect/turf_decal/trimline/neutral/filled/corner,
@@ -7815,22 +7791,6 @@
},
/turf/open/floor/plating,
/area/station/medical/pharmacy)
-"bql" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/south{
- name = "Containment Pen #4";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #4";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez4";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"bqu" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -8094,6 +8054,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/carpet,
/area/station/command/heads_quarters/hos)
+"bvm" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"bvq" = (
/obj/effect/turf_decal/siding/wood{
dir = 4
@@ -8133,7 +8099,7 @@
dir = 4
},
/obj/machinery/disposal/bin,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"bvM" = (
/obj/machinery/computer/mech_bay_power_console,
@@ -10650,15 +10616,11 @@
/turf/open/floor/plating,
/area/station/maintenance/starboard/central)
"cim" = (
-/obj/structure/window/reinforced/spawner/directional/north,
+/obj/machinery/duct,
/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/structure/disposalpipe/trunk{
dir = 1
},
-/obj/machinery/disposal/bin,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"ciA" = (
/obj/machinery/door/airlock/external{
@@ -10848,6 +10810,13 @@
},
/turf/open/floor/plating,
/area/station/maintenance/department/cargo)
+"cml" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "4"
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"cmo" = (
/obj/effect/turf_decal/siding/thinplating/end,
/turf/open/floor/iron/dark,
@@ -11248,14 +11217,6 @@
},
/turf/open/floor/iron,
/area/station/security/processing)
-"cue" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"cut" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/light/directional/south,
@@ -11560,7 +11521,7 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"cyW" = (
/obj/effect/turf_decal/siding/wood{
@@ -11578,15 +11539,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/medical)
-"cyY" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez4";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"cyZ" = (
/obj/machinery/atmospherics/miner/nitrogen,
/turf/open/floor/engine/n2,
@@ -12168,25 +12120,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/construction/engineering)
-"cJP" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/south{
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez7";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"cJR" = (
/obj/machinery/rnd/server,
/turf/open/floor/circuit/telecomms/server,
@@ -12662,25 +12595,6 @@
/obj/machinery/light/directional/east,
/turf/open/floor/glass/reinforced,
/area/station/ai_monitored/turret_protected/aisat/hallway)
-"cSj" = (
-/obj/effect/turf_decal/delivery,
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
-/obj/machinery/door/window/left/directional/east{
- name = "Containment Pen #1";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/west{
- name = "Containment Pen #1";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez1";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"cSp" = (
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 8
@@ -12864,7 +12778,9 @@
},
/obj/machinery/light/directional/east,
/obj/structure/extinguisher_cabinet/directional/east,
-/turf/open/floor/iron/white,
+/obj/item/disk/vacuum_upgrade/biomass,
+/obj/item/disk/vacuum_upgrade/biomass,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"cWj" = (
/obj/structure/railing{
@@ -13098,7 +13014,9 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"cZH" = (
/obj/effect/turf_decal/trimline/purple/filled/corner,
@@ -13318,12 +13236,11 @@
/turf/open/space/openspace,
/area/station/solars/starboard/fore)
"deh" = (
+/obj/structure/sink/directional/west,
/obj/effect/turf_decal/stripes/line{
- dir = 1
+ dir = 4
},
-/obj/effect/turf_decal/stripes/corner,
-/obj/structure/sink/directional/west,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"del" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -13907,12 +13824,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/engineering/gravity_generator)
-"dne" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"dnh" = (
/obj/structure/cable,
/turf/open/floor/iron,
@@ -14295,6 +14206,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/hallway/primary/tram/right)
+"dtN" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"dtS" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sink/kitchen/directional/west,
@@ -15439,7 +15355,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 8
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"dOx" = (
/obj/structure/window/reinforced/spawner/directional/west,
@@ -15700,7 +15616,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"dQR" = (
/obj/machinery/power/terminal{
@@ -16179,6 +16095,14 @@
},
/turf/open/floor/noslip,
/area/station/hallway/primary/tram/center)
+"dZn" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "3";
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"dZu" = (
/obj/machinery/mecha_part_fabricator,
/obj/effect/turf_decal/delivery,
@@ -17735,13 +17659,8 @@
/turf/open/floor/iron/dark,
/area/station/cargo/miningdock/oresilo)
"exH" = (
-/obj/structure/table,
/obj/effect/turf_decal/stripes/line,
-/obj/machinery/button/door{
- id = "containdeez4";
- name = "Cell Containment Toggle Button"
- },
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"exJ" = (
/obj/structure/cable,
@@ -18060,6 +17979,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/cargo/warehouse)
+"eCA" = (
+/obj/machinery/corral_corner{
+ mapping_id = "1"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "1"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"eCE" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -18096,6 +18024,15 @@
/obj/structure/table,
/turf/open/floor/iron,
/area/station/commons/dorms)
+"eDO" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"eDV" = (
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
/obj/effect/decal/cleanable/dirt,
@@ -18254,8 +18191,9 @@
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"eGt" = (
+/obj/machinery/duct,
/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"eHj" = (
/obj/machinery/vending/tool,
@@ -18689,15 +18627,6 @@
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/catwalk_floor,
/area/station/maintenance/department/crew_quarters/dorms)
-"eQm" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/structure/chair/comfy/black{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"eQn" = (
/obj/machinery/door/airlock/command/glass{
name = "Secure External Operations"
@@ -19880,6 +19809,12 @@
/obj/structure/grille,
/turf/closed/wall/r_wall,
/area/station/engineering/atmos)
+"fkf" = (
+/obj/machinery/corral_corner{
+ mapping_id = "4"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"fkg" = (
/obj/machinery/biogenerator,
/obj/effect/turf_decal/tile/green/fourcorners,
@@ -20142,9 +20077,9 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/science)
"fof" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/structure/sign/warning/cold_temp/directional/south,
-/turf/open/floor/circuit/telecomms,
+/obj/machinery/computer/slime_market,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"fog" = (
/obj/machinery/vending/cigarette,
@@ -20295,15 +20230,6 @@
},
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
-"fqM" = (
-/obj/structure/disposaloutlet{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"fqZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/dark,
@@ -20902,10 +20828,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark/textured,
/area/station/engineering/main)
-"fAm" = (
-/obj/structure/disposalpipe/segment,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"fAA" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
@@ -21793,22 +21715,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/security/processing)
-"fPv" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #1";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/south{
- name = "Containment Pen #1";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez1";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"fPx" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/table/wood/poker,
@@ -21839,22 +21745,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering)
-"fQo" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #5";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/south{
- name = "Containment Pen #5";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez5";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"fQK" = (
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
@@ -23849,7 +23739,8 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"gDr" = (
/obj/effect/turf_decal/stripes/corner{
@@ -24233,7 +24124,10 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 8
},
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"gKb" = (
/obj/effect/turf_decal/stripes/end{
@@ -24523,11 +24417,13 @@
/turf/open/floor/catwalk_floor,
/area/station/maintenance/central/lesser)
"gNr" = (
-/obj/machinery/processor/slime,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/structure/table/glass,
+/obj/item/vacuum_pack,
+/obj/item/vacuum_pack,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"gNu" = (
/obj/effect/decal/cleanable/dirt,
@@ -24674,18 +24570,6 @@
},
/turf/open/floor/iron/white,
/area/station/science/ordnance)
-"gPD" = (
-/obj/structure/window/reinforced/spawner/directional/north,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/machinery/button/door{
- id = "containdeez7";
- name = "Cell Containment Toggle Button"
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"gPM" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
@@ -25314,15 +25198,6 @@
/obj/machinery/light/warm/directional/south,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
-"hcn" = (
-/obj/structure/window/reinforced/spawner,
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"hcv" = (
/obj/effect/spawner/random/entertainment/arcade{
dir = 1
@@ -25347,12 +25222,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/closed/wall/r_wall,
/area/ruin/powered/clownplanet)
-"hdA" = (
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"hdB" = (
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
@@ -25596,13 +25465,12 @@
/turf/open/misc/asteroid,
/area/station/maintenance/department/cargo)
"hik" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
/obj/structure/sink/directional/east,
/obj/machinery/airalarm/directional/west,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"hin" = (
/turf/closed/wall/rock,
@@ -26317,10 +26185,6 @@
pixel_x = 10;
pixel_y = 20
},
-/mob/living/simple_animal/slime/pet{
- colour = "orange";
- name = "Happy Accident"
- },
/turf/open/floor/plastic,
/area/station/engineering/break_room)
"huz" = (
@@ -26828,14 +26692,6 @@
/obj/structure/cable/layer1,
/turf/open/floor/plating/airless,
/area/station/solars/starboard/fore)
-"hDT" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/effect/turf_decal/trimline/purple/filled/corner,
-/obj/effect/turf_decal/trimline/purple/filled/corner{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"hEb" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
@@ -27483,15 +27339,6 @@
/obj/effect/landmark/start/lawyer,
/turf/open/floor/wood,
/area/station/service/lawoffice)
-"hPB" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"hPI" = (
/obj/machinery/holopad,
/obj/structure/cable,
@@ -27987,7 +27834,7 @@
/obj/structure/disposalpipe/trunk{
dir = 1
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"hYK" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -28817,15 +28664,6 @@
/obj/machinery/atm,
/turf/open/floor/iron/white,
/area/station/medical/medbay/lobby)
-"inn" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/structure/chair/comfy/black{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"int" = (
/obj/effect/landmark/event_spawn,
/obj/structure/disposalpipe/segment,
@@ -29898,10 +29736,6 @@
},
/turf/open/space/basic,
/area/space/nearstation)
-"iEF" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/turf/open/floor/circuit/telecomms,
-/area/station/science/xenobiology)
"iEO" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -31400,15 +31234,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plating,
/area/station/maintenance/central/greater)
-"jcm" = (
-/obj/structure/disposaloutlet{
- dir = 8
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"jcq" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/chair/stool/directional/east,
@@ -31743,6 +31568,16 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"jhk" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"jhs" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 5
@@ -31897,13 +31732,6 @@
/obj/structure/cable,
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai)
-"jkd" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light/directional/south,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"jkq" = (
/obj/effect/turf_decal/tile/brown/half/contrasted{
dir = 4
@@ -32556,9 +32384,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
},
-/obj/item/kirbyplants{
- icon_state = "plant-10"
- },
+/obj/machinery/slime_extract_requestor,
/turf/open/floor/iron/white,
/area/station/science/lobby)
"jur" = (
@@ -33102,25 +32928,6 @@
/obj/structure/disposalpipe/trunk,
/turf/open/floor/iron/dark,
/area/station/service/hydroponics)
-"jDF" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/east{
- name = "Containment Pen #5";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/west{
- name = "Containment Pen #5";
- req_access = list("xenobiology")
- },
-/obj/structure/disposalpipe/segment{
- dir = 5
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez5";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"jDN" = (
/obj/structure/table/wood,
/obj/item/storage/photo_album/chapel,
@@ -33358,7 +33165,7 @@
id = "containdeez2";
name = "Cell Containment Toggle Button"
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"jHi" = (
/obj/machinery/vending/wardrobe/viro_wardrobe,
@@ -34729,19 +34536,7 @@
/turf/open/floor/carpet,
/area/station/security/detectives_office)
"keT" = (
-/obj/machinery/door/airlock/research{
- glass = 1;
- name = "Slime Euthanization Chamber";
- opacity = 0
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
-/obj/effect/mapping_helpers/airlock/access/all/science/xenobio,
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/purple/filled/line{
- dir = 8
- },
+/obj/machinery/plumbing/ooze_compressor,
/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"kfl" = (
@@ -35054,12 +34849,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/office)
-"kkx" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"kkK" = (
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{
dir = 6
@@ -35075,7 +34864,7 @@
c_tag = "Science - Xenobiology North";
network = list("ss13","rd")
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"kkP" = (
/obj/structure/bookcase/random/religion,
@@ -36713,7 +36502,8 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"kMl" = (
/obj/effect/turf_decal/trimline/blue/filled/corner{
@@ -37060,12 +36850,6 @@
/turf/open/floor/iron/showroomfloor,
/area/station/security/warden)
"kQM" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
/obj/machinery/disposal/bin,
/obj/structure/sign/warning/deathsposal/directional/west,
/obj/structure/disposalpipe/trunk{
@@ -37075,7 +36859,10 @@
c_tag = "Science - Xenobiology West";
network = list("ss13","rd")
},
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"kQX" = (
/obj/machinery/computer/security{
@@ -37212,6 +36999,10 @@
},
/turf/open/floor/wood,
/area/station/command/meeting_room)
+"kTh" = (
+/obj/machinery/duct,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"kTi" = (
/obj/machinery/duct,
/obj/structure/cable,
@@ -38191,25 +37982,6 @@
/obj/effect/turf_decal/trimline/white/warning,
/turf/open/floor/iron,
/area/station/maintenance/tram/mid)
-"lhS" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/north{
- name = "Containment Pen #3";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/south{
- name = "Containment Pen #3";
- req_access = list("xenobiology")
- },
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez3";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"lhT" = (
/obj/structure/cable/multilayer/connected,
/obj/effect/decal/cleanable/dirt,
@@ -39167,11 +38939,16 @@
/turf/open/floor/iron/white,
/area/station/science/lower)
"lym" = (
-/obj/machinery/monkey_recycler,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/machinery/biomass_recycler,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/obj/item/stack/biomass,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"lyq" = (
/obj/effect/decal/cleanable/dirt,
@@ -39216,7 +38993,11 @@
/area/station/science/ordnance/storage)
"lyQ" = (
/obj/effect/turf_decal/trimline/purple/filled/line,
-/turf/open/floor/iron/white,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 1
+ },
+/obj/machinery/duct,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"lyR" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -40656,6 +40437,10 @@
},
/turf/open/floor/glass/reinforced,
/area/station/ai_monitored/turret_protected/aisat/hallway)
+"lYq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"lYr" = (
/obj/structure/table,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -41472,9 +41257,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"mln" = (
-/turf/open/floor/circuit/telecomms,
-/area/station/science/xenobiology)
"mlu" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/airlock/external{
@@ -42038,22 +41820,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"muf" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/east{
- name = "Containment Pen #3";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/west{
- name = "Containment Pen #3";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez3";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"mur" = (
/obj/effect/turf_decal/trimline/brown/filled/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -42413,12 +42179,10 @@
/turf/open/floor/iron/smooth,
/area/station/maintenance/starboard/greater)
"mBm" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez1";
- name = "Xenobiology Containment Blast Door"
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
},
-/turf/open/floor/plating,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mBq" = (
/turf/closed/wall/r_wall,
@@ -43017,11 +42781,12 @@
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"mLE" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mLM" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -43244,7 +43009,7 @@
id = "containdeez6";
name = "Cell Containment Toggle Button"
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mPm" = (
/obj/effect/decal/cleanable/dirt,
@@ -43506,19 +43271,11 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/engineering)
"mTR" = (
+/obj/machinery/light/floor/has_bulb,
/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/structure/reagent_dispensers/watertank,
-/obj/item/extinguisher{
- pixel_x = 4;
- pixel_y = 3
+ dir = 6
},
-/obj/item/extinguisher,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"mUd" = (
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{
@@ -43895,12 +43652,10 @@
/turf/open/floor/circuit,
/area/station/ai_monitored/turret_protected/ai_upload)
"nbI" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez7";
- name = "Xenobiology Containment Blast Door"
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
},
-/turf/open/floor/plating,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"nbK" = (
/obj/machinery/atmospherics/components/unary/thermomachine/freezer{
@@ -44338,7 +44093,8 @@
/area/station/security/brig)
"njf" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"njl" = (
/obj/machinery/duct,
@@ -45730,7 +45486,10 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"nEF" = (
/obj/structure/table/glass,
@@ -46062,8 +45821,9 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 9
},
-/obj/machinery/smartfridge/extract/preloaded,
-/turf/open/floor/iron/white,
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"nLK" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -47325,6 +47085,12 @@
/obj/structure/table,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"ohh" = (
+/obj/machinery/corral_corner{
+ mapping_id = "6"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"oho" = (
/obj/structure/bookcase,
/turf/open/floor/wood,
@@ -48570,17 +48336,6 @@
/obj/effect/spawner/random/trash/food_packaging,
/turf/open/floor/catwalk_floor,
/area/station/maintenance/starboard/central)
-"oCY" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"oDd" = (
/obj/effect/turf_decal/siding/white{
dir = 1
@@ -49055,6 +48810,11 @@
"oNd" = (
/turf/open/floor/mineral/titanium/blue,
/area/station/maintenance/starboard/central)
+"oNg" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"oNp" = (
/obj/structure/sink{
pixel_y = 15
@@ -49811,6 +49571,9 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
+"pbt" = (
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"pby" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -49974,18 +49737,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/security/prison/safe)
-"pet" = (
-/obj/structure/window/reinforced/spawner/directional/west,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/obj/machinery/button/door{
- id = "containdeez1";
- name = "Cell Containment Toggle Button"
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"peO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron/showroomfloor,
@@ -50294,6 +50045,15 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/construction/engineering)
+"pkQ" = (
+/obj/machinery/corral_corner{
+ mapping_id = "3"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "3"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"pkU" = (
/obj/effect/turf_decal/trimline/green/corner{
dir = 1
@@ -50590,7 +50350,7 @@
dir = 4
},
/obj/machinery/light/directional/east,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"ppr" = (
/obj/machinery/computer/security{
@@ -51693,11 +51453,8 @@
/turf/open/floor/iron,
/area/station/security/checkpoint/supply)
"pEa" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 8;
- name = "killroom vent"
- },
-/turf/open/floor/circuit/telecomms,
+/obj/machinery/slime_market_pad,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"pEe" = (
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -52714,6 +52471,15 @@
/obj/effect/turf_decal/siding/thinplating/corner,
/turf/open/floor/iron/dark,
/area/station/science/xenobiology)
+"pUb" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "1";
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/mob/living/basic/slime,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"pUj" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 10
@@ -52987,12 +52753,11 @@
/turf/open/floor/iron/dark/textured_large,
/area/station/bitrunning/den)
"pYZ" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"pZd" = (
/obj/machinery/door/airlock/maintenance_hatch{
@@ -53734,7 +53499,12 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"qlk" = (
/obj/machinery/atmospherics/components/unary/cryo_cell{
@@ -54327,15 +54097,6 @@
/obj/effect/spawner/random/engineering/flashlight,
/turf/open/floor/iron/smooth,
/area/station/maintenance/starboard/lesser)
-"qvF" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"qvK" = (
/obj/structure/chair/office/light,
/obj/effect/turf_decal/trimline/blue/filled/corner{
@@ -54520,6 +54281,14 @@
/obj/effect/turf_decal/trimline/neutral/filled/corner,
/turf/open/floor/iron,
/area/station/security/courtroom)
+"qyA" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "6";
+ dir = 2
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"qyI" = (
/obj/effect/landmark/tram/tramstation/east,
/turf/open/floor/noslip/tram_plate,
@@ -54793,7 +54562,7 @@
},
/obj/machinery/power/apc/auto_name/directional/north,
/obj/structure/cable,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"qCX" = (
/obj/effect/turf_decal/stripes/line{
@@ -55503,12 +55272,6 @@
},
/turf/open/floor/iron,
/area/station/hallway/secondary/entry)
-"qNF" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"qNI" = (
/turf/closed/wall,
/area/station/medical/medbay/central)
@@ -56140,13 +55903,13 @@
/turf/open/floor/iron,
/area/station/maintenance/tram/mid)
"qXs" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
+/obj/machinery/corral_corner{
+ mapping_id = "6"
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
+/obj/machinery/slime_pen_controller{
+ mapping_id = "6"
},
-/turf/open/floor/iron/white,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"qXI" = (
/obj/effect/turf_decal/trimline/dark_red/warning{
@@ -56190,6 +55953,10 @@
/obj/item/stack/sheet/glass/fifty,
/turf/open/floor/iron,
/area/station/construction/mining/aux_base)
+"qYk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"qYx" = (
/obj/machinery/door/airlock{
id_tag = "Toilet5";
@@ -56493,7 +56260,6 @@
/turf/open/floor/catwalk_floor,
/area/station/command/gateway)
"rbU" = (
-/obj/effect/turf_decal/stripes/line,
/obj/effect/turf_decal/stripes/corner{
dir = 4
},
@@ -56502,7 +56268,10 @@
c_tag = "Science - Xenobiology East";
network = list("ss13","rd")
},
-/turf/open/floor/iron/white,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"rbZ" = (
/obj/effect/mine/sound,
@@ -56609,7 +56378,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/cable,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"rem" = (
/obj/machinery/button/door/directional/west{
@@ -57318,16 +57087,11 @@
/turf/open/floor/iron,
/area/station/engineering/main)
"roQ" = (
+/obj/machinery/light/floor/has_bulb,
/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/corner,
-/obj/structure/extinguisher_cabinet/directional/south,
-/obj/machinery/camera/directional/south{
- c_tag = "Science - Xenobiology South";
- network = list("ss13","rd")
+ dir = 10
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"roR" = (
/turf/closed/wall,
@@ -59068,12 +58832,6 @@
},
/turf/open/floor/iron,
/area/station/security/processing)
-"rTt" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"rTz" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 8
@@ -59561,7 +59319,11 @@
/obj/effect/turf_decal/trimline/purple/filled/corner{
dir = 1
},
-/turf/open/floor/iron/white,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"scZ" = (
/obj/structure/flora/bush/flowers_yw/style_random,
@@ -60054,6 +59816,13 @@
},
/turf/open/misc/asteroid,
/area/station/security/prison/workout)
+"slz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/closed/wall/r_wall,
+/area/station/asteroid)
"slA" = (
/obj/effect/turf_decal/sand/plating,
/obj/machinery/door/airlock/grunge{
@@ -60105,14 +59874,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/station/security/prison/workout)
-"sml" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez3";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"smA" = (
/obj/structure/chair/stool/directional/north,
/obj/structure/cable,
@@ -60833,6 +60594,15 @@
"syv" = (
/turf/closed/wall/r_wall,
/area/station/security/checkpoint/science)
+"syx" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"syE" = (
/obj/machinery/rnd/production/circuit_imprinter/department/science,
/obj/effect/turf_decal/stripes/line{
@@ -62926,13 +62696,6 @@
/obj/machinery/bci_implanter,
/turf/open/floor/iron,
/area/station/science/lower)
-"tfL" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"tfQ" = (
/obj/structure/table/reinforced,
/obj/structure/window/reinforced/spawner/directional/south,
@@ -63126,7 +62889,7 @@
dir = 8
},
/obj/machinery/light/directional/west,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"tiz" = (
/obj/structure/disposalpipe/sorting/mail{
@@ -63184,11 +62947,8 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/exit/departure_lounge)
"tjz" = (
-/obj/machinery/atmospherics/components/unary/passive_vent{
- dir = 4;
- name = "killroom vent"
- },
-/turf/open/floor/circuit/telecomms,
+/obj/machinery/smartfridge/extract/preloaded,
+/turf/open/floor/iron/white,
/area/station/science/xenobiology)
"tjA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
@@ -63212,10 +62972,10 @@
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
"tjP" = (
-/obj/effect/turf_decal/stripes/corner{
+/obj/effect/turf_decal/stripes/line{
dir = 8
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"tjS" = (
/obj/machinery/conveyor{
@@ -63337,10 +63097,6 @@
/turf/open/floor/plating,
/area/station/asteroid)
"tlt" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
@@ -63350,7 +63106,7 @@
receive_ore_updates = 1;
supplies_requestable = 1
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"tlw" = (
/obj/effect/decal/cleanable/dirt,
@@ -64131,12 +63887,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/iron,
/area/station/security/brig)
-"txM" = (
-/obj/structure/disposalpipe/segment{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"txS" = (
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
@@ -64188,11 +63938,8 @@
/turf/open/floor/iron,
/area/station/hallway/secondary/service)
"tzq" = (
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/obj/structure/disposalpipe/trunk{
- dir = 4
+/obj/machinery/corral_corner{
+ mapping_id = "1"
},
/turf/open/floor/engine,
/area/station/science/xenobiology)
@@ -66369,7 +66116,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 8
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"uld" = (
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -66556,7 +66303,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/structure/disposalpipe/segment,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"uov" = (
/turf/closed/wall/r_wall,
@@ -67030,18 +66777,6 @@
"uvv" = (
/turf/closed/wall/rock/porous,
/area/station/science/xenobiology)
-"uvy" = (
-/obj/structure/window/reinforced/spawner,
-/obj/structure/table,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/button/door{
- id = "containdeez3";
- name = "Cell Containment Toggle Button"
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"uvD" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/soap,
@@ -67250,13 +66985,13 @@
/turf/open/floor/iron,
/area/station/commons/dorms)
"uyb" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
+/obj/machinery/corral_corner{
+ mapping_id = "4"
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
+/obj/machinery/slime_pen_controller{
+ mapping_id = "4"
},
-/turf/open/floor/iron/white,
+/turf/open/floor/engine,
/area/station/science/xenobiology)
"uyd" = (
/obj/structure/table,
@@ -67410,14 +67145,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/commons/storage/primary)
-"uAF" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez5";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/plating,
-/area/station/science/xenobiology)
"uAK" = (
/obj/effect/turf_decal/trimline/red/filled/corner,
/turf/open/floor/iron/dark,
@@ -67789,15 +67516,6 @@
},
/turf/open/openspace,
/area/station/hallway/primary/tram/center)
-"uGU" = (
-/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{
- dir = 8;
- initialize_directions = 4;
- name = "euthanization chamber freezer"
- },
-/obj/effect/turf_decal/trimline/purple/filled/line,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"uGW" = (
/turf/closed/wall,
/area/station/cargo/miningdock)
@@ -68176,22 +67894,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/station/security/execution/transfer)
-"uLX" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/door/window/left/directional/east{
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/window/left/directional/west{
- name = "Containment Pen #7";
- req_access = list("xenobiology")
- },
-/obj/machinery/door/poddoor/preopen{
- id = "containdeez7";
- name = "Xenobiology Containment Blast Door"
- },
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"uMg" = (
/obj/structure/table,
/obj/item/radio/intercom,
@@ -69868,7 +69570,7 @@
dir = 8
},
/obj/machinery/disposal/bin,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"vmB" = (
/obj/effect/turf_decal/tile/neutral{
@@ -70672,6 +70374,12 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron/dark,
/area/station/security/interrogation)
+"vxy" = (
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"vxD" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery/white{
@@ -71307,12 +71015,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/engineering/gravity_generator)
-"vHi" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"vHl" = (
/obj/effect/turf_decal/trimline/yellow/filled/warning{
dir = 8
@@ -71878,6 +71580,15 @@
},
/turf/open/floor/iron,
/area/station/engineering/atmos)
+"vRp" = (
+/obj/machinery/corral_corner{
+ mapping_id = "2"
+ },
+/obj/machinery/slime_pen_controller{
+ mapping_id = "2"
+ },
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"vRq" = (
/obj/effect/turf_decal/trimline/yellow/filled/corner{
dir = 1
@@ -72801,7 +72512,7 @@
/obj/structure/disposalpipe/segment{
dir = 5
},
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"whi" = (
/obj/effect/turf_decal/siding/wood{
@@ -72927,17 +72638,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/station/service/chapel/monastery)
-"wjK" = (
-/obj/structure/window/reinforced/spawner/directional/east,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/obj/structure/disposalpipe/trunk{
- dir = 4
- },
-/obj/machinery/disposal/bin,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"wjP" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -73514,13 +73214,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/smooth,
/area/station/maintenance/department/cargo)
-"wsT" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/light/directional/north,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"wts" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 4
@@ -73834,13 +73527,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron,
/area/station/cargo/drone_bay)
-"wxE" = (
-/obj/structure/disposaloutlet{
- dir = 4
- },
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/engine,
-/area/station/science/xenobiology)
"wxJ" = (
/obj/machinery/suit_storage_unit/engine,
/obj/effect/turf_decal/bot{
@@ -74208,12 +73894,6 @@
},
/turf/open/floor/iron,
/area/station/security/processing)
-"wCv" = (
-/obj/machinery/disposal/bin,
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/disposalpipe/trunk,
-/turf/open/floor/iron/white,
-/area/station/science/xenobiology)
"wCT" = (
/obj/effect/turf_decal/stripes/white/line{
dir = 8
@@ -74339,15 +74019,11 @@
/turf/open/floor/iron/dark/corner,
/area/station/science/robotics/mechbay)
"wET" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 1
},
/obj/item/radio/intercom/directional/north,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"wEV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -74709,6 +74385,16 @@
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/medical/morgue)
+"wKI" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/stone,
+/area/station/science/xenobiology)
"wLl" = (
/obj/effect/turf_decal/trimline/green/filled/corner{
dir = 4
@@ -75173,7 +74859,11 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 5
},
-/turf/open/floor/iron/white,
+/obj/machinery/light/floor/has_bulb,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"wUv" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
@@ -75605,7 +75295,7 @@
"xcM" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"xdw" = (
/obj/machinery/portable_atmospherics/scrubber,
@@ -76236,6 +75926,14 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/station/science/lower)
+"xox" = (
+/obj/machinery/plumbing/ooze_sucker{
+ mapping_id = "2";
+ dir = 1
+ },
+/obj/machinery/light/floor/has_bulb,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"xoM" = (
/obj/structure/chair/stool/bar/directional/east,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -76544,11 +76242,12 @@
/turf/open/floor/iron/dark,
/area/station/science/lower)
"xuI" = (
-/obj/effect/turf_decal/stripes/corner{
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/duct,
+/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron/white,
+/turf/open/floor/stone,
/area/station/science/xenobiology)
"xuL" = (
/obj/effect/decal/cleanable/dirt,
@@ -77716,6 +77415,10 @@
/obj/machinery/light/small/directional/south,
/turf/open/floor/iron/smooth,
/area/station/maintenance/tram/left)
+"xQh" = (
+/obj/machinery/duct,
+/turf/open/floor/engine,
+/area/station/science/xenobiology)
"xQv" = (
/turf/closed/wall/r_wall,
/area/station/construction/mining/aux_base)
@@ -122735,13 +122438,13 @@ qVr
qVr
qVr
qVr
-eiR
+slz
gmN
bfH
bfH
jTC
lIY
-pML
+mwK
qVr
qVr
qVr
@@ -122988,18 +122691,18 @@ oyV
dUT
qHK
qVr
-wxE
-fAm
-hdA
-qVr
+fkf
+bfH
+bfH
+fkf
qVr
fUz
rkI
fFu
jQE
lIY
-qVr
-qVr
+tzq
+bfH
bfH
bfH
tzq
@@ -123245,21 +122948,21 @@ oNT
dUT
gdC
qVr
-ayN
-aJT
-ahk
-hdA
+bfH
+bfH
+bfH
+bfH
mBm
kQM
jHg
-dne
+tjP
vmz
hik
-sml
bfH
bfH
-aJT
-jkd
+bfH
+bfH
+bfH
qVr
aaa
aaa
@@ -123504,19 +123207,19 @@ mfY
qVr
bfH
bfH
-asv
-cSj
+cml
+xQh
cim
-rTt
-whn
-whn
-whn
-tjP
-uvy
-muf
-asv
-kkx
-txM
+kTh
+kTh
+kTh
+kTh
+eGt
+xQh
+xQh
+pUb
+bfH
+dgR
qVr
aaa
aaa
@@ -123759,21 +123462,21 @@ hfP
uKt
uKt
qVr
-qVr
+fkf
+bfH
bfH
-fPv
uyb
xuI
+qYk
+qYk
+qYk
+qYk
njf
-njf
-njf
-njf
-njf
-tfL
-hPB
-lhS
-txM
-qVr
+bfH
+xQh
+bfH
+bfH
+bfH
qVr
aaa
aaa
@@ -124015,26 +123718,26 @@ dUT
vtq
fGZ
vtq
-xHw
+iix
qVr
-mBm
-pet
+syx
+tjP
pYZ
aqB
cVX
gNr
lym
pph
-aet
-whn
-tjP
-oCY
-sml
-qVr
-aaa
-aaa
-aaa
-aaa
+wKI
+eCA
+xQh
+bfH
+bfH
+tzq
+hee
+hee
+hee
+hee
aaa
aaa
vXM
@@ -124275,7 +123978,7 @@ qVr
qVr
qVr
tlt
-inn
+pbt
xcM
lyQ
jiQ
@@ -124287,10 +123990,10 @@ nED
aet
tjP
roQ
-qVr
-qVr
-qVr
-qVr
+pkQ
+bfH
+bfH
+bvm
qVr
aaa
aaa
@@ -124532,21 +124235,21 @@ vud
tml
qVr
qCW
-whn
+pbt
xcM
-lyQ
-asv
-mln
+dtN
+whn
+whn
tjz
asv
xta
oYQ
gCY
-whn
+pbt
exH
-ahl
bfH
bfH
+aJT
bfH
qVr
aaa
@@ -124791,20 +124494,20 @@ uiC
rdU
uon
whd
-hDT
+dtN
keT
-iEF
+whn
fof
aMB
sXX
akC
kMh
-whn
+kTh
eGt
-bql
+xQh
+xQh
+dZn
bfH
-bfH
-dgR
qVr
aaa
aaa
@@ -125046,22 +124749,22 @@ nPB
dGk
qVr
kkL
-whn
+pbt
dQK
-uGU
-asv
-mln
+dtN
+whn
+whn
pEa
asv
oAf
rhn
gCY
-whn
-wCv
-cyY
-fAm
-fAm
-fqM
+pbt
+exH
+bfH
+bfH
+bfH
+bfH
qVr
aaa
aaa
@@ -125303,7 +125006,7 @@ qVr
qVr
qVr
wET
-eQm
+pbt
cyU
cZE
jiQ
@@ -125315,10 +125018,10 @@ gJY
scO
bgH
mTR
-qVr
-qVr
-qVr
-qVr
+bvm
+bfH
+bfH
+bvm
qVr
aaa
aaa
@@ -125559,24 +125262,24 @@ bjQ
igS
uNT
qVr
-nbI
-wjK
-cue
+eDO
+bgH
+bgH
qlf
hYx
ulb
dOq
tix
-scO
-whn
-bgH
-aPz
-uAF
-qVr
-aaa
-aaa
-aaa
-aaa
+jhk
+vRp
+xQh
+bfH
+bfH
+vxy
+hee
+hee
+hee
+hee
aaa
aaa
aaa
@@ -125815,21 +125518,21 @@ hCv
grh
okh
qVr
-qVr
-kkx
-cJP
+ohh
+bfH
+bfH
qXs
mLE
-dGs
-dGs
-dGs
-dGs
-dGs
-ahp
-qvF
-fQo
+lYq
+lYq
+lYq
+lYq
+oNg
+bfH
+xQh
+bfH
+bfH
bfH
-qVr
qVr
aaa
aaa
@@ -126072,21 +125775,21 @@ kVf
sLd
vmk
qVr
-kkx
-txM
-asv
-uLX
-gPD
-qNF
-whn
-whn
-whn
-bgH
-hcn
-jDF
-asv
bfH
bfH
+qyA
+xQh
+cim
+kTh
+kTh
+kTh
+kTh
+eGt
+xQh
+xQh
+xox
+bfH
+dgR
qVr
aaa
aaa
@@ -126329,21 +126032,21 @@ ebs
hFH
tYB
qVr
-wsT
-aJT
+bfH
+bfH
bfH
bfH
nbI
deh
bvL
-vHi
+bgH
mPb
rbU
-uAF
-ahk
-hdA
+bfH
+bfH
+bfH
aJT
-dgR
+bfH
qVr
aaa
aaa
@@ -126586,21 +126289,21 @@ xOs
wdr
nrh
qVr
-jcm
+ohh
bfH
bfH
-qVr
+ohh
qVr
qVr
wdD
tXW
vTx
qVr
-qVr
-qVr
-ahk
-fAm
-fqM
+vxy
+bfH
+bfH
+bfH
+vxy
qVr
aaa
aaa
@@ -126847,13 +126550,13 @@ qVr
qVr
qVr
qVr
-aaa
+hee
qVr
jTC
bfH
bfH
qVr
-aaa
+hee
qVr
qVr
qVr
diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm
index dbc04bc5c266..751488dbff04 100644
--- a/_maps/templates/lazy_templates/nukie_base.dmm
+++ b/_maps/templates/lazy_templates/nukie_base.dmm
@@ -319,7 +319,6 @@
/obj/effect/turf_decal/stripes/end{
dir = 4
},
-/obj/machinery/processor/slime,
/turf/open/floor/mineral/titanium/tiled/yellow,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"ek" = (
@@ -2041,7 +2040,7 @@
/turf/open/space/basic,
/area/space/nearstation)
"zR" = (
-/mob/living/simple_animal/slime,
+/mob/living/basic/slime,
/turf/open/floor/circuit/red/off,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"zT" = (
@@ -3259,7 +3258,6 @@
/turf/open/floor/iron/smooth,
/area/centcom/syndicate_mothership/control)
"Mv" = (
-/obj/machinery/computer/camera_advanced/xenobio,
/obj/structure/noticeboard/directional/east,
/turf/open/floor/mineral/plastitanium,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
@@ -3460,7 +3458,6 @@
/obj/effect/turf_decal/stripes/end{
dir = 8
},
-/obj/machinery/monkey_recycler,
/turf/open/floor/mineral/titanium/tiled/yellow,
/area/centcom/syndicate_mothership/expansion_bioterrorism)
"Pc" = (
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
index 2466f770827e..55991a2ded55 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
@@ -105,6 +105,8 @@
///from base of mob/living/Stun() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_STUN "living_stun"
+///from mob/living/carbon/enter_stamina_stun()
+#define COMSIG_LIVING_STAMINA_STUN "carbon_stamina_stun"
///from base of mob/living/Knockdown() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
///from base of mob/living/Paralyze() (amount, ignore_canstun)
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index a33ccb140e05..af7d22f4a911 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define ismouse(A) (istype(A, /mob/living/basic/mouse))
-#define isslime(A) (istype(A, /mob/living/simple_animal/slime))
+#define isslime(A) (istype(A, /mob/living/basic/slime))
#define isdrone(A) (istype(A, /mob/living/basic/drone))
diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm
new file mode 100644
index 000000000000..2030e073340f
--- /dev/null
+++ b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm
@@ -0,0 +1,25 @@
+#define COMSIG_MOB_STOP_HUNGER "stop_hunger_mob"
+#define COMSIG_MOB_START_HUNGER "start_hunger_mob"
+#define COMSIG_MOB_FEED "feed_hunger_mob"
+#define COMSIG_MOB_FED_ON "fed_on_mob"
+#define COMSIG_MOB_RETURN_HUNGER "return_hunger_mob"
+#define COMSIG_MOB_REFUSED_EAT "refused_hunger_mob"
+#define COMSIG_MOB_OVERATE "overate_hunger_mob"
+#define COMSIG_MOB_EAT_NORMAL "normal_eat_hunger_mob"
+#define COMSIG_MOB_STARVING "starving_hunger_mob"
+#define COMSIG_MOB_FULLY_STARVING "full_starve_hunger_mob"
+#define COMSIG_SECRETION_UPDATE "secretion_update"
+#define COMSIG_FEEDING_CHECK "latch_check"
+#define COMSIG_HUNGER_UPDATED "update_hunger_mob"
+#define COMSIG_LIVING_ATE "living_ate_object"
+#define COMSIG_MOB_ADJUST_HUNGER "adjust_hunger_mob"
+
+#define COMSIG_EMOTION_STORE "store_emotion"
+#define EMOTION_BUFFER_SPEAK_FROM_BUFFER "release_emotion"
+#define COMSIG_EMOTION_HEARD "heard_emotion"
+#define EMOTION_BUFFER_UPDATE_OVERLAY_STATES "update_emotion_overlay"
+
+#define COMSIG_ATOM_JOIN_STACK "join_stack"
+#define COMSIG_STACK_MOVE "stack_move"
+#define COMSIG_CHECK_CAN_ADD_NEW_STACK "check_stack_add"
+#define COMSIG_MOBSTACKER_DESTROY "mobstack_destroy_stack"
diff --git a/code/__DEFINES/~monkestation/slimes.dm b/code/__DEFINES/~monkestation/slimes.dm
new file mode 100644
index 000000000000..1ae2801be222
--- /dev/null
+++ b/code/__DEFINES/~monkestation/slimes.dm
@@ -0,0 +1,91 @@
+#define ADULT_SLIME (1<<0)
+#define PASSIVE_SLIME (1<<1)
+#define STORED_SLIME (1<<2)
+#define MUTATING_SLIME (1<<3)
+#define SPLITTING_SLIME (1<<4)
+#define CLEANER_SLIME (1<<5)
+#define OVERWRITES_COLOR (1<<6)
+#define NOEVOLVE_SLIME (1<<7)
+#define NOOOZE_SLIME (1<<8)
+
+#define TRAIT_ON_DEATH (1<<0)
+#define TRAIT_VISUAL (1<<1)
+
+#define TRAIT_MUTATOR_USED "mutator_trait"
+#define TRAIT_IN_STACK "inside_mob_stack"
+#define TRAIT_FEEDING "feeding_trait"
+#define LATCH_TRAIT "latch_trait"
+#define TRAIT_LATCH_FEEDERED "feeder_targetted"
+
+#define BB_BASIC_MOB_SCARED_ITEM "BB_basic_mob_scared_item"
+#define BB_WONT_TARGET_CLIENTS "BB_wont_target_clients"
+
+#define TRAIT_CAREFUL_STEPS "careful_steps"
+#define TRAIT_SLIME_STASIS "slime_stasis"
+#define TRAIT_SLIME_RABID "slime_rabid"
+#define TRAIT_SLIME_DUST_IMMUNE "slime_dust_immune"
+#define COMSIG_ATOM_SUCKED "atom_sucked"
+
+#define TRAIT_OVERFED "overfed_trait"
+#define VACPACK_THROW "vacpack_throw"
+
+///from obj/item/vacuum_nozzle/afterattack(atom/movable/target, mob/user, proximity, params): (obj/item/vacuum_nozzle/nozzle, mob/user)
+#define COMSIG_LIVING_VACUUM_PRESUCK "living_vacuum_presuck"
+ #define COMPONENT_LIVING_VACUUM_CANCEL_SUCK (1<<0)
+
+#define SLIME_VALUE_TIER_1 200
+#define SLIME_VALUE_TIER_2 400
+#define SLIME_VALUE_TIER_3 800
+#define SLIME_VALUE_TIER_4 1600
+#define SLIME_VALUE_TIER_5 3200
+#define SLIME_VALUE_TIER_6 6400
+#define SLIME_VALUE_TIER_7 12800
+
+#define SLIME_SELL_MODIFIER_MIN -0.08
+#define SLIME_SELL_MODIFIER_MAX -0.01
+#define SLIME_SELL_OTHER_MODIFIER_MIN 0.005
+#define SLIME_SELL_OTHER_MODIFIER_MAX 0.01
+#define SLIME_SELL_MAXIMUM_MODIFIER 2
+#define SLIME_SELL_MINIMUM_MODIFIER 0.1
+#define SLIME_RANDOM_MODIFIER_MIN -0.0003
+#define SLIME_RANDOM_MODIFIER_MAX 0.0003
+
+
+#define EMOTION_HAPPY "happy"
+#define EMOTION_SAD "sad"
+#define EMOTION_SCARED "scared"
+#define EMOTION_FUNNY "funny"
+#define EMOTION_ANGER "anger"
+#define EMOTION_SUPRISED "suprised"
+#define EMOTION_HUNGRY "hungry"
+
+///key that holds decals we hunt
+#define BB_CLEANABLE_DECALS "cleanable_decals"
+///key that holds blood we hunt
+#define BB_CLEANABLE_BLOOD "cleanable_blood"
+///key that holds pests we hunt
+#define BB_HUNTABLE_PESTS "huntable_pests"
+///key that holds drawings we hunt
+#define BB_CLEANABLE_DRAWINGS "cleanable_drawings"
+///Key that holds our clean target
+#define BB_CLEAN_TARGET "clean_target"
+///key that holds trash we will burn
+#define BB_HUNTABLE_TRASH "huntable_trash"
+
+
+#define FOOD_CHANGE "food_change"
+#define ENVIRONMENT_CHANGE "enviro_change"
+#define BEHAVIOUR_CHANGE "behaviour_change"
+#define DANGEROUS_CHANGE "dangerous_change"
+#define DOCILE_CHANGE "docile_change"
+
+#define FRIENDSHIP_HATED "hated"
+#define FRIENDSHIP_DISLIKED "disliked"
+#define FRIENDSHIP_STRANGER "stranger"
+#define FRIENDSHIP_NEUTRAL "neutral"
+#define FRIENDSHIP_ACQUAINTANCES "acquaintances"
+#define FRIENDSHIP_FRIEND "friend"
+#define FRIENDSHIP_BESTFRIEND "bestfriend"
+
+#define COMSIG_FRIENDSHIP_CHECK_LEVEL "friendship_check_level"
+#define COMSIG_FRIENDSHIP_CHANGE "friendship_change"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 6b6dca84f290..07ffc03e49a6 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -638,7 +638,7 @@ GLOBAL_LIST_EMPTY(species_list)
moblist += mob_to_sort
for(var/mob/dead/new_player/mob_to_sort in sortmob)
moblist += mob_to_sort
- for(var/mob/living/simple_animal/slime/mob_to_sort in sortmob)
+ for(var/mob/living/basic/slime/mob_to_sort in sortmob)
moblist += mob_to_sort
for(var/mob/living/simple_animal/mob_to_sort in sortmob)
// We've already added slimes.
diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm
index 14241ef8e706..3b674fdc7afb 100644
--- a/code/__HELPERS/paths/path.dm
+++ b/code/__HELPERS/paths/path.dm
@@ -297,6 +297,8 @@
var/incapacitated = FALSE
/// Is our mob incorporeal
var/incorporeal_move = FALSE
+ /// is our mob a xenofauna or slime
+ var/xenofauna_or_slime = FALSE
/// If our mob has a rider, what does it look like
var/datum/can_pass_info/rider_info = null
/// If our mob is buckled to something, what's it like
@@ -346,6 +348,9 @@
src.can_ventcrawl = HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_NUDE)
src.mob_size = living_construct.mob_size
src.incorporeal_move = living_construct.incorporeal_move
+ if(istype(living_construct, /mob/living/basic/slime) || istype(living_construct, /mob/living/basic/xenofauna))
+ src.xenofauna_or_slime = TRUE
+
if(iscameramob(construct_from))
src.camera_type = construct_from.type
src.is_bot = isbot(construct_from)
diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm
index 132beed9b331..160e3e0a4ca3 100644
--- a/code/_globalvars/phobias.dm
+++ b/code/_globalvars/phobias.dm
@@ -55,7 +55,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list(
GLOBAL_LIST_INIT(phobia_mobs, list(
"aliens" = typecacheof(list(
/mob/living/carbon/alien,
- /mob/living/simple_animal/slime,
+ /mob/living/basic/slime,
)),
"anime" = typecacheof(list(/mob/living/basic/guardian)),
"birds" = typecacheof(list(
@@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list(
)),
"aliens" = typecacheof(list(
/mob/living/carbon/alien,
- /mob/living/simple_animal/slime,
+ /mob/living/basic/slime,
)),
"conspiracies" = typecacheof(list(
/mob/living/simple_animal/bot/secbot,
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index f3a4adab662f..9bd238dd8857 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -217,30 +217,6 @@
return SECONDARY_ATTACK_CALL_NORMAL
-/*
- Slimes
- Nothing happening here
-*/
-/mob/living/simple_animal/slime/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers)
- if(isturf(attack_target))
- return ..()
- attack_target.attack_slime(src, modifiers)
-
-/mob/living/simple_animal/slime/resolve_right_click_attack(atom/target, list/modifiers)
- if(isturf(target))
- return ..()
- return target.attack_slime_secondary(src, modifiers)
-
-/atom/proc/attack_slime(mob/user, list/modifiers)
- return
-
-/**
- * Called when a slime mob right clicks an atom (that is not a turf).
- * Returns a SECONDARY_ATTACK_* value.
- */
-/atom/proc/attack_slime_secondary(mob/user, list/modifiers)
- return SECONDARY_ATTACK_CALL_NORMAL
-
/*
Drones
*/
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 1686c6a2ca05..626cb8b3d505 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -267,8 +267,7 @@
movedelay_type = /mob/living/silicon/robot
/datum/config_entry/number/outdated_movedelay/alien_delay
movedelay_type = /mob/living/carbon/alien
-/datum/config_entry/number/outdated_movedelay/slime_delay
- movedelay_type = /mob/living/simple_animal/slime
+
/datum/config_entry/number/outdated_movedelay/animal_delay
movedelay_type = /mob/living/simple_animal
/////////////////////////////////////////////////
diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm
index 735dd1cdc57d..ada6b75ea359 100644
--- a/code/controllers/subsystem/research.dm
+++ b/code/controllers/subsystem/research.dm
@@ -64,11 +64,25 @@ SUBSYSTEM_DEF(research)
/obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL,
)
+ ///our total xenobiology points
+ var/xenobio_points
/// Lookup list for ordnance briefers.
var/list/ordnance_experiments = list()
/// Lookup list for scipaper partners.
var/list/scientific_partners = list()
+ var/list/slime_core_prices = list()
+
+ var/static/list/default_core_prices = list(
+ SLIME_VALUE_TIER_1,
+ SLIME_VALUE_TIER_2,
+ SLIME_VALUE_TIER_3,
+ SLIME_VALUE_TIER_4,
+ SLIME_VALUE_TIER_5,
+ SLIME_VALUE_TIER_6,
+ SLIME_VALUE_TIER_7,
+ )
+
/datum/controller/subsystem/research/Initialize()
point_types = TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES
initialize_all_techweb_designs()
@@ -79,6 +93,7 @@ SUBSYSTEM_DEF(research)
autosort_categories()
error_design = new
error_node = new
+ initialize_slime_prices()
return SS_INIT_SUCCESS
/datum/controller/subsystem/research/fire()
@@ -100,6 +115,19 @@ SUBSYSTEM_DEF(research)
techweb_list.last_income = world.time
+ for(var/core_type in slime_core_prices)
+ var/obj/item/slime_extract/core = core_type
+ var/price_mod = rand(SLIME_RANDOM_MODIFIER_MIN * 1000000, SLIME_RANDOM_MODIFIER_MAX * 1000000) / 1000000
+ var/price_limiter = 1 - ((default_core_prices[initial(core.tier)] * SLIME_SELL_MINIMUM_MODIFIER) / slime_core_prices[core_type])
+ slime_core_prices[core_type] = (1 + price_mod * price_limiter) * slime_core_prices[core_type]
+
+/datum/controller/subsystem/research/proc/initialize_slime_prices()
+ for(var/core_type in subtypesof(/obj/item/slime_extract))
+ var/obj/item/slime_extract/core = core_type
+ if(!initial(core.tier))
+ continue
+ slime_core_prices[core_type] = default_core_prices[initial(core.tier)]
+
/datum/controller/subsystem/research/proc/autosort_categories()
for(var/i in techweb_nodes)
var/datum/techweb_node/I = techweb_nodes[i]
diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm
index 0a63e31edc9c..b1b44d50ec78 100644
--- a/code/datums/ai/_ai_controller.dm
+++ b/code/datums/ai/_ai_controller.dm
@@ -34,7 +34,7 @@ multiple modular subtrees with behaviors
///Stored arguments for behaviors given during their initial creation
var/list/behavior_args = list()
///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans.
- var/pathing_attempts
+ var/consecutive_pathing_attempts
///Can the AI remain in control if there is a client?
var/continue_processing_when_client = FALSE
///distance to give up on target
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
index 15ddc7b264d7..3ab6343e4d49 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm
@@ -3,6 +3,7 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
///do we finish this action after hitting once?
var/terminate_after_action = FALSE
+ var/melee_attacks = TRUE
/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
@@ -36,10 +37,11 @@
controller.set_blackboard_key(hiding_location_key, hiding_target)
- if(hiding_target) //Slap it!
- basic_mob.melee_attack(hiding_target)
- else
- basic_mob.melee_attack(target)
+ if(melee_attacks)
+ if(hiding_target) //Slap it!
+ basic_mob.melee_attack(hiding_target)
+ else
+ basic_mob.melee_attack(target)
if(terminate_after_action)
finish_action(controller, TRUE, target_key)
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
index 2e922d62f09a..23b3a69c4d38 100644
--- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm
@@ -20,6 +20,7 @@
/datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
. = ..()
if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
+ finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key)
return
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
if (QDELETED(target) || !can_see(controller.pawn, target, run_distance))
diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm
index 2b734ca24a92..0be133279f7e 100644
--- a/code/datums/ai/movement/_ai_movement.dm
+++ b/code/datums/ai/movement/_ai_movement.dm
@@ -8,22 +8,25 @@
//Override this to setup the moveloop you want to use
/datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance)
SHOULD_CALL_PARENT(TRUE)
- controller.pathing_attempts = 0
+ controller.consecutive_pathing_attempts = 0
controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance)
moving_controllers[controller] = current_movement_target
/datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller)
- controller.pathing_attempts = 0
+ controller.consecutive_pathing_attempts = 0
moving_controllers -= controller
// We got deleted as we finished an action
if(!QDELETED(controller.pawn))
SSmove_manager.stop_looping(controller.pawn, SSai_movement)
/datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller)
- controller.pathing_attempts++
- if(controller.pathing_attempts >= max_pathing_attempts)
+ controller.consecutive_pathing_attempts++
+ if(controller.consecutive_pathing_attempts >= max_pathing_attempts)
controller.CancelActions()
+/datum/ai_movement/proc/reset_pathing_failures(datum/ai_controller/controller)
+ controller.consecutive_pathing_attempts = 0
+
///Should the movement be allowed to happen? As of writing this, MOVELOOP_SKIP_STEP is defined as (1<<0) so be careful on using (return TRUE) or (can_move = TRUE; return can_move)
/datum/ai_movement/proc/allowed_to_move(datum/move_loop/source)
var/atom/movable/pawn = source.moving
@@ -58,7 +61,8 @@
//Anything to do post movement
/datum/ai_movement/proc/post_move(datum/move_loop/source, succeeded)
SIGNAL_HANDLER
- if(succeeded != FALSE)
- return
var/datum/ai_controller/controller = source.extra_info
+ if(succeeded != MOVELOOP_FAILURE)
+ reset_pathing_failures(controller)
+ return
increment_pathing_failures(controller)
diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm
index 1236a690c96b..d51f233f0ec8 100644
--- a/code/datums/components/plumbing/_plumbing.dm
+++ b/code/datums/components/plumbing/_plumbing.dm
@@ -96,20 +96,27 @@
process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir)
///check who can give us what we want, and how many each of them will give us
-/datum/component/plumbing/proc/process_request(amount, reagent, dir)
- var/list/valid_suppliers = list()
+/datum/component/plumbing/proc/process_request(amount = MACHINE_REAGENT_TRANSFER, reagent, dir)
+ //find the duct to take from
var/datum/ductnet/net
if(!ducts.Find(num2text(dir)))
return
net = ducts[num2text(dir)]
+
+ //find all valid suppliers in the duct
+ var/list/valid_suppliers = list()
for(var/datum/component/plumbing/supplier as anything in net.suppliers)
if(supplier.can_give(amount, reagent, net))
valid_suppliers += supplier
- // Need to ask for each in turn very carefully, making sure we get the total volume. This is to avoid a division that would always round down and become 0
- var/targetVolume = reagents.total_volume + amount
var/suppliersLeft = valid_suppliers.len
+ if(!suppliersLeft)
+ return
+
+ //take an equal amount from each supplier
+ var/currentRequest
+ var/target_volume = reagents.total_volume + amount
for(var/datum/component/plumbing/give as anything in valid_suppliers)
- var/currentRequest = (targetVolume - reagents.total_volume) / suppliersLeft
+ currentRequest = (target_volume - reagents.total_volume) / suppliersLeft
give.transfer_to(src, currentRequest, reagent, net)
suppliersLeft--
@@ -117,14 +124,15 @@
/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net)
if(amount <= 0)
return
-
if(reagent) //only asked for one type of reagent
for(var/datum/reagent/contained_reagent as anything in reagents.reagent_list)
if(contained_reagent.type == reagent)
return TRUE
- else if(reagents.total_volume > 0) //take whatever
+ else if(reagents.total_volume) //take whatever
return TRUE
+ return FALSE
+
///this is where the reagent is actually transferred and is thus the finish point of our process()
/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
if(!reagents || !target || !target.reagents)
diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm
index a8304320bdbd..0e091fa1b48a 100644
--- a/code/datums/components/squashable.dm
+++ b/code/datums/components/squashable.dm
@@ -49,7 +49,7 @@
if(isliving(crossing_movable))
var/mob/living/crossing_mob = crossing_movable
if(crossing_mob.mob_size > MOB_SIZE_SMALL && !(crossing_mob.movement_type & FLYING))
- if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM))
+ if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM) || HAS_TRAIT(crossing_mob, TRAIT_CAREFUL_STEPS))
crossing_mob.visible_message(span_notice("[crossing_mob] carefully steps over [parent_as_living]."), span_notice("You carefully step over [parent_as_living] to avoid hurting it."))
return
if(should_squash)
diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm
index 3201eeff846f..50c89d4a7ccd 100644
--- a/code/datums/elements/basic_eating.dm
+++ b/code/datums/elements/basic_eating.dm
@@ -77,4 +77,6 @@
playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
else
playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ SEND_SIGNAL(eater, COMSIG_LIVING_ATE, target)
+ SEND_SIGNAL(eater, COMSIG_EMOTION_STORE, null, EMOTION_HAPPY, "I ate [target], I really like [target].")
qdel(target)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 29ea9178374b..5c7477e21f88 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -578,14 +578,15 @@
if(!only_pulling && pulledby && moving_diagonally != FIRST_DIAG_STEP && (get_dist(src, pulledby) > 1 || z != pulledby.z)) //separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
-/atom/movable/proc/set_glide_size(target = 8)
+/atom/movable/proc/set_glide_size(target = 8, recursed = FALSE)
if (HAS_TRAIT(src, TRAIT_NO_GLIDE))
return
SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target)
glide_size = target
- for(var/mob/buckled_mob as anything in buckled_mobs)
- buckled_mob.set_glide_size(target)
+ if(!recursed)
+ for(var/mob/buckled_mob as anything in buckled_mobs)
+ buckled_mob.set_glide_size(target, TRUE)
/**
* meant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts)
@@ -641,8 +642,13 @@
if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, entering_loc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
return
else // Else just try to enter the single destination.
- if(!newloc.Enter(src))
- return
+ if(isliving(src))
+ var/mob/living/living = src
+ if(!newloc.Enter(src) && !living.buckled)
+ return
+ else
+ if(!newloc.Enter(src))
+ return
if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
return
diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm
index c38ea186f620..58f9f48d6df0 100644
--- a/code/game/machinery/computer/accounting.dm
+++ b/code/game/machinery/computer/accounting.dm
@@ -21,6 +21,8 @@
for(var/current_account as anything in SSeconomy.bank_accounts_by_id)
var/datum/bank_account/current_bank_account = SSeconomy.bank_accounts_by_id[current_account]
+ if(!current_bank_account.account_job || !current_bank_account)
+ continue
player_accounts += list(list(
"name" = current_bank_account.account_holder,
"job" = current_bank_account.account_job.title,
diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
index 3af357213b7b..ff9a96b7f397 100644
--- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm
@@ -105,26 +105,22 @@
/obj/item/organ/internal/heart/rat/on_insert(mob/living/carbon/receiver)
. = ..()
- if(!. || !ishuman(receiver))
+ if(!ishuman(receiver))
return
var/mob/living/carbon/human/human_receiver = receiver
- if(!human_receiver.can_mutate())
- return
- human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism)
+ if(human_receiver.can_mutate())
+ human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism)
//but 1.5 damage
- if(human_receiver.physiology)
- human_receiver.physiology.damage_resistance -= 50
+ human_receiver.physiology?.damage_resistance -= 50
/obj/item/organ/internal/heart/rat/on_remove(mob/living/carbon/heartless, special)
. = ..()
if(!ishuman(heartless))
return
var/mob/living/carbon/human/human_heartless = heartless
- if(!human_heartless.can_mutate())
- return
- human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism)
- if(human_heartless.physiology)
- human_heartless.physiology.damage_resistance += 50
+ if(human_heartless.can_mutate())
+ human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism)
+ human_heartless.physiology?.damage_resistance += 50
/// you occasionally squeak, and have some rat related verbal tics
/obj/item/organ/internal/tongue/rat
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index b258a8d6f6ea..6096730c2908 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -70,7 +70,7 @@
race = "Humanoid"
// NT knows a lot about slimes, but not aliens. Can identify slimes
- else if(ispath(mobtype, /mob/living/simple_animal/slime))
+ else if(ispath(mobtype, /mob/living/basic/slime))
race = "Slime"
// sometimes M gets deleted prematurely for AIs... just check the job
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 2f8cb369f95a..1a06a960f1bf 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -92,6 +92,9 @@
if(!buckled_mobs)
buckled_mobs = list()
+ if(M.buckled)
+ M.buckled.unbuckle_mob(M)
+
if(!is_buckle_possible(M, force, check_loc))
return FALSE
@@ -193,6 +196,11 @@
if(!has_buckled_mobs())
return
for(var/m in buckled_mobs)
+ if(isliving(m))
+ var/mob/living/living = m
+ if(!living.buckled) //this somehow happens?
+ buckled_mobs -= m
+ continue
unbuckle_mob(m, force)
//Handle any extras after buckling
@@ -239,16 +247,16 @@
return FALSE
// Make sure the target isn't already buckled to something.
- if(target.buckled)
- return FALSE
+ //if(target.buckled)
+ //return FALSE
// Make sure this atom can still have more things buckled to it.
if(LAZYLEN(buckled_mobs) >= max_buckled_mobs)
return FALSE
// Stacking buckling leads to lots of jank and issues, better to just nix it entirely
- if(target.has_buckled_mobs())
- return FALSE
+ //if(target.has_buckled_mobs())
+ //return FALSE
// If the buckle requires restraints, make sure the target is actually restrained.
if(buckle_requires_restraints && !HAS_TRAIT(target, TRAIT_RESTRAINED))
diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
index f03f4fd12faa..2b4f0874ef47 100644
--- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
+++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm
@@ -27,13 +27,11 @@
if(istype(tile))
tile.atmos_spawn_air("o2=500;plasma=500;TEMP=1000") //Make it hot and burny for the new slime
- var/new_colour = pick("red", "orange")
- var/mob/living/simple_animal/slime/pyro = new(tile, new_colour)
- pyro.rabid = TRUE
- pyro.amount_grown = SLIME_EVOLUTION_THRESHOLD
- pyro.Evolve()
- var/datum/action/innate/slime/reproduce/repro_action = new
- repro_action.Grant(pyro)
+ var/new_colour = pick(/datum/slime_color/red, /datum/slime_color/orange)
+ var/mob/living/basic/slime/pyro = new(tile, new_colour)
+ ADD_TRAIT(pyro, TRAIT_SLIME_RABID, "pyro")
+ pyro.maximum_survivable_temperature = INFINITY
+ pyro.apply_temperature_requirements()
var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob(
"Do you want to play as a pyroclastic anomaly slime?",
diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm
index 8cce4e3b66e2..6190201eac31 100644
--- a/code/game/objects/items/circuitboards/computer_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm
@@ -408,11 +408,6 @@
greyscale_colors = CIRCUIT_COLOR_SCIENCE
build_path = /obj/machinery/computer/teleporter
-/obj/item/circuitboard/computer/xenobiology
- name = "Xenobiology Console"
- greyscale_colors = CIRCUIT_COLOR_SCIENCE
- build_path = /obj/machinery/computer/camera_advanced/xenobio
-
/obj/item/circuitboard/computer/scan_consolenew
name = "DNA Console"
greyscale_colors = CIRCUIT_COLOR_SCIENCE
diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
index 89f3edfb4c8a..49d821a8cd81 100644
--- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
@@ -962,20 +962,6 @@
/datum/stock_part/micro_laser = 1,
/obj/item/stack/sheet/glass = 1)
-/obj/item/circuitboard/machine/monkey_recycler
- name = "Monkey Recycler"
- greyscale_colors = CIRCUIT_COLOR_SCIENCE
- build_path = /obj/machinery/monkey_recycler
- req_components = list(
- /datum/stock_part/matter_bin = 1,
- /datum/stock_part/manipulator = 1)
- needs_anchored = FALSE
-
-/obj/item/circuitboard/machine/processor/slime
- name = "Slime Processor"
- greyscale_colors = CIRCUIT_COLOR_SCIENCE
- build_path = /obj/machinery/processor/slime
-
/obj/item/circuitboard/machine/protolathe/department/science
name = "Departmental Protolathe - Science"
greyscale_colors = CIRCUIT_COLOR_SCIENCE
@@ -1227,14 +1213,9 @@
needs_anchored = FALSE
/obj/item/circuitboard/machine/processor/screwdriver_act(mob/living/user, obj/item/tool)
- if(build_path == /obj/machinery/processor)
- name = "Slime Processor"
- build_path = /obj/machinery/processor/slime
- to_chat(user, span_notice("Name protocols successfully updated."))
- else
- name = "Food Processor"
- build_path = /obj/machinery/processor
- to_chat(user, span_notice("Defaulting name protocols."))
+ name = "Food Processor"
+ build_path = /obj/machinery/processor
+ to_chat(user, span_notice("Defaulting name protocols."))
return TRUE
/obj/item/circuitboard/machine/protolathe/department/service
@@ -1483,8 +1464,8 @@
greyscale_colors = CIRCUIT_COLOR_SCIENCE
build_path = /obj/machinery/artifact_xray
req_components = list(
- /obj/item/stock_parts/capacitor = 1,
- /datum/stock_part/scanning_module = 1,
+ /obj/item/stock_parts/capacitor = 1,
+ /datum/stock_part/scanning_module = 1,
/obj/item/stock_parts/micro_laser = 1)
/obj/item/circuitboard/machine/artifactheater
@@ -1505,7 +1486,7 @@
/datum/stock_part/scanning_module = 1,
/obj/item/stack/cable_coil = 1,
/obj/item/stack/sheet/glass = 3)
-
+
/obj/item/circuitboard/machine/navbeacon
name = "Bot Navigational Beacon"
greyscale_colors = CIRCUIT_COLOR_SCIENCE
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 534871bdda67..f5ef78a60c98 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -137,8 +137,6 @@
/obj/effect/dummy/chameleon/attack_animal(mob/user, list/modifiers)
master.disrupt()
-/obj/effect/dummy/chameleon/attack_slime(mob/user, list/modifiers)
- master.disrupt()
/obj/effect/dummy/chameleon/attack_alien(mob/user, list/modifiers)
master.disrupt()
diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm
deleted file mode 100644
index 430796e02ca2..000000000000
--- a/code/game/objects/items/devices/scanners/slime_scanner.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-/obj/item/slime_scanner
- name = "slime scanner"
- desc = "A device that analyzes a slime's internal composition and measures its stats."
- icon = 'icons/obj/device.dmi'
- icon_state = "slime_scanner"
- inhand_icon_state = "analyzer"
- lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
- w_class = WEIGHT_CLASS_SMALL
- flags_1 = CONDUCT_1
- throwforce = 0
- throw_speed = 3
- throw_range = 7
- custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.30, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 0.20)
-
-/obj/item/slime_scanner/attack(mob/living/M, mob/living/user)
- if(user.stat || !user.can_read(src) || user.is_blind())
- return
- if (!isslime(M))
- to_chat(user, span_warning("This device can only scan slimes!"))
- return
- var/mob/living/simple_animal/slime/T = M
- slime_scan(T, user)
-
-/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user)
- var/to_render = "Slime scan results:\
- \n[span_notice("[T.colour] [T.is_adult ? "adult" : "baby"] slime")]\
- \nNutrition: [T.nutrition]/[T.get_max_nutrition()]"
- if (T.nutrition < T.get_starve_nutrition())
- to_render += "\n[span_warning("Warning: slime is starving!")]"
- else if (T.nutrition < T.get_hunger_nutrition())
- to_render += "\n[span_warning("Warning: slime is hungry")]"
- to_render += "\nElectric change strength: [T.powerlevel]\nHealth: [round(T.health/T.maxHealth,0.01)*100]%"
- if (T.slime_mutation[4] == T.colour)
- to_render += "\nThis slime does not evolve any further."
- else
- if (T.slime_mutation[3] == T.slime_mutation[4])
- if (T.slime_mutation[2] == T.slime_mutation[1])
- to_render += "\nPossible mutation: [T.slime_mutation[3]]\
- \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting"
- else
- to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)\
- \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting"
- else
- to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]\
- \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting"
- if (T.cores > 1)
- to_render += "\nMultiple cores detected"
- to_render += "\nGrowth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]"
- if(T.effectmod)
- to_render += "\n[span_notice("Core mutation in progress: [T.effectmod]")]\
- \n[span_notice("Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")]"
- to_chat(user, examine_block(to_render))
diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm
index febf901e0212..6b308ea92e68 100644
--- a/code/game/objects/items/rcd/RPLD.dm
+++ b/code/game/objects/items/rcd/RPLD.dm
@@ -49,6 +49,7 @@
/obj/item/construction/plumbing/proc/set_plumbing_designs()
plumbing_design_types = list(
//category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals
+ /obj/machinery/plumbing/synthesizer = 15,
/obj/machinery/plumbing/reaction_chamber/chem = 15,
/obj/machinery/plumbing/grinder_chemical = 30,
/obj/machinery/plumbing/growing_vat = 20,
@@ -292,12 +293,16 @@
/obj/item/construction/plumbing/research/set_plumbing_designs()
plumbing_design_types = list(
//category 1 synthesizers
+ /obj/machinery/plumbing/synthesizer = 15,
/obj/machinery/plumbing/reaction_chamber = 15,
/obj/machinery/plumbing/grinder_chemical = 30,
/obj/machinery/plumbing/disposer = 10,
/obj/machinery/plumbing/growing_vat = 20,
//category 2 Distributors
+ /obj/machinery/plumbing/ooze_sucker = 5,
+ /obj/machinery/plumbing/slime_grinder = 5,
+ /obj/machinery/plumbing/ooze_compressor = 20,
/obj/machinery/duct = 1,
/obj/machinery/plumbing/input = 5,
/obj/machinery/plumbing/filter = 5,
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a7fa03f96bcb..370cc5def0de 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -123,6 +123,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \
new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, check_density = FALSE, category = CAT_EQUIPMENT), \
new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, check_density = FALSE, category = CAT_EQUIPMENT), \
new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, check_density = FALSE, category = CAT_EQUIPMENT), \
+ new/datum/stack_recipe("slime pen management frame", /obj/item/wallframe/slime_pen_controller, 1, check_density = FALSE, category = CAT_EQUIPMENT), \
null, \
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \
new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 383c9d88af7e..66f7b9b07e90 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -98,12 +98,6 @@
var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10)
take_damage(amt, BRUTE)
-/obj/attack_slime(mob/living/simple_animal/slime/user, list/modifiers)
- if(!user.is_adult)
- return
- if(attack_generic(user, rand(10, 15), BRUTE, MELEE, 1))
- log_combat(user, src, "attacked")
-
/obj/singularity_act()
SSexplosions.high_mov_atom += src
if(src && !QDELETED(src))
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 9b7b5590018e..ef6ea9d433e8 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -224,17 +224,6 @@
use(user, going_up = FALSE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/structure/ladder/attack_slime(mob/user, list/modifiers)
- use(user)
- return TRUE
-
-/obj/structure/ladder/attack_slime_secondary(mob/user, list/modifiers)
- . = ..()
- if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
- return
- use(user, going_up = FALSE)
- return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-
/obj/structure/ladder/attackby(obj/item/item, mob/user, params)
use(user)
return TRUE
diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm
index 4a8cad5c2684..5210e90425cd 100644
--- a/code/game/turfs/open/_open.dm
+++ b/code/game/turfs/open/_open.dm
@@ -213,7 +213,7 @@
/turf/open/proc/water_vapor_gas_act()
MakeSlippery(TURF_WET_WATER, min_wet_time = 100, wet_time_to_add = 50)
- for(var/mob/living/simple_animal/slime/M in src)
+ for(var/mob/living/basic/slime/M in src)
M.apply_water()
wash(CLEAN_WASH)
diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm
index 50e83ee37359..a7764ff214df 100644
--- a/code/modules/antagonists/abductor/equipment/glands/slime.dm
+++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm
@@ -21,6 +21,5 @@
to_chat(owner, span_warning("You feel nauseated!"))
owner.vomit(20)
- var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
- Slime.set_friends(list(owner))
- Slime.set_leader(owner)
+ var/mob/living/basic/slime/Slime = new(get_turf(owner))
+ SEND_SIGNAL(Slime, COMSIG_FRIENDSHIP_CHANGE, owner, 110)
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index 3ec2d3c89d15..9d76906c0829 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -556,11 +556,11 @@
if (player_mind in ex_revs + ex_headrevs)
continue
- player_mind.add_antag_datum(/datum/antagonist/enemy_of_the_revolution)
-
if (!istype(player))
continue
+ player_mind.add_antag_datum(/datum/antagonist/enemy_of_the_revolution)
+
if(player_mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)
ADD_TRAIT(player, TRAIT_DEFIB_BLACKLISTED, REF(src))
diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm
index 64aaca7aa995..2492a5d98297 100644
--- a/code/modules/awaymissions/signpost.dm
+++ b/code/modules/awaymissions/signpost.dm
@@ -46,9 +46,6 @@
if (Adjacent(user))
return interact(user)
-/obj/structure/signpost/attack_slime(mob/user, list/modifiers)
- return interact(user)
-
/obj/structure/signpost/attack_animal(mob/user, list/modifiers)
return interact(user)
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index 78d0b78150c6..0dfc36a4bd60 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -105,9 +105,6 @@
/obj/structure/speaking_tile/attack_ai(mob/user)
return interact(user)
-/obj/structure/speaking_tile/attack_slime(mob/user, list/modifiers)
- return interact(user)
-
/obj/structure/speaking_tile/attack_animal(mob/user, list/modifiers)
return interact(user)
diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm
index 648c2cc9db04..bf5b4eb922d3 100644
--- a/code/modules/events/creep_awakening.dm
+++ b/code/modules/events/creep_awakening.dm
@@ -5,6 +5,7 @@
min_players = 20
category = EVENT_CATEGORY_HEALTH
description = "A random crewmember becomes obsessed with another."
+ weight = 0 // essentially disables it
/datum/round_event/obsessed
fakeable = FALSE
diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm
index e505cac2621f..a946cb780e96 100644
--- a/code/modules/experisci/experiment/experiments.dm
+++ b/code/modules/experisci/experiment/experiments.dm
@@ -218,8 +218,6 @@
required_atoms = list(
/obj/machinery/autolathe = 1,
/obj/machinery/rnd/production/circuit_imprinter/department/science = 1,
- /obj/machinery/monkey_recycler = 1,
- /obj/machinery/processor/slime = 1,
/obj/machinery/processor = 2,
/obj/machinery/reagentgrinder = 2,
/obj/machinery/hydroponics = 2,
diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm
deleted file mode 100644
index fa5418d30305..000000000000
--- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm
+++ /dev/null
@@ -1,103 +0,0 @@
-GLOBAL_LIST_EMPTY(monkey_recyclers)
-
-/obj/machinery/monkey_recycler
- name = "monkey recycler"
- desc = "A machine used for recycling dead monkeys into monkey cubes."
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "grinder"
- layer = BELOW_OBJ_LAYER
- density = TRUE
- circuit = /obj/item/circuitboard/machine/monkey_recycler
- var/stored_matter = 0
- var/cube_production = 0.2
- var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy()
-
-/obj/machinery/monkey_recycler/Initialize(mapload)
- . = ..()
- if (mapload)
- GLOB.monkey_recyclers += src
-
-/obj/machinery/monkey_recycler/Destroy()
- GLOB.monkey_recyclers -= src
- for(var/thing in connected)
- var/obj/machinery/computer/camera_advanced/xenobio/console = thing
- console.connected_recycler = null
- connected.Cut()
- return ..()
-
-/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled
- . = ..()
- cube_production = 0
- for(var/datum/stock_part/manipulator/manipulator in component_parts)
- cube_production += manipulator.tier * 0.1
- for(var/datum/stock_part/matter_bin/matter_bin in component_parts)
- cube_production += matter_bin.tier * 0.1
-
-/obj/machinery/monkey_recycler/examine(mob/user)
- . = ..()
- if(in_range(user, src) || isobserver(user))
- . += span_notice("The status display reads: Producing [cube_production] cubes for every monkey inserted.")
-
-/obj/machinery/monkey_recycler/wrench_act(mob/living/user, obj/item/tool)
- . = ..()
- if(default_unfasten_wrench(user, tool))
- power_change()
- return TOOL_ACT_TOOLTYPE_SUCCESS
-
-/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params)
- if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
- return
-
- if(default_pry_open(O, close_after_pry = TRUE))
- return
-
- if(default_deconstruction_crowbar(O))
- return
-
- if(machine_stat) //NOPOWER etc
- return
- else
- return ..()
-
-/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user)
- if(!istype(target))
- return
- if(ismonkey(target))
- stuff_monkey_in(target, user)
-
-/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/human/target, mob/living/user)
- if(!istype(target))
- return
- if(target.stat == CONSCIOUS)
- to_chat(user, span_warning("The monkey is struggling far too much to put it in the recycler."))
- return
- if(target.buckled || target.has_buckled_mobs())
- to_chat(user, span_warning("The monkey is attached to something."))
- return
- qdel(target)
- to_chat(user, span_notice("You stuff the monkey into the machine."))
- playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE)
- var/offset = prob(50) ? -2 : 2
- animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
- use_power(active_power_usage)
- stored_matter += cube_production
- addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x))
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, span_notice("The machine now has [stored_matter] monkey\s worth of material stored.")))
-
-/obj/machinery/monkey_recycler/interact(mob/user)
- if(stored_matter >= 1)
- to_chat(user, span_notice("The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube."))
- playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE)
- for(var/i in 1 to FLOOR(stored_matter, 1))
- new /obj/item/food/monkeycube(src.loc)
- stored_matter--
- to_chat(user, span_notice("The machine's display flashes that it has [stored_matter] monkeys worth of material left."))
- else
- to_chat(user, span_danger("The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter]."))
-
-/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I)
- . = ..()
- if(istype(I))
- to_chat(user, span_notice("You log [src] in the multitool's buffer."))
- I.buffer = src
- return TRUE
diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm
index a6afe1ad7397..7ff1e07db07d 100644
--- a/code/modules/food_and_drinks/machinery/processor.dm
+++ b/code/modules/food_and_drinks/machinery/processor.dm
@@ -185,59 +185,4 @@
user.forceMove(drop_location())
user.visible_message(span_notice("[user] crawls free of the processor!"))
-/obj/machinery/processor/slime
- name = "slime processor"
- desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating."
- circuit = /obj/item/circuitboard/machine/processor/slime
-
-/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/atom_to_drop)
- var/static/list/slimecores = subtypesof(/obj/item/slime_extract)
- var/i = 0
- if(!(i = slimecores.Find(atom_to_drop.type))) // If the item is not found
- return
- if (i <= 16) // If in the first 12 slots
- atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 12 + ((i%4)*8)
- atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 12 + (round(i/4)*8)
- return i
- var/ii = i - 16
- atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 8 + ((ii%3)*8)
- atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 8 + (round(ii/3)*8)
- return i
-
-/obj/machinery/processor/slime/process()
- if(processing)
- return
- var/mob/living/simple_animal/slime/picked_slime
- for(var/mob/living/simple_animal/slime/slime in range(1,src))
- if(!CanReach(slime)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor
- continue
- if(slime.stat)
- picked_slime = slime
- break
- if(!picked_slime)
- return
- var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(picked_slime)
- if (!recipe)
- return
-
- visible_message(span_notice("[picked_slime] is sucked into [src]."))
- LAZYADD(processor_contents, picked_slime)
- picked_slime.forceMove(src)
-
-/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what)
- var/mob/living/simple_animal/slime/processed_slime = what
- if (!istype(processed_slime))
- return
-
- if(processed_slime.stat != DEAD)
- processed_slime.forceMove(drop_location())
- processed_slime.balloon_alert_to_viewers("crawls free")
- return
- var/core_count = processed_slime.cores
- for(var/i in 1 to (core_count+rating_amount-1))
- var/atom/movable/item = new processed_slime.coretype(drop_location())
- adjust_item_drop_location(item)
- SSblackbox.record_feedback("tally", "slime_core_harvested", 1, processed_slime.colour)
- return ..()
-
#undef PROCESSOR_SELECT_RECIPE
diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm
index 91149a415920..3001a97f8152 100644
--- a/code/modules/food_and_drinks/machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/machinery/smartfridge.dm
@@ -399,12 +399,10 @@
/obj/machinery/smartfridge/extract/accept_check(obj/item/O)
if(istype(O, /obj/item/slime_extract))
return TRUE
- if(istype(O, /obj/item/slime_scanner))
- return TRUE
return FALSE
/obj/machinery/smartfridge/extract/preloaded
- initial_contents = list(/obj/item/slime_scanner = 2)
+ initial_contents = list(/obj/item/slime_extract/grey = 2)
// -------------------------------------
// Cytology Petri Dish Smartfridge
diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm
index 67339575703a..469909030d2c 100644
--- a/code/modules/food_and_drinks/recipes/processor_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm
@@ -128,11 +128,6 @@
input = /obj/item/food/grown/parsnip
output = /obj/item/food/roastparsnip
-/datum/food_processor_process/mob/slime
- input = /mob/living/simple_animal/slime
- output = null
- required_machine = /obj/machinery/processor/slime
-
/datum/food_processor_process/towercap
input = /obj/item/grown/log
output = /obj/item/popsicle_stick
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm
index e21b73659f4f..25490e6562ad 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm
@@ -335,9 +335,6 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999))
/turf/closed/indestructible/hoteldoor/attack_larva(mob/user, list/modifiers)
promptExit(user)
-/turf/closed/indestructible/hoteldoor/attack_slime(mob/user, list/modifiers)
- promptExit(user)
-
/turf/closed/indestructible/hoteldoor/attack_robot(mob/user)
if(get_dist(get_turf(src), get_turf(user)) <= 1)
promptExit(user)
diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm
index 444780e14885..27ff06b8bd41 100644
--- a/code/modules/mob/living/basic/basic_defense.dm
+++ b/code/modules/mob/living/basic/basic_defense.dm
@@ -28,6 +28,7 @@
span_notice("[user] [response_help_continuous] you."), null, null, user)
to_chat(user, span_notice("You [response_help_simple] [src]."))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
+ SEND_SIGNAL(src, COMSIG_EMOTION_STORE, user, EMOTION_HAPPY, "[response_help_continuous] me.")
else
if(HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, span_warning("You don't want to hurt [src]!"))
@@ -102,13 +103,6 @@
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
return attack_threshold_check(damage, user.melee_damage_type)
-/mob/living/basic/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(..()) //successful slime attack
- var/damage = rand(15, 25)
- if(M.is_adult)
- damage = rand(20, 35)
- return attack_threshold_check(damage)
-
/mob/living/basic/attack_drone(mob/living/basic/drone/attacking_drone)
if(attacking_drone.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon.
return
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 3d12474ad1c2..c7c65f4d684c 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -86,15 +86,6 @@ In all, this is a lot like the monkey code. /N
if(STAMINA)
stamina.adjust(-damage)
-/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(..()) //successful slime attack
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(10, 40)
- adjustBruteLoss(damage)
- log_combat(M, src, "attacked")
- updatehealth()
-
/mob/living/carbon/alien/ex_act(severity, target, origin)
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
return FALSE
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 360b479d0150..d9b7d8caf4f5 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -239,28 +239,6 @@
try_contact_infect(D, note="Monkey Bite Infected")
return TRUE
-
-/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(..()) //successful slime attack
- if(M.powerlevel > 0)
- var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- visible_message(span_danger("The [M.name] shocks [src]!"), \
- span_userdanger("The [M.name] shocks you!"))
-
- do_sparks(5, TRUE, src)
- var/power = M.powerlevel + rand(0,3)
- Paralyze(power * 2 SECONDS)
- set_stutter_if_lower(power * 2 SECONDS)
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustFireLoss(M.powerlevel * rand(6,10))
- updatehealth()
- return 1
-
/mob/living/carbon/proc/dismembering_strike(mob/living/attacker, dam_zone)
if(!attacker.limb_destroyer)
return dam_zone
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 8d477c21b89b..494e4b9dc724 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -340,31 +340,6 @@
var/attack_direction = get_dir(user, src)
apply_damage(damage, user.melee_damage_type, affecting, armor, wound_bonus = user.wound_bonus, bare_wound_bonus = user.bare_wound_bonus, sharpness = user.sharpness, attack_direction = attack_direction)
-
-/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- . = ..()
- if(!.) // slime attack failed
- return
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(!damage)
- return
- var/wound_mod = -45 // 25^1.4=90, 90-45=45
- if(M.is_adult)
- damage += rand(5, 10)
- wound_mod = -90 // 35^1.4=145, 145-90=55
-
- if(check_shields(M, damage, "the [M.name]"))
- return FALSE
-
- var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!dam_zone) //Dismemberment successful
- return TRUE
-
- var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(dam_zone))
- var/armor_block = run_armor_check(affecting, MELEE)
- apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod)
-
-
/mob/living/carbon/human/ex_act(severity, target, origin)
if(HAS_TRAIT(src, TRAIT_BOMBIMMUNE))
return
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 80fd5ade9649..56b7aab3de90 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -68,7 +68,7 @@
var/static/list/can_ride_typecache = typecacheof(list(
/mob/living/basic/parrot,
/mob/living/carbon/human,
- /mob/living/simple_animal/slime,
+ /mob/living/basic/slime,
))
var/lastpuke = 0
var/account_id
diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm
index 190885e1b48e..6b5b83e41832 100644
--- a/code/modules/mob/living/carbon/status_procs.dm
+++ b/code/modules/mob/living/carbon/status_procs.dm
@@ -31,6 +31,7 @@
ADD_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA)
ADD_TRAIT(src, TRAIT_FLOORED, STAMINA)
filters += FILTER_STAMINACRIT
+ SEND_SIGNAL(src, COMSIG_LIVING_STAMINA_STUN)
addtimer(CALLBACK(src, PROC_REF(exit_stamina_stun)), STAMINA_STUN_TIME)
stamina.pause(STAMINA_STUN_TIME + 2 SECONDS)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index da3bd02d854c..57b437207346 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1432,7 +1432,7 @@
created_robot.clear_zeroth_law(announce = FALSE)
if(WABBAJACK_SLIME)
- new_mob = new /mob/living/simple_animal/slime/random(loc)
+ new_mob = new /mob/living/basic/slime/random(loc)
if(WABBAJACK_XENO)
var/picked_xeno_type
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 2eac04ffff9b..a6481e93ae01 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -261,29 +261,6 @@
user.set_pull_offsets(src, grab_state)
return TRUE
-
-/mob/living/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(!SSticker.HasRoundStarted())
- to_chat(M, "You cannot attack people before the game has started.")
- return
-
- if(M.buckled)
- if(M in buckled_mobs)
- M.Feedstop()
- return // can't attack while eating!
-
- if(HAS_TRAIT(src, TRAIT_PACIFISM))
- to_chat(M, span_warning("You don't want to hurt anyone!"))
- return FALSE
-
- if (stat != DEAD)
- log_combat(M, src, "attacked")
- M.do_attack_animation(src)
- visible_message(span_danger("\The [M.name] glomps [src]!"), \
- span_userdanger("\The [M.name] glomps you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M)
- to_chat(M, span_danger("You glomp [src]!"))
- return TRUE
-
/mob/living/attack_animal(mob/living/simple_animal/user, list/modifiers)
. = ..()
user.face_atom(src)
diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm
index 2a0f6dab294a..ed0a16a5b445 100644
--- a/code/modules/mob/living/silicon/ai/ai_defense.dm
+++ b/code/modules/mob/living/silicon/ai/ai_defense.dm
@@ -17,9 +17,6 @@
return
..()
-/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user, list/modifiers)
- return //immune to slimes
-
/mob/living/silicon/ai/blob_act(obj/structure/blob/B)
if (stat != DEAD)
adjustBruteLoss(60)
diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm
index e9df047a1864..680fc7885b69 100644
--- a/code/modules/mob/living/silicon/robot/robot_defense.dm
+++ b/code/modules/mob/living/silicon/robot/robot_defense.dm
@@ -205,24 +205,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
..()
return
-/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(..()) //successful slime shock
- flash_act()
- var/stunprob = M.powerlevel * 7 + 10
- if(prob(stunprob) && M.powerlevel >= 8)
- adjustBruteLoss(M.powerlevel * rand(6,10))
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
- damage = round(damage / 2) // borgs receive half damage
- adjustBruteLoss(damage)
-
- return
-
/mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user, list/modifiers)
add_fingerprint(user)
if(!opened)
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 78322167a80c..a41a726be72d 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -98,13 +98,6 @@
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
return attack_threshold_check(damage, user.melee_damage_type)
-/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/user, list/modifiers)
- if(..()) //successful slime attack
- var/damage = rand(15, 25)
- if(user.is_adult)
- damage = rand(20, 35)
- return attack_threshold_check(damage)
-
/mob/living/simple_animal/attack_drone(mob/living/basic/drone/user)
if(user.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon.
return
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
index c4ab1f1c4172..de95e59dca90 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
@@ -120,7 +120,6 @@ IGNORE_PROC_IF_NOT_TARGET(attack_larva)
IGNORE_PROC_IF_NOT_TARGET(attack_animal)
-IGNORE_PROC_IF_NOT_TARGET(attack_slime)
/mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/projectile/Proj)
if(Proj.firer != set_target)
diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm
deleted file mode 100644
index f957b9264a5f..000000000000
--- a/code/modules/mob/living/simple_animal/slime/death.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/mob/living/simple_animal/slime/death(gibbed)
- if(stat == DEAD)
- return
- if(!gibbed)
- if(is_adult)
- var/mob/living/simple_animal/slime/M = new(drop_location(), colour)
- M.rabid = TRUE
- M.regenerate_icons()
-
- is_adult = FALSE
- maxHealth = 150
- for(var/datum/action/innate/slime/reproduce/R in actions)
- R.Remove(src)
- var/datum/action/innate/slime/evolve/E = new
- E.Grant(src)
- revive(HEAL_ALL)
- regenerate_icons()
- update_name()
- return
-
- if(buckled)
- Feedstop(silent = TRUE) //releases ourselves from the mob we fed on.
-
- set_stat(DEAD)
- cut_overlays()
-
- return ..(gibbed)
-
-/mob/living/simple_animal/slime/gib()
- death(TRUE)
- qdel(src)
diff --git a/code/modules/mob/living/simple_animal/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm
deleted file mode 100644
index 0b70ca3f0ece..000000000000
--- a/code/modules/mob/living/simple_animal/slime/emote.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-/datum/emote/slime
- mob_type_allowed_typecache = /mob/living/simple_animal/slime
- mob_type_blacklist_typecache = list()
-
-/datum/emote/slime/bounce
- key = "bounce"
- key_third_person = "bounces"
- message = "bounces in place."
-
-/datum/emote/slime/jiggle
- key = "jiggle"
- key_third_person = "jiggles"
- message = "jiggles!"
-
-/datum/emote/slime/light
- key = "light"
- key_third_person = "lights"
- message = "lights up for a bit, then stops."
-
-/datum/emote/slime/vibrate
- key = "vibrate"
- key_third_person = "vibrates"
- message = "vibrates!"
-
-/datum/emote/slime/mood
- key = "moodnone"
- ///Mood key, will set the slime's emote to this.
- var/mood_key
-
-/datum/emote/slime/mood/run_emote(mob/user, params, type_override, intentional)
- . = ..()
- if(!.)
- return
- var/mob/living/simple_animal/slime/slime_user = user
- slime_user.current_mood = mood_key
- slime_user.regenerate_icons()
-
-/datum/emote/slime/mood/smile
- key = "moodsmile"
- mood_key = ":3"
-
-/datum/emote/slime/mood/cat
- key = "moodcat"
- mood_key = ":33"
-
-/datum/emote/slime/mood/pout
- key = "moodpout"
- mood_key = "pout"
-
-/datum/emote/slime/mood/sad
- key = "moodsad"
- mood_key = "sad"
-
-/datum/emote/slime/mood/angry
- key = "moodangry"
- mood_key = "angry"
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
deleted file mode 100644
index 150e0a405ecb..000000000000
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ /dev/null
@@ -1,615 +0,0 @@
-/mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired)
- if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM))
- return
- . = ..()
- if(!.)
- return
-
- // We get some passive bruteloss healing if we're not dead
- if(stat != DEAD && SPT_PROB(16, seconds_per_tick))
- adjustBruteLoss(-0.5 * seconds_per_tick)
- if(ismob(buckled))
- handle_feeding(seconds_per_tick, times_fired)
- if(stat != CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech
- return
- handle_nutrition(seconds_per_tick, times_fired)
- if(QDELETED(src)) // Stop if the slime split during handle_nutrition()
- return
- reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len * seconds_per_tick) //Slimes are such snowflakes
- handle_targets(seconds_per_tick, times_fired)
- if(ckey)
- return
- handle_mood(seconds_per_tick, times_fired)
- handle_speech(seconds_per_tick, times_fired)
-
-
-// Unlike most of the simple animals, slimes support UNCONSCIOUS. This is an ugly hack.
-/mob/living/simple_animal/slime/update_stat()
- switch(stat)
- if(UNCONSCIOUS, HARD_CRIT)
- if(health > 0)
- return
- return ..()
-
-
-/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process
-
- if(AIproc || stat || client)
- return
-
- var/hungry = 0
- if (nutrition < get_starve_nutrition())
- hungry = 2
- else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
- hungry = 1
-
- AIproc = 1
-
- while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled))
- if(!(mobility_flags & MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly
- break
-
- if(!Target || client)
- break
-
- if(Target.health <= -70 || Target.stat == DEAD)
- set_target(null)
- AIproc = 0
- break
-
- if(Target)
- if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs)
- set_target(null)
- AIproc = 0
- break
- if(!AIproc)
- break
-
- if(Target in view(1,src))
- if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them.
- if(!Atkcool)
- Atkcool = TRUE
- addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
-
- if(Target.Adjacent(src))
- Target.attack_slime(src)
- break
- if((Target.body_position == STANDING_UP) && prob(80))
-
- if(Target.client && Target.health >= 20)
- if(!Atkcool)
- Atkcool = TRUE
- addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
-
- if(Target.Adjacent(src))
- Target.attack_slime(src)
-
- else
- if(!Atkcool && Target.Adjacent(src))
- Feedon(Target)
-
- else
- if(!Atkcool && Target.Adjacent(src))
- Feedon(Target)
-
- else if(Target in view(7, src))
- if(!Target.Adjacent(src))
- // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them
- step_to(src, Target)
- else
- set_target(null)
- AIproc = 0
- break
-
- var/sleeptime = cached_multiplicative_slowdown
- if(sleeptime <= 0)
- sleeptime = 1
-
- sleep(sleeptime + 2) // this is about as fast as a player slime can go
-
- AIproc = 0
-
-/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired)
- var/loc_temp = get_temperature(environment)
- var/divisor = 10 /// The divisor controls how fast body temperature changes, lower causes faster changes
-
- var/temp_delta = loc_temp - bodytemperature
- if(abs(temp_delta) > 50) // If the difference is great, reduce the divisor for faster stabilization
- divisor = 5
-
- if(temp_delta < 0) // It is cold here
- if(!on_fire) // Do not reduce body temp when on fire
- adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, temp_delta, 0))
- else // This is a hot place
- adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, 0, temp_delta))
-
- if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
- if(bodytemperature <= (T0C - 40)) // stun temperature
- ADD_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD)
- else
- REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD)
-
- if(bodytemperature <= (T0C - 50)) // hurt temperature
- if(bodytemperature <= 50) // sqrting negative numbers is bad
- adjustBruteLoss(100 * seconds_per_tick)
- else
- adjustBruteLoss(round(sqrt(bodytemperature)) * seconds_per_tick)
- else
- REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD)
-
- if(stat != DEAD)
- var/bz_percentage =0
- if(environment.gases[/datum/gas/bz])
- bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles()
- var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis
-
- switch(stat)
- if(CONSCIOUS)
- if(stasis)
- to_chat(src, span_danger("Nerve gas in the air has put you in stasis!"))
- set_stat(UNCONSCIOUS)
- powerlevel = 0
- rabid = FALSE
- regenerate_icons()
- if(UNCONSCIOUS, HARD_CRIT)
- if(!stasis)
- to_chat(src, span_notice("You wake up from the stasis."))
- set_stat(CONSCIOUS)
- regenerate_icons()
-
- updatehealth()
-
-/mob/living/simple_animal/slime/proc/handle_feeding(seconds_per_tick, times_fired)
- var/mob/living/prey = buckled
-
- if(stat)
- Feedstop(silent = TRUE)
-
- // monke start: make slimes feed faster on mindless mobs and monkeys
- var/feed_multiplier = 1
- if(QDELETED(prey.mind) && !istype(prey, /mob/living/simple_animal/pet) && !istype(prey, /mob/living/basic/pet)) // pets have an honorary soul in my book
- feed_multiplier += 1
- if(ismonkey(prey))
- feed_multiplier += 0.5
- // monke end
-
- if(prey.stat == DEAD) // our victim died
- if(!client)
- if(!rabid && !attacked)
- var/mob/last_to_hurt = prey.LAssailant?.resolve()
- if(last_to_hurt && last_to_hurt != prey)
- if(SPT_PROB(30, seconds_per_tick))
- add_friendship(last_to_hurt, 1)
- else
- to_chat(src, "This subject does not have a strong enough life energy anymore...")
-
- if(prey.client && ishuman(prey))
- if(SPT_PROB(61, seconds_per_tick))
- rabid = 1 //we go rabid after finishing to feed on a human with a client.
-
- Feedstop()
- return
-
- if(iscarbon(prey))
- prey.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
- prey.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
-
- if(SPT_PROB(5, seconds_per_tick) && prey.client)
- to_chat(prey, "[pick("You can feel your body becoming weak!", \
- "You feel like you're about to die!", \
- "You feel every part of your body screaming in agony!", \
- "A low, rolling pain passes through your body!", \
- "Your body feels as if it's falling apart!", \
- "You feel extremely weak!", \
- "A sharp, deep pain bathes every inch of your body!")]")
-
- else if(isanimal_or_basicmob(prey))
- var/mob/living/animal_victim = prey
-
- var/totaldamage = 0 //total damage done to this unfortunate animal
- totaldamage += animal_victim.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
- totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
-
- if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop
- Feedstop(0, 0)
- return
-
- else
- Feedstop(0, 0)
- return
-
- add_nutrition((rand(7, 15) * 0.5 * seconds_per_tick * CONFIG_GET(number/damage_multiplier)) * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
-
- //Heal yourself.
- adjustBruteLoss(-1.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys
-
-/mob/living/simple_animal/slime/proc/handle_nutrition(seconds_per_tick, times_fired)
-
- if(docile) //God as my witness, I will never go hungry again
- set_nutrition(700) //fuck you for using the base nutrition var
- return
-
- if(SPT_PROB(7.5, seconds_per_tick))
- adjust_nutrition(-0.5 * (1 + is_adult) * seconds_per_tick)
-
- if(nutrition <= 0)
- set_nutrition(0)
- if(SPT_PROB(50, seconds_per_tick))
- adjustBruteLoss(rand(0,5))
-
- else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD)
- adjust_nutrition(-10 * seconds_per_tick)
- amount_grown++
- update_mob_action_buttons()
-
- if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey)
- if(is_adult && loc.AllowDrop())
- Reproduce()
- else
- Evolve()
-
-/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0)
- set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition()))
- if(nutrition >= get_grow_nutrition())
- if(powerlevel<10)
- if(prob(30-powerlevel*2))
- powerlevel++
- else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level.
- if(powerlevel<5)
- if(prob(25-powerlevel*5))
- powerlevel++
-
-
-
-
-/mob/living/simple_animal/slime/proc/handle_targets(seconds_per_tick, times_fired)
- if(attacked > 50)
- attacked = 50
-
- if(attacked > 0)
- attacked--
-
- if(Discipline > 0)
-
- if(Discipline >= 5 && rabid)
- if(SPT_PROB(37, seconds_per_tick))
- rabid = 0
-
- if(SPT_PROB(5, seconds_per_tick))
- Discipline--
-
- if(!client)
- if(!(mobility_flags & MOBILITY_MOVE))
- return
-
- if(buckled)
- return // if it's eating someone already, continue eating!
-
- if(Target)
- --target_patience
- if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention
- target_patience = 0
- set_target(null)
-
- if(AIproc && SStun > world.time)
- return
-
- var/hungry = 0 // determines if the slime is hungry
-
- if (nutrition < get_starve_nutrition())
- hungry = 2
- else if (nutrition < get_grow_nutrition() && SPT_PROB(13, seconds_per_tick) || nutrition < get_hunger_nutrition())
- hungry = 1
-
- if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends
- if(Friends.len > 0 && SPT_PROB(0.5, seconds_per_tick))
- var/mob/nofriend = pick(Friends)
- add_friendship(nofriend, -1)
-
- if(!Target)
- if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to
- var/list/targets = list()
-
- for(var/mob/living/L in view(7,src))
-
- if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs
- continue
-
- if(L in Friends) // No eating friends!
- continue
-
- var/ally = FALSE
- for(var/F in faction)
- if(F == FACTION_NEUTRAL) //slimes are neutral so other mobs not target them, but they can target neutral mobs
- continue
- if(F in L.faction)
- ally = TRUE
- break
- if(ally)
- continue
-
- if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence
- targets += L // Possible target found!
-
- if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time.
- continue
-
- targets += L // Possible target found!
-
- if(targets.len > 0)
- if(attacked || rabid || hungry == 2)
- set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care
- else
- for(var/mob/living/carbon/C in targets)
- if(!Discipline && SPT_PROB(2.5, seconds_per_tick))
- if(ishuman(C) || isalienadult(C))
- set_target(C)
- break
-
- if(islarva(C) || ismonkey(C))
- set_target(C)
- break
-
- if (Target)
- target_patience = rand(5, 7)
- if (is_adult)
- target_patience += 3
-
- if(!Target) // If we have no target, we are wandering or following orders
- if (Leader)
- if(holding_still)
- holding_still = max(holding_still - (0.5 * seconds_per_tick), 0)
- else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc))
- step_to(src, Leader)
-
- else if(hungry)
- if (holding_still)
- holding_still = max(holding_still - (0.5 * hungry * seconds_per_tick), 0)
- else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(50))
- step(src, pick(GLOB.cardinals))
-
- else
- if(holding_still)
- holding_still = max(holding_still - (0.5 * seconds_per_tick), 0)
- else if (docile && pulledby)
- holding_still = 10
- else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33))
- step(src, pick(GLOB.cardinals))
- else if(!AIproc)
- INVOKE_ASYNC(src, PROC_REF(AIprocess))
-
-/mob/living/simple_animal/slime/handle_automated_movement()
- return //slime random movement is currently handled in handle_targets()
-
-/mob/living/simple_animal/slime/handle_automated_speech()
- return //slime random speech is currently handled in handle_speech()
-
-/mob/living/simple_animal/slime/proc/handle_mood(seconds_per_tick, times_fired)
- var/newmood = ""
- if (rabid || attacked)
- newmood = "angry"
- else if (docile)
- newmood = ":3"
- else if (Target)
- newmood = "mischievous"
-
- if (!newmood)
- if (Discipline && SPT_PROB(13, seconds_per_tick))
- newmood = "pout"
- else if (SPT_PROB(0.5, seconds_per_tick))
- newmood = pick("sad", ":3", "pout")
-
- if ((current_mood == "sad" || current_mood == ":3" || current_mood == "pout") && !newmood)
- if(SPT_PROB(50, seconds_per_tick))
- newmood = current_mood
-
- if (newmood != current_mood) // This is so we don't redraw them every time
- current_mood = newmood
- regenerate_icons()
-
-/mob/living/simple_animal/slime/proc/handle_speech(seconds_per_tick, times_fired)
- //Speech understanding starts here
- var/to_say
- if (speech_buffer.len > 0)
- var/who = speech_buffer[1] // Who said it?
- var/phrase = speech_buffer[2] // What did they say?
- if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us
- if (findtext(phrase, "hello") || findtext(phrase, "hi"))
- to_say = pick("Hello...", "Hi...")
- else if (findtext(phrase, "follow"))
- if (Leader)
- if (Leader == who) // Already following him
- to_say = pick("Yes...", "Lead...", "Follow...")
- else if (Friends[who] > Friends[Leader]) // VIVA
- set_leader(who)
- to_say = "Yes... I follow [who]..."
- else
- to_say = "No... I follow [Leader]..."
- else
- if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW)
- set_leader(who)
- to_say = "I follow..."
- else // Not friendly enough
- to_say = pick("No...", "I no follow...")
- else if (findtext(phrase, "stop"))
- if (buckled) // We are asked to stop feeding
- if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT)
- Feedstop()
- set_target(null)
- if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY)
- add_friendship(who, -1)
- to_say = "Grrr..." // I'm angry but I do it
- else
- to_say = "Fine..."
- else if (Target) // We are asked to stop chasing
- if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE)
- set_target(null)
- if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY)
- add_friendship(who, -1)
- to_say = "Grrr..." // I'm angry but I do it
- else
- to_say = "Fine..."
- else if (Leader) // We are asked to stop following
- if (Leader == who)
- to_say = "Yes... I stay..."
- set_leader(null)
- else
- if (Friends[who] > Friends[Leader])
- set_leader(null)
- to_say = "Yes... I stop..."
- else
- to_say = "No... keep follow..."
- else if (findtext(phrase, "stay"))
- if (Leader)
- if (Leader == who)
- holding_still = Friends[who] * 10
- to_say = "Yes... stay..."
- else if (Friends[who] > Friends[Leader])
- holding_still = (Friends[who] - Friends[Leader]) * 10
- to_say = "Yes... stay..."
- else
- to_say = "No... keep follow..."
- else
- if (Friends[who] >= SLIME_FRIENDSHIP_STAY)
- holding_still = Friends[who] * 10
- to_say = "Yes... stay..."
- else
- to_say = "No... won't stay..."
- else if (findtext(phrase, "attack"))
- if (rabid && prob(20))
- set_target(who)
- AIprocess() //Wake up the slime's Target AI, needed otherwise this doesn't work
- to_say = "ATTACK!?!?"
- else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK)
- for (var/mob/living/L in view(7,src)-list(src,who))
- if (findtext(phrase, lowertext(L.name)))
- if (isslime(L))
- to_say = "NO... [L] slime friend"
- add_friendship(who, -1) //Don't ask a slime to attack its friend
- else if(!Friends[L] || Friends[L] < 1)
- set_target(L)
- AIprocess()//Wake up the slime's Target AI, needed otherwise this doesn't work
- to_say = "Ok... I attack [Target]"
- else
- to_say = "No... like [L] ..."
- add_friendship(who, -1) //Don't ask a slime to attack its friend
- break
- else
- to_say = "No... no listen"
-
- speech_buffer = list()
-
- //Speech starts here
- if (to_say)
- say (to_say)
- else if(SPT_PROB(0.5, seconds_per_tick))
- emote(pick("bounce","sway","light","vibrate","jiggle"))
- else
- var/t = 10
- var/slimes_near = 0
- var/dead_slimes = 0
- var/friends_near = list()
- for (var/mob/living/L in view(7,src))
- if(isslime(L) && L != src)
- ++slimes_near
- if (L.stat == DEAD)
- ++dead_slimes
- if (L in Friends)
- t += 20
- friends_near += L
- if (nutrition < get_hunger_nutrition())
- t += 10
- if (nutrition < get_starve_nutrition())
- t += 10
- if (SPT_PROB(1, seconds_per_tick) && prob(t))
- var/phrases = list()
- if (Target)
- phrases += "[Target]... look yummy..."
- if (nutrition < get_starve_nutrition())
- phrases += "So... hungry..."
- phrases += "Very... hungry..."
- phrases += "Need... food..."
- phrases += "Must... eat..."
- else if (nutrition < get_hunger_nutrition())
- phrases += "Hungry..."
- phrases += "Where food?"
- phrases += "I want to eat..."
- phrases += "Rawr..."
- phrases += "Blop..."
- phrases += "Blorble..."
- if (rabid || attacked)
- phrases += "Hrr..."
- phrases += "Nhuu..."
- phrases += "Unn..."
- if (current_mood == ":3")
- phrases += "Purr..."
- if (attacked)
- phrases += "Grrr..."
- if (bodytemperature < T0C)
- phrases += "Cold..."
- if (bodytemperature < T0C - 30)
- phrases += "So... cold..."
- phrases += "Very... cold..."
- if (bodytemperature < T0C - 50)
- phrases += "..."
- phrases += "C... c..."
- if (buckled)
- phrases += "Nom..."
- phrases += "Yummy..."
- if (powerlevel > 3)
- phrases += "Bzzz..."
- if (powerlevel > 5)
- phrases += "Zap..."
- if (powerlevel > 8)
- phrases += "Zap... Bzz..."
- if (current_mood == "sad")
- phrases += "Bored..."
- if (slimes_near)
- phrases += "Slime friend..."
- if (slimes_near > 1)
- phrases += "Slime friends..."
- if (dead_slimes)
- phrases += "What happened?"
- if (!slimes_near)
- phrases += "Lonely..."
- for (var/M in friends_near)
- phrases += "[M]... friend..."
- if (nutrition < get_hunger_nutrition())
- phrases += "[M]... feed me..."
- if(!stat)
- say (pick(phrases))
-
-/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
- if (is_adult)
- return 1200
- else
- return 1000
-
-/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
- if (is_adult)
- return 1000
- else
- return 800
-
-/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat
- if (is_adult)
- return 600
- else
- return 500
-
-/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
- if(is_adult)
- return 300
- else
- return 200
-
-/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing
- if (docile)
- return FALSE
- if (hunger == 2 || rabid || attacked)
- return TRUE
- if (Leader)
- return FALSE
- if (holding_still)
- return FALSE
- return TRUE
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
deleted file mode 100644
index 131295e4f284..000000000000
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ /dev/null
@@ -1,241 +0,0 @@
-#define SIZE_DOESNT_MATTER -1
-#define BABIES_ONLY 0
-#define ADULTS_ONLY 1
-
-#define NO_GROWTH_NEEDED 0
-#define GROWTH_NEEDED 1
-
-/datum/action/innate/slime
- check_flags = AB_CHECK_CONSCIOUS
- button_icon = 'icons/mob/actions/actions_slime.dmi'
- background_icon_state = "bg_alien"
- overlay_icon_state = "bg_alien_border"
- var/needs_growth = NO_GROWTH_NEEDED
-
-/datum/action/innate/slime/IsAvailable(feedback = FALSE)
- . = ..()
- if(!.)
- return
- var/mob/living/simple_animal/slime/S = owner
- if(needs_growth == GROWTH_NEEDED)
- if(S.amount_grown >= SLIME_EVOLUTION_THRESHOLD)
- return TRUE
- return FALSE
- return TRUE
-
-/mob/living/simple_animal/slime/verb/Feed()
- set category = "Slime"
- set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
-
- if(stat)
- return FALSE
-
- var/list/choices = list()
- for(var/mob/living/nearby_mob in view(1,src))
- if(nearby_mob != src && Adjacent(nearby_mob))
- choices += nearby_mob
-
- var/choice = tgui_input_list(src, "Who do you wish to feed on?", "Slime Feed", sort_names(choices))
- if(isnull(choice))
- return FALSE
- var/mob/living/victim = choice
- if(CanFeedon(victim))
- Feedon(victim)
- return TRUE
- return FALSE
-
-/datum/action/innate/slime/feed
- name = "Feed"
- button_icon_state = "slimeeat"
-
-
-/datum/action/innate/slime/feed/Activate()
- var/mob/living/simple_animal/slime/S = owner
- S.Feed()
-
-/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/meal, silent = FALSE)
- if(!Adjacent(meal))
- return FALSE
-
- if(buckled)
- Feedstop()
- return FALSE
-
- if(issilicon(meal) || meal.mob_biotypes & MOB_ROBOTIC)
- return FALSE
-
- if(isanimal(meal))
- var/mob/living/simple_animal/simple_meal = meal
- if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us.
- if(silent)
- return FALSE
- to_chat(src, "[pick("This subject is incompatible", \
- "This subject does not have life energy", "This subject is empty", \
- "I am not satisified", "I can not feed from this subject", \
- "I do not feel nourished", "This subject is not food")]!")
- return FALSE
- else if(isbasicmob(meal))
- var/mob/living/basic/basic_meal = meal
- if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[CLONE] <= 0)
- if (silent)
- return FALSE
- to_chat(src, "[pick("This subject is incompatible", \
- "This subject does not have life energy", "This subject is empty", \
- "I am not satisified", "I can not feed from this subject", \
- "I do not feel nourished", "This subject is not food")]!")
- return FALSE
-
- if(isslime(meal))
- if(silent)
- return FALSE
- to_chat(src, span_warning("I can't latch onto another slime..."))
- return FALSE
-
- if(docile)
- if(silent)
- return FALSE
- to_chat(src, span_notice("I'm not hungry anymore..."))
- return FALSE
-
- if(stat)
- if(silent)
- return FALSE
- to_chat(src, span_warning("I must be conscious to do this..."))
- return FALSE
-
- if(meal.stat == DEAD)
- if(silent)
- return FALSE
- to_chat(src, span_warning("This subject does not have a strong enough life energy..."))
- return FALSE
-
- if(locate(/mob/living/simple_animal/slime) in meal.buckled_mobs)
- if(silent)
- return FALSE
- to_chat(src, span_warning("Another slime is already feeding on this subject..."))
- return FALSE
- return TRUE
-
-/mob/living/simple_animal/slime/proc/Feedon(mob/living/M)
- M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon())
- if(M.buckle_mob(src, force=TRUE))
- layer = M.layer+0.01 //appear above the target mob
- M.visible_message(span_danger("[name] latches onto [M]!"), \
- span_userdanger("[name] latches onto [M]!"))
- else
- to_chat(src, span_warning("I have failed to latch onto the subject!"))
-
-/mob/living/simple_animal/slime/proc/Feedstop(silent = FALSE, living=1)
- if(buckled)
- if(!living)
- to_chat(src, "[pick("This subject is incompatible", \
- "This subject does not have life energy", "This subject is empty", \
- "I am not satisified", "I can not feed from this subject", \
- "I do not feel nourished", "This subject is not food")]!")
- if(!silent)
- visible_message(span_warning("[src] lets go of [buckled]!"), \
- span_notice("I stopped feeding."))
- layer = initial(layer)
- buckled.unbuckle_mob(src,force=TRUE)
-
-/mob/living/simple_animal/slime/verb/Evolve()
- set category = "Slime"
- set desc = "This will let you evolve from baby to adult slime."
-
- if(stat)
- to_chat(src, "I must be conscious to do this...")
- return
- if(!is_adult)
- if(amount_grown >= SLIME_EVOLUTION_THRESHOLD)
- is_adult = 1
- maxHealth = 200
- amount_grown = 0
- for(var/datum/action/innate/slime/evolve/E in actions)
- E.Remove(src)
- var/datum/action/innate/slime/reproduce/reproduce_action = new
- reproduce_action.Grant(src)
- regenerate_icons()
- update_name()
- else
- to_chat(src, "I am not ready to evolve yet...")
- else
- to_chat(src, "I have already evolved...")
-
-/datum/action/innate/slime/evolve
- name = "Evolve"
- button_icon_state = "slimegrow"
- needs_growth = GROWTH_NEEDED
-
-/datum/action/innate/slime/evolve/Activate()
- var/mob/living/simple_animal/slime/S = owner
- S.Evolve()
-
-/mob/living/simple_animal/slime/verb/Reproduce()
- set category = "Slime"
- set desc = "This will make you split into four Slimes."
-
- if(stat)
- to_chat(src, "I must be conscious to do this...")
- return
-
- if(is_adult)
- if(amount_grown >= SLIME_EVOLUTION_THRESHOLD)
- if(stat)
- to_chat(src, "I must be conscious to do this...")
- return
-
- var/list/babies = list()
- var/new_nutrition = round(nutrition * 0.9)
- var/new_powerlevel = round(powerlevel / 4)
- var/datum/component/nanites/original_nanites = GetComponent(/datum/component/nanites)
- var/turf/drop_loc = drop_location()
-
- for(var/i in 1 to 4)
- var/child_colour
- if(mutation_chance >= 100)
- child_colour = "rainbow"
- else if(prob(mutation_chance))
- child_colour = slime_mutation[rand(1,4)]
- else
- child_colour = colour
- var/mob/living/simple_animal/slime/M
- M = new(drop_loc, child_colour)
- if(ckey)
- M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
- M.powerlevel = new_powerlevel
- if(i != 1)
- step_away(M,src)
- M.set_friends(Friends)
- babies += M
- M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100)
- SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour)
- if(original_nanites)
- M.AddComponent(/datum/component/nanites, original_nanites.nanite_volume*0.25)
- SEND_SIGNAL(M, COMSIG_NANITE_SYNC, original_nanites, TRUE, TRUE) //The trues are to copy activation as well
-
- var/mob/living/simple_animal/slime/new_slime = pick(babies)
- new_slime.set_combat_mode(TRUE)
- if(src.mind)
- src.mind.transfer_to(new_slime)
- else
- new_slime.key = src.key
- qdel(src)
- else
- to_chat(src, "I am not ready to reproduce yet...")
- else
- to_chat(src, "I am not old enough to reproduce yet...")
-
-/datum/action/innate/slime/reproduce
- name = "Reproduce"
- button_icon_state = "slimesplit"
- needs_growth = GROWTH_NEEDED
-
-/datum/action/innate/slime/reproduce/Activate()
- var/mob/living/simple_animal/slime/S = owner
- S.Reproduce()
-
-#undef SIZE_DOESNT_MATTER
-#undef BABIES_ONLY
-#undef ADULTS_ONLY
-#undef NO_GROWTH_NEEDED
-#undef GROWTH_NEEDED
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
deleted file mode 100644
index 01aa8f37e7e3..000000000000
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ /dev/null
@@ -1,580 +0,0 @@
-#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends)))
-/mob/living/simple_animal/slime
- name = "grey baby slime (123)"
- icon = 'icons/mob/simple/slimes.dmi'
- icon_state = "grey baby slime"
- pass_flags = PASSTABLE | PASSGRILLE
- gender = NEUTER
- faction = list(FACTION_SLIME, FACTION_NEUTRAL)
-
- harm_intent_damage = 5
- icon_living = "grey baby slime"
- icon_dead = "grey baby slime dead"
- response_help_continuous = "pets"
- response_help_simple = "pet"
- response_disarm_continuous = "shoos"
- response_disarm_simple = "shoo"
- response_harm_continuous = "stomps on"
- response_harm_simple = "stomp on"
- emote_see = list("jiggles", "bounces in place")
- speak_emote = list("blorbles")
- bubble_icon = "slime"
- initial_language_holder = /datum/language_holder/slime
-
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
-
- maxHealth = 150
- health = 150
- healable = 0
- melee_damage_lower = 5
- melee_damage_upper = 25
-
- verb_say = "blorbles"
- verb_ask = "inquisitively blorbles"
- verb_exclaim = "loudly blorbles"
- verb_yell = "loudly blorbles"
-
- // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables
- // for the sake of cleanliness, though, here they are.
- status_flags = CANUNCONSCIOUS|CANPUSH
-
- footstep_type = FOOTSTEP_MOB_SLIME
-
- ///The current mood of the slime, set randomly or through emotes (if sentient).
- var/current_mood
-
- var/AIproc = 0 // determines if the AI loop is activated
- var/Atkcool = 0 // attack cooldown
- var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
- var/SStun = 0 // stun variable
-
- var/is_adult = 0
- var/docile = 0
-
- var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
- var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
-
- var/powerlevel = 0 // 1-10 controls how much electricity they are generating
- var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
-
- var/number = 0 // Used to understand when someone is talking to it
-
- var/mob/living/Target = null // AI variable - tells the slime to hunt this down
- var/mob/living/Leader = null // AI variable - tells the slime to follow this person
-
- var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
- var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
- var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
- var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
-
- var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
-
- var/list/speech_buffer = list() // Last phrase said near it and person who said it
-
- var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime
- var/force_stasis = FALSE
-
- var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
- ///////////TIME FOR SUBSPECIES
-
- var/colour = "grey"
- var/coretype = /obj/item/slime_extract/grey
- var/list/slime_mutation[4]
-
- var/static/list/slime_colours = list(
- "adamantine",
- "black",
- "blue",
- "bluespace",
- "cerulean",
- "dark blue",
- "dark purple",
- "gold",
- "green",
- "grey",
- "light pink",
- "metal",
- "oil",
- "orange",
- "pink",
- "purple",
- "pyrite",
- "rainbow",
- "red",
- "sepia",
- "silver",
- "yellow",
- )
-
- ///////////CORE-CROSSING CODE
-
- var/effectmod //What core modification is being used.
- var/applied = 0 //How many extracts of the modtype have been applied.
-
-
-/mob/living/simple_animal/slime/Initialize(mapload, new_colour=colour, new_is_adult=FALSE)
- var/datum/action/innate/slime/feed/F = new
- F.Grant(src)
- ADD_TRAIT(src, TRAIT_CANT_RIDE, INNATE_TRAIT)
-
- is_adult = new_is_adult
-
- if(is_adult)
- var/datum/action/innate/slime/reproduce/R = new
- R.Grant(src)
- health = 200
- maxHealth = 200
- else
- var/datum/action/innate/slime/evolve/E = new
- E.Grant(src)
- create_reagents(100)
- set_colour(new_colour)
- . = ..()
- set_nutrition(700)
- add_cell_sample()
-
- ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
- AddElement(/datum/element/soft_landing)
-
-/mob/living/simple_animal/slime/Destroy()
- for (var/A in actions)
- var/datum/action/AC = A
- AC.Remove(src)
- set_target(null)
- set_leader(null)
- clear_friends()
- return ..()
-
-/mob/living/simple_animal/slime/create_reagents(max_vol, flags)
- . = ..()
- RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(on_reagent_change))
- RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del))
-
-/// Handles removing signal hooks incase someone is crazy enough to reset the reagents datum.
-/mob/living/simple_animal/slime/proc/on_reagents_del(datum/reagents/reagents)
- SIGNAL_HANDLER
- UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_QDELETING))
- return NONE
-
-/mob/living/simple_animal/slime/proc/set_colour(new_colour)
- colour = new_colour
- update_name()
- slime_mutation = mutation_table(colour)
- var/sanitizedcolour = replacetext(colour, " ", "")
- coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
- regenerate_icons()
-
-/mob/living/simple_animal/slime/update_name()
- if(slime_name_regex.Find(name))
- number = rand(1, 1000)
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
- real_name = name
- return ..()
-
-/mob/living/simple_animal/slime/proc/random_colour()
- set_colour(pick(slime_colours))
-
-/mob/living/simple_animal/slime/regenerate_icons()
- cut_overlays()
- var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
- icon_dead = "[icon_text] dead"
- if(stat != DEAD)
- icon_state = icon_text
- if(current_mood && !stat)
- add_overlay("aslime-[current_mood]")
- else
- icon_state = icon_dead
- ..()
-
-/**
- * Snowflake handling of reagent movespeed modifiers
- *
- * Should be moved to the reagents at some point in the future. As it is I'm in a hurry.
- */
-/mob/living/simple_animal/slime/proc/on_reagent_change(datum/reagents/holder, ...)
- SIGNAL_HANDLER
- remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod)
- var/amount = 0
- if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down
- amount = 2
- if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow
- amount = 5
- if(amount)
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount)
- return NONE
-
-/mob/living/simple_animal/slime/updatehealth()
- . = ..()
- var/mod = 0
- if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN))
- var/health_deficiency = (maxHealth - health)
- if(health_deficiency >= 45)
- mod += (health_deficiency / 25)
- if(health <= 0)
- mod += 2
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod)
-
-/mob/living/simple_animal/slime/adjust_bodytemperature()
- . = ..()
- var/mod = 0
- if(bodytemperature >= 330.23) // 135 F or 57.08 C
- mod = -1 // slimes become supercharged at high temperatures
- else if(bodytemperature < 283.222)
- mod = ((283.222 - bodytemperature) / 10) * 1.75
- if(mod)
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod)
-
-/mob/living/simple_animal/slime/ObjBump(obj/O)
- if(!client && powerlevel > 0)
- var/probab = 10
- switch(powerlevel)
- if(1 to 2)
- probab = 20
- if(3 to 4)
- probab = 30
- if(5 to 6)
- probab = 40
- if(7 to 8)
- probab = 60
- if(9)
- probab = 70
- if(10)
- probab = 95
- if(prob(probab))
- if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
- if(nutrition <= get_hunger_nutrition() && !Atkcool)
- if (is_adult || prob(5))
- O.attack_slime(src)
- Atkcool = TRUE
- addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS)
-
-/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
- return 2
-
-/mob/living/simple_animal/slime/get_status_tab_items()
- . = ..()
- if(!docile)
- . += "Nutrition: [nutrition]/[get_max_nutrition()]"
- if(amount_grown >= SLIME_EVOLUTION_THRESHOLD)
- if(is_adult)
- . += "You can reproduce!"
- else
- . += "You can evolve!"
-
- switch(stat)
- if(HARD_CRIT, UNCONSCIOUS)
- . += "You are knocked out by high levels of BZ!"
- else
- . += "Power Level: [powerlevel]"
-
-
-/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype)
- if(!forced)
- amount = -abs(amount)
- return ..() //Heals them
-
-/mob/living/simple_animal/slime/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- powerlevel = 0 // oh no, the power!
-
-/mob/living/simple_animal/slime/MouseDrop(atom/movable/A as mob|obj)
- if(isliving(A) && A != src && usr == src)
- var/mob/living/Food = A
- if(CanFeedon(Food))
- Feedon(Food)
- return ..()
-
-/mob/living/simple_animal/slime/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
- return
-
-/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
- return
-
-/mob/living/simple_animal/slime/attack_ui(slot, params)
- return
-
-/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M, list/modifiers)
- if(..()) //successful slime attack
- if(M == src)
- return
- if(buckled)
- Feedstop(silent = TRUE)
- visible_message(span_danger("[M] pulls [src] off!"), \
- span_danger("You pull [src] off!"))
- return
- attacked += 5
- if(nutrition >= 100) //steal some nutrition. negval handled in life()
- adjust_nutrition(-(50 + (40 * M.is_adult)))
- M.add_nutrition(50 + (40 * M.is_adult))
- if(health > 0)
- M.adjustBruteLoss(-10 + (-10 * M.is_adult))
- M.updatehealth()
-
-/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/user, list/modifiers)
- . = ..()
- if(.)
- attacked += 10
-
-
-/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/user, list/modifiers)
- if(..()) //successful monkey bite.
- attacked += 10
-
-/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers)
- if(..()) //successful larva bite.
- attacked += 10
-
-/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user)
- . = ..()
- if(!.)
- return
- discipline_slime(user)
-
-/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/user, list/modifiers)
- if(buckled)
- user.do_attack_animation(src, ATTACK_EFFECT_DISARM)
- if(buckled == user)
- if(prob(60))
- user.visible_message(span_warning("[user] attempts to wrestle \the [name] off!"), \
- span_danger("You attempt to wrestle \the [name] off!"))
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
-
- else
- user.visible_message(span_warning("[user] manages to wrestle \the [name] off!"), \
- span_notice("You manage to wrestle \the [name] off!"))
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
-
- discipline_slime(user)
-
- else
- if(prob(30))
- buckled.visible_message(span_warning("[user] attempts to wrestle \the [name] off of [buckled]!"), \
- span_warning("[user] attempts to wrestle \the [name] off of you!"))
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
-
- else
- buckled.visible_message(span_warning("[user] manages to wrestle \the [name] off of [buckled]!"), \
- span_notice("[user] manage to wrestle \the [name] off of you!"))
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
-
- discipline_slime(user)
- else
- if(stat == DEAD && surgeries.len)
- if(!(user.istate & ISTATE_HARM) || (istate & ISTATE_SECONDARY))
- for(var/datum/surgery/operations as anything in surgeries)
- if(operations.next_step(user, modifiers))
- return TRUE
- if(..()) //successful attack
- attacked += 10
-
-/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers)
- if(..()) //if harm or disarm intent.
- attacked += 10
- discipline_slime(user)
-
-
-/mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params)
- if(stat == DEAD && surgeries.len)
- var/list/modifiers = params2list(params)
- if(!(user.istate & ISTATE_HARM) || ((istate & ISTATE_SECONDARY)))
- for(var/datum/surgery/operations as anything in surgeries)
- if(operations.next_step(user, modifiers))
- return TRUE
- if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma.
- add_friendship(user, 1)
- to_chat(user, span_notice("You feed the slime the plasma. It chirps happily."))
- var/obj/item/stack/sheet/mineral/plasma/S = W
- S.use(1)
- return
- if(W.force > 0)
- attacked += 10
- if(prob(25))
- user.do_attack_animation(src)
- user.changeNext_move(CLICK_CD_MELEE)
- to_chat(user, span_danger("[W] passes right through [src]!"))
- return
- if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
- Discipline = 0
- if(W.force >= 3)
- var/force_effect = 2 * W.force
- if(is_adult)
- force_effect = round(W.force/2)
- if(prob(10 + force_effect))
- discipline_slime(user)
- if(istype(W, /obj/item/storage/bag/xeno))
- var/obj/item/storage/P = W
- if(!effectmod)
- to_chat(user, span_warning("The slime is not currently being mutated."))
- return
- var/hasOutput = FALSE //Have we outputted text?
- var/hasFound = FALSE //Have we found an extract to be added?
- for(var/obj/item/slime_extract/S in P.contents)
- if(S.effectmod == effectmod)
- P.atom_storage.attempt_remove(S, get_turf(src), silent = TRUE)
- qdel(S)
- applied++
- hasFound = TRUE
- if(applied >= SLIME_EXTRACT_CROSSING_REQUIRED)
- to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!"))
- playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE)
- spawn_corecross()
- hasOutput = TRUE
- break
- if(!hasOutput)
- if(!hasFound)
- to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!"))
- else
- to_chat(user, span_notice("You feed the slime some extracts from the bag."))
- playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE)
- return
- ..()
-
-/mob/living/simple_animal/slime/proc/spawn_corecross()
- var/static/list/crossbreeds = subtypesof(/obj/item/slimecross)
- visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!"))
- playsound(src, 'sound/magic/smoke.ogg', 50, TRUE)
- var/crosspath
- for(var/X in crossbreeds)
- var/obj/item/slimecross/S = X
- if(initial(S.colour) == colour && initial(S.effect) == effectmod)
- crosspath = S
- break
- if(crosspath)
- new crosspath(loc)
- else
- visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form."))
- qdel(src)
-
-/mob/living/simple_animal/slime/proc/apply_water()
- adjustBruteLoss(rand(15,20))
- if(!client)
- if(Target) // Like cats
- set_target(null)
- ++Discipline
- return
-
-/mob/living/simple_animal/slime/examine(mob/user)
- . = list("This is [icon2html(src, user)] \a [src]!")
- if (stat == DEAD)
- . += span_deadsay("It is limp and unresponsive.")
- else
- if (stat == UNCONSCIOUS || stat == HARD_CRIT) // Slime stasis
- . += span_deadsay("It appears to be alive but unresponsive.")
- if (getBruteLoss())
- . += ""
- if (getBruteLoss() < 40)
- . += "It has some punctures in its flesh!"
- else
- . += "It has severe punctures and tears in its flesh!"
- . += "\n"
-
- switch(powerlevel)
- if(2 to 3)
- . += "It is flickering gently with a little electrical activity."
-
- if(4 to 5)
- . += "It is glowing gently with moderate levels of electrical activity."
-
- if(6 to 9)
- . += span_warning("It is glowing brightly with high levels of electrical activity.")
-
- if(10)
- . += span_warning("It is radiating with massive levels of electrical activity!")
-
- . += ""
-
-/mob/living/simple_animal/slime/proc/discipline_slime(mob/user)
- if(stat)
- return
-
- if(prob(80) && !client)
- Discipline++
-
- if(!is_adult)
- if(Discipline == 1)
- attacked = 0
-
- set_target(null)
- if(buckled)
- Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto.
-
- SStun = world.time + rand(20,60)
-
- Stun(3)
- if(user)
- step_away(src,user,15)
-
- addtimer(CALLBACK(src, PROC_REF(slime_move), user), 0.3 SECONDS)
-
-
-/mob/living/simple_animal/slime/proc/slime_move(mob/user)
- if(user)
- step_away(src,user,15)
-
-
-/mob/living/simple_animal/slime/pet
- docile = 1
-
-/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat)
- if(..())
- return 3
-
-/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult)
- . = ..(mapload, pick(slime_colours), prob(50))
-
-/mob/living/simple_animal/slime/add_cell_sample()
- AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLIME, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
-
-/mob/living/simple_animal/slime/proc/set_target(new_target)
- var/old_target = Target
- Target = new_target
- if(old_target && !SLIME_CARES_ABOUT(old_target))
- UnregisterSignal(old_target, COMSIG_QDELETING)
- if(Target)
- RegisterSignal(Target, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
-
-/mob/living/simple_animal/slime/proc/set_leader(new_leader)
- var/old_leader = Leader
- Leader = new_leader
- if(old_leader && !SLIME_CARES_ABOUT(old_leader))
- UnregisterSignal(old_leader, COMSIG_QDELETING)
- if(Leader)
- RegisterSignal(Leader, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
-
-/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1)
- if(!Friends[new_friend])
- Friends[new_friend] = 0
- Friends[new_friend] += amount
- if(new_friend)
- RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
-
-/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1)
- Friends[new_friend] = amount
- if(new_friend)
- RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE)
-
-/mob/living/simple_animal/slime/proc/remove_friend(friend)
- Friends -= friend
- if(friend && !SLIME_CARES_ABOUT(friend))
- UnregisterSignal(friend, COMSIG_QDELETING)
-
-/mob/living/simple_animal/slime/proc/set_friends(new_buds)
- clear_friends()
- for(var/mob/friend as anything in new_buds)
- set_friendship(friend, new_buds[friend])
-
-/mob/living/simple_animal/slime/proc/clear_friends()
- for(var/mob/friend as anything in Friends)
- remove_friend(friend)
-
-/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source)
- SIGNAL_HANDLER
- if(source == Target)
- set_target(null)
- if(source == Leader)
- set_leader(null)
- remove_friend(source)
-
-#undef SLIME_CARES_ABOUT
diff --git a/code/modules/mob/living/simple_animal/slime/slime_say.dm b/code/modules/mob/living/simple_animal/slime/slime_say.dm
deleted file mode 100644
index 1a2540c447fa..000000000000
--- a/code/modules/mob/living/simple_animal/slime/slime_say.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range)
- . = ..()
- if(speaker == src || radio_freq || stat || !(speaker in Friends))
- return
-
- speech_buffer = list()
- speech_buffer += speaker
- speech_buffer += lowertext(raw_message)
diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm
deleted file mode 100644
index 47d45d71fdcd..000000000000
--- a/code/modules/mob/living/simple_animal/slime/subtypes.dm
+++ /dev/null
@@ -1,79 +0,0 @@
-/mob/living/simple_animal/slime/proc/mutation_table(colour)
- var/list/slime_mutation_colors[4]
- switch(colour)
- //Tier 1
- if("grey")
- slime_mutation_colors[1] = "orange"
- slime_mutation_colors[2] = "metal"
- slime_mutation_colors[3] = "blue"
- slime_mutation_colors[4] = "purple"
- //Tier 2
- if("purple")
- slime_mutation_colors[1] = "dark purple"
- slime_mutation_colors[2] = "dark blue"
- slime_mutation_colors[3] = "green"
- slime_mutation_colors[4] = "green"
- if("metal")
- slime_mutation_colors[1] = "silver"
- slime_mutation_colors[2] = "yellow"
- slime_mutation_colors[3] = "gold"
- slime_mutation_colors[4] = "gold"
- if("orange")
- slime_mutation_colors[1] = "dark purple"
- slime_mutation_colors[2] = "yellow"
- slime_mutation_colors[3] = "red"
- slime_mutation_colors[4] = "red"
- if("blue")
- slime_mutation_colors[1] = "dark blue"
- slime_mutation_colors[2] = "silver"
- slime_mutation_colors[3] = "pink"
- slime_mutation_colors[4] = "pink"
- //Tier 3
- if("dark blue")
- slime_mutation_colors[1] = "purple"
- slime_mutation_colors[2] = "blue"
- slime_mutation_colors[3] = "cerulean"
- slime_mutation_colors[4] = "cerulean"
- if("dark purple")
- slime_mutation_colors[1] = "purple"
- slime_mutation_colors[2] = "orange"
- slime_mutation_colors[3] = "sepia"
- slime_mutation_colors[4] = "sepia"
- if("yellow")
- slime_mutation_colors[1] = "metal"
- slime_mutation_colors[2] = "orange"
- slime_mutation_colors[3] = "bluespace"
- slime_mutation_colors[4] = "bluespace"
- if("silver")
- slime_mutation_colors[1] = "metal"
- slime_mutation_colors[2] = "blue"
- slime_mutation_colors[3] = "pyrite"
- slime_mutation_colors[4] = "pyrite"
- //Tier 4
- if("pink")
- slime_mutation_colors[1] = "pink"
- slime_mutation_colors[2] = "pink"
- slime_mutation_colors[3] = "light pink"
- slime_mutation_colors[4] = "light pink"
- if("red")
- slime_mutation_colors[1] = "red"
- slime_mutation_colors[2] = "red"
- slime_mutation_colors[3] = "oil"
- slime_mutation_colors[4] = "oil"
- if("gold")
- slime_mutation_colors[1] = "gold"
- slime_mutation_colors[2] = "gold"
- slime_mutation_colors[3] = "adamantine"
- slime_mutation_colors[4] = "adamantine"
- if("green")
- slime_mutation_colors[1] = "green"
- slime_mutation_colors[2] = "green"
- slime_mutation_colors[3] = "black"
- slime_mutation_colors[4] = "black"
- // Tier 5
- else
- slime_mutation_colors[1] = colour
- slime_mutation_colors[2] = colour
- slime_mutation_colors[3] = colour
- slime_mutation_colors[4] = colour
- return(slime_mutation_colors)
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index 5dfdfcc0b78e..d9448372b5ce 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -82,13 +82,6 @@
else
to_chat(src, span_warning("This ventilation duct is not connected to anything!"))
-/mob/living/simple_animal/slime/can_enter_vent(obj/machinery/atmospherics/components/ventcrawl_target, provide_feedback = TRUE)
- if(buckled)
- if(provide_feedback)
- to_chat(src, span_warning("You can't vent crawl while feeding!"))
- return
- return ..()
-
/**
* Moves living mob directly into the vent as a ventcrawler
*
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 22872424a846..cc300dc070fb 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1006,7 +1006,7 @@
* You can buckle on mobs if you're next to them since most are dense
*/
/mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, buckle_mob_flags= NONE)
- if(M.buckled)
+ if(M.buckled && LAZYLEN(buckled_mobs) >= max_buckled_mobs)
return FALSE
return ..(M, force, check_loc, buckle_mob_flags)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index e9e28018f4cd..a94bc9b5803b 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -234,18 +234,17 @@
for(var/t in bodyparts)
qdel(t)
- var/mob/living/simple_animal/slime/new_slime
+ var/mob/living/basic/slime/new_slime
if(reproduce)
var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring)
var/list/babies = list()
for(var/i in 1 to number)
- var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc)
- M.set_nutrition(round(nutrition/number))
+ var/mob/living/basic/slime/M = new/mob/living/basic/slime(loc)
step_away(M,src)
babies += M
new_slime = pick(babies)
else
- new_slime = new /mob/living/simple_animal/slime(loc)
+ new_slime = new /mob/living/basic/slime(loc)
new_slime.set_combat_mode(TRUE)
new_slime.key = key
diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm
index e80273e1accb..eca84f119e07 100644
--- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm
+++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm
@@ -18,15 +18,15 @@
///dead slimes, with a var for whatever color you want.
/obj/effect/mob_spawn/corpse/slime
- mob_type = /mob/living/simple_animal/slime
+ mob_type = /mob/living/basic/slime
icon = 'icons/mob/simple/slimes.dmi'
icon_state = "grey baby slime" //sets the icon in the map editor
///the color of the slime you're spawning.
- var/slime_species = "grey"
+ var/slime_species = /datum/slime_color/grey
-/obj/effect/mob_spawn/corpse/slime/special(mob/living/simple_animal/slime/spawned_slime)
+/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime)
. = ..()
- spawned_slime.set_colour(slime_species)
+ spawned_slime.change_color(slime_species)
///dead facehuggers, great for xeno ruins so you can have a cool ruin without spiraling the entire round into xenomorph hell. also, this is a terrible terrible artifact of time
/obj/effect/mob_spawn/corpse/facehugger
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 66d6366cd4c0..fa85c19f05a8 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -433,7 +433,7 @@
name = "EMP-proof slime core"
desc = "A yellow slime core infused with plasma. Its organic nature makes it immune to EMPs."
icon = 'icons/mob/simple/slimes.dmi'
- icon_state = "yellow slime extract"
+ icon_state = "yellow_slime_extract"
custom_materials = null
maxcharge = 5000
charge_light_type = null
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 8da6da798265..c0f4fd62281b 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -125,6 +125,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/restricted = FALSE
/// do we have a turf exposure (used to prevent liquids doing un-needed processes)
var/turf_exposure = FALSE
+ /// are we slippery?
+ var/slippery = TRUE
/// A list of traits to apply while the reagent is being metabolized.
var/list/metabolized_traits
/// A list of traits to apply while the reagent is in a mob.
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index f5ed3d865af2..7afbfb2c5f21 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -375,7 +375,7 @@
exposed_open_turf.air.temperature = max(exposed_open_turf.air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit.
if(reac_volume < 5)
return
- for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf)
+ for(var/mob/living/basic/slime/exposed_slime in exposed_turf)
exposed_slime.adjustToxLoss(rand(15,30))
/datum/reagent/consumable/condensedcapsaicin
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index cd100853d4e9..8df7408e8892 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -213,7 +213,7 @@
if(reac_volume >= 5)
exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS))
- for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf)
+ for(var/mob/living/basic/slime/exposed_slime in exposed_turf)
exposed_slime.apply_water()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf)
@@ -1370,7 +1370,7 @@
continue
movable_content.wash(clean_types)
- for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf)
+ for(var/mob/living/basic/slime/exposed_slime in exposed_turf)
exposed_slime.adjustToxLoss(rand(5,10))
/datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0)
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
index 4e57b4dc2409..796c9cf19e06 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
@@ -264,7 +264,7 @@
. = ..()
if(reac_volume < 5)
return
- for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf)
+ for(var/mob/living/basic/slime/exposed_slime in exposed_turf)
exposed_slime.adjustToxLoss(rand(15,30))
#undef CRYO_SPEED_PREFACTOR
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index 3f27ff2497bc..0f99c7c4321f 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -31,7 +31,7 @@
required_container = /obj/item/slime_extract/grey
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
- var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey")
+ var/mob/living/basic/slime/S = new(get_turf(holder.my_atom), /datum/slime_color/grey)
S.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!"))
..()
@@ -46,7 +46,7 @@
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
for(var/i in 1 to 3)
- new /obj/item/food/monkeycube(get_turf(holder.my_atom))
+ new /obj/item/stack/biomass(get_turf(holder.my_atom))
..()
//Green
@@ -313,13 +313,13 @@
reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume)
- for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
- if(slime.docile) //Undoes docility, but doesn't make rabid.
+ for(var/mob/living/basic/slime/slime in viewers(get_turf(holder.my_atom), null))
+ if(slime.has_slime_trait(/datum/slime_trait/docility)) //Undoes docility, but doesn't make rabid.
slime.visible_message(span_danger("[slime] forgets its training, becoming wild once again!"))
- slime.docile = FALSE
+ slime.remove_trait(/datum/slime_trait/docility)
slime.update_name()
continue
- slime.rabid = 1
+ ADD_TRAIT(slime, TRAIT_SLIME_RABID, "bloodlust")
slime.visible_message(span_danger("The [slime] is driven into a frenzy!"))
..()
@@ -527,7 +527,7 @@
S.active = TRUE
addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(15,60))
else
- var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom))
+ var/mob/living/basic/slime/random/S = new (get_turf(holder.my_atom))
S.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!"))
..()
diff --git a/code/modules/research/designs/autolathe/medsci_designs.dm b/code/modules/research/designs/autolathe/medsci_designs.dm
index e0b03384044b..599babb107f2 100644
--- a/code/modules/research/designs/autolathe/medsci_designs.dm
+++ b/code/modules/research/designs/autolathe/medsci_designs.dm
@@ -36,17 +36,6 @@
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
// Science Designs
-/datum/design/slime_scanner
- name = "Slime Scanner"
- id = "slime_scanner"
- build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE
- materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass =SMALL_MATERIAL_AMOUNT * 2)
- build_path = /obj/item/slime_scanner
- category = list(
- RND_CATEGORY_INITIAL,
- RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_XENOBIOLOGY,
- )
- departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
/datum/design/petridish
name = "Petri Dish"
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 84c5a3ac80ab..05f0defdf8b7 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -46,16 +46,6 @@
)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
-/datum/design/board/xenobiocamera
- name = "Xenobiology Console Board"
- desc = "Allows for the construction of circuit boards used to build xenobiology camera computers."
- id = "xenobioconsole"
- build_path = /obj/item/circuitboard/computer/xenobiology
- category = list(
- RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_RESEARCH
- )
- departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
-
/datum/design/board/aiupload
name = "AI Upload Board"
desc = "Allows for the construction of circuit boards used to build an AI Upload Console."
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 2959c9af5de0..4c9bfc3a262a 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -522,16 +522,6 @@
)
departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
-/datum/design/board/monkey_recycler
- name = "Monkey Recycler Board"
- desc = "The circuit board for a monkey recycler."
- id = "monkey_recycler"
- build_path = /obj/item/circuitboard/machine/monkey_recycler
- category = list(
- RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH
- )
- departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
-
/datum/design/board/seed_extractor
name = "Seed Extractor Board"
desc = "The circuit board for a seed extractor."
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 8b5fc4ff97ed..f689ab713294 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -105,7 +105,6 @@
"shaker",
"shot_glass",
"signaler",
- "slime_scanner",
"solar_panel",
"solar_tracker",
"space_heater",
@@ -474,13 +473,19 @@
"gibber",
"griddle",
"microwave",
- "monkey_recycler",
"oven",
"processor",
"range", // should be in a further node, probably
"reagentgrinder",
"smartfridge",
"stove",
+ "biomass_recycler",
+ "corral_corner",
+ "slime_extract_requestor",
+ "slime_market_pad",
+ "slime_market",
+ "slimevac",
+
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000)
discount_experiments = list(/datum/experiment/scanning/random/cytology = 3000) //Big discount to reinforce doing it.
@@ -707,7 +712,6 @@
"beacon",
"bluespace_crystal",
"telesci_gps",
- "xenobioconsole",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm
index b682bed7cdfa..4a8ff0e6ce95 100644
--- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm
+++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm
@@ -89,6 +89,8 @@ To add a crossbreed:
if("adamantine")
itemcolor = "#008B8B"
add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY)
+ if(colour == "rainbow")
+ rainbow_effect()
/obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals.
name = "result extract"
diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm
index 24e44f0a389b..851d9f7f8d0b 100644
--- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm
@@ -16,7 +16,7 @@ Slimecrossing Mobs
convert_damage = TRUE
convert_damage_type = CLONE
- possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime)
+ possible_shapes = list(/mob/living/basic/slime)
/// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human
var/remove_on_restore = FALSE
@@ -29,14 +29,6 @@ Slimecrossing Mobs
if(remove_on_restore)
qdel(src)
-/// Transformed slime - from Burning Black
-/mob/living/simple_animal/slime/transformed_slime
-
-// Just in case.
-/mob/living/simple_animal/slime/transformed_slime/Reproduce()
- to_chat(src, span_warning("I can't reproduce...")) // Mood
- return
-
//Slime corgi - Chilling Pink
/mob/living/basic/pet/dog/corgi/puppy/slime
name = "\improper slime corgi puppy"
diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm
index 0b5368f53728..1e6205dc8039 100644
--- a/code/modules/research/xenobiology/crossbreeding/_potions.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm
@@ -183,7 +183,7 @@ Slimecrossing Potions
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potsilver"
-/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/revive_target, mob/user)
+/obj/item/slimepotion/slime_reviver/attack(mob/living/basic/slime/revive_target, mob/user)
if(!isslime(revive_target))
to_chat(user, span_warning("The potion only works on slimes!"))
return ..()
@@ -207,7 +207,7 @@ Slimecrossing Potions
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potcyan"
-/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/stabilize_target, mob/user)
+/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/basic/slime/stabilize_target, mob/user)
if(!isslime(stabilize_target))
to_chat(user, span_warning("The stabilizer only works on slimes!"))
return ..()
diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
index a68a6fafae35..a7c6c3baed07 100644
--- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm
@@ -470,10 +470,8 @@
colour = "grey"
/datum/status_effect/stabilized/grey/tick()
- for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner)))
- if(!(owner in S.Friends))
- to_chat(owner, span_notice("[linked_extract] pulses gently as it communicates with [S]."))
- S.set_friendship(owner, 1)
+ for(var/mob/living/basic/slime/S in range(1, get_turf(owner)))
+ SEND_SIGNAL(S, COMSIG_FRIENDSHIP_CHANGE, owner, 1)
return ..()
/datum/status_effect/stabilized/orange
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 14d2f980eb43..b2d8eaaed28f 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -32,11 +32,10 @@ Burning extracts:
effect_desc = "Creates a hungry and speedy slime that will love you forever."
/obj/item/slimecross/burning/grey/do_effect(mob/user)
- var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey")
+ var/mob/living/basic/slime/S = new(get_turf(user))
S.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!"))
- S.set_friendship(user, 20) //Gas, gas, gas
+ SEND_SIGNAL(S, COMSIG_FRIENDSHIP_CHANGE, user, 110)
S.bodytemperature = T0C + 400 //We gonna step on the gas.
- S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight!
..()
/obj/item/slimecross/burning/orange
@@ -197,14 +196,16 @@ Burning extracts:
/obj/item/slimecross/burning/red/do_effect(mob/user)
user.visible_message(span_danger("[src] pulses a hazy red aura for a moment, which wraps around [user]!"))
- for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user)))
+ for(var/mob/living/basic/slime/S in view(7, get_turf(user)))
+ /*
if(user in S.Friends)
var/friendliness = S.Friends[user]
S.clear_friends()
S.set_friendship(user, friendliness)
else
S.clear_friends()
- S.rabid = 1
+ */
+ ADD_TRAIT(S, TRAIT_SLIME_RABID, "burning-red")
S.visible_message(span_danger("The [S] is driven into a dangerous frenzy!"))
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm
index a125cd7276e3..5e14557999cd 100644
--- a/code/modules/research/xenobiology/crossbreeding/charged.dm
+++ b/code/modules/research/xenobiology/crossbreeding/charged.dm
@@ -276,6 +276,6 @@ Charged extracts:
/obj/item/slimecross/charged/rainbow/do_effect(mob/user)
user.visible_message(span_warning("[src] swells and splits into three new slimes!"))
for(var/i in 1 to 3)
- var/mob/living/simple_animal/slime/S = new(get_turf(user))
- S.random_colour()
+ var/mob/living/basic/slime/S = new(get_turf(user))
+ S.start_mutating(TRUE)
return ..()
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 18f5a2849cab..9c37d0df7b87 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -231,9 +231,9 @@ Chilling extracts:
/obj/item/slimecross/chilling/red/do_effect(mob/user)
var/slimesfound = FALSE
- for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7))
+ for(var/mob/living/basic/slime/S in view(get_turf(user), 7))
slimesfound = TRUE
- S.docile = TRUE
+ S.add_trait(/datum/slime_trait/docility)
if(slimesfound)
user.visible_message(span_notice("[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm."))
else
diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm
index 710cf90dd71e..425e8026f896 100644
--- a/code/modules/research/xenobiology/crossbreeding/industrial.dm
+++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm
@@ -54,7 +54,7 @@ Industrial extracts:
/obj/item/slimecross/industrial/grey
colour = "grey"
effect_desc = "Produces monkey cubes."
- itempath = /obj/item/food/monkeycube
+ itempath = /obj/item/stack/biomass
itemamount = 5
/obj/item/slimecross/industrial/orange
diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
index 6460b3a849fe..a0b357d7bdcf 100644
--- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm
+++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm
@@ -197,8 +197,8 @@ Regenerative extracts:
/obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user)
if(isslime(target))
target.visible_message(span_warning("The [target] suddenly changes color!"))
- var/mob/living/simple_animal/slime/S = target
- S.random_colour()
+ var/mob/living/basic/slime/S = target
+ S.start_mutating(TRUE)
if(isjellyperson(target))
target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly,5)
@@ -237,7 +237,7 @@ Regenerative extracts:
/obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user)
var/dummytype = target.type
if(ismegafauna(target)) //Prevents megafauna duping in a lame way
- dummytype = /mob/living/simple_animal/slime
+ dummytype = /mob/living/basic/slime
to_chat(user, span_warning("The milky goo flows over [target], falling into a weak puddle."))
var/mob/living/dummy = new dummytype(target.loc)
to_chat(target, span_notice("The milky goo flows from your skin, forming an imperfect copy of you."))
diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
index cb903c84d625..f22e6109fb35 100644
--- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
+++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm
@@ -249,7 +249,7 @@
/datum/reagent/consumable/ice = -2) //Brrr!
virus_suspectibility = 0
- resulting_atoms = list(/mob/living/simple_animal/slime = 1)
+ resulting_atoms = list(/mob/living/basic/slime = 1)
/datum/micro_organism/cell_line/blob_spore //shitty cell line to dilute the pool, feel free to make easier to grow if it doesn't interfer with growing the powerful mobs enough.
desc = "Immature blob spores"
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
deleted file mode 100644
index d3b1b581c019..000000000000
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ /dev/null
@@ -1,453 +0,0 @@
-//Xenobio control console
-/mob/camera/ai_eye/remote/xenobio
- visible_icon = TRUE
- icon = 'icons/mob/silicon/cameramob.dmi'
- icon_state = "generic_camera"
- var/allowed_area = null
-
-/mob/camera/ai_eye/remote/xenobio/Initialize(mapload)
- var/area/A = get_area(loc)
- allowed_area = A.name
- . = ..()
-
-/mob/camera/ai_eye/remote/xenobio/setLoc(turf/destination, force_update = FALSE)
- var/area/new_area = get_area(destination)
- if(new_area && new_area.name == allowed_area || new_area && (new_area.area_flags & XENOBIOLOGY_COMPATIBLE))
- return ..()
- else
- return
-
-/mob/camera/ai_eye/remote/xenobio/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider)
- . = ..()
- if(!.)
- return
- var/area/new_area = get_area(.)
- if(new_area.name != allowed_area && !(new_area.area_flags & XENOBIOLOGY_COMPATIBLE))
- return FALSE
-
-/obj/machinery/computer/camera_advanced/xenobio
- name = "Slime management console"
- desc = "A computer used for remotely handling slimes."
- networks = list("ss13")
- circuit = /obj/item/circuitboard/computer/xenobiology
-
- var/obj/machinery/monkey_recycler/connected_recycler
- var/list/stored_slimes
- var/obj/item/slimepotion/slime/current_potion
- var/max_slimes = 5
- var/monkeys = 0
-
- icon_screen = "slime_comp"
- icon_keyboard = "rd_key"
-
- light_color = LIGHT_COLOR_PINK
-
-/obj/machinery/computer/camera_advanced/xenobio/Initialize(mapload)
- . = ..()
- actions += new /datum/action/innate/slime_place(src)
- actions += new /datum/action/innate/slime_pick_up(src)
- actions += new /datum/action/innate/feed_slime(src)
- actions += new /datum/action/innate/monkey_recycle(src)
- actions += new /datum/action/innate/slime_scan(src)
- actions += new /datum/action/innate/feed_potion(src)
- actions += new /datum/action/innate/hotkey_help(src)
-
- stored_slimes = list()
- for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers)
- if(get_area(recycler.loc) == get_area(loc))
- connected_recycler = recycler
- connected_recycler.connected += src
-
-/obj/machinery/computer/camera_advanced/xenobio/Destroy()
- QDEL_NULL(current_potion)
- for(var/thing in stored_slimes)
- var/mob/living/simple_animal/slime/S = thing
- S.forceMove(drop_location())
- stored_slimes.Cut()
- if(connected_recycler)
- connected_recycler.connected -= src
- connected_recycler = null
- return ..()
-
-/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A)
- if(A == current_potion)
- current_potion = null
- if(A in stored_slimes)
- stored_slimes -= A
- return ..()
-
-/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
- eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src))
- eyeobj.origin = src
- eyeobj.visible_icon = TRUE
- eyeobj.icon = 'icons/mob/silicon/cameramob.dmi'
- eyeobj.icon_state = "generic_camera"
-
-/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
- ..()
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl))
- RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl))
- RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl))
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt))
- RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift))
- RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift))
-
- //Checks for recycler on every interact, prevents issues with load order on certain maps.
- if(!connected_recycler)
- for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers)
- if(get_area(recycler.loc) == get_area(loc))
- connected_recycler = recycler
- connected_recycler.connected += src
-
-/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user)
- UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL)
- UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL)
- UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL)
- UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT)
- UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT)
- UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT)
- ..()
-
-/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/food/monkeycube))
- monkeys++
- to_chat(user, span_notice("You feed [O] to [src]. It now has [monkeys] monkey cubes stored."))
- qdel(O)
- return
- else if(istype(O, /obj/item/storage/bag))
- var/obj/item/storage/P = O
- var/loaded = FALSE
- for(var/obj/G in P.contents)
- if(istype(G, /obj/item/food/monkeycube))
- loaded = TRUE
- monkeys++
- qdel(G)
- if(loaded)
- to_chat(user, span_notice("You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored."))
- return
- else if(istype(O, /obj/item/slimepotion/slime))
- var/replaced = FALSE
- if(user && !user.transferItemToLoc(O, src))
- return
- if(!QDELETED(current_potion))
- current_potion.forceMove(drop_location())
- replaced = TRUE
- current_potion = O
- to_chat(user, span_notice("You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""]."))
- return
- ..()
-
-/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/living/user, obj/item/multitool/I)
- . = ..()
- if (istype(I) && istype(I.buffer,/obj/machinery/monkey_recycler))
- to_chat(user, span_notice("You link [src] with [I.buffer] in [I] buffer."))
- connected_recycler = I.buffer
- connected_recycler.connected += src
- return TRUE
-
-/datum/action/innate/slime_place
- name = "Place Slimes"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "slime_down"
-
-/datum/action/innate/slime_place/Activate()
- if(!target || !isliving(owner))
- return
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = target
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
- S.forceMove(remote_eye.loc)
- S.visible_message(span_notice("[S] warps in!"))
- X.stored_slimes -= S
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-/datum/action/innate/slime_pick_up
- name = "Pick up Slime"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "slime_up"
-
-/datum/action/innate/slime_pick_up/Activate()
- if(!target || !isliving(owner))
- return
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = target
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
- if(X.stored_slimes.len >= X.max_slimes)
- break
- if(!S.ckey)
- if(S.buckled)
- S.Feedstop(silent = TRUE)
- S.visible_message(span_notice("[S] vanishes in a flash of light!"))
- S.forceMove(X)
- X.stored_slimes += S
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-
-/datum/action/innate/feed_slime
- name = "Feed Slimes"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "monkey_down"
-
-/datum/action/innate/feed_slime/Activate()
- if(!target || !isliving(owner))
- return
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = target
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- if(X.monkeys >= 1)
- var/mob/living/carbon/human/species/monkey/food = new /mob/living/carbon/human/species/monkey(remote_eye.loc, TRUE, owner)
- if (!QDELETED(food))
- food.LAssailant = WEAKREF(C)
- X.monkeys--
- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
- remote_eye.auto_attach_slime(food) // monke edit: hungry slimes that aren't feeding will now immediately latch onto monkeys placed on top of them
- to_chat(owner, span_notice("[X] now has [X.monkeys] monkeys stored."))
- else
- to_chat(owner, span_warning("[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored."))
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-
-/datum/action/innate/monkey_recycle
- name = "Recycle Monkeys"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "monkey_up"
-
-/datum/action/innate/monkey_recycle/Activate()
- if(!target || !isliving(owner))
- return
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = target
- var/obj/machinery/monkey_recycler/recycler = X.connected_recycler
-
- if(!recycler)
- to_chat(owner, span_warning("There is no connected monkey recycler. Use a multitool to link one."))
- return
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/carbon/human/M in remote_eye.loc)
- if(!ismonkey(M))
- continue
- if(M.stat)
- M.visible_message(span_notice("[M] vanishes as [M.p_theyre()] reclaimed for recycling!"))
- recycler.use_power(500)
- X.monkeys += recycler.cube_production
- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
- qdel(M)
- to_chat(owner, span_notice("[X] now has [X.monkeys] monkeys available."))
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-/datum/action/innate/slime_scan
- name = "Scan Slime"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "slime_scan"
-
-/datum/action/innate/slime_scan/Activate()
- if(!target || !isliving(owner))
- return
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
- slime_scan(S, C)
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-/datum/action/innate/feed_potion
- name = "Apply Potion"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "slime_potion"
-
-/datum/action/innate/feed_potion/Activate()
- if(!target || !isliving(owner))
- return
-
- var/mob/living/C = owner
- var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = target
-
- if(QDELETED(X.current_potion))
- to_chat(owner, span_warning("No potion loaded."))
- return
-
- if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
- for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
- X.current_potion.attack(S, C)
- break
- else
- to_chat(owner, span_warning("Target is not near a camera. Cannot proceed."))
-
-/datum/action/innate/hotkey_help
- name = "Hotkey Help"
- button_icon = 'icons/mob/actions/actions_silicon.dmi'
- button_icon_state = "hotkey_help"
-
-/datum/action/innate/hotkey_help/Activate()
- if(!target || !isliving(owner))
- return
- to_chat(owner, "Click shortcuts:")
- to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.")
- to_chat(owner, "Ctrl-click a slime to scan it.")
- to_chat(owner, "Alt-click a slime to feed it a potion.")
- to_chat(owner, "Ctrl-click or a dead monkey to recycle it, or the floor to place a new monkey.")
-
-//
-// Alternate clicks for slime, monkey and open turf if using a xenobio console
-
-
-//Feeds a potion to slime
-/mob/living/simple_animal/slime/AltClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src)
- ..()
-
-//Picks up slime
-/mob/living/simple_animal/slime/ShiftClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src)
- ..()
-
-//Place slimes
-/turf/open/ShiftClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src)
- ..()
-
-//scans slimes
-/mob/living/simple_animal/slime/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src)
- ..()
-
-//picks up dead monkies
-/mob/living/carbon/human/species/monkey/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src)
- ..()
-
-//places monkies
-/turf/open/CtrlClick(mob/user)
- SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src)
- ..()
-
-// Scans slime
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S)
- SIGNAL_HANDLER
- if(!GLOB.cameranet.checkTurfVis(S.loc))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/area/mobarea = get_area(S.loc)
- if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- slime_scan(S, C)
-
-//Feeds a potion to slime
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S)
- SIGNAL_HANDLER
- if(!GLOB.cameranet.checkTurfVis(S.loc))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
- var/area/mobarea = get_area(S.loc)
- if(QDELETED(X.current_potion))
- to_chat(C, span_warning("No potion loaded."))
- return
- if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- INVOKE_ASYNC(X.current_potion, TYPE_PROC_REF(/obj/item/slimepotion/slime, attack), S, C)
-
-//Picks up slime
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S)
- SIGNAL_HANDLER
- if(!GLOB.cameranet.checkTurfVis(S.loc))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
- var/area/mobarea = get_area(S.loc)
- if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- if(X.stored_slimes.len >= X.max_slimes)
- to_chat(C, span_warning("Slime storage is full."))
- return
- if(S.ckey)
- to_chat(C, span_warning("The slime wiggled free!"))
- return
- if(S.buckled)
- S.Feedstop(silent = TRUE)
- S.visible_message(span_notice("[S] vanishes in a flash of light!"))
- S.forceMove(X)
- X.stored_slimes += S
-
-//Place slimes
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T)
- SIGNAL_HANDLER
-
- if(!GLOB.cameranet.checkTurfVis(T))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
- var/area/turfarea = get_area(T)
- if(turfarea.name == E.allowed_area || (turfarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
- S.forceMove(T)
- S.visible_message(span_notice("[S] warps in!"))
- X.stored_slimes -= S
-
-//Place monkey
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T)
- SIGNAL_HANDLER
- if(!GLOB.cameranet.checkTurfVis(T))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
- var/area/turfarea = get_area(T)
- if(turfarea.name == E.allowed_area || (turfarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- if(X.monkeys >= 1)
- var/mob/living/carbon/human/food = new /mob/living/carbon/human/species/monkey(T, TRUE, C)
- if (!QDELETED(food))
- food.LAssailant = WEAKREF(C)
- X.monkeys--
- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
- E.auto_attach_slime(food) // monke edit: hungry slimes that aren't feeding will now immediately latch onto monkeys placed on top of them
- to_chat(C, span_notice("[X] now has [X.monkeys] monkeys stored."))
- else
- to_chat(C, span_warning("[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored."))
-
-//Pick up monkey
-/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/human/M)
- SIGNAL_HANDLER
- if(!ismonkey(M))
- return
- if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc))
- to_chat(user, span_warning("Target is not near a camera. Cannot proceed."))
- return
- var/mob/living/C = user
- var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin
- var/area/mobarea = get_area(M.loc)
- if(!X.connected_recycler)
- to_chat(C, span_warning("There is no connected monkey recycler. Use a multitool to link one."))
- return
- if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE))
- if(!M.stat)
- return
- M.visible_message(span_notice("[M] vanishes as [p_theyre()] reclaimed for recycling!"))
- X.connected_recycler.use_power(500)
- X.monkeys += connected_recycler.cube_production
- X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors
- qdel(M)
- to_chat(C, span_notice("[X] now has [X.monkeys] monkeys available."))
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 3e4f35370ef5..f2606e0310aa 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -3,8 +3,8 @@
/obj/item/slime_extract
name = "slime extract"
desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
- icon = 'icons/mob/simple/slimes.dmi'
- icon_state = "grey slime extract"
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ icon_state = "grey_slime_extract"
force = 0
w_class = WEIGHT_CLASS_TINY
throwforce = 0
@@ -17,6 +17,8 @@
var/list/activate_reagents = list() ///Reagents required for activation
var/recurring = FALSE
+ var/tier = 1
+
/obj/item/slime_extract/examine(mob/user)
. = ..()
if(Uses > 1)
@@ -58,45 +60,16 @@
to_chat(user, span_warning("Nothing happened... This slime extract cannot be activated this way."))
return FALSE
-/**
-* Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract.
-*
-* By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross.
-*/
-/obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user)
- if(!isslime(M))
- return ..()
- if(M.stat)
- to_chat(user, span_warning("The slime is dead!"))
- return
- if(!M.is_adult)
- to_chat(user, span_warning("The slime must be an adult to cross its core!"))
- return
- if(M.effectmod && M.effectmod != effectmod)
- to_chat(user, span_warning("The slime is already being crossed with a different extract!"))
- return
-
- if(!M.effectmod)
- M.effectmod = effectmod
-
- M.applied++
- qdel(src)
- to_chat(user, span_notice("You feed the slime [src], [M.applied == 1 ? "starting to mutate its core." : "further mutating its core."]"))
- playsound(M, 'sound/effects/attackblob.ogg', 50, TRUE)
-
- if(M.applied >= SLIME_EXTRACT_CROSSING_REQUIRED)
- M.spawn_corecross()
-
/obj/item/slime_extract/grey
name = "grey slime extract"
- icon_state = "grey slime extract"
+ icon_state = "grey_slime_extract"
effectmod = "reproductive"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
if(SLIME_ACTIVATE_MINOR)
- var/obj/item/food/monkeycube/M = new
+ var/obj/item/stack/biomass/M = new
if(!user.put_in_active_hand(M))
M.forceMove(user.drop_location())
playsound(user, 'sound/effects/splat.ogg', 50, TRUE)
@@ -105,7 +78,7 @@
if(SLIME_ACTIVATE_MAJOR)
to_chat(user, span_notice("Your [name] starts pulsing..."))
if(do_after(user, 40, target = user))
- var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey")
+ var/mob/living/basic/slime/S = new(get_turf(user))
playsound(user, 'sound/effects/splat.ogg', 50, TRUE)
to_chat(user, span_notice("You spit out [S]."))
return 350
@@ -114,9 +87,10 @@
/obj/item/slime_extract/gold
name = "gold slime extract"
- icon_state = "gold slime extract"
+ icon_state = "gold_slime_extract"
effectmod = "symbiont"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 4
@@ -145,9 +119,10 @@
/obj/item/slime_extract/silver
name = "silver slime extract"
- icon_state = "silver slime extract"
+ icon_state = "silver_slime_extract"
effectmod = "consuming"
activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 2
@@ -173,7 +148,7 @@
/obj/item/slime_extract/metal
name = "metal slime extract"
- icon_state = "metal slime extract"
+ icon_state = "metal_slime_extract"
effectmod = "industrial"
activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water)
@@ -197,7 +172,7 @@
/obj/item/slime_extract/purple
name = "purple slime extract"
- icon_state = "purple slime extract"
+ icon_state = "purple_slime_extract"
effectmod = "regenerative"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
@@ -216,9 +191,10 @@
/obj/item/slime_extract/darkpurple
name = "dark purple slime extract"
- icon_state = "dark purple slime extract"
+ icon_state = "dark_purple_slime_extract"
effectmod = "self-sustaining"
activate_reagents = list(/datum/reagent/toxin/plasma)
+ tier = 2
/obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -239,7 +215,7 @@
/obj/item/slime_extract/orange
name = "orange slime extract"
- icon_state = "orange slime extract"
+ icon_state = "orange_slime_extract"
effectmod = "burning"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
@@ -259,9 +235,10 @@
/obj/item/slime_extract/yellow
name = "yellow slime extract"
- icon_state = "yellow slime extract"
+ icon_state = "yellow_slime_extract"
effectmod = "charged"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 2
/obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -282,9 +259,10 @@
/obj/item/slime_extract/red
name = "red slime extract"
- icon_state = "red slime extract"
+ icon_state = "red_slime_extract"
effectmod = "sanguine"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 3
/obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -295,14 +273,14 @@
if(SLIME_ACTIVATE_MAJOR)
user.visible_message(span_warning("[user]'s skin flashes red for a moment..."), span_warning("Your skin flashes red as you emit rage-inducing pheromones..."))
- for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null))
- slime.rabid = TRUE
+ for(var/mob/living/basic/slime/slime in viewers(get_turf(user), null))
+ ADD_TRAIT(slime, TRAIT_SLIME_RABID, "red-extract")
slime.visible_message(span_danger("The [slime] is driven into a frenzy!"))
return 600
/obj/item/slime_extract/blue
name = "blue slime extract"
- icon_state = "blue slime extract"
+ icon_state = "blue_slime_extract"
effectmod = "stabilized"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
@@ -322,9 +300,10 @@
/obj/item/slime_extract/darkblue
name = "dark blue slime extract"
- icon_state = "dark blue slime extract"
+ icon_state = "dark_blue_slime_extract"
effectmod = "chilling"
activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 2
/obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -345,9 +324,10 @@
/obj/item/slime_extract/pink
name = "pink slime extract"
- icon_state = "pink slime extract"
+ icon_state = "pink_slime_extract"
effectmod = "gentle"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
+ tier = 4
/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -373,9 +353,10 @@
/obj/item/slime_extract/green
name = "green slime extract"
- icon_state = "green slime extract"
+ icon_state = "green_slime_extract"
effectmod = "mutative"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium)
+ tier = 4
/obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -397,9 +378,10 @@
/obj/item/slime_extract/lightpink
name = "light pink slime extract"
- icon_state = "light pink slime extract"
+ icon_state = "light_pink_slime_extract"
effectmod = "loyal"
activate_reagents = list(/datum/reagent/toxin/plasma)
+ tier = 5
/obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -421,9 +403,10 @@
/obj/item/slime_extract/black
name = "black slime extract"
- icon_state = "black slime extract"
+ icon_state = "black_slime_extract"
effectmod = "transformative"
activate_reagents = list(/datum/reagent/toxin/plasma)
+ tier = 5
/obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -441,9 +424,10 @@
/obj/item/slime_extract/oil
name = "oil slime extract"
- icon_state = "oil slime extract"
+ icon_state = "oil_slime_extract"
effectmod = "detonating"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
+ tier = 5
/obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -465,9 +449,10 @@
/obj/item/slime_extract/adamantine
name = "adamantine slime extract"
- icon_state = "adamantine slime extract"
+ icon_state = "adamantine_slime_extract"
effectmod = "crystalline"
activate_reagents = list(/datum/reagent/toxin/plasma)
+ tier = 5
/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -494,13 +479,14 @@
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
- icon_state = "bluespace slime extract"
+ icon_state = "bluespace_slime_extract"
effectmod = "warping"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
var/teleport_ready = FALSE
var/teleport_x = 0
var/teleport_y = 0
var/teleport_z = 0
+ tier = 6
/obj/item/slime_extract/bluespace/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -530,9 +516,10 @@
/obj/item/slime_extract/pyrite
name = "pyrite slime extract"
- icon_state = "pyrite slime extract"
+ icon_state = "pyrite_slime_extract"
effectmod = "prismatic"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
+ tier = 3
/obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -557,9 +544,10 @@
/obj/item/slime_extract/cerulean
name = "cerulean slime extract"
- icon_state = "cerulean slime extract"
+ icon_state = "cerulean_slime_extract"
effectmod = "recurring"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma)
+ tier = 3
/obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -577,9 +565,10 @@
/obj/item/slime_extract/sepia
name = "sepia slime extract"
- icon_state = "sepia slime extract"
+ icon_state = "sepia_slime_extract"
effectmod = "lengthened"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water)
+ tier = 3
/obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -599,9 +588,10 @@
/obj/item/slime_extract/rainbow
name = "rainbow slime extract"
- icon_state = "rainbow slime extract"
+ icon_state = "rainbow_slime_extract"
effectmod = "hyperchromatic"
activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list.
+ tier = 6
/obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type)
switch(activation_type)
@@ -653,21 +643,20 @@
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potsilver"
-/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/docility/attack(mob/living/basic/slime/M, mob/user)
if(!isslime(M))
to_chat(user, span_warning("The potion only works on slimes!"))
return ..()
if(M.stat)
to_chat(user, span_warning("The slime is dead!"))
return
- if(M.rabid) //Stops being rabid, but doesn't become truly docile.
+ if(HAS_TRAIT(M, TRAIT_SLIME_RABID)) //Stops being rabid, but doesn't become truly docile.
to_chat(M, span_warning("You absorb the potion, and your rabid hunger finally settles to a normal desire to feed."))
to_chat(user, span_notice("You feed the slime the potion, calming its rabid rage."))
- M.rabid = FALSE
+ REMOVE_TRAIT(M, TRAIT_SLIME_RABID, null)
qdel(src)
return
- M.docile = 1
- M.set_nutrition(700)
+ M.add_trait(/datum/slime_trait/docility)
to_chat(M, span_warning("You absorb the potion and feel your intense desire to feed melt away."))
to_chat(user, span_notice("You feed the slime the potion, removing its hunger and calming it."))
var/newname = sanitize_name(tgui_input_text(user, "Would you like to give the slime a name?", "Name your new pet", "Pet Slime", MAX_NAME_LEN))
@@ -799,22 +788,18 @@
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potred"
-/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/steroid/attack(mob/living/basic/slime/M, mob/user)
if(!isslime(M))//If target is not a slime.
to_chat(user, span_warning("The steroid only works on baby slimes!"))
return ..()
- if(M.is_adult) //Can't steroidify adults
- to_chat(user, span_warning("Only baby slimes can use the steroid!"))
- return
if(M.stat)
to_chat(user, span_warning("The slime is dead!"))
return
- if(M.cores >= 5)
- to_chat(user, span_warning("The slime already has the maximum amount of extract!"))
+ if(M.ooze_production >= 50)
+ to_chat(user, span_warning("The slime is already producing too much ooze!"))
return
-
- to_chat(user, span_notice("You feed the slime the steroid. It will now produce one more extract."))
- M.cores++
+ to_chat(user, span_notice("You feed the slime the steroid. It will now produce more ooze."))
+ M.ooze_production++
qdel(src)
/obj/item/slimepotion/enhancer
@@ -829,7 +814,7 @@
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potcyan"
-/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/stabilizer/attack(mob/living/basic/slime/M, mob/user)
if(!isslime(M))
to_chat(user, span_warning("The stabilizer only works on slimes!"))
return ..()
@@ -850,14 +835,14 @@
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "potgreen"
-/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user)
+/obj/item/slimepotion/slime/mutator/attack(mob/living/basic/slime/M, mob/user)
if(!isslime(M))
to_chat(user, span_warning("The mutator only works on slimes!"))
return ..()
if(M.stat)
to_chat(user, span_warning("The slime is dead!"))
return
- if(M.mutator_used)
+ if(HAS_TRAIT(M, TRAIT_MUTATOR_USED))
to_chat(user, span_warning("This slime has already consumed a mutator, any more would be far too unstable!"))
return
if(M.mutation_chance == 100)
@@ -866,7 +851,7 @@
to_chat(user, span_notice("You feed the slime the mutator. It is now more likely to mutate."))
M.mutation_chance = clamp(M.mutation_chance+12,0,100)
- M.mutator_used = TRUE
+ ADD_TRAIT(M, TRAIT_MUTATOR_USED, "slime-mutator")
qdel(src)
/obj/item/slimepotion/speed
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
deleted file mode 100644
index 4ada9e7b59a3..000000000000
--- a/code/modules/surgery/core_removal.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-/datum/surgery/core_removal
- name = "Core removal"
- target_mobtypes = list(/mob/living/simple_animal/slime)
- surgery_flags = SURGERY_IGNORE_CLOTHES
- possible_locs = list(
- BODY_ZONE_R_ARM,
- BODY_ZONE_L_ARM,
- BODY_ZONE_R_LEG,
- BODY_ZONE_L_LEG,
- BODY_ZONE_CHEST,
- BODY_ZONE_HEAD,
- )
- steps = list(
- /datum/surgery_step/incise,
- /datum/surgery_step/extract_core,
- )
-
-/datum/surgery/core_removal/can_start(mob/user, mob/living/target)
- if(target.stat == DEAD)
- return TRUE
- return FALSE
-
-//extract brain
-/datum/surgery_step/extract_core
- name = "extract core (hemostat/crowbar)"
- implements = list(
- TOOL_HEMOSTAT = 100,
- TOOL_CROWBAR = 100)
- time = 16
-
-/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- display_results(
- user,
- target,
- span_notice("You begin to extract a core from [target]..."),
- span_notice("[user] begins to extract a core from [target]."),
- span_notice("[user] begins to extract a core from [target]."),
- )
-
-/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
- var/mob/living/simple_animal/slime/target_slime = target
- if(target_slime.cores > 0)
- target_slime.cores--
- display_results(
- user,
- target,
- span_notice("You successfully extract a core from [target]. [target_slime.cores] core\s remaining."),
- span_notice("[user] successfully extracts a core from [target]!"),
- span_notice("[user] successfully extracts a core from [target]!"),
- )
-
- new target_slime.coretype(target_slime.loc)
-
- if(target_slime.cores <= 0)
- target_slime.icon_state = "[target_slime.colour] baby slime dead-nocore"
- return ..()
- else
- return FALSE
- else
- to_chat(user, span_warning("There aren't any cores left in [target]!"))
- return ..()
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 0ae0cbc962a0..902e32bf4364 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -105,6 +105,7 @@
slot = ORGAN_SLOT_BRAIN_ANTISTUN
var/static/list/signalCache = list(
+ COMSIG_LIVING_STAMINA_STUN,
COMSIG_LIVING_STATUS_STUN,
COMSIG_LIVING_STATUS_KNOCKDOWN,
COMSIG_LIVING_STATUS_IMMOBILIZE,
@@ -128,6 +129,7 @@
/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns()
if(owner || !(organ_flags & ORGAN_FAILING))
+ owner.exit_stamina_stun()
owner.SetStun(0)
owner.SetKnockdown(0)
owner.SetImmobilized(0)
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 0e5ed05bf2b3..e8bda6fd8e89 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -191,7 +191,6 @@
#include "security_officer_distribution.dm"
#include "serving_tray.dm"
#include "siunit.dm"
-#include "slime_mood.dm"
#include "slips.dm"
#include "spawn_humans.dm"
#include "spawn_mobs.dm"
diff --git a/code/modules/unit_tests/slime_mood.dm b/code/modules/unit_tests/slime_mood.dm
deleted file mode 100644
index a0d3edb95c17..000000000000
--- a/code/modules/unit_tests/slime_mood.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-///Unit test that tests all types of moods for slimes, to make sure they all have proper icons, excluding moods that intentionally don't have an icon.
-/datum/unit_test/slime_mood
-
-/datum/unit_test/slime_mood/Run()
- var/mob/living/simple_animal/slime/emoting_slime = allocate(/mob/living/simple_animal/slime)
-
- for(var/key in GLOB.emote_list)
- for(var/datum/emote/slime/mood/slime_mood in GLOB.emote_list[key])
- var/list/states = icon_states(emoting_slime.icon)
- if(!slime_mood.mood_key)
- continue
- TEST_ASSERT(("aslime-[slime_mood.mood_key]" in states), "[slime_mood] is set to give [emoting_slime] the [slime_mood.mood_key] emote, but the icon state can't be found in [emoting_slime.icon].")
diff --git a/code/modules/unit_tests/strange_reagent.dm b/code/modules/unit_tests/strange_reagent.dm
index 345be4befe97..e754282eb121 100644
--- a/code/modules/unit_tests/strange_reagent.dm
+++ b/code/modules/unit_tests/strange_reagent.dm
@@ -18,7 +18,7 @@
types_to_check -= /mob/living/simple_animal/pet/gondola/gondolapod // need a pod, which we don't have
types_to_check -= typesof(/mob/living/simple_animal/hostile/megafauna) // no
types_to_check -= typesof(/mob/living/basic/mouse) // qdel themselves on death; why dont they use DEL_ON_DEATH you might ask. I-unno
- types_to_check -= typesof(/mob/living/simple_animal/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves
+ types_to_check -= typesof(/mob/living/basic/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves
for(var/mob/living/type as anything in types_to_check)
var/mob/living/target = allocate_new_target(type)
diff --git a/config/game_options.txt b/config/game_options.txt
index b336b336d268..9553ef352df5 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -48,7 +48,7 @@ WALK_DELAY 4
##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0
##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0
##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0
-##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0
+##MULTIPLICATIVE_MOVESPEED /mob/living/basic/slime 0
MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 0
MULTIPLICATIVE_MOVESPEED /mob/living/basic 0
diff --git a/monkestation/code/controllers/subsystem/job.dm b/monkestation/code/controllers/subsystem/job.dm
index 1642474d8f56..a9e30e36976b 100644
--- a/monkestation/code/controllers/subsystem/job.dm
+++ b/monkestation/code/controllers/subsystem/job.dm
@@ -26,7 +26,7 @@
/// Handle antags as well as assigning people to their jobs
/datum/controller/subsystem/job/proc/handle_final_setup()
var/sanity = 0
- var/max_sane_loops = length(subtypesof(/datum/round_event_control/antagonist/solo) - typesof(/datum/round_event_control/antagonist/solo/ghost)) //not exact, but its close enough
+ var/max_sane_loops = length(subtypesof(/datum/round_event_control/antagonist/solo) - typesof(/datum/round_event_control/antagonist/solo/from_ghosts)) //not exact, but its close enough
pick_desired_roundstart()
while(!handle_roundstart_antags() && !sanity >= max_sane_loops)
sanity++
diff --git a/monkestation/code/modules/aesthetics/mobs/slime.dm b/monkestation/code/modules/aesthetics/mobs/slime.dm
index abde54b2ca69..d660145fb9ba 100644
--- a/monkestation/code/modules/aesthetics/mobs/slime.dm
+++ b/monkestation/code/modules/aesthetics/mobs/slime.dm
@@ -1,11 +1,8 @@
-/mob/living/simple_animal/slime
- icon = 'monkestation/icons/mob/slimes.dmi'
-
/obj/item/stock_parts/cell/emproof/slime
- icon = 'monkestation/icons/mob/slimes.dmi'
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
/obj/item/slime_extract
- icon = 'monkestation/icons/mob/slimes.dmi'
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
/obj/item/stock_parts/cell/emproof/slime/hypercharged
- icon = 'monkestation/icons/mob/slimes.dmi'
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
diff --git a/monkestation/code/modules/cargo/crates/science.dm b/monkestation/code/modules/cargo/crates/science.dm
index 3d9705b86d1e..0ae3dddbc5c6 100644
--- a/monkestation/code/modules/cargo/crates/science.dm
+++ b/monkestation/code/modules/cargo/crates/science.dm
@@ -5,8 +5,9 @@
access = ACCESS_XENOBIOLOGY
contains = list(/obj/item/slime_extract/grey = 2,
/obj/item/reagent_containers/syringe/plasma,
- /obj/item/circuitboard/computer/xenobiology,
- /obj/item/circuitboard/machine/monkey_recycler,
- /obj/item/circuitboard/machine/processor/slime)
+ /obj/item/circuitboard/computer/slime_market,
+ /obj/item/circuitboard/machine/slime_market_pad,
+ /obj/item/circuitboard/machine/biomass_recycler,
+ /obj/item/vacuum_pack)
crate_name = "xenobiology starter crate"
crate_type = /obj/structure/closet/crate/secure/science
diff --git a/monkestation/code/modules/liquids/liquid_controller.dm b/monkestation/code/modules/liquids/liquid_controller.dm
index acdb58359679..6fdd85e5ff61 100644
--- a/monkestation/code/modules/liquids/liquid_controller.dm
+++ b/monkestation/code/modules/liquids/liquid_controller.dm
@@ -46,6 +46,9 @@ SUBSYSTEM_DEF(liquids)
if(length(arrayed_groups))
for(var/g in arrayed_groups)
var/datum/liquid_group/LG = g
+ if(!LG)
+ arrayed_groups -= g
+ continue
while(!MC_TICK_CHECK && length(LG.splitting_array)) // three at a time until we either finish or over-run, this should be done before anything else
LG.work_on_split_queue()
LG.cleanse_members()
@@ -87,6 +90,9 @@ SUBSYSTEM_DEF(liquids)
temperature_queue -= temperature_turf
if(!temperature_turf.liquids)
continue
+ if(!temperature_turf.liquids.liquid_group)
+ qdel(temperature_turf.liquids)
+ continue
temperature_turf.liquids.liquid_group.act_on_queue(temperature_turf)
run_type = SSLIQUIDS_RUN_TYPE_EVAPORATION
diff --git a/monkestation/code/modules/liquids/liquid_effect.dm b/monkestation/code/modules/liquids/liquid_effect.dm
index 201d95fae7b3..9e1e8324791f 100644
--- a/monkestation/code/modules/liquids/liquid_effect.dm
+++ b/monkestation/code/modules/liquids/liquid_effect.dm
@@ -122,6 +122,9 @@
/obj/effect/abstract/liquid_turf/proc/movable_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
+ if(!liquid_group)
+ qdel(src)
+ return
var/turf/T = source
if(isobserver(AM))
@@ -143,8 +146,9 @@
liquid_group.expose_atom(stepped_human, 1, TOUCH)
else if (isliving(AM))
var/mob/living/L = AM
- if(prob(7) && !(L.movement_type & FLYING) && L.body_position == STANDING_UP)
- L.slip(30, T, NO_SLIP_WHEN_WALKING, 0, TRUE)
+ if(liquid_group.slippery)
+ if(prob(7) && !(L.movement_type & FLYING) && L.body_position == STANDING_UP)
+ L.slip(30, T, NO_SLIP_WHEN_WALKING, 0, TRUE)
if(fire_state)
AM.fire_act((T20C+50) + (50*fire_state), 125)
@@ -244,6 +248,10 @@
/obj/effect/abstract/liquid_turf/proc/examine_turf(turf/source, mob/examiner, list/examine_list)
SIGNAL_HANDLER
+ if(!liquid_group)
+ qdel(src)
+ return
+
// This should always have reagents if this effect object exists, but as a sanity check...
if(!length(liquid_group.reagents.reagent_list))
return
diff --git a/monkestation/code/modules/liquids/liquid_groups.dm b/monkestation/code/modules/liquids/liquid_groups.dm
index b9193919dbb2..6f74b9f62fa5 100644
--- a/monkestation/code/modules/liquids/liquid_groups.dm
+++ b/monkestation/code/modules/liquids/liquid_groups.dm
@@ -66,6 +66,8 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
var/exposure = FALSE
///array generated by bulk splitting
var/list/splitting_array = list()
+ ///are we slippery
+ var/slippery = TRUE
///NEW/DESTROY
/datum/liquid_group/New(height, obj/effect/abstract/liquid_turf/created_liquid)
@@ -76,8 +78,10 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
add_to_group(created_liquid.my_turf)
cached_edge_turfs[created_liquid.my_turf] = list(NORTH, SOUTH, EAST, WEST)
SSliquids.active_groups |= src
+ RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(removed_reagent))
/datum/liquid_group/Destroy()
+ UnregisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT)
SSliquids.active_groups -= src
if(src in SSliquids.arrayed_groups)
@@ -86,10 +90,16 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
for(var/t in members)
var/turf/T = t
T.liquids.liquid_group = null
- members = null
+ members = list()
burning_members = null
return ..()
+/datum/liquid_group/proc/removed_reagent(datum/reagents/source, datum/reagent/modified)
+ for(var/turf/member as anything in members)
+ if(!member.liquids)
+ continue
+ modified.remove_from_member(member.liquids)
+
///GROUP CONTROLLING
/datum/liquid_group/proc/add_to_group(turf/T)
if(!T)
@@ -104,6 +114,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
members[T] = TRUE
T.liquids.liquid_group = src
+ for(var/datum/reagent/reagent as anything in reagents.reagent_list)
+ reagent.add_to_member(T.liquids)
+
reagents.maximum_volume += 1000 /// each turf will hold 1000 units plus the base amount spread across the group
if(group_color)
T.liquids.color = group_color
@@ -121,6 +134,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
if(T.liquids)
T.liquids.liquid_group = null
+ for(var/datum/reagent/reagent as anything in reagents.reagent_list)
+ reagent.remove_from_member(T.liquids)
+
if(!members.len)
qdel(src)
return
@@ -145,7 +161,11 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
add_reagents(reagent_list = created_reagent_list, chem_temp = otherg.group_temperature)
cached_edge_turfs |= otherg.cached_edge_turfs
- for(var/turf/liquid_turf in otherg.members)
+ for(var/turf/liquid_turf as anything in members)
+ for(var/datum/reagent/reagent as anything in reagents.reagent_list)
+ reagent.add_to_member(liquid_turf.liquids)
+
+ for(var/turf/liquid_turf as anything in otherg.members)
otherg.remove_from_group(liquid_turf)
add_to_group(liquid_turf)
@@ -219,6 +239,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
for(var/turf/listed_turf as anything in members)
if(isclosedturf(listed_turf))
remove_from_group(listed_turf)
+ qdel(listed_turf.liquids)
/datum/liquid_group/proc/process_member(turf/member)
if(isspaceturf(member))
@@ -237,6 +258,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
turf_reagents = new(100000)
exposure = FALSE
+ slippery = FALSE
for(var/reagent_type in reagents.reagent_list)
var/datum/reagent/pulled_reagent = reagent_type
var/amount = pulled_reagent.volume / members.len
@@ -247,6 +269,8 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
turf_reagents.add_reagent(pulled_reagent.type, amount)
if(pulled_reagent.turf_exposure && amount > 10)
exposure = TRUE
+ if(pulled_reagent.slippery)
+ slippery = TRUE
/datum/liquid_group/proc/process_turf_disperse()
@@ -367,10 +391,34 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
handle_visual_changes()
+/datum/liquid_group/proc/transfer_specific_reagents(datum/reagents/secondary_reagent, amount, list/reagents_to_check, obj/effect/abstract/liquid_turf/remover, merge = FALSE)
+ if(!length(reagents_to_check))
+ return
+ var/total_hits = 0
+ var/total_volume = 0
+ for(var/datum/reagent/reagent_type in reagents.reagent_list)
+ if(!(reagent_type.type in reagents_to_check))
+ continue
+ total_hits++
+ total_volume += reagent_type.volume
+ if(!total_hits)
+ return
+
+ var/precent = (amount / total_volume)
+ for(var/datum/reagent/reagent_type in reagents.reagent_list)
+ if(!(reagent_type.type in reagents_to_check))
+ continue
+ secondary_reagent.add_reagent(reagent_type.type, reagent_type.volume * precent, no_react = TRUE)
+ remove_specific(amount = reagent_type.volume * precent, reagent_type = reagent_type.type)
+
+ process_removal()
+ handle_visual_changes()
+
+
/datum/liquid_group/proc/process_removal(amount)
total_reagent_volume = reagents.total_volume
- if(total_reagent_volume)
+ if(total_reagent_volume && length(members)) //Otherwise we are probably just sending the last of things
reagents_per_turf = total_reagent_volume / length(members)
else
reagents_per_turf = 0
@@ -743,7 +791,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
var/list/temp = return_connected_liquids(cardinal.liquids)
if(isnull(temp) || !length(temp))
continue
- connected_array += list(temp)
+ connected_array += list(list(temp))
if(!length(connected_array))
return
@@ -775,6 +823,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
for(var/list/liquid_list as anything in connected_liquids)
var/datum/liquid_group/new_group = new(1)
+ if(!members)
+ members = list()
+ trans_to_seperate_group(new_group.reagents, amount_to_transfer)
for(var/turf/connected_liquid in liquid_list)
new_group.check_edges(connected_liquid)
@@ -784,7 +835,6 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE)
remove_from_group(connected_liquid, TRUE)
new_group.add_to_group(connected_liquid)
- trans_to_seperate_group(new_group.reagents, amount_to_transfer)
new_group.total_reagent_volume = new_group.reagents.total_volume
new_group.reagents_per_turf = new_group.total_reagent_volume / length(new_group.members)
diff --git a/monkestation/code/modules/liquids/liquid_status_effect.dm b/monkestation/code/modules/liquids/liquid_status_effect.dm
index f431e586f58e..2311372f9d18 100644
--- a/monkestation/code/modules/liquids/liquid_status_effect.dm
+++ b/monkestation/code/modules/liquids/liquid_status_effect.dm
@@ -29,10 +29,11 @@
return ..()
/datum/status_effect/water_affected/on_remove()
- owner.remove_movespeed_modifier("water_slow")
+ owner.remove_movespeed_modifier("liquid_slowdown")
/datum/movespeed_modifier/liquids
+ id = "liquid_slowdown"
variable = TRUE
blacklisted_movetypes = FLOATING
diff --git a/monkestation/code/modules/liquids/liquid_turf.dm b/monkestation/code/modules/liquids/liquid_turf.dm
index 2087a5ac0a93..226d9afd6ecd 100644
--- a/monkestation/code/modules/liquids/liquid_turf.dm
+++ b/monkestation/code/modules/liquids/liquid_turf.dm
@@ -37,6 +37,10 @@
//More efficient than add_liquid for multiples
/turf/proc/add_liquid_list(reagent_list, no_react = FALSE, chem_temp)
+ if(liquids && !liquids.liquid_group)
+ qdel(liquids)
+ return
+
if(!liquids)
liquids = new(src)
liquids.liquid_group.add_reagents(liquids, reagent_list, chem_temp)
diff --git a/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm b/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm
index 829ea9762e86..b3f32178b408 100644
--- a/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm
+++ b/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm
@@ -4,7 +4,7 @@
name = "Cargo Driver"
id = MASSDRIVER_CARGO
-/obj/machinery/mass_driver/drive(amount)
+/obj/machinery/mass_driver/cargo_driver/drive(amount)
if(machine_stat & (BROKEN|NOPOWER))
return
use_power(active_power_usage)
@@ -24,7 +24,8 @@
break
use_power(active_power_usage)
O.throw_at(target, get_dist(src, target) + 4, power)
- addtimer(CALLBACK(O, TYPE_PROC_REF(/atom/movable, attempt_map_sell)), 4 SECONDS / power)
+ if(length(SSmapping.levels_by_trait(ZTRAIT_OSHAN)))
+ addtimer(CALLBACK(O, TYPE_PROC_REF(/atom/movable, attempt_map_sell)), 4 SECONDS / power)
flick("mass_driver1", src)
/atom/movable/proc/attempt_map_sell()
diff --git a/monkestation/code/modules/pollution/pollutant_datum.dm b/monkestation/code/modules/pollution/pollutant_datum.dm
index 5fc09f0247ba..fe4c09bde95c 100644
--- a/monkestation/code/modules/pollution/pollutant_datum.dm
+++ b/monkestation/code/modules/pollution/pollutant_datum.dm
@@ -18,14 +18,14 @@
/// Scent of the smell
var/scent
-///When a pollutant touches an unprotected carbon mob
-/datum/pollutant/proc/touch_act(mob/living/carbon/victim, amount)
+///When a pollutant touches an unprotected mob
+/datum/pollutant/proc/touch_act(mob/living/victim, amount)
return
///When a carbon mob breathes in the pollutant
/datum/pollutant/proc/breathe_act(mob/living/carbon/victim, amount)
return
-///When a carbon mob smells scents this is called
+///When a carbon mob smells scents this is called
/datum/pollutant/proc/on_smell(mob/living/carbon/victim, amount)
return
diff --git a/monkestation/code/modules/research/xenobiology/xenobio_camera.dm b/monkestation/code/modules/research/xenobiology/xenobio_camera.dm
deleted file mode 100644
index bb2302d029f4..000000000000
--- a/monkestation/code/modules/research/xenobiology/xenobio_camera.dm
+++ /dev/null
@@ -1,15 +0,0 @@
-/mob/camera/ai_eye/remote/xenobio/proc/auto_attach_slime(mob/living/carbon/human/food)
- var/mob/living/simple_animal/slime/glutton
- for(var/mob/living/simple_animal/slime/slime in range(1, loc))
- if(slime.ckey || slime.amount_grown >= SLIME_EVOLUTION_THRESHOLD)
- continue
- var/mob/living/slime_eating = slime.buckled
- if(!isliving(slime_eating) || slime_eating.stat < DEAD)
- continue
- if(glutton?.is_adult && !slime.is_adult)
- // adult slimes can react faster than baby slimes
- continue
- if(QDELETED(glutton) || (!glutton.is_adult && slime.is_adult) || (slime.amount_grown > glutton.amount_grown))
- glutton = slime
- if(!QDELETED(glutton))
- addtimer(CALLBACK(glutton, TYPE_PROC_REF(/mob/living/simple_animal/slime, Feedon), food), rand(0.1 SECONDS, 0.9 SECONDS))
diff --git a/monkestation/code/modules/slimecore/animations/slime_effects.dm b/monkestation/code/modules/slimecore/animations/slime_effects.dm
new file mode 100644
index 000000000000..ae59551d2625
--- /dev/null
+++ b/monkestation/code/modules/slimecore/animations/slime_effects.dm
@@ -0,0 +1,38 @@
+/obj/effect/abstract/blank
+ name = ""
+ alpha = 150
+ anchored = TRUE
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ icon ='monkestation/code/modules/slimecore/icons/filters.dmi'
+ icon_state = "diag"
+ vis_flags = VIS_INHERIT_PLANE | VIS_INHERIT_LAYER
+ blend_mode = BLEND_INSET_OVERLAY
+
+/atom/movable/proc/rainbow_effect() // this just animates between the primary colors of a rainbow
+ var/obj/effect/abstract/blank/rainbow_effect = new
+
+ appearance_flags &= ~KEEP_APART
+ appearance_flags |= KEEP_TOGETHER
+ vis_contents += rainbow_effect
+
+/atom/movable/proc/remove_rainbow_effect()
+ var/obj/effect/abstract/blank/rainbow_effect = locate() in vis_contents
+ qdel(rainbow_effect)
+
+/image/proc/rainbow_effect() // this just animates between the primary colors of a rainbow
+ var/obj/effect/abstract/blank/rainbow_effect = new
+
+ appearance_flags &= ~KEEP_APART
+ appearance_flags |= KEEP_TOGETHER
+ vis_contents += rainbow_effect
+
+/atom/proc/ungulate()
+ var/matrix/ungulate_matrix = matrix(transform)
+ ungulate_matrix.Scale(1, 0.9)
+ var/matrix/base_matrix = matrix(transform)
+ var/base_pixel_y = pixel_y
+
+ animate(src, transform = ungulate_matrix, time = 0.1 SECONDS, easing = EASE_OUT, loop = -1)
+ animate(pixel_y = -1, time = 0.1 SECONDS, easing = EASE_OUT)
+ animate(transform = base_matrix, time = 0.1 SECONDS, easing = EASE_IN)
+ animate(pixel_y = base_pixel_y, time = 0.1 SECONDS, easing = EASE_IN)
diff --git a/monkestation/code/modules/slimecore/assets/xenobiology.dm b/monkestation/code/modules/slimecore/assets/xenobiology.dm
new file mode 100644
index 000000000000..b8677ba2e83f
--- /dev/null
+++ b/monkestation/code/modules/slimecore/assets/xenobiology.dm
@@ -0,0 +1,5 @@
+/datum/asset/spritesheet/xenobio_market
+ name = "xenobio_market"
+
+/datum/asset/spritesheet/xenobio_market/create_spritesheets()
+ InsertAll("", 'monkestation/code/modules/slimecore/icons/slimes.dmi')
diff --git a/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm b/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm
new file mode 100644
index 000000000000..3b3aa14886bb
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm
@@ -0,0 +1,40 @@
+/datum/component/scared_of_item // this runs independantly of ai_controller so we aren't wasting ai process time on this as its a passive check.
+ var/range
+ var/was_scared = FALSE
+ var/mob/last_scared_by
+
+/datum/component/scared_of_item/Initialize(item_path, range)
+ src.range = range
+
+ START_PROCESSING(SSobj, src)
+
+/datum/component/scared_of_item/process(seconds_per_tick)
+ var/mob/living/basic/basic_mob = parent
+
+ if(isliving(parent))
+ var/mob/living/living = parent
+ if(living.stat == DEAD)
+ return
+
+ var/broke = FALSE
+ for(var/mob/living/carbon/human/human in oview(range, basic_mob))
+ for(var/obj/item/item as anything in human.held_items)
+ if(!item)
+ continue
+ if(item.type != basic_mob.ai_controller.blackboard[BB_BASIC_MOB_SCARED_ITEM])
+ continue
+ basic_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE)
+
+ if(!was_scared)
+ SEND_SIGNAL(basic_mob, COMSIG_EMOTION_STORE, human, EMOTION_SCARED, "chased me with an extinguisher.")
+ last_scared_by = human
+ was_scared = TRUE
+ broke = TRUE
+ break
+ if(broke)
+ return
+ basic_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE)
+ if(was_scared)
+ SEND_SIGNAL(basic_mob, COMSIG_EMOTION_STORE, last_scared_by, EMOTION_HAPPY, "stopped chasing me with an extinguisher.", 0)
+ was_scared = FALSE
+ last_scared_by = null
diff --git a/monkestation/code/modules/slimecore/components/emotion_buffer.dm b/monkestation/code/modules/slimecore/components/emotion_buffer.dm
new file mode 100644
index 000000000000..ce715b741706
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/emotion_buffer.dm
@@ -0,0 +1,136 @@
+//This is really just a storage cell for mood messages, also handles some basic responding to emotional events for mobs
+/datum/component/emotion_buffer
+ var/mob/living/host
+
+ ///our current emotion
+ var/current_emotion = EMOTION_HAPPY
+
+ ///the buffer of emotional things with there emotion stored like EMOTION_HAPPY = List("Was fed by x")
+ var/emotional_buffer = list(
+ EMOTION_HAPPY = list(),
+ EMOTION_SAD = list(),
+ EMOTION_ANGER = list(),
+ EMOTION_FUNNY = list(),
+ EMOTION_SCARED = list(),
+ EMOTION_SUPRISED = list(),
+ EMOTION_HUNGRY = list(),
+ )
+
+ var/emotional_responses = list(
+ EMOTION_HAPPY = list(),
+ EMOTION_SAD = list(),
+ EMOTION_ANGER = list(),
+ EMOTION_FUNNY = list(),
+ EMOTION_SCARED = list(),
+ EMOTION_SUPRISED = list(),
+ EMOTION_HUNGRY = list(),
+ )
+
+ var/emotional_heard = list(
+ EMOTION_HAPPY = list(),
+ EMOTION_SAD = list(),
+ EMOTION_ANGER = list(),
+ EMOTION_FUNNY = list(),
+ EMOTION_SCARED = list(),
+ EMOTION_SUPRISED = list(),
+ EMOTION_HUNGRY = list(),
+ )
+
+ ///these are sent as emotion = icon_state, where the icon is stored inside the sources icon file
+ var/list/emotional_overlays = list()
+
+/datum/component/emotion_buffer/Initialize(list/emotional_overlay_states)
+ . = ..()
+ host = parent
+ if(!length(emotional_overlay_states))
+ emotional_overlays = list()
+ emotional_overlays = emotional_overlay_states
+
+/datum/component/emotion_buffer/RegisterWithParent()
+ . = ..()
+ if(length(emotional_overlays))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(emotion_overlay))
+ RegisterSignal(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, PROC_REF(replace_overlays))
+
+ RegisterSignal(parent, COMSIG_EMOTION_STORE, PROC_REF(register_emotional_data))
+ RegisterSignal(parent, EMOTION_BUFFER_SPEAK_FROM_BUFFER, PROC_REF(speak_from_buffer))
+ RegisterSignal(parent, COMSIG_EMOTION_HEARD, PROC_REF(store_heard))
+ RegisterSignal(parent, COMSIG_MOVABLE_HEAR, PROC_REF(hear_speech))
+
+/datum/component/emotion_buffer/Destroy(force, silent)
+ . = ..()
+ host = null
+
+/datum/component/emotion_buffer/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, COMSIG_EMOTION_STORE)
+ UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS)
+ UnregisterSignal(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES)
+ UnregisterSignal(parent, EMOTION_BUFFER_SPEAK_FROM_BUFFER)
+ UnregisterSignal(parent, COMSIG_EMOTION_HEARD)
+ UnregisterSignal(parent, COMSIG_MOVABLE_HEAR)
+
+
+/datum/component/emotion_buffer/proc/register_emotional_data(datum/source, atom/from, emotion, emotional_text, intensity = 1)
+ if(!emotional_buffer[emotion])
+ return
+
+ if((emotion in list(EMOTION_ANGER, EMOTION_SAD, EMOTION_SCARED)) && intensity)
+ intensity *= -1
+
+
+ if(from)
+ emotional_buffer[emotion] += list("[from] [emotional_text]" = FALSE)
+ if(intensity)
+ SEND_SIGNAL(parent, COMSIG_FRIENDSHIP_CHANGE, from, intensity)
+ else
+ emotional_buffer[emotion] += list("[emotional_text]" = FALSE)
+
+ current_emotion = emotion
+
+/datum/component/emotion_buffer/proc/emotion_overlay(mob/living/source, list/overlays)
+ if(!emotional_overlays[current_emotion])
+ return
+ if(source.health <= 0)
+ return
+ overlays += mutable_appearance(source.icon, emotional_overlays[current_emotion], source.layer, source)
+
+/datum/component/emotion_buffer/proc/replace_overlays(mob/living/source, list/new_icon_states)
+ emotional_overlays = list()
+ emotional_overlays += new_icon_states
+
+/datum/component/emotion_buffer/proc/speak_from_buffer(mob/living/source)
+ if(prob(100))
+ var/spoken_emotion = current_emotion
+ if(prob(25))
+ var/list/viable_emotions = list()
+ for(var/emotion in emotional_buffer)
+ if(!length(emotional_buffer[emotion]))
+ continue
+ viable_emotions |= emotion
+ if(!length(viable_emotions))
+ return
+ spoken_emotion = pick(viable_emotions)
+ var/list/speakable_phrases = list()
+ for(var/phrase in emotional_buffer[spoken_emotion])
+ if(emotional_buffer[spoken_emotion][phrase])
+ continue
+ speakable_phrases |= phrase
+
+ if(!length(speakable_phrases))
+ return
+ var/choice = pick(speakable_phrases)
+ if(!choice)
+ return
+ emotional_buffer[spoken_emotion][choice] = TRUE
+ source.say(choice)
+
+ for(var/mob/living/mob in range(5, source))
+ if(mob == source)
+ continue
+ SEND_SIGNAL(mob, COMSIG_EMOTION_HEARD, spoken_emotion, choice, source)
+
+/datum/component/emotion_buffer/proc/store_heard(mob/living/source, emotion, phrase, mob/living/speaker)
+ emotional_heard[emotion] += list("[speaker] said [phrase]" = FALSE)
+
+/datum/component/emotion_buffer/proc/hear_speech()
diff --git a/monkestation/code/modules/slimecore/components/friendship_tracker.dm b/monkestation/code/modules/slimecore/components/friendship_tracker.dm
new file mode 100644
index 000000000000..0c3305b33349
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/friendship_tracker.dm
@@ -0,0 +1,56 @@
+/datum/component/friendship_container
+ ///our friendship thresholds from lowest to highest
+ var/list/friendship_levels = list()
+ ///our current friends stored as a weakref = amount
+ var/list/weakrefed_friends = list()
+ ///list of friendship levels that we send BEFRIEND signals on, if someone drops below these levels its over
+ var/befriend_level
+ ///list of all befriended refs
+ var/list/befriended_refs = list()
+
+/datum/component/friendship_container/Initialize(friendship_levels = list(), befriend_level)
+ . = ..()
+ if(!length(friendship_levels))
+ return FALSE
+
+ src.friendship_levels = friendship_levels
+ src.befriend_level = befriend_level
+
+
+/datum/component/friendship_container/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_FRIENDSHIP_CHECK_LEVEL, PROC_REF(check_friendship_level))
+ RegisterSignal(parent, COMSIG_FRIENDSHIP_CHANGE, PROC_REF(change_friendship))
+
+/datum/component/friendship_container/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_FRIENDSHIP_CHECK_LEVEL)
+ UnregisterSignal(parent, COMSIG_FRIENDSHIP_CHANGE)
+
+/datum/component/friendship_container/proc/change_friendship(mob/living/source, atom/target, amount)
+ for(var/datum/weakref/ref as anything in weakrefed_friends)
+ if(ref.resolve() == target)
+
+ ///handles registering pet commands and other things that use BEFRIEND
+ if(amount < 0)
+ if((friendship_levels[befriend_level] > weakrefed_friends[ref]) && (ref in befriended_refs))
+ SEND_SIGNAL(parent, COMSIG_LIVING_UNFRIENDED, ref.resolve())
+ befriended_refs -= ref
+ source.ai_controller?.remove_thing_from_blackboard_key(BB_FRIENDS_LIST, target)
+
+ else if((friendship_levels[befriend_level] <= weakrefed_friends[ref]) && !(ref in befriended_refs))
+ SEND_SIGNAL(parent, COMSIG_LIVING_BEFRIENDED, ref.resolve())
+ befriended_refs += ref
+ source.ai_controller?.insert_blackboard_key_lazylist(BB_FRIENDS_LIST, target)
+
+ weakrefed_friends[ref] += amount
+ return TRUE
+ weakrefed_friends += list(WEAKREF(target) = amount)
+ return TRUE
+
+///Returns {TRUE} if friendship is above a certain threshold else returns {FALSE}
+/datum/component/friendship_container/proc/check_friendship_level(mob/living/source, atom/target, friendship_level)
+ for(var/datum/weakref/ref as anything in weakrefed_friends)
+ if(ref.resolve() == target)
+ if(friendship_levels[friendship_level] <= weakrefed_friends[ref])
+ return TRUE
+ return FALSE
+ return FALSE
diff --git a/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm b/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm
new file mode 100644
index 000000000000..a8aefc5df81c
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm
@@ -0,0 +1,94 @@
+/datum/component/generic_mob_hunger
+ var/current_hunger
+ var/max_hunger
+ ///this is the rate at which our hunger passively drains
+ var/hunger_drain
+ var/hunger_paused = FALSE
+ var/feed_pause_time
+ var/feed_pause_end
+
+/datum/component/generic_mob_hunger/Initialize(max_hunger = 250, hunger_drain = 0.1, feed_pause_time = 1 MINUTE, starting_hunger)
+ . = ..()
+ src.hunger_drain = hunger_drain
+ src.max_hunger = max_hunger
+ src.feed_pause_time = feed_pause_time
+ if(!starting_hunger)
+ src.current_hunger = max_hunger
+ else
+ src.current_hunger = starting_hunger
+
+ START_PROCESSING(SSobj, src)
+
+/datum/component/generic_mob_hunger/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_MOB_STOP_HUNGER, PROC_REF(stop_hunger))
+ RegisterSignal(parent, COMSIG_MOB_START_HUNGER, PROC_REF(start_hunger))
+ RegisterSignal(parent, COMSIG_MOB_FEED, PROC_REF(on_feed))
+ RegisterSignal(parent, COMSIG_MOB_RETURN_HUNGER, PROC_REF(return_hunger))
+ RegisterSignal(parent, COMSIG_MOB_ADJUST_HUNGER, PROC_REF(adjust_hunger))
+
+/datum/component/generic_mob_hunger/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_MOB_STOP_HUNGER)
+ UnregisterSignal(parent, COMSIG_MOB_START_HUNGER)
+ UnregisterSignal(parent, COMSIG_MOB_FEED)
+ UnregisterSignal(parent, COMSIG_MOB_RETURN_HUNGER)
+ UnregisterSignal(parent, COMSIG_MOB_ADJUST_HUNGER)
+
+/datum/component/generic_mob_hunger/proc/stop_hunger()
+ hunger_paused = TRUE
+
+/datum/component/generic_mob_hunger/proc/start_hunger()
+ hunger_paused = FALSE
+
+/datum/component/generic_mob_hunger/proc/on_feed(datum/source, atom/target, feed_amount)
+ SIGNAL_HANDLER
+ if(current_hunger > max_hunger)
+ SEND_SIGNAL(parent, COMSIG_MOB_REFUSED_EAT)
+ return
+
+ SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger + feed_amount, max_hunger)
+ if(current_hunger + feed_amount > max_hunger)
+ var/temp = (current_hunger + feed_amount) / max_hunger
+ SEND_SIGNAL(parent, COMSIG_MOB_OVERATE, temp)
+ ADD_TRAIT(parent, TRAIT_OVERFED, "hunger_trait")
+ addtimer(CALLBACK(src, PROC_REF(remove_hunger_trait), TRAIT_OVERFED), 5 MINUTES, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
+ current_hunger += feed_amount
+ if(feed_pause_time)
+ feed_pause_end = world.time + feed_pause_time
+ return
+
+ current_hunger += feed_amount
+ SEND_SIGNAL(parent, COMSIG_MOB_EAT_NORMAL, current_hunger)
+ if(feed_pause_time)
+ feed_pause_end = world.time + feed_pause_time
+
+/datum/component/generic_mob_hunger/proc/return_hunger()
+ SIGNAL_HANDLER
+ return current_hunger / max_hunger
+
+/datum/component/generic_mob_hunger/process(seconds_per_tick)
+ if(hunger_paused || !hunger_drain || (feed_pause_end > world.time))
+ return
+
+ if(isliving(parent))
+ var/mob/living/living = parent
+ if(living.stat == DEAD)
+ return
+
+ if(current_hunger >= hunger_drain)
+ current_hunger -= hunger_drain
+ SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger, max_hunger)
+
+ var/hunger_precent = current_hunger / max_hunger
+
+ if(hunger_precent <= 0.25)
+ SEND_SIGNAL(parent, COMSIG_MOB_STARVING, hunger_precent)
+ else
+ current_hunger = 0
+ SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger, max_hunger)
+ SEND_SIGNAL(parent, COMSIG_MOB_FULLY_STARVING)
+
+/datum/component/generic_mob_hunger/proc/adjust_hunger(datum/source, amount)
+ current_hunger += amount
+
+/datum/component/generic_mob_hunger/proc/remove_hunger_trait(trait)
+ REMOVE_TRAIT(parent, trait, "hunger_trait")
diff --git a/monkestation/code/modules/slimecore/components/latch_feeding.dm b/monkestation/code/modules/slimecore/components/latch_feeding.dm
new file mode 100644
index 000000000000..5780c4b45efb
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/latch_feeding.dm
@@ -0,0 +1,123 @@
+/datum/component/latch_feeding
+ var/damage_type
+ var/damage_amount
+
+ ///this is the target we are sucking
+ var/atom/movable/target
+ ///this is the amount of hunger we are sending per feed process
+ var/hunger_restore
+ ///do we stop at crit?
+ var/stops_at_crit
+ ///did we just unlatch?
+ var/unlatching = FALSE
+ ///our callback
+ var/datum/callback/check_and_replace
+
+/datum/component/latch_feeding/Initialize(atom/movable/target, damage_type, damage_amount, hunger_restore, stops_at_crit, datum/callback/callback, checks_loc = TRUE)
+ . = ..()
+ src.target = target
+ if(!target)
+ return COMPONENT_INCOMPATIBLE
+
+ src.damage_type = damage_type
+ src.damage_amount = damage_amount
+ src.hunger_restore = hunger_restore
+ src.stops_at_crit = stops_at_crit
+ src.check_and_replace = callback
+
+ if(!latch_target(loc_check = checks_loc))
+ return COMPONENT_INCOMPATIBLE
+
+ ADD_TRAIT(parent, TRAIT_FEEDING, LATCH_TRAIT)
+
+ START_PROCESSING(SSobj, src)
+
+/datum/component/latch_feeding/Destroy(force, silent)
+ REMOVE_TRAIT(parent, TRAIT_FEEDING, LATCH_TRAIT)
+ . = ..()
+ target = null
+ qdel(check_and_replace)
+
+/datum/component/latch_feeding/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_buckled))
+ RegisterSignal(parent, COMSIG_MOB_OVERATE, PROC_REF(stop_feeding))
+
+/datum/component/latch_feeding/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_LIVING_SET_BUCKLED)
+ UnregisterSignal(parent, COMSIG_MOB_OVERATE)
+
+/datum/component/latch_feeding/proc/latch_target(init = FALSE, loc_check = TRUE)
+ var/mob/basic_mob = parent
+ var/mob/living/living_target = target
+ SEND_SIGNAL(basic_mob, COMSIG_MOBSTACKER_DESTROY)
+ basic_mob.unbuckle_all_mobs()
+ if((living_target.stat >= SOFT_CRIT) && stops_at_crit && living_target.client)
+ if(init)
+ return FALSE
+ else
+ qdel(src)
+ return FALSE
+
+ target.unbuckle_all_mobs(force = TRUE)
+ if(target.buckle_mob(basic_mob, TRUE, loc_check))
+ basic_mob.layer = target.layer + 0.1
+ target.visible_message(span_danger("[basic_mob] latches onto [target]!"), \
+ span_userdanger("[basic_mob] latches onto [target]!"))
+ ADD_TRAIT(target, TRAIT_LATCH_FEEDERED, "latch_feeding")
+ return TRUE
+ else
+ to_chat(basic_mob, span_notice("You failed to latch onto [target]."))
+ if(init)
+ return FALSE
+ else
+ qdel(src)
+
+/datum/component/latch_feeding/proc/unlatch_target(living = TRUE, silent = FALSE)
+ var/mob/basic_mob = parent
+ if(!target)
+ return
+ if(basic_mob.buckled)
+ if(!living)
+ to_chat(basic_mob, "[pick("This subject is incompatible", \
+ "This subject does not have life energy", "This subject is empty", \
+ "I am not satisified", "I can not feed from this subject", \
+ "I do not feel nourished", "This subject is not food")]!")
+ if(!silent)
+ basic_mob.visible_message(span_warning("[basic_mob] lets go of [basic_mob.buckled]!"), \
+ span_notice("I stopped feeding."))
+
+ REMOVE_TRAIT(target, TRAIT_LATCH_FEEDERED, "latch_feeding")
+ basic_mob.layer = initial(basic_mob.layer)
+ if(basic_mob.buckled)
+ basic_mob.buckled.unbuckle_mob(basic_mob, force=TRUE)
+
+/datum/component/latch_feeding/proc/check_buckled(mob/living/source, atom/movable/new_buckled)
+ if(!new_buckled && !unlatching)
+ unlatching = TRUE
+ unlatch_target()
+ qdel(src)
+ return
+
+/datum/component/latch_feeding/proc/stop_feeding()
+ unlatch_target()
+ qdel(src)
+
+/datum/component/latch_feeding/process(seconds_per_tick)
+ if(!target)
+ qdel(src)
+ return
+
+ var/mob/living/living_target = target
+ if((living_target.stat >= SOFT_CRIT) && stops_at_crit && living_target.client)
+ stop_feeding()
+ return
+
+ if(!check_and_replace || (check_and_replace && !check_and_replace.Invoke()))
+ if(iscarbon(living_target))
+ living_target.apply_damage(damage_amount, damage_type, spread_damage = TRUE)
+ else
+ living_target.apply_damage(damage_amount, BRUTE, spread_damage = TRUE)
+
+ if(parent) // ??? I was getting runtimes for no parent but IDK how
+ SEND_SIGNAL(parent, COMSIG_MOB_FEED, target, hunger_restore)
+ SEND_SIGNAL(target, COMSIG_MOB_FED_ON, parent, hunger_restore)
diff --git a/monkestation/code/modules/slimecore/components/liquid_secretion.dm b/monkestation/code/modules/slimecore/components/liquid_secretion.dm
new file mode 100644
index 000000000000..5dce38e9a8b8
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/liquid_secretion.dm
@@ -0,0 +1,50 @@
+/datum/component/liquid_secretion
+ ///the reagent we secrete
+ var/reagent_id
+ ///the interval of secretion
+ var/secretion_interval
+ ///amount of reagents to spawn
+ var/amount
+ ///Callback interaction called when the turf has some liquids on it
+ var/datum/callback/pre_secrete_callback
+ var/next_secrete = 0
+
+
+
+/datum/component/liquid_secretion/Initialize(reagent_id = /datum/reagent/water, amount = 10, secretion_interval = 1 SECONDS, pre_secrete_callback)
+ . = ..()
+
+ src.reagent_id = reagent_id
+ src.secretion_interval = secretion_interval
+ src.amount = amount
+ src.pre_secrete_callback = CALLBACK(parent, pre_secrete_callback)
+
+ START_PROCESSING(SSobj, src)
+
+/datum/component/liquid_secretion/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_SECRETION_UPDATE, PROC_REF(update_information)) //The only signal allowing item -> turf interaction
+
+/datum/component/liquid_secretion/UnregisterFromParent()
+ UnregisterSignal(parent, COMSIG_SECRETION_UPDATE)
+
+/datum/component/liquid_secretion/proc/update_information(datum/source, reagent_id, amount, secretion_interval)
+ if(reagent_id)
+ src.reagent_id = reagent_id
+ if(amount)
+ src.amount = amount
+ if(secretion_interval)
+ src.secretion_interval = secretion_interval
+
+
+/datum/component/liquid_secretion/process(seconds_per_tick)
+ if(!parent || (next_secrete > world.time))
+ return
+ next_secrete = world.time + secretion_interval
+ if(pre_secrete_callback && !pre_secrete_callback.Invoke(parent))
+ return
+
+ var/turf/parent_turf = get_turf(parent)
+ var/list/reagent_list = list()
+ reagent_list |= reagent_id
+ reagent_list[reagent_id] = amount
+ parent_turf.add_liquid_list(reagent_list, FALSE, T20C)
diff --git a/monkestation/code/modules/slimecore/components/mob_stacker.dm b/monkestation/code/modules/slimecore/components/mob_stacker.dm
new file mode 100644
index 000000000000..4bc78677349a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/mob_stacker.dm
@@ -0,0 +1,84 @@
+/datum/component/mob_stacker
+ var/list/stacked_mobs = list()
+ ///until we get a better pixel proc this is a constant offset
+ var/constant_offset = 0
+ ///this is our top most atoms
+ var/mob/living/current_head
+ ///this is our brain the main dude
+ var/mob/living/main_dude
+
+ ///are we breaking apart
+ var/breaking = FALSE
+
+ var/max_size = 1
+
+
+/datum/component/mob_stacker/Initialize(...)
+ . = ..()
+ main_dude = parent
+ current_head = parent
+ max_size = rand(1, 7)
+ main_dude.max_buckled_mobs = max_size
+ addtimer(CALLBACK(src, PROC_REF(destroy_self)), rand(30 SECONDS, 120 SECONDS))
+
+/datum/component/mob_stacker/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_CHECK_CAN_ADD_NEW_STACK, PROC_REF(can_add))
+ RegisterSignal(parent, COMSIG_ATOM_JOIN_STACK, PROC_REF(try_join_stack))
+ RegisterSignal(parent, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_collapse))
+ RegisterSignal(parent, COMSIG_MOBSTACKER_DESTROY, PROC_REF(destroy_self))
+
+/datum/component/mob_stacker/Destroy(force, silent)
+ . = ..()
+ UnregisterSignal(main_dude, COMSIG_ATOM_JOIN_STACK)
+ UnregisterSignal(main_dude, COMSIG_LIVING_SET_BUCKLED)
+ UnregisterSignal(main_dude, COMSIG_CHECK_CAN_ADD_NEW_STACK)
+ if(main_dude.buckled)
+ main_dude.buckled.unbuckle_mob(main_dude, force=TRUE)
+ main_dude = null
+ current_head = null
+ for(var/mob/living/dude as anything in stacked_mobs)
+ if(isbasicmob(dude))
+ var/mob/living/basic/basic = dude
+ basic.ai_controller?.set_ai_status(AI_STATUS_ON)
+ REMOVE_TRAIT(dude, TRAIT_IN_STACK, "mob_stack")
+ UnregisterSignal(dude, COMSIG_ATOM_JOIN_STACK)
+ UnregisterSignal(dude, COMSIG_LIVING_SET_BUCKLED)
+ if(dude.buckled)
+ dude.buckled.unbuckle_mob(dude, force=TRUE)
+ stacked_mobs -= dude
+
+
+/datum/component/mob_stacker/proc/try_join_stack(datum/source, mob/living/joiner)
+ SIGNAL_HANDLER
+ if(joiner in stacked_mobs)
+ return
+
+ if(main_dude.buckle_mob(joiner, force = TRUE))
+ ADD_TRAIT(joiner, TRAIT_IN_STACK, "mob_stack")
+ if(isbasicmob(joiner))
+ var/mob/living/basic/basic = joiner
+ basic.ai_controller?.set_ai_status(AI_STATUS_OFF)
+ current_head = joiner
+ stacked_mobs += joiner
+ RegisterSignal(joiner, COMSIG_ATOM_JOIN_STACK, PROC_REF(try_join_stack))
+ RegisterSignal(joiner, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_collapse))
+ joiner.pixel_y += constant_offset
+ constant_offset += joiner.get_mob_buckling_height(current_head)
+
+/datum/component/mob_stacker/proc/check_collapse(mob/living/source, atom/movable/new_buckled)
+ if(new_buckled != main_dude && !breaking)
+ breaking = TRUE
+ qdel(src)
+
+/datum/component/mob_stacker/proc/can_add(datum/source)
+ SIGNAL_HANDLER
+ //this isn't a 1 line return because I like to debug
+ var/value = length(stacked_mobs)
+ if(value < max_size)
+ return TRUE
+ else
+ return FALSE
+
+/datum/component/mob_stacker/proc/destroy_self()
+ qdel(src)
diff --git a/monkestation/code/modules/slimecore/components/pollution_scrubber.dm b/monkestation/code/modules/slimecore/components/pollution_scrubber.dm
new file mode 100644
index 000000000000..108dfb2bd7a9
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/pollution_scrubber.dm
@@ -0,0 +1,28 @@
+/datum/component/pollution_scrubber
+ ///the amount we try to scrub each process
+ var/scrubbing_amount
+ ///the lifetime if set it will delete itself after this point
+ var/lifetime
+
+/datum/component/pollution_scrubber/Initialize(scrubbing_amount, lifetime)
+ . = ..()
+ src.scrubbing_amount = scrubbing_amount
+ src.lifetime = lifetime
+
+ if(lifetime)
+ addtimer(CALLBACK(src, PROC_REF(kill_component)), lifetime)
+ START_PROCESSING(SSobj, src)
+
+
+/datum/component/pollution_scrubber/proc/kill_component()
+ qdel(src)
+
+/datum/component/pollution_scrubber/process(seconds_per_tick)
+ if(isliving(parent))
+ var/mob/living/living = parent
+ if(living.stat == DEAD)
+ return
+
+ var/turf/open/turf = get_turf(parent)
+ if(turf.pollution)
+ turf.pollution.scrub_amount(scrubbing_amount)
diff --git a/monkestation/code/modules/slimecore/components/vac_tagged.dm b/monkestation/code/modules/slimecore/components/vac_tagged.dm
new file mode 100644
index 000000000000..317e3889cfa8
--- /dev/null
+++ b/monkestation/code/modules/slimecore/components/vac_tagged.dm
@@ -0,0 +1,16 @@
+/datum/component/vac_tagged
+ var/datum/weakref/creator
+
+/datum/component/vac_tagged/Initialize(mob/creator_mob)
+ . = ..()
+ if(!creator_mob)
+ return COMPONENT_INCOMPATIBLE
+
+ creator = WEAKREF(creator_mob)
+
+/datum/component/vac_tagged/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_MOB_FED_ON, PROC_REF(on_fed_on))
+
+/datum/component/vac_tagged/proc/on_fed_on(mob/living/source, mob/living/feeder, hunger_restored)
+ SEND_SIGNAL(feeder, COMSIG_FRIENDSHIP_CHANGE, creator.resolve(), (hunger_restored * 0.1))
diff --git a/monkestation/code/modules/slimecore/corral/corral_data.dm b/monkestation/code/modules/slimecore/corral/corral_data.dm
new file mode 100644
index 000000000000..9d85e492f8bf
--- /dev/null
+++ b/monkestation/code/modules/slimecore/corral/corral_data.dm
@@ -0,0 +1,78 @@
+//this is just a doc comment but currently the max interior size is 9x9 so 11x11 if you include the corral walls
+/datum/corral_data
+ ///list of all managed slimes
+ var/list/managed_slimes = list()
+ ///the installed corral upgrades
+ var/list/corral_upgrades = list()
+
+ ///the turfs inside the corral
+ var/list/corral_turfs = list()
+ ///our corral corners
+ var/list/corral_corners = list()
+ ///the corral connecter effects
+ var/list/corral_connectors = list()
+
+/datum/corral_data/proc/setup_pen()
+ for(var/turf/turf as anything in corral_turfs)
+ RegisterSignal(turf, COMSIG_ATOM_ENTERED, PROC_REF(check_entered))
+ RegisterSignal(turf, COMSIG_ATOM_EXITED, PROC_REF(check_exited))
+
+ for(var/mob/living/basic/slime/slime as anything in turf.contents)
+ if(!istype(slime))
+ continue
+ managed_slimes |= slime
+
+/datum/corral_data/Destroy(force, ...)
+ QDEL_LIST(corral_connectors)
+ corral_turfs = null
+
+ for(var/obj/machinery/corral_corner/corner as anything in corral_corners)
+ corner.connected_data = null
+ corral_corners -= corner
+ corral_corners = null
+ for(var/mob/living/basic/slime/slime as anything in managed_slimes)
+ UnregisterSignal(slime, COMSIG_ATOM_SUCKED)
+ UnregisterSignal(slime, COMSIG_LIVING_DEATH)
+ managed_slimes = null
+
+ . = ..()
+
+/datum/corral_data/proc/check_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
+ if(!istype(arrived, /mob/living/basic/slime))
+ return
+
+ if(isliving(arrived))
+ var/mob/living/living = arrived
+ if(living.stat == DEAD)
+ return
+
+ if(arrived in managed_slimes)
+ return
+
+ RegisterSignal(arrived, COMSIG_ATOM_SUCKED, PROC_REF(remove_cause_sucked))
+ RegisterSignal(arrived, COMSIG_LIVING_DEATH, PROC_REF(remove_cause_sucked))
+ managed_slimes |= arrived
+ for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades)
+ upgrade.on_slime_entered(arrived, src)
+
+/datum/corral_data/proc/check_exited(turf/source, atom/movable/gone, direction)
+ if(!istype(gone, /mob/living/basic/slime))
+ return
+
+ var/turf/turf = get_step(source, direction)
+ if(turf in corral_turfs)
+ return
+
+ UnregisterSignal(gone, COMSIG_ATOM_SUCKED)
+ UnregisterSignal(gone, COMSIG_LIVING_DEATH)
+ managed_slimes -= gone
+ for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades)
+ upgrade.on_slime_exited(gone)
+
+/datum/corral_data/proc/remove_cause_sucked(atom/movable/gone)
+
+ UnregisterSignal(gone, COMSIG_ATOM_SUCKED)
+ UnregisterSignal(gone, COMSIG_LIVING_DEATH)
+ managed_slimes -= gone
+ for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades)
+ upgrade.on_slime_exited(gone)
diff --git a/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm b/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm
new file mode 100644
index 000000000000..7c095c3cc339
--- /dev/null
+++ b/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm
@@ -0,0 +1,189 @@
+/obj/item/corral_linker
+ name = "corral linker"
+ desc = "A useful tool to help link corrals"
+
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "corral_linker"
+
+ var/obj/machinery/corral_corner/host
+ var/list/corral_corners = list()
+
+/obj/item/corral_linker/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(target == host)
+ if(host.submit_corners(corral_corners))
+ qdel(src)
+ return AFTERATTACK_PROCESSED_ITEM
+
+ if(length(corral_corners) == 4)
+ say("Buffer full!")
+ return
+
+ if(istype(target, /obj/machinery/corral_corner))
+ if(target in corral_corners)
+ corral_corners -= target
+ say("Removed corner from buffer!")
+ return
+ corral_corners += target
+ say("Added corner to buffer!")
+ return
+
+/obj/machinery/corral_corner
+ name = "corral fencepost"
+ desc = "One of the corners of a corral"
+
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "corral_corner"
+ circuit = /obj/item/circuitboard/machine/corral_corner
+
+ density = TRUE
+ var/max_range = 9
+ var/datum/corral_data/connected_data
+ var/mapping_id
+
+/obj/machinery/corral_corner/Initialize(mapload)
+ . = ..()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/corral_corner/LateInitialize()
+ . = ..()
+ locate_machinery()
+
+/obj/machinery/corral_corner/locate_machinery(multitool_connection)
+ if(!mapping_id || connected_data)
+ return
+ var/list/found_corners = list()
+ for(var/obj/machinery/corral_corner/main in GLOB.machines)
+ if(main.mapping_id != mapping_id)
+ continue
+ found_corners += main
+ submit_corners(found_corners)
+
+ if(connected_data)
+ for(var/obj/machinery/slime_pen_controller/controller in GLOB.machines)
+ if(controller.mapping_id == mapping_id)
+ controller.linked_data = connected_data
+
+/obj/machinery/corral_corner/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if(connected_data)
+ return
+ start_linking_procedure()
+
+/obj/machinery/corral_corner/multitool_act(mob/living/user, obj/item/tool)
+ if(!multitool_check_buffer(user, tool))
+ return
+ var/obj/item/multitool/multitool = tool
+ multitool.buffer = src
+ to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer."))
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/machinery/corral_corner/proc/start_linking_procedure()
+ var/obj/item/corral_linker/new_linker = new(loc)
+ new_linker.host = src
+ new_linker.corral_corners += src
+
+/obj/machinery/corral_corner/proc/submit_corners(list/given_corners)
+ if(length(given_corners) != 4)
+ return
+ var/list/steps_and_direction = list()
+
+ var/list/corners = given_corners
+
+ var/list/corners_left = list()
+ corners_left += corners
+
+ var/turf/current_turf = loc
+ var/turf/last_found_corner_turf = loc
+ var/found = FALSE
+ for(var/num in 1 to 4)
+ found = FALSE
+ for(var/direction in GLOB.cardinals)
+ if(found)
+ break
+ current_turf = last_found_corner_turf
+ var/steps = 0
+ for(var/step in 1 to max_range)
+ current_turf = get_step(current_turf, direction)
+
+ if(current_turf.density)
+ break
+ steps++
+
+ for(var/obj/machinery/corral_corner/found_corner as anything in current_turf.contents)
+ if(!istype(found_corner))
+ continue
+
+ if(!found_corner)
+ continue
+
+ if((found_corner == src) && length(steps_and_direction) < 3)
+ continue
+
+ if(!(found_corner in corners_left))
+ continue
+
+ steps--
+
+ corners_left -= found_corner
+ last_found_corner_turf = current_turf
+ found = TRUE
+ steps_and_direction += list("[direction]" = steps)
+ break
+
+ build_data(steps_and_direction, corners)
+ return TRUE
+
+/obj/machinery/corral_corner/proc/build_data(list/steps, list/corners)
+ var/turf/current_turf = loc
+ var/list/effects = list()
+ for(var/step_dir in steps)
+ for(var/lengths in 1 to steps[step_dir])
+ current_turf = get_step(current_turf, text2num(step_dir))
+
+ var/obj/effect/corral_fence/new_fence = new(current_turf)
+ new_fence.dir = text2num(step_dir)
+ effects += new_fence
+ current_turf = get_step(current_turf, text2num(step_dir))
+
+ var/datum/corral_data/new_data = new
+
+ new_data.corral_connectors += effects
+ new_data.corral_corners += corners
+
+ var/turf/last_turf
+ for(var/obj/machinery/corral_corner/adder as anything in corners)
+ if((adder.x < x && adder.y < y) || (adder.x > x && adder.y > y) || (adder.x > x && adder.y < y) || (adder.x < x && adder.y > y))
+ last_turf = get_turf(adder)
+ if(adder.connected_data)
+ continue
+ adder.connected_data = new_data
+
+ var/list/block_turfs = block(get_turf(src), last_turf)
+ new_data.corral_turfs += block_turfs
+ new_data.setup_pen()
+
+/obj/effect/corral_fence
+ name = "corral fence"
+ desc = "A holographic fence designed to prevent slimes from leaving."
+ anchored = TRUE
+ can_be_unanchored = FALSE
+
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "corral_fence"
+ can_atmos_pass = ATMOS_PASS_NO
+ can_astar_pass = CANASTARPASS_ALWAYS_PROC
+
+/obj/effect/corral_fence/CanPass(atom/movable/mover, border_dir)
+ . = ..()
+ if(mover.pulledby)
+ return TRUE
+ if((istype(mover, /mob/living/basic/slime) || ismonkey(mover) || istype(mover, /mob/living/basic/xenofauna)) && !HAS_TRAIT(mover, VACPACK_THROW))
+ return FALSE
+ return TRUE
+
+
+/obj/effect/corral_fence/CanAStarPass(to_dir, datum/can_pass_info/pass_info)
+ if(pass_info.xenofauna_or_slime)
+ return FALSE
+ return TRUE //anything expect slimes can astar pass
diff --git a/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm
new file mode 100644
index 000000000000..41181294be14
--- /dev/null
+++ b/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm
@@ -0,0 +1,14 @@
+/datum/corral_upgrade
+ var/name = "Generic Corral Upgrade"
+ var/desc = "Generic Corral Upgrade Description"
+ ///the amount of xenobiology points this pen upgrade costs
+ var/cost = 0
+
+/datum/corral_upgrade/proc/on_add(datum/corral_data/parent)
+ return
+
+/datum/corral_upgrade/proc/on_slime_entered(mob/living/basic/slime/slime)
+ return
+
+/datum/corral_upgrade/proc/on_slime_exited(mob/living/basic/slime/slime)
+ return
diff --git a/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm
new file mode 100644
index 000000000000..6fa2e8f1c1c2
--- /dev/null
+++ b/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm
@@ -0,0 +1,16 @@
+/datum/corral_upgrade/human_docility_upgrade
+ name = "Human Docility Upgrade"
+ desc = "Makes the non rabid slimes docile to people with souls."
+ cost = 2500
+
+/datum/corral_upgrade/human_docility_upgrade/on_add(datum/corral_data/parent)
+ for(var/mob/living/basic/slime/slime as anything in parent.managed_slimes)
+ slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE)
+
+/datum/corral_upgrade/human_docility_upgrade/on_slime_entered(mob/living/basic/slime/slime)
+ slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE)
+
+/datum/corral_upgrade/human_docility_upgrade/on_slime_exited(mob/living/basic/slime/slime)
+ if(slime.has_slime_trait(/datum/slime_trait/docility))
+ return
+ slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, FALSE)
diff --git a/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm
new file mode 100644
index 000000000000..830ce0fc93a2
--- /dev/null
+++ b/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm
@@ -0,0 +1,14 @@
+/datum/corral_upgrade/obliteration_upgrade
+ name = "Slime Obilteration Upgrade"
+ desc = "Just obliterates slimes that enter the cage."
+ cost = 5000
+
+
+/datum/corral_upgrade/obliteration_upgrade/on_add(datum/corral_data/parent)
+ for(var/mob/living/basic/slime/slime as anything in parent.managed_slimes)
+ parent.managed_slimes -= slime
+ qdel(slime)
+
+/datum/corral_upgrade/obliteration_upgrade/on_slime_entered(mob/living/basic/slime/slime, datum/corral_data/parent)
+ parent.managed_slimes -= slime
+ qdel(slime)
diff --git a/monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi b/monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi
new file mode 100644
index 000000000000..0a611a1418ae
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/backpack_righthand.dmi b/monkestation/code/modules/slimecore/icons/backpack_righthand.dmi
new file mode 100644
index 000000000000..bba94d6296f8
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/backpack_righthand.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/equipment.dmi b/monkestation/code/modules/slimecore/icons/equipment.dmi
new file mode 100644
index 000000000000..a28f8c167fc5
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/equipment.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/filters.dmi b/monkestation/code/modules/slimecore/icons/filters.dmi
new file mode 100644
index 000000000000..9cc3bf64767d
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/filters.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/machinery.dmi b/monkestation/code/modules/slimecore/icons/machinery.dmi
new file mode 100644
index 000000000000..28c64774745a
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/machinery.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/mister_lefthand.dmi b/monkestation/code/modules/slimecore/icons/mister_lefthand.dmi
new file mode 100644
index 000000000000..d9e33529e9f9
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/mister_lefthand.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/mister_righthand.dmi b/monkestation/code/modules/slimecore/icons/mister_righthand.dmi
new file mode 100644
index 000000000000..34ec3bef4b65
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/mister_righthand.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/slime_grinder.dmi b/monkestation/code/modules/slimecore/icons/slime_grinder.dmi
new file mode 100644
index 000000000000..39066bb43ed3
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/slime_grinder.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi b/monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi
new file mode 100644
index 000000000000..6dfd587fef44
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/slimes.dmi b/monkestation/code/modules/slimecore/icons/slimes.dmi
new file mode 100644
index 000000000000..5a8833104f25
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/slimes.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/stack_objects.dmi b/monkestation/code/modules/slimecore/icons/stack_objects.dmi
new file mode 100644
index 000000000000..e9dfb5027b00
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/stack_objects.dmi differ
diff --git a/monkestation/code/modules/slimecore/icons/xenofauna.dmi b/monkestation/code/modules/slimecore/icons/xenofauna.dmi
new file mode 100644
index 000000000000..57719f2fd9f3
Binary files /dev/null and b/monkestation/code/modules/slimecore/icons/xenofauna.dmi differ
diff --git a/monkestation/code/modules/slimecore/items/crossbreeds.dm b/monkestation/code/modules/slimecore/items/crossbreeds.dm
new file mode 100644
index 000000000000..a34505d47550
--- /dev/null
+++ b/monkestation/code/modules/slimecore/items/crossbreeds.dm
@@ -0,0 +1,2 @@
+/obj/item/slimecross
+ icon = 'monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi'
diff --git a/monkestation/code/modules/slimecore/items/mutation_syringe.dm b/monkestation/code/modules/slimecore/items/mutation_syringe.dm
new file mode 100644
index 000000000000..fd3998c06be8
--- /dev/null
+++ b/monkestation/code/modules/slimecore/items/mutation_syringe.dm
@@ -0,0 +1,82 @@
+/obj/item/slime_mutation_syringe
+ name = "slime mutation syringe"
+ desc = "Infuses a mutation into a slime."
+
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ icon_state = "mutation_syringe"
+
+ ///the path we infuse
+ var/datum/slime_trait/infusing_trait_path
+ /// have we been used?
+ var/used = FALSE
+
+
+/obj/item/slime_mutation_syringe/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!infusing_trait_path || used)
+ return
+ if(!istype(target, /mob/living/basic/slime))
+ return
+
+ var/mob/living/basic/slime/slime = target
+ if(slime.add_trait(infusing_trait_path))
+ used = TRUE
+ icon_state = "mutation_syringe-empty"
+ to_chat(user, span_notice("You inject [target] with [src]."))
+
+
+/obj/item/slime_mutation_syringe/cleaner
+ name = "cleaner slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/cleaner
+
+/obj/item/slime_mutation_syringe/polluter
+ name = "polluter slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/polluter
+
+/obj/item/slime_mutation_syringe/gooey_cat
+ name = "gooey cat slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/visual/cat
+
+/obj/item/slime_mutation_syringe/radioactive
+ name = "radioactive slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/radioactive
+
+/obj/item/slime_mutation_syringe/never_evolving
+ name = "never splitting slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/never_evolving
+
+/obj/item/slime_mutation_syringe/never_ooze
+ name = "never ooze slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/never_ooze
+
+/obj/item/slime_mutation_syringe/soda_slime
+ name = "soda slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/soda_slime
+
+/obj/item/slime_mutation_syringe/beer_slime
+ name = "beer slime mutation syringe"
+ infusing_trait_path = /datum/slime_trait/beer_slime
+
+/obj/item/slime_mutation_syringe_random
+ name = "slime mutation syringe"
+ desc = "Infuses a mutation into a slime."
+
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ icon_state = "mutation_syringe"
+
+ /// have we been used?
+ var/used = FALSE
+
+
+/obj/item/slime_mutation_syringe_random/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(used)
+ return
+ if(!istype(target, /mob/living/basic/slime))
+ return
+
+ var/mob/living/basic/slime/slime = target
+ slime.start_mutating(TRUE)
+ used = TRUE
+ icon_state = "mutation_syringe-empty"
+ to_chat(user, span_notice("You inject [target] with [src]."))
diff --git a/monkestation/code/modules/slimecore/items/vacuum_pack.dm b/monkestation/code/modules/slimecore/items/vacuum_pack.dm
new file mode 100644
index 000000000000..7129ed06c519
--- /dev/null
+++ b/monkestation/code/modules/slimecore/items/vacuum_pack.dm
@@ -0,0 +1,589 @@
+#define NORMAL_VACUUM_PACK_CAPACITY 3
+#define UPGRADED_VACUUM_PACK_CAPACITY 6
+#define ILLEGAL_VACUUM_PACK_CAPACITY 12
+
+#define NORMAL_VACUUM_PACK_RANGE 3
+#define UPGRADED_VACUUM_PACK_RANGE 4
+#define ILLEGAL_VACUUM_PACK_RANGE 5
+
+#define NORMAL_VACUUM_PACK_SPEED 12
+#define UPGRADED_VACUUM_PACK_SPEED 8
+#define ILLEGAL_VACUUM_PACK_SPEED 6
+
+#define VACUUM_PACK_UPGRADE_STASIS "stasis"
+#define VACUUM_PACK_UPGRADE_HEALING "healing"
+#define VACUUM_PACK_UPGRADE_CAPACITY "capacity"
+#define VACUUM_PACK_UPGRADE_RANGE "range"
+#define VACUUM_PACK_UPGRADE_SPEED "speed"
+#define VACUUM_PACK_UPGRADE_PACIFY "pacification"
+#define VACUUM_PACK_UPGRADE_BIOMASS "biomass printer"
+
+/datum/action/item_action/toggle_nozzle
+ name = "Toggle Vacuum Nozzle"
+
+/obj/item/vacuum_pack
+ name = "backpack xenofauna storage"
+ desc = "A Xynergy Solutions brand vacuum xenofauna storage with an extendable nozzle. Do not use to practice kissing."
+ icon = 'monkestation/code/modules/slimecore/icons/equipment.dmi'
+ icon_state = "vacuum_pack"
+ inhand_icon_state = "vacuum_pack"
+ worn_icon_state = "waterbackpackjani"
+ lefthand_file = 'monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi'
+ righthand_file = 'monkestation/code/modules/slimecore/icons/backpack_righthand.dmi'
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ actions_types = list(/datum/action/item_action/toggle_nozzle)
+ max_integrity = 200
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+
+ var/obj/item/vacuum_nozzle/nozzle
+ var/nozzle_type = /obj/item/vacuum_nozzle
+ var/list/stored = list()
+ var/capacity = NORMAL_VACUUM_PACK_CAPACITY
+ var/range = NORMAL_VACUUM_PACK_RANGE
+ var/speed = NORMAL_VACUUM_PACK_SPEED
+ var/illegal = FALSE
+ var/list/upgrades = list()
+ var/obj/machinery/biomass_recycler/linked
+ var/give_choice = TRUE //If set to true the pack will give the owner a radial selection to choose which object they want to shoot
+ var/check_backpack = TRUE //If it can only be used while worn on the back
+ var/static/list/storable_objects = typecacheof(list(/mob/living/basic/slime,
+ /mob/living/basic/cockroach/rockroach,
+ ))
+ var/modified = FALSE //If the gun is modified to fight with revenants
+ var/mob/living/basic/revenant/ghost_busting //Stores the revenant we're currently sucking in
+ var/mob/living/ghost_buster //Stores the user
+ var/busting_beam //Stores visual effects
+ COOLDOWN_DECLARE(busting_throw_cooldown)
+
+/obj/item/vacuum_pack/Initialize(mapload)
+ . = ..()
+ nozzle = new nozzle_type(src)
+
+/obj/item/vacuum_pack/Destroy()
+ QDEL_NULL(nozzle)
+ if(VACUUM_PACK_UPGRADE_HEALING in upgrades)
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/vacuum_pack/multitool_act(mob/living/user, obj/item/tool)
+ . = ..()
+ modified = !modified
+ to_chat(user, span_notice("You turn the safety switch on [src] [modified ? "off" : "on"]."))
+
+/obj/item/vacuum_pack/process(delta_time)
+ if(!(VACUUM_PACK_UPGRADE_HEALING in upgrades))
+ STOP_PROCESSING(SSobj, src)
+
+ for(var/mob/living/basic/animal in stored)
+ animal.adjustBruteLoss(-5 * delta_time)
+
+/obj/item/vacuum_pack/examine(mob/user)
+ . = ..()
+ if(LAZYLEN(stored))
+ . += span_notice("It has [LAZYLEN(stored)] creatures stored in it.")
+ if(LAZYLEN(upgrades))
+ for(var/upgrade in upgrades)
+ . += span_notice("It has [upgrade] upgrade installed.")
+
+/obj/item/vacuum_pack/attackby(obj/item/item, mob/living/user, params)
+ if(item == nozzle)
+ remove_nozzle()
+ return
+
+ if(user.istate & ISTATE_HARM)
+ return ..()
+
+ if(istype(item, /obj/item/disk/vacuum_upgrade))
+ var/obj/item/disk/vacuum_upgrade/upgrade = item
+
+ if(illegal)
+ to_chat(user, span_warning("[src] has no slot to insert [upgrade] into!"))
+ return
+
+ if(upgrade.upgrade_type in upgrades)
+ to_chat(user, span_warning("[src] already has a [upgrade.upgrade_type] upgrade!"))
+ return
+
+ upgrades += upgrade.upgrade_type
+ upgrade.on_upgrade(src)
+ to_chat(user, span_notice("You install a [upgrade.upgrade_type] upgrade into [src]."))
+ playsound(user, 'sound/machines/click.ogg', 30, TRUE)
+ qdel(upgrade)
+ return
+
+ return ..()
+
+/obj/item/vacuum_pack/ui_action_click(mob/user)
+ toggle_nozzle(user)
+
+/obj/item/vacuum_pack/proc/toggle_nozzle(mob/living/user)
+ if(!istype(user))
+ return
+
+ if(user.get_item_by_slot(user.getBackSlot()) != src && check_backpack)
+ to_chat(user, span_warning("[src] must be worn properly to use!"))
+ return
+
+ if(user.incapacitated())
+ return
+
+ if(QDELETED(nozzle))
+ nozzle = new nozzle_type(src)
+
+ if(nozzle in src)
+ if(!user.put_in_hands(nozzle))
+ to_chat(user, span_warning("You need a free hand to hold [nozzle]!"))
+ return
+ else
+ playsound(user, 'sound/mecha/mechmove03.ogg', 75, TRUE)
+ else
+ remove_nozzle()
+
+/obj/item/vacuum_pack/item_action_slot_check(slot, mob/user)
+ if(slot == user.getBackSlot())
+ return TRUE
+
+/obj/item/vacuum_pack/equipped(mob/user, slot)
+ . = ..()
+ if(slot != ITEM_SLOT_BACK)
+ remove_nozzle()
+
+/obj/item/vacuum_pack/proc/remove_nozzle()
+ if(!QDELETED(nozzle))
+ if(ismob(nozzle.loc))
+ var/mob/wearer = nozzle.loc
+ wearer.temporarilyRemoveItemFromInventory(nozzle, TRUE)
+ playsound(loc, 'sound/mecha/mechmove03.ogg', 75, TRUE)
+ nozzle.forceMove(src)
+
+/obj/item/vacuum_pack/attack_hand(mob/user, list/modifiers)
+ if (user.get_item_by_slot(user.getBackSlot()) == src)
+ toggle_nozzle(user)
+ else
+ return ..()
+
+/obj/item/vacuum_pack/MouseDrop(obj/over_object)
+ var/mob/wearer = loc
+ if(istype(wearer) && istype(over_object, /atom/movable/screen/inventory/hand))
+ var/atom/movable/screen/inventory/hand/hand = over_object
+ wearer.putItemFromInventoryInHandIfPossible(src, hand.held_index)
+ return ..()
+
+/obj/item/vacuum_pack/dropped(mob/user)
+ ..()
+ remove_nozzle()
+
+/obj/item/vacuum_nozzle
+ name = "vacuum pack nozzle"
+ desc = "A large nozzle attached to a vacuum pack."
+ icon = 'monkestation/code/modules/slimecore/icons/equipment.dmi'
+ icon_state = "vacuum_nozzle"
+ inhand_icon_state = "vacuum_nozzle"
+ lefthand_file = 'monkestation/code/modules/slimecore/icons/mister_lefthand.dmi'
+ righthand_file = 'monkestation/code/modules/slimecore/icons/mister_righthand.dmi'
+ w_class = WEIGHT_CLASS_HUGE
+ item_flags = NOBLUDGEON | ABSTRACT
+ slot_flags = NONE
+
+ var/obj/item/vacuum_pack/pack
+
+/obj/item/vacuum_nozzle/Initialize(mapload)
+ . = ..()
+ pack = loc
+ if(!istype(pack))
+ return INITIALIZE_HINT_QDEL
+
+/obj/item/vacuum_nozzle/doMove(atom/destination)
+ if(destination && (destination != pack.loc || !ismob(destination)))
+ if (loc != pack)
+ to_chat(pack.loc, span_notice("[src] snaps back onto [pack]."))
+ destination = pack
+ . = ..()
+
+/obj/item/vacuum_nozzle/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+
+ if(pack.modified && pack.ghost_busting && target != pack.ghost_busting && COOLDOWN_FINISHED(pack, busting_throw_cooldown))
+ pack.ghost_busting.throw_at(get_turf(target), get_dist(pack.ghost_busting, target), 3, user)
+ COOLDOWN_START(pack, busting_throw_cooldown, 3 SECONDS)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades))
+ to_chat(user, span_warning("[pack] does not posess a required upgrade!"))
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ if(!pack.linked)
+ to_chat(user, span_warning("[pack] is not linked to a biomass recycler!"))
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ var/list/items = list()
+ var/list/item_names = list()
+
+ for(var/printable_type in GLOB.biomass_unlocks)
+ pack.linked.vacuum_printable_types |= printable_type
+ pack.linked.vacuum_printable_types[printable_type] = GLOB.biomass_unlocks[printable_type]
+
+ for(var/printable_type in pack.linked.vacuum_printable_types)
+ var/atom/movable/printable = printable_type
+ var/image/printable_image = image(icon = initial(printable.icon), icon_state = initial(printable.icon_state))
+ items += list(initial(printable.name) = printable_image)
+ item_names[initial(printable.name)] = printable_type
+
+
+ var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
+
+ if(!pick)
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ var/spawn_type = item_names[pick]
+ if(pack.linked.stored_matter < pack.linked.vacuum_printable_types[spawn_type])
+ to_chat(user, span_warning("[pack.linked] does not have enough stored biomass for that! It currently has [pack.linked.stored_matter] out of [pack.linked.vacuum_printable_types[spawn_type]] unit\s required."))
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ var/atom/movable/spawned = new spawn_type(user.loc)
+ spawned.AddComponent(/datum/component/vac_tagged, user)
+
+ pack.linked.stored_matter -= pack.linked.vacuum_printable_types[spawn_type]
+ playsound(user, 'sound/misc/moist_impact.ogg', 50, TRUE)
+ spawned.transform = matrix().Scale(0.5)
+ spawned.alpha = 0
+ animate(spawned, alpha = 255, time = 8, easing = QUAD_EASING|EASE_OUT, transform = matrix(), flags = ANIMATION_PARALLEL)
+
+ if(isturf(user.loc))
+ ADD_TRAIT(spawned, VACPACK_THROW, "vacpack")
+ spawned.pass_flags |= PASSMOB
+ spawned.throw_at(target, min(get_dist(user, target), (pack.illegal ? 5 : 11)), 1, user, gentle = TRUE) //Gentle so eggs have 50% instead of 12.5% to spawn a chick
+
+ user.visible_message(span_warning("[user] shoots [spawned] out their [src]!"), span_notice("You fabricate and shoot [spawned] out of your [src]."))
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+/obj/item/vacuum_nozzle/afterattack(atom/movable/target, mob/user, proximity, params)
+ . = ..()
+ if(pack.ghost_busting)
+ return
+
+ if(pack.modified && !pack.ghost_busting && isrevenant(target) && get_dist(user, target) < 4)
+ start_busting(target, user)
+ return
+
+ if(istype(target, /obj/machinery/biomass_recycler) && target.Adjacent(user))
+ if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades))
+ to_chat(user, span_warning("[pack] does not posess a required upgrade!"))
+ return
+ pack.linked = target
+ to_chat(user, span_notice("You link [pack] to [target]."))
+ return
+
+ if(pack.linked)
+ var/can_recycle
+ for(var/recycable_type in pack.linked.recyclable_types)
+ if(istype(target, recycable_type))
+ can_recycle = recycable_type
+ break
+
+ var/target_stat = FALSE
+ if(isliving(target))
+ var/mob/living/living_target = target
+ target_stat = living_target.stat
+
+ if(can_recycle && (!is_type_in_typecache(target, pack.storable_objects) || target_stat != CONSCIOUS))
+ if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades))
+ to_chat(user, span_warning("[pack] does not posess a required upgrade!"))
+ return
+
+ if(!pack.linked)
+ to_chat(user, span_warning("[pack] is not linked to a biomass recycler!"))
+ return
+
+ if(target_stat == CONSCIOUS)
+ to_chat(user, span_warning("[target] is struggling far too much for you to suck it in!"))
+ return
+
+ if(isliving(target))
+ var/mob/living/living = target
+ if(living.buckled)
+ living.buckled.unbuckle_mob(target, TRUE)
+ target.unbuckle_all_mobs(TRUE)
+
+ if(!do_after(user, pack.speed, target, timed_action_flags = IGNORE_TARGET_LOC_CHANGE))
+ return
+
+ playsound(src, 'sound/effects/refill.ogg', 50, TRUE)
+ var/matrix/animation_matrix = matrix()
+ animation_matrix.Scale(0.5)
+ animation_matrix.Translate((user.x - target.x) * 32, (user.y - target.y) * 32)
+ animate(target, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, transform = animation_matrix, flags = ANIMATION_PARALLEL)
+ sleep(8)
+ user.visible_message(span_warning("[user] sucks [target] into their [pack]!"), span_notice("You successfully suck [target] into your [src] and recycle it."))
+ qdel(target)
+ playsound(user, 'sound/machines/juicer.ogg', 50, TRUE)
+ pack.linked.use_power(500)
+ pack.linked.stored_matter += pack.linked.cube_production * pack.linked.recyclable_types[can_recycle]
+ return
+
+ if(is_type_in_typecache(target, pack.storable_objects))
+ if(get_dist(user, target) > pack.range)
+ to_chat(user, span_warning("[target] is too far away!"))
+ return
+
+ if(!(target in view(user, pack.range)))
+ to_chat(user, span_warning("You can't reach [target]!"))
+ return
+
+ if(target.anchored || target.move_resist > MOVE_FORCE_STRONG)
+ to_chat(user, span_warning("You can't manage to suck [target] in!"))
+ return
+
+ if(isslime(target))
+ var/mob/living/basic/slime/slime = target
+ if(HAS_TRAIT(slime, TRAIT_SLIME_RABID) && !pack.illegal && !(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades))
+ to_chat(user, span_warning("[slime] is wiggling far too much for you to suck it in!"))
+ return
+
+ if(LAZYLEN(pack.stored) >= pack.capacity)
+ to_chat(user, span_warning("[pack] is already filled to the brim!"))
+ return
+
+ if(!do_after(user, pack.speed, target, timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE, extra_checks = CALLBACK(src, .proc/suck_checks, target, user)))
+ return
+
+ if(SEND_SIGNAL(target, COMSIG_LIVING_VACUUM_PRESUCK, src, user) & COMPONENT_LIVING_VACUUM_CANCEL_SUCK)
+ return
+
+ suck_victim(target, user)
+ return
+
+ if(LAZYLEN(pack.stored) == 0)
+ to_chat(user, span_warning("[pack] is empty!"))
+ return
+
+ var/mob/living/spewed
+
+ if(pack.give_choice)
+ var/list/items = list()
+ var/list/items_stored = list()
+ for(var/atom/movable/stored_obj in pack.stored)
+ var/image/stored_image = image(icon = stored_obj.icon, icon_state = stored_obj.icon_state)
+ stored_image.color = stored_obj.color
+ items += list(stored_obj.name = stored_image)
+ items_stored[stored_obj.name] = stored_obj
+
+ var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
+
+ if(!pick)
+ return
+ spewed = items_stored[pick]
+ else
+ spewed = pick(pack.stored)
+
+ playsound(user, 'sound/misc/moist_impact.ogg', 50, TRUE)
+ spewed.transform = matrix().Scale(0.5)
+ spewed.alpha = 0
+ animate(spewed, alpha = 255, time = 8, easing = QUAD_EASING|EASE_OUT, transform = matrix(), flags = ANIMATION_PARALLEL)
+ spewed.forceMove(user.loc)
+
+ if(isturf(user.loc))
+ ADD_TRAIT(spewed, VACPACK_THROW, "vacpack")
+ spewed.pass_flags |= PASSMOB
+ spewed.throw_at(target, min(get_dist(user, target), (pack.illegal ? 5 : 11)), 1, user)
+ if(prob(99) && spewed.stat != DEAD)
+ playsound(spewed, 'sound/misc/woohoo.ogg', 50, TRUE)
+
+ if(istype(spewed, /mob/living/basic/slime))
+ var/mob/living/basic/slime/slime = spewed
+ slime.slime_flags &= ~STORED_SLIME
+ if(slime.ai_controller)
+ slime.ai_controller.set_ai_status(AI_STATUS_ON)
+ if(VACUUM_PACK_UPGRADE_STASIS in pack.upgrades)
+ REMOVE_TRAIT(slime, TRAIT_SLIME_STASIS, "vacuum_pack_stasis")
+
+ if(pack.illegal)
+
+ ADD_TRAIT(slime, TRAIT_SLIME_RABID, "syndicate_slimepack")
+
+ user.changeNext_move(CLICK_CD_RAPID) //Like a machine gun
+
+ else if(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades)
+ REMOVE_TRAIT(slime, TRAIT_SLIME_RABID, null)
+
+
+ pack.stored -= spewed
+ user.visible_message(span_warning("[user] shoots [spewed] out their [src]!"), span_notice("You shoot [spewed] out of your [src]."))
+
+/obj/item/vacuum_nozzle/proc/suck_checks(atom/movable/target, mob/user)
+ if(get_dist(user, target) > pack.range)
+ return FALSE
+
+ if(!(target in view(user, pack.range)))
+ return FALSE
+
+ if(target.anchored || target.move_resist > MOVE_FORCE_STRONG)
+ return FALSE
+
+ if(isslime(target))
+ var/mob/living/basic/slime/slime = target
+ if(HAS_TRAIT(slime, TRAIT_SLIME_RABID) && !pack.illegal && !(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades))
+ return FALSE
+
+ if(LAZYLEN(pack.stored) >= pack.capacity)
+ return FALSE
+
+ return TRUE
+
+/obj/item/vacuum_nozzle/proc/suck_victim(atom/movable/target, mob/user, silent = FALSE)
+ if(!suck_checks(target, user))
+ return
+
+ if(!silent)
+ playsound(user, 'sound/effects/refill.ogg', 50, TRUE)
+ var/matrix/animation_matrix = target.transform
+ animation_matrix.Scale(0.5)
+ animation_matrix.Translate((user.x - target.x) * 32, (user.y - target.y) * 32)
+ animate(target, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, transform = animation_matrix, flags = ANIMATION_PARALLEL)
+ sleep(8)
+ target.unbuckle_all_mobs(TRUE)
+ target.forceMove(pack)
+ pack.stored += target
+ if((VACUUM_PACK_UPGRADE_STASIS in pack.upgrades) && isslime(target))
+ var/mob/living/basic/slime/slime = target
+ ADD_TRAIT(slime, TRAIT_SLIME_STASIS, "vacuum_pack_stasis")
+ SEND_SIGNAL(target, COMSIG_ATOM_SUCKED)
+ if(!silent)
+ user.visible_message(span_warning("[user] sucks [target] into their [pack]!"), span_notice("You successfully suck [target] into your [src]."))
+ var/mob/living/basic/slime/slime = target
+ slime.slime_flags |= STORED_SLIME
+ if(slime.ai_controller)
+ slime.ai_controller.set_ai_status(AI_STATUS_OFF)
+ slime.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, null)
+
+/obj/item/vacuum_nozzle/proc/start_busting(mob/living/basic/revenant/revenant, mob/living/user)
+ revenant.visible_message(span_warning("[user] starts sucking [revenant] into their [src]!"), span_userdanger("You are being sucked into [user]'s [src]!"))
+ pack.ghost_busting = revenant
+ pack.ghost_buster = user
+ pack.busting_beam = user.Beam(revenant, icon_state="drain_life")
+ bust_the_ghost()
+
+/obj/item/vacuum_nozzle/proc/bust_the_ghost()
+ while(check_busting())
+ if(!do_after(pack.ghost_buster, 0.5 SECONDS, target = pack.ghost_busting, extra_checks = CALLBACK(src, .proc/check_busting), timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE))
+ pack.ghost_busting = null
+ pack.ghost_buster = null
+ QDEL_NULL(pack.busting_beam)
+ return
+
+ //pack.ghost_busting.adjustHealth(5)
+ //pack.ghost_busting.reveal(0.5 SECONDS, TRUE)
+
+/obj/item/vacuum_nozzle/proc/check_busting()
+ if(!pack.ghost_busting || !pack.ghost_busting.loc || QDELETED(pack.ghost_busting))
+ return FALSE
+
+ if(!pack.ghost_buster || !pack.ghost_buster.loc || QDELETED(pack.ghost_buster))
+ return FALSE
+
+ if(loc != pack.ghost_buster)
+ return FALSE
+
+ if(get_dist(pack.ghost_buster, pack.ghost_busting) > 3)
+ return FALSE
+
+ if(pack.ghost_busting.essence <= 0) //Means that the revenant is dead
+ return FALSE
+
+ return TRUE
+
+/obj/item/disk/vacuum_upgrade
+ name = "vacuum pack upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage."
+ icon_state = "rndmajordisk"
+ var/upgrade_type
+
+/obj/item/disk/vacuum_upgrade/proc/on_upgrade(obj/item/vacuum_pack/pack)
+
+/obj/item/disk/vacuum_upgrade/stasis
+ name = "vacuum pack stasis upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to keep all slimes inside of it in stasis."
+ upgrade_type = VACUUM_PACK_UPGRADE_STASIS
+
+/obj/item/disk/vacuum_upgrade/healing
+ name = "vacuum pack healing upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that makes the pack passively heal all the slimes inside of it."
+ upgrade_type = VACUUM_PACK_UPGRADE_HEALING
+
+/obj/item/disk/vacuum_upgrade/healing/on_upgrade(obj/item/vacuum_pack/pack)
+ START_PROCESSING(SSobj, pack)
+
+/obj/item/disk/vacuum_upgrade/capacity
+ name = "vacuum pack capacity upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that expands it's internal slime storage."
+ upgrade_type = VACUUM_PACK_UPGRADE_CAPACITY
+
+/obj/item/disk/vacuum_upgrade/capacity/on_upgrade(obj/item/vacuum_pack/pack)
+ pack.capacity = UPGRADED_VACUUM_PACK_CAPACITY
+
+/obj/item/disk/vacuum_upgrade/range
+ name = "vacuum pack range upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that strengthens it's pump and allows it to reach further."
+ upgrade_type = VACUUM_PACK_UPGRADE_RANGE
+
+/obj/item/disk/vacuum_upgrade/range/on_upgrade(obj/item/vacuum_pack/pack)
+ pack.range = UPGRADED_VACUUM_PACK_RANGE
+
+/obj/item/disk/vacuum_upgrade/speed
+ name = "vacuum pack speed upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that upgrades it's motor and allows it to suck slimes up faster."
+ upgrade_type = VACUUM_PACK_UPGRADE_SPEED
+
+/obj/item/disk/vacuum_upgrade/speed/on_upgrade(obj/item/vacuum_pack/pack)
+ pack.speed = UPGRADED_VACUUM_PACK_SPEED
+
+/obj/item/disk/vacuum_upgrade/pacification
+ name = "vacuum pack pacification upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to pacify all stored slimes."
+ upgrade_type = VACUUM_PACK_UPGRADE_PACIFY
+
+/obj/item/disk/vacuum_upgrade/biomass
+ name = "vacuum pack biomass printer upgrade disk"
+ desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to automatically recycle dead biomass and make living creatures on right click."
+ upgrade_type = VACUUM_PACK_UPGRADE_BIOMASS
+
+/obj/item/vacuum_pack/syndicate
+ name = "modified backpack xenofauna storage"
+ desc = "An illegally modified vacuum backpack xenofauna storage that has much more power, capacity and will make every slime it shoots out rabid."
+ icon_state = "vacuum_pack_syndicate"
+ inhand_icon_state = "vacuum_pack_syndicate"
+ range = ILLEGAL_VACUUM_PACK_RANGE
+ capacity = ILLEGAL_VACUUM_PACK_CAPACITY
+ speed = ILLEGAL_VACUUM_PACK_SPEED
+ illegal = TRUE
+ nozzle_type = /obj/item/vacuum_nozzle/syndicate
+ upgrades = list(VACUUM_PACK_UPGRADE_HEALING, VACUUM_PACK_UPGRADE_STASIS, VACUUM_PACK_UPGRADE_BIOMASS)
+ give_choice = FALSE
+
+/obj/item/vacuum_nozzle/syndicate
+ name = "modified vacuum pack nozzle"
+ desc = "A large black and red nozzle attached to a vacuum pack."
+ icon_state = "vacuum_nozzle_syndicate"
+ inhand_icon_state = "vacuum_nozzle_syndicate"
+
+
+#undef NORMAL_VACUUM_PACK_CAPACITY
+#undef UPGRADED_VACUUM_PACK_CAPACITY
+#undef ILLEGAL_VACUUM_PACK_CAPACITY
+
+#undef NORMAL_VACUUM_PACK_RANGE
+#undef UPGRADED_VACUUM_PACK_RANGE
+#undef ILLEGAL_VACUUM_PACK_RANGE
+
+#undef NORMAL_VACUUM_PACK_SPEED
+#undef UPGRADED_VACUUM_PACK_SPEED
+#undef ILLEGAL_VACUUM_PACK_SPEED
+
+#undef VACUUM_PACK_UPGRADE_STASIS
+#undef VACUUM_PACK_UPGRADE_HEALING
+#undef VACUUM_PACK_UPGRADE_CAPACITY
+#undef VACUUM_PACK_UPGRADE_RANGE
+#undef VACUUM_PACK_UPGRADE_SPEED
+#undef VACUUM_PACK_UPGRADE_PACIFY
+#undef VACUUM_PACK_UPGRADE_BIOMASS
diff --git a/monkestation/code/modules/slimecore/machines/biomass_recycler.dm b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm
new file mode 100644
index 000000000000..be89b669ffe2
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm
@@ -0,0 +1,181 @@
+GLOBAL_LIST_INIT(biomass_unlocks, list())
+
+/obj/machinery/biomass_recycler
+ name = "biomass recycler"
+ desc = "A machine used for recycling dead biomass and fabricating dehydrated creatures and eggs."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "grinder"
+ layer = BELOW_OBJ_LAYER
+ density = TRUE
+ circuit = /obj/item/circuitboard/machine/biomass_recycler
+ var/stored_matter = 0
+ var/cube_production = 0.2
+
+ var/static/list/recyclable_types = list(/mob/living/carbon/human/species/monkey = 1)
+ var/list/printable_types = list(/obj/item/stack/biomass = 1, /obj/item/food/monkeycube = 1)
+ var/list/vacuum_printable_types = list(/mob/living/carbon/human/species/monkey = 1)
+
+/obj/machinery/biomass_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled
+ . = ..()
+ cube_production = 0.2
+ for(var/obj/item/stock_parts/manipulator/B in component_parts)
+ cube_production += B.rating * 0.1
+ for(var/obj/item/stock_parts/matter_bin/M in component_parts)
+ cube_production += M.rating * 0.1
+
+/obj/machinery/biomass_recycler/examine(mob/user)
+ . = ..()
+ if(in_range(user, src) || isobserver(user))
+ . += span_notice("The status display reads: Recycles [cube_production] biomass units per unit inserted.")
+
+/obj/machinery/biomass_recycler/wrench_act(mob/living/user, obj/item/tool)
+ . = ..()
+ if(default_unfasten_wrench(user, tool))
+ power_change()
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/machinery/biomass_recycler/attackby(obj/item/O, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
+ return
+
+ if(default_pry_open(O))
+ return
+
+ if(default_deconstruction_crowbar(O))
+ return
+
+ if(machine_stat) //NOPOWER etc
+ return
+
+ if(HAS_TRAIT(O, TRAIT_NODROP))
+ return
+
+ if(istype(O, /obj/item/stack/biomass))
+ var/obj/item/stack/biomass/biomass = O
+ to_chat(user, span_notice("You insert [biomass.amount] cube\s of biomass into [src]."))
+ stored_matter += biomass.amount
+ qdel(biomass)
+ return
+
+ var/can_recycle
+ for(var/recycable_type in recyclable_types)
+ if(istype(O, recycable_type))
+ can_recycle = recycable_type
+ break
+
+ if(can_recycle)
+ recycle(O, user, can_recycle)
+
+/obj/machinery/biomass_recycler/MouseDrop_T(mob/living/target, mob/living/user)
+ if(!istype(target))
+ return
+
+ var/can_recycle
+ for(var/recycable_type in recyclable_types)
+ if(istype(target, recycable_type))
+ can_recycle = recycable_type
+ break
+
+ if(can_recycle)
+ stuff_creature_in(target, user, can_recycle)
+
+/obj/machinery/biomass_recycler/proc/stuff_creature_in(mob/living/target, mob/living/user, recycable_type)
+ if(!istype(target))
+ return
+ if(target.stat == CONSCIOUS)
+ to_chat(user, span_warning("[target] is struggling far too much to put it in the recycler."))
+ return
+ if(target.buckled || target.has_buckled_mobs())
+ to_chat(user, span_warning("[target] is attached to something."))
+ return
+
+ recycle(target, user, recycable_type)
+
+/obj/machinery/biomass_recycler/proc/recycle(atom/movable/target, mob/living/user, recycable_type)
+ qdel(target)
+ to_chat(user, span_notice("You stuff [target] into the machine."))
+ playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE)
+ var/offset = prob(50) ? -2 : 2
+ animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
+ use_power(active_power_usage)
+ stored_matter += cube_production * recyclable_types[recycable_type]
+ addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x))
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, span_notice("The machine now has [stored_matter] unit\s of biomass stored.")))
+
+/obj/machinery/biomass_recycler/interact(mob/user)
+ var/list/items = list()
+ var/list/item_names = list()
+ for(var/printable_type in GLOB.biomass_unlocks)
+ printable_types |= printable_type
+ printable_types[printable_type] = GLOB.biomass_unlocks[printable_type]
+
+ recyclable_types |= list(printable_type = 1)
+
+ for(var/printable_type in printable_types)
+ var/atom/movable/printable = printable_type
+ var/image/printable_image = image(icon = initial(printable.icon), icon_state = initial(printable.icon_state))
+ items += list(initial(printable.name) = printable_image)
+ item_names[initial(printable.name)] = printable_type
+
+ var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE)
+
+ if(!pick)
+ return
+
+ var/spawn_type = item_names[pick]
+ if(stored_matter < printable_types[spawn_type])
+ to_chat(user, span_warning("[src] does not have enough stored biomass for that! It currently has [stored_matter] out of [printable_types[spawn_type]] unit\s required."))
+ return
+
+ var/spawned = new spawn_type(user.loc)
+ to_chat(user, span_notice("The machine hisses loudly as it condenses the biomass. After a moment, it dispenses a brand new [spawned]."))
+ playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE)
+ stored_matter -= printable_types[spawn_type]
+ to_chat(user, span_notice("The machine's display flashes that it has [stored_matter] unit\s of biomass left."))
+
+/obj/item/stack/biomass
+ name = "biomass cubes"
+ desc = "A few cubes of green biomass."
+ icon = 'monkestation/code/modules/slimecore/icons/stack_objects.dmi'
+ icon_state = "biomass"
+ base_icon_state = "biomass"
+ max_amount = 5
+ singular_name = "biomass cube"
+ merge_type = /obj/item/stack/biomass
+ flags_1 = CONDUCT_1
+
+/obj/item/stack/biomass/update_icon_state()
+ . = ..()
+ icon_state = (amount == 1) ? "[base_icon_state]" : "[base_icon_state]_[min(amount, 5)]"
+
+/obj/item/disk/biomass_upgrade
+ name = "biomass recycler upgrade disk"
+ desc = "An upgrade disk for biomass recycler."
+ icon_state = "rndmajordisk"
+ var/list/printable_types = list()
+ var/list/vacuum_printable_types = list()
+
+/obj/item/disk/biomass_upgrade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(istype(target, /obj/machinery/biomass_recycler))
+ var/obj/machinery/biomass_recycler/recycler = target
+ to_chat(user, span_notice("You install [src] into [recycler]."))
+ playsound(user, 'sound/machines/click.ogg', 30, TRUE)
+
+ for(var/print_type in printable_types)
+ recycler.printable_types[print_type] = printable_types[print_type]
+
+ for(var/print_type in vacuum_printable_types)
+ recycler.vacuum_printable_types[print_type] = vacuum_printable_types[print_type]
+
+/*
+/obj/item/disk/biomass_upgrade/wobble
+ name = "\"Wobble Chicken\" biomass recycler upgrade disk"
+ printable_types = list(/obj/item/food/wobble_egg = 0.75)
+ vacuum_printable_types = list(/obj/item/food/wobble_egg = 0.75)
+*/
+
+/obj/item/disk/biomass_upgrade/rockroach
+ name = "\"Rockroach\" biomass recycler upgrade disk"
+ printable_types = list(/mob/living/basic/cockroach/rockroach = 0.4)
+ vacuum_printable_types = list(/mob/living/basic/cockroach/rockroach = 0.4)
diff --git a/monkestation/code/modules/slimecore/machines/extract_requestor.dm b/monkestation/code/modules/slimecore/machines/extract_requestor.dm
new file mode 100644
index 000000000000..1e254d48b130
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/extract_requestor.dm
@@ -0,0 +1,180 @@
+/obj/machinery/slime_extract_requestor
+ name = "extract requestor pad"
+ desc = "A tall device with a hole for retrieving slime extracts."
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "civilian_pad"
+ base_icon_state = "civilian_pad"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 10
+ active_power_usage = 2000
+ circuit = /obj/item/circuitboard/machine/slime_extract_requestor
+ var/obj/machinery/computer/slime_market/console
+ var/list/current_requests = list()
+
+ var/static/list/extracts = list()
+ var/static/list/name_to_path = list()
+
+
+/obj/machinery/slime_extract_requestor/Initialize(mapload)
+ . = ..()
+ if(GLOB.default_slime_market)
+ console = GLOB.default_slime_market
+ console.request_pad = src
+
+ if(!length(extracts))
+ for(var/obj/item/slime_extract/extract as anything in subtypesof(/obj/item/slime_extract))
+ var/obj/item/slime_extract/new_extract = new extract
+ extracts |= list("[new_extract.name]" = image(icon = new_extract.icon, icon_state = new_extract.icon_state))
+ name_to_path |= list("[new_extract.name]" = new_extract.type)
+ qdel(new_extract)
+
+/obj/machinery/slime_extract_requestor/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if(!console)
+ to_chat(user, span_warning("[src] does not have a console linked to it!"))
+ return
+ var/obj/item/card/id/card = user.get_idcard(TRUE)
+ if(!card)
+ to_chat(user, span_warning("Unable to locate an ID card!"))
+ return
+
+ if(check_in_requests(card))
+ if(check_finished_request(card))
+ return
+ say("You already have an ongoing request, would you like to cancel it?")
+ if(tgui_alert(user, "You already have an ongoing request, would you like to cancel it?", "[name]", list("Yes", "No")) == "Yes")
+ cancel_request(card)
+ return
+ create_request(user, card)
+
+/obj/machinery/slime_extract_requestor/multitool_act(mob/living/user, obj/item/tool)
+ if(!panel_open)
+ return
+ if(!multitool_check_buffer(user, tool))
+ return
+ var/obj/item/multitool/multitool = tool
+ multitool.buffer = src
+ to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer."))
+ return TOOL_ACT_TOOLTYPE_SUCCESS
+
+/obj/machinery/slime_extract_requestor/proc/check_in_requests(obj/item/card/id/card)
+ for(var/datum/extract_request_data/listed_request as anything in current_requests)
+ if(!(listed_request.host_card == card))
+ continue
+ return TRUE
+ return FALSE
+
+/obj/machinery/slime_extract_requestor/proc/check_finished_request(obj/item/card/id/card)
+ for(var/datum/extract_request_data/listed_request as anything in current_requests)
+ if(!(listed_request.host_card == card))
+ continue
+ if(listed_request.ready_for_pickup)
+ var/obj/item/storage/box/box = new(loc)
+ for(var/i in 1 to listed_request.extracts_needed)
+ new listed_request.extract_path(box)
+ current_requests -= listed_request
+ listed_request.finish_request(console)
+ qdel(listed_request)
+ return TRUE
+ return FALSE
+
+/obj/machinery/slime_extract_requestor/proc/cancel_request(obj/item/card/id/card)
+ for(var/datum/extract_request_data/listed_request as anything in current_requests)
+ if(!(listed_request.host_card == card))
+ continue
+ current_requests -= listed_request
+ listed_request.cancel_request_early(console)
+ qdel(listed_request)
+
+/obj/machinery/slime_extract_requestor/proc/create_request(mob/user, obj/item/card/id/card)
+ var/choice = show_radial_menu(user, src, extracts, require_near = TRUE, tooltips = TRUE)
+
+ if(!(choice in name_to_path))
+ return
+
+ var/number_choice = tgui_input_number(user, "How many extracts do you want?", "[name]", default = 1, min_value = 1, round_value = 1, max_value = 15)
+ if(!number_choice)
+ return
+
+ var/payout = tgui_input_number(user, "How much will the payout be for this request?", "[name]", default = 0, min_value = 0, round_value = 1, max_value = card.registered_account.account_balance)
+ if(payout)
+ card.registered_account.adjust_money(-payout, "Slime Extract Request")
+
+ var/datum/extract_request_data/request = new
+
+ request.host_card = card
+ request.extract_path = name_to_path[choice]
+ request.extracts_needed = number_choice
+ request.payout = payout
+ request.linked_console = console
+ request.request_name = "[card.registered_name]'s [choice] request ([number_choice])"
+ request.on_creation()
+
+ var/obj/item/slime_extract/request_extract = name_to_path[choice]
+ request.radial_data = list("[request.request_name]" = image(icon = initial(request_extract.icon), icon_state = initial(request_extract.icon_state)))
+
+ current_requests += request
+ console.say("A new request has been made.")
+
+/datum/extract_request_data
+ ///the name of our request
+ var/request_name
+ ///our linked_console purely for when something is early deleted
+ var/obj/machinery/computer/slime_market/linked_console
+ ///the card from which the request was made
+ var/obj/item/card/id/host_card
+ ///the extract we spawn
+ var/extract_path
+ ///the amount of extracts we need
+ var/extracts_needed = 1
+ ///the payoff sent to the scientist that finished the bounty
+ var/payout = 0
+ //radial information
+ var/list/radial_data = list()
+ ///amount of extracts given
+ var/extracts_given = 0
+ ///finished request
+ var/ready_for_pickup = FALSE
+
+/datum/extract_request_data/proc/on_creation()
+ RegisterSignal(host_card, COMSIG_QDELETING, PROC_REF(end_request_qdeleted))
+
+/datum/extract_request_data/Destroy(force, ...)
+ UnregisterSignal(host_card, COMSIG_QDELETING)
+ host_card = null
+ linked_console = null
+ QDEL_LIST(radial_data)
+ . = ..()
+
+/datum/extract_request_data/proc/end_request_qdeleted()
+ SIGNAL_HANDLER
+
+ linked_console.say("[host_card.registered_name]'s request has been cancelled.")
+ linked_console.return_extracts(extract_path, extracts_given)
+ linked_console.stored_credits += payout * 0.5
+ qdel(src)
+
+/datum/extract_request_data/proc/cancel_request_early(obj/machinery/computer/slime_market/console)
+ console.say("[host_card.registered_name]'s request has been cancelled.")
+ console.return_extracts(extract_path, extracts_given)
+ if(payout)
+ host_card.registered_account.adjust_money(payout * 0.5, "Slime Extract Request Cancelled Early")
+ console.stored_credits += payout * 0.5
+ qdel(src)
+
+/datum/extract_request_data/proc/finish_request(obj/machinery/computer/slime_market/console)
+ console.say("[host_card.registered_name]'s request has been collected.")
+ console.stored_credits += payout
+ SSresearch.xenobio_points += payout * 3
+ qdel(src)
+
+
+/datum/extract_request_data/proc/add_extract()
+ extracts_given++
+ if(extracts_given >= extracts_needed)
+ ready_for_pickup = TRUE
+ declare_ready()
+
+/datum/extract_request_data/proc/declare_ready()
+ host_card.say("Extract Request has been completed, please come collect your request.")
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm
new file mode 100644
index 000000000000..8baef0b70d46
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm
@@ -0,0 +1,214 @@
+#define CROSSBREED_BASE_PATHS list(\
+/datum/compressor_recipe/crossbreed/burning,\
+/datum/compressor_recipe/crossbreed/charged,\
+/datum/compressor_recipe/crossbreed/chilling,\
+/datum/compressor_recipe/crossbreed/consuming,\
+/datum/compressor_recipe/crossbreed/industrial,\
+/datum/compressor_recipe/crossbreed/prismatic,\
+/datum/compressor_recipe/crossbreed/regenerative,\
+/datum/compressor_recipe/crossbreed/reproductive,\
+/datum/compressor_recipe/crossbreed/selfsustaining,\
+/datum/compressor_recipe/crossbreed/stabilized,\
+)
+
+/obj/machinery/plumbing/ooze_compressor
+ name = "ooze compressor"
+ desc = "Compresses ooze into extracts."
+
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ base_icon_state = "cross_compressor"
+ icon_state = "cross_compressor"
+ category="Distribution"
+
+ anchored = TRUE
+
+ idle_power_usage = 10
+ active_power_usage = 1000
+
+ buffer = 5000
+ reagent_flags = NO_REACT
+
+ var/compressing = FALSE
+ var/repeat_recipe = FALSE
+
+ var/list/reagents_for_recipe = list()
+ var/datum/compressor_recipe/current_recipe
+
+ var/static/list/recipe_choices = list()
+ var/static/list/base_choices = list()
+ var/static/list/cross_breed_choices = list()
+ var/static/list/choice_to_datum = list()
+
+/obj/machinery/plumbing/ooze_compressor/Initialize(mapload, bolt, layer)
+ . = ..()
+ if(!length(recipe_choices))
+ for(var/datum/compressor_recipe/listed as anything in (subtypesof(/datum/compressor_recipe) - typesof(/datum/compressor_recipe/crossbreed)))
+ var/datum/compressor_recipe/stored_recipe = new listed
+ recipe_choices |= list("[initial(stored_recipe.output_item.name)]" = image(icon = initial(stored_recipe.output_item.icon), icon_state = initial(stored_recipe.output_item.icon_state)))
+ choice_to_datum |= list("[initial(stored_recipe.output_item.name)]" = stored_recipe)
+
+ if(!length(cross_breed_choices))
+ for(var/datum/compressor_recipe/listed as anything in CROSSBREED_BASE_PATHS)
+ var/datum/compressor_recipe/stored_recipe = new listed
+ var/obj/item/slimecross/crossbreed = stored_recipe.output_item
+ var/image/new_image = image(icon = initial(stored_recipe.output_item.icon), icon_state = initial(stored_recipe.output_item.icon_state))
+ new_image.color = return_color_from_string(initial(crossbreed.colour))
+ if(initial(crossbreed.colour) == "rainbow")
+ new_image.rainbow_effect()
+ base_choices |= list("[initial(stored_recipe.output_item.name)]" = new_image)
+ cross_breed_choices |= list("[initial(stored_recipe.output_item.name)]" = list())
+
+ for(var/datum/compressor_recipe/subtype as anything in subtypesof(listed))
+ var/datum/compressor_recipe/subtype_stored = new subtype
+ var/obj/item/slimecross/subtype_breed = subtype_stored.output_item
+ var/image/subtype_image = image(icon = initial(subtype_stored.output_item.icon), icon_state = initial(subtype_stored.output_item.icon_state))
+ subtype_image.color = return_color_from_string(initial(subtype_breed.colour))
+ if(initial(subtype_breed.colour) == "rainbow")
+ subtype_image.rainbow_effect()
+
+ cross_breed_choices["[initial(stored_recipe.output_item.name)]"] |= list("[initial(subtype_breed.colour)] [initial(subtype_stored.output_item.name)]" = subtype_image)
+ choice_to_datum |= list("[initial(subtype_breed.colour)] [initial(subtype_stored.output_item.name)]" = subtype_stored)
+
+ AddComponent(/datum/component/plumbing/ooze_compressor, bolt, layer)
+ register_context()
+
+/obj/machinery/plumbing/ooze_compressor/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+ context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle Repeated Extract Compression"
+ context[SCREENTIP_CONTEXT_LMB] = "Select a normal extract to make"
+ context[SCREENTIP_CONTEXT_RMB] = "Select a crossbreed to make"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/machinery/plumbing/ooze_compressor/create_reagents(max_vol, flags)
+ . = ..()
+ RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change))
+ RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del))
+
+/obj/machinery/plumbing/ooze_compressor/update_icon_state()
+ . = ..()
+ if(compressing)
+ icon_state = "cross_compressor_running"
+ else
+ icon_state = base_icon_state
+
+/obj/machinery/plumbing/ooze_compressor/examine(mob/user)
+ . = ..()
+ if(!current_recipe)
+ return
+ for(var/datum/reagent/reagent as anything in current_recipe.required_oozes)
+ var/reagent_volume = 0
+ for(var/datum/reagent/listed_reagent as anything in reagents.reagent_list)
+ if(listed_reagent.type != reagent)
+ continue
+ reagent_volume = listed_reagent.volume
+ . += span_notice("[reagent_volume] out of [current_recipe.required_oozes[reagent]] units of [initial(reagent.name)].")
+ reagent_volume = 0
+
+/obj/machinery/plumbing/ooze_compressor/update_overlays()
+ . = ..()
+ if(length(reagents.reagent_list) >= 1 && length(reagents_for_recipe) >= 1)
+ var/needed_reagents = reagents_for_recipe[1]
+ var/datum/reagent/first_reagent = reagents.reagent_list[1]
+ var/filled_precent = first_reagent.volume / reagents_for_recipe[needed_reagents]
+
+ var/state = "quarter"
+ switch(filled_precent)
+ if(0.5 to 0.99)
+ state = "half"
+ if(1 to INFINITY)
+ state = "full"
+
+ var/mutable_appearance/right_side = mutable_appearance(icon, "cross_compressor_right_[state]", layer, src)
+ right_side.color = first_reagent.color
+ . += right_side
+
+ if(length(reagents.reagent_list) >= 2 && length(reagents_for_recipe) >= 2)
+ var/needed_reagents = reagents_for_recipe[2]
+ var/datum/reagent/first_reagent = reagents.reagent_list[2]
+ var/filled_precent = first_reagent.volume / reagents_for_recipe[needed_reagents]
+
+ var/state = "quarter"
+ switch(filled_precent)
+ if(0.5 to 0.99)
+ state = "half"
+ if(1 to INFINITY)
+ state = "full"
+
+ var/mutable_appearance/left_side = mutable_appearance(icon, "cross_compressor_left_[state]", layer, src)
+ left_side.color = first_reagent.color
+ . += left_side
+
+ . += mutable_appearance(icon, "cross_compressor_tank", layer + 0.01, src)
+
+/// Handles properly detaching signal hooks.
+/obj/machinery/plumbing/ooze_compressor/proc/on_reagents_del(datum/reagents/reagents)
+ SIGNAL_HANDLER
+ UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING))
+ return NONE
+
+/// Handles stopping the emptying process when the chamber empties.
+/obj/machinery/plumbing/ooze_compressor/proc/on_reagent_change(datum/reagents/holder, ...)
+ SIGNAL_HANDLER
+ update_appearance()
+ if(holder.total_volume == 0 && !compressing) //we were emptying, but now we aren't
+ holder.flags |= NO_REACT
+ return NONE
+
+/obj/machinery/plumbing/ooze_compressor/process(seconds_per_tick)
+ if(!compressing)
+ use_power(active_power_usage * seconds_per_tick)
+
+/obj/machinery/plumbing/ooze_compressor/proc/compress_recipe()
+ compressing = TRUE
+ update_appearance()
+ if(!repeat_recipe)
+ reagents_for_recipe = list()
+ addtimer(CALLBACK(src, PROC_REF(finish_compressing)), 3 SECONDS)
+
+/obj/machinery/plumbing/ooze_compressor/proc/finish_compressing()
+ for(var/i in 1 to current_recipe.created_amount)
+ new current_recipe.output_item(loc)
+ compressing = FALSE
+ update_appearance()
+ reagents.clear_reagents()
+ if(!repeat_recipe)
+ current_recipe = null
+
+/obj/machinery/plumbing/ooze_compressor/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if(change_recipe(user))
+ reagents.clear_reagents()
+
+/obj/machinery/plumbing/ooze_compressor/attack_hand_secondary(mob/living/user, list/modifiers)
+ . = ..()
+ if(change_recipe(user, TRUE))
+ reagents.clear_reagents()
+
+/obj/machinery/plumbing/ooze_compressor/AltClick(mob/user)
+ if(anchored)
+ visible_message(span_notice("[user] presses a button turning the repeat recipe system [repeat_recipe ? "Off" : "On"]"))
+ repeat_recipe = !repeat_recipe
+ return TRUE
+ . = ..()
+
+/obj/machinery/plumbing/ooze_compressor/proc/change_recipe(mob/user, cross_breed = FALSE)
+ var/choice
+ if(cross_breed)
+ var/base_choice = show_radial_menu(user, src, base_choices, require_near = TRUE, tooltips = TRUE)
+ if(!base_choice)
+ return
+ choice = show_radial_menu(user, src, cross_breed_choices[base_choice], require_near = TRUE, tooltips = TRUE)
+ else
+ choice = show_radial_menu(user, src, recipe_choices, require_near = TRUE, tooltips = TRUE)
+
+ if(!(choice in choice_to_datum))
+ return
+
+ if(compressing)
+ return
+
+ current_recipe = choice_to_datum[choice]
+ reagents_for_recipe = list()
+ reagents_for_recipe += current_recipe.required_oozes
+
+#undef CROSSBREED_BASE_PATHS
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm
new file mode 100644
index 000000000000..ea3f0838b69c
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm
@@ -0,0 +1,31 @@
+/datum/component/plumbing/ooze_compressor
+ demand_connects = NORTH
+
+/datum/component/plumbing/ooze_compressor/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver)
+ . = ..()
+ if(!istype(parent, /obj/machinery/plumbing/ooze_compressor))
+ return COMPONENT_INCOMPATIBLE
+
+/datum/component/plumbing/ooze_compressor/send_request(dir)
+ var/obj/machinery/plumbing/ooze_compressor/chamber = parent
+ if(chamber.compressing || !chamber.current_recipe)
+ return
+ var/present_amount
+ var/diff
+ for(var/required_reagent in chamber.reagents_for_recipe)
+ //find how much amount is already present if at all
+ present_amount = 0
+ for(var/datum/reagent/containg_reagent as anything in reagents.reagent_list)
+ if(required_reagent == containg_reagent.type)
+ present_amount = containg_reagent.volume
+ break
+
+ //compute how much more is needed and round it
+ diff = chamber.reagents_for_recipe[required_reagent] - present_amount
+ if(diff >= CHEMICAL_QUANTISATION_LEVEL * 10) //should be safe even after rounding
+ process_request(min(diff, MACHINE_REAGENT_TRANSFER), required_reagent, dir)
+ return
+
+ chamber.compress_recipe() //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update
+ //everything for every chemical removed, wich isn't a good option either.
+ chamber.on_reagent_change(reagents) //We need to check it now, because some reactions leave nothing left.
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm
new file mode 100644
index 000000000000..a60288732cb3
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm
@@ -0,0 +1,6 @@
+/datum/compressor_recipe
+ var/list/required_oozes = list()
+ var/obj/item/output_item
+ var/created_amount = 1
+
+/datum/compressor_recipe/crossbreed
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm
new file mode 100644
index 000000000000..3138caf36bbf
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm
@@ -0,0 +1,154 @@
+/datum/compressor_recipe/crossbreed/burning // EXISTS FOR SUBTYPING
+ output_item = /obj/item/slimecross/burning/grey
+/datum/compressor_recipe/crossbreed/burning/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/grey
+
+/datum/compressor_recipe/crossbreed/burning/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/orange = 1000,
+ )
+ output_item = /obj/item/slimecross/burning/orange
+
+/datum/compressor_recipe/crossbreed/burning/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/purple
+
+/datum/compressor_recipe/crossbreed/burning/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/blue
+
+/datum/compressor_recipe/crossbreed/burning/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/metal = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/metal
+
+/datum/compressor_recipe/crossbreed/burning/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/yellow
+
+/datum/compressor_recipe/crossbreed/burning/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/darkpurple
+
+/datum/compressor_recipe/crossbreed/burning/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/darkblue
+
+/datum/compressor_recipe/crossbreed/burning/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/silver
+
+/datum/compressor_recipe/crossbreed/burning/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/bluespace
+
+/datum/compressor_recipe/crossbreed/burning/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/cerulean
+
+/datum/compressor_recipe/crossbreed/burning/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/sepia
+
+/datum/compressor_recipe/crossbreed/burning/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/pyrite
+
+/datum/compressor_recipe/crossbreed/burning/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/red
+
+/datum/compressor_recipe/crossbreed/burning/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/green
+
+/datum/compressor_recipe/crossbreed/burning/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/pink
+
+/datum/compressor_recipe/crossbreed/burning/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/gold
+
+/datum/compressor_recipe/crossbreed/burning/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/oil
+
+/datum/compressor_recipe/crossbreed/burning/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/black
+
+/datum/compressor_recipe/crossbreed/burning/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/lightpink
+
+/datum/compressor_recipe/crossbreed/burning/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/adamantine
+
+/datum/compressor_recipe/crossbreed/burning/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/burning/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm
new file mode 100644
index 000000000000..b93b35eff4de
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/charged
+ output_item = /obj/item/slimecross/charged/grey
+
+/datum/compressor_recipe/crossbreed/charged/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/grey
+
+/datum/compressor_recipe/crossbreed/charged/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/charged/orange
+
+/datum/compressor_recipe/crossbreed/charged/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/charged/metal
+
+/datum/compressor_recipe/crossbreed/charged/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/purple
+
+/datum/compressor_recipe/crossbreed/charged/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/blue
+
+/datum/compressor_recipe/crossbreed/charged/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 1000,
+ )
+ output_item = /obj/item/slimecross/charged/yellow
+
+/datum/compressor_recipe/crossbreed/charged/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/darkpurple
+
+/datum/compressor_recipe/crossbreed/charged/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/darkblue
+
+/datum/compressor_recipe/crossbreed/charged/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/silver
+
+/datum/compressor_recipe/crossbreed/charged/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/bluespace
+
+/datum/compressor_recipe/crossbreed/charged/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/sepia
+
+/datum/compressor_recipe/crossbreed/charged/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/pyrite
+
+/datum/compressor_recipe/crossbreed/charged/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/red
+
+/datum/compressor_recipe/crossbreed/charged/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/green
+
+/datum/compressor_recipe/crossbreed/charged/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/pink
+
+/datum/compressor_recipe/crossbreed/charged/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/gold
+
+/datum/compressor_recipe/crossbreed/charged/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/oil
+
+/datum/compressor_recipe/crossbreed/charged/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/black
+
+/datum/compressor_recipe/crossbreed/charged/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/lightpink
+
+/datum/compressor_recipe/crossbreed/charged/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/adamantine
+
+/datum/compressor_recipe/crossbreed/charged/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/cerulean
+
+/datum/compressor_recipe/crossbreed/charged/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/yellow = 500,
+ )
+ output_item = /obj/item/slimecross/charged/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm
new file mode 100644
index 000000000000..e902f179f5fd
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/chilling
+ output_item = /obj/item/slimecross/chilling/grey
+
+/datum/compressor_recipe/crossbreed/chilling/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/grey
+
+/datum/compressor_recipe/crossbreed/chilling/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/orange
+
+/datum/compressor_recipe/crossbreed/chilling/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/metal
+
+/datum/compressor_recipe/crossbreed/chilling/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/purple
+
+/datum/compressor_recipe/crossbreed/chilling/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/blue
+
+/datum/compressor_recipe/crossbreed/chilling/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/yellow
+
+/datum/compressor_recipe/crossbreed/chilling/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/darkpurple
+
+/datum/compressor_recipe/crossbreed/chilling/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 1000,
+ )
+ output_item = /obj/item/slimecross/chilling/darkblue
+
+/datum/compressor_recipe/crossbreed/chilling/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/silver
+
+/datum/compressor_recipe/crossbreed/chilling/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/bluespace
+
+/datum/compressor_recipe/crossbreed/chilling/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/sepia
+
+/datum/compressor_recipe/crossbreed/chilling/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/pyrite
+
+/datum/compressor_recipe/crossbreed/chilling/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/red
+
+/datum/compressor_recipe/crossbreed/chilling/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/green
+
+/datum/compressor_recipe/crossbreed/chilling/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/pink
+
+/datum/compressor_recipe/crossbreed/chilling/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/gold
+
+/datum/compressor_recipe/crossbreed/chilling/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/oil
+
+/datum/compressor_recipe/crossbreed/chilling/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/black
+
+/datum/compressor_recipe/crossbreed/chilling/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/lightpink
+
+/datum/compressor_recipe/crossbreed/chilling/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/adamantine
+
+/datum/compressor_recipe/crossbreed/chilling/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/cerulean
+
+/datum/compressor_recipe/crossbreed/chilling/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/darkblue = 500,
+ )
+ output_item = /obj/item/slimecross/chilling/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm
new file mode 100644
index 000000000000..ff9d3754bcd6
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm
@@ -0,0 +1,87 @@
+/datum/compressor_recipe/grey
+ required_oozes = list(/datum/reagent/slime_ooze/grey = 20)
+ output_item = /obj/item/slime_extract/grey
+
+/datum/compressor_recipe/metal
+ required_oozes = list(/datum/reagent/slime_ooze/metal = 20)
+ output_item = /obj/item/slime_extract/metal
+
+/datum/compressor_recipe/orange
+ required_oozes = list(/datum/reagent/slime_ooze/orange = 20)
+ output_item = /obj/item/slime_extract/orange
+
+/datum/compressor_recipe/purple
+ required_oozes = list(/datum/reagent/slime_ooze/purple = 20)
+ output_item = /obj/item/slime_extract/purple
+
+/datum/compressor_recipe/yellow
+ required_oozes = list(/datum/reagent/slime_ooze/yellow = 20)
+ output_item = /obj/item/slime_extract/yellow
+
+/datum/compressor_recipe/darkpurple
+ required_oozes = list(/datum/reagent/slime_ooze/darkpurple = 20)
+ output_item = /obj/item/slime_extract/darkpurple
+
+/datum/compressor_recipe/darkblue
+ required_oozes = list(/datum/reagent/slime_ooze/darkblue = 20)
+ output_item = /obj/item/slime_extract/darkblue
+
+/datum/compressor_recipe/silver
+ required_oozes = list(/datum/reagent/slime_ooze/silver = 20)
+ output_item = /obj/item/slime_extract/silver
+
+/datum/compressor_recipe/blue
+ required_oozes = list(/datum/reagent/slime_ooze/blue = 20)
+ output_item = /obj/item/slime_extract/blue
+
+/datum/compressor_recipe/cerulean
+ required_oozes = list(/datum/reagent/slime_ooze/cerulean = 20)
+ output_item = /obj/item/slime_extract/cerulean
+
+/datum/compressor_recipe/sepia
+ required_oozes = list(/datum/reagent/slime_ooze/sepia = 20)
+ output_item = /obj/item/slime_extract/sepia
+
+/datum/compressor_recipe/bluespace
+ required_oozes = list(/datum/reagent/slime_ooze/bluespace = 20)
+ output_item = /obj/item/slime_extract/bluespace
+
+/datum/compressor_recipe/pyrite
+ required_oozes = list(/datum/reagent/slime_ooze/pyrite = 20)
+ output_item = /obj/item/slime_extract/pyrite
+
+/datum/compressor_recipe/red
+ required_oozes = list(/datum/reagent/slime_ooze/red = 20)
+ output_item = /obj/item/slime_extract/red
+
+/datum/compressor_recipe/green
+ required_oozes = list(/datum/reagent/slime_ooze/green = 20)
+ output_item = /obj/item/slime_extract/green
+
+/datum/compressor_recipe/pink
+ required_oozes = list(/datum/reagent/slime_ooze/pink = 20)
+ output_item = /obj/item/slime_extract/pink
+
+/datum/compressor_recipe/oil
+ required_oozes = list(/datum/reagent/slime_ooze/oil = 20)
+ output_item = /obj/item/slime_extract/oil
+
+/datum/compressor_recipe/black
+ required_oozes = list(/datum/reagent/slime_ooze/black = 20)
+ output_item = /obj/item/slime_extract/black
+
+/datum/compressor_recipe/lightpink
+ required_oozes = list(/datum/reagent/slime_ooze/lightpink = 20)
+ output_item = /obj/item/slime_extract/lightpink
+
+/datum/compressor_recipe/adamantine
+ required_oozes = list(/datum/reagent/slime_ooze/adamantine = 20)
+ output_item = /obj/item/slime_extract/adamantine
+
+/datum/compressor_recipe/rainbow
+ required_oozes = list(/datum/reagent/slime_ooze/rainbow = 20)
+ output_item = /obj/item/slime_extract/rainbow
+
+/datum/compressor_recipe/gold
+ required_oozes = list(/datum/reagent/slime_ooze/gold = 20)
+ output_item = /obj/item/slime_extract/gold
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm
new file mode 100644
index 000000000000..ce77d9f1407f
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/consuming
+ output_item = /obj/item/slimecross/consuming/grey
+
+/datum/compressor_recipe/crossbreed/consuming/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/grey
+
+/datum/compressor_recipe/crossbreed/consuming/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/orange
+
+/datum/compressor_recipe/crossbreed/consuming/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/metal
+
+/datum/compressor_recipe/crossbreed/consuming/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/purple
+
+/datum/compressor_recipe/crossbreed/consuming/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/blue
+
+/datum/compressor_recipe/crossbreed/consuming/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/yellow
+
+/datum/compressor_recipe/crossbreed/consuming/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/darkpurple
+
+/datum/compressor_recipe/crossbreed/consuming/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 1000,
+ )
+ output_item = /obj/item/slimecross/consuming/silver
+
+/datum/compressor_recipe/crossbreed/consuming/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/silver
+
+/datum/compressor_recipe/crossbreed/consuming/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/bluespace
+
+/datum/compressor_recipe/crossbreed/consuming/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/sepia
+
+/datum/compressor_recipe/crossbreed/consuming/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/pyrite
+
+/datum/compressor_recipe/crossbreed/consuming/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/red
+
+/datum/compressor_recipe/crossbreed/consuming/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/green
+
+/datum/compressor_recipe/crossbreed/consuming/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/pink
+
+/datum/compressor_recipe/crossbreed/consuming/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/gold
+
+/datum/compressor_recipe/crossbreed/consuming/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/oil
+
+/datum/compressor_recipe/crossbreed/consuming/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/black
+
+/datum/compressor_recipe/crossbreed/consuming/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/lightpink
+
+/datum/compressor_recipe/crossbreed/consuming/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/adamantine
+
+/datum/compressor_recipe/crossbreed/consuming/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/cerulean
+
+/datum/compressor_recipe/crossbreed/consuming/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/silver = 500,
+ )
+ output_item = /obj/item/slimecross/consuming/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm
new file mode 100644
index 000000000000..07a54976d8da
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/industrial
+ output_item = /obj/item/slimecross/industrial/grey
+
+/datum/compressor_recipe/crossbreed/industrial/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/grey
+
+/datum/compressor_recipe/crossbreed/industrial/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/metal = 1000,
+ )
+ output_item = /obj/item/slimecross/industrial/metal
+
+/datum/compressor_recipe/crossbreed/industrial/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/metal = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/orange
+
+/datum/compressor_recipe/crossbreed/industrial/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/purple
+
+/datum/compressor_recipe/crossbreed/industrial/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/blue
+
+/datum/compressor_recipe/crossbreed/industrial/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/yellow
+
+/datum/compressor_recipe/crossbreed/industrial/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/darkpurple
+
+/datum/compressor_recipe/crossbreed/industrial/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/darkblue
+
+/datum/compressor_recipe/crossbreed/industrial/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/silver
+
+/datum/compressor_recipe/crossbreed/industrial/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/bluespace
+
+/datum/compressor_recipe/crossbreed/industrial/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/sepia
+
+/datum/compressor_recipe/crossbreed/industrial/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/pyrite
+
+/datum/compressor_recipe/crossbreed/industrial/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/red
+
+/datum/compressor_recipe/crossbreed/industrial/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/green
+
+/datum/compressor_recipe/crossbreed/industrial/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/pink
+
+/datum/compressor_recipe/crossbreed/industrial/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/gold
+
+/datum/compressor_recipe/crossbreed/industrial/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/oil
+
+/datum/compressor_recipe/crossbreed/industrial/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/black
+
+/datum/compressor_recipe/crossbreed/industrial/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/lightpink
+
+/datum/compressor_recipe/crossbreed/industrial/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/adamantine
+
+/datum/compressor_recipe/crossbreed/industrial/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/cerulean
+
+/datum/compressor_recipe/crossbreed/industrial/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/industrial/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm
new file mode 100644
index 000000000000..c891dda82357
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/prismatic
+ output_item = /obj/item/slimecross/prismatic/grey
+
+/datum/compressor_recipe/crossbreed/prismatic/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/grey
+
+/datum/compressor_recipe/crossbreed/prismatic/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/orange
+
+/datum/compressor_recipe/crossbreed/prismatic/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/metal
+
+/datum/compressor_recipe/crossbreed/prismatic/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/purple
+
+/datum/compressor_recipe/crossbreed/prismatic/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/blue
+
+/datum/compressor_recipe/crossbreed/prismatic/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/yellow
+
+/datum/compressor_recipe/crossbreed/prismatic/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/darkpurple
+
+/datum/compressor_recipe/crossbreed/prismatic/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 1000,
+ )
+ output_item = /obj/item/slimecross/prismatic/pyrite
+
+/datum/compressor_recipe/crossbreed/prismatic/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/silver
+
+/datum/compressor_recipe/crossbreed/prismatic/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/bluespace
+
+/datum/compressor_recipe/crossbreed/prismatic/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/sepia
+
+/datum/compressor_recipe/crossbreed/prismatic/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/darkblue
+
+/datum/compressor_recipe/crossbreed/prismatic/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/red
+
+/datum/compressor_recipe/crossbreed/prismatic/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/green
+
+/datum/compressor_recipe/crossbreed/prismatic/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/pink
+
+/datum/compressor_recipe/crossbreed/prismatic/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/gold
+
+/datum/compressor_recipe/crossbreed/prismatic/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/oil
+
+/datum/compressor_recipe/crossbreed/prismatic/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/black
+
+/datum/compressor_recipe/crossbreed/prismatic/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/lightpink
+
+/datum/compressor_recipe/crossbreed/prismatic/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/adamantine
+
+/datum/compressor_recipe/crossbreed/prismatic/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/cerulean
+
+/datum/compressor_recipe/crossbreed/prismatic/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/pyrite = 500,
+ )
+ output_item = /obj/item/slimecross/prismatic/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm
new file mode 100644
index 000000000000..fc0b74619efa
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/recurring
+ output_item = /obj/item/slimecross/recurring/grey
+
+/datum/compressor_recipe/crossbreed/recurring/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/grey
+
+/datum/compressor_recipe/crossbreed/recurring/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/orange
+
+/datum/compressor_recipe/crossbreed/recurring/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/metal
+
+/datum/compressor_recipe/crossbreed/recurring/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/purple
+
+/datum/compressor_recipe/crossbreed/recurring/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/blue
+
+/datum/compressor_recipe/crossbreed/recurring/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/yellow
+
+/datum/compressor_recipe/crossbreed/recurring/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/darkpurple
+
+/datum/compressor_recipe/crossbreed/recurring/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/cerulean = 1000,
+ )
+ output_item = /obj/item/slimecross/recurring/cerulean
+
+/datum/compressor_recipe/crossbreed/recurring/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/silver
+
+/datum/compressor_recipe/crossbreed/recurring/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/bluespace
+
+/datum/compressor_recipe/crossbreed/recurring/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/sepia
+
+/datum/compressor_recipe/crossbreed/recurring/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/darkblue
+
+/datum/compressor_recipe/crossbreed/recurring/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/red
+
+/datum/compressor_recipe/crossbreed/recurring/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/green
+
+/datum/compressor_recipe/crossbreed/recurring/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/pink
+
+/datum/compressor_recipe/crossbreed/recurring/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/gold
+
+/datum/compressor_recipe/crossbreed/recurring/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/oil
+
+/datum/compressor_recipe/crossbreed/recurring/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/black
+
+/datum/compressor_recipe/crossbreed/recurring/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/lightpink
+
+/datum/compressor_recipe/crossbreed/recurring/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/adamantine
+
+/datum/compressor_recipe/crossbreed/recurring/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/pyrite
+
+/datum/compressor_recipe/crossbreed/recurring/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/recurring/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm
new file mode 100644
index 000000000000..afaa3cb751da
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/regenerative
+ output_item = /obj/item/slimecross/regenerative/grey
+
+/datum/compressor_recipe/crossbreed/regenerative/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/grey
+
+/datum/compressor_recipe/crossbreed/regenerative/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/orange
+
+/datum/compressor_recipe/crossbreed/regenerative/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/metal
+
+/datum/compressor_recipe/crossbreed/regenerative/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/cerulean
+
+/datum/compressor_recipe/crossbreed/regenerative/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/blue
+
+/datum/compressor_recipe/crossbreed/regenerative/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/yellow
+
+/datum/compressor_recipe/crossbreed/regenerative/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/darkpurple
+
+/datum/compressor_recipe/crossbreed/regenerative/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 1000,
+ )
+ output_item = /obj/item/slimecross/regenerative/purple
+
+/datum/compressor_recipe/crossbreed/regenerative/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/silver
+
+/datum/compressor_recipe/crossbreed/regenerative/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/bluespace
+
+/datum/compressor_recipe/crossbreed/regenerative/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/sepia
+
+/datum/compressor_recipe/crossbreed/regenerative/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/darkblue
+
+/datum/compressor_recipe/crossbreed/regenerative/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/red
+
+/datum/compressor_recipe/crossbreed/regenerative/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/green
+
+/datum/compressor_recipe/crossbreed/regenerative/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/pink
+
+/datum/compressor_recipe/crossbreed/regenerative/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/gold
+
+/datum/compressor_recipe/crossbreed/regenerative/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/oil
+
+/datum/compressor_recipe/crossbreed/regenerative/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/black
+
+/datum/compressor_recipe/crossbreed/regenerative/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/lightpink
+
+/datum/compressor_recipe/crossbreed/regenerative/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/adamantine
+
+/datum/compressor_recipe/crossbreed/regenerative/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/pyrite
+
+/datum/compressor_recipe/crossbreed/regenerative/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/purple = 500,
+ )
+ output_item = /obj/item/slimecross/regenerative/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm
new file mode 100644
index 000000000000..f583194de434
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/reproductive
+ output_item = /obj/item/slimecross/reproductive/purple
+
+/datum/compressor_recipe/crossbreed/reproductive/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/purple
+
+/datum/compressor_recipe/crossbreed/reproductive/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/orange
+
+/datum/compressor_recipe/crossbreed/reproductive/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/metal
+
+/datum/compressor_recipe/crossbreed/reproductive/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/cerulean
+
+/datum/compressor_recipe/crossbreed/reproductive/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/blue
+
+/datum/compressor_recipe/crossbreed/reproductive/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/yellow
+
+/datum/compressor_recipe/crossbreed/reproductive/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/darkpurple
+
+/datum/compressor_recipe/crossbreed/reproductive/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 1000,
+ )
+ output_item = /obj/item/slimecross/reproductive/grey
+
+/datum/compressor_recipe/crossbreed/reproductive/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/silver
+
+/datum/compressor_recipe/crossbreed/reproductive/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/bluespace
+
+/datum/compressor_recipe/crossbreed/reproductive/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/sepia
+
+/datum/compressor_recipe/crossbreed/reproductive/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/darkblue
+
+/datum/compressor_recipe/crossbreed/reproductive/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/red
+
+/datum/compressor_recipe/crossbreed/reproductive/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/green
+
+/datum/compressor_recipe/crossbreed/reproductive/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/pink
+
+/datum/compressor_recipe/crossbreed/reproductive/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/gold
+
+/datum/compressor_recipe/crossbreed/reproductive/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/oil
+
+/datum/compressor_recipe/crossbreed/reproductive/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/black
+
+/datum/compressor_recipe/crossbreed/reproductive/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/lightpink
+
+/datum/compressor_recipe/crossbreed/reproductive/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/adamantine
+
+/datum/compressor_recipe/crossbreed/reproductive/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/pyrite
+
+/datum/compressor_recipe/crossbreed/reproductive/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/grey = 500,
+ )
+ output_item = /obj/item/slimecross/reproductive/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm
new file mode 100644
index 000000000000..60d960c607d9
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/selfsustaining
+ output_item = /obj/item/slimecross/selfsustaining/purple
+
+/datum/compressor_recipe/crossbreed/selfsustaining/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/purple
+
+/datum/compressor_recipe/crossbreed/selfsustaining/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/orange
+
+/datum/compressor_recipe/crossbreed/selfsustaining/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/metal
+
+/datum/compressor_recipe/crossbreed/selfsustaining/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/cerulean
+
+/datum/compressor_recipe/crossbreed/selfsustaining/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/blue
+
+/datum/compressor_recipe/crossbreed/selfsustaining/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/yellow
+
+/datum/compressor_recipe/crossbreed/selfsustaining/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/grey
+
+/datum/compressor_recipe/crossbreed/selfsustaining/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 1000,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/darkpurple
+
+/datum/compressor_recipe/crossbreed/selfsustaining/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/silver
+
+/datum/compressor_recipe/crossbreed/selfsustaining/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/bluespace
+
+/datum/compressor_recipe/crossbreed/selfsustaining/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/sepia
+
+/datum/compressor_recipe/crossbreed/selfsustaining/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/darkblue
+
+/datum/compressor_recipe/crossbreed/selfsustaining/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/red
+
+/datum/compressor_recipe/crossbreed/selfsustaining/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/green
+
+/datum/compressor_recipe/crossbreed/selfsustaining/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/pink
+
+/datum/compressor_recipe/crossbreed/selfsustaining/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/gold
+
+/datum/compressor_recipe/crossbreed/selfsustaining/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/oil
+
+/datum/compressor_recipe/crossbreed/selfsustaining/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/black
+
+/datum/compressor_recipe/crossbreed/selfsustaining/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/lightpink
+
+/datum/compressor_recipe/crossbreed/selfsustaining/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/adamantine
+
+/datum/compressor_recipe/crossbreed/selfsustaining/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/pyrite
+
+/datum/compressor_recipe/crossbreed/selfsustaining/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ )
+ output_item = /obj/item/slimecross/selfsustaining/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm
new file mode 100644
index 000000000000..446563660f71
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm
@@ -0,0 +1,155 @@
+/datum/compressor_recipe/crossbreed/stabilized
+ output_item = /obj/item/slimecross/stabilized/purple
+
+/datum/compressor_recipe/crossbreed/stabilized/purple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/purple = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/purple
+
+/datum/compressor_recipe/crossbreed/stabilized/orange
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/orange = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/orange
+
+/datum/compressor_recipe/crossbreed/stabilized/metal
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/metal = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/metal
+
+/datum/compressor_recipe/crossbreed/stabilized/cerulean
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 500,
+ /datum/reagent/slime_ooze/cerulean = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/cerulean
+
+/datum/compressor_recipe/crossbreed/stabilized/darkpurple
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkpurple = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/darkpurple
+
+/datum/compressor_recipe/crossbreed/stabilized/yellow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/yellow = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/yellow
+
+/datum/compressor_recipe/crossbreed/stabilized/grey
+ required_oozes = list(
+ /datum/reagent/slime_ooze/grey = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/grey
+
+/datum/compressor_recipe/crossbreed/stabilized/blue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/blue = 1000,
+ )
+ output_item = /obj/item/slimecross/stabilized/blue
+
+/datum/compressor_recipe/crossbreed/stabilized/silver
+ required_oozes = list(
+ /datum/reagent/slime_ooze/silver = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/silver
+
+/datum/compressor_recipe/crossbreed/stabilized/bluespace
+ required_oozes = list(
+ /datum/reagent/slime_ooze/bluespace = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/bluespace
+
+/datum/compressor_recipe/crossbreed/stabilized/sepia
+ required_oozes = list(
+ /datum/reagent/slime_ooze/sepia = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/sepia
+
+/datum/compressor_recipe/crossbreed/stabilized/darkblue
+ required_oozes = list(
+ /datum/reagent/slime_ooze/darkblue = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/darkblue
+
+/datum/compressor_recipe/crossbreed/stabilized/red
+ required_oozes = list(
+ /datum/reagent/slime_ooze/red = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/red
+
+/datum/compressor_recipe/crossbreed/stabilized/green
+ required_oozes = list(
+ /datum/reagent/slime_ooze/green = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/green
+
+/datum/compressor_recipe/crossbreed/stabilized/pink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pink = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/pink
+
+/datum/compressor_recipe/crossbreed/stabilized/gold
+ required_oozes = list(
+ /datum/reagent/slime_ooze/gold = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/gold
+
+/datum/compressor_recipe/crossbreed/stabilized/oil
+ required_oozes = list(
+ /datum/reagent/slime_ooze/oil = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/oil
+
+/datum/compressor_recipe/crossbreed/stabilized/black
+ required_oozes = list(
+ /datum/reagent/slime_ooze/black = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/black
+
+/datum/compressor_recipe/crossbreed/stabilized/lightpink
+ required_oozes = list(
+ /datum/reagent/slime_ooze/lightpink = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/lightpink
+
+/datum/compressor_recipe/crossbreed/stabilized/adamantine
+ required_oozes = list(
+ /datum/reagent/slime_ooze/adamantine = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/adamantine
+
+/datum/compressor_recipe/crossbreed/stabilized/pyrite
+ required_oozes = list(
+ /datum/reagent/slime_ooze/pyrite = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/pyrite
+
+/datum/compressor_recipe/crossbreed/stabilized/rainbow
+ required_oozes = list(
+ /datum/reagent/slime_ooze/rainbow = 500,
+ /datum/reagent/slime_ooze/blue = 500,
+ )
+ output_item = /obj/item/slimecross/stabilized/rainbow
diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm
new file mode 100644
index 000000000000..a7d46b403e6c
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm
@@ -0,0 +1,42 @@
+/obj/machinery/plumbing/ooze_compressor/proc/return_color_from_string(string)
+ switch(string)
+ if("orange")
+ return "#FFA500"
+ if("purple")
+ return "#B19CD9"
+ if("blue")
+ return "#ADD8E6"
+ if("metal")
+ return "#7E7E7E"
+ if("yellow")
+ return "#FFFF00"
+ if("dark purple")
+ return "#551A8B"
+ if("dark blue")
+ return "#0000FF"
+ if("silver")
+ return "#D3D3D3"
+ if("bluespace")
+ return "#32CD32"
+ if("sepia")
+ return "#704214"
+ if("cerulean")
+ return "#2956B2"
+ if("pyrite")
+ return "#FAFAD2"
+ if("red")
+ return "#FF0000"
+ if("green")
+ return "#00FF00"
+ if("pink")
+ return "#FF69B4"
+ if("gold")
+ return "#FFD700"
+ if("oil")
+ return "#505050"
+ if("black")
+ return "#000000"
+ if("light pink")
+ return "#FFB6C1"
+ if("adamantine")
+ return "#008B8B"
diff --git a/monkestation/code/modules/slimecore/machines/ooze_sucker.dm b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm
new file mode 100644
index 000000000000..216edb7dfdbe
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm
@@ -0,0 +1,130 @@
+///this cannablizes floor_pump code but rips specific reagents and and such just does stuff itself so it can be expanded easier in the future
+
+/obj/machinery/plumbing/ooze_sucker
+ name = "ooze sucker"
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ base_icon_state = "ooze_sucker"
+ icon_state = "ooze_sucker"
+ anchored = FALSE
+ density = FALSE
+ idle_power_usage = 10
+ active_power_usage = 1000
+ buffer = 3000
+ category="Distribution"
+ reagent_flags = NO_REACT
+
+ /// Pump is turned on by engineer, etc.
+ var/turned_on = FALSE
+
+ var/obj/machinery/slime_pen_controller/linked_controller
+ ///if we have this on mapload we will look in a range for a controller
+ var/mapping_id
+
+ /// Floor tile is placed down
+ var/tile_placed = FALSE
+
+ var/processes = 0
+ var/processes_required = 5
+
+ /// Base amount to drain
+ var/drain_flat = 20
+ /// Additional ratio of liquid volume to drain
+ var/drain_percent = 1
+
+/obj/machinery/plumbing/ooze_sucker/Initialize(mapload, bolt, layer)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt, layer)
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/plumbing/ooze_sucker/LateInitialize()
+ . = ..()
+ locate_machinery()
+
+/obj/machinery/plumbing/ooze_sucker/locate_machinery(multitool_connection)
+ if(!mapping_id)
+ return
+ for(var/obj/machinery/slime_pen_controller/main in GLOB.machines)
+ if(main.mapping_id != mapping_id)
+ continue
+ linked_controller = main
+ main.linked_sucker = src
+ return
+
+/obj/machinery/plumbing/ooze_sucker/examine(mob/user)
+ . = ..()
+ . += span_notice("It's currently turned [turned_on ? "ON" : "OFF"].")
+
+
+/obj/machinery/plumbing/ooze_sucker/update_icon_state()
+ . = ..()
+ if(turned_on)
+ icon_state = "[base_icon_state]-on"
+ else
+ icon_state = base_icon_state
+
+/obj/machinery/plumbing/ooze_sucker/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ . = ..()
+ if(. == SUCCESSFUL_UNFASTEN)
+ turned_on = FALSE
+ update_icon_state()
+
+
+/obj/machinery/plumbing/ooze_sucker/proc/toggle_state()
+ turned_on = !turned_on
+ update_appearance()
+
+/obj/machinery/plumbing/ooze_sucker/proc/can_run()
+ return is_operational \
+ && turned_on \
+ && anchored \
+ && !panel_open \
+ && isturf(loc) \
+ && are_reagents_ready()
+
+/obj/machinery/plumbing/ooze_sucker/proc/are_reagents_ready()
+ return reagents.total_volume < reagents.maximum_volume
+
+/obj/machinery/plumbing/ooze_sucker/process(seconds_per_tick)
+ if(!can_run())
+ return
+
+ // Determine what tiles should be pumped. We grab from a 3x3 area,
+ // but overall try to pump the same volume regardless of number of affected tiles
+ var/turf/local_turf = get_turf(src)
+ var/list/turf/candidate_turfs = local_turf.get_atmos_adjacent_turfs(alldir = TRUE)
+ candidate_turfs += local_turf
+
+ var/list/turf/affected_turfs = list()
+
+ for(var/turf/candidate as anything in candidate_turfs)
+ if(isturf(candidate))
+ affected_turfs += candidate
+
+ if(!length(affected_turfs))
+ return
+
+ // note that the length was verified to be > 0 directly above and is a local var.
+ var/multiplier = 1 / length(affected_turfs)
+
+ // We're good, actually pump.
+ for(var/turf/affected_turf as anything in affected_turfs)
+ pump_turf(affected_turf, seconds_per_tick, multiplier)
+
+/obj/machinery/plumbing/ooze_sucker/proc/pump_turf(turf/affected_turf, seconds_per_tick, multiplier)
+ if(processes < processes_required)
+ processes++
+ return
+ processes = 0
+ if(!affected_turf.liquids || !affected_turf.liquids.liquid_group)
+ return
+
+ var/target_value = seconds_per_tick * (drain_flat + (affected_turf.liquids.liquid_group.total_reagent_volume * drain_percent)) * multiplier
+ //Free space handling
+ var/free_space = reagents.maximum_volume - reagents.total_volume
+ if(target_value > free_space)
+ target_value = free_space
+
+ var/datum/liquid_group/targeted_group = affected_turf.liquids.liquid_group
+ if(!targeted_group.reagents_per_turf)
+ return
+ targeted_group.transfer_specific_reagents(reagents, target_value, reagents_to_check = typesof(/datum/reagent/slime_ooze), merge = TRUE)
diff --git a/monkestation/code/modules/slimecore/machines/slime_grinder.dm b/monkestation/code/modules/slimecore/machines/slime_grinder.dm
new file mode 100644
index 000000000000..4cb79b472b19
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_grinder.dm
@@ -0,0 +1,73 @@
+///your an evil person for grinding poor slimes up into ooze
+
+/obj/machinery/plumbing/slime_grinder
+ name = "slime grinder"
+ desc = "An unholy creation, does not grind the slimes quickly."
+
+ icon = 'monkestation/code/modules/slimecore/icons/slime_grinder.dmi'
+ icon_state = "slime_grinder_backdrop"
+ base_icon_state = "slime_grinder_backdrop"
+ idle_power_usage = 10
+ active_power_usage = 1000
+ buffer = 3000
+ category="Distribution"
+
+ var/grind_time = 5 SECONDS
+ ///this is the face you see when you start grinding the poor slime up
+ var/mob/living/basic/slime/poster_boy
+ ///list of all the slimes we have
+ var/list/soon_to_be_crushed = list()
+ ///the amount of souls we have grinded
+ var/trapped_souls = 0
+ ///are we grinding some slimes
+ var/GRINDING_SOME_SLIMES = FALSE
+
+
+/obj/machinery/plumbing/slime_grinder/Initialize(mapload, bolt, layer)
+ . = ..()
+ AddComponent(/datum/component/plumbing/simple_supply, bolt, layer)
+
+/obj/machinery/plumbing/slime_grinder/attack_hand(mob/living/user, list/modifiers)
+ . = ..()
+ if(length(soon_to_be_crushed) && !GRINDING_SOME_SLIMES)
+ Shake(6, 6, 10 SECONDS)
+ GRINDING_SOME_SLIMES = TRUE
+ var/datum/looping_sound/microwave/new_loop = new(src)
+ new_loop.start()
+ machine_do_after_visable(src, 10 SECONDS)
+ GRINDING_SOME_SLIMES = FALSE
+ new_loop.stop()
+ playsound(src, 'sound/machines/blender.ogg', 50, TRUE)
+ grind_slimes()
+
+/obj/machinery/plumbing/slime_grinder/proc/grind_slimes()
+ poster_boy = null
+ update_appearance()
+ for(var/mob/living/basic/slime/slime as anything in soon_to_be_crushed)
+ trapped_souls++
+
+ var/datum/slime_color/current_color = slime.current_color
+ reagents.add_reagent(current_color.secretion_path, 25)
+ soon_to_be_crushed -= slime
+ qdel(slime)
+ soon_to_be_crushed = list()
+
+/obj/machinery/plumbing/slime_grinder/update_overlays()
+ . = ..()
+ if(poster_boy)
+ var/mutable_appearance/slime = poster_boy.appearance
+ . += slime
+ . += mutable_appearance(icon, "slime_grinder_overlay", layer + 0.1, src)
+
+/obj/machinery/plumbing/slime_grinder/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ . = ..()
+ if(isslime(AM))
+ if(!poster_boy)
+ poster_boy = AM
+ poster_boy.layer = layer
+ poster_boy.plane = plane
+ SEND_SIGNAL(AM, COMSIG_EMOTION_STORE, null, EMOTION_SCARED, "I'm trapped inside a blender, I don't want to die!")
+ AM.update_appearance()
+ soon_to_be_crushed |= AM
+ AM.forceMove(src)
+ update_appearance()
diff --git a/monkestation/code/modules/slimecore/machines/slime_market.dm b/monkestation/code/modules/slimecore/machines/slime_market.dm
new file mode 100644
index 000000000000..8e299bec9cda
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_market.dm
@@ -0,0 +1,137 @@
+/obj/machinery/slime_market_pad
+ name = "intergalactic market pad"
+ desc = "A tall device with a hole for inserting slime extracts. IMPs are widely used for trading small items on large distances all over the galaxy."
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "market_pad"
+ base_icon_state = "market_pad"
+ density = TRUE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 10
+ active_power_usage = 2000
+ circuit = /obj/item/circuitboard/machine/slime_market_pad
+ var/obj/machinery/computer/slime_market/console
+
+/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/user, params)
+ if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
+ user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src]."))
+ update_appearance()
+ return TRUE
+
+ if(default_unfasten_wrench(user, I))
+ return TRUE
+
+ if(default_deconstruction_crowbar(I))
+ return TRUE
+
+ . = ..()
+
+/obj/machinery/slime_market_pad/examine(mob/user)
+ . = ..()
+ if(!panel_open)
+ . += span_notice("The panel is screwed in.")
+
+/obj/machinery/slime_market_pad/update_overlays()
+ . = ..()
+ if(panel_open)
+ . += "market_pad-panel"
+
+/obj/machinery/slime_market_pad/Initialize(mapload)
+ . = ..()
+ link_console()
+
+/obj/machinery/slime_market_pad/AltClick(mob/user)
+ . = ..()
+ link_console()
+
+/obj/machinery/slime_market_pad/proc/link_console()
+ if(console)
+ return
+
+ for(var/direction in GLOB.cardinals)
+ console = locate(/obj/machinery/computer/slime_market, get_step(src, direction))
+ if(console)
+ console.link_market_pad()
+ break
+
+/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/living/user, params)
+ . = ..()
+ if(!console)
+ to_chat(user, span_warning("[src] does not have a console linked to it!"))
+ return
+
+ if(istype(I, /obj/item/slime_extract))
+ var/obj/item/slime_extract/extract = I
+ if(extract.tier == 0)
+ to_chat(user, span_warning("[src] doesn't seem to accept this extract!"))
+ return
+ flick("[base_icon_state]_vend", src)
+ sell_extract(extract)
+ return
+
+ else if(istype(I, /obj/item/storage/bag/xeno))
+ if(tgui_alert(user, "Are you sure you want to sell all extracts from [I]?", "<3?", list("Yes", "No")) != "Yes")
+ return
+
+ flick("[base_icon_state]_vend", src)
+ for(var/obj/item/slime_extract/extract in I)
+ if(extract.tier == 0)
+ continue
+ sell_extract(extract)
+ return
+
+/obj/machinery/slime_market_pad/proc/sell_extract(obj/item/slime_extract/extract)
+ SSresearch.xenobio_points += round(SSresearch.slime_core_prices[extract.type])
+
+ var/price_mod = rand(SLIME_SELL_MODIFIER_MIN * 10000, SLIME_SELL_MODIFIER_MAX * 10000) / 10000
+ var/price_limiter = 1 - ((SSresearch.default_core_prices[extract.tier] * SLIME_SELL_MINIMUM_MODIFIER) / SSresearch.slime_core_prices[extract.type])
+ SSresearch.slime_core_prices[extract.type] = (1 + price_mod * price_limiter) * SSresearch.slime_core_prices[extract.type]
+
+ for(var/core_type in SSresearch.slime_core_prices)
+ if(core_type == extract.type)
+ continue
+
+ var/obj/item/slime_extract/core = core_type
+ price_mod = rand(SLIME_SELL_OTHER_MODIFIER_MIN * 100000, SLIME_SELL_OTHER_MODIFIER_MAX * 100000) / 100000
+ price_limiter = 1 - (SSresearch.slime_core_prices[core_type] / (SSresearch.default_core_prices[initial(core.tier)] * SLIME_SELL_MAXIMUM_MODIFIER))
+
+ SSresearch.slime_core_prices[core_type] = (1 + price_mod * price_limiter) * SSresearch.slime_core_prices[core_type]
+ qdel(extract)
+
+/obj/machinery/slime_market_pad/attackby_secondary(obj/item/weapon, mob/user, params)
+ if(!console)
+ to_chat(user, span_warning("[src] does not have a console linked to it!"))
+ return
+
+ if(!console.request_pad)
+ to_chat(user, span_warning("[console] does not have a request_pad linked to it!"))
+ return
+
+ if(!length(console.request_pad.current_requests))
+ to_chat(user, span_warning("There are no current extract requests!"))
+ return
+
+ if(istype(weapon, /obj/item/slime_extract))
+ var/list/radial_choices = list()
+ var/list/choice_to_request = list()
+ var/obj/item/slime_extract/extract = weapon
+ for(var/datum/extract_request_data/current as anything in console.request_pad.current_requests)
+ if((current.extract_path != extract.type) || current.ready_for_pickup)
+ continue
+ radial_choices |= current.radial_data
+ choice_to_request |= list(current.request_name = current)
+
+ if(!length(radial_choices))
+ say("There are no current extract requests that need this extract!")
+ return
+
+ var/choice = show_radial_menu(user, src, radial_choices, require_near = TRUE, tooltips = TRUE)
+ if(!choice_to_request[choice])
+ return
+
+ var/datum/extract_request_data/chosen = choice_to_request[choice]
+ chosen.add_extract()
+
+ flick("[base_icon_state]_vend", src)
+ qdel(extract)
+
+ return
diff --git a/monkestation/code/modules/slimecore/machines/slime_market_computer.dm b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm
new file mode 100644
index 000000000000..3c86eb44af7a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm
@@ -0,0 +1,169 @@
+GLOBAL_DATUM(default_slime_market, /obj/machinery/computer/slime_market)
+
+/obj/machinery/computer/slime_market
+ name = "slime market console"
+ desc = "Used to sell slime cores and manage intergalactic slime bounties."
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ icon_state = "market"
+ icon_screen = "market_screen"
+ icon_keyboard = ""
+ keyboard_change_icon = FALSE
+ light_color = LIGHT_COLOR_LAVENDER
+ circuit = /obj/item/circuitboard/computer/slime_market
+ var/obj/machinery/slime_market_pad/market_pad
+ var/obj/machinery/slime_extract_requestor/request_pad
+ var/stored_credits = 0
+
+ var/static/list/slime_shop_items = list()
+
+/obj/machinery/computer/slime_market/Initialize(mapload, obj/item/circuitboard/C)
+ . = ..()
+ if(!GLOB.default_slime_market && is_station_level(z))
+ GLOB.default_slime_market = src
+
+ link_market_pad()
+
+/obj/machinery/computer/slime_market/Destroy()
+ . = ..()
+ if(GLOB.default_slime_market == src)
+ GLOB.default_slime_market = null
+
+ if(market_pad)
+ market_pad.console = null
+ if(request_pad)
+ request_pad.console = null
+
+ request_pad = null
+ market_pad = null
+
+/obj/machinery/computer/slime_market/proc/link_market_pad()
+ if(market_pad)
+ return
+
+ for(var/direction in GLOB.cardinals)
+ market_pad = locate(/obj/machinery/slime_market_pad, get_step(src, direction))
+ if(market_pad)
+ market_pad.link_console()
+ break
+
+ return market_pad
+
+/obj/machinery/computer/slime_market/attackby(obj/item/weapon, mob/user, params)
+ if(panel_open)
+ if(weapon.tool_behaviour == TOOL_MULTITOOL)
+ if(!multitool_check_buffer(user, weapon))
+ return
+ var/obj/item/multitool/M = weapon
+ if(!M.buffer)
+ return
+ var/obj/machinery/slime_extract_requestor/pad = M.buffer
+ if(!istype(pad))
+ return
+ pad.console = src
+ request_pad = pad
+ to_chat(user, span_notice("You link the [pad] to the [src]."))
+ . = ..()
+
+/obj/machinery/computer/slime_market/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/xenobio_market),
+ )
+
+/obj/machinery/computer/slime_market/ui_interact(mob/user, datum/tgui/ui)
+ . = ..()
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "XenobioMarket", name)
+ ui.open()
+
+/obj/machinery/computer/slime_market/ui_static_data(mob/user)
+ var/list/data = list()
+ if(!length(slime_shop_items))
+ for(var/datum/slime_store_item/subtype as anything in subtypesof(/datum/slime_store_item))
+ slime_shop_items += new subtype
+
+ data["shop_items"] = list()
+ for(var/datum/slime_store_item/listed as anything in slime_shop_items)
+ var/list/shop_item = list()
+ shop_item += list(
+ "name" = listed.name,
+ "desc" = listed.desc,
+ "icon_state" = initial(listed.item_path.icon_state),
+ "cost" = listed.cost,
+ "item_path" = listed.item_path,
+ )
+ data["shop_items"] += list(shop_item)
+ return data
+
+/obj/machinery/computer/slime_market/ui_data()
+ var/data = list()
+ var/list/prices = list()
+ var/list/price_row = list()
+ var/iter = 1
+ for(var/core_type in (subtypesof(/obj/item/slime_extract) - subtypesof(/obj/item/slime_extract/rainbow)))
+ if(iter % 4 == 1)
+ prices.Add(list(list("key" = LAZYLEN(prices), "prices" = price_row.Copy())))
+ price_row = list()
+
+ if(core_type == /obj/item/slime_extract/grey)
+ price_row.Add(list(list("key" = iter % 4)))
+ iter += 1
+
+ var/obj/item/slime_extract/core = core_type
+ var/list/core_data = list("icon" = "[initial(core.icon_state)]",
+ "price" = SSresearch.slime_core_prices[core_type],
+ "key" = iter % 4,
+ )
+ price_row.Add(list(core_data))
+ iter += 1
+
+ if(core_type == /obj/item/slime_extract/grey)
+ core = /obj/item/slime_extract/rainbow
+ var/list/rainbow_core_data = list("icon" = "[initial(core.icon_state)]",
+ "price" = SSresearch.slime_core_prices[/obj/item/slime_extract/rainbow],
+ "key" = iter % 4,
+ )
+ price_row.Add(list(rainbow_core_data))
+ iter += 1
+ price_row.Add(list(list("key" = iter % 4)))
+ iter += 1
+
+ data["points"] = SSresearch.xenobio_points
+ data["prices"] = prices
+ data["requests"] = list()
+ if(request_pad)
+ for(var/datum/extract_request_data/request as anything in request_pad.current_requests)
+ var/list/request_data = list()
+ var/obj/item/request_item = request.extract_path
+ request_data += list(
+ "icon" = initial(request_item.icon_state),
+ "amount" = request.extracts_needed,
+ "name" = request.request_name,
+ "payout" = request.payout,
+ "amount_give" = request.extracts_given,
+ )
+ data["requests"] += list(request_data)
+
+ return data
+
+/obj/machinery/computer/slime_market/ui_act(action, list/params)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("buy")
+ for(var/datum/slime_store_item/item as anything in slime_shop_items)
+ if(text2path(params["path"]) == item.item_path)
+ try_buy(item)
+ return TRUE
+
+/obj/machinery/computer/slime_market/proc/return_extracts(obj/item/slime_extract/type, amount)
+ for(var/i in 1 to amount)
+ new type(loc)
+
+/obj/machinery/computer/slime_market/proc/try_buy(datum/slime_store_item/attempt)
+ if(SSresearch.xenobio_points < attempt.cost)
+ return
+ new attempt.item_path(get_turf(src))
+ SSresearch.xenobio_points -= attempt.cost
diff --git a/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm
new file mode 100644
index 000000000000..7e758bec7dcf
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm
@@ -0,0 +1,188 @@
+/obj/item/wallframe/slime_pen_controller
+ name = "slime pen management frame"
+ desc = "Used for building slime pen consoles."
+ icon_state = "button"
+ result_path = /obj/machinery/slime_pen_controller
+ custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT)
+ pixel_shift = 24
+
+
+/obj/machinery/slime_pen_controller
+ name = "slime pen management console"
+ desc = "It seems most of the features are locked down, the developers must have been pretty lazy. Can turn the ooze sucker on and off though. Can link a sucker to this using a multitool."
+
+ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi'
+ base_icon_state = "slime_panel"
+ icon_state = "slime_panel"
+
+ var/obj/machinery/plumbing/ooze_sucker/linked_sucker
+ var/datum/corral_data/linked_data
+ var/mapping_id
+
+/obj/machinery/slime_pen_controller/Initialize(mapload)
+ . = ..()
+ register_context()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/slime_pen_controller/LateInitialize()
+ . = ..()
+ locate_machinery()
+
+
+/obj/machinery/slime_pen_controller/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+
+ if(linked_sucker)
+ context[SCREENTIP_CONTEXT_RMB] = "Toggle Linked Scrubber"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/machinery/slime_pen_controller/ui_interact(mob/user, datum/tgui/ui)
+ . = ..()
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "SlimePenController", "[src]")
+ ui.open()
+
+/obj/machinery/slime_pen_controller/ui_data(mob/user)
+ . = ..()
+ var/list/data = list()
+ if(!linked_data)
+ data["slimes"] = list()
+ data["corral_upgrades"] = list()
+ data["buyable_upgrades"] = list()
+
+ else
+ data["slimes"] = list()
+ for(var/mob/living/basic/slime/slime as anything in linked_data.managed_slimes)
+ var/list/slime_data = list()
+ slime_data += list(
+ "name" = slime.name,
+ "health" = round((slime.health / slime.maxHealth) * 100),
+ "slime_color" = capitalize(slime.current_color.name),
+ "hunger_precent" = slime.hunger_precent,
+ "mutation_chance" = slime.mutation_chance,
+ "accessory" = slime.worn_accessory ? slime.worn_accessory.name : "None",
+ )
+ slime_data["possible_mutations"] = list()
+ for(var/datum/slime_mutation_data/mutation_data as anything in slime.possible_color_mutations)
+ var/list/mutation_info = list()
+ var/mob_string
+ for(var/mob/living/mob as anything in mutation_data.latch_needed)
+ mob_string += "[mutation_data.latch_needed[mob]] units of genetic data from [initial(mob.name)]. \n"
+ var/item_string
+ for(var/obj/item/item as anything in mutation_data.needed_items)
+ item_string += "[initial(item.name)]. \n"
+
+ mutation_info += list(
+ "color" = capitalize(initial(mutation_data.output.name)),
+ "weight" = mutation_data.weight,
+ "mutate_chance" = mutation_data.mutate_probability,
+ "mobs_needed" = mob_string,
+ "items_needed" = item_string,
+ )
+ slime_data["possible_mutations"] += list(mutation_info)
+
+ slime_data["traits"] = list()
+ for(var/datum/slime_trait/trait as anything in slime.slime_traits)
+ var/list/trait_data = list()
+ trait_data += list(
+ "name" = trait.name,
+ "desc" = trait.desc,
+ "food" = (FOOD_CHANGE in trait.menu_buttons),
+ "environment" = (ENVIRONMENT_CHANGE in trait.menu_buttons),
+ "behaviour" = (BEHAVIOUR_CHANGE in trait.menu_buttons),
+ "danger" = (DANGEROUS_CHANGE in trait.menu_buttons),
+ "docile" = (DOCILE_CHANGE in trait.menu_buttons),
+ )
+ slime_data["traits"] += list(trait_data)
+
+ data["slimes"] += list(slime_data)
+
+ data["corral_upgrades"] = list()
+ for(var/datum/corral_upgrade/upgrade as anything in linked_data.corral_upgrades)
+ data["corral_upgrades"] += list(list(
+ "name" = upgrade.name,
+ "desc" = upgrade.desc,
+ ))
+
+ data["buyable_upgrades"] = list()
+ for(var/datum/corral_upgrade/listed as anything in subtypesof(/datum/corral_upgrade))
+ var/list/upgrade_data = list()
+ upgrade_data += list(
+ "name" = listed.name,
+ "desc" = listed.desc,
+ "cost" = listed.cost,
+ "owned" = (listed in linked_data.corral_upgrades),
+ "path" = listed.type,
+ )
+ data["buyable_upgrades"] += list(upgrade_data)
+
+ data["reagent_amount"] = 0
+ data["reagent_data"] = list()
+ if(linked_sucker)
+ data["reagent_amount"] = linked_sucker.reagents.total_volume
+ data["reagent_data"] = list()
+ for(var/datum/reagent/reagent as anything in linked_sucker.reagents.reagent_list)
+ data["reagent_data"] += list(list(
+ "name" = reagent.name,
+ "amount" = reagent.volume,
+ ))
+
+ return data
+
+/obj/machinery/slime_pen_controller/ui_act(action, list/params)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("buy")
+ for(var/datum/corral_upgrade/item as anything in subtypesof(/datum/corral_upgrade))
+ if(text2path(params["path"]) == item)
+ try_buy(item)
+ return TRUE
+
+/obj/machinery/slime_pen_controller/proc/try_buy(datum/corral_upgrade/item)
+ if(!linked_data)
+ return
+ if(SSresearch.xenobio_points < initial(item.cost))
+ return
+
+ var/datum/corral_upgrade/new_upgrade = new item
+ SSresearch.xenobio_points -= new_upgrade.cost
+ new_upgrade.on_add(linked_data)
+ linked_data.corral_upgrades |= new_upgrade
+
+/obj/machinery/slime_pen_controller/locate_machinery(multitool_connection)
+ if(!mapping_id)
+ return
+ for(var/obj/machinery/plumbing/ooze_sucker/main in GLOB.machines)
+ if(main.mapping_id != mapping_id)
+ continue
+ linked_sucker = main
+ main.linked_controller = src
+ return
+
+/obj/machinery/slime_pen_controller/attack_hand_secondary(mob/user, list/modifiers)
+ if(linked_sucker)
+ visible_message(span_notice("[user] fiddles with the [src] toggling the pens ooze sucker."))
+ linked_sucker.toggle_state()
+ return TRUE
+ . = ..()
+
+/obj/machinery/slime_pen_controller/attackby(obj/item/weapon, mob/user, params)
+ if(weapon.tool_behaviour == TOOL_MULTITOOL)
+ if(!multitool_check_buffer(user, weapon))
+ return
+ var/obj/item/multitool/M = weapon
+ if(!M.buffer)
+ return
+ var/obj/machinery/corral_corner/pad = M.buffer
+ if(!istype(pad))
+ return
+ if(!pad.connected_data)
+ return
+ linked_data = pad.connected_data
+ to_chat(user, span_notice("You link the [pad] to the [src]."))
+ return
+ . = ..()
diff --git a/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm b/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm
new file mode 100644
index 000000000000..8c51a33c63f4
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm
@@ -0,0 +1,5 @@
+/datum/slime_store_item
+ var/name = "Generic Store Item"
+ var/desc = "A generic store item description."
+ var/obj/item/item_path
+ var/cost = 1000
diff --git a/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm b/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm
new file mode 100644
index 000000000000..19130ddef486
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm
@@ -0,0 +1,53 @@
+/datum/slime_store_item/cleaner_mutation
+ name = "Cleaner Slime Mutation Syringe"
+ desc = "Adds the Cleaner Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/cleaner
+ cost = 2500
+
+/datum/slime_store_item/polluter_mutation
+ name = "Polluter Slime Mutation Syringe"
+ desc = "Adds the Polluter Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/polluter
+ cost = 2500
+
+/datum/slime_store_item/cat_mutation
+ name = "Gooey Cat Slime Mutation Syringe"
+ desc = "Adds the Gooey Cat Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/gooey_cat
+ cost = 2500
+
+/datum/slime_store_item/radioactive_mutation
+ name = "Radioactive Slime Mutation Syringe"
+ desc = "Adds the Radioactive Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/radioactive
+ cost = 5000
+
+/datum/slime_store_item/neverchanging_mutation
+ name = "Never Changing Slime Mutation Syringe"
+ desc = "Adds the Never Changing Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/never_evolving
+ cost = 2500
+
+/datum/slime_store_item/noooze_mutation
+ name = "No Ooze Mutation Syringe"
+ desc = "Adds the No Ooze Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/never_ooze
+ cost = 2500
+
+/datum/slime_store_item/random_color_mutator
+ name = "Random Color Mutation Syringe"
+ desc = "Adds the No Ooze Slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe_random
+ cost = 3000
+
+/datum/slime_store_item/soda_slime
+ name = "Soda Slime Mutation Syringe"
+ desc = "Adds the soda slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/soda_slime
+ cost = 3000
+
+/datum/slime_store_item/beer_slime
+ name = "Beer Slime Mutation Syringe"
+ desc = "Adds the beer slime mutation to a single slime."
+ item_path = /obj/item/slime_mutation_syringe/beer_slime
+ cost = 3000
diff --git a/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm b/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm
new file mode 100644
index 000000000000..b0a9a913926a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm
@@ -0,0 +1,5 @@
+/datum/slime_store_item/biomass_vac
+ name = "Slime Vac Biomass Link Upgrade"
+ desc = "A module for the slime vac that lets you link with a biomass recycler."
+ item_path = /obj/item/disk/vacuum_upgrade/biomass
+ cost = 1000
diff --git a/monkestation/code/modules/slimecore/mobs/_base_slime.dm b/monkestation/code/modules/slimecore/mobs/_base_slime.dm
new file mode 100644
index 000000000000..dfbe5d102b8a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/_base_slime.dm
@@ -0,0 +1,467 @@
+/mob/living/basic/slime
+ name = "grey baby slime (123)"
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ icon_state = "grey baby slime"
+ base_icon_state = "grey baby slime"
+ icon_dead = "grey baby slime dead"
+
+ maxHealth = 150
+ health = 150
+
+ ai_controller = /datum/ai_controller/basic_controller/slime
+ density = FALSE
+
+ maximum_survivable_temperature = 2000
+
+ pass_flags = PASSTABLE | PASSGRILLE
+ gender = NEUTER
+ faction = list(FACTION_SLIME)
+
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+
+ //emote_see = list("jiggles", "bounces in place")
+ speak_emote = list("blorbles")
+ bubble_icon = "slime"
+ initial_language_holder = /datum/language_holder/slime
+
+
+ response_help_continuous = "pets"
+ response_help_simple = "pet"
+ attack_verb_continuous = "glomps"
+ attack_verb_simple = "glomp"
+
+ verb_say = "blorbles"
+ verb_ask = "inquisitively blorbles"
+ verb_exclaim = "loudly blorbles"
+ verb_yell = "loudly blorbles"
+
+ can_be_held = TRUE
+
+ minimum_survivable_temperature = 100
+ maximum_survivable_temperature = 600
+
+ // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables
+ // for the sake of cleanliness, though, here they are.
+ status_flags = CANUNCONSCIOUS|CANPUSH
+
+ ///we track flags for slimes here like ADULT_SLIME, and PASSIVE_SLIME
+ var/slime_flags = NONE
+
+ ///our current datum for slime color
+ var/datum/slime_color/current_color = /datum/slime_color/grey
+ ///this is our last cached hunger precentage between 0 and 1
+ var/hunger_precent = 0
+ ///how much hunger we need to produce
+ var/production_precent = 0.6
+ ///our list of slime traits
+ var/list/slime_traits = list()
+ ///used to help our name changes so we don't rename named slimes
+ var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)")
+ ///our number
+ var/number
+
+ ///list of all possible mutations
+ var/list/possible_color_mutations = list()
+
+ var/list/compiled_liked_foods = list()
+ ///this is our list of trait foods
+ var/list/trait_foods = list()
+ ///the in progress mutation used for descs
+ var/datum/slime_color/mutating_into
+ ///this is our mutation chance
+ var/mutation_chance = 30
+
+ var/obj/item/slime_accessory/worn_accessory
+
+ ///this is a list of trees that we replace goes from base = replaced
+ var/list/replacement_trees = list()
+ ///this is our emotion overlay states
+ var/list/emotion_states = list(
+ EMOTION_HAPPY = "aslime-happy",
+ EMOTION_SAD = "aslime-sad",
+ EMOTION_ANGER = "aslime-angry",
+ EMOTION_FUNNY = "aslime-mischevous",
+ EMOTION_SCARED = "aslime-scared",
+ EMOTION_SUPRISED = "aslime-happy",
+ EMOTION_HUNGRY = "aslime-pout",
+ )
+
+ ///if set and with the trait replaces the grey part with this
+ var/icon_state_override
+ var/overwrite_color
+ var/datum/reagent/chemical_injection
+ var/overriding_name_prefix
+
+
+ /// Commands you can give this carp once it is tamed, not static because subtypes can modify it
+ var/friendship_commands = list(
+ /datum/pet_command/idle,
+ /datum/pet_command/free,
+ /datum/pet_command/follow,
+ /datum/pet_command/point_targeting/attack/latch,
+ /datum/pet_command/stop_eating,
+ )
+ ///the amount of ooze we produce
+ var/ooze_production = 10
+
+/mob/living/basic/slime/Initialize(mapload, datum/slime_color/passed_color)
+ . = ..()
+ AddElement(/datum/element/footstep, FOOTSTEP_MOB_SLIME, 0.5, -11)
+ AddElement(/datum/element/soft_landing)
+
+ ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
+ ADD_TRAIT(src, TRAIT_CAREFUL_STEPS, INNATE_TRAIT)
+
+ if(!passed_color)
+ current_color = new current_color
+ else
+ current_color = new passed_color
+ current_color.on_add_to_slime(src)
+
+ AddComponent(/datum/component/obeys_commands, friendship_commands)
+
+ AddComponent(/datum/component/liquid_secretion, current_color.secretion_path, ooze_production, 10 SECONDS, TYPE_PROC_REF(/mob/living/basic/slime, check_secretion))
+ AddComponent(/datum/component/generic_mob_hunger, 400, 0.1, 5 MINUTES, 200)
+ AddComponent(/datum/component/scared_of_item, 5)
+ AddComponent(/datum/component/emotion_buffer, emotion_states)
+ AddComponent(/datum/component/friendship_container, list(FRIENDSHIP_HATED = -100, FRIENDSHIP_DISLIKED = -50, FRIENDSHIP_STRANGER = 0, FRIENDSHIP_NEUTRAL = 10, FRIENDSHIP_ACQUAINTANCES = 25, FRIENDSHIP_FRIEND = 50, FRIENDSHIP_BESTFRIEND = 100), FRIENDSHIP_FRIEND)
+
+ RegisterSignal(src, COMSIG_HUNGER_UPDATED, PROC_REF(hunger_updated))
+ RegisterSignal(src, COMSIG_MOB_OVERATE, PROC_REF(attempt_change))
+
+ for(var/datum/slime_mutation_data/listed as anything in current_color.possible_mutations)
+ var/datum/slime_mutation_data/data = new listed
+ data.on_add_to_slime(src)
+ possible_color_mutations += data
+ if(length(data.needed_items))
+ compiled_liked_foods |= data.needed_items
+
+ update_slime_varience()
+ if(length(compiled_liked_foods))
+ recompile_ai_tree()
+
+
+/mob/living/basic/slime/death(gibbed)
+ . = ..()
+ if(buckled)
+ buckled?.unbuckle_all_mobs()
+
+/mob/living/basic/slime/Destroy()
+ . = ..()
+ for(var/datum/slime_trait/trait as anything in slime_traits)
+ remove_trait(trait)
+ UnregisterSignal(src, COMSIG_HUNGER_UPDATED)
+ UnregisterSignal(src, COMSIG_MOB_OVERATE)
+
+ for(var/datum/slime_mutation_data/mutation as anything in possible_color_mutations)
+ qdel(mutation)
+
+ QDEL_NULL(current_color)
+
+/mob/living/basic/slime/mob_try_pickup(mob/living/user, instant)
+ if(!SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_FRIEND))
+ to_chat(user, span_notice("[src] doesn't trust you enough to let you pick them up"))
+ return FALSE
+ . = ..()
+
+/mob/living/basic/slime/examine(mob/user)
+ . = ..()
+ if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_FRIEND))
+ if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_BESTFRIEND))
+ . += span_notice("You are one of [src]'s best friends!")
+ else
+ . += span_notice("You are one of [src]'s friends")
+
+/mob/living/basic/slime/resolve_right_click_attack(atom/target, list/modifiers)
+ if(GetComponent(/datum/component/latch_feeding))
+ unbuckle_all_mobs()
+ return
+ else if(CanReach(target) && !HAS_TRAIT(target, TRAIT_LATCH_FEEDERED))
+ AddComponent(/datum/component/latch_feeding, target, TOX, 2, 4, FALSE, CALLBACK(src, TYPE_PROC_REF(/mob/living/basic/slime, latch_callback), target))
+ return
+ . = ..()
+
+
+/mob/living/basic/slime/proc/rebuild_foods()
+ compiled_liked_foods |= trait_foods
+
+/mob/living/basic/slime/proc/recompile_ai_tree()
+ var/list/new_planning_subtree = list()
+ rebuild_foods()
+
+ RemoveElement(/datum/element/basic_eating)
+
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/pet_planning)
+
+ if(!HAS_TRAIT(src, TRAIT_SLIME_RABID))
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item)
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/flee_target)
+
+ if(slime_flags & CLEANER_SLIME)
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/cleaning_subtree)
+
+ if(!(slime_flags & PASSIVE_SLIME))
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/simple_find_target_no_trait/slime)
+
+ if(length(compiled_liked_foods))
+ AddElement(/datum/element/basic_eating, food_types = compiled_liked_foods)
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/find_food)
+ ai_controller.override_blackboard_key(BB_BASIC_FOODS, compiled_liked_foods) //since list we override
+
+ new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/basic_melee_attack_subtree/slime)
+
+ ai_controller.replace_planning_subtrees(new_planning_subtree)
+
+/mob/living/basic/slime/proc/add_or_replace_tree(datum/ai_planning_subtree/checker)
+ if(checker in replacement_trees)
+ return replacement_trees[checker]
+ return checker
+
+/mob/living/basic/slime/proc/update_slime_varience()
+ var/prefix = "grey"
+ if(icon_state_override)
+ prefix = icon_state_override
+ else
+ prefix = current_color.icon_prefix
+
+ if(slime_flags & ADULT_SLIME)
+ icon_state = "[prefix] adult slime"
+ icon_dead = "[prefix] baby slime dead"
+ else
+ icon_state = "[prefix] baby slime"
+ icon_dead = "[prefix] baby slime dead"
+
+ if(stat == DEAD)
+ icon_state = icon_dead
+
+ update_name()
+ if(!chemical_injection)
+ SEND_SIGNAL(src, COMSIG_SECRETION_UPDATE, current_color.secretion_path, ooze_production, 10 SECONDS)
+ else
+ SEND_SIGNAL(src, COMSIG_SECRETION_UPDATE, chemical_injection, ooze_production, 10 SECONDS)
+
+/mob/living/basic/slime/update_overlays()
+ . = ..()
+ if(worn_accessory)
+ if(slime_flags & ADULT_SLIME)
+ .+= mutable_appearance(worn_accessory.accessory_icon, "[worn_accessory.accessory_icon_state]-adult", layer + 0.15, src, appearance_flags = (KEEP_APART | RESET_COLOR))
+ else
+ .+= mutable_appearance(worn_accessory.accessory_icon, "[worn_accessory.accessory_icon_state]-baby", layer + 0.15, src, appearance_flags = (KEEP_APART | RESET_COLOR))
+
+/mob/living/basic/slime/proc/check_secretion()
+ if((!(slime_flags & ADULT_SLIME)) || (slime_flags & STORED_SLIME) || (slime_flags & MUTATING_SLIME) || (slime_flags & NOOOZE_SLIME))
+ return FALSE
+ if(stat == DEAD)
+ return FALSE
+ if(hunger_precent < production_precent)
+ return FALSE
+ return TRUE
+
+/mob/living/basic/slime/proc/hunger_updated(datum/source, current_hunger, max_hunger)
+ hunger_precent = current_hunger / max_hunger
+ if(hunger_precent > 0.6)
+ slime_flags |= ADULT_SLIME
+ else
+ slime_flags &= ~ADULT_SLIME
+ update_slime_varience()
+ update_appearance()
+
+/mob/living/basic/slime/proc/add_trait(datum/slime_trait/added_trait)
+ for(var/datum/slime_trait/trait as anything in slime_traits)
+ if(added_trait in trait.incompatible_traits)
+ return FALSE
+
+ var/datum/slime_trait/new_trait = new added_trait
+ new_trait.on_add(src)
+ slime_traits += new_trait
+ return TRUE
+
+///unlike add trait this uses a type and is checked against the list don't pass the created one pass the type
+/mob/living/basic/slime/proc/remove_trait(datum/slime_trait/removed_trait)
+ for(var/datum/slime_trait/trait as anything in slime_traits)
+ if(trait.type != removed_trait)
+ continue
+ slime_traits -= trait
+ qdel(trait)
+ return
+
+///unlike add trait this uses a type and is checked against the list don't pass the created one pass the type
+/mob/living/basic/slime/proc/has_slime_trait(datum/slime_trait/checked_trait)
+ for(var/datum/slime_trait/trait as anything in slime_traits)
+ if(trait.type != checked_trait)
+ continue
+ return TRUE
+ return FALSE
+
+/mob/living/basic/slime/update_name()
+ if(slime_name_regex.Find(name))
+ if(!number)
+ number = rand(1, 1000)
+ if(overriding_name_prefix)
+ name = "[overriding_name_prefix] [current_color.name] [(slime_flags & ADULT_SLIME) ? "adult" : "baby"] slime ([number])"
+ else
+ name = "[current_color.name] [(slime_flags & ADULT_SLIME) ? "adult" : "baby"] slime ([number])"
+ real_name = name
+ return ..()
+
+/mob/living/basic/slime/proc/start_split()
+ ai_controller.set_ai_status(AI_STATUS_OFF)
+ slime_flags |= SPLITTING_SLIME
+
+ visible_message(span_notice("[name] starts to flatten, it looks to be splitting."))
+
+ addtimer(CALLBACK(src, PROC_REF(finish_splitting)), 15 SECONDS)
+
+/mob/living/basic/slime/proc/finish_splitting()
+ SEND_SIGNAL(src, COMSIG_MOB_ADJUST_HUNGER, -200)
+ update_slime_varience()
+
+ slime_flags &= ~SPLITTING_SLIME
+ ai_controller.set_ai_status(AI_STATUS_ON)
+
+ var/mob/living/basic/slime/new_slime = new(loc, current_color.type)
+ new_slime.mutation_chance = mutation_chance
+ for(var/datum/slime_trait/trait as anything in slime_traits)
+ new_slime.add_trait(trait.type)
+
+/mob/living/basic/slime/proc/start_mutating(random = FALSE)
+ if(!pick_mutation(random))
+ return FALSE
+
+ ai_controller.set_ai_status(AI_STATUS_OFF)
+ visible_message(span_notice("[name] starts to undulate, it looks to be mutating."))
+ slime_flags |= MUTATING_SLIME
+
+ ungulate()
+
+
+ addtimer(CALLBACK(src, PROC_REF(finish_mutating)), 30 SECONDS)
+ mutation_chance = 30
+ return TRUE
+
+/mob/living/basic/slime/proc/change_color(datum/slime_color/new_color)
+ var/datum/slime_color/new_slime_color = new new_color
+ QDEL_NULL(current_color)
+ current_color = new_slime_color
+ new_slime_color.on_add_to_slime(src)
+
+ update_slime_varience()
+
+ compiled_liked_foods = list()
+
+ QDEL_LIST(possible_color_mutations)
+ possible_color_mutations = list()
+
+ for(var/datum/slime_mutation_data/listed as anything in current_color.possible_mutations)
+ var/datum/slime_mutation_data/data = new listed
+ data.on_add_to_slime(src)
+ possible_color_mutations += data
+ if(length(data.needed_items))
+ compiled_liked_foods |= data.needed_items
+
+ recompile_ai_tree()
+
+/mob/living/basic/slime/proc/finish_mutating()
+ animate(src) // empty animate to break ungulating
+ if(!mutating_into)
+ return
+ SEND_SIGNAL(src, COMSIG_MOB_ADJUST_HUNGER, -200)
+ change_color(mutating_into)
+
+ slime_flags &= ~MUTATING_SLIME
+ ai_controller.set_ai_status(AI_STATUS_ON)
+
+
+/mob/living/basic/slime/proc/pick_mutation(random = FALSE)
+ mutating_into = null
+ var/list/valid_choices = list()
+ for(var/datum/slime_mutation_data/listed as anything in possible_color_mutations)
+ if(!random && !listed.can_mutate)
+ continue
+ if(random && listed.syringe_blocked)
+ continue
+ valid_choices += listed
+ valid_choices[listed] = listed.weight
+ if(!length(valid_choices))
+ return FALSE
+
+ var/datum/slime_mutation_data/picked = pick_weight(valid_choices)
+ if(!picked)
+ return FALSE
+ mutating_into = picked.output
+ return TRUE
+
+/mob/living/basic/slime/proc/attempt_change(datum/source, hunger_precent)
+ if(slime_flags & NOEVOLVE_SLIME)
+ return
+ if(prob(mutation_chance)) // we try to mutate 30% of the time
+ if(!start_mutating())
+ start_split()
+ else
+ mutation_chance += 10
+ start_split()
+
+/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, params)
+ . = ..()
+ if(!istype(attacking_item, /obj/item/slime_accessory))
+ return
+ worn_accessory = attacking_item
+ attacking_item.forceMove(src)
+ update_appearance()
+
+/mob/living/basic/slime/attack_hand(mob/living/carbon/human/user, list/modifiers)
+ . = ..()
+ if(worn_accessory)
+ visible_message("[user] takes the [worn_accessory] off the [src].")
+ worn_accessory = null
+ worn_accessory.forceMove(get_turf(user))
+ update_appearance()
+
+/mob/living/basic/slime/Life(seconds_per_tick, times_fired)
+ if(isopenturf(loc))
+ var/turf/open/my_our_turf = loc
+ if(my_our_turf.pollution)
+ my_our_turf.pollution.touch_act(src)
+ . = ..()
+
+/mob/living/basic/slime/proc/apply_water()
+ adjustBruteLoss(rand(15,20))
+ if(!client)
+ if(buckled)
+ unbuckle_mob(buckled, TRUE)
+ return
+
+/mob/living/basic/slime/proc/latch_callback(mob/living/target)
+ if(!chemical_injection)
+ return FALSE
+ if(!target.reagents)
+ return FALSE
+ target.reagents.add_reagent(chemical_injection, 3) // guh
+ return TRUE
+
+/mob/living/basic/slime/rainbow
+ current_color = /datum/slime_color/rainbow
+
+/mob/living/basic/slime/random
+
+/mob/living/basic/slime/random/Initialize(mapload, datum/slime_color/passed_color)
+ current_color = pick(subtypesof(/datum/slime_color))
+ . = ..()
+
+/mob/living/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ if(HAS_TRAIT(src, VACPACK_THROW))
+ REMOVE_TRAIT(src, VACPACK_THROW, "vacpack")
+ pass_flags &= ~PASSMOB
+
+/mob/living/basic/slime/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, gentle, quickstart)
+ force = 0
+ . = ..()
+
+/mob/living/basic/slime/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, throwingdatum.thrower, FRIENDSHIP_FRIEND))
+ if(!HAS_TRAIT(hit_atom, TRAIT_LATCH_FEEDERED) && isliving(hit_atom))
+ AddComponent(/datum/component/latch_feeding, hit_atom, TOX, 2, 4, FALSE, CALLBACK(src, PROC_REF(latch_callback), hit_atom), FALSE)
+ visible_message(span_danger("[throwingdatum.thrower] hucks [src] at [hit_atom] causing the [src] to stick to [hit_atom]."))
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm
new file mode 100644
index 000000000000..36172a0bb356
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm
@@ -0,0 +1,42 @@
+/datum/ai_behavior/execute_clean
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH
+
+/datum/ai_behavior/execute_clean/setup(datum/ai_controller/controller, target_key)
+ . = ..()
+ var/turf/target = controller.blackboard[target_key]
+ if(isnull(target))
+ return FALSE
+ set_movement_target(controller, target)
+
+/datum/ai_behavior/execute_clean/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ . = ..()
+ var/mob/living/basic/living_pawn = controller.pawn
+ var/atom/target = controller.blackboard[target_key]
+
+ if(QDELETED(target))
+ finish_action(controller, FALSE, target_key)
+ return
+
+ living_pawn.visible_message(span_notice("[living_pawn] dissolves the [target]."))
+ SEND_SIGNAL(living_pawn, COMSIG_MOB_FEED, target, 20)
+ qdel(target) // Sent to the shadow realm to never be seen again
+ finish_action(controller, TRUE, target_key)
+
+/datum/ai_behavior/execute_clean/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
+ . = ..()
+ var/atom/target = controller.blackboard[target_key]
+ if(QDELETED(target) || is_type_in_typecache(target, controller.blackboard[BB_HUNTABLE_TRASH]))
+ return
+ if(!iscarbon(target))
+ controller.clear_blackboard_key(target_key)
+ return
+ controller.clear_blackboard_key(target_key)
+
+/datum/ai_behavior/find_and_set/in_list/clean_targets
+ action_cooldown = 2 SECONDS
+
+/datum/ai_behavior/find_and_set/in_list/clean_targets/search_tactic(datum/ai_controller/controller, locate_paths, search_range)
+ var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths)
+ if(length(found))
+ return pick(found)
+
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm
new file mode 100644
index 000000000000..9e19ada40e61
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm
@@ -0,0 +1,22 @@
+/datum/ai_behavior/basic_melee_attack/try_latch_feed
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+ terminate_after_action = TRUE
+ melee_attacks = FALSE
+
+/datum/ai_behavior/basic_melee_attack/try_latch_feed/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
+ var/mob/living/basic/basic_mob = controller.pawn
+ if(HAS_TRAIT(basic_mob, TRAIT_FEEDING))
+ return FALSE
+ . = ..()
+
+/datum/ai_behavior/basic_melee_attack/try_latch_feed/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
+ if(SEND_SIGNAL(controller.pawn, COMSIG_FRIENDSHIP_CHECK_LEVEL, controller.blackboard[target_key], FRIENDSHIP_FRIEND))
+ controller.clear_blackboard_key(target_key)
+ else if(succeeded && isliving(controller.blackboard[target_key]))
+ var/atom/target = controller.blackboard[target_key]
+ var/mob/living/basic/slime/basic_mob = controller.pawn
+ if(basic_mob.CanReach(target) && !HAS_TRAIT(target, TRAIT_LATCH_FEEDERED))
+ basic_mob.AddComponent(/datum/component/latch_feeding, target, TOX, 2, 4, FALSE, CALLBACK(basic_mob, TYPE_PROC_REF(/mob/living/basic/slime, latch_callback), target))
+ controller.clear_blackboard_key(target_key)
+ . = ..()
+
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm
new file mode 100644
index 000000000000..4e8fae2271b3
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm
@@ -0,0 +1,82 @@
+/datum/ai_behavior/find_potential_targets_without_trait
+ action_cooldown = 2 SECONDS
+ /// How far can we see stuff?
+ var/vision_range = 9
+ /// Blackboard key for aggro range, uses vision range if not specified
+ var/aggro_range_key = BB_AGGRO_RANGE
+ /// Static typecache list of potentially dangerous objs
+ var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha))
+ ///our max size
+ var/checks_size = FALSE
+
+/datum/ai_behavior/find_potential_targets_without_trait/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, trait)
+ . = ..()
+ var/mob/living/living_mob = controller.pawn
+ var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
+
+ if(!targeting_strategy)
+ CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
+
+ var/atom/current_target = controller.blackboard[target_key]
+ if (targeting_strategy.can_attack(living_mob, current_target, vision_range))
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/aggro_range = controller.blackboard[aggro_range_key] || vision_range
+
+ controller.clear_blackboard_key(target_key)
+ var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide
+
+ for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines?
+ if(can_see(living_mob, HM, aggro_range))
+ potential_targets += HM
+
+ if(!potential_targets.len)
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/list/filtered_targets = list()
+
+ for(var/mob/living/pot_target in potential_targets)
+ if(HAS_TRAIT(pot_target, trait))
+ continue
+
+ if(SEND_SIGNAL(controller.pawn, COMSIG_FRIENDSHIP_CHECK_LEVEL, pot_target, FRIENDSHIP_FRIEND))
+ continue
+
+ if(pot_target.client && controller.blackboard[BB_WONT_TARGET_CLIENTS])
+ continue
+
+ if(checks_size && pot_target.mob_size >= living_mob.mob_size)///hello shitcode department?
+ continue
+
+ if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it?
+ filtered_targets += pot_target
+ continue
+
+ if(!filtered_targets.len)
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/atom/target = pick_final_target(controller, filtered_targets)
+ controller.set_blackboard_key(target_key, target)
+
+ var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target)
+
+ if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
+ controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
+
+ finish_action(controller, succeeded = TRUE)
+
+/datum/ai_behavior/find_potential_targets_without_trait/finish_action(datum/ai_controller/controller, succeeded, ...)
+ . = ..()
+ if (succeeded)
+ controller.CancelActions() // On retarget cancel any further queued actions so that they will setup again with new target
+
+/// Returns the desired final target from the filtered list of targets
+/datum/ai_behavior/find_potential_targets_without_trait/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets)
+ return pick(filtered_targets)
+
+
+/datum/ai_behavior/find_potential_targets_without_trait/smaller
+ checks_size = TRUE
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm
new file mode 100644
index 000000000000..2046f2e14e9d
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm
@@ -0,0 +1,76 @@
+/datum/ai_behavior/find_potential_targets_with_item
+ action_cooldown = 2 SECONDS
+ /// How far can we see stuff?
+ var/vision_range = 9
+ /// Blackboard key for aggro range, uses vision range if not specified
+ var/aggro_range_key = BB_AGGRO_RANGE
+ /// Static typecache list of potentially dangerous objs
+ var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha))
+
+/datum/ai_behavior/find_potential_targets_with_item/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, scared_item_key)
+ . = ..()
+ var/mob/living/living_mob = controller.pawn
+ var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
+ var/obj/item/scared_item_path = controller.blackboard[scared_item_key]
+
+ if(!targeting_strategy)
+ CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
+
+ var/atom/current_target = controller.blackboard[target_key]
+ if (targeting_strategy.can_attack(living_mob, current_target, vision_range))
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/aggro_range = controller.blackboard[aggro_range_key] || vision_range
+
+ controller.clear_blackboard_key(target_key)
+ var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide
+
+ for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines?
+ if(can_see(living_mob, HM, aggro_range))
+ potential_targets += HM
+
+ if(!potential_targets.len)
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/list/filtered_targets = list()
+
+ for(var/atom/pot_target in potential_targets)
+ if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it?
+ if(!ishuman(pot_target))
+ continue
+
+ var/mob/living/carbon/human/human = pot_target
+ for(var/obj/item/item as anything in human.held_items)
+ if(!item)
+ continue
+ if(item.type != scared_item_path)
+ continue
+ filtered_targets += pot_target
+ break
+
+ continue
+
+ if(!filtered_targets.len)
+ finish_action(controller, succeeded = FALSE)
+ return
+
+ var/atom/target = pick_final_target(controller, filtered_targets)
+ controller.set_blackboard_key(target_key, target)
+
+ var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target)
+
+ if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially.
+ controller.set_blackboard_key(hiding_location_key, potential_hiding_location)
+
+ finish_action(controller, succeeded = TRUE)
+
+/datum/ai_behavior/find_potential_targets_with_item/finish_action(datum/ai_controller/controller, succeeded, ...)
+ . = ..()
+ if (succeeded)
+ controller.CancelActions() // On retarget cancel any further queued actions so that they will setup again with new target
+
+/// Returns the desired final target from the filtered list of targets
+/datum/ai_behavior/find_potential_targets_with_item/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets)
+ return pick(filtered_targets)
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm
new file mode 100644
index 000000000000..4967f6a0afaa
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm
@@ -0,0 +1,62 @@
+/datum/ai_behavior/slime_stacker
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+
+/datum/ai_behavior/slime_stacker/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
+ . = ..()
+ if(!controller.blackboard[BB_TARGETING_STRATEGY])
+ CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
+
+ if(controller.pawn.GetComponent(/datum/component/mob_stacker))
+ return FALSE
+
+ if(HAS_TRAIT(controller.pawn, TRAIT_IN_STACK))
+ return FALSE
+ //Hiding location is priority
+ var/atom/real_target
+ var/list/potential_targets = list()
+ for(var/mob/living/basic/slime/target in oview(4, controller.pawn))
+ if(target.GetComponent(/datum/component/latch_feeding))
+ continue
+ if(target.GetComponent(/datum/component/mob_stacker))
+ if(target == controller.pawn)
+ return FALSE
+ if(!SEND_SIGNAL(target, COMSIG_CHECK_CAN_ADD_NEW_STACK))
+ continue
+ real_target = target
+ break
+ if(target == controller.pawn)
+ continue
+
+ if(HAS_TRAIT(target, TRAIT_IN_STACK))
+ continue
+
+ potential_targets += target
+
+ if(!real_target && length(potential_targets))
+ real_target = pick(potential_targets)
+ real_target.AddComponent(/datum/component/mob_stacker)
+
+ if(QDELETED(real_target))
+ return FALSE
+
+ controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, real_target)
+ set_movement_target(controller, real_target)
+
+
+
+/datum/ai_behavior/slime_stacker/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, trait)
+ if (isliving(controller.pawn))
+ var/mob/living/pawn = controller.pawn
+ if (world.time < pawn.next_move)
+ return
+
+ . = ..()
+
+ finish_action(controller, TRUE, BB_BASIC_MOB_CURRENT_TARGET)
+
+/datum/ai_behavior/slime_stacker/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key)
+ . = ..()
+ if(succeeded)
+ var/mob/living/basic/basic_mob = controller.pawn
+ var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
+ SEND_SIGNAL(target, COMSIG_ATOM_JOIN_STACK, basic_mob)
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm
new file mode 100644
index 000000000000..c4b937fbb729
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm
@@ -0,0 +1,21 @@
+/datum/ai_controller/basic_controller/slime
+ blackboard = list(
+ BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
+ BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items,
+ BB_TARGET_MINIMUM_STAT = HARD_CRIT,
+ BB_BASIC_MOB_SCARED_ITEM = /obj/item/extinguisher,
+ BB_BASIC_MOB_STOP_FLEEING = TRUE,
+ BB_WONT_TARGET_CLIENTS = FALSE, //specifically to stop targetting clients
+ )
+
+ ai_movement = /datum/ai_movement/basic_avoidance
+ idle_behavior = /datum/idle_behavior/idle_slime_playful
+ planning_subtrees = list(
+ /datum/ai_planning_subtree/pet_planning,
+ //we try to flee first these flip flop based on flee state which is controlled by a componenet on the mob
+ /datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item,
+ /datum/ai_planning_subtree/flee_target,
+ //now we try to
+ /datum/ai_planning_subtree/simple_find_target_no_trait/slime,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree/slime,
+ )
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm
new file mode 100644
index 000000000000..e1ed36b396c4
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm
@@ -0,0 +1,22 @@
+/datum/idle_behavior/idle_slime_playful
+ ///Chance that the mob random walks per second
+ var/walk_chance = 25
+ ///list of possible play_type
+ var/list/playing_types = list(
+ /datum/ai_behavior/slime_stacker,
+ )
+
+/datum/idle_behavior/idle_slime_playful/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller)
+ . = ..()
+ var/mob/living/living_pawn = controller.pawn
+ if(LAZYLEN(living_pawn.do_afters))
+ return
+
+ if(SPT_PROB(walk_chance, seconds_per_tick) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby)
+ var/move_dir = pick(GLOB.alldirs)
+ living_pawn.Move(get_step(living_pawn, move_dir), move_dir)
+
+ if(prob(3)) //change this as we see fit
+ controller.queue_behavior(pick(playing_types))
+ else if (prob(4))
+ SEND_SIGNAL(controller.pawn, EMOTION_BUFFER_SPEAK_FROM_BUFFER)
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm
new file mode 100644
index 000000000000..4a4ae0f1ea90
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm
@@ -0,0 +1,7 @@
+/datum/ai_planning_subtree/basic_melee_attack_subtree/slime
+ melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/try_latch_feed
+
+/datum/ai_planning_subtree/basic_melee_attack_subtree/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
+ return
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm
new file mode 100644
index 000000000000..f8671b4e1c17
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm
@@ -0,0 +1,17 @@
+
+/datum/ai_planning_subtree/cleaning_subtree
+
+/datum/ai_planning_subtree/cleaning_subtree/SelectBehaviors(datum/ai_controller/basic_controller/controller, seconds_per_tick)
+ if(controller.blackboard_key_exists(BB_CLEAN_TARGET))
+ controller.queue_behavior(/datum/ai_behavior/execute_clean, BB_CLEAN_TARGET)
+ return SUBTREE_RETURN_FINISH_PLANNING
+
+ var/list/final_hunt_list = list()
+
+ final_hunt_list += controller.blackboard[BB_CLEANABLE_DECALS]
+ final_hunt_list += controller.blackboard[BB_CLEANABLE_BLOOD]
+ final_hunt_list += controller.blackboard[BB_HUNTABLE_PESTS]
+ final_hunt_list += controller.blackboard[BB_HUNTABLE_TRASH]
+
+ controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list/clean_targets, BB_CLEAN_TARGET, final_hunt_list)
+
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm
new file mode 100644
index 000000000000..0631be487a80
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm
@@ -0,0 +1,27 @@
+/datum/ai_planning_subtree/simple_find_target_no_trait
+ var/trait = TRAIT_AI_PAUSED
+ var/unique_behavior = FALSE
+
+/datum/ai_planning_subtree/simple_find_target_no_trait/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ if(!unique_behavior)
+ controller.queue_behavior(/datum/ai_behavior/find_potential_targets_without_trait, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, trait)
+
+
+/datum/ai_planning_subtree/simple_find_target_no_trait/slime
+ trait = TRAIT_LATCH_FEEDERED
+
+/datum/ai_planning_subtree/simple_find_target_no_trait/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
+ return
+ . = ..()
+
+/datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat
+ trait = TRAIT_LATCH_FEEDERED
+ unique_behavior = TRUE
+
+/datum/ai_planning_subtree/simple_find_target_no_trait/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
+ return
+ . = ..()
+ controller.queue_behavior(/datum/ai_behavior/find_potential_targets_without_trait/smaller, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, trait)
diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm
new file mode 100644
index 000000000000..031fe175665f
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm
@@ -0,0 +1,9 @@
+/// Find the nearest thing which we assume is hostile and set it as the flee target
+/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item
+
+/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
+ return
+ controller.queue_behavior(/datum/ai_behavior/find_potential_targets_with_item, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, BB_BASIC_MOB_SCARED_ITEM)
+
diff --git a/monkestation/code/modules/slimecore/mobs/feeding_flora.dm b/monkestation/code/modules/slimecore/mobs/feeding_flora.dm
new file mode 100644
index 000000000000..e4fcac709527
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/feeding_flora.dm
@@ -0,0 +1,80 @@
+/mob/living/basic/cockroach/rockroach
+ name = "rockroach"
+ desc = "This cockroach has decided to cosplay as a turtle and is carrying a rock shell on it's back."
+ icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi'
+ icon_state = "rockroach"
+ health = 15
+ maxHealth = 15
+
+/mob/living/basic/cockroach/rockroach/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/squashable, squash_chance = 15, squash_damage = 5)
+ AddElement(/datum/element/death_drops, list(/obj/item/rockroach_shell))
+
+/obj/item/rockroach_shell
+ name = "rockroach shell"
+ desc = "A rocky shell of some poor rockroach."
+ icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi'
+ icon_state = "rockroach_shell"
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 2
+ throw_range = 7
+
+/mob/living/basic/cockroach/iceroach
+ name = "iceroach"
+ desc = "This cockroach has decided to cosplay as a turtle and is carrying some ice shards on it's back."
+ icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi'
+ icon_state = "rockroach"
+ health = 15
+ maxHealth = 15
+
+/mob/living/basic/cockroach/recursive
+ name = "recursive roach"
+ desc = "I swear I've seen this one before but I can't remember where."
+ icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi'
+ icon_state = "rockroach"
+ health = 15
+ maxHealth = 15
+
+/mob/living/basic/xenofauna
+ desc = "Feed these to the slimes!"
+ icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi'
+ ai_controller = /datum/ai_controller/basic_controller/cockroach
+ health = 40
+ maxHealth = 40
+
+/mob/living/basic/xenofauna/diyaab
+ name = "diyaab"
+ icon_state = "diyaab"
+
+/mob/living/basic/xenofauna/lavadog
+ name = "lava dog"
+ icon_state = "lavadog"
+
+/mob/living/basic/xenofauna/dron
+ name = "semi-organic bug"
+ icon_state = "dron"
+
+/mob/living/basic/xenofauna/greeblefly
+ name = "greeblefly"
+ icon_state = "greeblefly"
+
+/mob/living/basic/xenofauna/possum
+ name = "possum"
+ icon_state = "possum"
+
+/mob/living/basic/xenofauna/thoom
+ name = "thoom"
+ icon_state = "thoom"
+
+/mob/living/basic/xenofauna/meatbeast
+ name = "meat beast"
+ icon_state = "meatbeast"
+
+/mob/living/basic/xenofauna/thinbug
+ name = "thin bug"
+ icon_state = "thinbug"
+
+/mob/living/basic/xenofauna/voxslug
+ name = "strange slug"
+ icon_state = "voxslug"
diff --git a/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm b/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm
new file mode 100644
index 000000000000..e55cf3912b66
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm
@@ -0,0 +1,2 @@
+/datum/pet_command/point_targeting/attack/latch
+ attack_behaviour = /datum/ai_behavior/basic_melee_attack/try_latch_feed
diff --git a/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm b/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm
new file mode 100644
index 000000000000..d93bc55ff5d4
--- /dev/null
+++ b/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm
@@ -0,0 +1,13 @@
+/datum/pet_command/stop_eating
+ command_name = "Stop Eating"
+ command_desc = "Command your pet to stop eating."
+ radial_icon = 'icons/testing/turf_analysis.dmi'
+ radial_icon_state = "red_arrow"
+ speech_commands = list("stop eating", "get off")
+
+/datum/pet_command/stop_eating/execute_action(datum/ai_controller/controller)
+ var/mob/living/mob = controller.pawn
+ if(mob.buckled)
+ mob.buckled.unbuckle_mob(mob, force=TRUE)
+
+ return SUBTREE_RETURN_FINISH_PLANNING
diff --git a/monkestation/code/modules/slimecore/readme.md b/monkestation/code/modules/slimecore/readme.md
new file mode 100644
index 000000000000..2e6bb87e4c0a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/readme.md
@@ -0,0 +1,36 @@
+## Title:
+
+
+MODULE ID: SLIMECORE
+
+### Description:
+
+This PR trys to rework slimes into the cool little blobs they always should have been.
+
+
+
+
+### TG Proc/File Changes:
+
+
+ - N/A
+
+### Defines:
+
+
+
+### Master file additions
+
+
+
+
+### Included files that are not contained in this module:
+
+- N/A
+
+
+### Credits:
+
+
+
+Made by Dwasint
diff --git a/monkestation/code/modules/slimecore/reagents/_base_reagent.dm b/monkestation/code/modules/slimecore/reagents/_base_reagent.dm
new file mode 100644
index 000000000000..a0c1b691692c
--- /dev/null
+++ b/monkestation/code/modules/slimecore/reagents/_base_reagent.dm
@@ -0,0 +1,12 @@
+/datum/reagent/slime_ooze
+ name = "Generic Slime Ooze"
+ evaporation_rate = 0.01
+ opacity = 225
+ slippery = FALSE
+ var/obj/item/slime_extract/extract_path
+
+/datum/reagent/proc/add_to_member(obj/effect/abstract/liquid_turf/adder)
+ return
+
+/datum/reagent/proc/remove_from_member(obj/effect/abstract/liquid_turf/remover)
+ return
diff --git a/monkestation/code/modules/slimecore/reagents/base_colors.dm b/monkestation/code/modules/slimecore/reagents/base_colors.dm
new file mode 100644
index 000000000000..37a526ed01b0
--- /dev/null
+++ b/monkestation/code/modules/slimecore/reagents/base_colors.dm
@@ -0,0 +1,116 @@
+
+/datum/reagent/slime_ooze/grey
+ name = "Grey Slime Ooze"
+ color = COLOR_GRAY
+ extract_path = /obj/item/slime_extract/grey
+
+/datum/reagent/slime_ooze/blue
+ name = "Light Blue Slime Ooze"
+ color = COLOR_CARP_LIGHT_BLUE
+ extract_path = /obj/item/slime_extract/blue
+
+/datum/reagent/slime_ooze/darkblue
+ name = "Dark Blue Slime Ooze"
+ color = COLOR_BLUE
+ extract_path = /obj/item/slime_extract/darkblue
+
+/datum/reagent/slime_ooze/green
+ name = "Green Slime Ooze"
+ color = "#D6F264"
+ extract_path = /obj/item/slime_extract/green
+
+/datum/reagent/slime_ooze/metal
+ name = "Metal Slime Ooze"
+ color = "#6D758D"
+ extract_path = /obj/item/slime_extract/metal
+
+/datum/reagent/slime_ooze/purple
+ name = "Purple Slime Ooze"
+ color = "#BC4A9B"
+ extract_path = /obj/item/slime_extract/purple
+
+/datum/reagent/slime_ooze/orange
+ name = "Orange Slime Ooze"
+ color = "#FA6A0A"
+ extract_path = /obj/item/slime_extract/orange
+
+/datum/reagent/slime_ooze/pink
+ name = "Pink Slime Ooze"
+ color = "#F5A097"
+ extract_path = /obj/item/slime_extract/pink
+
+/datum/reagent/slime_ooze/darkpurple
+ name = "Dark Purple Slime Ooze"
+ color = "#793A80"
+ extract_path = /obj/item/slime_extract/darkpurple
+
+/datum/reagent/slime_ooze/red
+ name = "Red Slime Ooze"
+ color = "#B4202A"
+ extract_path = /obj/item/slime_extract/red
+
+/datum/reagent/slime_ooze/yellow
+ name = "Yellow Slime Ooze"
+ color = "#F9A31B"
+ extract_path = /obj/item/slime_extract/yellow
+
+/datum/reagent/slime_ooze/gold
+ name = "Gold Slime Ooze"
+ color = "#BB7547"
+ extract_path = /obj/item/slime_extract/gold
+
+/datum/reagent/slime_ooze/silver
+ name = "Silver Slime Ooze"
+ color = "#8B93AF"
+ extract_path = /obj/item/slime_extract/silver
+
+/datum/reagent/slime_ooze/lightpink
+ name = "Light Pink Slime Ooze"
+ color = "#E9B5A3"
+ extract_path = /obj/item/slime_extract/lightpink
+
+/datum/reagent/slime_ooze/black
+ name = "Black Slime Ooze"
+ color = "#333941"
+ extract_path = /obj/item/slime_extract/black
+
+/datum/reagent/slime_ooze/rainbow
+ name = "Rainbow Slime Ooze"
+ color = "#ffffff"
+ extract_path = /obj/item/slime_extract/rainbow
+
+/datum/reagent/slime_ooze/rainbow/add_to_member(obj/effect/abstract/liquid_turf/adder)
+ adder.rainbow_effect()
+
+/datum/reagent/slime_ooze/rainbow/remove_from_member(obj/effect/abstract/liquid_turf/remover)
+ remover.remove_rainbow_effect()
+
+/datum/reagent/slime_ooze/oil
+ name = "Oil Slime Ooze"
+ color = "#242234"
+ extract_path = /obj/item/slime_extract/oil
+
+/datum/reagent/slime_ooze/adamantine
+ name = "Adamantine Slime Ooze"
+ color = "#5DAF8D"
+ extract_path = /obj/item/slime_extract/adamantine
+
+/datum/reagent/slime_ooze/bluespace
+ name = "Bluespace Slime Ooze"
+ color = "#C0E4FD"
+ extract_path = /obj/item/slime_extract/bluespace
+
+/datum/reagent/slime_ooze/pyrite
+ name = "Pyrite Slime Ooze"
+ color = "#FFD541"
+ extract_path = /obj/item/slime_extract/pyrite
+
+/datum/reagent/slime_ooze/sepia
+ name = "Sepia Slime Ooze"
+ color = "#A08662"
+ extract_path = /obj/item/slime_extract/sepia
+
+/datum/reagent/slime_ooze/cerulean
+ name = "Cerulean Slime Ooze"
+ color = "#285CC4"
+ extract_path = /obj/item/slime_extract/cerulean
diff --git a/monkestation/code/modules/slimecore/research_and_recipes.dm b/monkestation/code/modules/slimecore/research_and_recipes.dm
new file mode 100644
index 000000000000..1063300564be
--- /dev/null
+++ b/monkestation/code/modules/slimecore/research_and_recipes.dm
@@ -0,0 +1,102 @@
+/obj/item/circuitboard/machine/biomass_recycler
+ name = "Biomass Recycler (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/biomass_recycler
+ req_components = list(
+ /datum/stock_part/matter_bin = 3,
+ /datum/stock_part/manipulator = 2)
+ needs_anchored = FALSE
+
+/obj/item/circuitboard/machine/corral_corner
+ name = "Corral Corner (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/corral_corner
+ req_components = list(
+ /datum/stock_part/matter_bin = 1,
+ /datum/stock_part/manipulator = 1)
+ needs_anchored = TRUE
+
+/obj/item/circuitboard/machine/slime_extract_requestor
+ name = "Extract Request Pad (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/slime_extract_requestor
+ req_components = list(
+ /datum/stock_part/manipulator = 2,
+ /obj/item/stack/sheet/glass = 1)
+ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
+
+/obj/item/circuitboard/computer/slime_market
+ name = "Slime Market (Computer Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/computer/slime_market
+
+/obj/item/circuitboard/machine/slime_market_pad
+ name = "Intergalactic Market Pad (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/slime_market_pad
+ req_components = list(
+ /datum/stock_part/manipulator = 2,
+ /obj/item/stack/sheet/glass = 1)
+ def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial)
+
+
+/datum/design/slimevac
+ name = "Slime Vacuum"
+ id = "slimevac"
+ build_type = PROTOLATHE | AWAY_LATHE
+ materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.5)
+ build_path = /obj/item/vacuum_pack
+ category = list(
+ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/board/slime_market_pad
+ name = "Slime Market Pad Board"
+ desc = "The circuit board for a slime market pad."
+ id = "slime_market_pad"
+ build_path = /obj/item/circuitboard/machine/slime_market_pad
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/board/slime_market
+ name = "Slime Market Computer Board"
+ desc = "The circuit board for a slime market computer."
+ id = "slime_market"
+ build_path = /obj/item/circuitboard/computer/slime_market
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/board/slime_extract_requestor
+ name = "Slime Extract Requestor Board"
+ desc = "The circuit board for a slime extract requestor."
+ id = "slime_extract_requestor"
+ build_path = /obj/item/circuitboard/machine/slime_extract_requestor
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/board/corral_corner
+ name = "Corral Corner Board"
+ desc = "The circuit board for a corral corner piece."
+ id = "corral_corner"
+ build_path = /obj/item/circuitboard/machine/corral_corner
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
+
+/datum/design/board/biomass_recycler
+ name = "Biomass Recycler Board"
+ desc = "The circuit board for a biomass recycler."
+ id = "biomass_recycler"
+ build_path = /obj/item/circuitboard/machine/biomass_recycler
+ category = list(
+ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_SCIENCE
diff --git a/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm b/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm
new file mode 100644
index 000000000000..6dd3f44115a7
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm
@@ -0,0 +1,12 @@
+/obj/item/slime_accessory
+ name = "Generic Accessory"
+ desc = "Can be worn by a slime."
+
+ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ icon_state = "witch_hat"
+
+ var/accessory_icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ var/accessory_icon_state = "witch_hat"
+
+/obj/item/slime_accessory/witch_hat
+ name = "Slime Witch Hat"
diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm b/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm
new file mode 100644
index 000000000000..341224e91b69
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm
@@ -0,0 +1,25 @@
+GLOBAL_LIST_INIT(unlocked_slime_colors, list())
+
+/datum/slime_color
+ ///the name of the slime color
+ var/name = "Generic Color"
+ ///this is appended to the icon_states of the slime
+ var/icon_prefix = "grey"
+ ///secretion path
+ var/secretion_path = /datum/reagent/slime_ooze/grey
+ ///our slimes true color
+ var/slime_color = "#FFFFFF"
+ ///list of possible mutations from this color
+ var/list/possible_mutations = list()
+
+/datum/slime_color/proc/on_add_to_slime(mob/living/basic/slime/slime)
+ return
+
+/datum/slime_color/New()
+ . = ..()
+ if(!(type in GLOB.unlocked_slime_colors))
+ on_first_unlock()
+ GLOB.unlocked_slime_colors |= type
+
+/datum/slime_color/proc/on_first_unlock()
+ return
diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm b/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm
new file mode 100644
index 000000000000..97c9f1e167d2
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm
@@ -0,0 +1,238 @@
+/datum/slime_color/grey
+ name = "grey"
+ icon_prefix = "grey"
+ secretion_path = /datum/reagent/slime_ooze/grey
+ slime_color = "#FFFFFF" // I know this is white its because the base colors are greyed
+ possible_mutations = list(
+ /datum/slime_mutation_data/metal,
+ /datum/slime_mutation_data/orange,
+ /datum/slime_mutation_data/purple,
+ /datum/slime_mutation_data/blue,
+ )
+
+/datum/slime_color/grey/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1)
+
+/datum/slime_color/blue
+ name = "blue"
+ icon_prefix = "blue"
+ secretion_path = /datum/reagent/slime_ooze/blue
+ slime_color = "#25F8E6"
+ possible_mutations = list(
+ /datum/slime_mutation_data/silver,
+ /datum/slime_mutation_data/dark_blue,
+ /datum/slime_mutation_data/pink,
+ )
+
+/datum/slime_color/blue/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/meatbeast = 2)
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/diyaab = 1)
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/thinbug = 1)
+
+/datum/slime_color/dark_blue
+ name = "dark blue"
+ icon_prefix = "dark blue"
+ secretion_path = /datum/reagent/slime_ooze/darkblue
+ slime_color = "#3375F9"
+ possible_mutations = list(
+ /datum/slime_mutation_data/blue,
+ /datum/slime_mutation_data/purple,
+ /datum/slime_mutation_data/cerulean,
+ )
+
+
+/datum/slime_color/dark_blue/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1)
+ GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/recursive = 1)
+
+/datum/slime_color/green
+ name = "green"
+ icon_prefix = "green"
+ secretion_path = /datum/reagent/slime_ooze/green
+ slime_color = "#D6F264"
+ possible_mutations = list(
+ /datum/slime_mutation_data/black,
+ )
+
+/datum/slime_color/green/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/thoom = 2)
+
+/datum/slime_color/metal
+ name = "metal"
+ icon_prefix = "metal"
+ secretion_path = /datum/reagent/slime_ooze/metal
+ slime_color = "#6D758D"
+ possible_mutations = list(
+ /datum/slime_mutation_data/silver,
+ /datum/slime_mutation_data/yellow,
+ /datum/slime_mutation_data/gold,
+ )
+
+/datum/slime_color/metal/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/meatbeast = 2)
+
+/datum/slime_color/purple
+ name = "purple"
+ icon_prefix = "purple"
+ secretion_path = /datum/reagent/slime_ooze/purple
+ slime_color = "#BC4A9B"
+ possible_mutations = list(
+ /datum/slime_mutation_data/green,
+ /datum/slime_mutation_data/dark_blue,
+ /datum/slime_mutation_data/darkpurple,
+ )
+
+/datum/slime_color/purple/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/greeblefly = 2)
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/diyaab = 1)
+
+/datum/slime_color/orange
+ name = "orange"
+ icon_prefix = "orange"
+ secretion_path = /datum/reagent/slime_ooze/orange
+ slime_color = "#FA6A0A"
+ possible_mutations = list(
+ /datum/slime_mutation_data/darkpurple,
+ /datum/slime_mutation_data/yellow,
+ /datum/slime_mutation_data/red,
+ )
+
+/datum/slime_color/orange/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/lavadog = 1)
+
+/datum/slime_color/pink
+ name = "pink"
+ icon_prefix = "pink"
+ secretion_path = /datum/reagent/slime_ooze/pink
+ slime_color = "#F5A097"
+ possible_mutations = list(
+ /datum/slime_mutation_data/lightpink,
+ )
+
+/datum/slime_color/pink/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/voxslug = 1)
+
+/datum/slime_color/darkpurple
+ name = "dark purple"
+ icon_prefix = "dark purple"
+ secretion_path = /datum/reagent/slime_ooze/darkpurple
+ slime_color = "#793A80"
+ possible_mutations = list(
+ /datum/slime_mutation_data/sepia,
+ /datum/slime_mutation_data/purple,
+ /datum/slime_mutation_data/orange,
+ )
+
+/datum/slime_color/darkpurple/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/possum = 1)
+
+/datum/slime_color/red
+ name = "red"
+ icon_prefix = "red"
+ secretion_path = /datum/reagent/slime_ooze/red
+ slime_color = "#B4202A"
+ possible_mutations = list(
+ /datum/slime_mutation_data/oil,
+ )
+
+/datum/slime_color/darkpurple/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/dron = 1)
+
+/datum/slime_color/yellow
+ name = "yellow"
+ icon_prefix = "yellow"
+ secretion_path = /datum/reagent/slime_ooze/yellow
+ slime_color = "#F9A31B"
+ possible_mutations = list(
+ /datum/slime_mutation_data/bluespace,
+ /datum/slime_mutation_data/metal,
+ /datum/slime_mutation_data/orange,
+ )
+
+/datum/slime_color/gold
+ name = "gold"
+ icon_prefix = "gold"
+ secretion_path = /datum/reagent/slime_ooze/gold
+ slime_color = "#BB7547"
+ possible_mutations = list(
+ /datum/slime_mutation_data/adamantine,
+ )
+
+/datum/slime_color/silver
+ name = "silver"
+ icon_prefix = "silver"
+ secretion_path = /datum/reagent/slime_ooze/silver
+ slime_color = "#8B93AF"
+ possible_mutations = list(
+ /datum/slime_mutation_data/pyrite,
+ /datum/slime_mutation_data/metal,
+ /datum/slime_mutation_data/blue,
+ )
+
+/datum/slime_color/silver/on_first_unlock()
+ GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1)
+
+/datum/slime_color/lightpink
+ name = "light pink"
+ icon_prefix = "light pink"
+ secretion_path = /datum/reagent/slime_ooze/lightpink
+ slime_color = "#E9B5A3"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/black
+ name = "black"
+ icon_prefix = "black"
+ secretion_path = /datum/reagent/slime_ooze/black
+ slime_color = "#333941"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/rainbow
+ name = "rainbow"
+ icon_prefix = "rainbow"
+ secretion_path = /datum/reagent/slime_ooze/rainbow
+ slime_color = "#FFFFFF"
+
+/datum/slime_color/rainbow/on_add_to_slime(mob/living/basic/slime/slime)
+ slime.rainbow_effect()
+
+/datum/slime_color/oil
+ name = "oil"
+ icon_prefix = "oil"
+ secretion_path = /datum/reagent/slime_ooze/oil
+ slime_color = "#242234"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/sepia
+ name = "sepia"
+ icon_prefix = "sepia"
+ secretion_path = /datum/reagent/slime_ooze/sepia
+ slime_color = "#A08662"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/adamantine
+ name = "adamantine"
+ icon_prefix = "adamantine"
+ secretion_path = /datum/reagent/slime_ooze/adamantine
+ slime_color = "#5DAF8D"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/bluespace
+ name = "bluespace"
+ icon_prefix = "bluespace"
+ secretion_path = /datum/reagent/slime_ooze/bluespace
+ slime_color = "#C0E4FD"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/pyrite
+ name = "pyrite"
+ icon_prefix = "pyrite"
+ secretion_path = /datum/reagent/slime_ooze/pyrite
+ slime_color = "#FFD541"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
+
+/datum/slime_color/cerulean
+ name = "cerulean"
+ icon_prefix = "cerulean"
+ secretion_path = /datum/reagent/slime_ooze/cerulean
+ slime_color = "#285CC4"
+ possible_mutations = list(/datum/slime_mutation_data/rainbow)
diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm
new file mode 100644
index 000000000000..0d26407b2584
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm
@@ -0,0 +1,59 @@
+/datum/slime_mutation_data
+ var/mob/living/basic/slime/host
+ ///mutation weight
+ var/weight = 10
+ ///our probability of being mutated after weight
+ var/mutate_probability = 100
+ ///are we blocked from color mutation syringes
+ var/syringe_blocked = FALSE
+ ///can we mutate
+ var/can_mutate = FALSE
+ ///The slime mutation we pass on if we succeed
+ var/datum/slime_color/output
+ ///Items to feed the slime in order to mutate
+ var/list/needed_items = list()
+ ///the liquids we need to consume in order to mutate
+ var/list/needed_reagents = list()
+ ///the mobs needed to be latch fed in order to mutate - stored in type = amount
+ var/list/latch_needed = list()
+
+/datum/slime_mutation_data/Destroy(force, ...)
+ . = ..()
+ host = null
+
+/datum/slime_mutation_data/proc/on_add_to_slime(mob/living/basic/slime/host)
+ src.host = host
+ if(length(needed_items))
+ RegisterSignal(host, COMSIG_LIVING_ATE, PROC_REF(check_ate))
+
+ /*
+ if(length(needed_reagents))
+ */
+
+ if(length(latch_needed))
+ RegisterSignal(host, COMSIG_MOB_FEED, PROC_REF(check_latch))
+
+/datum/slime_mutation_data/proc/recheck_mutation()
+ if(length(latch_needed) || length(needed_reagents) || length(needed_items))
+ return
+ can_mutate = TRUE
+ UnregisterSignal(host, COMSIG_LIVING_ATE)
+ UnregisterSignal(host, COMSIG_MOB_FEED)
+
+/datum/slime_mutation_data/proc/check_latch(datum/source, mob/living/target, amount)
+ if(!(target.type in latch_needed))
+ return
+
+ latch_needed[target.type] -= amount
+ if(latch_needed[target.type] <= 0)
+ latch_needed -= target.type
+ recheck_mutation()
+
+/datum/slime_mutation_data/proc/check_ate(datum/source, atom/target)
+ for(var/item in needed_items)
+ if(!istype(target, item))
+ continue
+ needed_items -= item
+
+ recheck_mutation()
+
diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm
new file mode 100644
index 000000000000..e090430f7645
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm
@@ -0,0 +1,93 @@
+/datum/slime_mutation_data/metal
+ output = /datum/slime_color/metal
+ needed_items = list(/obj/item/stack/sheet/iron)
+
+/datum/slime_mutation_data/orange
+ output = /datum/slime_color/orange
+ needed_items = list(/obj/item/stack/sheet/mineral/plasma)
+
+/datum/slime_mutation_data/purple
+ output = /datum/slime_color/purple
+ needed_items = list(/obj/item/stack/medical/gauze)
+
+/datum/slime_mutation_data/blue
+ output = /datum/slime_color/blue
+ latch_needed = list(/mob/living/basic/cockroach/iceroach = 50)
+
+/datum/slime_mutation_data/cerulean
+ output = /datum/slime_color/cerulean
+ latch_needed = list(/mob/living/basic/cockroach/recursive = 40)
+
+/datum/slime_mutation_data/dark_blue
+ output = /datum/slime_color/dark_blue
+ latch_needed = list(/mob/living/basic/xenofauna/diyaab = 75)
+
+/datum/slime_mutation_data/red
+ output = /datum/slime_color/red
+ latch_needed = list(/mob/living/basic/xenofauna/lavadog = 50)
+
+/datum/slime_mutation_data/oil
+ output = /datum/slime_color/oil
+ latch_needed = list(/mob/living/basic/xenofauna/dron = 65)
+
+/datum/slime_mutation_data/yellow
+ output = /datum/slime_color/yellow
+ needed_items = list(/obj/item/stock_parts/cell)
+
+/datum/slime_mutation_data/green
+ output = /datum/slime_color/green
+ latch_needed = list(/mob/living/basic/xenofauna/greeblefly = 65)
+
+/datum/slime_mutation_data/sepia
+ output = /datum/slime_color/sepia
+ latch_needed = list(/mob/living/basic/xenofauna/possum = 65)
+
+/datum/slime_mutation_data/black
+ output = /datum/slime_color/black
+ latch_needed = list(/mob/living/basic/xenofauna/thoom = 50)
+
+/datum/slime_mutation_data/silver
+ output = /datum/slime_color/silver
+ latch_needed = list(/mob/living/basic/xenofauna/meatbeast = 80)
+
+/datum/slime_mutation_data/gold
+ output = /datum/slime_color/gold
+ needed_items = list(/obj/item/stack/sheet/mineral/gold)
+
+/datum/slime_mutation_data/adamantine
+ output = /datum/slime_color/adamantine
+ needed_items = list(/obj/item/rockroach_shell)
+
+/datum/slime_mutation_data/darkpurple
+ output = /datum/slime_color/darkpurple
+ needed_items = list(/obj/item/slime_extract/purple)
+
+/datum/slime_mutation_data/pink
+ output = /datum/slime_color/pink
+ latch_needed = list(/mob/living/basic/xenofauna/thinbug = 80)
+
+/datum/slime_mutation_data/pyrite
+ output = /datum/slime_color/pyrite
+ needed_items = list(/obj/item/toy/crayon/rainbow)
+
+/datum/slime_mutation_data/bluespace
+ output = /datum/slime_color/bluespace
+ needed_items = list(/obj/item/stack/ore/bluespace_crystal)
+
+/datum/slime_mutation_data/lightpink
+ output = /datum/slime_color/lightpink
+ latch_needed = list(/mob/living/basic/xenofauna/voxslug = 80)
+
+/datum/slime_mutation_data/rainbow
+ output = /datum/slime_color/rainbow
+ needed_items = list(
+ /obj/item/slime_extract/orange = 1,
+ /obj/item/slime_extract/purple = 1,
+ /obj/item/slime_extract/blue = 1,
+ /obj/item/slime_extract/metal = 1,
+ /obj/item/slime_extract/yellow = 1,
+ /obj/item/slime_extract/darkblue = 1,
+ /obj/item/slime_extract/darkpurple = 1,
+ /obj/item/slime_extract/silver = 1,
+ )
+ syringe_blocked = TRUE
diff --git a/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm b/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm
new file mode 100644
index 000000000000..ff7b5d45e980
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm
@@ -0,0 +1,57 @@
+/datum/slime_trait
+ var/name = "Base Trait"
+ var/desc = "You shouldn't see this, this means someone forgot to set a trait desc or your seeing the base trait."
+
+ //flags this trait has like TRAIT_PROCESS, TRAIT_ON_DEATH, TRAIT_ON_LIFE, etc
+ var/trait_flags = NONE
+
+ ///what buttons do we show in the trait menu ie FOOD_CHANGE, ENVIRONMENT_CHANGE
+ var/list/menu_buttons = list()
+
+ ///this is type paths of traits don't work together
+ var/list/incompatible_traits = list()
+
+ ///our host slime
+ var/mob/living/basic/slime/host
+
+/datum/slime_trait/proc/on_add(mob/living/basic/slime/parent)
+ if(!parent)
+ return
+ host = parent
+ if(trait_flags & TRAIT_ON_DEATH)
+ RegisterSignal(host, COMSIG_LIVING_DEATH, PROC_REF(on_death))
+ if(trait_flags & TRAIT_VISUAL)
+ RegisterSignal(host, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_overlays))
+ host.update_overlays()
+
+/datum/slime_trait/proc/on_remove(mob/living/basic/slime/parent)
+ return
+
+/datum/slime_trait/proc/on_death()
+ return
+
+/datum/slime_trait/proc/apply_overlays(obj/item/source, list/overlays)
+ return
+
+
+/datum/slime_trait/visual
+
+ trait_flags = (TRAIT_VISUAL)
+ //the visual icon_state of the trait
+ var/trait_icon_state
+ ///the icon path of the trait
+ var/trait_icon
+
+
+/datum/slime_trait/visual/apply_overlays(obj/item/source, list/overlays)
+ if(!trait_icon || !trait_icon_state)
+ return
+
+ var/mutable_appearance/slime_visual = mutable_appearance(trait_icon, trait_icon_state, host.layer, host, host.plane)
+
+ if(!host.overwrite_color)
+ slime_visual.color = host.current_color.slime_color
+ else
+ slime_visual.color = host.overwrite_color
+
+ overlays += slime_visual
diff --git a/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm b/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm
new file mode 100644
index 000000000000..c47630c4a6c1
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm
@@ -0,0 +1,17 @@
+/datum/slime_trait/beer_slime
+ name = "Beer Slime"
+ desc = "Modifies their genomes to allow them to produce beer instead of ooze"
+ menu_buttons = list(BEHAVIOUR_CHANGE)
+
+/datum/slime_trait/beer_slime/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ var/datum/reagent/reagent = pick(typesof(/datum/reagent/consumable/ethanol))
+ parent.chemical_injection = reagent
+ parent.overriding_name_prefix = initial(reagent.name)
+ parent.update_slime_varience()
+
+/datum/slime_trait/beer_slime/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.chemical_injection = null
+ parent.overriding_name_prefix = null
+ parent.update_slime_varience()
diff --git a/monkestation/code/modules/slimecore/slime_traits/cleaner.dm b/monkestation/code/modules/slimecore/slime_traits/cleaner.dm
new file mode 100644
index 000000000000..0bd7ffff9f19
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/cleaner.dm
@@ -0,0 +1,67 @@
+/datum/slime_trait/cleaner
+ name = "Cleaner"
+ desc = "Changes the slime to consume pollution and grime."
+ menu_buttons = list(FOOD_CHANGE, DOCILE_CHANGE, BEHAVIOUR_CHANGE)
+ incompatible_traits = list(/datum/slime_trait/polluter)
+
+ ///decals we can clean
+ var/static/list/cleanable_decals = typecacheof(list(
+ /obj/effect/decal/cleanable/ants,
+ /obj/effect/decal/cleanable/ash,
+ /obj/effect/decal/cleanable/confetti,
+ /obj/effect/decal/cleanable/dirt,
+ /obj/effect/decal/cleanable/fuel_pool,
+ /obj/effect/decal/cleanable/generic,
+ /obj/effect/decal/cleanable/glitter,
+ /obj/effect/decal/cleanable/greenglow,
+ /obj/effect/decal/cleanable/insectguts,
+ /obj/effect/decal/cleanable/molten_object,
+ /obj/effect/decal/cleanable/oil,
+ /obj/effect/decal/cleanable/food,
+ /obj/effect/decal/cleanable/robot_debris,
+ /obj/effect/decal/cleanable/shreds,
+ /obj/effect/decal/cleanable/glass,
+ /obj/effect/decal/cleanable/vomit,
+ /obj/effect/decal/cleanable/wrapping,
+ /obj/effect/decal/remains,
+ ))
+ ///blood we can clean
+ var/static/list/cleanable_blood = typecacheof(list(
+ /obj/effect/decal/cleanable/xenoblood,
+ /obj/effect/decal/cleanable/blood,
+ /obj/effect/decal/cleanable/trail_holder,
+ ))
+ ///pests we hunt
+ var/static/list/huntable_pests = typecacheof(list(
+ /mob/living/basic/cockroach,
+ /mob/living/basic/mouse,
+ ))
+ ///trash we will burn
+ var/static/list/huntable_trash = typecacheof(list(
+ /obj/item/trash,
+ /obj/item/food/deadmouse,
+ ))
+
+/datum/slime_trait/cleaner/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.AddComponent(/datum/component/pollution_scrubber, 15)
+
+ parent.slime_flags |= (CLEANER_SLIME | PASSIVE_SLIME)
+
+ parent.ai_controller.set_blackboard_key(BB_CLEANABLE_DECALS, cleanable_decals)
+ parent.ai_controller.set_blackboard_key(BB_CLEANABLE_BLOOD, cleanable_blood)
+ parent.ai_controller.set_blackboard_key(BB_HUNTABLE_PESTS, huntable_pests)
+ parent.ai_controller.set_blackboard_key(BB_HUNTABLE_TRASH, huntable_trash)
+
+ ADD_TRAIT(parent, TRAIT_SLIME_DUST_IMMUNE, "trait")
+ parent.recompile_ai_tree()
+
+/datum/slime_trait/cleaner/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+
+ parent.slime_flags &= ~(CLEANER_SLIME | PASSIVE_SLIME)
+
+ parent.recompile_ai_tree()
+
+ qdel(parent.GetComponent(/datum/component/pollution_scrubber))
+ REMOVE_TRAIT(parent, TRAIT_SLIME_DUST_IMMUNE, "trait")
diff --git a/monkestation/code/modules/slimecore/slime_traits/docility.dm b/monkestation/code/modules/slimecore/slime_traits/docility.dm
new file mode 100644
index 000000000000..30e1a1c4de91
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/docility.dm
@@ -0,0 +1,11 @@
+/datum/slime_trait/docility
+ name = "Docility Mutation"
+ desc = "Mutates a slime so they avoid people with souls"
+
+/datum/slime_trait/docility/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE)
+
+/datum/slime_trait/docility/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, FALSE)
diff --git a/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm b/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm
new file mode 100644
index 000000000000..f12c99315b86
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm
@@ -0,0 +1,18 @@
+/datum/slime_trait/endisnigh
+ name = "Ash"
+ desc = "This feels like a reference?"
+
+
+/datum/slime_trait/endisnigh/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags |= OVERWRITES_COLOR
+ parent.icon_state_override = "ash"
+ parent.overwrite_color = "#242234"
+ SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, list())
+
+/datum/slime_trait/endisnigh/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags &= ~OVERWRITES_COLOR
+ parent.icon_state_override = null
+ parent.overwrite_color = null
+ SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states)
diff --git a/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm b/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm
new file mode 100644
index 000000000000..d80ff898b780
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm
@@ -0,0 +1,11 @@
+/datum/slime_trait/never_ooze
+ name = "Ooze Prevention"
+ desc = "Prevents slimes from making ooze."
+
+/datum/slime_trait/never_ooze/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags |= NOOOZE_SLIME
+
+/datum/slime_trait/never_ooze/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags &= ~NOOOZE_SLIME
diff --git a/monkestation/code/modules/slimecore/slime_traits/never_split.dm b/monkestation/code/modules/slimecore/slime_traits/never_split.dm
new file mode 100644
index 000000000000..0be6e81ade1a
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/never_split.dm
@@ -0,0 +1,12 @@
+/datum/slime_trait/never_evolving
+ name = "Never Changing Slime"
+ desc = "Prevents the slime from splitting or mutating"
+
+
+/datum/slime_trait/never_evolving/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags |= NOEVOLVE_SLIME
+
+/datum/slime_trait/never_evolving/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.slime_flags &= ~NOEVOLVE_SLIME
diff --git a/monkestation/code/modules/slimecore/slime_traits/polluter.dm b/monkestation/code/modules/slimecore/slime_traits/polluter.dm
new file mode 100644
index 000000000000..405c1da69cfc
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/polluter.dm
@@ -0,0 +1,28 @@
+/datum/slime_trait/polluter
+ name = "Polluter"
+ desc = "Emits large quanitities of pollution."
+ menu_buttons = list(ENVIRONMENT_CHANGE)
+ incompatible_traits = list(/datum/slime_trait/cleaner)
+
+/datum/slime_trait/polluter/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.AddElement(/datum/element/pollution_emitter, /datum/pollutant/slime_dust, 30)
+
+/datum/slime_trait/polluter/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.RemoveElement(/datum/element/pollution_emitter)
+
+/datum/pollutant/slime_dust
+ name = "Slime Dust"
+ pollutant_flags = POLLUTANT_APPEARANCE | POLLUTANT_BREATHE_ACT | POLLUTANT_TOUCH_ACT
+ thickness = 3
+ color = "#5769a5"
+
+/datum/pollutant/slime_dust/touch_act(mob/living/victim, amount)
+ if(!istype(victim, /mob/living/basic/slime) || amount < 90)
+ return
+ if(HAS_TRAIT(victim, TRAIT_SLIME_DUST_IMMUNE))
+ return
+
+ victim.adjustBruteLoss(1)
+
diff --git a/monkestation/code/modules/slimecore/slime_traits/radioactive.dm b/monkestation/code/modules/slimecore/slime_traits/radioactive.dm
new file mode 100644
index 000000000000..77afec774bbd
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/radioactive.dm
@@ -0,0 +1,13 @@
+/datum/slime_trait/radioactive
+ name = "Radioactive"
+ desc = "Emits violent rays of radiation."
+ menu_buttons = list(ENVIRONMENT_CHANGE, DANGEROUS_CHANGE)
+
+/datum/slime_trait/radioactive/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.add_filter("radio_slime", 10, outline_filter(12, "#39ff1430"))
+ parent.AddComponent(/datum/component/radioactive_emitter, cooldown_time = 5 SECONDS, range = 3, threshold = RAD_MEDIUM_INSULATION)
+
+/datum/slime_trait/radioactive/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ qdel(parent.GetComponent(/datum/component/radioactive_emitter))
diff --git a/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm b/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm
new file mode 100644
index 000000000000..ab200dd42f69
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm
@@ -0,0 +1,20 @@
+/datum/slime_trait/visual/cat
+ name = "Gooey Cat"
+ desc = "A docile slime with cat ears!"
+
+ trait_icon_state = "cat_ears"
+ trait_icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi'
+ menu_buttons = list(FOOD_CHANGE, DOCILE_CHANGE, BEHAVIOUR_CHANGE)
+
+/datum/slime_trait/visual/cat/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ parent.replacement_trees += list(/datum/ai_planning_subtree/simple_find_target_no_trait/slime = /datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat)
+ parent.emotion_states[EMOTION_HAPPY] = "aslime-:33"
+ SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states)
+ parent.recompile_ai_tree()
+
+/datum/slime_trait/visual/cat/on_remove (mob/living/basic/slime/parent)
+ parent.replacement_trees -= list(/datum/ai_planning_subtree/simple_find_target_no_trait/slime = /datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat)
+ parent.emotion_states[EMOTION_HAPPY] = "aslime-happy"
+ SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states)
+ parent.recompile_ai_tree()
diff --git a/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm b/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm
new file mode 100644
index 000000000000..81f1edfc4d1c
--- /dev/null
+++ b/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm
@@ -0,0 +1,32 @@
+/datum/slime_trait/soda_slime
+ name = "Soda Slime"
+ desc = "Modifies their genomes to allow them to produce soda instead of ooze"
+ menu_buttons = list(BEHAVIOUR_CHANGE)
+
+/datum/slime_trait/soda_slime/on_add(mob/living/basic/slime/parent)
+ . = ..()
+ var/datum/reagent/reagent = pick(
+ /datum/reagent/consumable/space_cola,
+ /datum/reagent/consumable/dr_gibb,
+ /datum/reagent/consumable/grenadine,
+ /datum/reagent/consumable/icetea,
+ /datum/reagent/consumable/menthol,
+ /datum/reagent/consumable/pwr_game,
+ /datum/reagent/consumable/shamblers,
+ /datum/reagent/consumable/spacemountainwind,
+ /datum/reagent/consumable/sodawater,
+ /datum/reagent/consumable/sol_dry,
+ /datum/reagent/consumable/space_up,
+ /datum/reagent/consumable/tonic,
+ /datum/reagent/consumable/ethanol/thirteenloko,
+ /datum/reagent/consumable/ethanol/whiskey_cola,
+ )
+ parent.chemical_injection = reagent
+ parent.overriding_name_prefix = initial(reagent.name)
+ parent.update_slime_varience()
+
+/datum/slime_trait/soda_slime/on_remove(mob/living/basic/slime/parent)
+ . = ..()
+ parent.chemical_injection = null
+ parent.overriding_name_prefix = null
+ parent.update_slime_varience()
diff --git a/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm
index d90993f09861..c655e25f9b84 100644
--- a/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm
+++ b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm
@@ -30,6 +30,7 @@
/datum/round_event_control/antagonist/solo/changeling/midround
name = "Genome Awakening (Changelings)"
+ antag_flag = ROLE_CHANGELING_MIDROUND
prompted_picking = TRUE
max_occurrences = 2
shared_occurences = list(/datum/round_event_control/antagonist/solo/changeling/roundstart)
diff --git a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm
index 74c7cf7cf320..0a60d45d24dc 100644
--- a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm
+++ b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm
@@ -24,11 +24,11 @@
max_occurrences = 1
prompted_picking = TRUE
-/datum/round_event_control/antagonist/solo/ghost/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE)
+/datum/round_event_control/antagonist/solo/from_ghosts/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE)
. = ..()
if(!.)
return
- if(GLOB.wizardstart.len == 0)
+ if(!length(GLOB.wizardstart))
return FALSE
/datum/round_event/antagonist/solo/ghost/wizard
diff --git a/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm
index 653e57269421..7514064a56db 100644
--- a/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm
+++ b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm
@@ -1,5 +1,5 @@
/datum/round_event_control/antagonist/solo/traitor
- antag_flag = ROLE_TRAITOR
+ antag_flag = ROLE_SYNDICATE_INFILTRATOR
tags = list(TAG_COMBAT)
antag_datum = /datum/antagonist/traitor/infiltrator
protected_roles = list(
@@ -21,7 +21,7 @@
/datum/round_event_control/antagonist/solo/traitor/roundstart
name = "Traitors"
- antag_flag = ROLE_SYNDICATE_INFILTRATOR
+ antag_flag = ROLE_TRAITOR
antag_datum = /datum/antagonist/traitor
roundstart = TRUE
earliest_start = 0 SECONDS
diff --git a/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm b/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm
index 30f0bdc27bd9..d3c3e7e11357 100644
--- a/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm
+++ b/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm
@@ -80,7 +80,7 @@
/datum/symptom/transformation/slime
name = "Advanced Mutation Transformation"
- new_form = /mob/living/simple_animal/slime
+ new_form = /mob/living/basic/slime
/datum/symptom/transformation/corgi
name = "The Barkening"
diff --git a/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm b/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm
index 03bab0cecf05..c67263b7f628 100644
--- a/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm
+++ b/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm
@@ -28,21 +28,13 @@
/obj/structure/chemical_tank/factory/proc/load_styles()
//expertly copypasted from chemmasters
- var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills)
pill_styles = list()
for (var/x in 1 to PILL_STYLE_COUNT)
- var/list/SL = list()
- SL["id"] = x
- SL["class_name"] = assets.icon_class_name("pill[x]")
- pill_styles += list(SL)
- var/datum/asset/spritesheet/simple/patches_assets = get_asset_datum(/datum/asset/spritesheet/simple/patches)
+ pill_styles += list("[x]" = image(icon = 'icons/obj/medical/chemical.dmi', icon_state = "pill[x]"))
+
patch_styles = list()
for (var/raw_patch_style in PATCH_STYLE_LIST)
- //adding class_name for use in UI
- var/list/patch_style = list()
- patch_style["style"] = raw_patch_style
- patch_style["class_name"] = patches_assets.icon_class_name(raw_patch_style)
- patch_styles += list(patch_style)
+ patch_styles += list("[raw_patch_style]" = image(icon = 'icons/obj/medical/chemical.dmi', icon_state = raw_patch_style))
/obj/structure/chemical_tank/factory/proc/generate_product(mob/user)
if(reagents.total_volume < current_volume)
@@ -52,7 +44,10 @@
reagents.trans_to(P, current_volume)
P.name = trim("[product_name] pill")
user.put_in_hands(P)
- P.icon_state = "pill[rand(1,21)]"
+ if(pill_number == RANDOM_PILL_STYLE)
+ P.icon_state = "pill[rand(1,21)]"
+ else
+ P.icon_state = "pill[pill_number]"
if(P.icon_state == "pill4") //mirrored from chem masters
P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality."
else if (product == "patch")
@@ -69,6 +64,8 @@
/obj/structure/chemical_tank/factory/AltClick(mob/user)
. = ..()
+ if(!length(pill_styles) || !length(patch_styles))
+ load_styles()
var/choice_product = tgui_input_list(user, "Pick Product", "[name]", list("pill", "patch", "bottle"))
if(choice_product)
product = choice_product
@@ -81,6 +78,17 @@
if(choice_volume)
current_volume = choice_volume
+ if(choice_product == "patch")
+ var/patch_choice = show_radial_menu(user, src, patch_styles)
+ if(patch_choice)
+ patch_style = patch_choice
+
+ if(choice_product == "pill")
+ var/pill_choice = show_radial_menu(user, src, pill_styles)
+ if(pill_choice)
+ pill_number = text2num(pill_choice)
+
+
/obj/structure/chemical_tank/factory/attack_hand(mob/living/user, list/modifiers)
. = ..()
generate_product(user)
diff --git a/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm b/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm
index d358dd196b5c..5db28e73425f 100644
--- a/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm
+++ b/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm
@@ -7,7 +7,8 @@
reagent_flags = TRANSPARENT
var/max_inject = 20
- var/inject_amount = 10
+ var/inject_amount = 0
+ var/creator_ckey = ""
/obj/structure/chemical_tank/injector/Initialize(mapload)
. = ..()
@@ -23,12 +24,17 @@
return
if(!iscarbon(AM))
return
+ if(!inject_amount)
+ return
visible_message("[name] pricks [AM] with a needle injecting [inject_amount] units into them.")
reagents.trans_to(AM, inject_amount, methods = INJECT)
+ if(creator_ckey)
+ logger.Log(LOG_CATEGORY_ATTACK, "[creator_ckey] injected [AM] with [inject_amount] units using a remote injector.")
/obj/structure/chemical_tank/injector/AltClick(mob/user)
. = ..()
- var/inject_choice = tgui_input_number(user, "How much to put into a patch?", "[name]", inject_amount, max_inject, 1)
+ var/inject_choice = tgui_input_number(user, "How much to inject someone with?", "[name]", inject_amount, max_inject, 1)
if(inject_choice)
inject_amount = inject_choice
+ creator_ckey = user.client?.ckey
diff --git a/sound/misc/woohoo.ogg b/sound/misc/woohoo.ogg
new file mode 100644
index 000000000000..fbbc4f08ca78
Binary files /dev/null and b/sound/misc/woohoo.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 0fc736069411..398b9a2a19f2 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -411,6 +411,7 @@
#include "code\__DEFINES\~monkestation\power.dm"
#include "code\__DEFINES\~monkestation\projectiles.dm"
#include "code\__DEFINES\~monkestation\robots.dm"
+#include "code\__DEFINES\~monkestation\slimes.dm"
#include "code\__DEFINES\~monkestation\smoothing.dm"
#include "code\__DEFINES\~monkestation\span.dm"
#include "code\__DEFINES\~monkestation\status_effects.dm"
@@ -424,6 +425,7 @@
#include "code\__DEFINES\~monkestation\dcs\signals\signals_carbon.dm"
#include "code\__DEFINES\~monkestation\dcs\signals\signals_guns.dm"
#include "code\__DEFINES\~monkestation\dcs\signals\signals_item.dm"
+#include "code\__DEFINES\~monkestation\dcs\signals\signals_mob.dm"
#include "code\__DEFINES\~monkestation\dcs\signals\signals_traitor.dm"
#include "code\__HELPERS\_auxtools_api.dm"
#include "code\__HELPERS\_lists.dm"
@@ -2123,7 +2125,6 @@
#include "code\game\objects\items\devices\scanners\health_analyzer.dm"
#include "code\game\objects\items\devices\scanners\scanner_wand.dm"
#include "code\game\objects\items\devices\scanners\sequence_scanner.dm"
-#include "code\game\objects\items\devices\scanners\slime_scanner.dm"
#include "code\game\objects\items\devices\scanners\t_scanner.dm"
#include "code\game\objects\items\food\_food.dm"
#include "code\game\objects\items\food\bait.dm"
@@ -3680,7 +3681,6 @@
#include "code\modules\food_and_drinks\machinery\grill.dm"
#include "code\modules\food_and_drinks\machinery\icecream_vat.dm"
#include "code\modules\food_and_drinks\machinery\microwave.dm"
-#include "code\modules\food_and_drinks\machinery\monkeyrecycler.dm"
#include "code\modules\food_and_drinks\machinery\oven.dm"
#include "code\modules\food_and_drinks\machinery\processor.dm"
#include "code\modules\food_and_drinks\machinery\smartfridge.dm"
@@ -4633,13 +4633,6 @@
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
-#include "code\modules\mob\living\simple_animal\slime\death.dm"
-#include "code\modules\mob\living\simple_animal\slime\emote.dm"
-#include "code\modules\mob\living\simple_animal\slime\life.dm"
-#include "code\modules\mob\living\simple_animal\slime\powers.dm"
-#include "code\modules\mob\living\simple_animal\slime\slime.dm"
-#include "code\modules\mob\living\simple_animal\slime\slime_say.dm"
-#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
#include "code\modules\mob_spawn\mob_spawn.dm"
#include "code\modules\mob_spawn\corpses\job_corpses.dm"
#include "code\modules\mob_spawn\corpses\mining_corpses.dm"
@@ -5148,7 +5141,6 @@
#include "code\modules\research\techweb\_techweb_node.dm"
#include "code\modules\research\techweb\all_nodes.dm"
#include "code\modules\research\techweb\techweb_types.dm"
-#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm"
#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm"
@@ -5297,7 +5289,6 @@
#include "code\modules\surgery\brain_surgery.dm"
#include "code\modules\surgery\burn_dressing.dm"
#include "code\modules\surgery\cavity_implant.dm"
-#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\coronary_bypass.dm"
#include "code\modules\surgery\dental_implant.dm"
#include "code\modules\surgery\dissection.dm"
@@ -6725,7 +6716,6 @@
#include "monkestation\code\modules\research\nanites\nanite_programs\utility.dm"
#include "monkestation\code\modules\research\nanites\nanite_programs\weapon.dm"
#include "monkestation\code\modules\research\techweb\all_nodes.dm"
-#include "monkestation\code\modules\research\xenobiology\xenobio_camera.dm"
#include "monkestation\code\modules\security\code\holographic_handcuffs.dm"
#include "monkestation\code\modules\security\code\weapons\lawbringer.dm"
#include "monkestation\code\modules\security\code\weapons\paco.dm"
@@ -6737,6 +6727,85 @@
#include "monkestation\code\modules\skyrat_snipes\vending_machines\vending_snacks.dm"
#include "monkestation\code\modules\skyrat_snipes\vending_machines\vendors.dm"
#include "monkestation\code\modules\slash_commands\world_topics.dm"
+#include "monkestation\code\modules\slimecore\research_and_recipes.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_grinder.dm"
+#include "monkestation\code\modules\slimecore\slime_accessories.dm\_base_accessory.dm"
+#include "monkestation\code\modules\slimecore\animations\slime_effects.dm"
+#include "monkestation\code\modules\slimecore\assets\xenobiology.dm"
+#include "monkestation\code\modules\slimecore\components\basic_scared_of_item.dm"
+#include "monkestation\code\modules\slimecore\components\emotion_buffer.dm"
+#include "monkestation\code\modules\slimecore\components\friendship_tracker.dm"
+#include "monkestation\code\modules\slimecore\components\generic_mob_hunger.dm"
+#include "monkestation\code\modules\slimecore\components\latch_feeding.dm"
+#include "monkestation\code\modules\slimecore\components\liquid_secretion.dm"
+#include "monkestation\code\modules\slimecore\components\mob_stacker.dm"
+#include "monkestation\code\modules\slimecore\components\pollution_scrubber.dm"
+#include "monkestation\code\modules\slimecore\components\vac_tagged.dm"
+#include "monkestation\code\modules\slimecore\corral\corral_data.dm"
+#include "monkestation\code\modules\slimecore\corral\machines\corral_corner.dm"
+#include "monkestation\code\modules\slimecore\corral\upgrades\_base_upgrade.dm"
+#include "monkestation\code\modules\slimecore\corral\upgrades\human_docility_upgrade.dm"
+#include "monkestation\code\modules\slimecore\corral\upgrades\obliteration_upgrade.dm"
+#include "monkestation\code\modules\slimecore\items\crossbreeds.dm"
+#include "monkestation\code\modules\slimecore\items\mutation_syringe.dm"
+#include "monkestation\code\modules\slimecore\items\vacuum_pack.dm"
+#include "monkestation\code\modules\slimecore\machines\biomass_recycler.dm"
+#include "monkestation\code\modules\slimecore\machines\extract_requestor.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_sucker.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_market.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_market_computer.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_pen_controller.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor_plumbing.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\shitcode.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\_base_recipe.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\burning.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\charged.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\chilling.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\colors.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\consuming.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\industrial.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\prismatic.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\recurring.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\regenerative.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\reproductive.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\selfsustaining.dm"
+#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\stabilized.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_store\_base_item.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_store\mutators.dm"
+#include "monkestation\code\modules\slimecore\machines\slime_store\vac_upgrades.dm"
+#include "monkestation\code\modules\slimecore\mobs\_base_slime.dm"
+#include "monkestation\code\modules\slimecore\mobs\feeding_flora.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\controller.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\clean_target.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\feed.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\find_target_without_trait.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\flee_from_item.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\slime_stacker.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\idle_behavior\slime_playful.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\basic_melee_tree.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\cleaning_tree.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\find_target_slime.dm"
+#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\flee_with_item.dm"
+#include "monkestation\code\modules\slimecore\mobs\pet_commands\latch_feed.dm"
+#include "monkestation\code\modules\slimecore\mobs\pet_commands\stop_feeding.dm"
+#include "monkestation\code\modules\slimecore\reagents\_base_reagent.dm"
+#include "monkestation\code\modules\slimecore\reagents\base_colors.dm"
+#include "monkestation\code\modules\slimecore\slime_color_mutations\_base_color.dm"
+#include "monkestation\code\modules\slimecore\slime_color_mutations\colors.dm"
+#include "monkestation\code\modules\slimecore\slime_color_mutations\mutations\_base_mutation.dm"
+#include "monkestation\code\modules\slimecore\slime_color_mutations\mutations\colors.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\_base_trait.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\beer_slime.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\cleaner.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\docility.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\endisnigh.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\never_ooze.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\never_split.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\polluter.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\radioactive.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\slime_cat.dm"
+#include "monkestation\code\modules\slimecore\slime_traits\soda_slime.dm"
#include "monkestation\code\modules\spells\spell_types\aoe_spell\mind_swap.dm"
#include "monkestation\code\modules\spells\spell_types\conjure_item\summon_mjollnir.dm"
#include "monkestation\code\modules\spells\spell_types\pointed\smite.dm"
diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx
index 9f7eec043bbb..c59a3b8065e8 100644
--- a/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx
+++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx
@@ -47,7 +47,7 @@ const MATERIAL_ICONS: Record = {
[17, 'sheet-titanium_2'],
[34, 'sheet-titanium_3'],
],
- 'bluespace crystal': [[0, 'bluespace_crystal']],
+ 'bluespace crystal': [[0, 'polycrystal']],
'plastic': [
[0, 'sheet-plastic'],
[17, 'sheet-plastic_2'],
diff --git a/tgui/packages/tgui/interfaces/SlimePenController.js b/tgui/packages/tgui/interfaces/SlimePenController.js
new file mode 100644
index 000000000000..65e555d3f1ca
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/SlimePenController.js
@@ -0,0 +1,272 @@
+import { useBackend, useLocalState } from '../backend';
+import { Box, Table, Tabs, Collapsible, Stack, LabeledList, ProgressBar, Section, Button } from '../components';
+import { Window } from '../layouts';
+import { toFixed } from 'common/math';
+
+export const SlimePenController = (_, context) => {
+ const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 1);
+
+ return (
+
+
+
+ setTabIndex(1)}>
+ Slime Data
+
+ setTabIndex(2)}>
+ Corral Data
+
+
+ {tabIndex === 1 && }
+ {tabIndex === 2 && }
+
+
+ );
+};
+
+const SlimeData = (_, context) => {
+ const { data } = useBackend(context);
+ const { slimes } = data;
+ return (
+
+ {slimes.map((slime) => (
+
+
+
+
+
+
+ {toFixed(slime.health, 0.1) + ' %'}
+
+
+
+
+ {toFixed(slime.hunger_precent * 100, 0.1) + ' %'}
+
+
+
+
+ {toFixed(slime.mutation_chance, 0.1) + ' %'}
+
+
+
+
+ {slime.possible_mutations.map((mutation) => (
+
+
+ {mutation.color + ' Slime'}
+
+
+
+
+ ))}
+
+
+
+
+ {slime.traits.map((trait) => (
+
+
+ {trait.name + ' Slime'}
+
+ {!!trait.behaviour && (
+
+ )}
+ {!!trait.environment && (
+
+ )}
+ {!!trait.danger && (
+
+ )}
+ {!!trait.docile && (
+
+ )}
+
+
+
+ ))}
+
+
+
+
+
+
+ ))}
+
+ );
+};
+
+const StoreViewer = (_, context) => {
+ const { data, act } = useBackend(context);
+ const { buyable_upgrades, corral_upgrades, reagent_data, reagent_amount } =
+ data;
+
+ return (
+
+
+ {buyable_upgrades.map((item) => (
+
+
+
+ {item.name}
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+ {corral_upgrades.map((item) => (
+
+
+
+ {item.name}
+
+
+
+
+
+
+ ))}
+
+
+
+
+ {'Stored Ooze: ' + toFixed(reagent_amount, 0.1) + ' units'}
+
+
+ {reagent_data.map((reagent) => (
+
+
+ {toFixed((reagent.amount / reagent_amount) * 100, 0.1) +
+ ' % (' +
+ toFixed(reagent.amount, 0.1) +
+ ' units)'}
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/XenobioMarket.js b/tgui/packages/tgui/interfaces/XenobioMarket.js
new file mode 100644
index 000000000000..4aa348bef79e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/XenobioMarket.js
@@ -0,0 +1,160 @@
+import { useBackend, useLocalState } from '../backend';
+import { Box, Section, Stack, Table, Tabs, Button } from '../components';
+import { Window } from '../layouts';
+import { classes } from 'common/react';
+import { toFixed } from 'common/math';
+
+export const XenobioMarket = (_, context) => {
+ const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 1);
+ const { data } = useBackend(context);
+ const { points } = data;
+
+ return (
+
+
+
+ setTabIndex(1)}>
+ Slime Market
+
+ setTabIndex(2)}>
+ Active Requests
+
+ setTabIndex(3)}>
+ View Shop
+
+
+
+ {tabIndex === 1 && }
+ {tabIndex === 2 && }
+ {tabIndex === 3 && }
+
+
+ );
+};
+
+const SlimeMarket = (_, context) => {
+ const { data } = useBackend(context);
+ const { prices } = data;
+
+ return (
+
+ {prices.map((price_row) => (
+
+ {price_row.prices.map((slime_price) => (
+
+ {!!slime_price.price && (
+
+
+
+
+
+
+ Currect price: {toFixed(slime_price.price, 0)} points.
+
+
+
+ )}
+
+ ))}
+
+ ))}
+
+ );
+};
+
+const RequestViewer = (_, context) => {
+ const { data } = useBackend(context);
+ const { requests } = data;
+
+ return (
+
+ {requests.map((request) => (
+
+
+
+
+
+ {request.name}
+
+ | Payout: {toFixed(request.payout, 0)} credits. | Xenobiology
+ Points: {toFixed(request.payout * 3, 0)}
+
+
+ | {toFixed(request.amount - request.amount_give, 0)} extracts
+ left.
+
+
+
+ ))}
+
+ );
+};
+
+const StoreViewer = (_, context) => {
+ const { data, act } = useBackend(context);
+ const { shop_items } = data;
+
+ return (
+
+ {shop_items.map((item) => (
+
+
+
+
+
+
+ {item.name}
+
+
+
+
+
+
+
+
+
+ ))}
+
+ );
+};