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/_maps/~monkestation/RandomBars/Tram/tram_rvb_bar.dmm b/_maps/~monkestation/RandomBars/Tram/tram_rvb_bar.dmm index 7eb1e1e8b868..e161d9ce8ff8 100644 --- a/_maps/~monkestation/RandomBars/Tram/tram_rvb_bar.dmm +++ b/_maps/~monkestation/RandomBars/Tram/tram_rvb_bar.dmm @@ -1810,7 +1810,7 @@ /area/station/commons/lounge) "BV" = ( /obj/effect/spawner/structure/window, -/turf/open/space/basic, +/turf/open/floor/plating, /area/station/commons/lounge) "Cd" = ( /obj/machinery/door/airlock/public/glass{ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 72fc999fe333..84a4fbbac4c6 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -56,6 +56,7 @@ #define MEDAL_DEBT_EXTINGUISHED "Debt Extinguished" #define MEDAL_ARCHMAGE "Archmage" #define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" +#define MEDAL_JARED_LETO "Jared Leto" // Monkestation addition //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" 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/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm index b5c97554865c..40d643a3ddeb 100644 --- a/code/game/machinery/medipen_refiller.dm +++ b/code/game/machinery/medipen_refiller.dm @@ -86,9 +86,9 @@ return ..() /obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - to_chat(user, span_notice("You start furiously plunging [name].")) + user.balloon_alert_to_viewers("furiously plunging...", "plunging medipen refiller...") if(do_after(user, 30, target = src)) - to_chat(user, span_notice("You finish plunging the [name].")) + user.balloon_alert_to_viewers("finished plunging") reagents.expose(get_turf(src), TOUCH) reagents.clear_reagents() 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 1770ab9d2046..86d64fbe505c 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -544,11 +544,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/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 3549edc1c1de..a5387fb32e54 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -405,11 +405,12 @@ if(welded) to_chat(user, span_notice("You cannot pump [src] if it's welded shut!")) + balloon_alert(user, "welded!") return - to_chat(user, span_notice("You begin pumping [src] with your plunger.")) + user.balloon_alert_to_viewers("plunging scrubber...", "plunging clogged scrubber...") if(do_after(user, 6 SECONDS, target = src)) - to_chat(user, span_notice("You finish pumping [src].")) + user.balloon_alert_to_viewers("finished plunging") clogged = FALSE /** 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/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm index c2013b99177b..e1b600779cca 100644 --- a/code/modules/clothing/masks/animal_masks.dm +++ b/code/modules/clothing/masks/animal_masks.dm @@ -151,6 +151,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( animal_sounds = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS|HIDESNOUT curse_spawn_sound = 'sound/magic/horsehead_curse.ogg' + flags_cover = NONE // Monkestation addition /obj/item/clothing/mask/animal/horsehead/cursed cursed = TRUE 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/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index bce4fcc1e3e8..108382dc98f0 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -37,9 +37,9 @@ return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - to_chat(user, span_notice("You start furiously plunging [name].")) + user.balloon_alert_to_viewers("furiously plunging...") if(do_after(user, 30, target = src)) - to_chat(user, span_notice("You finish plunging the [name].")) + user.balloon_alert_to_viewers("finished plunging") reagents.expose(get_turf(src), TOUCH) //splash on the floor reagents.clear_reagents() 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/reagents/reagent_containers/cups/drinkingglass.dm b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm index 4bb30dcc3105..57f48313d372 100644 --- a/code/modules/reagents/reagent_containers/cups/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/cups/drinkingglass.dm @@ -101,3 +101,7 @@ name = "Nuka Cola" list_reagents = list(/datum/reagent/consumable/nuka_cola = 50) +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/pina_colada + name = "Pina Colada" + list_reagents = list(/datum/reagent/consumable/ethanol/pina_colada = 50) + 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/html/changelogs/AutoChangeLog-pr-1498.yml b/html/changelogs/AutoChangeLog-pr-1498.yml deleted file mode 100644 index e66ae2b69dac..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1498.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - balance: "Borger artifacts no longer react if touched with a robotic limb." - - balance: "Borger artifacts will now just turn your arm robotic the first time you touch it." - - qol: "Made the examine text for borger artifacts more obvious." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1514.yml b/html/changelogs/AutoChangeLog-pr-1514.yml deleted file mode 100644 index dfcdd8e855ea..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1514.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KittyNoodle" -delete-after: True -changes: - - bugfix: "fixes Aetericilide being useless." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1515.yml b/html/changelogs/AutoChangeLog-pr-1515.yml deleted file mode 100644 index 0ee3c6c08245..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1515.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DimWhat" -delete-after: True -changes: - - image: "Touched up both the worn and object sprites for ascots." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1524.yml b/html/changelogs/AutoChangeLog-pr-1524.yml deleted file mode 100644 index 3a274eedc2f9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1524.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy, Thlumyn" -delete-after: True -changes: - - rscadd: "Oozelings and Slimepeople can now get wings from flight potions." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1531.yml b/html/changelogs/AutoChangeLog-pr-1531.yml deleted file mode 100644 index f3557241debf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1531.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - qol: "Added tinyfans to the solars airlocks on MetaStation." - - qol: "Added catwalk covering to the flooring of solars areas on MetaStation." - - qol: "All the solars panels on MetaStation are now actually deployed (consistent with other maps), rather than requiring you to manually place them for 2 of the solars.\nqol; Made that stupid weirdo Meta northwest solars make sense." - - qol: "Added catwalk covering to the SMES wiring output on MetaStation." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1558.yml b/html/changelogs/AutoChangeLog-pr-1558.yml deleted file mode 100644 index a7a40702ccf1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Gboster-0" -delete-after: True -changes: - - rscadd: "Added two new types of wiring to the youtool vendor, high-voltages no longer seem scary if you just prepare" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1565.yml b/html/changelogs/AutoChangeLog-pr-1565.yml deleted file mode 100644 index 68a7f9abdd1e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1565.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SeeBeeSee" -delete-after: True -changes: - - rscadd: "Added new honeydew melons that distill into honey, as well as slices for a quick snack" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1569.yml b/html/changelogs/AutoChangeLog-pr-1569.yml deleted file mode 100644 index e51d16a0447a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1569.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - balance: "Lowered the weight of the gravity generator blackout event to 8 (from 30), and capped it at 2 occurrences." - - balance: "Lowered the weight of the radiation storm event to 5 (from 10), and capped it at 1 occurrence." - - balance: "All scrubber clog+overflow events now share the same occurrence counter." - - bugfix: "You should no longer roll obsessed without being prompted for it first." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1576.yml b/html/changelogs/AutoChangeLog-pr-1576.yml deleted file mode 100644 index 7cba03bd755c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1576.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Tractor Mann" -delete-after: True -changes: - - bugfix: "fixed Rocket Jump Waltz in the jukebox, you can actually listen to it end now hopefully." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1585.yml b/html/changelogs/AutoChangeLog-pr-1585.yml deleted file mode 100644 index f66211283f4b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1585.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "The-Black-Screen" -delete-after: True -changes: - - rscadd: "added miscellaneous things around parts of the map." - - rscdel: "removed all custom notes." - - bugfix: "fixed the teg engine map file and miscellaneous things around parts of the map." - - code_imp: "changed the code in `monkestation/code/random_rooms/engines/boxstation.dm` to re-enable the teg engine." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1589.yml b/html/changelogs/AutoChangeLog-pr-1589.yml deleted file mode 100644 index 8736ba93313e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1589.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "MrMelbert" -delete-after: True -changes: - - qol: "Breathing cold air now has a particle effect associated, careful not to let your glasses fog up." - - qol: "Breathing cold air will now occasionally make your spaceman shiver. Brrr." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1596.yml b/html/changelogs/AutoChangeLog-pr-1596.yml deleted file mode 100644 index c1402b2cddb9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1596.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - bugfix: "You can now properly surgically reattach an oozeling's head." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1599.yml b/html/changelogs/AutoChangeLog-pr-1599.yml deleted file mode 100644 index 1da024673942..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1599.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Bastian0930" -delete-after: True -changes: - - bugfix: "Rod of Asclepius can no longer be used with telepathy. The geneticist responsible has been forced to roll a boulder for the rest of time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1633.yml b/html/changelogs/AutoChangeLog-pr-1633.yml new file mode 100644 index 000000000000..544fb91127d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1633.yml @@ -0,0 +1,5 @@ +author: "dwasint" +delete-after: True +changes: + - bugfix: "Ensure deleted slimes are properly tracked, to prevent weird errors that broke slime pen management consoles." + - bugfix: "Fixed some wonky logic with liquid code." \ No newline at end of file diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml index c96fc733cfed..ef97514d1e20 100644 --- a/html/changelogs/archive/2024-04.yml +++ b/html/changelogs/archive/2024-04.yml @@ -76,3 +76,67 @@ Jacquerel: - bugfix: Dismounting from a piggyback no longer allows you to phase through other players. +2024-04-08: + Absolucy: + - qol: Added tinyfans to the solars airlocks on MetaStation. + - qol: Added catwalk covering to the flooring of solars areas on MetaStation. + - qol: 'All the solars panels on MetaStation are now actually deployed (consistent + with other maps), rather than requiring you to manually place them for 2 of + the solars. + + qol; Made that stupid weirdo Meta northwest solars make sense.' + - qol: Added catwalk covering to the SMES wiring output on MetaStation. + - balance: Borger artifacts no longer react if touched with a robotic limb. + - balance: Borger artifacts will now just turn your arm robotic the first time you + touch it. + - qol: Made the examine text for borger artifacts more obvious. + - bugfix: You can now properly surgically reattach an oozeling's head. + - balance: Lowered the weight of the gravity generator blackout event to 8 (from + 30), and capped it at 2 occurrences. + - balance: Lowered the weight of the radiation storm event to 5 (from 10), and capped + it at 1 occurrence. + - balance: All scrubber clog+overflow events now share the same occurrence counter. + - bugfix: You should no longer roll obsessed without being prompted for it first. + Absolucy, Thlumyn: + - rscadd: Oozelings and Slimepeople can now get wings from flight potions. + Bastian0930: + - bugfix: Rod of Asclepius can no longer be used with telepathy. The geneticist + responsible has been forced to roll a boulder for the rest of time. + DimWhat: + - image: Touched up both the worn and object sprites for ascots. + Gboster-0: + - rscadd: Added two new types of wiring to the youtool vendor, high-voltages no + longer seem scary if you just prepare + KittyNoodle: + - bugfix: fixes Aetericilide being useless. + MrMelbert: + - qol: Breathing cold air now has a particle effect associated, careful not to let + your glasses fog up. + - qol: Breathing cold air will now occasionally make your spaceman shiver. Brrr. + SeeBeeSee: + - rscadd: Added new honeydew melons that distill into honey, as well as slices for + a quick snack + The-Black-Screen: + - rscadd: added miscellaneous things around parts of the map. + - rscdel: removed all custom notes. + - bugfix: fixed the teg engine map file and miscellaneous things around parts of + the map. + - code_imp: changed the code in `monkestation/code/random_rooms/engines/boxstation.dm` + to re-enable the teg engine. + Tractor Mann: + - bugfix: fixed Rocket Jump Waltz in the jukebox, you can actually listen to it + end now hopefully. +2024-04-09: + DimWhat: + - bugfix: Simians no longer turn invisible when husked. + KnigTheThrasher: + - rscadd: Added a new reagent container (aka. I fixed the bitrunning beach bar) +2024-04-10: + JohnFulpWillard: + - bugfix: Malkavian bloodsuckers now whisper revelations again. +2024-04-12: + Absolucy: + - qol: Added balloon alerts whenever you start plunging something. + Rex9001: + - rscadd: A new honeydew specific achievement + - balance: You can now eat whilst wearing a horsemask diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index eb8ca71f3941..a206cff1acf9 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ 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/datums/achievements/misc_achievements.dm b/monkestation/code/datums/achievements/misc_achievements.dm new file mode 100644 index 000000000000..11a778899d94 --- /dev/null +++ b/monkestation/code/datums/achievements/misc_achievements.dm @@ -0,0 +1,5 @@ +/datum/award/achievement/misc/jared_leto + name = "The Jared Leto of fruits" + desc = "Cantelopes dumb friend they insist on bringing to the party. The worst part of everything it is in." + database_id = MEDAL_JARED_LETO + icon = "jared_leto" 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/bloodsuckers/clans/malkavian.dm b/monkestation/code/modules/bloodsuckers/clans/malkavian.dm index 36b82b96925c..446ed33de1ce 100644 --- a/monkestation/code/modules/bloodsuckers/clans/malkavian.dm +++ b/monkestation/code/modules/bloodsuckers/clans/malkavian.dm @@ -41,7 +41,7 @@ if(prob(85) || bloodsuckerdatum.owner.current.stat != CONSCIOUS || HAS_TRAIT(bloodsuckerdatum.owner.current, TRAIT_MASQUERADE)) return var/message = pick(strings("malkavian_revelations.json", "revelations", "fulp_modules/strings/bloodsuckers")) - INVOKE_ASYNC(bloodsuckerdatum.owner.current, /atom/movable/proc/say, message, , , , , , CLAN_MALKAVIAN) + INVOKE_ASYNC(bloodsuckerdatum.owner.current, TYPE_PROC_REF(/atom/movable, say), message, , , , , , CLAN_MALKAVIAN) /datum/bloodsucker_clan/malkavian/on_favorite_vassal(datum/antagonist/bloodsucker/source, datum/antagonist/vassal/vassaldatum) var/mob/living/carbon/carbonowner = vassaldatum.owner.current 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/hydroponics/grown/honeydew.dm b/monkestation/code/modules/hydroponics/grown/honeydew.dm index 020da4bbd2af..eb313b71cd09 100644 --- a/monkestation/code/modules/hydroponics/grown/honeydew.dm +++ b/monkestation/code/modules/hydroponics/grown/honeydew.dm @@ -26,3 +26,21 @@ /obj/item/food/grown/honeydew/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/honeydewslice, 6, 20, screentip_verb = "Slice") + +/obj/item/food/grown/honeydew/Initialize() + . = ..() + // Used to check if they are wearing a horsemask + RegisterSignal(src, COMSIG_FOOD_EATEN, PROC_REF(check_horse_mask)) + +/// Checks if the consumer of this honeydew is wearing a horse mask, if they are give them an achievement +/obj/item/food/grown/honeydew/proc/check_horse_mask(obj/item/our_plant, mob/living/carbon/human/eater, mob/feeder) + SIGNAL_HANDLER + + // If they arent wearing a horsemask they dont get the achievement + if(!istype(eater.wear_mask, /obj/item/clothing/mask/animal/horsehead)) + return + + to_chat(eater, span_notice("Not bad actually.")) + // Gives them the honeydew achievement + eater.client.give_award(/datum/award/achievement/misc/jared_leto, eater) + 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..bbf17b723c88 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 @@ -467,7 +515,10 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) if(group_burn_rate >= reagents_per_turf) var/list/removed_turf = list() - for(var/num = 1, num < round(group_burn_rate / reagents_per_turf)) + var/number = round(group_burn_rate / reagents_per_turf) + for(var/num in 1 to number) + if(!length(burning_members)) + break var/turf/picked_turf = burning_members[1] extinguish(picked_turf) remove_from_group(picked_turf) @@ -743,7 +794,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 +826,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 +838,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..c75b53e065da --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/corral_data.dm @@ -0,0 +1,100 @@ +//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)) + RegisterSignals(arrived, list(COMSIG_PREQDELETED, COMSIG_QDELETING), PROC_REF(try_remove)) + managed_slimes |= arrived + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_entered(arrived, src) + update_slimes() + +/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) + UnregisterSignal(gone, list(COMSIG_PREQDELETED, COMSIG_QDELETING)) + managed_slimes -= gone + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_exited(gone) + update_slimes() + +/datum/corral_data/proc/remove_cause_sucked(atom/movable/gone) + + UnregisterSignal(gone, COMSIG_ATOM_SUCKED) + UnregisterSignal(gone, COMSIG_LIVING_DEATH) + UnregisterSignal(gone, list(COMSIG_PREQDELETED, COMSIG_QDELETING)) + managed_slimes -= gone + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_exited(gone) + update_slimes() + +/datum/corral_data/proc/try_remove(mob/living/basic/slime/source) + managed_slimes -= source + update_slimes() + +/datum/corral_data/proc/update_slimes() + for(var/mob/living/basic/slime/slime as anything in managed_slimes) + if(QDELETED(slime) || !(get_turf(slime) in corral_turfs)) + managed_slimes -= slime + if(QDELETED(slime)) + continue + UnregisterSignal(slime, COMSIG_ATOM_SUCKED) + UnregisterSignal(slime, COMSIG_LIVING_DEATH) + UnregisterSignal(slime, list(COMSIG_PREQDELETED, COMSIG_QDELETING)) + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_exited(slime) 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..e071ac929ecb --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm @@ -0,0 +1,189 @@ +/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() + linked_data.update_slimes() + 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/_base_accessory.dm b/monkestation/code/modules/slimecore/slime_accessories/_base_accessory.dm new file mode 100644 index 000000000000..6dd3f44115a7 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_accessories/_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/surgery/bodyparts/simian_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm index da57550c7dc7..522324f44f22 100644 --- a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm +++ b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm @@ -1,5 +1,6 @@ /obj/item/bodypart/head/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN is_dimorphic = FALSE @@ -9,6 +10,7 @@ /obj/item/bodypart/chest/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN is_dimorphic = FALSE @@ -18,6 +20,7 @@ /obj/item/bodypart/arm/left/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM @@ -26,6 +29,7 @@ /obj/item/bodypart/arm/right/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM @@ -34,6 +38,7 @@ /obj/item/bodypart/leg/left/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM @@ -41,6 +46,7 @@ /obj/item/bodypart/leg/right/simian icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' husk_type = "simian" limb_id = SPECIES_SIMIAN bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM 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 b6a434a64013..79212ef59d59 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" @@ -2125,7 +2127,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" @@ -3682,7 +3683,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" @@ -4635,13 +4635,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" @@ -5150,7 +5143,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" @@ -5299,7 +5291,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" @@ -5688,6 +5679,7 @@ #include "monkestation\code\datums\patreon_data.dm" #include "monkestation\code\datums\stamina_container.dm" #include "monkestation\code\datums\twitch_data.dm" +#include "monkestation\code\datums\achievements\misc_achievements.dm" #include "monkestation\code\datums\ai\idle_behaviors\idle_dukeman.dm" #include "monkestation\code\datums\ai\monkey\dukeman_controller.dm" #include "monkestation\code\datums\ai_laws\laws_monke.dm" @@ -6735,7 +6727,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" @@ -6747,6 +6738,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\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_grinder.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_accessories\_base_accessory.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'} +
+ ))} +
+
+
+
+
+
+ ))} +
+ ); +}; + +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 Data +
+ + + + {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} + + + + + +
+ ))} +
+ ); +}; diff --git a/tools/HubMigrator/HubMigrator.dm b/tools/HubMigrator/HubMigrator.dm index 648665a6b93a..56d99dcc303d 100644 --- a/tools/HubMigrator/HubMigrator.dm +++ b/tools/HubMigrator/HubMigrator.dm @@ -9,7 +9,6 @@ #define MEDAL_MATERIALCRAFT "Getting an Upgrade" #define MEDAL_SINGULARITY_BUSTER "The Lord Dethroned" //Singularity Nullified - //Boss medals // Medal hub IDs for boss medals (Pre-fixes)