From 79ab5130248e8610937a7b18d845a8efeeeb219d Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:51:13 -0400 Subject: [PATCH] [DRAFT] Slime Rancher? In my space station???? (#1442) * start * more stuff * more changes * more slime stuff * Update slime.dm * Update slime.dm * adds more slime stuff * start of crossbreeds * adds the mutation types to all slimes temp for now * guh * more stuff * makes slimes respect eachother eating stuff so they will target other things * Update feed.dm * sponge bob me boy why are the slimes stacking * more slime stuff * Update _base_slime.dm * another trait * start of slime corrals * slime corrals * more slime pen stuff * adds all the crossbreed recipes. * base slime colors done * more traits, more fixes, better ui * minor fixes * test fixer * holy shit is this a edmund macmillan reference? * it fucking auto corrected mcmillen to mcmillan >:( * overlay fix * Merge branch 'slimerancher' of https://github.com/dwasint/monkestation2.0 into slimerancher * Update tgstation.dme * hard delete fixes * makes shop work * changes to mapping id * metastation mapping changes * adds the request console * delta, ice and some meta changes * fixes * tram IG * adds buyable corral pen upgrades * map fix, slime pen corral buying and upgrade viewing * sanity checks the liquid groups because splits have a period of time where they can trigger other things which breaks liquids * adds placeholder apply_water proc until we rework reagents. * the research * fuck * whoops * fixes * Update mob_stacker.dm * Update xenobiology.dm * tons of fixes * range increase, removal on death, mutation chance * more changes * guh * Update vacuum_pack.dm * Update vacuum_pack.dm * Update ooze_compressor.dm * Update slime_extracts.dm * potential fixes * more fixes * wasn't getting latch bug anymore * no split no ooze, traits pass down, random color mutation syringe * fixes * Update tramstation.dmm * Update feed.dm * repaths extracts, phasing fix, crossbreed cost increase, phasing issue fix * Update ooze_compressor.dm * Update slime_extracts.dm * fixes compressor not being in the plumber, fixes crossbreeds being unmakable * fixes slime mutations not working all the time, makes corrals load slimes at roundstart * soda slime * jps pathing * adds ooze counter to the pen controller * forgot to tick beer slimes * Update ooze_compressor.dm * Update cargo_driver.dm * Update rat_organs.dm * Update rat_organs.dm * Update liquid_groups.dm * prevents slime_stacks from feeding as it breaks mob buckling, adds the legendary rainbow slime * Update _base_mutation.dm * fixes * fixes * Update colors.dm * makes them unbuckle in death * should fix crossbreeds not properly respecting full reagents * Update traitor.dm * Update changeling.dm * Update corral_corner.dm * Update colors.dm * changes shit * fixes * Update liquid_controller.dm * Update liquid_turf.dm * Update liquid_turf.dm * maybe fixes it? * Update _base_slime.dm * guh * start of emotional speech * Update _base_slime.dm * friendship tracker * slime friendship throw, also fix for ooze compressor * adds vac_tagging to gain friendship from feedings * pet commands * fixes runtime * Update emotion_buffer.dm * old slimes have died woah * Update _base_slime.dm * box xenobiology * Update BoxStation.dmm * snaps xeno shit from kilo * map fixes * Update nonhuman_corpses.dm * more mapping fixes * Update hilbertresearchfacility.dmm * bam * Update tgstation.dme * whoops * fixes * Update mutation_syringe.dm * fixes * fixes * Update BoxStation.dmm * Revert "Update BoxStation.dmm" This reverts commit ac5e68436fababaf5250dab157ef416751dbed52. * Revert "Merge branch 'master' into slimerancher" This reverts commit de0a3674e5c19e6abe667f1e9380b570d7bd0b25, reversing changes made to c903670e54f286d20bc2a9993cef7a13291fe729. * Reapply "Merge branch 'master' into slimerancher" This reverts commit 8a32f48344018ae43e2a621f8fde782a2dc46a16. * Reapply "Update BoxStation.dmm" This reverts commit 7ae79339dc0fe2b917f702260646326ec5d61ee1. * redoes this manually * fixes pyros dying and buckling bug * potential fix * more additions * Update liquid_status_effect.dm * what the fuck is wrong with the slow downs * slime grinder * prevents slimes from crushing roaches --- .../SpaceRuins/anomaly_research.dmm | 1 - .../SpaceRuins/hilbertresearchfacility.dmm | 21 +- .../map_files/Basketball/lusty_xenomorphs.dmm | 20 +- _maps/map_files/BoxStation/BoxStation.dmm | 1234 ++--- .../map_files/Deltastation/DeltaStation2.dmm | 1110 ++--- .../map_files/IceBoxStation/IceBoxStation.dmm | 1296 ++--- _maps/map_files/KiloStation/KiloStation.dmm | 18 +- _maps/map_files/MetaStation/MetaStation.dmm | 4253 +++++++++-------- _maps/map_files/NorthStar/north_star.dmm | 20 +- _maps/map_files/generic/CentCom.dmm | 5 +- _maps/map_files/tramstation/tramstation.dmm | 1217 ++--- _maps/templates/lazy_templates/nukie_base.dmm | 5 +- .../signals/signals_mob/signals_mob_living.dm | 2 + code/__DEFINES/is_helpers.dm | 2 +- .../~monkestation/dcs/signals/signals_mob.dm | 25 + code/__DEFINES/~monkestation/slimes.dm | 91 + code/__HELPERS/mobs.dm | 2 +- code/__HELPERS/paths/path.dm | 5 + code/_globalvars/phobias.dm | 4 +- code/_onclick/other_mobs.dm | 24 - .../configuration/entries/game_options.dm | 3 +- code/controllers/subsystem/research.dm | 28 + code/datums/ai/_ai_controller.dm | 2 +- .../basic_ai_behaviors/basic_attacking.dm | 10 +- .../run_away_from_target.dm | 1 + code/datums/ai/movement/_ai_movement.dm | 16 +- code/datums/components/plumbing/_plumbing.dm | 22 +- code/datums/components/squashable.dm | 2 +- code/datums/elements/basic_eating.dm | 2 + code/game/atoms_movable.dm | 16 +- code/game/machinery/computer/accounting.dm | 2 + .../dna_infuser/organ_sets/rat_organs.dm | 18 +- .../telecomms/computers/logbrowser.dm | 2 +- code/game/objects/buckling.dm | 16 +- .../anomalies/anomalies_pyroclastic.dm | 12 +- .../circuitboards/computer_circuitboards.dm | 5 - .../machines/machine_circuitboards.dm | 31 +- .../objects/items/devices/chameleonproj.dm | 2 - .../items/devices/scanners/slime_scanner.dm | 53 - code/game/objects/items/rcd/RPLD.dm | 5 + .../items/stacks/sheets/sheet_types.dm | 1 + code/game/objects/obj_defense.dm | 6 - code/game/objects/structures/ladders.dm | 11 - code/game/turfs/open/_open.dm | 2 +- .../abductor/equipment/glands/slime.dm | 5 +- .../antagonists/revolution/revolution.dm | 4 +- code/modules/awaymissions/signpost.dm | 3 - .../modules/awaymissions/super_secret_room.dm | 3 - code/modules/events/creep_awakening.dm | 1 + .../experisci/experiment/experiments.dm | 2 - .../machinery/monkeyrecycler.dm | 103 - .../food_and_drinks/machinery/processor.dm | 55 - .../food_and_drinks/machinery/smartfridge.dm | 4 +- .../recipes/processor_recipes.dm | 5 - .../ruins/spaceruin_code/hilbertshotel.dm | 3 - .../modules/mob/living/basic/basic_defense.dm | 8 +- .../mob/living/carbon/alien/alien_defense.dm | 9 - .../mob/living/carbon/carbon_defense.dm | 22 - .../mob/living/carbon/human/human_defense.dm | 25 - .../mob/living/carbon/human/human_defines.dm | 2 +- .../modules/mob/living/carbon/status_procs.dm | 1 + code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_defense.dm | 23 - .../mob/living/silicon/ai/ai_defense.dm | 3 - .../mob/living/silicon/robot/robot_defense.dm | 18 - .../living/simple_animal/animal_defense.dm | 7 - .../hostile/mining_mobs/curse_blob.dm | 1 - .../mob/living/simple_animal/slime/death.dm | 31 - .../mob/living/simple_animal/slime/emote.dm | 56 - .../mob/living/simple_animal/slime/life.dm | 615 --- .../mob/living/simple_animal/slime/powers.dm | 241 - .../mob/living/simple_animal/slime/slime.dm | 580 --- .../living/simple_animal/slime/slime_say.dm | 8 - .../living/simple_animal/slime/subtypes.dm | 79 - code/modules/mob/living/ventcrawling.dm | 7 - code/modules/mob/mob.dm | 2 +- code/modules/mob/transform_procs.dm | 7 +- .../mob_spawn/corpses/nonhuman_corpses.dm | 8 +- code/modules/power/cell.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 2 + .../chemistry/reagents/food_reagents.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 4 +- .../reagents/pyrotechnic_reagents.dm | 2 +- .../chemistry/recipes/slime_extracts.dm | 14 +- .../designs/autolathe/medsci_designs.dm | 11 - .../research/designs/comp_board_designs.dm | 10 - .../research/designs/machine_designs.dm | 10 - code/modules/research/techweb/all_nodes.dm | 10 +- .../xenobiology/crossbreeding/__corecross.dm | 2 + .../xenobiology/crossbreeding/_mobs.dm | 10 +- .../xenobiology/crossbreeding/_potions.dm | 4 +- .../crossbreeding/_status_effects.dm | 6 +- .../xenobiology/crossbreeding/burning.dm | 11 +- .../xenobiology/crossbreeding/charged.dm | 4 +- .../xenobiology/crossbreeding/chilling.dm | 4 +- .../xenobiology/crossbreeding/industrial.dm | 2 +- .../xenobiology/crossbreeding/regenerative.dm | 6 +- .../vatgrowing/samples/cell_lines/common.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 453 -- .../research/xenobiology/xenobiology.dm | 135 +- code/modules/surgery/core_removal.dm | 61 - .../surgery/organs/augments_internal.dm | 2 + code/modules/unit_tests/_unit_tests.dm | 1 - code/modules/unit_tests/slime_mood.dm | 12 - code/modules/unit_tests/strange_reagent.dm | 2 +- config/game_options.txt | 2 +- .../code/controllers/subsystem/job.dm | 2 +- .../code/modules/aesthetics/mobs/slime.dm | 9 +- .../code/modules/cargo/crates/science.dm | 7 +- .../code/modules/liquids/liquid_controller.dm | 6 + .../code/modules/liquids/liquid_effect.dm | 12 +- .../code/modules/liquids/liquid_groups.dm | 60 +- .../modules/liquids/liquid_status_effect.dm | 3 +- .../code/modules/liquids/liquid_turf.dm | 4 + .../ocean_content/fluff/cargo_driver.dm | 5 +- .../code/modules/pollution/pollutant_datum.dm | 6 +- .../research/xenobiology/xenobio_camera.dm | 15 - .../slimecore/animations/slime_effects.dm | 38 + .../modules/slimecore/assets/xenobiology.dm | 5 + .../components/basic_scared_of_item.dm | 40 + .../slimecore/components/emotion_buffer.dm | 136 + .../components/friendship_tracker.dm | 56 + .../components/generic_mob_hunger.dm | 94 + .../slimecore/components/latch_feeding.dm | 123 + .../slimecore/components/liquid_secretion.dm | 50 + .../slimecore/components/mob_stacker.dm | 84 + .../components/pollution_scrubber.dm | 28 + .../slimecore/components/vac_tagged.dm | 16 + .../modules/slimecore/corral/corral_data.dm | 78 + .../corral/machines/corral_corner.dm | 189 + .../corral/upgrades/_base_upgrade.dm | 14 + .../corral/upgrades/human_docility_upgrade.dm | 16 + .../corral/upgrades/obliteration_upgrade.dm | 14 + .../slimecore/icons/backpack_lefthand.dmi | Bin 0 -> 653 bytes .../slimecore/icons/backpack_righthand.dmi | Bin 0 -> 634 bytes .../modules/slimecore/icons/equipment.dmi | Bin 0 -> 5347 bytes .../code/modules/slimecore/icons/filters.dmi | Bin 0 -> 87675 bytes .../modules/slimecore/icons/machinery.dmi | Bin 0 -> 13814 bytes .../slimecore/icons/mister_lefthand.dmi | Bin 0 -> 1140 bytes .../slimecore/icons/mister_righthand.dmi | Bin 0 -> 1108 bytes .../modules/slimecore/icons/slime_grinder.dmi | Bin 0 -> 701 bytes .../icons/slimecrossing_plort_version.dmi | Bin 0 -> 21622 bytes .../code/modules/slimecore/icons/slimes.dmi | Bin 0 -> 81239 bytes .../modules/slimecore/icons/stack_objects.dmi | Bin 0 -> 1898 bytes .../modules/slimecore/icons/xenofauna.dmi | Bin 0 -> 62414 bytes .../modules/slimecore/items/crossbreeds.dm | 2 + .../slimecore/items/mutation_syringe.dm | 82 + .../modules/slimecore/items/vacuum_pack.dm | 589 +++ .../slimecore/machines/biomass_recycler.dm | 181 + .../slimecore/machines/extract_requestor.dm | 180 + .../ooze_compressor/ooze_compressor.dm | 214 + .../ooze_compressor_plumbing.dm | 31 + .../ooze_compressor/recipes/_base_recipe.dm | 6 + .../ooze_compressor/recipes/burning.dm | 154 + .../ooze_compressor/recipes/charged.dm | 155 + .../ooze_compressor/recipes/chilling.dm | 155 + .../ooze_compressor/recipes/colors.dm | 87 + .../ooze_compressor/recipes/consuming.dm | 155 + .../ooze_compressor/recipes/industrial.dm | 155 + .../ooze_compressor/recipes/prismatic.dm | 155 + .../ooze_compressor/recipes/recurring.dm | 155 + .../ooze_compressor/recipes/regenerative.dm | 155 + .../ooze_compressor/recipes/reproductive.dm | 155 + .../ooze_compressor/recipes/selfsustaining.dm | 155 + .../ooze_compressor/recipes/stabilized.dm | 155 + .../machines/ooze_compressor/shitcode.dm | 42 + .../modules/slimecore/machines/ooze_sucker.dm | 130 + .../slimecore/machines/slime_grinder.dm | 73 + .../slimecore/machines/slime_market.dm | 137 + .../machines/slime_market_computer.dm | 169 + .../machines/slime_pen_controller.dm | 188 + .../machines/slime_store/_base_item.dm | 5 + .../machines/slime_store/mutators.dm | 53 + .../machines/slime_store/vac_upgrades.dm | 5 + .../modules/slimecore/mobs/_base_slime.dm | 467 ++ .../ai_controller/behaviours/clean_target.dm | 42 + .../mobs/ai_controller/behaviours/feed.dm | 22 + .../behaviours/find_target_without_trait.dm | 82 + .../behaviours/flee_from_item.dm | 76 + .../ai_controller/behaviours/slime_stacker.dm | 62 + .../mobs/ai_controller/controller.dm | 21 + .../idle_behavior/slime_playful.dm | 22 + .../subtrees/basic_melee_tree.dm | 7 + .../ai_controller/subtrees/cleaning_tree.dm | 17 + .../subtrees/find_target_slime.dm | 27 + .../ai_controller/subtrees/flee_with_item.dm | 9 + .../modules/slimecore/mobs/feeding_flora.dm | 80 + .../slimecore/mobs/pet_commands/latch_feed.dm | 2 + .../mobs/pet_commands/stop_feeding.dm | 13 + monkestation/code/modules/slimecore/readme.md | 36 + .../slimecore/reagents/_base_reagent.dm | 12 + .../modules/slimecore/reagents/base_colors.dm | 116 + .../modules/slimecore/research_and_recipes.dm | 102 + .../slime_accessories.dm/_base_accessory.dm | 12 + .../slime_color_mutations/_base_color.dm | 25 + .../slimecore/slime_color_mutations/colors.dm | 238 + .../mutations/_base_mutation.dm | 59 + .../slime_color_mutations/mutations/colors.dm | 93 + .../slimecore/slime_traits/_base_trait.dm | 57 + .../slimecore/slime_traits/beer_slime.dm | 17 + .../modules/slimecore/slime_traits/cleaner.dm | 67 + .../slimecore/slime_traits/docility.dm | 11 + .../slimecore/slime_traits/endisnigh.dm | 18 + .../slimecore/slime_traits/never_ooze.dm | 11 + .../slimecore/slime_traits/never_split.dm | 12 + .../slimecore/slime_traits/polluter.dm | 28 + .../slimecore/slime_traits/radioactive.dm | 13 + .../slimecore/slime_traits/slime_cat.dm | 20 + .../slimecore/slime_traits/soda_slime.dm | 32 + .../converted_events/solo/changeling.dm | 1 + .../converted_events/solo/ghosts/wizard.dm | 4 +- .../converted_events/solo/traitor.dm | 4 +- .../disease/symtoms/restricted/stage1.dm | 2 +- .../components/ouputs/factory_output.dm | 32 +- .../components/ouputs/injector_output.dm | 10 +- sound/misc/woohoo.ogg | Bin 0 -> 13944 bytes tgstation.dme | 93 +- .../interfaces/Fabrication/MaterialIcon.tsx | 2 +- .../tgui/interfaces/SlimePenController.js | 272 ++ .../packages/tgui/interfaces/XenobioMarket.js | 160 + 220 files changed, 11592 insertions(+), 8256 deletions(-) create mode 100644 code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm create mode 100644 code/__DEFINES/~monkestation/slimes.dm delete mode 100644 code/game/objects/items/devices/scanners/slime_scanner.dm delete mode 100644 code/modules/food_and_drinks/machinery/monkeyrecycler.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/death.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/emote.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/life.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/powers.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/slime.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/slime_say.dm delete mode 100644 code/modules/mob/living/simple_animal/slime/subtypes.dm delete mode 100644 code/modules/research/xenobiology/xenobio_camera.dm delete mode 100644 code/modules/surgery/core_removal.dm delete mode 100644 code/modules/unit_tests/slime_mood.dm delete mode 100644 monkestation/code/modules/research/xenobiology/xenobio_camera.dm create mode 100644 monkestation/code/modules/slimecore/animations/slime_effects.dm create mode 100644 monkestation/code/modules/slimecore/assets/xenobiology.dm create mode 100644 monkestation/code/modules/slimecore/components/basic_scared_of_item.dm create mode 100644 monkestation/code/modules/slimecore/components/emotion_buffer.dm create mode 100644 monkestation/code/modules/slimecore/components/friendship_tracker.dm create mode 100644 monkestation/code/modules/slimecore/components/generic_mob_hunger.dm create mode 100644 monkestation/code/modules/slimecore/components/latch_feeding.dm create mode 100644 monkestation/code/modules/slimecore/components/liquid_secretion.dm create mode 100644 monkestation/code/modules/slimecore/components/mob_stacker.dm create mode 100644 monkestation/code/modules/slimecore/components/pollution_scrubber.dm create mode 100644 monkestation/code/modules/slimecore/components/vac_tagged.dm create mode 100644 monkestation/code/modules/slimecore/corral/corral_data.dm create mode 100644 monkestation/code/modules/slimecore/corral/machines/corral_corner.dm create mode 100644 monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm create mode 100644 monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm create mode 100644 monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm create mode 100644 monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi create mode 100644 monkestation/code/modules/slimecore/icons/backpack_righthand.dmi create mode 100644 monkestation/code/modules/slimecore/icons/equipment.dmi create mode 100644 monkestation/code/modules/slimecore/icons/filters.dmi create mode 100644 monkestation/code/modules/slimecore/icons/machinery.dmi create mode 100644 monkestation/code/modules/slimecore/icons/mister_lefthand.dmi create mode 100644 monkestation/code/modules/slimecore/icons/mister_righthand.dmi create mode 100644 monkestation/code/modules/slimecore/icons/slime_grinder.dmi create mode 100644 monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi create mode 100644 monkestation/code/modules/slimecore/icons/slimes.dmi create mode 100644 monkestation/code/modules/slimecore/icons/stack_objects.dmi create mode 100644 monkestation/code/modules/slimecore/icons/xenofauna.dmi create mode 100644 monkestation/code/modules/slimecore/items/crossbreeds.dm create mode 100644 monkestation/code/modules/slimecore/items/mutation_syringe.dm create mode 100644 monkestation/code/modules/slimecore/items/vacuum_pack.dm create mode 100644 monkestation/code/modules/slimecore/machines/biomass_recycler.dm create mode 100644 monkestation/code/modules/slimecore/machines/extract_requestor.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm create mode 100644 monkestation/code/modules/slimecore/machines/ooze_sucker.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_grinder.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_market.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_market_computer.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_pen_controller.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_store/mutators.dm create mode 100644 monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm create mode 100644 monkestation/code/modules/slimecore/mobs/_base_slime.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm create mode 100644 monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm create mode 100644 monkestation/code/modules/slimecore/mobs/feeding_flora.dm create mode 100644 monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm create mode 100644 monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm create mode 100644 monkestation/code/modules/slimecore/readme.md create mode 100644 monkestation/code/modules/slimecore/reagents/_base_reagent.dm create mode 100644 monkestation/code/modules/slimecore/reagents/base_colors.dm create mode 100644 monkestation/code/modules/slimecore/research_and_recipes.dm create mode 100644 monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm create mode 100644 monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm create mode 100644 monkestation/code/modules/slimecore/slime_color_mutations/colors.dm create mode 100644 monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm create mode 100644 monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/_base_trait.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/beer_slime.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/cleaner.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/docility.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/endisnigh.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/never_ooze.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/never_split.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/polluter.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/radioactive.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/slime_cat.dm create mode 100644 monkestation/code/modules/slimecore/slime_traits/soda_slime.dm create mode 100644 sound/misc/woohoo.ogg create mode 100644 tgui/packages/tgui/interfaces/SlimePenController.js create mode 100644 tgui/packages/tgui/interfaces/XenobioMarket.js diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index 0d97c9d3c7a6..584b3f145de0 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -1138,7 +1138,6 @@ /obj/effect/turf_decal/siding/purple{ dir = 9 }, -/obj/machinery/monkey_recycler, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/dark, /area/misc/anomaly_research) diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index 3cbe3ca2ddc3..fb1cc9c069e9 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -375,9 +375,8 @@ /turf/open/floor/carpet/black, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "jC" = ( -/mob/living/simple_animal/slime{ - colour = "bluespace"; - rabid = 1 +/mob/living/basic/slime{ + current_color = /datum/slime_color/bluespace }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium/tiled/purple, @@ -903,9 +902,8 @@ /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "wY" = ( -/mob/living/simple_animal/slime{ - colour = "bluespace"; - rabid = 1 +/mob/living/basic/slime{ + current_color = /datum/slime_color/bluespace }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -1610,7 +1608,6 @@ /area/ruin/space/has_grav/powered/hilbertresearchfacility) "JW" = ( /obj/machinery/light/broken/directional/north, -/obj/machinery/monkey_recycler, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Kd" = ( @@ -2192,9 +2189,8 @@ dir = 10 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/slime{ - colour = "bluespace"; - rabid = 1 +/mob/living/basic/slime{ + current_color = /datum/slime_color/bluespace }, /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) @@ -2330,9 +2326,8 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Ze" = ( -/mob/living/simple_animal/slime{ - colour = "bluespace"; - rabid = 1 +/mob/living/basic/slime{ + current_color = /datum/slime_color/bluespace }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium, diff --git a/_maps/map_files/Basketball/lusty_xenomorphs.dmm b/_maps/map_files/Basketball/lusty_xenomorphs.dmm index 6aa3dae075e7..0be3c0688e97 100644 --- a/_maps/map_files/Basketball/lusty_xenomorphs.dmm +++ b/_maps/map_files/Basketball/lusty_xenomorphs.dmm @@ -218,7 +218,7 @@ /turf/open/floor/engine, /area/centcom/basketball) "pu" = ( -/mob/living/simple_animal/slime/random, +/mob/living/basic/slime/random, /turf/open/floor/engine, /area/centcom/basketball) "qU" = ( @@ -529,18 +529,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/white, /area/centcom/basketball) -"Se" = ( -/obj/machinery/computer/camera_advanced/xenobio, -/turf/open/floor/iron/white, -/area/centcom/basketball) -"Tc" = ( -/obj/machinery/monkey_recycler, -/turf/open/floor/iron/white, -/area/centcom/basketball) -"Uq" = ( -/obj/machinery/processor/slime, -/turf/open/floor/iron/white, -/area/centcom/basketball) "Uv" = ( /obj/effect/decal/cleanable/xenoblood/xgibs/torso, /turf/open/floor/engine, @@ -820,7 +808,7 @@ Hu (9,1,1) = {" Hu Lu -Tc +JM ly AI LS @@ -901,7 +889,7 @@ Hu (12,1,1) = {" Hu Lu -Se +JM OB Vr Vr @@ -982,7 +970,7 @@ Hu (15,1,1) = {" Hu Lu -Uq +JM ly rU LS diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 94e420487727..c157be159a4e 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -81,13 +81,15 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/aft) "abS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology - Secure Cell Interior"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") }, -/turf/open/floor/plating/reinforced, +/obj/machinery/light/neon_lining{ + dir = 8 + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "abT" = ( /obj/machinery/computer/records/security, @@ -900,25 +902,21 @@ /area/station/maintenance/port/fore) "arJ" = ( /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 8 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door"; - req_access = list("xenobiology") +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/large, +/obj/machinery/duct, +/turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) "arL" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology, Pen 8"; - network = list("ss13","rd","xeno"); - name = "science camera"; - dir = 10 +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/machinery/light/neon_lining{ + dir = 8 }, -/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) "arN" = ( @@ -1597,7 +1595,6 @@ /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "aEh" = ( @@ -2234,19 +2231,6 @@ /obj/structure/filingcabinet/security, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"aQd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "aQt" = ( /obj/structure/cable, /obj/machinery/power/smes, @@ -3350,7 +3334,12 @@ /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "bii" = ( -/obj/machinery/processor/slime, +/obj/machinery/biomass_recycler, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "bir" = ( @@ -3913,21 +3902,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"brC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 10" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "brU" = ( /obj/machinery/computer/telecomms/server{ dir = 4; @@ -5474,19 +5448,6 @@ /obj/machinery/washing_machine, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"bQH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "bQL" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -6920,7 +6881,6 @@ "cot" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "cou" = ( @@ -7069,21 +7029,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"csD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 2" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "csE" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 4 @@ -8290,17 +8235,11 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "cOo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/corral_corner{ + mapping_id = "6" }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 7" +/obj/machinery/slime_pen_controller{ + mapping_id = "6" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -9086,13 +9025,13 @@ /area/station/ai_monitored/security/armory) "cZL" = ( /obj/machinery/newscaster/directional/south, -/obj/structure/table/glass, /obj/machinery/reagentgrinder{ pixel_y = 5 }, /obj/item/stack/sheet/mineral/plasma{ amount = 5 }, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "cZU" = ( @@ -9334,16 +9273,10 @@ /turf/open/floor/wood, /area/station/service/library/lounge) "deQ" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/light/neon_lining{ dir = 8 }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 2"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/turf/open/floor/stone, /area/station/science/xenobiology) "deW" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -9823,12 +9756,11 @@ /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "dnc" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "6"; + dir = 2 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/science/xenobiology) "dnd" = ( @@ -9977,10 +9909,7 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/effect/mapping_helpers/apc/cell_5k, -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_y = 8 - }, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron/white, /area/station/science/xenobiology) "doW" = ( @@ -10323,13 +10252,13 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation) "dwq" = ( -/obj/structure/table/glass, /obj/machinery/camera/autoname/directional/north, /obj/structure/sign/warning/biohazard/directional/north, /obj/item/wirecutters, /obj/item/screwdriver, /obj/item/storage/box/lights/mixed, /obj/item/toy/plush/slimeplushie, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "dws" = ( @@ -14963,18 +14892,6 @@ /obj/structure/sign/warning/secure_area/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"fcs" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "fcR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15595,7 +15512,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "fnK" = ( /obj/structure/disposalpipe/segment{ @@ -16335,18 +16253,6 @@ /obj/machinery/duct, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"fDu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/sign/warning/electric_shock/directional/west, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "fDB" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/item/kirbyplants/random, @@ -16467,15 +16373,9 @@ /turf/open/floor/iron/kitchen, /area/station/security/prison/mess) "fFr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 3"; - req_access = list("xenobiology") - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "fFP" = ( /obj/machinery/firealarm/directional/west, @@ -16811,15 +16711,6 @@ dir = 9 }, /area/station/service/hydroponics) -"fLw" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "fLA" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -17558,12 +17449,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"fYf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fYg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -18278,16 +18163,8 @@ /turf/open/floor/iron/dark/textured, /area/station/security/warden) "gmo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, +/mob/living/basic/slime, +/turf/open/floor/engine, /area/station/science/xenobiology) "gmC" = ( /obj/machinery/airalarm/directional/west, @@ -18460,7 +18337,13 @@ name = "Containment Blast Doors"; req_access = list("xenobiology") }, -/obj/machinery/computer/camera_advanced/xenobio, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/vacuum_pack, +/obj/item/vacuum_pack, +/obj/item/vacuum_pack, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/disk/vacuum_upgrade/biomass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "gpq" = ( @@ -19913,13 +19796,12 @@ /turf/open/floor/iron/dark, /area/station/commons/fitness) "gLB" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology, Pen 7"; - network = list("ss13","rd","xeno"); - name = "science camera"; - dir = 6 +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/obj/machinery/light/neon_lining{ + dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) "gLF" = ( @@ -20511,7 +20393,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/machinery/light/neon_lining{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "gUf" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -20779,18 +20665,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /turf/open/floor/iron/dark/textured, /area/station/service/chapel/office) -"gZg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 9" - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "gZw" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -21725,7 +21599,7 @@ /area/station/security/evidence) "hqM" = ( /obj/machinery/airalarm/directional/south, -/obj/item/kirbyplants/random, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron/white, /area/station/science/xenobiology) "hqN" = ( @@ -21768,18 +21642,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/science/server) -"hrA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/sign/warning/electric_shock/directional/east, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "hrH" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -22056,15 +21918,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/security/prison/workout) -"hvv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "hvz" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/iron/dark/smooth_large, @@ -23694,17 +23547,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/commons/locker) -"hZI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 4" - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "hZS" = ( /obj/effect/turf_decal/delivery/red, /obj/structure/cable, @@ -25144,16 +24986,10 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/port) "iwr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "4" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "iwL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25162,16 +24998,13 @@ /turf/open/floor/iron/dark, /area/station/security/prison/garden) "iwO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "4" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/slime_pen_controller{ + mapping_id = "4" }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "iwZ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -25898,17 +25731,8 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) "iJI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 4"; - req_access = list("xenobiology") +/obj/machinery/corral_corner{ + mapping_id = "1" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -26401,17 +26225,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"iRM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "iRQ" = ( /obj/effect/turf_decal/box, /obj/effect/turf_decal/stripes/corner, @@ -26520,7 +26333,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/machinery/light/neon_lining{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "iUB" = ( /turf/closed/wall/r_wall, @@ -27256,14 +27072,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"jje" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology, Pen 4"; - network = list("ss13","rd","xeno"); - name = "science camera" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jjk" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -28545,17 +28353,13 @@ /turf/open/floor/iron/dark, /area/station/security/prison) "jGx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door"; - req_access = list("xenobiology") +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "4"; + dir = 1; + pixel_y = 0 }, -/turf/open/floor/iron/large, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, /area/station/science/xenobiology) "jGA" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -28931,17 +28735,13 @@ /area/station/ai_monitored/turret_protected/aisat/atmos) "jLQ" = ( /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 8 }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/firealarm/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door"; - req_access = list("xenobiology") +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/large, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) "jLR" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -29477,19 +29277,10 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/fore) "jWq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 9"; - req_access = list("xenobiology") +/obj/machinery/light/neon_lining{ + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/stone, /area/station/science/xenobiology) "jWy" = ( /turf/closed/wall/r_wall, @@ -29582,16 +29373,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/science) "jXV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 1" - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "jYc" = ( /obj/machinery/light/small/broken/directional/west, @@ -30367,18 +30150,6 @@ "kmq" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"kmM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "kmO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -30457,7 +30228,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/xenobio, -/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "knX" = ( @@ -31360,12 +31130,11 @@ /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) "kEN" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "5"; + dir = 2 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/science/xenobiology) "kEX" = ( @@ -31721,14 +31490,12 @@ /area/station/maintenance/starboard/aft) "kLj" = ( /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 8 }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 8" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) "kLr" = ( /turf/closed/wall/r_wall, @@ -32021,13 +31788,13 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "kPJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "1" }, -/turf/open/floor/plating/reinforced, +/obj/machinery/slime_pen_controller{ + mapping_id = "1" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "kPL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32106,16 +31873,13 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "kQP" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "3" }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/slime_pen_controller{ + mapping_id = "3" }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "kQR" = ( /obj/effect/turf_decal/bot, @@ -32391,18 +32155,6 @@ /obj/item/hfr_box/core, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"kVf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 10"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "kVi" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -32431,16 +32183,11 @@ /turf/open/floor/plating, /area/station/maintenance/department/security/brig) "kVq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/duct, +/obj/machinery/light/neon_lining{ + dir = 8 }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/stone, /area/station/science/xenobiology) "kVD" = ( /obj/structure/closet/crate, @@ -33399,13 +33146,11 @@ /turf/open/floor/carpet, /area/station/hallway/secondary/entry) "lmK" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "1"; + dir = 1 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/science/xenobiology) "lmX" = ( @@ -35281,21 +35026,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"lUf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "lUr" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -36030,7 +35760,12 @@ /turf/open/floor/iron/white, /area/station/maintenance/department/science) "mhS" = ( -/obj/machinery/light/small/directional/east, +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/obj/machinery/light/neon_lining{ + dir = 4 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "mih" = ( @@ -36087,19 +35822,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/main) -"miO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "miX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/bin, @@ -36777,18 +36499,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/engineering/transit_tube) -"mtj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "mtH" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ dir = 5 @@ -36909,9 +36619,6 @@ /obj/structure/flora/tree/jungle/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) -"mvz" = ( -/turf/open/floor/circuit/green, -/area/station/science/xenobiology) "mvA" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -38488,17 +38195,13 @@ /area/station/maintenance/department/medical) "nax" = ( /obj/effect/turf_decal/stripes/line{ - dir = 9 + dir = 8 }, -/obj/machinery/firealarm/directional/south, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door"; - req_access = list("xenobiology") +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/iron/large, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) "naB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -40579,12 +40282,9 @@ /turf/open/floor/iron, /area/station/service/hydroponics) "nJb" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology, Pen 1"; - network = list("ss13","rd","xeno"); - name = "science camera" - }, -/turf/open/floor/engine, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "nJc" = ( /obj/effect/mapping_helpers/broken_floor, @@ -40898,13 +40598,12 @@ /area/station/maintenance/department/science) "nNV" = ( /obj/structure/sign/xenobio_guide/directional/north, -/obj/structure/table/glass, -/obj/item/slime_scanner, /obj/item/clothing/gloves/latex, /obj/item/clothing/glasses/science, /obj/item/experi_scanner{ pixel_x = 4 }, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "nOj" = ( @@ -41576,11 +41275,11 @@ /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "oak" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology, Pen 10"; - network = list("ss13","rd","xeno"); - name = "science camera"; - dir = 6 +/obj/machinery/corral_corner{ + mapping_id = "6" + }, +/obj/machinery/light/neon_lining{ + dir = 4 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -41599,19 +41298,6 @@ /obj/machinery/cassette/mailbox, /turf/open/floor/wood, /area/station/service/library/lounge) -"oaA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "oaC" = ( /obj/effect/turf_decal/tile/orange/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42017,7 +41703,12 @@ /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) "ohk" = ( -/obj/machinery/light/small/directional/west, +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/light/neon_lining{ + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "ohm" = ( @@ -44749,9 +44440,20 @@ /turf/open/floor/iron/dark, /area/station/security/processing) "peN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "xenobiomain"; + name = "Containment Blast Door" + }, /obj/machinery/duct, -/turf/open/floor/iron/white, +/turf/open/floor/iron/white/textured, /area/station/science/xenobiology) "peO" = ( /obj/machinery/firealarm/directional/south, @@ -45780,11 +45482,11 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "pwn" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Xenobiology, Pen 9"; - network = list("ss13","rd","xeno"); - name = "science camera"; - dir = 10 +/obj/machinery/corral_corner{ + mapping_id = "5" + }, +/obj/machinery/light/neon_lining{ + dir = 8 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -46098,16 +45800,10 @@ /turf/open/floor/carpet/purple, /area/station/security/prison/safe) "pBX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/corral_corner{ + mapping_id = "3" }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "pCb" = ( /obj/effect/spawner/random/trash/graffiti, @@ -49413,13 +49109,10 @@ /turf/open/floor/iron/dark/side, /area/station/commons/dorms) "qNL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "6" }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "qNM" = ( /obj/effect/turf_decal/stripes/line, @@ -50865,7 +50558,13 @@ /turf/open/floor/iron/textured, /area/station/maintenance/starboard/aft) "rnm" = ( -/obj/machinery/monkey_recycler, +/obj/machinery/light/directional/north, +/obj/machinery/button/door/directional/north{ + id = "xenobiomain"; + name = "Containment Blast Doors"; + req_access = list("xenobiology") + }, +/obj/machinery/computer/slime_market, /turf/open/floor/iron/white, /area/station/science/xenobiology) "rnp" = ( @@ -51000,17 +50699,11 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "rpt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/corral_corner{ + mapping_id = "5" }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 8"; - req_access = list("xenobiology") +/obj/machinery/slime_pen_controller{ + mapping_id = "5" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -51067,17 +50760,8 @@ /area/station/ai_monitored/turret_protected/aisat/atmos) "rpP" = ( /obj/machinery/camera/autoname/directional/north, -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/folder/white{ - pixel_y = 4 - }, -/obj/item/pen{ - pixel_y = 4 - }, /obj/structure/sign/warning/biohazard/directional/north, +/obj/machinery/slime_market_pad, /turf/open/floor/iron/white, /area/station/science/xenobiology) "rpT" = ( @@ -52152,13 +51836,9 @@ /turf/open/floor/plating, /area/station/security/prison/garden) "rHD" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology, Pen 6"; - network = list("ss13","rd","xeno"); - name = "science camera"; - dir = 6 +/obj/machinery/light/neon_lining{ + dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) "rHG" = ( @@ -52236,6 +51916,9 @@ network = list("ss13","rd","xeno"); name = "science camera" }, +/obj/machinery/light/neon_lining{ + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "rIR" = ( @@ -52283,7 +51966,6 @@ /area/station/maintenance/starboard/aft) "rJM" = ( /obj/machinery/firealarm/directional/north, -/obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma{ pixel_x = -6; pixel_y = 6 @@ -52305,6 +51987,7 @@ /obj/item/reagent_containers/dropper{ pixel_y = -4 }, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "rKd" = ( @@ -52943,19 +52626,6 @@ /obj/effect/spawner/random/structure/chair_maintenance, /turf/open/floor/plating/airless, /area/space/nearstation) -"rWh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "rWp" = ( /obj/structure/chair, /obj/effect/landmark/start/shaft_miner, @@ -53601,14 +53271,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) -"siS" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology, Pen 2"; - network = list("ss13","rd","xeno"); - name = "science camera" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "sjk" = ( /obj/effect/decal/cleanable/cobweb, /obj/structure/closet/emcloset, @@ -53930,7 +53592,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "soB" = ( @@ -54373,7 +54034,6 @@ }, /area/station/command/gateway) "sxx" = ( -/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "sxJ" = ( @@ -55981,21 +55641,6 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"taz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 1"; - req_access = list("xenobiology") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "taA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56343,7 +55988,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/machinery/light/neon_lining{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "tgq" = ( /obj/machinery/door/firedoor/border_only{ @@ -56902,18 +56551,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"trf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/sign/warning/electric_shock/directional/west, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "trg" = ( /obj/machinery/light/small/directional/north, /obj/structure/dresser, @@ -58395,15 +58032,15 @@ /turf/open/floor/iron/white, /area/station/science/research) "tSd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/camera/directional/east{ + c_tag = "Xeniobiology - Xenobiology Computers"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 7"; - req_access = list("xenobiology") +/obj/machinery/light/neon_lining{ + dir = 4 }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/turf/open/floor/engine, /area/station/science/xenobiology) "tSx" = ( /obj/structure/table, @@ -58549,13 +58186,8 @@ /turf/open/floor/iron, /area/station/cargo/warehouse) "tVD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/turf/open/floor/plating/reinforced, +/obj/machinery/duct, +/turf/open/floor/engine, /area/station/science/xenobiology) "tVM" = ( /obj/effect/turf_decal/stripes/line{ @@ -58671,17 +58303,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) -"tXO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "tXP" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -59206,21 +58827,6 @@ /obj/effect/landmark/navigate_destination/eva, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/command/storage/eva) -"ugI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 6" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ugN" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -60357,18 +59963,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"uyX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/structure/sign/warning/electric_shock/directional/east, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "uze" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60942,13 +60536,13 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "uKL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "2" }, -/turf/open/floor/plating/reinforced, +/obj/machinery/slime_pen_controller{ + mapping_id = "2" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "uKO" = ( /obj/effect/decal/cleanable/dirt, @@ -61389,12 +60983,12 @@ /turf/open/floor/iron/dark/textured, /area/station/command/gateway) "uRW" = ( -/obj/structure/chair/comfy/black{ +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "3"; dir = 1 }, -/obj/effect/landmark/start/scientist, -/obj/machinery/duct, -/turf/open/floor/iron/white, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, /area/station/science/xenobiology) "uSp" = ( /obj/effect/landmark/generic_maintenance_landmark, @@ -61926,13 +61520,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 5" +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, +/turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) "vaO" = ( /obj/structure/table/wood, @@ -62015,12 +61606,11 @@ /turf/open/floor/iron/dark, /area/station/security/office) "vbB" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science - Xenobiology, Pen 3"; - network = list("ss13","rd","xeno"); - name = "science camera" +/obj/machinery/duct, +/obj/machinery/light/neon_lining{ + dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/stone, /area/station/science/xenobiology) "vbD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62710,7 +62300,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/machinery/light/neon_lining{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "vmA" = ( /obj/structure/reagent_dispensers/fueltank, @@ -62722,10 +62315,6 @@ /obj/item/toy/plush/slimeplushie, /turf/open/floor/wood, /area/station/maintenance/starboard/fore) -"vmU" = ( -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "vmV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -63038,13 +62627,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "vse" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "2"; + dir = 1 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/science/xenobiology) "vsk" = ( @@ -64172,19 +63759,6 @@ /obj/effect/landmark/start/cook, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"vOh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "vOj" = ( /obj/effect/turf_decal/box, /obj/machinery/portable_atmospherics/pump, @@ -64688,18 +64262,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"vVI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - name = "Containment Pen 6"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/large, -/area/station/science/xenobiology) "vVN" = ( /obj/effect/turf_decal/tile/green/half/contrasted, /obj/machinery/newscaster/directional/north, @@ -65195,7 +64757,6 @@ "wgd" = ( /obj/machinery/light/directional/south, /obj/item/radio/intercom/directional/south, -/obj/structure/table/glass, /obj/structure/microscope{ pixel_x = -1; pixel_y = 2 @@ -65208,6 +64769,7 @@ pixel_x = 14; pixel_y = 4 }, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "wgn" = ( @@ -65243,27 +64805,9 @@ /obj/item/extinguisher, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"wgN" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "wgR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen 3" +/obj/machinery/corral_corner{ + mapping_id = "2" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -65830,13 +65374,13 @@ receive_ore_updates = 1; supplies_requestable = 1 }, -/obj/structure/table/glass, /obj/item/book/manual/wiki/cytology{ pixel_x = -4; pixel_y = 4 }, /obj/item/book/manual/wiki/plumbing, /obj/item/storage/box/petridish, +/obj/structure/table/reinforced/plasmarglass, /turf/open/floor/iron/white, /area/station/science/xenobiology) "wrx" = ( @@ -66472,15 +66016,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, /area/station/security/execution) -"wDL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "wDM" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -66509,11 +66044,9 @@ /obj/item/storage/box/syringes{ pixel_y = 5 }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 2; - pixel_y = -2 +/obj/machinery/reagentgrinder{ + pixel_y = 8 }, -/obj/item/storage/box/monkeycubes, /turf/open/floor/iron/white, /area/station/science/xenobiology) "wEs" = ( @@ -66879,10 +66412,6 @@ dir = 6 }, /area/station/commons/dorms) -"wKd" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/circuit/green, -/area/station/science/xenobiology) "wKg" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/effect/spawner/random/maintenance/two, @@ -67290,18 +66819,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible/layer4, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"wQh" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/reinforced, -/area/station/science/xenobiology) "wQk" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -67371,11 +66888,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"wRH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) "wRJ" = ( /obj/effect/turf_decal/box, /obj/machinery/holopad, @@ -67398,7 +66910,9 @@ /turf/closed/wall, /area/station/maintenance/starboard/fore) "wSl" = ( -/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/light/neon_lining{ + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "wSn" = ( @@ -68775,7 +68289,6 @@ /area/station/tcommsat/server) "xsC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology) "xsR" = ( @@ -69104,7 +68617,6 @@ /area/station/engineering/storage/tech) "xxX" = ( /obj/machinery/light/small/directional/east, -/obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "xyc" = ( @@ -70158,7 +69670,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "xRO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71235,13 +70748,10 @@ /turf/open/floor/iron/dark, /area/station/hallway/primary/central) "yiC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "5" }, -/turf/open/floor/plating/reinforced, +/turf/open/floor/engine, /area/station/science/xenobiology) "yiI" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -112704,7 +112214,7 @@ hOU hOU hOU xxX -wRH +gXk cDv oMK oMK @@ -113203,20 +112713,20 @@ tdv aaN cDv pwn -ohk -dYt +wSl +abS +wSl +pwn arL -ohk -dYt wSl -ohk -rIN wSl +rIN +arL ohk -jje +wSl +abS wSl ohk -nJb wtF xsC xsC @@ -113460,23 +112970,23 @@ ajt mCg cDv dYt -mvz dYt -wSl -mvz +gmo +dYt +dYt +dYt +dYt +dYt dYt -wSl -mvz dYt -wSl -wKd dYt -wSl -mvz +dYt +gmo +dYt dYt wtF dwq -vmU +bIc bIc dzj bIc @@ -113719,21 +113229,21 @@ cDv dYt dYt kEN -wSl -dYt -kEN -wSl +tVD +tVD +tVD +tVD +uRW dYt -kEN -lmK dYt dYt +tVD lmK dYt dYt wtF gpi -uRW +wPA rph xTL lNG @@ -113974,23 +113484,23 @@ sfh gzR wtF yiC -jWq -wQh -hvv +dYt +dYt +dYt rpt pBX -wgN -lUf -mtj +tVD +dYt +dYt kQP iJI tVD -kVq -taz +dYt +dYt kPJ wtF nNV -peN +rph rph dzj bIc @@ -114230,26 +113740,26 @@ ntI sfh jKn wtF -jGx -gZg -trf -oaA kLj -trf +kLj +kLj +kLj +kLj +kLj arJ vaG -tXO -fDu -hZI -bQH -fDu -jXV -aQd +kLj +kLj +kLj +arJ +kLj +kLj +kLj wtF rJM -peN +rph bIc -dzj +fFr doR sEO sEO @@ -114487,26 +113997,26 @@ qpO sfh eTt gOv -bIc -dzj -bIc +deQ +deQ +deQ vmu -bIc -bIc -bIc -dzj -bIc -bIc -bIc +deQ +deQ +kVq +deQ +deQ +deQ +deQ tgl -bIc -dzj -bIc +deQ +deQ +deQ gOv bIc -fYf +gAj eTt -dzj +fFr cTs sEO gTp @@ -114759,12 +114269,12 @@ xRJ xRJ fnI xRJ -bXQ -xRJ +peN +qjq qjq rYV hyd -hyd +nJb vhh sos cot @@ -115001,26 +114511,26 @@ iqb feY lNG gOv -bIc -dzj -bIc +jWq +jWq +jWq iUz -bIc -bIc -bIc -dzj -bIc -bIc -bIc +jWq +jWq +vbB +jWq +jWq +jWq +jWq gTL -bIc -dzj -bIc +jWq +jWq +jWq gOv bIc gAj lNG -dzj +fFr lns sEO wgM @@ -115259,25 +114769,25 @@ mIP jZt wtF jLQ -kVf -uyX -miO -tSd -uyX -iRM -vVI -vOh -hrA -fFr -rWh -hrA -deQ +kLj +kLj +kLj +kLj +kLj +arJ +vaG +kLj +kLj +kLj +arJ +kLj +kLj nax wtF -rnm -ifN bIc -dzj +ifN +jXV +fFr hqM sEO sEO @@ -115516,19 +115026,19 @@ xTL bHS wtF qNL -brC -gmo -abS +dYt +dYt +dYt cOo iwr -kmM -ugI -fLw +tVD +dYt +dYt iwO wgR -wDL -fcs -csD +tVD +dYt +dYt uKL wtF wDY @@ -115775,21 +115285,21 @@ cDv dYt dYt dnc -wSl -dYt -dnc -vse -dYt +tVD +tVD +tVD +tVD +jGx dYt -vse dYt dYt +tVD vse dYt dYt wtF -gpi -wPA +rnm +bIc ifN qds eTt @@ -116030,19 +115540,19 @@ iIy uio cDv dYt -mvz dYt -wSl -mvz +gmo +dYt +dYt +dYt dYt -wSl -wKd dYt -wSl -wKd dYt -wSl -mvz +dYt +dYt +dYt +gmo +dYt dYt wtF rpP @@ -116287,20 +115797,20 @@ dmt rGH cDv oak -mhS -dYt +rHD +tSd +rHD +oak gLB -mhS -dYt rHD +tSd +rHD +gLB mhS -dYt -wSl -mhS -vbB -wSl +rHD +tSd +rHD mhS -siS wtF bIc bIc diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index a74120117135..ad46d78631c0 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -235,8 +235,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/stone, /area/station/science/xenobiology) "acG" = ( /obj/structure/table/reinforced, @@ -2627,6 +2631,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"aDe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/stone, +/area/station/science/xenobiology) "aDg" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/crate{ @@ -2644,14 +2655,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "aDR" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno4"; - name = "Containment Control"; - req_access = list("xenobiology") +/obj/machinery/corral_corner{ + mapping_id = "1" }, -/turf/open/floor/iron, +/obj/machinery/slime_pen_controller{ + mapping_id = "1" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "aDZ" = ( /obj/machinery/door/firedoor, @@ -4872,21 +4882,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"bgH" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xeno2"; - name = "Creature Cell #2" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "bgK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -5474,17 +5469,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/command/gateway) -"bnd" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno3"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "bnt" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -7228,21 +7212,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"bIh" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno4"; - name = "Creature Cell #4" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "bIk" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -8662,18 +8631,6 @@ }, /turf/open/floor/carpet/blue, /area/station/commons/dorms) -"bXL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "bXX" = ( /obj/structure/bookcase/random/fiction, /obj/effect/turf_decal/siding/wood{ @@ -10378,18 +10335,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"csY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology - Cell 8"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "ctw" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=engi1"; @@ -10414,11 +10359,6 @@ /obj/effect/turf_decal/trimline/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"ctW" = ( -/obj/structure/cable, -/mob/living/simple_animal/slime, -/turf/open/floor/circuit/green, -/area/station/science/xenobiology) "cug" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -11435,15 +11375,6 @@ /obj/effect/landmark/navigate_destination/incinerator, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"cGA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno6"; - name = "Creature Cell #6" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "cGJ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -12721,6 +12652,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "cYh" = ( @@ -12961,15 +12896,6 @@ }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"dbo" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white/textured, -/area/station/science/xenobiology) "dbw" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -13155,9 +13081,8 @@ /turf/open/floor/iron, /area/station/security/checkpoint/escape) "ddW" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/turf/open/floor/iron/dark, +/obj/machinery/camera/directional/west, +/turf/open/floor/engine, /area/station/science/xenobiology) "dea" = ( /obj/structure/table, @@ -14363,15 +14288,13 @@ /turf/open/floor/iron, /area/station/science/circuits) "duq" = ( -/obj/structure/disposaloutlet{ +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "1"; dir = 1 }, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/turf/open/floor/iron/dark, +/obj/machinery/light/floor/has_bulb, +/mob/living/basic/slime, +/turf/open/floor/engine, /area/station/science/xenobiology) "dux" = ( /obj/structure/table, @@ -14711,11 +14634,8 @@ /area/station/security/brig) "dxU" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white/textured, +/obj/machinery/duct, +/turf/open/floor/glass/reinforced, /area/station/science/xenobiology) "dxV" = ( /obj/effect/decal/cleanable/dirt, @@ -15654,18 +15574,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, /turf/open/floor/iron, /area/station/engineering/break_room) -"dLh" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology - Cell 3"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "dLq" = ( /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -16842,11 +16750,13 @@ /area/station/service/kitchen) "eaO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, +/obj/structure/cable, +/turf/open/floor/stone, /area/station/science/xenobiology) "eaQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18207,10 +18117,12 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "esm" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/turf/open/floor/iron/dark, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "4" + }, +/obj/machinery/light/floor/has_bulb, +/mob/living/basic/slime, +/turf/open/floor/engine, /area/station/science/xenobiology) "eso" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning, @@ -18513,6 +18425,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"evj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "evp" = ( /obj/machinery/computer/records/medical{ dir = 8 @@ -22622,6 +22541,8 @@ }, /obj/item/storage/box/petridish, /obj/effect/turf_decal/siding/purple, +/obj/item/vacuum_pack, +/obj/item/vacuum_pack, /turf/open/floor/iron, /area/station/science/xenobiology) "fva" = ( @@ -22974,6 +22895,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "fzv" = ( @@ -23673,6 +23597,8 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/disk/vacuum_upgrade/biomass, /turf/open/floor/iron, /area/station/science/xenobiology) "fIY" = ( @@ -23906,9 +23832,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) "fMl" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, +/turf/open/floor/engine, /area/station/science/xenobiology) "fMn" = ( /obj/effect/turf_decal/tile/neutral{ @@ -24030,22 +23954,11 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/iron/dark, /area/station/security/office) -"fNY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno3"; - name = "Creature Cell #3" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "fOp" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 4 +/obj/machinery/corral_corner{ + mapping_id = "3" }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, +/turf/open/floor/engine, /area/station/science/xenobiology) "fOw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -24937,6 +24850,13 @@ /obj/structure/sink/directional/south, /turf/open/floor/iron/dark, /area/station/science/genetics) +"fZo" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fZp" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -25060,21 +24980,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"gbj" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno3"; - name = "Creature Cell #3" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "gbo" = ( /obj/machinery/airalarm/directional/south, /obj/structure/table/wood, @@ -25620,15 +25525,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) -"ghQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xeno1"; - name = "Creature Cell #1" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "ghU" = ( /obj/structure/rack, /obj/item/book/manual/wiki/engineering_hacking{ @@ -26883,6 +26779,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"gvX" = ( +/obj/machinery/duct, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gwd" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/dark_blue/fourcorners, @@ -27473,16 +27373,6 @@ /obj/structure/displaycase_chassis, /turf/open/floor/wood/large, /area/station/service/library/abandoned) -"gDU" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno7"; - name = "Creature Cell #7" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "gDV" = ( /turf/closed/wall, /area/station/service/library/lounge) @@ -27538,16 +27428,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"gED" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno1"; - name = "Creature Cell #1" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "gEF" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -29118,15 +28998,6 @@ }, /turf/open/space/basic, /area/space) -"gZx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno8"; - name = "Creature Cell #8" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "gZz" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -31489,14 +31360,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) -"hFS" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white/textured, -/area/station/science/xenobiology) "hFZ" = ( /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/syringe/antiviral, @@ -32015,7 +31878,6 @@ name = "xenobiology camera"; network = list("ss13","xeno","rd") }, -/obj/structure/chair/office/light, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /obj/machinery/newscaster/directional/east, /turf/open/floor/iron, @@ -34532,6 +34394,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/storage) +"irh" = ( +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "irl" = ( /turf/closed/wall/r_wall, /area/station/service/lawoffice) @@ -36070,6 +35939,10 @@ "iLr" = ( /turf/closed/wall, /area/station/service/theater/abandoned) +"iLv" = ( +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iLB" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -36838,21 +36711,6 @@ }, /turf/open/floor/iron, /area/station/cargo/quartermaster) -"iWX" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xeno1"; - name = "Creature Cell #1" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "iXc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38880,16 +38738,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"juv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno4"; - name = "Creature Cell #4" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "juC" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -40269,17 +40117,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"jKZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno7"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jLa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green{ @@ -40466,15 +40303,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "jNn" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno8"; - name = "Containment Control"; - req_access = list("xenobiology") +/obj/machinery/corral_corner{ + mapping_id = "3" }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +/obj/machinery/slime_pen_controller{ + mapping_id = "3" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "jNx" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -43728,15 +43563,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/fore) -"kBO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xeno2"; - name = "Creature Cell #2" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "kBR" = ( /obj/machinery/door/window{ dir = 8; @@ -45041,14 +44867,6 @@ "kSu" = ( /turf/closed/wall, /area/station/command/teleporter) -"kSA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/science/xenobiology) "kSB" = ( /obj/machinery/portable_atmospherics/canister, /obj/machinery/light/small/directional/west, @@ -45298,13 +45116,6 @@ /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/service/kitchen/abandoned) -"kWi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "kWv" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45499,16 +45310,6 @@ "kYn" = ( /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den/gaming) -"kYq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno5"; - name = "Creature Cell #5" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "kYu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -45665,6 +45466,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"laX" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Xeniobiology - Xenobiology Computers"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "lbi" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/curved/flipped{ @@ -45843,9 +45652,11 @@ /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/captain) "lcK" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "lcO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -49656,13 +49467,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"lYw" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "lYJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -49837,13 +49641,10 @@ /turf/open/floor/iron, /area/station/medical/pathology) "mca" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, +/turf/open/floor/stone, /area/station/science/xenobiology) "mck" = ( /obj/structure/chair/office, @@ -51353,6 +51154,7 @@ dir = 8 }, /obj/effect/landmark/start/hangover, +/obj/machinery/slime_extract_requestor, /turf/open/floor/iron/white, /area/station/science/lobby) "muW" = ( @@ -53514,8 +53316,8 @@ /turf/open/floor/grass, /area/station/medical/psychology) "mVe" = ( -/obj/machinery/processor/slime, /obj/effect/turf_decal/bot_red, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "mVi" = ( @@ -53620,16 +53422,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) -"mWy" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno2"; - name = "Creature Cell #2" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "mWB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -53832,16 +53624,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port) -"mZd" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) "mZj" = ( /obj/machinery/atmospherics/components/trinary/mixer{ color = "#FFFF00"; @@ -54015,17 +53797,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/warden) -"nbo" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno2"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "nbv" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -54138,15 +53909,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) -"ncJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno4"; - name = "Creature Cell #4" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "ncQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54292,18 +54054,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"nfT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology - Cell 6"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nfX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -54595,20 +54345,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"nkj" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno6"; - name = "Creature Cell #6" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nkn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -55461,11 +55197,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"nwV" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/secure_area/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nwW" = ( /obj/structure/sign/nanotrasen{ pixel_x = -32 @@ -55756,12 +55487,6 @@ }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"nzt" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "nzw" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, @@ -56915,25 +56640,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"nNR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno5"; - name = "Creature Cell #5" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) -"nNT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno6"; - name = "Creature Cell #6" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "nNU" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/firealarm/directional/south, @@ -57792,13 +57498,10 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nYS" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") +/obj/machinery/corral_corner{ + mapping_id = "1" }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +/turf/open/floor/engine, /area/station/science/xenobiology) "nYV" = ( /obj/effect/turf_decal/tile/yellow{ @@ -58896,6 +58599,13 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"omu" = ( +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "omv" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -59612,17 +59322,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"oyp" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno6"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) "oyy" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -61017,6 +60716,14 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical/medsci) +"oQS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "oRk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -62084,6 +61791,13 @@ /obj/structure/closet/l3closet/virology, /turf/open/floor/iron/white, /area/station/medical/pathology) +"pff" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "pfh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62617,15 +62331,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/main) -"pla" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno7"; - name = "Creature Cell #7" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "plh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62722,18 +62427,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"pmw" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology - Cell 1"; - name = "xenobiology camera"; - network = list("ss13","xeno","rd") - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "pmz" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -63714,6 +63407,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pAi" = ( +/obj/structure/cable, +/obj/machinery/duct, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) "pAs" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -63842,16 +63541,6 @@ /obj/machinery/atm, /turf/open/floor/iron, /area/station/cargo/lobby) -"pBB" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno3"; - name = "Creature Cell #3" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "pBH" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -63966,14 +63655,12 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "pDf" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, /obj/structure/sign/xenobio_guide/directional/south, +/obj/machinery/slime_market_pad, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "pDi" = ( @@ -64013,6 +63700,10 @@ /area/station/engineering/atmos) "pDM" = ( /obj/structure/cable, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "pDS" = ( @@ -65176,12 +64867,13 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "pQz" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 4 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "2"; + dir = 1 }, -/turf/open/floor/iron/dark, +/obj/machinery/light/floor/has_bulb, +/mob/living/basic/slime, +/turf/open/floor/engine, /area/station/science/xenobiology) "pQN" = ( /obj/machinery/duct, @@ -65247,13 +64939,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"pRz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "pRG" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -65814,17 +65499,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den/gaming) -"pWL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "pWO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -67377,16 +67051,6 @@ /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"qrU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/science/xenobiology) "qrY" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -69702,6 +69366,12 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"qUa" = ( +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "qUi" = ( /obj/structure/disposalpipe/sorting/mail{ name = "Engineering Junction" @@ -70571,18 +70241,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) -"rhi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "rhw" = ( /obj/structure/chair/office/light{ dir = 8 @@ -73244,11 +72902,13 @@ /turf/open/floor/plating, /area/station/science/research) "rOY" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "4" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "rPc" = ( /obj/effect/turf_decal/stripes/line{ @@ -73741,20 +73401,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"rUl" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno8"; - name = "Creature Cell #8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "rUn" = ( /obj/structure/sign/departments/science/directional/west, /obj/effect/turf_decal/tile/purple{ @@ -74676,10 +74322,6 @@ }, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) -"shO" = ( -/obj/structure/cable, -/turf/open/floor/circuit/green, -/area/station/science/xenobiology) "shP" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -75726,13 +75368,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"svD" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "svI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -76192,16 +75827,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos/mix) -"sBt" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "xeno8"; - name = "Creature Cell #8" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "sBE" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/stripes/line{ @@ -78256,12 +77881,12 @@ /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) "sZi" = ( -/obj/machinery/smartfridge/extract/preloaded, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 }, /obj/machinery/light/directional/south, +/obj/machinery/computer/slime_market, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "sZn" = ( @@ -78347,8 +77972,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, /area/station/science/xenobiology) "taL" = ( /obj/structure/table/wood, @@ -78500,6 +78125,13 @@ }, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) +"tcQ" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/xenobiology) "tcT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -79343,6 +78975,11 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"tpS" = ( +/obj/structure/cable, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) "tpZ" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) @@ -80488,9 +80125,6 @@ /turf/open/floor/iron/large, /area/station/science/research) "tDG" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -80507,6 +80141,7 @@ pixel_x = -6; req_access = list("science") }, +/obj/machinery/smartfridge/extract/preloaded, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "tDK" = ( @@ -81099,10 +80734,7 @@ /area/station/medical/medbay) "tLp" = ( /obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, +/turf/open/floor/glass/reinforced, /area/station/science/xenobiology) "tLx" = ( /obj/structure/cable, @@ -83592,16 +83224,6 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"uoY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white/textured_large, -/area/station/science/xenobiology) "upe" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/stripes/line{ @@ -83742,18 +83364,6 @@ "urt" = ( /turf/closed/wall/r_wall, /area/station/science/circuits) -"urx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "urH" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, @@ -84326,11 +83936,6 @@ /obj/machinery/vending/dinnerware, /turf/open/floor/iron/dark, /area/station/service/kitchen) -"uyy" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/warning/secure_area/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "uyB" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -84776,15 +84381,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall, /area/station/service/chapel/funeral) -"uDQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/xenobiology) "uDR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -85886,6 +85482,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/storage) +"uSs" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "uSL" = ( /obj/effect/turf_decal/box/white{ color = "#9FED58" @@ -90180,13 +89784,13 @@ /turf/open/floor/plating, /area/station/cargo/drone_bay) "vVD" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/machinery/corral_corner{ + mapping_id = "2" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +/obj/machinery/slime_pen_controller{ + mapping_id = "2" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "vVH" = ( /obj/effect/turf_decal/tile/yellow{ @@ -91889,17 +91493,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"wox" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "xeno5"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron, -/area/station/science/xenobiology) "woB" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -92241,8 +91834,13 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "wsd" = ( -/obj/machinery/monkey_recycler, /obj/effect/turf_decal/bot_red, +/obj/machinery/biomass_recycler, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "wse" = ( @@ -92354,6 +91952,12 @@ }, /turf/open/floor/iron/dark, /area/station/service/theater) +"wts" = ( +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "wtv" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -92780,6 +92384,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wxz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "wxF" = ( /obj/structure/chair/office, /obj/structure/sign/poster/random/directional/north, @@ -93501,17 +93113,6 @@ }, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"wFX" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/button/door{ - id = "xeno1"; - name = "Containment Control"; - req_access = list("xenobiology") - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "wGa" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -96174,15 +95775,12 @@ /turf/open/floor/iron/dark, /area/station/science/xenobiology) "xsN" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "3" }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/turf/open/floor/iron/dark, +/obj/machinery/light/floor/has_bulb, +/mob/living/basic/slime, +/turf/open/floor/engine, /area/station/science/xenobiology) "xsP" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -96689,13 +96287,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"xzo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "xzq" = ( /obj/structure/table/reinforced, /obj/item/computer_disk/ordnance{ @@ -97100,7 +96691,6 @@ /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) "xDz" = ( -/obj/structure/chair/office/light, /obj/structure/sign/warning/secure_area/directional/west, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -99058,20 +98648,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"ycY" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno5"; - name = "Creature Cell #5" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "ydb" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/red{ @@ -99345,20 +98921,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/cargo/lobby) -"ygV" = ( -/obj/machinery/door/window/brigdoor{ - name = "Creature Pen"; - req_access = list("research") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xeno7"; - name = "Creature Cell #7" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/xenobiology) "ygW" = ( /obj/machinery/vending/hydroseeds, /obj/effect/turf_decal/bot, @@ -120991,18 +120553,18 @@ qZb dhB gwK pTC -nzt -nwV -lYw -ncJ +nYS +fMl +ddW +fMl aDR -jKx -rTW +oQS +tpS taA jNn -gZx +fMl ddW -nwV +fMl fOp mAt ifk @@ -121248,19 +120810,19 @@ uTb hHK kGj mQO +iLv fMl -shO fMl -bIh -nYS -rhi +fMl +fMl +oQS tLp -pWL -mZd -rUl +taA +fMl fMl -ctW fMl +fMl +iLv oVW oUe jET @@ -121505,19 +121067,19 @@ qZb feF gcr pTC -kWi -sfN +iLv +gvX duq -juv -vVD -eaO -uoY -acD -rOY -sBt +fMl +fMl +oQS +tLp +taA +fMl +fMl xsN -sfN -csY +gvX +iLv mAt aAx nxt @@ -121762,19 +121324,19 @@ pTC hhS iQF pTC -svD -lcK -pQz -fNY -bnd -eaO -hFS -acD -jKZ -pla -esm -lcK -mca +iLv +gvX +fMl +fMl +fMl +oQS +tLp +taA +fMl +fMl +fMl +gvX +iLv mAt xIw pVk @@ -122019,19 +121581,19 @@ pTC hWk gcr mQO +tcQ +gvX fMl -shO fMl -gbj nYS -uDQ -dxU -kSA -mZd -ygV +oQS +tLp +taA +fOp fMl -shO fMl +gvX +fZo oVW wFP pKd @@ -122276,19 +121838,19 @@ pTC ezY iQF pTC -dLh -sfN -duq -pBB -vVD +evj +uSs +uSs +uSs +uSs eaO dxU acD -rOY -gDU -xsN -sfN -pRz +uSs +uSs +uSs +uSs +evj mAt udV qYr @@ -122533,19 +122095,19 @@ pTC elH iQF pTC -svD +pff lcK -pQz -kBO -nbo -eaO +mca +mca +mca +wxz dxU -acD -oyp -cGA -esm -lcK +aDe +mca mca +mca +lcK +pff mAt ilU qYr @@ -122790,19 +122352,19 @@ pTC eDZ rrU mQO +irh +gvX fMl -shO fMl -bgH -nYS -uDQ +wts +oQS dxU -kSA -mZd -nkj +taA +qUa fMl -ctW fMl +gvX +omu oVW fmi qYr @@ -123047,19 +122609,19 @@ pTC woj qcM pTC -kWi -sfN -duq -mWy -vVD -eaO -dbo -acD -rOY -nNT -xsN -sfN -nfT +iLv +gvX +fMl +fMl +fMl +oQS +dxU +taA +fMl +fMl +fMl +gvX +iLv mAt kzt xQq @@ -123304,19 +122866,19 @@ pTC woj rrU pTC -svD -lcK +iLv +gvX pQz -ghQ -wFX -eaO -qrU -acD -wox -nNR +fMl +fMl +oQS +dxU +taA +fMl +fMl esm -lcK -mca +gvX +iLv mAt cZl mPF @@ -123561,19 +123123,19 @@ pTC eDZ rwI mQO +iLv fMl -ctW fMl -iWX -nYS -bXL -xzo -urx -mZd -ycY fMl -shO fMl +oQS +dxU +taA +fMl +fMl +fMl +fMl +iLv oVW oTD dOO @@ -123818,19 +123380,19 @@ pTC aMM fwJ pTC -pmw -uyy -duq -gED +wts +fMl +laX +fMl vVD -jKx -rTW +oQS +pAi taA rOY -kYq -xsN -uyy -pRz +fMl +laX +fMl +qUa mAt iIn srI diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index af37b013b6a6..654803b415a7 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -176,13 +176,6 @@ /obj/effect/turf_decal/tile/green, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"aey" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Pens - Starboard Fore"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "aez" = ( /obj/structure/table, /obj/item/clothing/mask/gas, @@ -1048,17 +1041,6 @@ /obj/item/storage/crayons, /turf/open/floor/iron, /area/station/commons/dorms) -"asb" = ( -/obj/structure/sink/directional/west, -/obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "xenobio10"; - layer = 4; - name = "Xenobio Pen 10 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "asg" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, @@ -1138,6 +1120,14 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central) +"atw" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Xeniobiology - Xenobiology Computers"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aty" = ( /obj/structure/urinal/directional/north, /obj/effect/landmark/start/hangover, @@ -1429,13 +1419,6 @@ }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain) -"axD" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "axF" = ( /obj/effect/spawner/random/structure/billboard/nanotrasen, /turf/open/lava/plasma/ice_moon, @@ -1881,15 +1864,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/mine/laborcamp) -"aHz" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "aHC" = ( /obj/machinery/light/directional/south, /obj/machinery/power/apc/auto_name/directional/south, @@ -1990,6 +1964,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"aIV" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "1" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aJh" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron, @@ -2123,15 +2106,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"aLA" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "aLJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -2686,6 +2660,10 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"aUq" = ( +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aUr" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2907,7 +2885,6 @@ /area/station/ai_monitored/turret_protected/aisat/hallway) "aXY" = ( /obj/structure/rack, -/obj/item/circuitboard/machine/monkey_recycler, /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/fore) @@ -3674,19 +3651,6 @@ /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/smooth_large, /area/station/security/checkpoint/medical) -"bjn" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 11"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio11"; - name = "Xenobio Pen 11 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "bjp" = ( /turf/open/floor/iron/dark/textured_edge{ dir = 4 @@ -3907,19 +3871,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) -"bnh" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "bnl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5433,17 +5384,6 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"bKI" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "bKN" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -5659,6 +5599,11 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"bOq" = ( +/obj/structure/railing, +/obj/machinery/slime_extract_requestor, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "bOu" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -6064,17 +6009,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "bUK" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "5" }, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 5"; - req_access = list("xenobiology") +/obj/machinery/slime_pen_controller{ + mapping_id = "5" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -7185,14 +7124,7 @@ /turf/open/floor/iron, /area/station/science/ordnance/testlab) "clW" = ( -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "xenobio1"; - layer = 4; - name = "Xenobio Pen 1 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, +/turf/open/floor/stone, /area/station/science/xenobiology) "cma" = ( /obj/structure/closet/firecloset, @@ -7910,9 +7842,13 @@ /turf/open/floor/wood, /area/station/maintenance/port/aft) "cyh" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/obj/machinery/light/floor/has_bulb, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "cyo" = ( /obj/machinery/stasis{ @@ -8821,8 +8757,10 @@ /turf/open/floor/iron/dark/side, /area/station/security/processing) "cKA" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - pixel_y = 2 +/obj/machinery/camera/directional/west{ + c_tag = "Xenobiology - Secure Cell Interior"; + name = "xenobiology camera"; + network = list("ss13","xeno","rd") }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -9060,18 +8998,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"cNI" = ( -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, -/area/station/science/xenobiology) "cNQ" = ( /obj/structure/closet/wardrobe/grey, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9627,20 +9553,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"cXX" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 11"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "cXZ" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -10567,15 +10479,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "dmj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/button/door/directional/east{ - id = "xenobio11"; - layer = 4; - name = "Xenobio Pen 11 Blast DOors"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "dms" = ( /obj/structure/closet/crate, @@ -10710,15 +10615,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"doK" = ( -/obj/machinery/button/door/directional/east{ - id = "xenobio8"; - layer = 4; - name = "Xenobio Pen 8 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "doT" = ( /obj/item/hand_labeler, /obj/item/assembly/timer, @@ -11932,19 +11828,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"dIS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, -/area/station/science/xenobiology) "dIZ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 @@ -11954,13 +11837,13 @@ /turf/open/floor/iron/dark, /area/station/medical/pathology) "dJx" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "3" }, -/turf/open/floor/plating, +/obj/machinery/slime_pen_controller{ + mapping_id = "3" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "dJy" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ @@ -12070,12 +11953,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "dLr" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/disposaloutlet{ - dir = 4 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "4"; + dir = 1; + pixel_y = 0 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -12299,16 +12180,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"dPy" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Kill Chamber"; - network = list("ss13","rd","xeno") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "dPP" = ( /obj/structure/closet/toolcloset, /turf/open/floor/plating, @@ -12353,20 +12224,6 @@ /obj/structure/sign/departments/rndserver/directional/south, /turf/open/floor/iron/white, /area/station/science/research) -"dQZ" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 9"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "dRc" = ( /obj/structure/table, /obj/machinery/firealarm/directional/west, @@ -14874,7 +14731,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/floor/iron/freezer, +/turf/closed/wall/r_wall, /area/station/science/xenobiology) "eGW" = ( /obj/effect/turf_decal/tile/red{ @@ -15796,21 +15653,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"eWh" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 2"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "eWi" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/landmark/event_spawn, @@ -16298,10 +16140,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/chapel) -"ffz" = ( -/obj/machinery/processor/slime, -/turf/open/floor/iron, -/area/station/science/xenobiology) "ffQ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 @@ -16535,19 +16373,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/grimy, /area/station/maintenance/aft/greater) -"fjt" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 9"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fjw" = ( /obj/machinery/smartfridge, /turf/closed/wall, @@ -16692,9 +16517,11 @@ /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) "fma" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "fmc" = ( /turf/closed/wall, @@ -17274,10 +17101,6 @@ "fwB" = ( /turf/closed/mineral/snowmountain/coldroom, /area/station/service/kitchen/coldroom) -"fwC" = ( -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fwD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -18318,13 +18141,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"fPv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "fPx" = ( /obj/docking_port/stationary/random/icemoon{ dir = 8; @@ -19220,6 +19036,13 @@ /obj/item/food/piedough, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"gdf" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "6"; + dir = 2 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gdg" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -19459,15 +19282,6 @@ /obj/effect/turf_decal/trimline/yellow/line, /turf/open/floor/iron/dark/side, /area/station/security/prison/workout) -"giP" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "giQ" = ( /obj/item/radio/intercom/directional/north, /obj/structure/cable, @@ -20167,6 +19981,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology) "guS" = ( @@ -20499,21 +20314,6 @@ /obj/structure/sign/warning/cold_temp/directional/west, /turf/open/floor/iron, /area/station/cargo/miningdock) -"gBb" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 3"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "gBc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -20612,14 +20412,9 @@ /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "gCo" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north{ - pixel_y = 2 - }, -/obj/structure/disposaloutlet{ - dir = 8 +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "1"; + dir = 1 }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -21155,10 +20950,6 @@ "gKQ" = ( /turf/closed/wall, /area/station/security/courtroom) -"gLj" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "gLk" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron, @@ -21289,6 +21080,12 @@ /obj/item/reagent_containers/dropper, /turf/open/floor/iron/cafeteria, /area/station/science/lab) +"gND" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gNH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -22997,18 +22794,6 @@ /obj/structure/girder, /turf/closed/wall, /area/station/maintenance/starboard/aft) -"htp" = ( -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "hty" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/snow/icemoon, @@ -23629,18 +23414,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"hEW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/xenobiology) "hEZ" = ( /obj/structure/ladder, /turf/open/floor/plating, @@ -23840,19 +23613,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore) -"hJi" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 6"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hJx" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24135,13 +23895,6 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/white, /area/station/medical/break_room) -"hOU" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens - Port Fore"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hOX" = ( /obj/machinery/camera/directional/west{ c_tag = "Atmospherics - North West" @@ -24648,7 +24401,9 @@ }, /area/station/security/prison/rec) "hWu" = ( -/obj/machinery/light/directional/east, +/obj/machinery/corral_corner{ + mapping_id = "6" + }, /turf/open/floor/engine, /area/station/science/xenobiology) "hWP" = ( @@ -24758,6 +24513,13 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) +"hZT" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "5"; + dir = 2 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iag" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -24767,15 +24529,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"iar" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "iav" = ( /obj/structure/closet/secure_closet/labor_camp_security, /obj/effect/turf_decal/tile/red/half/contrasted, @@ -24965,6 +24718,12 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/nospawn) +"ibX" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "ica" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, @@ -25328,15 +25087,6 @@ }, /turf/open/floor/wood, /area/station/hallway/secondary/service) -"ihN" = ( -/obj/machinery/button/door/directional/west{ - id = "xenobio4"; - layer = 4; - name = "Xenobio Pen 4 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iig" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -26361,20 +26111,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"izA" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 8"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "izC" = ( /turf/closed/wall, /area/station/service/bar/atrium) @@ -26640,18 +26376,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) -"iDG" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 3"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "iDQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -26702,20 +26426,11 @@ /turf/open/floor/plating/icemoon, /area/station/security/execution/education) "iER" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, +/obj/machinery/light/floor/has_bulb, /obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology Pens Hall - Aft"; - network = list("ss13","rd","xeno_pens") + dir = 4 }, -/turf/open/floor/iron, +/turf/open/floor/stone, /area/station/science/xenobiology) "iFc" = ( /obj/effect/turf_decal/tile/red/half{ @@ -27776,7 +27491,9 @@ /turf/open/floor/iron/dark/textured, /area/station/security/prison) "iVT" = ( -/obj/machinery/computer/camera_advanced/xenobio, +/obj/structure/table/glass, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/vacuum_pack, /turf/open/floor/iron, /area/station/science/xenobiology) "iVU" = ( @@ -29489,18 +29206,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jAF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jAO" = ( /obj/effect/turf_decal/siding/yellow{ dir = 8 @@ -30075,12 +29780,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"jKI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "jKJ" = ( /obj/effect/mapping_helpers/airlock/unres{ dir = 1 @@ -30670,10 +30369,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/central/greater) -"jSW" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jTf" = ( /obj/structure/fence{ dir = 1 @@ -31064,16 +30759,6 @@ }, /turf/open/floor/iron, /area/mine/laborcamp) -"kaW" = ( -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/east{ - id = "xenobio9"; - layer = 4; - name = "Xenobio Pen 9 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "kaX" = ( /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/white/side{ @@ -33151,6 +32836,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/lobby) +"kGV" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "2"; + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "kHb" = ( /obj/structure/closet/secure_closet/personal{ anchored = 1 @@ -34670,15 +34362,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"lfs" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "lfF" = ( /obj/structure/sign/warning/cold_temp/directional/west, /obj/structure/sign/warning/gas_mask/directional/east, @@ -36010,20 +35693,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"lBZ" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 7"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "lCb" = ( /obj/effect/landmark/start/assistant, /obj/structure/cable, @@ -36337,6 +36006,13 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/iron, /area/station/hallway/primary/port) +"lGB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "lGK" = ( /obj/machinery/vending/cigarette, /obj/machinery/button/door{ @@ -36567,19 +36243,6 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) -"lMu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, -/area/station/science/xenobiology) "lMC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -36610,16 +36273,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/security/prison) -"lNo" = ( -/obj/machinery/light/directional/east, -/obj/machinery/button/door/directional/east{ - id = "xenobio6"; - layer = 4; - name = "Xenobio Pen 6 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lNy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37294,12 +36947,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/office) -"lZX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "mae" = ( /obj/structure/statue/snow/snowman, /turf/open/misc/asteroid/snow/icemoon, @@ -37310,15 +36957,15 @@ /turf/open/floor/iron, /area/station/commons/dorms) "maO" = ( -/obj/machinery/disposal/bin, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/light/floor/has_bulb, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/structure/disposalpipe/trunk{ +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/turf/open/floor/iron, +/turf/open/floor/stone, /area/station/science/xenobiology) "maQ" = ( /obj/machinery/door/airlock/external{ @@ -38251,6 +37898,13 @@ dir = 4 }, /area/station/security/brig/entrance) +"mqK" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "3"; + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "mqO" = ( /obj/machinery/power/port_gen/pacman, /turf/open/floor/plating, @@ -38669,6 +38323,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"myS" = ( +/obj/machinery/duct, +/turf/open/floor/engine, +/area/station/science/xenobiology) "myZ" = ( /obj/structure/lattice/catwalk, /turf/open/openspace/icemoon/keep_below, @@ -39876,6 +39534,10 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/work) +"mVO" = ( +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "mVY" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -41045,18 +40707,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"nmj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "nmk" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, @@ -43922,18 +43572,10 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "odd" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 6"; - req_access = list("xenobiology") - }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, +/turf/open/floor/stone, /area/station/science/xenobiology) "odi" = ( /obj/item/toy/snowball{ @@ -44249,19 +43891,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"oir" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, -/area/station/science/xenobiology) "oiy" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/service) @@ -44633,11 +44262,6 @@ /obj/effect/mapping_helpers/iannewyear, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"ooo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/processor/slime, -/turf/open/floor/iron, -/area/station/science/xenobiology) "oop" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -45086,7 +44710,7 @@ "ouP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/portable_atmospherics/canister, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron/white, /area/station/science/xenobiology) "ouX" = ( @@ -45287,6 +44911,14 @@ /obj/structure/table, /turf/open/floor/wood, /area/station/command/meeting_room) +"oyt" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "oyy" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -46359,15 +45991,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"oQo" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "oQp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46785,15 +46408,6 @@ "oXq" = ( /turf/open/floor/iron/white, /area/station/medical/cryo) -"oXr" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Kill Chamber"; - normalspeed = 0 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "oXs" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -47787,6 +47401,7 @@ "ppp" = ( /obj/structure/railing, /obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/slime_market, /turf/open/floor/iron/white, /area/station/science/xenobiology) "ppq" = ( @@ -47955,15 +47570,6 @@ /obj/machinery/telecomms/server/presets/security, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"prH" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio11"; - name = "Xenobio Pen 11 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "psb" = ( /turf/closed/wall/ice, /area/icemoon/underground/explored) @@ -50186,18 +49792,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/mine/laborcamp) -"qbq" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio11"; - name = "Xenobio Pen 11 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "qbA" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/east, @@ -51809,9 +51403,9 @@ "qEv" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 1 - }, +/obj/structure/table/glass, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/vacuum_pack, /turf/open/floor/iron, /area/station/science/xenobiology) "qEz" = ( @@ -53493,19 +53087,6 @@ /obj/item/flashlight/flare/candle, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"reT" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 8"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rfh" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -53796,15 +53377,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"rjT" = ( -/obj/machinery/button/door/directional/west{ - id = "xenobio3"; - layer = 4; - name = "Xenobio Pen 3 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "rkc" = ( /obj/effect/turf_decal/siding/yellow, /obj/effect/turf_decal/siding/yellow{ @@ -54037,18 +53609,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"roA" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 4"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "roH" = ( /obj/structure/chair/pew/right, /turf/open/floor/wood, @@ -54214,14 +53774,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rsC" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens - Port Mid"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rsL" = ( /obj/structure/cable, /turf/open/floor/circuit, @@ -54519,17 +54071,13 @@ /turf/open/floor/iron/white/smooth_large, /area/station/service/kitchen/diner) "rxM" = ( -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" +/obj/machinery/corral_corner{ + mapping_id = "4" }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/slime_pen_controller{ + mapping_id = "4" }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, +/turf/open/floor/engine, /area/station/science/xenobiology) "rxW" = ( /turf/closed/mineral/random/snow, @@ -55292,16 +54840,10 @@ /turf/open/floor/plating, /area/station/engineering/main) "rJe" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 1"; - req_access = list("xenobiology") - }, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 8 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, +/turf/open/floor/stone, /area/station/science/xenobiology) "rJv" = ( /obj/machinery/bluespace_beacon, @@ -56083,13 +55625,8 @@ /turf/open/floor/iron/smooth, /area/mine/mechbay) "rXD" = ( -/obj/machinery/button/door/directional/east{ - id = "xenobio7"; - layer = 4; - name = "Xenobio Pen 7 Blast DOors"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/glass/reinforced, /area/station/science/xenobiology) "rXN" = ( /obj/machinery/door/firedoor, @@ -56543,6 +56080,7 @@ "sfv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology) "sfy" = ( @@ -56891,15 +56429,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"slp" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "slv" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/green/corner{ @@ -59689,16 +59218,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"tiQ" = ( -/obj/structure/sink/directional/east, -/obj/machinery/button/door/directional/west{ - id = "xenobio2"; - layer = 4; - name = "Xenobio Pen 2 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tiV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -59847,7 +59366,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/turf/open/floor/iron/freezer, +/turf/closed/wall/r_wall, /area/station/science/xenobiology) "tkS" = ( /obj/item/radio/intercom/directional/east, @@ -60233,10 +59752,6 @@ /obj/structure/disposalpipe/junction/flip, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"tsa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "tsh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61691,19 +61206,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/cargo/lobby) -"tOf" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, -/area/station/science/xenobiology) "tOi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62035,15 +61537,6 @@ /obj/effect/spawner/random/trash/soap, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"tWd" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "tWp" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -62468,21 +61961,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"ucl" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 4"; - req_access = list("xenobiology") - }, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ucn" = ( /obj/item/toy/snowball{ pixel_x = 9; @@ -65478,17 +64956,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/cargo/miningdock) -"vdr" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "vds" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -65649,11 +65116,16 @@ /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "vfq" = ( -/obj/machinery/monkey_recycler, /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/biomass_recycler, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, /turf/open/floor/iron, /area/station/science/xenobiology) "vfI" = ( @@ -67447,12 +66919,10 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "vIk" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/passive_vent, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/freezer, +/turf/closed/wall/r_wall, /area/station/science/xenobiology) "vIm" = ( /obj/structure/closet/emcloset, @@ -67770,21 +67240,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"vPD" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vPE" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -68705,18 +68160,6 @@ }, /turf/open/floor/glass, /area/station/service/library) -"wgr" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio9"; - name = "Xenobio Pen 9 Blast Door" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "wgs" = ( /obj/structure/cable, /mob/living/basic/sloth/paperwork, @@ -69203,9 +68646,8 @@ /turf/open/floor/iron/dark, /area/station/security/execution/education) "wnB" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Pens - Starboard Aft"; - network = list("ss13","rd","xeno") +/obj/machinery/corral_corner{ + mapping_id = "2" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -69363,12 +68805,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) -"wpv" = ( -/obj/structure/sign/warning/cold_temp, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) "wpx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/newscaster/directional/west, @@ -69672,7 +69108,9 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "wva" = ( -/obj/machinery/light/directional/west, +/obj/machinery/corral_corner{ + mapping_id = "5" + }, /turf/open/floor/engine, /area/station/science/xenobiology) "wvb" = ( @@ -69954,14 +69392,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"wyU" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Pens - Port Aft"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wzc" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -70456,17 +69886,13 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "wGN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/corral_corner{ + mapping_id = "2" }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" +/obj/machinery/slime_pen_controller{ + mapping_id = "2" }, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electric_shock, -/turf/open/floor/plating, +/turf/open/floor/engine, /area/station/science/xenobiology) "wGO" = ( /obj/machinery/light/directional/south, @@ -70498,13 +69924,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pathology) -"wHb" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/freezer, -/area/station/science/xenobiology) "wHc" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/rd) @@ -71355,10 +70774,8 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "wUz" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Pens - Starboard Mid"; - network = list("ss13","rd","xeno") +/obj/machinery/corral_corner{ + mapping_id = "4" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -71582,20 +70999,6 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"wXX" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen 10"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "wYb" = ( /obj/structure/table, /obj/effect/turf_decal/stripes/red/line{ @@ -71702,19 +71105,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"wZv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/camera{ - c_tag = "Xenobiology Pens Hall - Fore"; - dir = 9; - network = list("ss13","rd","xeno") - }, -/obj/structure/sign/xenobio_guide/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wZL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow{ @@ -72034,6 +71424,12 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"xfz" = ( +/obj/structure/railing, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/slime_market_pad, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xfB" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/iron, @@ -72217,18 +71613,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/white, /area/station/maintenance/port/fore) -"xhv" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 2"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "xhw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -72737,16 +72121,12 @@ /turf/open/floor/plating, /area/station/maintenance/aft/greater) "xqu" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen 10"; - req_access = list("xenobiology") +/obj/machinery/corral_corner{ + mapping_id = "6" }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio10"; - name = "Xenobio Pen 10 Blast Door" +/obj/machinery/slime_pen_controller{ + mapping_id = "6" }, -/obj/structure/cable, /turf/open/floor/engine, /area/station/science/xenobiology) "xqy" = ( @@ -72873,6 +72253,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/disposal) +"xsU" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "xtc" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -72955,15 +72343,6 @@ "xuo" = ( /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) -"xur" = ( -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "xuA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, @@ -73226,6 +72605,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/structure/cable, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "xyx" = ( @@ -73486,15 +72866,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/courtroom) -"xCh" = ( -/obj/machinery/button/door/directional/west{ - id = "xenobio5"; - layer = 4; - name = "Xenobio Pen 5 Blast Door"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "xCj" = ( /obj/structure/sign/departments/holy, /turf/closed/wall, @@ -75405,15 +74776,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"yjA" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "yjK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, @@ -183661,27 +183023,27 @@ abe abe biI abe +abe eOS -qLY eGN -lZX -dPy -qLY -hOU wva abe cKA abe +wva +xsU +ibX abe cKA -rsC abe -cKA abe +ibX +xsU +gND abe cKA -wyU abe +gND rnQ nPI wzg @@ -183918,25 +183280,25 @@ abe cku uUn xNa +abe eOS -qLY vIk -tsa -wHb -qLY abe -jSW abe -cKA -jSW +aUq +abe +abe +lGB abe -cKA abe abe -cKA abe abe -cKA +abe +lGB +abe +abe +aUq abe abe rnQ @@ -184175,24 +183537,24 @@ abe abe bOT abe +abe eLb -qLY tkP -fPv -jKI -qLY -giP abe abe -gCo -abe -abe -gCo -abe +hZT +myS +myS +oyt +myS +myS +mqK abe -gCo abe abe +oyt +myS +myS gCo abe abe @@ -184435,24 +183797,24 @@ abe ctF qLY qLY -oXr -wpv -qLY -lMu +wva +abe +abe +abe bUK -oQo -nmj -ucl -aHz -dIS -gBb +oyt +ibX +abe +abe +abe +abe dJx -htp -eWh -yjA -tOf -vPD -lqU +oyt +gND +abe +abe +abe +aIV mDg nPI alM @@ -184692,23 +184054,23 @@ cZT cZT pXj qLY -wZv -axD -qLY -hEW -jAF -fma -vdr -roA -fma -vdr -iDG fma +rJe +rJe +rJe +rJe maO -xhv -fma +rJe +rJe +rJe +rJe +rJe +rJe maO rJe +rJe +rJe +rJe fma ffe nPI @@ -184946,26 +184308,26 @@ pMF mqe hRC euM -pMF +mVO sfv xyn dmj -wPd -fwC -asb -pMF -xCh -kaW -pMF -ihN -doK -pMF -rjT rXD -pMF -tiQ -lNo -pMF +rXD +rXD +rXD +rXD +rXD +rXD +rXD +rXD +rXD +rXD +rXD +fvk +fvk +fvk +fvk clW rkl nPI @@ -185206,23 +184568,23 @@ niy gtF ouP gLS +iER +odd +odd +odd +odd cyh -cXX -bKI -cyh -wXX -bKI -cyh -dQZ -bKI -cyh -izA -bKI -cyh -lBZ -bKI +odd +odd +odd +odd +odd +odd cyh odd +odd +odd +odd iER ffe nPI @@ -185463,23 +184825,23 @@ qWS wPd ygE qLY -prH -bjn -qbq -iar +hWu +abe +abe +abe xqu -oir -slp -fjt -wgr -xur -reT +oyt +wUz +abe +abe +abe +abe rxM -aLA -bnh -cNI -tWd -hJi +oyt +wnB +abe +abe +abe wGN mDg pQG @@ -185722,22 +185084,22 @@ iQM qLY abe abe +gdf +myS +myS +oyt +myS +myS dLr abe abe -dLr -abe -abe -dLr -abe -abe -dLr -abe abe -dLr +oyt +myS +myS +kGV abe abe -lfs pjr nPI nPI @@ -185979,21 +185341,21 @@ qLY qLY abe abe -gLj +aUq +abe abe -jSW -gLj +lGB abe abe -gLj abe abe -gLj abe abe -gLj +lGB abe abe +aUq +abe abe pjr tRd @@ -186234,23 +185596,23 @@ xwd qLY vgf qLY +hWu abe +atw abe -gLj -aey hWu -gLj +xsU +wUz abe +atw abe -gLj abe -hWu wUz +xsU +wnB abe +atw abe -gLj -abe -hWu wnB pjr tRd @@ -250242,7 +249604,7 @@ xJj lvh iVT ogl -ffz +xJj bzB diL vTJ @@ -250746,7 +250108,7 @@ ehd ehd ehd wmX -ooo +lva rtn qEv vDu @@ -251769,7 +251131,7 @@ jbU kHN kra qhL -ppp +xfz xJG ily ily @@ -254315,7 +253677,7 @@ eha aJQ aJQ lso -lZi +bOq qaE mBQ eag diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 620765d9e8dc..63d1b8f7a7eb 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -15126,9 +15126,6 @@ "fjh" = ( /obj/effect/turf_decal/bot, /obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/machinery/button/door/directional/north{ id = "xeno3"; name = "Creature Cell 3 Toggle"; @@ -26868,7 +26865,6 @@ "iKn" = ( /obj/effect/turf_decal/bot, /obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/processor/slime, /obj/machinery/button/door/directional/south{ id = "xeno4"; name = "Creature Cell 4 Toggle"; @@ -50051,9 +50047,6 @@ /turf/open/floor/iron, /area/station/security/brig) "qEj" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/light/directional/north, @@ -64153,10 +64146,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"vhx" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) "vhK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -68244,7 +68233,6 @@ "wqR" = ( /obj/effect/turf_decal/bot, /obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/monkey_recycler, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -110474,13 +110462,13 @@ wpw ieb xcf wpw -vhx +qmW nQx qmW uXM qmW nQx -vhx +qmW lZi qdM nmu @@ -113048,7 +113036,7 @@ qmW nQx qmW wpw -vhx +qmW nQx qmW lDu diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 69de29167952..741217d5d372 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -664,13 +664,13 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "amV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "amY" = ( /obj/effect/turf_decal/tile/yellow{ @@ -805,6 +805,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"apT" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "apZ" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -1375,12 +1384,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"azS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) "aAb" = ( /obj/structure/table/wood, /obj/item/lipstick{ @@ -1588,10 +1591,8 @@ /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "aDQ" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, /obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/chem_heater/withbuffer, /turf/open/floor/iron, /area/station/science/xenobiology) "aDR" = ( @@ -1915,12 +1916,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"aJE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/lab) "aJI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1955,13 +1950,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"aJQ" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "aJS" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/ai_upload) @@ -2613,11 +2601,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"aUT" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "aVd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2652,6 +2635,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"aVx" = ( +/obj/machinery/corral_corner{ + mapping_id = "5" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "5" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "aVX" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -2858,6 +2850,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) +"aYt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "XenoPens"; + name = "Xenobiology Lockdown" + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "aYw" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Three"; @@ -2987,6 +2988,13 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, /area/station/science/circuits) +"bae" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "bau" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -3058,13 +3066,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"bbL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "bbO" = ( /obj/structure/window/reinforced/spawner/directional/north{ layer = 2.9 @@ -3682,17 +3683,6 @@ /obj/structure/transit_tube/diagonal, /turf/open/space, /area/space/nearstation) -"bnp" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/chair/stool/directional/south, -/obj/machinery/camera/directional/west{ - c_tag = "Solar Maintenance - Aft Starboard" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "bnr" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/chair/sofa/corp/right{ @@ -3824,12 +3814,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) -"bnQ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "bnU" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/chair/office/light, @@ -3990,6 +3974,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/white, /area/station/science/cytology) "bqX" = ( @@ -4146,6 +4131,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"btB" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "btH" = ( /obj/structure/table, /obj/item/reagent_containers/cup/beaker{ @@ -4322,11 +4314,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"bxg" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "bxj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/west{ @@ -4403,16 +4390,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"byP" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "byR" = ( /obj/structure/sign/warning/secure_area/directional/north, /obj/effect/turf_decal/tile/blue{ @@ -5197,8 +5174,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/machinery/smartfridge/extract/preloaded, /obj/effect/turf_decal/bot_white, +/obj/machinery/slime_market_pad, /turf/open/floor/iron, /area/station/science/xenobiology) "bQY" = ( @@ -5210,6 +5187,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"bRc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "bRG" = ( /obj/machinery/shower/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -5273,13 +5260,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"bSu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "bSA" = ( /obj/machinery/door/window/right/directional/south{ name = "First Aid Supplies"; @@ -5607,14 +5587,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) -"caf" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "can" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, @@ -5654,6 +5626,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"cbn" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/engine, +/area/station/science/xenobiology) "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) @@ -5738,8 +5719,8 @@ /area/station/hallway/secondary/command) "ces" = ( /obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/processor/slime, /obj/effect/turf_decal/bot_white, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron, /area/station/science/xenobiology) "cez" = ( @@ -5807,11 +5788,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/warehouse) -"cgd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "cgi" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/side{ @@ -5974,6 +5950,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"cjT" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "2"; + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "cke" = ( /obj/structure/showcase/machinery/tv{ dir = 1; @@ -6134,6 +6118,28 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"cnF" = ( +/obj/structure/cable, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "cnK" = ( /turf/closed/wall, /area/station/engineering/main) @@ -6187,15 +6193,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"cpl" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "cpn" = ( /obj/structure/table, /obj/machinery/newscaster/directional/north, @@ -6331,6 +6328,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/bar) +"cqQ" = ( +/obj/machinery/corral_corner{ + mapping_id = "6" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "6" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "crg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -6462,6 +6468,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"ctN" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "ctO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6704,6 +6721,32 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) +"cxi" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/obj/item/stack/cable_coil, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/camera/directional/north{ + c_tag = "Solar Maintenance - Aft Port" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "cxj" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -7080,6 +7123,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/commons/storage/primary) +"cFw" = ( +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "cFU" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -7103,6 +7152,15 @@ }, /turf/open/floor/iron, /area/station/service/bar) +"cFW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "cGj" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -7183,6 +7241,10 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"cHV" = ( +/obj/machinery/camera/directional/east, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "cId" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -7817,6 +7879,11 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"cVQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "cWr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7946,17 +8013,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port) -"cZs" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "cZu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -8010,14 +8066,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) -"dac" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "das" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -8200,15 +8248,20 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ddK" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/stone, +/area/station/science/xenobiology) +"ddN" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "ddO" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8372,10 +8425,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "dgD" = ( /turf/closed/wall, @@ -8503,15 +8554,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"diq" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/south{ - dir = 8; - name = "Maximum Security Test Chamber"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "diC" = ( /obj/machinery/door/airlock/maintenance{ name = "Atmospherics Maintenance" @@ -8824,10 +8866,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/wood, /area/station/commons/dorms) -"dqw" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "dqx" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -9054,14 +9092,6 @@ "duI" = ( /turf/closed/wall, /area/station/command/bridge) -"duN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/fans/tiny, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "dvk" = ( /obj/structure/table, /obj/machinery/light/directional/west, @@ -9104,6 +9134,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"dvT" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/obj/machinery/power/solar_control{ + dir = 4; + id = "aftport"; + name = "Port Quarter Solar Control" + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "dvV" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -9159,8 +9199,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "dxe" = ( /obj/effect/landmark/event_spawn, @@ -9308,6 +9349,9 @@ /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"dAJ" = ( +/turf/closed/wall, +/area/space) "dBV" = ( /obj/docking_port/stationary/escape_pod{ dir = 4 @@ -9544,6 +9588,10 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/engine, /area/station/science/explab) +"dGk" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "dGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/left{ @@ -9731,17 +9779,6 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) -"dKh" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "dKl" = ( /obj/structure/sign/warning/pods, /turf/closed/wall/r_wall, @@ -9933,6 +9970,12 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"dMA" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "dMH" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -10040,6 +10083,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"dPw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "dPy" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -10101,8 +10148,18 @@ pixel_y = 1; req_access = list("xenobiology") }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen2" + }, /turf/open/floor/iron, /area/station/science/xenobiology) +"dQb" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "dQA" = ( /obj/machinery/computer/rdservercontrol{ dir = 4 @@ -10188,6 +10245,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"dRR" = ( +/obj/structure/sign/warning/vacuum/external/directional/east, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "dRY" = ( /obj/structure/chair/office, /obj/effect/landmark/start/hangover, @@ -10304,13 +10367,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"dUk" = ( -/obj/machinery/power/terminal, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "dUB" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10380,6 +10436,15 @@ /obj/effect/spawner/random/aimodule/harmless, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"dWA" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "dWF" = ( /obj/machinery/light/directional/north, /obj/machinery/camera/directional/north{ @@ -11029,17 +11094,6 @@ /obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron, /area/station/engineering/atmos) -"eha" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "ehg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -11331,6 +11385,15 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"elT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "elV" = ( /obj/machinery/airalarm/directional/north, /obj/item/clothing/under/misc/assistantformal, @@ -11377,6 +11440,14 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"eml" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "1"; + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "emv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -11870,16 +11941,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"evD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "evE" = ( /obj/effect/turf_decal/siding/purple{ dir = 10 @@ -11976,13 +12037,6 @@ }, /turf/open/floor/iron, /area/station/security/warden) -"ewF" = ( -/obj/machinery/power/terminal, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "ewR" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -12022,11 +12076,6 @@ /obj/item/pen, /turf/open/floor/wood, /area/station/service/lawoffice) -"exu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "exC" = ( /obj/effect/turf_decal/plaque{ icon_state = "L3" @@ -12408,13 +12457,6 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron, /area/station/hallway/primary/port) -"eHN" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "eHR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12425,14 +12467,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eIc" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/fans/tiny, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "eIw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12487,11 +12521,9 @@ /turf/open/floor/plating, /area/station/science/research) "eJI" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/box, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, +/obj/structure/chair/sofa/corp/right, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "eJM" = ( /obj/machinery/camera/directional/east{ @@ -12756,6 +12788,10 @@ name = "Containment Pen #6"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen2"; + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "eOQ" = ( @@ -12953,19 +12989,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"eSC" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio7"; - layer = 3.3; - name = "Xenobio Pen 7 Blast Doors"; - pixel_y = 4; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "eSR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -12982,6 +13005,10 @@ /obj/machinery/light/no_nightlight/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"eTk" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, +/area/station/science/xenobiology) "eTn" = ( /obj/structure/chair{ dir = 4 @@ -13384,14 +13411,6 @@ /obj/effect/spawner/random/decoration/showcase, /turf/open/floor/carpet, /area/station/command/corporate_showroom) -"faD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fbf" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -13479,7 +13498,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/machinery/light/directional/west, +/obj/machinery/duct, +/obj/machinery/camera/directional/west, +/turf/open/floor/stone, /area/station/science/xenobiology) "fee" = ( /obj/structure/lattice/catwalk, @@ -14011,6 +14033,15 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"flp" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "XenoPens"; + name = "Xenobiology Lockdown" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "flu" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -14114,6 +14145,13 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"fmR" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "3" + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fmS" = ( /obj/structure/sign/directions/security{ dir = 1; @@ -14165,12 +14203,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) -"foV" = ( -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "fpj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -14268,12 +14300,10 @@ /area/station/science/xenobiology/hallway) "frt" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/south, +/obj/machinery/chem_master, /turf/open/floor/iron, /area/station/science/xenobiology) "fru" = ( @@ -14368,16 +14398,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"fuF" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Quarter Solar Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/landmark/navigate_destination/common/portquartersolar, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "fvE" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) @@ -14959,17 +14979,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"fHe" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) +"fHs" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/chair/sofa/corp, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "fHC" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -15039,6 +15053,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"fJq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) "fJs" = ( /obj/structure/chair/stool/directional/west, /obj/effect/mapping_helpers/broken_floor, @@ -15225,14 +15246,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/science/circuits) -"fMF" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fMN" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -15395,16 +15408,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"fPB" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Quarter Solar Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/landmark/navigate_destination/common/starboardquartersolar, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "fPD" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/aft) @@ -15534,6 +15537,13 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/fore) +"fRZ" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light_switch/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "fSd" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15609,15 +15619,6 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/command/bridge) -"fUq" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "fUr" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -15631,9 +15632,15 @@ }, /obj/effect/turf_decal/bot_white, /obj/structure/cable, -/obj/machinery/smartfridge/organ, +/obj/machinery/computer/slime_market, /turf/open/floor/iron, /area/station/science/xenobiology) +"fUH" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fUM" = ( /obj/machinery/light/small/directional/south, /obj/machinery/libraryscanner, @@ -16010,6 +16017,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"gbm" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "gbq" = ( /obj/machinery/vending/wardrobe/chef_wardrobe, /obj/effect/turf_decal/trimline/brown/warning{ @@ -16201,12 +16217,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"gfc" = ( -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "gfh" = ( /obj/structure/sign/poster/random/directional/east, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, @@ -16258,6 +16268,20 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"gga" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/airlock/hatch{ + name = "Xenobiology Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "ggi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -16377,14 +16401,6 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"git" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "giz" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -16451,6 +16467,10 @@ name = "Containment Pen #5"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen3"; + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "gjF" = ( @@ -16633,6 +16653,12 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/security/lockers) +"gmB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "gmG" = ( /obj/structure/table, /obj/item/plate, @@ -16714,6 +16740,14 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"gnL" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "gnS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16947,6 +16981,15 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"grI" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "grZ" = ( /obj/structure/chair, /obj/machinery/camera/directional/north{ @@ -17127,8 +17170,14 @@ /turf/closed/wall, /area/station/commons/storage/primary) "gva" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "XenoPens"; + name = "Xenobiology Lockdown" + }, +/obj/machinery/duct, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "gvg" = ( /obj/structure/table/reinforced, @@ -17288,6 +17337,7 @@ id = "xenobio8"; name = "Xenobio Pen 8 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "gyK" = ( @@ -17452,14 +17502,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gCE" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "starboardquarter"; - name = "Starboard Quarter Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/starboard/aft) "gCS" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/showcase/cyborg/old{ @@ -17606,6 +17648,13 @@ }, /turf/open/space/basic, /area/space) +"gFd" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "gFi" = ( /turf/open/floor/iron, /area/station/hallway/primary/fore) @@ -17841,17 +17890,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"gKD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Central East"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gKK" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -18244,6 +18282,11 @@ /obj/item/reagent_containers/cup/watering_can, /turf/open/floor/iron, /area/station/service/hydroponics) +"gRY" = ( +/obj/machinery/light/floor/has_bulb, +/obj/machinery/plumbing/ooze_compressor, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "gSn" = ( /obj/item/wrench, /turf/open/floor/iron, @@ -18277,7 +18320,6 @@ /turf/open/floor/circuit/telecomms/server, /area/station/science/server) "gSM" = ( -/obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -18286,6 +18328,7 @@ id = "XenoPens"; name = "Xenobiology Lockdown" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "gTh" = ( @@ -18362,12 +18405,14 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "gTS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/machinery/shower/directional/north, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "gTU" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 4 @@ -18534,6 +18579,12 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/atmos) +"gWH" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "gWL" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, @@ -18611,20 +18662,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/station/solars/port/aft) -"gXs" = ( -/obj/machinery/power/solar_control{ - id = "forestarboard"; - name = "Starboard Bow Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "gXu" = ( /turf/open/floor/plating, /area/station/engineering/main) "gXw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/circuit/telecomms, +/obj/machinery/light/floor/has_bulb, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "5"; + dir = 1 + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "gXz" = ( /obj/machinery/duct, @@ -19027,6 +19074,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/warehouse) +"heo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "hep" = ( /obj/effect/landmark/blobstart, /obj/effect/mapping_helpers/burnt_floor, @@ -19239,14 +19296,6 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"hja" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hjo" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -19542,11 +19591,6 @@ }, /turf/open/floor/plating, /area/station/engineering/main) -"hoc" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "hod" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -19609,6 +19653,12 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms) +"hoV" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hoY" = ( /obj/structure/chair/office{ dir = 4 @@ -19744,6 +19794,14 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/service/bar) +"hsp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "hsF" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -20319,11 +20377,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"hCw" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hCK" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/effect/turf_decal/siding/purple{ @@ -20815,6 +20868,7 @@ id = "xenobio1"; name = "Xenobio Pen 1 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "hMy" = ( @@ -21065,6 +21119,14 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"hRU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "hRW" = ( /obj/machinery/light/directional/east, /obj/machinery/airalarm/directional/east, @@ -21241,6 +21303,10 @@ name = "Containment Pen #8"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen1"; + dir = 4 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "hVE" = ( @@ -21627,6 +21693,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/machinery/slime_extract_requestor, /turf/open/floor/iron/white, /area/station/science/lobby) "ibz" = ( @@ -21714,17 +21781,10 @@ /turf/open/floor/plating, /area/station/commons/fitness/recreation) "idA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/structure/sign/warning/electric_shock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/science/xenobiology) -"idF" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron, -/area/station/science/xenobiology) "ied" = ( /obj/structure/table, /obj/item/paper/fluff/holodeck/disclaimer, @@ -21890,6 +21950,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"igH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/box, +/obj/machinery/camera/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "igP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/wood{ @@ -22273,6 +22343,10 @@ name = "Containment Pen #3"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen5"; + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "imU" = ( @@ -22586,15 +22660,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/grass, /area/station/security/prison/garden) -"irp" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "irL" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -22899,6 +22964,14 @@ /obj/structure/closet/crate, /turf/open/floor/plating/airless, /area/space/nearstation) +"ivK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "ivM" = ( /obj/effect/decal/cleanable/cobweb, /obj/machinery/photocopier, @@ -22957,8 +23030,10 @@ /area/station/science/robotics/lab) "iwO" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "iwX" = ( /obj/structure/cable, @@ -23044,6 +23119,9 @@ pixel_y = 4; req_access = list("xenobiology") }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen3" + }, /turf/open/floor/iron, /area/station/science/xenobiology) "ixT" = ( @@ -23355,6 +23433,12 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"iCZ" = ( +/obj/machinery/corral_corner{ + mapping_id = "6" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iDh" = ( /obj/machinery/computer/communications{ dir = 8 @@ -23716,6 +23800,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/command) +"iJm" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "iJt" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/camera/directional/east{ @@ -23773,16 +23868,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/space/nearstation) -"iJJ" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Bow Solar Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/landmark/navigate_destination/common/starboardbowsolar, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "iJK" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -24017,13 +24102,6 @@ /mob/living/basic/lizard/wags_his_tail, /turf/open/floor/plating, /area/station/service/janitor) -"iMR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iMS" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, @@ -24149,8 +24227,8 @@ /turf/open/floor/carpet, /area/station/security/detectives_office) "iOZ" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/science/xenobiology) "iPb" = ( @@ -24523,6 +24601,16 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"iTV" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/obj/machinery/camera/directional/north, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iTX" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ @@ -24553,6 +24641,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"iUk" = ( +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iUm" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -24617,12 +24711,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"iVn" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "iVs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -24667,10 +24755,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"iWc" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "iWj" = ( /obj/effect/turf_decal/tile/red{ dir = 8 @@ -24885,6 +24969,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"jau" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "1" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "jay" = ( /obj/structure/chair{ dir = 4 @@ -24931,18 +25024,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/research) -"jbk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Central South"; - dir = 9; - network = list("ss13","rd","xeno") - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "jbq" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/aft) @@ -25022,6 +25103,13 @@ /obj/structure/window/fulltile, /turf/open/floor/grass, /area/station/hallway/secondary/exit/departure_lounge) +"jdj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "jdn" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/structure/disposalpipe/segment{ @@ -25177,6 +25265,13 @@ "jfG" = ( /turf/closed/wall, /area/station/maintenance/disposal) +"jfJ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "jfN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25339,6 +25434,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"jhX" = ( +/obj/machinery/corral_corner{ + mapping_id = "5" + }, +/obj/machinery/corral_corner{ + mapping_id = "6" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "jhY" = ( /obj/machinery/firealarm/directional/east, /obj/structure/bed/dogbed, @@ -25378,12 +25482,14 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "jjj" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/vacuum_pack, +/obj/item/vacuum_pack, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/structure/table/glass, /turf/open/floor/iron, /area/station/science/xenobiology) "jjm" = ( @@ -25615,6 +25721,11 @@ /obj/structure/bookcase, /turf/open/floor/wood, /area/station/command/bridge) +"jnv" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "jnA" = ( /obj/machinery/newscaster/directional/west, /obj/structure/easel, @@ -26163,14 +26274,6 @@ }, /turf/open/floor/iron, /area/station/science/research) -"jvX" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/shower/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jwg" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -26288,13 +26391,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/structure/sign/xenobio_guide/directional/west, +/turf/open/floor/stone, /area/station/science/xenobiology) "jxS" = ( /obj/effect/decal/cleanable/dirt, @@ -26392,7 +26496,11 @@ "jzw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, /area/station/science/xenobiology) "jzC" = ( /obj/machinery/door/window/right/directional/north{ @@ -26525,12 +26633,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/disposal) -"jCO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "jDb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/blobstart, @@ -26895,6 +26997,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"jKa" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/door/airlock/maintenance{ + name = "Research Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/iron/white, +/area/station/science/lab) "jKq" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two"; @@ -27190,6 +27300,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"jOI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jON" = ( /obj/effect/turf_decal/tile/purple, /obj/structure/disposalpipe/segment{ @@ -27383,15 +27502,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/lounge) -"jSj" = ( -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0 - }, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/iron, -/area/station/science/xenobiology) "jSm" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -27526,12 +27636,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"jUK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/structure/fans/tiny, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "jUP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27672,6 +27776,11 @@ }, /turf/open/floor/wood, /area/station/service/cafeteria) +"jXe" = ( +/obj/structure/lattice, +/obj/item/wirecutters, +/turf/open/space/basic, +/area/space/nearstation) "jXq" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -27918,13 +28027,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) -"kbn" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/camera/directional/west{ - c_tag = "Solar Maintenance - Fore Starboard" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "kbo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28209,6 +28311,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/engineering) +"khw" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "4" + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "khA" = ( /turf/closed/wall, /area/station/commons/storage/art) @@ -28365,6 +28474,17 @@ /obj/item/clothing/glasses/hud/health, /turf/open/floor/iron/white, /area/station/medical/pathology) +"kkT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "kkU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/directional/west{ @@ -28471,6 +28591,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology) "klL" = ( @@ -28680,14 +28801,6 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"kqj" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "kqm" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -28883,6 +28996,12 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"ktG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "ktK" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 10 @@ -29012,14 +29131,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) "kvT" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/bot_white, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "kvV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29127,12 +29240,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"kyh" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +"kxW" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "kyl" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/light/directional/south, @@ -29330,6 +29447,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/command/teleporter) +"kCw" = ( +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kCC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -29546,14 +29667,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"kHt" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #2"; - dir = 9; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "kHM" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/trimline/brown/line, @@ -29653,6 +29766,14 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/white, /area/station/security/prison) +"kKG" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "kKT" = ( /obj/item/reagent_containers/cup/bottle/multiver{ pixel_x = 7; @@ -29851,6 +29972,16 @@ /obj/effect/turf_decal/trimline/yellow/filled/end, /turf/open/floor/iron/textured, /area/station/medical/medbay/central) +"kNV" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portquartersolar, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "kOf" = ( /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/circuit/telecomms/mainframe, @@ -29927,6 +30058,15 @@ "kOR" = ( /turf/closed/wall, /area/station/hallway/primary/aft) +"kOV" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "kOX" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -30842,6 +30982,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"lek" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "lfc" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/stripes/corner{ @@ -31002,15 +31147,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"lhX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "lia" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -31293,6 +31429,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"lmK" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "lmL" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/abandoned, @@ -31730,6 +31874,13 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) +"ltg" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/camera/directional/west{ + c_tag = "Solar Maintenance - Fore Starboard" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "ltm" = ( /obj/machinery/atmospherics/components/tank/oxygen{ dir = 4 @@ -31855,6 +32006,14 @@ }, /turf/open/floor/iron, /area/station/security/range) +"lvs" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "lvu" = ( /obj/machinery/door/window/left/directional/west{ dir = 4; @@ -32065,6 +32224,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"lzJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "lzL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32144,13 +32310,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"lBt" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "lBv" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron/dark, @@ -32270,6 +32429,12 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"lFe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/engine, +/area/station/science/xenobiology) "lFo" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -32311,11 +32476,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"lGN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) "lGR" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -32409,6 +32569,18 @@ "lJa" = ( /turf/open/floor/grass, /area/station/service/hydroponics/garden) +"lJg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "lJh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32749,13 +32921,21 @@ /turf/open/floor/iron/dark, /area/station/medical/medbay/central) "lOY" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/box, -/turf/open/floor/iron, +/obj/machinery/button/door{ + id = "XenoPens"; + layer = 3.3; + name = "Xenobiology Lockdown"; + pixel_y = 0; + req_access = list("xenobiology"); + pixel_x = -24 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "lOZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, @@ -32960,15 +33140,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"lTi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology Lab - Central North"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lTj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -33050,16 +33221,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/side, /area/station/medical/treatment_center) -"lTY" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Bow Solar Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/obj/effect/landmark/navigate_destination/common/portbowsolar, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "lTZ" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/sealed/mecha/working/ripley/cargo, @@ -33126,16 +33287,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/dorms) -"lUM" = ( -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/machinery/power/solar_control{ - dir = 4; - id = "aftport"; - name = "Port Quarter Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "lUP" = ( /obj/machinery/button/crematorium{ id = "crematoriumChapel"; @@ -33417,6 +33568,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/bar) +"lYY" = ( +/obj/machinery/duct, +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "3" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "lZk" = ( /obj/machinery/power/turbine/inlet_compressor{ dir = 4 @@ -33582,14 +33743,14 @@ /turf/open/floor/iron/vaporwave, /area/station/service/library) "mdo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Xenobiology Maintenance" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "mdp" = ( /obj/structure/sign/warning/yes_smoking, /turf/closed/wall, @@ -33641,6 +33802,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) +"meQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) "mfh" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -34007,6 +34175,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"mmF" = ( +/obj/machinery/light/small/directional/east, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "mmR" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -34261,6 +34451,15 @@ /obj/item/lighter, /turf/open/floor/carpet, /area/station/command/bridge) +"mrJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "mrL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, @@ -34291,11 +34490,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"msR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) "msT" = ( /obj/structure/table, /obj/item/food/mint, @@ -34848,6 +35042,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/break_room) +"mBj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "mBw" = ( /obj/machinery/power/emitter, /obj/machinery/light/small/directional/south, @@ -34906,14 +35104,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"mCj" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #7"; - dir = 5; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "mCn" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -35258,6 +35448,16 @@ "mHT" = ( /turf/closed/wall, /area/station/engineering/atmos) +"mIg" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portbowsolar, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) "mIi" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=9.2-Escape-2"; @@ -35345,6 +35545,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mJQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "mJT" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/structure/table/reinforced, @@ -35498,10 +35703,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "mMl" = ( /obj/structure/cable, @@ -35530,12 +35735,14 @@ /turf/open/floor/iron, /area/station/commons/dorms) "mMK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/structure/cable, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "mMM" = ( /obj/structure/table/reinforced, @@ -35843,12 +36050,6 @@ }, /turf/closed/wall, /area/station/science/lobby) -"mSU" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "mTg" = ( /obj/structure/cable, /obj/machinery/door/airlock/hatch{ @@ -36005,13 +36206,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"mVR" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light_switch/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "mVW" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -36452,7 +36646,6 @@ /turf/open/floor/iron, /area/station/engineering/main) "ncF" = ( -/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -36862,6 +37055,9 @@ pixel_y = 4; req_access = list("xenobiology") }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen5" + }, /turf/open/floor/iron, /area/station/science/xenobiology) "nkD" = ( @@ -36969,6 +37165,10 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"nmy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "nmH" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -37188,6 +37388,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"nqk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "nqo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -37431,6 +37638,14 @@ }, /turf/open/floor/engine, /area/station/science/explab) +"ntM" = ( +/obj/machinery/power/solar_control{ + id = "foreport"; + name = "Port Bow Solar Control" + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "ntP" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -37857,6 +38072,10 @@ /area/station/engineering/atmospherics_engine) "nBa" = ( /obj/structure/cable, +/obj/machinery/power/solar{ + id = "aftport"; + name = "Aft-Port Solar Array" + }, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/aft) "nBf" = ( @@ -38035,6 +38254,13 @@ /obj/item/clothing/glasses/science, /turf/open/floor/iron, /area/station/science/xenobiology) +"nEe" = ( +/obj/structure/cable, +/obj/machinery/light_switch/directional/south, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "nEf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -38348,14 +38574,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/hallway/primary/port) -"nLX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) "nLZ" = ( /obj/item/toy/beach_ball/branded, /turf/open/space/basic, @@ -38496,6 +38714,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"nOh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "nOi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38645,13 +38870,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"nQl" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "nQw" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -38723,6 +38941,27 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"nRz" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "nRR" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/directional/east, @@ -38749,14 +38988,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"nSC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nTd" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/seed, @@ -38992,14 +39223,13 @@ /turf/open/space/basic, /area/space/nearstation) "nYL" = ( -/obj/machinery/door/airlock/hatch{ - name = "Xenobiology Maintenance" - }, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "nYO" = ( /obj/item/reagent_containers/spray/plantbgone, /obj/item/reagent_containers/spray/pestspray{ @@ -39174,6 +39404,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"obi" = ( +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "4" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "obk" = ( /obj/item/target/alien, /turf/open/floor/plating, @@ -39364,6 +39603,11 @@ "oew" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"oeO" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "oeQ" = ( /obj/structure/table, /obj/item/paper_bin/construction, @@ -39486,6 +39730,15 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/commons/lounge) +"ogF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "ogJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -39559,6 +39812,7 @@ id = "xenobio6"; name = "Xenobio Pen 6 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "ohE" = ( @@ -40187,10 +40441,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/security/prison/work) -"otR" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "ouc" = ( /obj/structure/closet/crate, /obj/structure/cable, @@ -40513,6 +40763,16 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"ozs" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Bow Solar Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardbowsolar, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "ozB" = ( /obj/item/cigbutt, /obj/structure/table/reinforced, @@ -40839,6 +41099,12 @@ dir = 8 }, /area/station/engineering/atmos) +"oFv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "oFz" = ( /turf/closed/wall, /area/station/science/explab) @@ -41653,6 +41919,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/white, /area/station/science/xenobiology) "oWb" = ( @@ -41733,6 +42000,23 @@ /obj/item/clothing/glasses/sunglasses, /turf/open/floor/wood, /area/station/service/lawoffice) +"oXJ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/structure/closet/crate/engineering/electrical, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/cable_coil, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "oXL" = ( /obj/machinery/disposal/bin, /obj/structure/cable, @@ -42166,8 +42450,8 @@ /area/station/science/robotics/lab) "pfP" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "pfR" = ( /obj/machinery/portable_atmospherics/canister/air, @@ -42204,15 +42488,13 @@ /obj/effect/spawner/random/entertainment/lighter, /turf/open/floor/wood, /area/station/commons/dorms) -"pgM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +"pgJ" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/camera/directional/west{ + c_tag = "Solar Maintenance - Fore Port" }, -/obj/structure/cable, -/obj/structure/sink/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "pgP" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/stasis, @@ -42261,6 +42543,10 @@ pixel_x = 10; pixel_y = -1 }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen1"; + dir = 2 + }, /turf/open/floor/iron, /area/station/science/xenobiology) "phN" = ( @@ -42294,15 +42580,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"phT" = ( -/obj/structure/cable, -/obj/machinery/power/solar_control{ - dir = 1; - id = "starboardsolar"; - name = "Starboard Quarter Solar Control" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "pic" = ( /obj/structure/table, /obj/machinery/recharger, @@ -42495,6 +42772,11 @@ "pma" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) +"pms" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "pmZ" = ( /obj/machinery/light_switch/directional/west{ pixel_y = 26 @@ -42636,6 +42918,7 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 8 }, +/obj/machinery/smartfridge/petri/preloaded, /turf/open/floor/iron/white, /area/station/science/cytology) "ppD" = ( @@ -42746,13 +43029,6 @@ /obj/structure/closet/l3closet, /turf/open/floor/iron/dark, /area/station/medical/storage) -"pro" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "prv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42804,12 +43080,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/side, /area/station/science/lobby) -"psc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "psl" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -42894,6 +43164,10 @@ name = "Containment Pen #1"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen7"; + dir = 4 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "psV" = ( @@ -42920,11 +43194,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/lockers) -"ptn" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "ptH" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -43083,18 +43352,23 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"pwy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "pwM" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) "pwZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "pxj" = ( /obj/machinery/door/airlock/research/glass{ @@ -43400,20 +43674,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"pDl" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - icon_state = "right"; - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "pDs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -43780,10 +44040,10 @@ /turf/open/floor/iron/dark/textured_half, /area/station/bitrunning/den) "pJf" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "pJi" = ( /obj/machinery/firealarm/directional/south, @@ -43811,12 +44071,12 @@ /turf/open/floor/iron/freezer, /area/station/security/prison/shower) "pJA" = ( -/obj/structure/closet/secure_closet/cytology, /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/machinery/smartfridge/organ, /turf/open/floor/iron/white, /area/station/science/cytology) "pJE" = ( @@ -44070,13 +44330,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"pOo" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "pOv" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -44094,6 +44347,12 @@ }, /turf/open/floor/circuit/green/off, /area/station/science/research) +"pOF" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "pOK" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -44163,7 +44422,10 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "pQu" = ( /obj/machinery/door/window/right/directional/east{ @@ -44425,6 +44687,11 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/grimy, /area/station/security/interrogation) +"pUX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "pVi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light_switch/directional/north, @@ -44462,20 +44729,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/brig) -"pVR" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/storage/box/masks{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "pVZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -44567,17 +44820,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics) -"pXo" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) "pXA" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -44613,6 +44855,10 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"pYh" = ( +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "pYn" = ( /obj/structure/sign/plaques/kiddie/library{ pixel_y = -32 @@ -44646,13 +44892,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/lobby) -"pZi" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "pZn" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -44664,6 +44903,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) +"pZG" = ( +/obj/machinery/power/solar_control{ + id = "forestarboard"; + name = "Starboard Bow Solar Control" + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "pZI" = ( /obj/effect/landmark/navigate_destination/library, /turf/open/floor/carpet, @@ -44679,6 +44926,7 @@ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/closet/secure_closet/cytology, /turf/open/floor/holofloor/dark, /area/station/science/cytology) "qag" = ( @@ -44765,14 +45013,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"qbO" = ( -/obj/machinery/power/solar_control{ - id = "foreport"; - name = "Port Bow Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "qbZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -44926,16 +45166,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"qfl" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "qfp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -45191,14 +45421,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"qiD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qjf" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -45329,12 +45551,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"qll" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "qlG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -45609,6 +45825,12 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"qqq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "qrg" = ( /obj/machinery/light_switch/directional/north, /turf/open/floor/circuit/green{ @@ -45887,6 +46109,10 @@ name = "Containment Pen #4"; req_access = list("xenobiology") }, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "pen4"; + dir = 8 + }, /turf/open/floor/engine, /area/station/science/xenobiology) "qvY" = ( @@ -45931,6 +46157,11 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) +"qwM" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "qwR" = ( /obj/structure/sign/directions/evac{ pixel_y = 1 @@ -46145,6 +46376,16 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space) +"qAr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/hatch{ + name = "Xenobiology Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/turf/open/floor/plating, +/area/station/maintenance/department/science/xenobiology) "qAA" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/computer/security/mining{ @@ -46379,11 +46620,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"qFc" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "qFj" = ( /obj/structure/table, /obj/effect/turf_decal/delivery, @@ -46535,15 +46771,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"qIc" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/lab) "qIl" = ( /turf/closed/wall, /area/station/hallway/secondary/command) @@ -46593,6 +46820,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"qID" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/stone, +/area/station/science/xenobiology) "qIK" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/preopen{ @@ -47565,6 +47800,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"qZV" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "rab" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -47799,6 +48045,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/lockers) +"rff" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/fore) "rft" = ( /turf/closed/wall/r_wall, /area/station/security/prison/mess) @@ -48233,6 +48486,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"roL" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "rps" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -48354,6 +48613,7 @@ id = "xenobio4"; name = "Xenobio Pen 4 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "rrT" = ( @@ -48472,6 +48732,12 @@ dir = 1 }, /area/station/science/lobby) +"rtO" = ( +/obj/structure/cable, +/obj/machinery/light_switch/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "rtP" = ( /obj/structure/rack, /obj/effect/turf_decal/bot, @@ -48677,6 +48943,7 @@ id = "xenobio3"; name = "Xenobio Pen 3 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "rwE" = ( @@ -48877,11 +49144,6 @@ /obj/item/multitool, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"rzz" = ( -/obj/structure/sign/warning/cold_temp, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/engine, -/area/station/science/xenobiology) "rzB" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -49512,18 +49774,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"rKg" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "rKh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -49677,11 +49927,11 @@ /turf/open/floor/iron/white, /area/station/science/research) "rMu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "rMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/green{ @@ -49718,6 +49968,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/office) +"rNf" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "rNs" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/blue{ @@ -49981,6 +50236,17 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"rRB" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "rRR" = ( /obj/structure/sign/warning/vacuum/external/directional/south, /obj/machinery/light/small/directional/north, @@ -50188,6 +50454,17 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"rUT" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/chair/stool/directional/south, +/obj/machinery/camera/directional/west{ + c_tag = "Solar Maintenance - Aft Starboard" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "rUU" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -50388,6 +50665,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rYq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) +"rYy" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "rYA" = ( /obj/machinery/porta_turret/ai, /obj/machinery/flasher/directional/north{ @@ -50923,6 +51210,14 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door{ + id = "XenoPens"; + layer = 3.3; + name = "Xenobiology Lockdown"; + pixel_y = 0; + req_access = list("xenobiology"); + pixel_x = 24 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "sgB" = ( @@ -50987,10 +51282,11 @@ /turf/open/floor/engine, /area/station/science/xenobiology) "sie" = ( -/obj/effect/turf_decal/stripes/corner, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "siz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51244,7 +51540,7 @@ dir = 1 }, /obj/effect/turf_decal/bot_white, -/obj/machinery/smartfridge/petri/preloaded, +/obj/machinery/smartfridge/extract/preloaded, /turf/open/floor/iron, /area/station/science/xenobiology) "soa" = ( @@ -51288,13 +51584,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"spk" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/camera/directional/west{ - c_tag = "Solar Maintenance - Fore Port" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "spH" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -51498,6 +51787,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"ssE" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "ssI" = ( /obj/machinery/power/emitter, /turf/open/floor/plating, @@ -51948,6 +52244,11 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) +"sBd" = ( +/obj/structure/lattice, +/obj/item/stack/cable_coil, +/turf/open/space/basic, +/area/space/nearstation) "sBL" = ( /obj/structure/chair/stool/directional/west, /obj/effect/mapping_helpers/broken_floor, @@ -52027,6 +52328,7 @@ id = "xenobio5"; name = "Xenobio Pen 5 Blast Door" }, +/obj/machinery/duct, /turf/open/floor/iron, /area/station/science/xenobiology) "sCz" = ( @@ -52832,13 +53134,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/wood, /area/station/cargo/quartermaster) -"sRI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "sRJ" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/item/kirbyplants{ @@ -53763,15 +54058,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/science/robotics/lab) -"tgm" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tgo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -53850,17 +54136,11 @@ /area/station/cargo/storage) "thT" = ( /obj/structure/cable, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Central West"; - network = list("ss13","rd","xeno") +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/machinery/button/door/directional/east{ - id = "XenoPens"; - name = "Xenobiology Shutters"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "thY" = ( /obj/effect/spawner/random/structure/grille, @@ -54339,14 +54619,6 @@ /obj/effect/spawner/random/clothing/costume, /turf/open/floor/plating, /area/station/maintenance/port) -"tqw" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tqx" = ( /obj/machinery/door/window/left/directional/south{ dir = 1; @@ -54423,19 +54695,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"trL" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio2"; - layer = 3.3; - name = "Xenobio Pen 2 Blast Doors"; - pixel_y = 1; - req_access = list("xenobiology") - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "trM" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -55110,12 +55369,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "tGS" = ( -/obj/structure/cable, -/obj/machinery/door/window/left/directional/north{ - dir = 2; - name = "Containment Pen #2"; - req_access = list("xenobiology") - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, /turf/open/floor/engine, /area/station/science/xenobiology) "tGX" = ( @@ -55175,10 +55431,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"tIe" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tIk" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -55497,13 +55749,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"tMI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tMJ" = ( /obj/structure/toilet/greyscale{ dir = 4 @@ -55693,6 +55938,15 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /turf/open/floor/iron/white, /area/station/medical/pathology) +"tQJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "tRb" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -56100,15 +56354,6 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) -"tYR" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "tYS" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two"; @@ -56932,6 +57177,10 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"unx" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/maintenance/department/science/xenobiology) "unL" = ( /turf/closed/wall, /area/station/maintenance/starboard/greater) @@ -57586,12 +57835,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"uyg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/lab) "uyi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57685,6 +57928,14 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"uAC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) "uAE" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -57709,6 +57960,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"uAV" = ( +/obj/machinery/corral_corner{ + mapping_id = "5" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "uBg" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/computer/atmos_control/carbon_tank{ @@ -57956,15 +58213,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/checkpoint/customs) -"uFn" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "uFq" = ( /obj/machinery/door/window/left/directional/south{ dir = 8; @@ -58200,6 +58448,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"uIi" = ( +/obj/structure/cable, +/obj/machinery/power/solar_control{ + dir = 1; + id = "starboardsolar"; + name = "Starboard Quarter Solar Control" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/starboard/aft) "uIs" = ( /turf/closed/wall, /area/station/service/kitchen) @@ -58278,11 +58535,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/locker) -"uJL" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "uKa" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 6 @@ -58340,21 +58592,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, /area/station/security/medical) -"uKW" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 2; - icon_state = "right"; - name = "Containment Pen #2"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "uLa" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/effect/spawner/random/maintenance/two, @@ -58475,19 +58712,10 @@ /area/station/medical/psychology) "uNs" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "XenoPens"; - name = "Xenobiology Lockdown" - }, -/turf/open/floor/iron, +/turf/closed/wall/r_wall, /area/station/science/xenobiology) "uND" = ( /obj/effect/decal/cleanable/dirt, @@ -58596,15 +58824,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"uQu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/xenobio_guide/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "uQF" = ( /obj/structure/lattice, /obj/item/stack/rods, @@ -58634,6 +58853,15 @@ }, /turf/open/floor/iron/dark, /area/station/security/evidence) +"uRa" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) "uRh" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/airalarm/directional/east, @@ -58837,6 +59065,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) +"uVk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "uVm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59021,11 +59254,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "uYP" = ( -/obj/structure/cable, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, +/obj/machinery/duct, /turf/open/floor/engine, /area/station/science/xenobiology) "uYT" = ( @@ -59196,6 +59425,11 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"vdE" = ( +/obj/structure/lattice, +/obj/item/stack/rods, +/turf/open/space/basic, +/area/space) "vdJ" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -59726,6 +59960,17 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"vlZ" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "vmm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -60186,6 +60431,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/lawoffice) +"vul" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/science/xenobiology) "vun" = ( /turf/closed/wall, /area/station/medical/storage) @@ -60227,13 +60480,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"vvD" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Euthanasia Chamber"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "vvH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -60275,7 +60521,7 @@ /turf/open/floor/plating, /area/station/maintenance/port) "vxa" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "vxi" = ( @@ -60429,13 +60675,13 @@ /turf/open/floor/iron, /area/station/commons/dorms) "vAa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "vAc" = ( /obj/structure/sign/poster/official/cleanliness{ @@ -60618,18 +60864,6 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"vDV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "vEd" = ( /obj/effect/decal/cleanable/blood/old, /obj/machinery/processor{ @@ -60933,15 +61167,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"vJl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "vJt" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/west, @@ -61558,7 +61783,10 @@ /area/station/hallway/primary/central) "vVx" = ( /obj/structure/cable, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, /area/station/science/xenobiology) "vVy" = ( /obj/structure/disposalpipe/segment, @@ -61730,14 +61958,16 @@ /area/station/medical/treatment_center) "vXi" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/north, +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, /turf/open/floor/iron, /area/station/science/xenobiology) "vXt" = ( @@ -61780,6 +62010,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vYc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/stone, +/area/station/science/xenobiology) "vYg" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -61917,6 +62155,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"was" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/stone, +/area/station/science/xenobiology) "waB" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -62120,6 +62365,10 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"weG" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "weJ" = ( /obj/machinery/door/airlock{ name = "Central Emergency Storage" @@ -62421,6 +62670,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"wjT" = ( +/obj/machinery/power/smes, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/aft) "wjV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62560,6 +62815,16 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"wmJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "wmL" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology/hallway) @@ -63042,9 +63307,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"wwc" = ( -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/aft) "wwj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -63381,13 +63643,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"wCH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wCL" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -63448,6 +63703,16 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"wEu" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/science/xenobiology) "wEz" = ( /obj/item/stack/sheet/cardboard, /obj/effect/spawner/random/trash/janitor_supplies, @@ -63745,6 +64010,9 @@ pixel_y = 1; req_access = list("xenobiology") }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen7" + }, /turf/open/floor/iron, /area/station/science/xenobiology) "wKX" = ( @@ -64082,14 +64350,6 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"wPY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "wPZ" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ dir = 1 @@ -64226,17 +64486,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"wSc" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "wSe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64890,6 +65139,17 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"xea" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/bot_white, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron, +/area/station/science/xenobiology) "xej" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -64904,11 +65164,14 @@ /turf/open/floor/plating, /area/station/maintenance/central) "xen" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/science/xenobiology) "xew" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65002,10 +65265,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xfK" = ( -/obj/machinery/drone_dispenser/preloaded, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) "xga" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65176,6 +65435,14 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"xiC" = ( +/obj/machinery/light/floor/has_bulb, +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "6"; + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xiL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) @@ -65888,14 +66155,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/station/cargo/storage) -"xvy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/fans/tiny, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "xvI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66191,6 +66450,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/construction/storage_wing) +"xBw" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Quarter Solar Access" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardquartersolar, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) "xBx" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66620,6 +66889,14 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/warehouse) +"xJa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "xJi" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -66728,15 +67005,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) -"xMr" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/fore) "xMx" = ( /obj/structure/chair/office, /turf/open/floor/iron, @@ -66786,6 +67054,14 @@ /obj/structure/cable, /turf/open/floor/grass, /area/station/medical/pathology) +"xNm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/duct, +/obj/structure/sign/xenobio_guide/directional/east, +/turf/open/floor/stone, +/area/station/science/xenobiology) "xNo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67058,22 +67334,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) -"xRk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "xRB" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"xRH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/station/solars/starboard/aft) "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -67154,17 +67419,6 @@ }, /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) -"xUC" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/engineering/general, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/starboard/fore) "xUE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67228,8 +67482,28 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"xVr" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/obj/machinery/camera{ + c_tag = "Xenobiology Lab - Pen #7"; + dir = 5; + network = list("ss13","rd","xeno") + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xVu" = ( -/turf/closed/wall, +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "2" + }, +/turf/open/floor/engine, /area/station/science/xenobiology) "xVA" = ( /obj/machinery/atmospherics/components/binary/pump{ @@ -67301,6 +67575,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"xWJ" = ( +/obj/machinery/drone_dispenser, +/turf/open/floor/plating, +/area/station/maintenance/department/science/central) "xWQ" = ( /obj/machinery/status_display/door_timer{ id = "Cell 2"; @@ -67459,6 +67737,12 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xZy" = ( +/obj/structure/sign/warning/vacuum/external/directional/east, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/solars/port/fore) "xZB" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -67490,7 +67774,12 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/bot_white, /obj/structure/cable, -/obj/machinery/monkey_recycler, +/obj/machinery/biomass_recycler, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, /turf/open/floor/iron, /area/station/science/xenobiology) "yaj" = ( @@ -67659,13 +67948,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tcomms) -"ycA" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/machinery/camera/directional/north{ - c_tag = "Solar Maintenance - Aft Port" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/solars/port/aft) "ycM" = ( /turf/closed/wall/r_wall, /area/station/security/warden) @@ -67775,6 +68057,18 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/plating, /area/station/service/hydroponics) +"yeL" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "XenoPens"; + name = "Xenobiology Lockdown" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "yeS" = ( /obj/item/retractor, /obj/item/hemostat{ @@ -67879,6 +68173,9 @@ req_access = list("xenobiology"); sync_doors = 4 }, +/obj/machinery/slime_pen_controller{ + mapping_id = "pen4" + }, /turf/open/floor/iron, /area/station/science/xenobiology) "ygR" = ( @@ -67940,6 +68237,14 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) +"yig" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/box, +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron, +/area/station/science/xenobiology) "yih" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/shower/directional/west, @@ -78221,11 +78526,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +rrt +rrt +rrt +rrt +rrt aaa aaa aaa @@ -78479,9 +78784,9 @@ aaa aaa aaa rrt -rrt -rrt -rrt +aaa +aaa +aaa rrt aaa aaa @@ -78726,27 +79031,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa rrt -aaa -aaa -aaa +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt rrt aaa +kuK aaa -aaa -aaa -aaa -aaa -aaa +rrt +aUn +aUn +aUn +aUn +aUn +aUn +aUn aaa aaa aaa @@ -78984,28 +79289,28 @@ aaa aaa aaa rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt aaa -kuK +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +dPw +aaa +aIw +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt aaa aaa aaa @@ -79240,35 +79545,35 @@ aaa aaa aaa aaa +rrt aaa +lMJ aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +xuK +xuK +xuK +aYN lMJ -aaa aIw -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +lMJ +aYN +xuK +xuK +xuK +lMJ +lMJ +lMJ +lMJ +lMJ +rrt +rrt +rrt +rrt +rrt +rrt +rrt blx aaa blx @@ -79503,17 +79808,17 @@ lMJ aaa aaa aaa -xuK -xuK -xuK +eqf +eqf +eqf aYN -lMJ -aIw -lMJ +aaa +raz +aaa +aYN +aYN +eqf aYN -xuK -xuK -xuK aaa aaa aaa @@ -79760,29 +80065,29 @@ lMJ lMJ lMJ lMJ -eqf +xuK +xuK +xuK aYN eqf -aYN -aaa raz -aaa -aYN -aYN eqf aYN -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +xuK +xuK +xuK +dJN +lMJ +rNf +rNf +lMJ +lMJ +jXe +lMJ +lMJ +dJN +dJN +dJN dJN aaa lMJ @@ -80017,17 +80322,17 @@ lMJ aaa aaa aaa -xuK -xuK -xuK eqf eqf +eqf +bOr +aaa raz +aaa +aYN +aYN eqf aYN -xuK -xuK -xuK aaa aaa aaa @@ -80274,17 +80579,17 @@ lMJ aaa aaa aaa -eqf -aYN -aYN -bOr -aaa -raz -aaa -aYN +xuK +xuK +xuK aYN -eqf +lMJ +fzl +vdE aYN +xuK +xuK +xuK aaa aaa aaa @@ -80531,17 +80836,17 @@ lMJ aaa aaa aaa -xuK -xuK -xuK -aYN +aaa +aaa +aaa lMJ -fzl -uQF -aYN -xuK -xuK -xuK +aaa +aIw +aaa +sBd +aaa +aaa +aaa aaa aaa aaa @@ -82337,7 +82642,7 @@ lMJ aaa fzl aaa -lMJ +uQF aaa aaa aaa @@ -82594,7 +82899,7 @@ aYN aaa riK aaa -aYN +bOr xuK xuK xuK @@ -82844,8 +83149,8 @@ aaa aaa aaa aaa -aYN -aYN +eqf +eqf eqf aYN aaa @@ -83358,8 +83663,8 @@ aaa aaa aaa aaa -aYN -aYN +eqf +eqf eqf aYN aaa @@ -83620,7 +83925,7 @@ xuK xuK aYN aaa -aIw +raz aaa aYN xuK @@ -84136,7 +84441,7 @@ aYN aaa riK aaa -aYN +bOr xuK xuK xuK @@ -84386,8 +84691,8 @@ lMJ aaa aaa aaa -aYN -aYN +eqf +eqf eqf aYN aaa @@ -84901,7 +85206,7 @@ aaa aaa aaa eqf -aYN +eqf eqf aYN aaa @@ -85535,7 +85840,7 @@ aaa aaa aaa sGL -fHe +qZV sGL aaa aaa @@ -85792,7 +86097,7 @@ aaa aaa aaa sGL -eIc +uAC sGL aaa aaa @@ -86049,7 +86354,7 @@ tSw tSw gAf sGL -wSc +ctN sGL sGL lMJ @@ -86305,9 +86610,9 @@ qEf gXF gmS bhS -ycA -pro -lUM +cxi +jfJ +dvT ecz aaa aaa @@ -86561,10 +86866,10 @@ drm drm tSw mnN -fuF -wPY -nQl -tYR +kNV +gnL +dQb +dWA ecz aaa aaa @@ -86712,9 +87017,9 @@ aaa tOm tOm tOm -qbO -spk -mVR +ntM +pgJ +fRZ hZQ ybi twr @@ -86819,9 +87124,9 @@ tSw tSw vUM bhS -iVn -dqw -mSU +rtO +cnF +wjT ecz aaa aaa @@ -86966,13 +87271,13 @@ aaa raz raz raz -xMr -xvy -eha -bbL -hoc -qll -lTY +grI +hsp +iJm +lzJ +oeO +ktG +mIg qMD vMd fUr @@ -87226,9 +87531,9 @@ aaa tOm tOm tOm -gfc -ewF -uJL +xZy +btB +qwM srk qGP sHu @@ -96312,7 +96617,7 @@ lPx wOS orv dPY -xfK +xWJ kQe cId rQl @@ -99379,7 +99684,7 @@ rHE dbd aBJ jXK -aJE +sQB gLU uDO oOB @@ -99636,7 +99941,7 @@ wXF wXF wXF dlG -uyg +ipM rsD qos cQr @@ -99884,16 +100189,16 @@ aKb aKb wpx htd -qfl -uFn -lhX -cZs -pOo -eHN +mrJ +lvs +xJa +kxW +gWH +roL mxI eBw gbS -uyg +ipM dYT tCT bpA @@ -100150,7 +100455,7 @@ tUn hKV wXF jLm -aJE +sQB lqL psT wqj @@ -100407,7 +100712,7 @@ tUn hKV wIo jBi -aJE +sQB gIi iPe mJG @@ -100664,7 +100969,7 @@ tUn hKV wXF mvR -qIc +jKa mvR mvR mvR @@ -104815,15 +105120,15 @@ aaa aaa aaa aaa -gCE +nBa aaa aaa aaa -gCE +nBa aaa aaa aaa -gCE +nBa aaa aaa aaa @@ -105071,17 +105376,17 @@ aaa aaa aaa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE +nBa cKn -gCE +nBa aaa aaa aaa @@ -105328,17 +105633,17 @@ aaa aaa aaa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa aaa aaa @@ -105585,17 +105890,17 @@ aaa aaa aaa aaa -gCE +nBa cKn -gCE +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa aaa aaa @@ -105833,9 +106138,9 @@ fwP imU fPD oWc -qFc -bnp -phT +rYy +rUT +uIi gDT gDT gDT @@ -105843,7 +106148,7 @@ aaa aaa aaa aaa -xRH +cKn aaa aaa aaa @@ -105851,7 +106156,7 @@ cKn aaa aaa aaa -xRH +cKn aaa aaa lMJ @@ -106089,25 +106394,25 @@ egs ftK ixV pTu -fPB -git -kqj -cgd -fUq -jUK -dKh +xBw +hRU +lmK +pms +apT +pOF +vlZ +rxH +rxH +rxH +rxH rxH rxH rxH rxH -uYi rxH -uYi rxH rxH rxH -uYi -uYi uYi rxH rxH @@ -106271,11 +106576,11 @@ qXB fwG ldO oQb -lGN -azS -lGN -nLX -lGN +psZ +mSB +psZ +edC +psZ psZ qXB ttA @@ -106347,9 +106652,9 @@ bLd ixd bLd oWk -bxg -otR -wwc +oXJ +mmF +nRz gDT gDT gDT @@ -106361,11 +106666,11 @@ cKn aaa aaa aaa -xRH +cKn aaa aaa aaa -xRH +cKn aaa aaa lMJ @@ -106613,17 +106918,17 @@ aaa aaa aaa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa aaa aaa @@ -106870,17 +107175,17 @@ aaa aaa aaa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE +nBa cKn -gCE +nBa aaa aaa aaa @@ -107127,17 +107432,17 @@ aaa aaa aaa aaa -gCE -xRH -gCE +nBa +cKn +nBa aaa -gCE -xRH +nBa +cKn nBa aaa -gCE +nBa cKn -gCE +nBa aaa aaa aaa @@ -107385,15 +107690,15 @@ aaa aaa aaa aaa -gCE +nBa aaa aaa aaa -gCE +nBa aaa aaa aaa -gCE +nBa aaa aaa aaa @@ -109926,18 +110231,20 @@ aaa aaa aaa aaa -aaa -aaa lMJ lMJ lMJ oMA lSw +oMA +oMA wmL gUS qBo gUS wmL +oMA +oMA lSw oMA aox @@ -109963,8 +110270,6 @@ aaa aaa aaa aaa -aaa -aaa lKu aaa aaa @@ -110182,8 +110487,6 @@ lMJ lMJ lMJ lMJ -lMJ -lMJ lFq oMA oMA @@ -110192,7 +110495,11 @@ oMA eYu agN bXs +hzL +hzL tLc +hjw +hjw juH pJA hLJ @@ -110276,8 +110583,6 @@ aaa aaa aaa aaa -aaa -aaa "} (165,1,1) = {" aaa @@ -110438,8 +110743,6 @@ aaa aaa lMJ aaa -lMJ -aaa aaa uaR oue @@ -110449,8 +110752,12 @@ qad xfm nHG hjw +hjw +hjw bqJ hzL +hzL +hzL wNO tml mez @@ -110533,8 +110840,6 @@ aaa aaa aaa aaa -aaa -aaa "} (166,1,1) = {" aaa @@ -110695,8 +111000,6 @@ aaa aaa dxK aaa -dxK -aaa aaa oMA sKf @@ -110706,7 +111009,11 @@ vhZ tsy sRa ppC +hjw +hjw twu +mBj +mBj mKD hxY nae @@ -110790,8 +111097,6 @@ aaa aaa aaa aaa -aaa -aaa "} (167,1,1) = {" aaa @@ -110952,8 +111257,6 @@ aaa aaa lMJ aaa -lMJ -aaa aaa uaR jHX @@ -110963,7 +111266,11 @@ toR syV jsi eoZ +hjw +hjw jjm +hjw +hjw nui wWV vsp @@ -110986,8 +111293,6 @@ aaa aaa aaa aaa -aaa -aaa lKu aaa aaa @@ -111210,8 +111515,6 @@ lMJ lMJ lMJ lMJ -lMJ -lMJ jlU jlU jlU @@ -111220,9 +111523,13 @@ jlU jlU snZ lVB +ycv +ycv bsE -uHD kvT +kvT +uHD +xea jlU jlU jlU @@ -111304,8 +111611,6 @@ aaa aaa aaa aaa -aaa -aaa "} (169,1,1) = {" aaa @@ -111466,8 +111771,6 @@ aaa aaa aaa aaa -lMJ -aaa aaa aaa cXP @@ -111477,7 +111780,11 @@ plp gog fUx pst +pYh +pYh fkk +pYh +pYh vuK yag hFz @@ -111561,8 +111868,6 @@ aaa aaa aaa aaa -aaa -aaa "} (170,1,1) = {" aaa @@ -111721,25 +112026,27 @@ eoU aaf aaa aaa -aaa -aaa lMJ aaa aaa aaa cXP mtu -vxa +mtu mtu jfS bQQ lVB +ycv +ycv oWa -iWc +ycv +ycv +mJQ ces elm mtu -vxa +mtu mtu cXP aaa @@ -111751,8 +112058,6 @@ aaa aaa aaa aaa -aaa -aaa lKu aaa aaa @@ -111977,8 +112282,6 @@ sUo eoU aaf aaa -aaa -aaa rrt rrt lMJ @@ -111991,7 +112294,11 @@ ycd gog jjj jNo +min +jOI sgk +min +min klK aDQ hFz @@ -112075,8 +112382,6 @@ aaa aaa aaa aaa -aaa -aaa "} (172,1,1) = {" aaa @@ -112162,9 +112467,9 @@ aav sxo sxo sxo -gXs -kbn -lBt +pZG +ltg +nEe tCS dOY psZ @@ -112234,28 +112539,30 @@ eoU eoU aaf aaa -aaa -aaa rrt aaa aaa bPB kWc -xiL +jlU gTK hMv wKT vGq vXi ncF +flp +yeL uNs +flp +flp gSM frt vGq qko gyI phI -xiL +jlU kvO bPB aaa @@ -112332,8 +112639,6 @@ aaa aaa aaa aaa -aaa -aaa "} (173,1,1) = {" aaa @@ -112416,13 +112721,13 @@ jhd rQw rQw jhd -cpl -duN -xUC -sRI -aUT -xRk -iJJ +uRa +ivK +rRB +rff +jnv +pwy +ozs etA psZ tCS @@ -112489,31 +112794,33 @@ aaf aaf aaf aaf -aaf -aaa rrt aox aox aox hbK hbK +oFv +jlU rMu -xiL -jCO -fdZ -mMK +nOh mLW -mMK +lJg +mLW +mLW +cFW mMK jxH -tMI +pwZ pwZ dxc +bRc fdZ -fdZ -jvX -xiL +nOh +nOh gTS +jlU +nqk hbK hbK lMJ @@ -112589,8 +112896,6 @@ aaa aaa aaa aaa -aaa -aaa "} (174,1,1) = {" aaa @@ -112676,9 +112981,9 @@ aav sxo sxo sxo -foV -dUk -ptn +dRR +gFd +lek buk cNi wrn @@ -112746,31 +113051,33 @@ eoU eoU eoU eoU -lMJ -aaa rrt lAu lAu lMJ wrc oyj +qAr +uVk xen mdo vAa -vJl +iwO amV vVx -kyh +iwO iwO pQj -jzw +thT thT jzw sie -pgM -qiD +nYL +nYL nYL ddK +hoV +gga hAN wrc aaa @@ -112818,38 +113125,36 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(175,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(175,1,1) = {" aaa aaa aaa @@ -113004,29 +113309,31 @@ jRg jRg eoU lMJ -aaa -lMJ lMJ lMJ lMJ wrc oyj xiL -xiL +fUH +mtu +mtu idA -xVu +lYY dgz -tIe -xVu -hja -vDV -nSC -xVu +eTk +uAV +mtu +mtu +mtu +aVx pJf pfP xVu -idA -xiL +mtu +mtu +mtu +iUk xiL lmn wrc @@ -113103,8 +113410,6 @@ aaa aaa aaa aaa -aaa -aaa "} (176,1,1) = {" aaa @@ -113260,8 +113565,6 @@ pnE wit lPa eoU -lMJ -aaa rrt lAu lAu @@ -113269,21 +113572,25 @@ lMJ hbK uhs xiL -kHt -iOZ -idF -faD -lTi -xVu -cXP -cXP -cXP -xVu -jbk -iWc -pVR -hCw -mCj +mtu +mtu +mtu +idA +mtu +dgz +eTk +mtu +mtu +mtu +mtu +mtu +pJf +pfP +mtu +mtu +mtu +mtu +mtu xiL lmn hbK @@ -113360,8 +113667,6 @@ aaa aaa aaa aaa -aaa -aaa "} (177,1,1) = {" aaa @@ -113519,34 +113824,34 @@ jRg eoU lMJ aaa -rrt -aox -aox -aox +aaa +aaa wrc oyj xiL eSr +vxa +fmR tGS -uKW -faD -iWc -cXP -aJQ +uYP +dgz +pfP +uYP +uYP gXw -pZi -cXP -lVB -iWc -pDl +mtu +mtu +pJf +pfP +uYP uYP +cjT +vxa ljF xiL lmn wrc -lMJ -lMJ -mxQ +aaa aaa aaa aaa @@ -113776,34 +114081,34 @@ eoU eoU lMJ aaa -rrt -lAu -lAu -lMJ -hbK +aaa +aaa +wrc oyj xiL mtu +mtu +mtu iOZ -trL -faD -iWc -cXP -gXw -gXw -vvD -cXP -lVB -iWc -eSC -hCw +mtu +dgz +eTk +mtu +mtu +mtu +mtu +mtu +pJf +pfP +mtu +mtu +mtu +mtu mtu xiL lmn -hbK -aaa +wrc aaa -lMJ aaa aaa aaa @@ -114033,34 +114338,34 @@ wJw eoU lMJ aaa -lMJ -lMJ -lMJ -lMJ -wrc +aaa +aaa +hbK oyj xiL -xiL -idA -xVu -uQu -iWc -xVu -pXo -jSj -rzz -xVu -lVB -exu -xVu -idA -xiL +iTV +mtu +mtu +iOZ +gbm +dgz +rYq +jhX +mtu +mtu +mtu +jhX +meQ +pfP +kOV +mtu +mtu +mtu +xVr xiL lmn -wrc -aaa +hbK aaa -mxQ aaa aaa aaa @@ -114288,37 +114593,37 @@ cGV hDe xEg eoU -lMJ -aaa rrt -lAu -lAu -lMJ +aaa +aaa +aaa wrc oyj -oyj xiL -nEb -bSu -caf -tgm -gKD -fdZ -fdZ -fdZ -iMR -bnQ -psc -wCH -rKg +mtu +mtu +mtu +iOZ +mtu +dgz +eTk +mtu +mtu +mtu +mtu +mtu +pJf +pfP +mtu +mtu +mtu +mtu +mtu xiL lmn -lmn wrc aaa aaa -mxQ -aaa aaa aaa aaa @@ -114545,33 +114850,35 @@ wEf ojv wJw eoU -lMJ -aaa rrt aox aox aox -hbK -hbK +wrc oyj xiL -nkq -rwx -byP -dac -evD +eSr +vxa +khw +lFe +uYP +dgz +pfP +uYP +uYP +xiC +mtu +mtu pJf -ycv -tIe -min -min -tqw -ohD -dQa +pfP +uYP +uYP +eml +vxa +ljF xiL lmn -hbK -hbK +wrc lMJ lMJ mxQ @@ -114611,44 +114918,42 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -"} -(182,1,1) = {" +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +"} +(182,1,1) = {" aaa aaa aaa @@ -114803,31 +115108,34 @@ eoU eoU eoU lMJ -aaa -aaa -aaa -rrt -aaa -aaa -wrc +lAu +lAu +lMJ +hbK oyj xiL -jgq -imw -aft -ygF -rrL -fMF -min -irp -sCv -ixR -shY -eOP -jgq +mtu +mtu +mtu +idA +mtu +dgz +eTk +mtu +mtu +mtu +mtu +mtu +pJf +pfP +mtu +mtu +mtu +mtu +mtu xiL lmn -wrc +hbK aaa aaa lMJ @@ -114901,9 +115209,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (183,1,1) = {" aaa @@ -115059,38 +115364,38 @@ yfx ets ets eoU -lMJ -aaa -aaa -aaa rrt -aaa -aaa +lMJ +lMJ +lMJ wrc oyj xiL +cFw mtu mtu -vHm -shY -qvQ -aft -diq -shY -gjv -aft -xCA +idA +obi +dgz +eTk +iCZ +mtu +mtu +mtu +cqQ +pJf +pfP +jau mtu mtu +mtu +dMA xiL lmn wrc aaa aaa -rrt -aaa -aaa -aaa +mxQ aaa aaa aaa @@ -115316,38 +115621,38 @@ oiI rvx dzY eoU -lMJ -aaa -aaa -aaa rrt -rrt -rrt -hbK +lAu +lAu +lMJ +wrc oyj xiL -rTi -iXS -vHm -xCA -mtu -vHm -gva -xCA -vxa -vHm -xCA -iXS -lWM xiL +nEb +bae +elT +heo +ddN +fJq +gmB +gmB +gmB +gmB +gmB +was +ssE +nOh +vYc +wmJ +ogF +xiL +unx lmn -hbK -lMJ -lMJ -rrt -aaa +wrc aaa aaa +mxQ aaa aaa aaa @@ -115573,38 +115878,38 @@ aLr aJe ets eoU -lMJ -aaa -aaa -aaa -aaa -aaa aaa +aox +aox +aox hbK oyj +oyj xiL -xiL -xiL -xiL -weD -mtu -vHm -gva -xCA -mtu -fVV -xiL -xiL -xiL +nkq +rwx +wEu +vul +kkT +jdj +xNm +jdj +jdj +jdj +jdj +qID +jdj +qqq +kKG +ohD +dQa xiL lmn +lmn hbK -aaa -aaa -aaa -aaa -lKu -aaa +lMJ +lMJ +mxQ aaa aaa aaa @@ -115830,37 +116135,37 @@ eoU eoU eoU eoU -lMJ -aaa -aaa -aaa aaa aaa +rrt aaa +dAJ hbK oyj -oyj -goW -msN xiL +jgq +imw +aft +ygF +rrL +cHV jlU -gEu -lKd +aYt gva -iZJ -rDd +aYt +jlU jlU +sCv +ixR +shY +eOP +jgq xiL -qxr lmn -lmn -hAN hbK +dAJ aaa -aaa -aaa -aaa -aaa +lMJ aaa aaa aaa @@ -116087,34 +116392,37 @@ xWn kwZ kwZ eoU -lMJ -aaa -aaa aaa aaa +rrt aaa aaa -hbK -rDf -rDf -rDf -uhs -fjd -jlU +wrc +oyj +xiL +mtu +mtu +vHm +shY +qvQ +aft eJI -sZN -msR -xkv +ycv +kCw +ycv lOY -jlU -iOJ +shY +gjv +aft +xCA +mtu +mtu +xiL lmn -rDf -rDf -utD -hbK +wrc aaa aaa +rrt aaa aaa aaa @@ -116186,11 +116494,8 @@ aaa aaa aaa aaa -aaa -aaa -aaa -"} -(188,1,1) = {" +"} +(188,1,1) = {" aaa aaa aaa @@ -116344,37 +116649,37 @@ iiL kwZ aWa eoU -lMJ -nYJ -lMJ +aaa +aaa rrt rrt rrt -lMJ -hbK -hbK -wMz -rDf -eUe -eSb -nnc -hdy -nnc -rvK -nnc -hdy -aWp -eSb -udp -wHd -uLa hbK +oyj +xiL +rTi +iXS +vHm +xCA +mtu +vHm +fHs +ycv +kCw +kCw +gRY +xCA +mtu +vHm +xCA +iXS +lWM +xiL +lmn hbK -aaa -aaa -aaa -aaa -aaa +lMJ +lMJ +rrt aaa aaa aaa @@ -116601,39 +116906,39 @@ tDR aNB kwZ eoU -lMJ aaa aaa -lMJ aaa aaa aaa -lMJ -hbK -hbK hbK -mgS -hbK -jlU -mtu -mtu -gyK +oyj +xiL +xiL +xiL +xiL +weD mtu +vHm +weG +ycv +ycv +ycv +dGk +xCA mtu -jlU -hbK -mTg -hbK -hbK +fVV +xiL +xiL +xiL +xiL +lmn hbK -lMJ -aaa -aaa -aaa aaa aaa aaa aaa +lKu aaa aaa aaa @@ -116858,29 +117163,33 @@ eoU eoU eoU eoU -lMJ -aaa aaa -lMJ aaa aaa aaa -lMJ aaa hbK -tmU -fGy -wyo +oyj +oyj +goW +msN +xiL jlU -dLm -mtu -gyK -mtu -mtu +gEu +lKd +ycv +ycv +ycv +ycv +ycv +iZJ +rDd jlU -qgn -mCV -wyo +xiL +qxr +lmn +lmn +hAN hbK aaa aaa @@ -116956,10 +117265,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa "} (191,1,1) = {" aaa @@ -117116,28 +117421,32 @@ lMJ lMJ lMJ lMJ -lMJ -rrt -nYJ -rrt -rrt -rrt -lMJ -lMJ +aaa +aaa +aaa +aaa hbK -pWT rDf -uLa +rDf +rDf +uhs +fjd jlU -eSr -mtu -jQz -nJr -ljF +yig +sZN +pUX +nmy +cVQ +nmy +pUX +xkv +igH jlU -lUS -pHt +iOJ +lmn rDf +rDf +utD hbK aaa aaa @@ -117213,10 +117522,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa "} (192,1,1) = {" aaa @@ -117373,33 +117678,33 @@ aaa aaa lMJ aaa -aaa -aaa -lMJ -aaa -aaa -aaa +rrt +rrt +rrt lMJ -aaa -bPB hbK -wrc -wrc -jlU -mtu -mtu -mtu -mtu -mtu -jlU -wrc -wrc hbK -bPB -lMJ -aaa -aaa -aaa +wMz +rDf +eUe +eSb +nnc +hdy +cbn +tQJ +tQJ +rvK +tQJ +tQJ +nnc +hdy +aWp +eSb +udp +wHd +uLa +hbK +hbK aaa aaa aaa @@ -117630,25 +117935,32 @@ aaa aaa nYJ aaa -aaa -aaa -aaa -aaa -aaa -aaa lMJ aaa aaa aaa -aaa lMJ +hbK +hbK +hbK +mgS +hbK jlU +mtu +mtu +mtu +mtu +gyK +mtu +mtu +mtu +mtu jlU -bPu -asL -kcu -jlU -jlU +hbK +mTg +hbK +hbK +hbK lMJ aaa aaa @@ -117724,13 +118036,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa "} (194,1,1) = {" aaa @@ -117886,32 +118191,32 @@ rrt rrt rrt rrt -lMJ -lMJ -rrt -rrt -lAu -rrt -rrt -rrt -rrt -rrt rrt lMJ -lMJ -lMJ -jlU -jlU -jlU -jlU -jlU -lMJ -aaa -aaa aaa aaa aaa +lMJ aaa +hbK +tmU +fGy +wyo +jlU +dLm +mtu +mtu +mtu +gyK +mtu +mtu +mtu +mtu +jlU +qgn +mCV +wyo +hbK aaa aaa aaa @@ -118144,31 +118449,31 @@ aaa aaa lMJ aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ +nYJ +rrt +rrt +rrt lMJ lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hbK +pWT +rDf +uLa +jlU +eSr +mtu +mtu +mtu +jQz +mtu +mtu +nJr +ljF +jlU +lUS +pHt +rDf +hbK aaa aaa aaa @@ -118401,23 +118706,31 @@ aaa aaa lMJ aaa +lMJ aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -lMJ -aaa lMJ aaa +bPB +hbK +wrc +wrc +jlU +mtu +mtu +mtu +mtu +mtu +mtu +mtu +mtu +mtu +jlU +wrc +wrc +hbK +bPB lMJ aaa aaa @@ -118494,14 +118807,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa "} (197,1,1) = {" aaa @@ -118658,28 +118963,28 @@ rrt rrt rrt rrt +lMJ aaa aaa aaa +lMJ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -rrt lMJ -aaa -lMJ -aaa +jlU +jlU +bPu +mtu +mtu +asL +mtu +mtu +kcu +jlU +jlU lMJ -rrt -aaa -aaa -aaa aaa aaa aaa @@ -118915,27 +119220,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -dxK -aaa +rrt +lAu +rrt +rrt +rrt +rrt +rrt +rrt +lMJ +lMJ +lMJ +jlU +jlU +jlU +jlU +jlU +jlU +jlU +jlU +jlU lMJ -aaa -dxK -aaa -aaa -aaa aaa aaa aaa @@ -119183,15 +119488,15 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +lMJ lMJ aaa aaa +lMJ aaa aaa +lMJ +lMJ aaa aaa aaa @@ -119437,18 +119742,18 @@ aaa aaa aaa aaa +lKu aaa aaa +lMJ aaa aaa aaa -aaa -aaa -yib -aaa +lMJ aaa aaa aaa +lMJ aaa aaa aaa @@ -119696,17 +120001,17 @@ aaa aaa aaa aaa +rrt +lMJ aaa aaa aaa +lMJ aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +lMJ +rrt aaa aaa aaa @@ -119954,15 +120259,15 @@ aaa aaa aaa aaa +dxK aaa aaa aaa +lMJ aaa aaa aaa -aaa -aaa -aaa +dxK aaa aaa aaa @@ -120215,7 +120520,7 @@ aaa aaa aaa aaa -aaa +lMJ aaa aaa aaa @@ -120472,7 +120777,7 @@ aaa aaa aaa aaa -aaa +yib aaa aaa aaa diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index bd13c17ff159..056d85d90db0 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -13122,11 +13122,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lobby) -"drB" = ( -/obj/machinery/processor/slime, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard) "drD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -28195,7 +28190,7 @@ /turf/open/floor/iron/cafeteria, /area/station/commons/locker) "hBX" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/grass, /area/station/science/xenobiology) "hBY" = ( @@ -51144,9 +51139,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) "nyc" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 4 - }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "nyd" = ( @@ -53900,7 +53892,7 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) "oiH" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/grass, /area/station/maintenance/floor3/starboard) "oiJ" = ( @@ -58698,7 +58690,7 @@ /turf/open/floor/iron/white, /area/station/science/circuits) "pBw" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /obj/machinery/camera/directional/south{ c_tag = "Xenobiology - Slime Pens" }, @@ -72640,7 +72632,6 @@ /turf/open/floor/iron, /area/station/hallway/floor4/fore) "tuA" = ( -/obj/machinery/monkey_recycler, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit, @@ -80706,7 +80697,7 @@ /area/station/science/xenobiology/hallway) "vHn" = ( /obj/machinery/light/cold/no_nightlight/directional/east, -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/grass, /area/station/science/xenobiology) "vHq" = ( @@ -82841,7 +82832,6 @@ /turf/open/floor/iron, /area/station/security/prison) "wlb" = ( -/obj/machinery/processor/slime, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, @@ -250465,7 +250455,7 @@ fNq iKT xNf mpy -drB +iKT iHm rGl vIh diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index bc8c8c3ac4c6..e5b29c800e85 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -11295,7 +11295,6 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/obj/machinery/processor/slime, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bioterrorism) "FD" = ( @@ -13990,7 +13989,6 @@ /turf/open/floor/engine/cult, /area/centcom/wizard_station) "MT" = ( -/obj/machinery/computer/camera_advanced/xenobio, /obj/structure/noticeboard/directional/east, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bioterrorism) @@ -14835,7 +14833,6 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/machinery/monkey_recycler, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bioterrorism) "Pv" = ( @@ -17344,7 +17341,7 @@ /turf/open/floor/wood/large, /area/centcom/central_command_areas/medical) "Ww" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) "Wx" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 2a033325c5ca..50c02b52bfe5 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -1525,7 +1525,11 @@ /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "aeu" = ( /obj/effect/landmark/start/shaft_miner, @@ -2243,20 +2247,6 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/wood/large, /area/station/service/barber) -"ahk" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ahl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "ahm" = ( /turf/open/openspace/airless/planetary, /area/station/asteroid) @@ -2276,11 +2266,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/plating/airless, /area/station/asteroid) -"ahp" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ahr" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/spawner/random/structure/girder, @@ -3325,7 +3310,12 @@ "aqB" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "aqM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -4085,10 +4075,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"ayN" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ayQ" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{ dir = 1 @@ -5369,7 +5355,7 @@ /turf/open/floor/engine/cult, /area/station/service/library) "aJT" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/engine, /area/station/science/xenobiology) "aJV" = ( @@ -6139,18 +6125,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/station/medical/pathology) -"aPz" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/button/door{ - id = "containdeez5"; - name = "Cell Containment Toggle Button" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "aPB" = ( /obj/machinery/firealarm/directional/east{ pixel_y = 6 @@ -7296,8 +7270,10 @@ /turf/open/floor/iron/dark, /area/station/medical/morgue) "bgH" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "bgN" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, @@ -7815,22 +7791,6 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) -"bql" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/south{ - name = "Containment Pen #4"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #4"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "bqu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -8094,6 +8054,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) +"bvm" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "bvq" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -8133,7 +8099,7 @@ dir = 4 }, /obj/machinery/disposal/bin, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "bvM" = ( /obj/machinery/computer/mech_bay_power_console, @@ -10650,15 +10616,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/central) "cim" = ( -/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/duct, /obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "ciA" = ( /obj/machinery/door/airlock/external{ @@ -10848,6 +10810,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"cml" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "4" + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "cmo" = ( /obj/effect/turf_decal/siding/thinplating/end, /turf/open/floor/iron/dark, @@ -11248,14 +11217,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"cue" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "cut" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/south, @@ -11560,7 +11521,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "cyW" = ( /obj/effect/turf_decal/siding/wood{ @@ -11578,15 +11539,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) -"cyY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez4"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "cyZ" = ( /obj/machinery/atmospherics/miner/nitrogen, /turf/open/floor/engine/n2, @@ -12168,25 +12120,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"cJP" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "cJR" = ( /obj/machinery/rnd/server, /turf/open/floor/circuit/telecomms/server, @@ -12662,25 +12595,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) -"cSj" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen #1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Containment Pen #1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "cSp" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -12864,7 +12778,9 @@ }, /obj/machinery/light/directional/east, /obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/white, +/obj/item/disk/vacuum_upgrade/biomass, +/obj/item/disk/vacuum_upgrade/biomass, +/turf/open/floor/stone, /area/station/science/xenobiology) "cWj" = ( /obj/structure/railing{ @@ -13098,7 +13014,9 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "cZH" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, @@ -13318,12 +13236,11 @@ /turf/open/space/openspace, /area/station/solars/starboard/fore) "deh" = ( +/obj/structure/sink/directional/west, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 4 }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/sink/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "del" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -13907,12 +13824,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"dne" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "dnh" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -14295,6 +14206,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"dtN" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "dtS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/kitchen/directional/west, @@ -15439,7 +15355,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "dOx" = ( /obj/structure/window/reinforced/spawner/directional/west, @@ -15700,7 +15616,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "dQR" = ( /obj/machinery/power/terminal{ @@ -16179,6 +16095,14 @@ }, /turf/open/floor/noslip, /area/station/hallway/primary/tram/center) +"dZn" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "3"; + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "dZu" = ( /obj/machinery/mecha_part_fabricator, /obj/effect/turf_decal/delivery, @@ -17735,13 +17659,8 @@ /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) "exH" = ( -/obj/structure/table, /obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "containdeez4"; - name = "Cell Containment Toggle Button" - }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "exJ" = ( /obj/structure/cable, @@ -18060,6 +17979,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/warehouse) +"eCA" = ( +/obj/machinery/corral_corner{ + mapping_id = "1" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "1" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "eCE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18096,6 +18024,15 @@ /obj/structure/table, /turf/open/floor/iron, /area/station/commons/dorms) +"eDO" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "eDV" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/decal/cleanable/dirt, @@ -18254,8 +18191,9 @@ /turf/open/floor/iron/white, /area/station/medical/treatment_center) "eGt" = ( +/obj/machinery/duct, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "eHj" = ( /obj/machinery/vending/tool, @@ -18689,15 +18627,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) -"eQm" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "eQn" = ( /obj/machinery/door/airlock/command/glass{ name = "Secure External Operations" @@ -19880,6 +19809,12 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"fkf" = ( +/obj/machinery/corral_corner{ + mapping_id = "4" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fkg" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/tile/green/fourcorners, @@ -20142,9 +20077,9 @@ /turf/open/floor/iron, /area/station/security/checkpoint/science) "fof" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/sign/warning/cold_temp/directional/south, -/turf/open/floor/circuit/telecomms, +/obj/machinery/computer/slime_market, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "fog" = ( /obj/machinery/vending/cigarette, @@ -20295,15 +20230,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"fqM" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fqZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -20902,10 +20828,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"fAm" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fAA" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -21793,22 +21715,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/processing) -"fPv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Containment Pen #1"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fPx" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood/poker, @@ -21839,22 +21745,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering) -"fQo" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #5"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Containment Pen #5"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "fQK" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -23849,7 +23739,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "gDr" = ( /obj/effect/turf_decal/stripes/corner{ @@ -24233,7 +24124,10 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "gKb" = ( /obj/effect/turf_decal/stripes/end{ @@ -24523,11 +24417,13 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) "gNr" = ( -/obj/machinery/processor/slime, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/structure/table/glass, +/obj/item/vacuum_pack, +/obj/item/vacuum_pack, +/turf/open/floor/stone, /area/station/science/xenobiology) "gNu" = ( /obj/effect/decal/cleanable/dirt, @@ -24674,18 +24570,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) -"gPD" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/button/door{ - id = "containdeez7"; - name = "Cell Containment Toggle Button" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gPM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -25314,15 +25198,6 @@ /obj/machinery/light/warm/directional/south, /turf/open/floor/iron/dark, /area/station/service/chapel) -"hcn" = ( -/obj/structure/window/reinforced/spawner, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hcv" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -25347,12 +25222,6 @@ /obj/effect/decal/cleanable/dirt, /turf/closed/wall/r_wall, /area/ruin/powered/clownplanet) -"hdA" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hdB" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, @@ -25596,13 +25465,12 @@ /turf/open/misc/asteroid, /area/station/maintenance/department/cargo) "hik" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, /obj/structure/sink/directional/east, /obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "hin" = ( /turf/closed/wall/rock, @@ -26317,10 +26185,6 @@ pixel_x = 10; pixel_y = 20 }, -/mob/living/simple_animal/slime/pet{ - colour = "orange"; - name = "Happy Accident" - }, /turf/open/floor/plastic, /area/station/engineering/break_room) "huz" = ( @@ -26828,14 +26692,6 @@ /obj/structure/cable/layer1, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) -"hDT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hEb" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -27483,15 +27339,6 @@ /obj/effect/landmark/start/lawyer, /turf/open/floor/wood, /area/station/service/lawoffice) -"hPB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hPI" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -27987,7 +27834,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "hYK" = ( /obj/effect/spawner/structure/window/reinforced, @@ -28817,15 +28664,6 @@ /obj/machinery/atm, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"inn" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "int" = ( /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, @@ -29898,10 +29736,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"iEF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "iEO" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -31400,15 +31234,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"jcm" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jcq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, @@ -31743,6 +31568,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jhk" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, +/area/station/science/xenobiology) "jhs" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -31897,13 +31732,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"jkd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jkq" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -32556,9 +32384,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, +/obj/machinery/slime_extract_requestor, /turf/open/floor/iron/white, /area/station/science/lobby) "jur" = ( @@ -33102,25 +32928,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"jDF" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen #5"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Containment Pen #5"; - req_access = list("xenobiology") - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "jDN" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/chapel, @@ -33358,7 +33165,7 @@ id = "containdeez2"; name = "Cell Containment Toggle Button" }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "jHi" = ( /obj/machinery/vending/wardrobe/viro_wardrobe, @@ -34729,19 +34536,7 @@ /turf/open/floor/carpet, /area/station/security/detectives_office) "keT" = ( -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, +/obj/machinery/plumbing/ooze_compressor, /turf/open/floor/iron/white, /area/station/science/xenobiology) "kfl" = ( @@ -35054,12 +34849,6 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"kkx" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "kkK" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 6 @@ -35075,7 +34864,7 @@ c_tag = "Science - Xenobiology North"; network = list("ss13","rd") }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "kkP" = ( /obj/structure/bookcase/random/religion, @@ -36713,7 +36502,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "kMl" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -37060,12 +36850,6 @@ /turf/open/floor/iron/showroomfloor, /area/station/security/warden) "kQM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/machinery/disposal/bin, /obj/structure/sign/warning/deathsposal/directional/west, /obj/structure/disposalpipe/trunk{ @@ -37075,7 +36859,10 @@ c_tag = "Science - Xenobiology West"; network = list("ss13","rd") }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "kQX" = ( /obj/machinery/computer/security{ @@ -37212,6 +36999,10 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) +"kTh" = ( +/obj/machinery/duct, +/turf/open/floor/stone, +/area/station/science/xenobiology) "kTi" = ( /obj/machinery/duct, /obj/structure/cable, @@ -38191,25 +37982,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"lhS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #3"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/south{ - name = "Containment Pen #3"; - req_access = list("xenobiology") - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "lhT" = ( /obj/structure/cable/multilayer/connected, /obj/effect/decal/cleanable/dirt, @@ -39167,11 +38939,16 @@ /turf/open/floor/iron/white, /area/station/science/lower) "lym" = ( -/obj/machinery/monkey_recycler, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/machinery/biomass_recycler, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/obj/item/stack/biomass, +/turf/open/floor/stone, /area/station/science/xenobiology) "lyq" = ( /obj/effect/decal/cleanable/dirt, @@ -39216,7 +38993,11 @@ /area/station/science/ordnance/storage) "lyQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/duct, +/turf/open/floor/stone, /area/station/science/xenobiology) "lyR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -40656,6 +40437,10 @@ }, /turf/open/floor/glass/reinforced, /area/station/ai_monitored/turret_protected/aisat/hallway) +"lYq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/science/xenobiology) "lYr" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -41472,9 +41257,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mln" = ( -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) "mlu" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -42038,22 +41820,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"muf" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen #3"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Containment Pen #3"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "mur" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42413,12 +42179,10 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) "mBm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez1"; - name = "Xenobiology Containment Blast Door" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/plating, +/turf/open/floor/stone, /area/station/science/xenobiology) "mBq" = ( /turf/closed/wall/r_wall, @@ -43017,11 +42781,12 @@ /turf/open/floor/iron/dark, /area/station/medical/storage) "mLE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "mLM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -43244,7 +43009,7 @@ id = "containdeez6"; name = "Cell Containment Toggle Button" }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "mPm" = ( /obj/effect/decal/cleanable/dirt, @@ -43506,19 +43271,11 @@ /turf/open/floor/iron, /area/station/security/checkpoint/engineering) "mTR" = ( +/obj/machinery/light/floor/has_bulb, /obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 + dir = 6 }, -/obj/item/extinguisher, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "mUd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ @@ -43895,12 +43652,10 @@ /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) "nbI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/plating, +/turf/open/floor/stone, /area/station/science/xenobiology) "nbK" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ @@ -44338,7 +44093,8 @@ /area/station/security/brig) "njf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, /area/station/science/xenobiology) "njl" = ( /obj/machinery/duct, @@ -45730,7 +45486,10 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "nEF" = ( /obj/structure/table/glass, @@ -46062,8 +45821,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 }, -/obj/machinery/smartfridge/extract/preloaded, -/turf/open/floor/iron/white, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/stone, /area/station/science/xenobiology) "nLK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -47325,6 +47085,12 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"ohh" = ( +/obj/machinery/corral_corner{ + mapping_id = "6" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "oho" = ( /obj/structure/bookcase, /turf/open/floor/wood, @@ -48570,17 +48336,6 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) -"oCY" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "oDd" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -49055,6 +48810,11 @@ "oNd" = ( /turf/open/floor/mineral/titanium/blue, /area/station/maintenance/starboard/central) +"oNg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, +/area/station/science/xenobiology) "oNp" = ( /obj/structure/sink{ pixel_y = 15 @@ -49811,6 +49571,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"pbt" = ( +/turf/open/floor/stone, +/area/station/science/xenobiology) "pby" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -49974,18 +49737,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) -"pet" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/button/door{ - id = "containdeez1"; - name = "Cell Containment Toggle Button" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "peO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, @@ -50294,6 +50045,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"pkQ" = ( +/obj/machinery/corral_corner{ + mapping_id = "3" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "3" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "pkU" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 1 @@ -50590,7 +50350,7 @@ dir = 4 }, /obj/machinery/light/directional/east, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "ppr" = ( /obj/machinery/computer/security{ @@ -51693,11 +51453,8 @@ /turf/open/floor/iron, /area/station/security/checkpoint/supply) "pEa" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, +/obj/machinery/slime_market_pad, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "pEe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -52714,6 +52471,15 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"pUb" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "1"; + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/mob/living/basic/slime, +/turf/open/floor/engine, +/area/station/science/xenobiology) "pUj" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 @@ -52987,12 +52753,11 @@ /turf/open/floor/iron/dark/textured_large, /area/station/bitrunning/den) "pYZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "pZd" = ( /obj/machinery/door/airlock/maintenance_hatch{ @@ -53734,7 +53499,12 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "qlk" = ( /obj/machinery/atmospherics/components/unary/cryo_cell{ @@ -54327,15 +54097,6 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"qvF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qvK" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -54520,6 +54281,14 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/security/courtroom) +"qyA" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "6"; + dir = 2 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "qyI" = ( /obj/effect/landmark/tram/tramstation/east, /turf/open/floor/noslip/tram_plate, @@ -54793,7 +54562,7 @@ }, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "qCX" = ( /obj/effect/turf_decal/stripes/line{ @@ -55503,12 +55272,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qNF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qNI" = ( /turf/closed/wall, /area/station/medical/medbay/central) @@ -56140,13 +55903,13 @@ /turf/open/floor/iron, /area/station/maintenance/tram/mid) "qXs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/machinery/corral_corner{ + mapping_id = "6" }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/machinery/slime_pen_controller{ + mapping_id = "6" }, -/turf/open/floor/iron/white, +/turf/open/floor/engine, /area/station/science/xenobiology) "qXI" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ @@ -56190,6 +55953,10 @@ /obj/item/stack/sheet/glass/fifty, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"qYk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/stone, +/area/station/science/xenobiology) "qYx" = ( /obj/machinery/door/airlock{ id_tag = "Toilet5"; @@ -56493,7 +56260,6 @@ /turf/open/floor/catwalk_floor, /area/station/command/gateway) "rbU" = ( -/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -56502,7 +56268,10 @@ c_tag = "Science - Xenobiology East"; network = list("ss13","rd") }, -/turf/open/floor/iron/white, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "rbZ" = ( /obj/effect/mine/sound, @@ -56609,7 +56378,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "rem" = ( /obj/machinery/button/door/directional/west{ @@ -57318,16 +57087,11 @@ /turf/open/floor/iron, /area/station/engineering/main) "roQ" = ( +/obj/machinery/light/floor/has_bulb, /obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Xenobiology South"; - network = list("ss13","rd") + dir = 10 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "roR" = ( /turf/closed/wall, @@ -59068,12 +58832,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"rTt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "rTz" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -59561,7 +59319,11 @@ /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 }, -/turf/open/floor/iron/white, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "scZ" = ( /obj/structure/flora/bush/flowers_yw/style_random, @@ -60054,6 +59816,13 @@ }, /turf/open/misc/asteroid, /area/station/security/prison/workout) +"slz" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/sand/plating, +/turf/closed/wall/r_wall, +/area/station/asteroid) "slA" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/grunge{ @@ -60105,14 +59874,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/workout) -"sml" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez3"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "smA" = ( /obj/structure/chair/stool/directional/north, /obj/structure/cable, @@ -60833,6 +60594,15 @@ "syv" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/science) +"syx" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/science/xenobiology) "syE" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/effect/turf_decal/stripes/line{ @@ -62926,13 +62696,6 @@ /obj/machinery/bci_implanter, /turf/open/floor/iron, /area/station/science/lower) -"tfL" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "tfQ" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, @@ -63126,7 +62889,7 @@ dir = 8 }, /obj/machinery/light/directional/west, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "tiz" = ( /obj/structure/disposalpipe/sorting/mail{ @@ -63184,11 +62947,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "tjz" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, +/obj/machinery/smartfridge/extract/preloaded, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "tjA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -63212,10 +62972,10 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "tjP" = ( -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "tjS" = ( /obj/machinery/conveyor{ @@ -63337,10 +63097,6 @@ /turf/open/floor/plating, /area/station/asteroid) "tlt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, @@ -63350,7 +63106,7 @@ receive_ore_updates = 1; supplies_requestable = 1 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "tlw" = ( /obj/effect/decal/cleanable/dirt, @@ -64131,12 +63887,6 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron, /area/station/security/brig) -"txM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "txS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -64188,11 +63938,8 @@ /turf/open/floor/iron, /area/station/hallway/secondary/service) "tzq" = ( -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/machinery/corral_corner{ + mapping_id = "1" }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -66369,7 +66116,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "uld" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -66556,7 +66303,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "uov" = ( /turf/closed/wall/r_wall, @@ -67030,18 +66777,6 @@ "uvv" = ( /turf/closed/wall/rock/porous, /area/station/science/xenobiology) -"uvy" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/button/door{ - id = "containdeez3"; - name = "Cell Containment Toggle Button" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "uvD" = ( /obj/effect/decal/cleanable/dirt, /obj/item/soap, @@ -67250,13 +66985,13 @@ /turf/open/floor/iron, /area/station/commons/dorms) "uyb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/corral_corner{ + mapping_id = "4" }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 +/obj/machinery/slime_pen_controller{ + mapping_id = "4" }, -/turf/open/floor/iron/white, +/turf/open/floor/engine, /area/station/science/xenobiology) "uyd" = ( /obj/structure/table, @@ -67410,14 +67145,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/storage/primary) -"uAF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez5"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/xenobiology) "uAK" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/dark, @@ -67789,15 +67516,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"uGU" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "uGW" = ( /turf/closed/wall, /area/station/cargo/miningdock) @@ -68176,22 +67894,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/execution/transfer) -"uLX" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/east{ - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/window/left/directional/west{ - name = "Containment Pen #7"; - req_access = list("xenobiology") - }, -/obj/machinery/door/poddoor/preopen{ - id = "containdeez7"; - name = "Xenobiology Containment Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "uMg" = ( /obj/structure/table, /obj/item/radio/intercom, @@ -69868,7 +69570,7 @@ dir = 8 }, /obj/machinery/disposal/bin, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "vmB" = ( /obj/effect/turf_decal/tile/neutral{ @@ -70672,6 +70374,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"vxy" = ( +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vxD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery/white{ @@ -71307,12 +71015,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"vHi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "vHl" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 @@ -71878,6 +71580,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"vRp" = ( +/obj/machinery/corral_corner{ + mapping_id = "2" + }, +/obj/machinery/slime_pen_controller{ + mapping_id = "2" + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vRq" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -72801,7 +72512,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "whi" = ( /obj/effect/turf_decal/siding/wood{ @@ -72927,17 +72638,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel/monastery) -"wjK" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wjP" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -73514,13 +73214,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) -"wsT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wts" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -73834,13 +73527,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"wxE" = ( -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wxJ" = ( /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -74208,12 +73894,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"wCv" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wCT" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -74339,15 +74019,11 @@ /turf/open/floor/iron/dark/corner, /area/station/science/robotics/mechbay) "wET" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/computer/camera_advanced/xenobio, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, /obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "wEV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -74709,6 +74385,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"wKI" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/stone, +/area/station/science/xenobiology) "wLl" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -75173,7 +74859,11 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/turf/open/floor/iron/white, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/science/xenobiology) "wUv" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -75605,7 +75295,7 @@ "xcM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "xdw" = ( /obj/machinery/portable_atmospherics/scrubber, @@ -76236,6 +75926,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/lower) +"xox" = ( +/obj/machinery/plumbing/ooze_sucker{ + mapping_id = "2"; + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xoM" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -76544,11 +76242,12 @@ /turf/open/floor/iron/dark, /area/station/science/lower) "xuI" = ( -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/stone, /area/station/science/xenobiology) "xuL" = ( /obj/effect/decal/cleanable/dirt, @@ -77716,6 +77415,10 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/left) +"xQh" = ( +/obj/machinery/duct, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xQv" = ( /turf/closed/wall/r_wall, /area/station/construction/mining/aux_base) @@ -122735,13 +122438,13 @@ qVr qVr qVr qVr -eiR +slz gmN bfH bfH jTC lIY -pML +mwK qVr qVr qVr @@ -122988,18 +122691,18 @@ oyV dUT qHK qVr -wxE -fAm -hdA -qVr +fkf +bfH +bfH +fkf qVr fUz rkI fFu jQE lIY -qVr -qVr +tzq +bfH bfH bfH tzq @@ -123245,21 +122948,21 @@ oNT dUT gdC qVr -ayN -aJT -ahk -hdA +bfH +bfH +bfH +bfH mBm kQM jHg -dne +tjP vmz hik -sml bfH bfH -aJT -jkd +bfH +bfH +bfH qVr aaa aaa @@ -123504,19 +123207,19 @@ mfY qVr bfH bfH -asv -cSj +cml +xQh cim -rTt -whn -whn -whn -tjP -uvy -muf -asv -kkx -txM +kTh +kTh +kTh +kTh +eGt +xQh +xQh +pUb +bfH +dgR qVr aaa aaa @@ -123759,21 +123462,21 @@ hfP uKt uKt qVr -qVr +fkf +bfH bfH -fPv uyb xuI +qYk +qYk +qYk +qYk njf -njf -njf -njf -njf -tfL -hPB -lhS -txM -qVr +bfH +xQh +bfH +bfH +bfH qVr aaa aaa @@ -124015,26 +123718,26 @@ dUT vtq fGZ vtq -xHw +iix qVr -mBm -pet +syx +tjP pYZ aqB cVX gNr lym pph -aet -whn -tjP -oCY -sml -qVr -aaa -aaa -aaa -aaa +wKI +eCA +xQh +bfH +bfH +tzq +hee +hee +hee +hee aaa aaa vXM @@ -124275,7 +123978,7 @@ qVr qVr qVr tlt -inn +pbt xcM lyQ jiQ @@ -124287,10 +123990,10 @@ nED aet tjP roQ -qVr -qVr -qVr -qVr +pkQ +bfH +bfH +bvm qVr aaa aaa @@ -124532,21 +124235,21 @@ vud tml qVr qCW -whn +pbt xcM -lyQ -asv -mln +dtN +whn +whn tjz asv xta oYQ gCY -whn +pbt exH -ahl bfH bfH +aJT bfH qVr aaa @@ -124791,20 +124494,20 @@ uiC rdU uon whd -hDT +dtN keT -iEF +whn fof aMB sXX akC kMh -whn +kTh eGt -bql +xQh +xQh +dZn bfH -bfH -dgR qVr aaa aaa @@ -125046,22 +124749,22 @@ nPB dGk qVr kkL -whn +pbt dQK -uGU -asv -mln +dtN +whn +whn pEa asv oAf rhn gCY -whn -wCv -cyY -fAm -fAm -fqM +pbt +exH +bfH +bfH +bfH +bfH qVr aaa aaa @@ -125303,7 +125006,7 @@ qVr qVr qVr wET -eQm +pbt cyU cZE jiQ @@ -125315,10 +125018,10 @@ gJY scO bgH mTR -qVr -qVr -qVr -qVr +bvm +bfH +bfH +bvm qVr aaa aaa @@ -125559,24 +125262,24 @@ bjQ igS uNT qVr -nbI -wjK -cue +eDO +bgH +bgH qlf hYx ulb dOq tix -scO -whn -bgH -aPz -uAF -qVr -aaa -aaa -aaa -aaa +jhk +vRp +xQh +bfH +bfH +vxy +hee +hee +hee +hee aaa aaa aaa @@ -125815,21 +125518,21 @@ hCv grh okh qVr -qVr -kkx -cJP +ohh +bfH +bfH qXs mLE -dGs -dGs -dGs -dGs -dGs -ahp -qvF -fQo +lYq +lYq +lYq +lYq +oNg +bfH +xQh +bfH +bfH bfH -qVr qVr aaa aaa @@ -126072,21 +125775,21 @@ kVf sLd vmk qVr -kkx -txM -asv -uLX -gPD -qNF -whn -whn -whn -bgH -hcn -jDF -asv bfH bfH +qyA +xQh +cim +kTh +kTh +kTh +kTh +eGt +xQh +xQh +xox +bfH +dgR qVr aaa aaa @@ -126329,21 +126032,21 @@ ebs hFH tYB qVr -wsT -aJT +bfH +bfH bfH bfH nbI deh bvL -vHi +bgH mPb rbU -uAF -ahk -hdA +bfH +bfH +bfH aJT -dgR +bfH qVr aaa aaa @@ -126586,21 +126289,21 @@ xOs wdr nrh qVr -jcm +ohh bfH bfH -qVr +ohh qVr qVr wdD tXW vTx qVr -qVr -qVr -ahk -fAm -fqM +vxy +bfH +bfH +bfH +vxy qVr aaa aaa @@ -126847,13 +126550,13 @@ qVr qVr qVr qVr -aaa +hee qVr jTC bfH bfH qVr -aaa +hee qVr qVr qVr diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index dbc04bc5c266..751488dbff04 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -319,7 +319,6 @@ /obj/effect/turf_decal/stripes/end{ dir = 4 }, -/obj/machinery/processor/slime, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bioterrorism) "ek" = ( @@ -2041,7 +2040,7 @@ /turf/open/space/basic, /area/space/nearstation) "zR" = ( -/mob/living/simple_animal/slime, +/mob/living/basic/slime, /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) "zT" = ( @@ -3259,7 +3258,6 @@ /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) "Mv" = ( -/obj/machinery/computer/camera_advanced/xenobio, /obj/structure/noticeboard/directional/east, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bioterrorism) @@ -3460,7 +3458,6 @@ /obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/machinery/monkey_recycler, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bioterrorism) "Pc" = ( diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 2466f770827e..55991a2ded55 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -105,6 +105,8 @@ ///from base of mob/living/Stun() (amount, ignore_canstun) #define COMSIG_LIVING_STATUS_STUN "living_stun" +///from mob/living/carbon/enter_stamina_stun() +#define COMSIG_LIVING_STAMINA_STUN "carbon_stamina_stun" ///from base of mob/living/Knockdown() (amount, ignore_canstun) #define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" ///from base of mob/living/Paralyze() (amount, ignore_canstun) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index a33ccb140e05..af7d22f4a911 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ismouse(A) (istype(A, /mob/living/basic/mouse)) -#define isslime(A) (istype(A, /mob/living/simple_animal/slime)) +#define isslime(A) (istype(A, /mob/living/basic/slime)) #define isdrone(A) (istype(A, /mob/living/basic/drone)) diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm new file mode 100644 index 000000000000..2030e073340f --- /dev/null +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_mob.dm @@ -0,0 +1,25 @@ +#define COMSIG_MOB_STOP_HUNGER "stop_hunger_mob" +#define COMSIG_MOB_START_HUNGER "start_hunger_mob" +#define COMSIG_MOB_FEED "feed_hunger_mob" +#define COMSIG_MOB_FED_ON "fed_on_mob" +#define COMSIG_MOB_RETURN_HUNGER "return_hunger_mob" +#define COMSIG_MOB_REFUSED_EAT "refused_hunger_mob" +#define COMSIG_MOB_OVERATE "overate_hunger_mob" +#define COMSIG_MOB_EAT_NORMAL "normal_eat_hunger_mob" +#define COMSIG_MOB_STARVING "starving_hunger_mob" +#define COMSIG_MOB_FULLY_STARVING "full_starve_hunger_mob" +#define COMSIG_SECRETION_UPDATE "secretion_update" +#define COMSIG_FEEDING_CHECK "latch_check" +#define COMSIG_HUNGER_UPDATED "update_hunger_mob" +#define COMSIG_LIVING_ATE "living_ate_object" +#define COMSIG_MOB_ADJUST_HUNGER "adjust_hunger_mob" + +#define COMSIG_EMOTION_STORE "store_emotion" +#define EMOTION_BUFFER_SPEAK_FROM_BUFFER "release_emotion" +#define COMSIG_EMOTION_HEARD "heard_emotion" +#define EMOTION_BUFFER_UPDATE_OVERLAY_STATES "update_emotion_overlay" + +#define COMSIG_ATOM_JOIN_STACK "join_stack" +#define COMSIG_STACK_MOVE "stack_move" +#define COMSIG_CHECK_CAN_ADD_NEW_STACK "check_stack_add" +#define COMSIG_MOBSTACKER_DESTROY "mobstack_destroy_stack" diff --git a/code/__DEFINES/~monkestation/slimes.dm b/code/__DEFINES/~monkestation/slimes.dm new file mode 100644 index 000000000000..1ae2801be222 --- /dev/null +++ b/code/__DEFINES/~monkestation/slimes.dm @@ -0,0 +1,91 @@ +#define ADULT_SLIME (1<<0) +#define PASSIVE_SLIME (1<<1) +#define STORED_SLIME (1<<2) +#define MUTATING_SLIME (1<<3) +#define SPLITTING_SLIME (1<<4) +#define CLEANER_SLIME (1<<5) +#define OVERWRITES_COLOR (1<<6) +#define NOEVOLVE_SLIME (1<<7) +#define NOOOZE_SLIME (1<<8) + +#define TRAIT_ON_DEATH (1<<0) +#define TRAIT_VISUAL (1<<1) + +#define TRAIT_MUTATOR_USED "mutator_trait" +#define TRAIT_IN_STACK "inside_mob_stack" +#define TRAIT_FEEDING "feeding_trait" +#define LATCH_TRAIT "latch_trait" +#define TRAIT_LATCH_FEEDERED "feeder_targetted" + +#define BB_BASIC_MOB_SCARED_ITEM "BB_basic_mob_scared_item" +#define BB_WONT_TARGET_CLIENTS "BB_wont_target_clients" + +#define TRAIT_CAREFUL_STEPS "careful_steps" +#define TRAIT_SLIME_STASIS "slime_stasis" +#define TRAIT_SLIME_RABID "slime_rabid" +#define TRAIT_SLIME_DUST_IMMUNE "slime_dust_immune" +#define COMSIG_ATOM_SUCKED "atom_sucked" + +#define TRAIT_OVERFED "overfed_trait" +#define VACPACK_THROW "vacpack_throw" + +///from obj/item/vacuum_nozzle/afterattack(atom/movable/target, mob/user, proximity, params): (obj/item/vacuum_nozzle/nozzle, mob/user) +#define COMSIG_LIVING_VACUUM_PRESUCK "living_vacuum_presuck" + #define COMPONENT_LIVING_VACUUM_CANCEL_SUCK (1<<0) + +#define SLIME_VALUE_TIER_1 200 +#define SLIME_VALUE_TIER_2 400 +#define SLIME_VALUE_TIER_3 800 +#define SLIME_VALUE_TIER_4 1600 +#define SLIME_VALUE_TIER_5 3200 +#define SLIME_VALUE_TIER_6 6400 +#define SLIME_VALUE_TIER_7 12800 + +#define SLIME_SELL_MODIFIER_MIN -0.08 +#define SLIME_SELL_MODIFIER_MAX -0.01 +#define SLIME_SELL_OTHER_MODIFIER_MIN 0.005 +#define SLIME_SELL_OTHER_MODIFIER_MAX 0.01 +#define SLIME_SELL_MAXIMUM_MODIFIER 2 +#define SLIME_SELL_MINIMUM_MODIFIER 0.1 +#define SLIME_RANDOM_MODIFIER_MIN -0.0003 +#define SLIME_RANDOM_MODIFIER_MAX 0.0003 + + +#define EMOTION_HAPPY "happy" +#define EMOTION_SAD "sad" +#define EMOTION_SCARED "scared" +#define EMOTION_FUNNY "funny" +#define EMOTION_ANGER "anger" +#define EMOTION_SUPRISED "suprised" +#define EMOTION_HUNGRY "hungry" + +///key that holds decals we hunt +#define BB_CLEANABLE_DECALS "cleanable_decals" +///key that holds blood we hunt +#define BB_CLEANABLE_BLOOD "cleanable_blood" +///key that holds pests we hunt +#define BB_HUNTABLE_PESTS "huntable_pests" +///key that holds drawings we hunt +#define BB_CLEANABLE_DRAWINGS "cleanable_drawings" +///Key that holds our clean target +#define BB_CLEAN_TARGET "clean_target" +///key that holds trash we will burn +#define BB_HUNTABLE_TRASH "huntable_trash" + + +#define FOOD_CHANGE "food_change" +#define ENVIRONMENT_CHANGE "enviro_change" +#define BEHAVIOUR_CHANGE "behaviour_change" +#define DANGEROUS_CHANGE "dangerous_change" +#define DOCILE_CHANGE "docile_change" + +#define FRIENDSHIP_HATED "hated" +#define FRIENDSHIP_DISLIKED "disliked" +#define FRIENDSHIP_STRANGER "stranger" +#define FRIENDSHIP_NEUTRAL "neutral" +#define FRIENDSHIP_ACQUAINTANCES "acquaintances" +#define FRIENDSHIP_FRIEND "friend" +#define FRIENDSHIP_BESTFRIEND "bestfriend" + +#define COMSIG_FRIENDSHIP_CHECK_LEVEL "friendship_check_level" +#define COMSIG_FRIENDSHIP_CHANGE "friendship_change" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 6b6dca84f290..07ffc03e49a6 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -638,7 +638,7 @@ GLOBAL_LIST_EMPTY(species_list) moblist += mob_to_sort for(var/mob/dead/new_player/mob_to_sort in sortmob) moblist += mob_to_sort - for(var/mob/living/simple_animal/slime/mob_to_sort in sortmob) + for(var/mob/living/basic/slime/mob_to_sort in sortmob) moblist += mob_to_sort for(var/mob/living/simple_animal/mob_to_sort in sortmob) // We've already added slimes. diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm index 14241ef8e706..3b674fdc7afb 100644 --- a/code/__HELPERS/paths/path.dm +++ b/code/__HELPERS/paths/path.dm @@ -297,6 +297,8 @@ var/incapacitated = FALSE /// Is our mob incorporeal var/incorporeal_move = FALSE + /// is our mob a xenofauna or slime + var/xenofauna_or_slime = FALSE /// If our mob has a rider, what does it look like var/datum/can_pass_info/rider_info = null /// If our mob is buckled to something, what's it like @@ -346,6 +348,9 @@ src.can_ventcrawl = HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_NUDE) src.mob_size = living_construct.mob_size src.incorporeal_move = living_construct.incorporeal_move + if(istype(living_construct, /mob/living/basic/slime) || istype(living_construct, /mob/living/basic/xenofauna)) + src.xenofauna_or_slime = TRUE + if(iscameramob(construct_from)) src.camera_type = construct_from.type src.is_bot = isbot(construct_from) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 132beed9b331..160e3e0a4ca3 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -55,7 +55,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list( GLOBAL_LIST_INIT(phobia_mobs, list( "aliens" = typecacheof(list( /mob/living/carbon/alien, - /mob/living/simple_animal/slime, + /mob/living/basic/slime, )), "anime" = typecacheof(list(/mob/living/basic/guardian)), "birds" = typecacheof(list( @@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( )), "aliens" = typecacheof(list( /mob/living/carbon/alien, - /mob/living/simple_animal/slime, + /mob/living/basic/slime, )), "conspiracies" = typecacheof(list( /mob/living/simple_animal/bot/secbot, diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index f3a4adab662f..9bd238dd8857 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -217,30 +217,6 @@ return SECONDARY_ATTACK_CALL_NORMAL -/* - Slimes - Nothing happening here -*/ -/mob/living/simple_animal/slime/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers) - if(isturf(attack_target)) - return ..() - attack_target.attack_slime(src, modifiers) - -/mob/living/simple_animal/slime/resolve_right_click_attack(atom/target, list/modifiers) - if(isturf(target)) - return ..() - return target.attack_slime_secondary(src, modifiers) - -/atom/proc/attack_slime(mob/user, list/modifiers) - return - -/** - * Called when a slime mob right clicks an atom (that is not a turf). - * Returns a SECONDARY_ATTACK_* value. - */ -/atom/proc/attack_slime_secondary(mob/user, list/modifiers) - return SECONDARY_ATTACK_CALL_NORMAL - /* Drones */ diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 1686c6a2ca05..626cb8b3d505 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -267,8 +267,7 @@ movedelay_type = /mob/living/silicon/robot /datum/config_entry/number/outdated_movedelay/alien_delay movedelay_type = /mob/living/carbon/alien -/datum/config_entry/number/outdated_movedelay/slime_delay - movedelay_type = /mob/living/simple_animal/slime + /datum/config_entry/number/outdated_movedelay/animal_delay movedelay_type = /mob/living/simple_animal ///////////////////////////////////////////////// diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 735dd1cdc57d..ada6b75ea359 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -64,11 +64,25 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/dimensional = MAX_CORES_DIMENSIONAL, ) + ///our total xenobiology points + var/xenobio_points /// Lookup list for ordnance briefers. var/list/ordnance_experiments = list() /// Lookup list for scipaper partners. var/list/scientific_partners = list() + var/list/slime_core_prices = list() + + var/static/list/default_core_prices = list( + SLIME_VALUE_TIER_1, + SLIME_VALUE_TIER_2, + SLIME_VALUE_TIER_3, + SLIME_VALUE_TIER_4, + SLIME_VALUE_TIER_5, + SLIME_VALUE_TIER_6, + SLIME_VALUE_TIER_7, + ) + /datum/controller/subsystem/research/Initialize() point_types = TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES initialize_all_techweb_designs() @@ -79,6 +93,7 @@ SUBSYSTEM_DEF(research) autosort_categories() error_design = new error_node = new + initialize_slime_prices() return SS_INIT_SUCCESS /datum/controller/subsystem/research/fire() @@ -100,6 +115,19 @@ SUBSYSTEM_DEF(research) techweb_list.last_income = world.time + for(var/core_type in slime_core_prices) + var/obj/item/slime_extract/core = core_type + var/price_mod = rand(SLIME_RANDOM_MODIFIER_MIN * 1000000, SLIME_RANDOM_MODIFIER_MAX * 1000000) / 1000000 + var/price_limiter = 1 - ((default_core_prices[initial(core.tier)] * SLIME_SELL_MINIMUM_MODIFIER) / slime_core_prices[core_type]) + slime_core_prices[core_type] = (1 + price_mod * price_limiter) * slime_core_prices[core_type] + +/datum/controller/subsystem/research/proc/initialize_slime_prices() + for(var/core_type in subtypesof(/obj/item/slime_extract)) + var/obj/item/slime_extract/core = core_type + if(!initial(core.tier)) + continue + slime_core_prices[core_type] = default_core_prices[initial(core.tier)] + /datum/controller/subsystem/research/proc/autosort_categories() for(var/i in techweb_nodes) var/datum/techweb_node/I = techweb_nodes[i] diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 0a63e31edc9c..b1b44d50ec78 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -34,7 +34,7 @@ multiple modular subtrees with behaviors ///Stored arguments for behaviors given during their initial creation var/list/behavior_args = list() ///Tracks recent pathing attempts, if we fail too many in a row we fail our current plans. - var/pathing_attempts + var/consecutive_pathing_attempts ///Can the AI remain in control if there is a client? var/continue_processing_when_client = FALSE ///distance to give up on target diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index 15ddc7b264d7..3ab6343e4d49 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -3,6 +3,7 @@ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION ///do we finish this action after hitting once? var/terminate_after_action = FALSE + var/melee_attacks = TRUE /datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() @@ -36,10 +37,11 @@ controller.set_blackboard_key(hiding_location_key, hiding_target) - if(hiding_target) //Slap it! - basic_mob.melee_attack(hiding_target) - else - basic_mob.melee_attack(target) + if(melee_attacks) + if(hiding_target) //Slap it! + basic_mob.melee_attack(hiding_target) + else + basic_mob.melee_attack(target) if(terminate_after_action) finish_action(controller, TRUE, target_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 2e922d62f09a..23b3a69c4d38 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -20,6 +20,7 @@ /datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) . = ..() if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key) return var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if (QDELETED(target) || !can_see(controller.pawn, target, run_distance)) diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index 2b734ca24a92..0be133279f7e 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -8,22 +8,25 @@ //Override this to setup the moveloop you want to use /datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) SHOULD_CALL_PARENT(TRUE) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 controller.set_blackboard_key(BB_CURRENT_MIN_MOVE_DISTANCE, min_distance) moving_controllers[controller] = current_movement_target /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 moving_controllers -= controller // We got deleted as we finished an action if(!QDELETED(controller.pawn)) SSmove_manager.stop_looping(controller.pawn, SSai_movement) /datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller) - controller.pathing_attempts++ - if(controller.pathing_attempts >= max_pathing_attempts) + controller.consecutive_pathing_attempts++ + if(controller.consecutive_pathing_attempts >= max_pathing_attempts) controller.CancelActions() +/datum/ai_movement/proc/reset_pathing_failures(datum/ai_controller/controller) + controller.consecutive_pathing_attempts = 0 + ///Should the movement be allowed to happen? As of writing this, MOVELOOP_SKIP_STEP is defined as (1<<0) so be careful on using (return TRUE) or (can_move = TRUE; return can_move) /datum/ai_movement/proc/allowed_to_move(datum/move_loop/source) var/atom/movable/pawn = source.moving @@ -58,7 +61,8 @@ //Anything to do post movement /datum/ai_movement/proc/post_move(datum/move_loop/source, succeeded) SIGNAL_HANDLER - if(succeeded != FALSE) - return var/datum/ai_controller/controller = source.extra_info + if(succeeded != MOVELOOP_FAILURE) + reset_pathing_failures(controller) + return increment_pathing_failures(controller) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 1236a690c96b..d51f233f0ec8 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -96,20 +96,27 @@ process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir) ///check who can give us what we want, and how many each of them will give us -/datum/component/plumbing/proc/process_request(amount, reagent, dir) - var/list/valid_suppliers = list() +/datum/component/plumbing/proc/process_request(amount = MACHINE_REAGENT_TRANSFER, reagent, dir) + //find the duct to take from var/datum/ductnet/net if(!ducts.Find(num2text(dir))) return net = ducts[num2text(dir)] + + //find all valid suppliers in the duct + var/list/valid_suppliers = list() for(var/datum/component/plumbing/supplier as anything in net.suppliers) if(supplier.can_give(amount, reagent, net)) valid_suppliers += supplier - // Need to ask for each in turn very carefully, making sure we get the total volume. This is to avoid a division that would always round down and become 0 - var/targetVolume = reagents.total_volume + amount var/suppliersLeft = valid_suppliers.len + if(!suppliersLeft) + return + + //take an equal amount from each supplier + var/currentRequest + var/target_volume = reagents.total_volume + amount for(var/datum/component/plumbing/give as anything in valid_suppliers) - var/currentRequest = (targetVolume - reagents.total_volume) / suppliersLeft + currentRequest = (target_volume - reagents.total_volume) / suppliersLeft give.transfer_to(src, currentRequest, reagent, net) suppliersLeft-- @@ -117,14 +124,15 @@ /datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net) if(amount <= 0) return - if(reagent) //only asked for one type of reagent for(var/datum/reagent/contained_reagent as anything in reagents.reagent_list) if(contained_reagent.type == reagent) return TRUE - else if(reagents.total_volume > 0) //take whatever + else if(reagents.total_volume) //take whatever return TRUE + return FALSE + ///this is where the reagent is actually transferred and is thus the finish point of our process() /datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) if(!reagents || !target || !target.reagents) diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm index a8304320bdbd..0e091fa1b48a 100644 --- a/code/datums/components/squashable.dm +++ b/code/datums/components/squashable.dm @@ -49,7 +49,7 @@ if(isliving(crossing_movable)) var/mob/living/crossing_mob = crossing_movable if(crossing_mob.mob_size > MOB_SIZE_SMALL && !(crossing_mob.movement_type & FLYING)) - if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM)) + if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM) || HAS_TRAIT(crossing_mob, TRAIT_CAREFUL_STEPS)) crossing_mob.visible_message(span_notice("[crossing_mob] carefully steps over [parent_as_living]."), span_notice("You carefully step over [parent_as_living] to avoid hurting it.")) return if(should_squash) diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index 3201eeff846f..50c89d4a7ccd 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -77,4 +77,6 @@ playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE) else playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + SEND_SIGNAL(eater, COMSIG_LIVING_ATE, target) + SEND_SIGNAL(eater, COMSIG_EMOTION_STORE, null, EMOTION_HAPPY, "I ate [target], I really like [target].") qdel(target) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 29ea9178374b..5c7477e21f88 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -578,14 +578,15 @@ if(!only_pulling && pulledby && moving_diagonally != FIRST_DIAG_STEP && (get_dist(src, pulledby) > 1 || z != pulledby.z)) //separated from our puller and not in the middle of a diagonal move. pulledby.stop_pulling() -/atom/movable/proc/set_glide_size(target = 8) +/atom/movable/proc/set_glide_size(target = 8, recursed = FALSE) if (HAS_TRAIT(src, TRAIT_NO_GLIDE)) return SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target) glide_size = target - for(var/mob/buckled_mob as anything in buckled_mobs) - buckled_mob.set_glide_size(target) + if(!recursed) + for(var/mob/buckled_mob as anything in buckled_mobs) + buckled_mob.set_glide_size(target, TRUE) /** * meant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts) @@ -641,8 +642,13 @@ if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, entering_loc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE) return else // Else just try to enter the single destination. - if(!newloc.Enter(src)) - return + if(isliving(src)) + var/mob/living/living = src + if(!newloc.Enter(src) && !living.buckled) + return + else + if(!newloc.Enter(src)) + return if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE) return diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index c38ea186f620..58f9f48d6df0 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -21,6 +21,8 @@ for(var/current_account as anything in SSeconomy.bank_accounts_by_id) var/datum/bank_account/current_bank_account = SSeconomy.bank_accounts_by_id[current_account] + if(!current_bank_account.account_job || !current_bank_account) + continue player_accounts += list(list( "name" = current_bank_account.account_holder, "job" = current_bank_account.account_job.title, diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 3af357213b7b..ff9a96b7f397 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -105,26 +105,22 @@ /obj/item/organ/internal/heart/rat/on_insert(mob/living/carbon/receiver) . = ..() - if(!. || !ishuman(receiver)) + if(!ishuman(receiver)) return var/mob/living/carbon/human/human_receiver = receiver - if(!human_receiver.can_mutate()) - return - human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism) + if(human_receiver.can_mutate()) + human_receiver.dna.add_mutation(/datum/mutation/human/dwarfism) //but 1.5 damage - if(human_receiver.physiology) - human_receiver.physiology.damage_resistance -= 50 + human_receiver.physiology?.damage_resistance -= 50 /obj/item/organ/internal/heart/rat/on_remove(mob/living/carbon/heartless, special) . = ..() if(!ishuman(heartless)) return var/mob/living/carbon/human/human_heartless = heartless - if(!human_heartless.can_mutate()) - return - human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism) - if(human_heartless.physiology) - human_heartless.physiology.damage_resistance += 50 + if(human_heartless.can_mutate()) + human_heartless.dna.remove_mutation(/datum/mutation/human/dwarfism) + human_heartless.physiology?.damage_resistance += 50 /// you occasionally squeak, and have some rat related verbal tics /obj/item/organ/internal/tongue/rat diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm index b258a8d6f6ea..6096730c2908 100644 --- a/code/game/machinery/telecomms/computers/logbrowser.dm +++ b/code/game/machinery/telecomms/computers/logbrowser.dm @@ -70,7 +70,7 @@ race = "Humanoid" // NT knows a lot about slimes, but not aliens. Can identify slimes - else if(ispath(mobtype, /mob/living/simple_animal/slime)) + else if(ispath(mobtype, /mob/living/basic/slime)) race = "Slime" // sometimes M gets deleted prematurely for AIs... just check the job diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 2f8cb369f95a..1a06a960f1bf 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -92,6 +92,9 @@ if(!buckled_mobs) buckled_mobs = list() + if(M.buckled) + M.buckled.unbuckle_mob(M) + if(!is_buckle_possible(M, force, check_loc)) return FALSE @@ -193,6 +196,11 @@ if(!has_buckled_mobs()) return for(var/m in buckled_mobs) + if(isliving(m)) + var/mob/living/living = m + if(!living.buckled) //this somehow happens? + buckled_mobs -= m + continue unbuckle_mob(m, force) //Handle any extras after buckling @@ -239,16 +247,16 @@ return FALSE // Make sure the target isn't already buckled to something. - if(target.buckled) - return FALSE + //if(target.buckled) + //return FALSE // Make sure this atom can still have more things buckled to it. if(LAZYLEN(buckled_mobs) >= max_buckled_mobs) return FALSE // Stacking buckling leads to lots of jank and issues, better to just nix it entirely - if(target.has_buckled_mobs()) - return FALSE + //if(target.has_buckled_mobs()) + //return FALSE // If the buckle requires restraints, make sure the target is actually restrained. if(buckle_requires_restraints && !HAS_TRAIT(target, TRAIT_RESTRAINED)) diff --git a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm index f03f4fd12faa..2b4f0874ef47 100644 --- a/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm +++ b/code/game/objects/effects/anomalies/anomalies_pyroclastic.dm @@ -27,13 +27,11 @@ if(istype(tile)) tile.atmos_spawn_air("o2=500;plasma=500;TEMP=1000") //Make it hot and burny for the new slime - var/new_colour = pick("red", "orange") - var/mob/living/simple_animal/slime/pyro = new(tile, new_colour) - pyro.rabid = TRUE - pyro.amount_grown = SLIME_EVOLUTION_THRESHOLD - pyro.Evolve() - var/datum/action/innate/slime/reproduce/repro_action = new - repro_action.Grant(pyro) + var/new_colour = pick(/datum/slime_color/red, /datum/slime_color/orange) + var/mob/living/basic/slime/pyro = new(tile, new_colour) + ADD_TRAIT(pyro, TRAIT_SLIME_RABID, "pyro") + pyro.maximum_survivable_temperature = INFINITY + pyro.apply_temperature_requirements() var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( "Do you want to play as a pyroclastic anomaly slime?", diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 8cce4e3b66e2..6190201eac31 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -408,11 +408,6 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/teleporter -/obj/item/circuitboard/computer/xenobiology - name = "Xenobiology Console" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/camera_advanced/xenobio - /obj/item/circuitboard/computer/scan_consolenew name = "DNA Console" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 89f3edfb4c8a..49d821a8cd81 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -962,20 +962,6 @@ /datum/stock_part/micro_laser = 1, /obj/item/stack/sheet/glass = 1) -/obj/item/circuitboard/machine/monkey_recycler - name = "Monkey Recycler" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/monkey_recycler - req_components = list( - /datum/stock_part/matter_bin = 1, - /datum/stock_part/manipulator = 1) - needs_anchored = FALSE - -/obj/item/circuitboard/machine/processor/slime - name = "Slime Processor" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/processor/slime - /obj/item/circuitboard/machine/protolathe/department/science name = "Departmental Protolathe - Science" greyscale_colors = CIRCUIT_COLOR_SCIENCE @@ -1227,14 +1213,9 @@ needs_anchored = FALSE /obj/item/circuitboard/machine/processor/screwdriver_act(mob/living/user, obj/item/tool) - if(build_path == /obj/machinery/processor) - name = "Slime Processor" - build_path = /obj/machinery/processor/slime - to_chat(user, span_notice("Name protocols successfully updated.")) - else - name = "Food Processor" - build_path = /obj/machinery/processor - to_chat(user, span_notice("Defaulting name protocols.")) + name = "Food Processor" + build_path = /obj/machinery/processor + to_chat(user, span_notice("Defaulting name protocols.")) return TRUE /obj/item/circuitboard/machine/protolathe/department/service @@ -1483,8 +1464,8 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/artifact_xray req_components = list( - /obj/item/stock_parts/capacitor = 1, - /datum/stock_part/scanning_module = 1, + /obj/item/stock_parts/capacitor = 1, + /datum/stock_part/scanning_module = 1, /obj/item/stock_parts/micro_laser = 1) /obj/item/circuitboard/machine/artifactheater @@ -1505,7 +1486,7 @@ /datum/stock_part/scanning_module = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 3) - + /obj/item/circuitboard/machine/navbeacon name = "Bot Navigational Beacon" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 534871bdda67..f5ef78a60c98 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -137,8 +137,6 @@ /obj/effect/dummy/chameleon/attack_animal(mob/user, list/modifiers) master.disrupt() -/obj/effect/dummy/chameleon/attack_slime(mob/user, list/modifiers) - master.disrupt() /obj/effect/dummy/chameleon/attack_alien(mob/user, list/modifiers) master.disrupt() diff --git a/code/game/objects/items/devices/scanners/slime_scanner.dm b/code/game/objects/items/devices/scanners/slime_scanner.dm deleted file mode 100644 index 430796e02ca2..000000000000 --- a/code/game/objects/items/devices/scanners/slime_scanner.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/slime_scanner - name = "slime scanner" - desc = "A device that analyzes a slime's internal composition and measures its stats." - icon = 'icons/obj/device.dmi' - icon_state = "slime_scanner" - inhand_icon_state = "analyzer" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - w_class = WEIGHT_CLASS_SMALL - flags_1 = CONDUCT_1 - throwforce = 0 - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*0.30, /datum/material/glass=SMALL_MATERIAL_AMOUNT * 0.20) - -/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) - if(user.stat || !user.can_read(src) || user.is_blind()) - return - if (!isslime(M)) - to_chat(user, span_warning("This device can only scan slimes!")) - return - var/mob/living/simple_animal/slime/T = M - slime_scan(T, user) - -/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) - var/to_render = "Slime scan results:\ - \n[span_notice("[T.colour] [T.is_adult ? "adult" : "baby"] slime")]\ - \nNutrition: [T.nutrition]/[T.get_max_nutrition()]" - if (T.nutrition < T.get_starve_nutrition()) - to_render += "\n[span_warning("Warning: slime is starving!")]" - else if (T.nutrition < T.get_hunger_nutrition()) - to_render += "\n[span_warning("Warning: slime is hungry")]" - to_render += "\nElectric change strength: [T.powerlevel]\nHealth: [round(T.health/T.maxHealth,0.01)*100]%" - if (T.slime_mutation[4] == T.colour) - to_render += "\nThis slime does not evolve any further." - else - if (T.slime_mutation[3] == T.slime_mutation[4]) - if (T.slime_mutation[2] == T.slime_mutation[1]) - to_render += "\nPossible mutation: [T.slime_mutation[3]]\ - \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - if (T.cores > 1) - to_render += "\nMultiple cores detected" - to_render += "\nGrowth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" - if(T.effectmod) - to_render += "\n[span_notice("Core mutation in progress: [T.effectmod]")]\ - \n[span_notice("Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")]" - to_chat(user, examine_block(to_render)) diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index febf901e0212..6b308ea92e68 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -49,6 +49,7 @@ /obj/item/construction/plumbing/proc/set_plumbing_designs() plumbing_design_types = list( //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals + /obj/machinery/plumbing/synthesizer = 15, /obj/machinery/plumbing/reaction_chamber/chem = 15, /obj/machinery/plumbing/grinder_chemical = 30, /obj/machinery/plumbing/growing_vat = 20, @@ -292,12 +293,16 @@ /obj/item/construction/plumbing/research/set_plumbing_designs() plumbing_design_types = list( //category 1 synthesizers + /obj/machinery/plumbing/synthesizer = 15, /obj/machinery/plumbing/reaction_chamber = 15, /obj/machinery/plumbing/grinder_chemical = 30, /obj/machinery/plumbing/disposer = 10, /obj/machinery/plumbing/growing_vat = 20, //category 2 Distributors + /obj/machinery/plumbing/ooze_sucker = 5, + /obj/machinery/plumbing/slime_grinder = 5, + /obj/machinery/plumbing/ooze_compressor = 20, /obj/machinery/duct = 1, /obj/machinery/plumbing/input = 5, /obj/machinery/plumbing/filter = 5, diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index a7fa03f96bcb..370cc5def0de 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -123,6 +123,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, check_density = FALSE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("slime pen management frame", /obj/item/wallframe/slime_pen_controller, 1, check_density = FALSE, category = CAT_EQUIPMENT), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 383c9d88af7e..66f7b9b07e90 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -98,12 +98,6 @@ var/amt = max(0, ((force - (move_resist * MOVE_FORCE_CRUSH_RATIO)) / (move_resist * MOVE_FORCE_CRUSH_RATIO)) * 10) take_damage(amt, BRUTE) -/obj/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - if(!user.is_adult) - return - if(attack_generic(user, rand(10, 15), BRUTE, MELEE, 1)) - log_combat(user, src, "attacked") - /obj/singularity_act() SSexplosions.high_mov_atom += src if(src && !QDELETED(src)) diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 9b7b5590018e..ef6ea9d433e8 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -224,17 +224,6 @@ use(user, going_up = FALSE) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/structure/ladder/attack_slime(mob/user, list/modifiers) - use(user) - return TRUE - -/obj/structure/ladder/attack_slime_secondary(mob/user, list/modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - use(user, going_up = FALSE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/structure/ladder/attackby(obj/item/item, mob/user, params) use(user) return TRUE diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 4a8cad5c2684..5210e90425cd 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -213,7 +213,7 @@ /turf/open/proc/water_vapor_gas_act() MakeSlippery(TURF_WET_WATER, min_wet_time = 100, wet_time_to_add = 50) - for(var/mob/living/simple_animal/slime/M in src) + for(var/mob/living/basic/slime/M in src) M.apply_water() wash(CLEAN_WASH) diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 50e83ee37359..a7764ff214df 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -21,6 +21,5 @@ to_chat(owner, span_warning("You feel nauseated!")) owner.vomit(20) - var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") - Slime.set_friends(list(owner)) - Slime.set_leader(owner) + var/mob/living/basic/slime/Slime = new(get_turf(owner)) + SEND_SIGNAL(Slime, COMSIG_FRIENDSHIP_CHANGE, owner, 110) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 3ec2d3c89d15..9d76906c0829 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -556,11 +556,11 @@ if (player_mind in ex_revs + ex_headrevs) continue - player_mind.add_antag_datum(/datum/antagonist/enemy_of_the_revolution) - if (!istype(player)) continue + player_mind.add_antag_datum(/datum/antagonist/enemy_of_the_revolution) + if(player_mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) ADD_TRAIT(player, TRAIT_DEFIB_BLACKLISTED, REF(src)) diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index 64aaca7aa995..2492a5d98297 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -46,9 +46,6 @@ if (Adjacent(user)) return interact(user) -/obj/structure/signpost/attack_slime(mob/user, list/modifiers) - return interact(user) - /obj/structure/signpost/attack_animal(mob/user, list/modifiers) return interact(user) diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index 78d0b78150c6..0dfc36a4bd60 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -105,9 +105,6 @@ /obj/structure/speaking_tile/attack_ai(mob/user) return interact(user) -/obj/structure/speaking_tile/attack_slime(mob/user, list/modifiers) - return interact(user) - /obj/structure/speaking_tile/attack_animal(mob/user, list/modifiers) return interact(user) diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm index 648c2cc9db04..bf5b4eb922d3 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -5,6 +5,7 @@ min_players = 20 category = EVENT_CATEGORY_HEALTH description = "A random crewmember becomes obsessed with another." + weight = 0 // essentially disables it /datum/round_event/obsessed fakeable = FALSE diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index e505cac2621f..a946cb780e96 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -218,8 +218,6 @@ required_atoms = list( /obj/machinery/autolathe = 1, /obj/machinery/rnd/production/circuit_imprinter/department/science = 1, - /obj/machinery/monkey_recycler = 1, - /obj/machinery/processor/slime = 1, /obj/machinery/processor = 2, /obj/machinery/reagentgrinder = 2, /obj/machinery/hydroponics = 2, diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm deleted file mode 100644 index fa5418d30305..000000000000 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ /dev/null @@ -1,103 +0,0 @@ -GLOBAL_LIST_EMPTY(monkey_recyclers) - -/obj/machinery/monkey_recycler - name = "monkey recycler" - desc = "A machine used for recycling dead monkeys into monkey cubes." - icon = 'icons/obj/kitchen.dmi' - icon_state = "grinder" - layer = BELOW_OBJ_LAYER - density = TRUE - circuit = /obj/item/circuitboard/machine/monkey_recycler - var/stored_matter = 0 - var/cube_production = 0.2 - var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy() - -/obj/machinery/monkey_recycler/Initialize(mapload) - . = ..() - if (mapload) - GLOB.monkey_recyclers += src - -/obj/machinery/monkey_recycler/Destroy() - GLOB.monkey_recyclers -= src - for(var/thing in connected) - var/obj/machinery/computer/camera_advanced/xenobio/console = thing - console.connected_recycler = null - connected.Cut() - return ..() - -/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled - . = ..() - cube_production = 0 - for(var/datum/stock_part/manipulator/manipulator in component_parts) - cube_production += manipulator.tier * 0.1 - for(var/datum/stock_part/matter_bin/matter_bin in component_parts) - cube_production += matter_bin.tier * 0.1 - -/obj/machinery/monkey_recycler/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Producing [cube_production] cubes for every monkey inserted.") - -/obj/machinery/monkey_recycler/wrench_act(mob/living/user, obj/item/tool) - . = ..() - if(default_unfasten_wrench(user, tool)) - power_change() - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) - return - - if(default_pry_open(O, close_after_pry = TRUE)) - return - - if(default_deconstruction_crowbar(O)) - return - - if(machine_stat) //NOPOWER etc - return - else - return ..() - -/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user) - if(!istype(target)) - return - if(ismonkey(target)) - stuff_monkey_in(target, user) - -/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/human/target, mob/living/user) - if(!istype(target)) - return - if(target.stat == CONSCIOUS) - to_chat(user, span_warning("The monkey is struggling far too much to put it in the recycler.")) - return - if(target.buckled || target.has_buckled_mobs()) - to_chat(user, span_warning("The monkey is attached to something.")) - return - qdel(target) - to_chat(user, span_notice("You stuff the monkey into the machine.")) - playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - use_power(active_power_usage) - stored_matter += cube_production - addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x)) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, span_notice("The machine now has [stored_matter] monkey\s worth of material stored."))) - -/obj/machinery/monkey_recycler/interact(mob/user) - if(stored_matter >= 1) - to_chat(user, span_notice("The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.")) - playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE) - for(var/i in 1 to FLOOR(stored_matter, 1)) - new /obj/item/food/monkeycube(src.loc) - stored_matter-- - to_chat(user, span_notice("The machine's display flashes that it has [stored_matter] monkeys worth of material left.")) - else - to_chat(user, span_danger("The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].")) - -/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if(istype(I)) - to_chat(user, span_notice("You log [src] in the multitool's buffer.")) - I.buffer = src - return TRUE diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm index a6afe1ad7397..7ff1e07db07d 100644 --- a/code/modules/food_and_drinks/machinery/processor.dm +++ b/code/modules/food_and_drinks/machinery/processor.dm @@ -185,59 +185,4 @@ user.forceMove(drop_location()) user.visible_message(span_notice("[user] crawls free of the processor!")) -/obj/machinery/processor/slime - name = "slime processor" - desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." - circuit = /obj/item/circuitboard/machine/processor/slime - -/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/atom_to_drop) - var/static/list/slimecores = subtypesof(/obj/item/slime_extract) - var/i = 0 - if(!(i = slimecores.Find(atom_to_drop.type))) // If the item is not found - return - if (i <= 16) // If in the first 12 slots - atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 12 + ((i%4)*8) - atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 12 + (round(i/4)*8) - return i - var/ii = i - 16 - atom_to_drop.pixel_x = atom_to_drop.base_pixel_x - 8 + ((ii%3)*8) - atom_to_drop.pixel_y = atom_to_drop.base_pixel_y - 8 + (round(ii/3)*8) - return i - -/obj/machinery/processor/slime/process() - if(processing) - return - var/mob/living/simple_animal/slime/picked_slime - for(var/mob/living/simple_animal/slime/slime in range(1,src)) - if(!CanReach(slime)) //don't take slimes behind glass panes or somesuch; also makes it ignore slimes inside the processor - continue - if(slime.stat) - picked_slime = slime - break - if(!picked_slime) - return - var/datum/food_processor_process/recipe = PROCESSOR_SELECT_RECIPE(picked_slime) - if (!recipe) - return - - visible_message(span_notice("[picked_slime] is sucked into [src].")) - LAZYADD(processor_contents, picked_slime) - picked_slime.forceMove(src) - -/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) - var/mob/living/simple_animal/slime/processed_slime = what - if (!istype(processed_slime)) - return - - if(processed_slime.stat != DEAD) - processed_slime.forceMove(drop_location()) - processed_slime.balloon_alert_to_viewers("crawls free") - return - var/core_count = processed_slime.cores - for(var/i in 1 to (core_count+rating_amount-1)) - var/atom/movable/item = new processed_slime.coretype(drop_location()) - adjust_item_drop_location(item) - SSblackbox.record_feedback("tally", "slime_core_harvested", 1, processed_slime.colour) - return ..() - #undef PROCESSOR_SELECT_RECIPE diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 91149a415920..3001a97f8152 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -399,12 +399,10 @@ /obj/machinery/smartfridge/extract/accept_check(obj/item/O) if(istype(O, /obj/item/slime_extract)) return TRUE - if(istype(O, /obj/item/slime_scanner)) - return TRUE return FALSE /obj/machinery/smartfridge/extract/preloaded - initial_contents = list(/obj/item/slime_scanner = 2) + initial_contents = list(/obj/item/slime_extract/grey = 2) // ------------------------------------- // Cytology Petri Dish Smartfridge diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index 67339575703a..469909030d2c 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -128,11 +128,6 @@ input = /obj/item/food/grown/parsnip output = /obj/item/food/roastparsnip -/datum/food_processor_process/mob/slime - input = /mob/living/simple_animal/slime - output = null - required_machine = /obj/machinery/processor/slime - /datum/food_processor_process/towercap input = /obj/item/grown/log output = /obj/item/popsicle_stick diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index e21b73659f4f..25490e6562ad 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -335,9 +335,6 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /turf/closed/indestructible/hoteldoor/attack_larva(mob/user, list/modifiers) promptExit(user) -/turf/closed/indestructible/hoteldoor/attack_slime(mob/user, list/modifiers) - promptExit(user) - /turf/closed/indestructible/hoteldoor/attack_robot(mob/user) if(get_dist(get_turf(src), get_turf(user)) <= 1) promptExit(user) diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index 444780e14885..27ff06b8bd41 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -28,6 +28,7 @@ span_notice("[user] [response_help_continuous] you."), null, null, user) to_chat(user, span_notice("You [response_help_simple] [src].")) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + SEND_SIGNAL(src, COMSIG_EMOTION_STORE, user, EMOTION_HAPPY, "[response_help_continuous] me.") else if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to hurt [src]!")) @@ -102,13 +103,6 @@ var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) return attack_threshold_check(damage, user.melee_damage_type) -/mob/living/basic/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(15, 25) - if(M.is_adult) - damage = rand(20, 35) - return attack_threshold_check(damage) - /mob/living/basic/attack_drone(mob/living/basic/drone/attacking_drone) if(attacking_drone.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon. return diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 3d12474ad1c2..c7c65f4d684c 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -86,15 +86,6 @@ In all, this is a lot like the monkey code. /N if(STAMINA) stamina.adjust(-damage) -/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() - /mob/living/carbon/alien/ex_act(severity, target, origin) if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) return FALSE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 360b479d0150..d9b7d8caf4f5 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -239,28 +239,6 @@ try_contact_infect(D, note="Monkey Bite Infected") return TRUE - -/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - if(M.powerlevel > 0) - var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message(span_danger("The [M.name] shocks [src]!"), \ - span_userdanger("The [M.name] shocks you!")) - - do_sparks(5, TRUE, src) - var/power = M.powerlevel + rand(0,3) - Paralyze(power * 2 SECONDS) - set_stutter_if_lower(power * 2 SECONDS) - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - updatehealth() - return 1 - /mob/living/carbon/proc/dismembering_strike(mob/living/attacker, dam_zone) if(!attacker.limb_destroyer) return dam_zone diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8d477c21b89b..494e4b9dc724 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -340,31 +340,6 @@ var/attack_direction = get_dir(user, src) apply_damage(damage, user.melee_damage_type, affecting, armor, wound_bonus = user.wound_bonus, bare_wound_bonus = user.bare_wound_bonus, sharpness = user.sharpness, attack_direction = attack_direction) - -/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - . = ..() - if(!.) // slime attack failed - return - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - if(!damage) - return - var/wound_mod = -45 // 25^1.4=90, 90-45=45 - if(M.is_adult) - damage += rand(5, 10) - wound_mod = -90 // 35^1.4=145, 145-90=55 - - if(check_shields(M, damage, "the [M.name]")) - return FALSE - - var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return TRUE - - var/obj/item/bodypart/affecting = get_bodypart(get_random_valid_zone(dam_zone)) - var/armor_block = run_armor_check(affecting, MELEE) - apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod) - - /mob/living/carbon/human/ex_act(severity, target, origin) if(HAS_TRAIT(src, TRAIT_BOMBIMMUNE)) return diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 80fd5ade9649..56b7aab3de90 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -68,7 +68,7 @@ var/static/list/can_ride_typecache = typecacheof(list( /mob/living/basic/parrot, /mob/living/carbon/human, - /mob/living/simple_animal/slime, + /mob/living/basic/slime, )) var/lastpuke = 0 var/account_id diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 190885e1b48e..6b5b83e41832 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -31,6 +31,7 @@ ADD_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA) ADD_TRAIT(src, TRAIT_FLOORED, STAMINA) filters += FILTER_STAMINACRIT + SEND_SIGNAL(src, COMSIG_LIVING_STAMINA_STUN) addtimer(CALLBACK(src, PROC_REF(exit_stamina_stun)), STAMINA_STUN_TIME) stamina.pause(STAMINA_STUN_TIME + 2 SECONDS) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index da3bd02d854c..57b437207346 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1432,7 +1432,7 @@ created_robot.clear_zeroth_law(announce = FALSE) if(WABBAJACK_SLIME) - new_mob = new /mob/living/simple_animal/slime/random(loc) + new_mob = new /mob/living/basic/slime/random(loc) if(WABBAJACK_XENO) var/picked_xeno_type diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 2eac04ffff9b..a6481e93ae01 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -261,29 +261,6 @@ user.set_pull_offsets(src, grab_state) return TRUE - -/mob/living/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(!SSticker.HasRoundStarted()) - to_chat(M, "You cannot attack people before the game has started.") - return - - if(M.buckled) - if(M in buckled_mobs) - M.Feedstop() - return // can't attack while eating! - - if(HAS_TRAIT(src, TRAIT_PACIFISM)) - to_chat(M, span_warning("You don't want to hurt anyone!")) - return FALSE - - if (stat != DEAD) - log_combat(M, src, "attacked") - M.do_attack_animation(src) - visible_message(span_danger("\The [M.name] glomps [src]!"), \ - span_userdanger("\The [M.name] glomps you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, M) - to_chat(M, span_danger("You glomp [src]!")) - return TRUE - /mob/living/attack_animal(mob/living/simple_animal/user, list/modifiers) . = ..() user.face_atom(src) diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 2a0f6dab294a..ed0a16a5b445 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -17,9 +17,6 @@ return ..() -/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - return //immune to slimes - /mob/living/silicon/ai/blob_act(obj/structure/blob/B) if (stat != DEAD) adjustBruteLoss(60) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index e9df047a1864..680fc7885b69 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -205,24 +205,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real ..() return -/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime shock - flash_act() - var/stunprob = M.powerlevel * 7 + 10 - if(prob(stunprob) && M.powerlevel >= 8) - adjustBruteLoss(M.powerlevel * rand(6,10)) - - var/damage = rand(1, 3) - - if(M.is_adult) - damage = rand(20, 40) - else - damage = rand(5, 35) - damage = round(damage / 2) // borgs receive half damage - adjustBruteLoss(damage) - - return - /mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user, list/modifiers) add_fingerprint(user) if(!opened) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 78322167a80c..a41a726be72d 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -98,13 +98,6 @@ var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) return attack_threshold_check(damage, user.melee_damage_type) -/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) - if(..()) //successful slime attack - var/damage = rand(15, 25) - if(user.is_adult) - damage = rand(20, 35) - return attack_threshold_check(damage) - /mob/living/simple_animal/attack_drone(mob/living/basic/drone/user) if(user.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon. return diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index c4ab1f1c4172..de95e59dca90 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -120,7 +120,6 @@ IGNORE_PROC_IF_NOT_TARGET(attack_larva) IGNORE_PROC_IF_NOT_TARGET(attack_animal) -IGNORE_PROC_IF_NOT_TARGET(attack_slime) /mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/projectile/Proj) if(Proj.firer != set_target) diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm deleted file mode 100644 index f957b9264a5f..000000000000 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ /dev/null @@ -1,31 +0,0 @@ -/mob/living/simple_animal/slime/death(gibbed) - if(stat == DEAD) - return - if(!gibbed) - if(is_adult) - var/mob/living/simple_animal/slime/M = new(drop_location(), colour) - M.rabid = TRUE - M.regenerate_icons() - - is_adult = FALSE - maxHealth = 150 - for(var/datum/action/innate/slime/reproduce/R in actions) - R.Remove(src) - var/datum/action/innate/slime/evolve/E = new - E.Grant(src) - revive(HEAL_ALL) - regenerate_icons() - update_name() - return - - if(buckled) - Feedstop(silent = TRUE) //releases ourselves from the mob we fed on. - - set_stat(DEAD) - cut_overlays() - - return ..(gibbed) - -/mob/living/simple_animal/slime/gib() - death(TRUE) - qdel(src) diff --git a/code/modules/mob/living/simple_animal/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm deleted file mode 100644 index 0b70ca3f0ece..000000000000 --- a/code/modules/mob/living/simple_animal/slime/emote.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/emote/slime - mob_type_allowed_typecache = /mob/living/simple_animal/slime - mob_type_blacklist_typecache = list() - -/datum/emote/slime/bounce - key = "bounce" - key_third_person = "bounces" - message = "bounces in place." - -/datum/emote/slime/jiggle - key = "jiggle" - key_third_person = "jiggles" - message = "jiggles!" - -/datum/emote/slime/light - key = "light" - key_third_person = "lights" - message = "lights up for a bit, then stops." - -/datum/emote/slime/vibrate - key = "vibrate" - key_third_person = "vibrates" - message = "vibrates!" - -/datum/emote/slime/mood - key = "moodnone" - ///Mood key, will set the slime's emote to this. - var/mood_key - -/datum/emote/slime/mood/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(!.) - return - var/mob/living/simple_animal/slime/slime_user = user - slime_user.current_mood = mood_key - slime_user.regenerate_icons() - -/datum/emote/slime/mood/smile - key = "moodsmile" - mood_key = ":3" - -/datum/emote/slime/mood/cat - key = "moodcat" - mood_key = ":33" - -/datum/emote/slime/mood/pout - key = "moodpout" - mood_key = "pout" - -/datum/emote/slime/mood/sad - key = "moodsad" - mood_key = "sad" - -/datum/emote/slime/mood/angry - key = "moodangry" - mood_key = "angry" diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm deleted file mode 100644 index 150e0a405ecb..000000000000 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ /dev/null @@ -1,615 +0,0 @@ -/mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) - return - . = ..() - if(!.) - return - - // We get some passive bruteloss healing if we're not dead - if(stat != DEAD && SPT_PROB(16, seconds_per_tick)) - adjustBruteLoss(-0.5 * seconds_per_tick) - if(ismob(buckled)) - handle_feeding(seconds_per_tick, times_fired) - if(stat != CONSCIOUS) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech - return - handle_nutrition(seconds_per_tick, times_fired) - if(QDELETED(src)) // Stop if the slime split during handle_nutrition() - return - reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len * seconds_per_tick) //Slimes are such snowflakes - handle_targets(seconds_per_tick, times_fired) - if(ckey) - return - handle_mood(seconds_per_tick, times_fired) - handle_speech(seconds_per_tick, times_fired) - - -// Unlike most of the simple animals, slimes support UNCONSCIOUS. This is an ugly hack. -/mob/living/simple_animal/slime/update_stat() - switch(stat) - if(UNCONSCIOUS, HARD_CRIT) - if(health > 0) - return - return ..() - - -/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process - - if(AIproc || stat || client) - return - - var/hungry = 0 - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - AIproc = 1 - - while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled)) - if(!(mobility_flags & MOBILITY_MOVE)) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == DEAD) - set_target(null) - AIproc = 0 - break - - if(Target) - if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) - set_target(null) - AIproc = 0 - break - if(!AIproc) - break - - if(Target in view(1,src)) - if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them. - if(!Atkcool) - Atkcool = TRUE - addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_slime(src) - break - if((Target.body_position == STANDING_UP) && prob(80)) - - if(Target.client && Target.health >= 20) - if(!Atkcool) - Atkcool = TRUE - addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else if(Target in view(7, src)) - if(!Target.Adjacent(src)) - // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - else - set_target(null) - AIproc = 0 - break - - var/sleeptime = cached_multiplicative_slowdown - if(sleeptime <= 0) - sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - AIproc = 0 - -/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment, seconds_per_tick, times_fired) - var/loc_temp = get_temperature(environment) - var/divisor = 10 /// The divisor controls how fast body temperature changes, lower causes faster changes - - var/temp_delta = loc_temp - bodytemperature - if(abs(temp_delta) > 50) // If the difference is great, reduce the divisor for faster stabilization - divisor = 5 - - if(temp_delta < 0) // It is cold here - if(!on_fire) // Do not reduce body temp when on fire - adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, temp_delta, 0)) - else // This is a hot place - adjust_bodytemperature(clamp((temp_delta / divisor) * seconds_per_tick, 0, temp_delta)) - - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - ADD_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustBruteLoss(100 * seconds_per_tick) - else - adjustBruteLoss(round(sqrt(bodytemperature)) * seconds_per_tick) - else - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - - if(stat != DEAD) - var/bz_percentage =0 - if(environment.gases[/datum/gas/bz]) - bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles() - var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis - - switch(stat) - if(CONSCIOUS) - if(stasis) - to_chat(src, span_danger("Nerve gas in the air has put you in stasis!")) - set_stat(UNCONSCIOUS) - powerlevel = 0 - rabid = FALSE - regenerate_icons() - if(UNCONSCIOUS, HARD_CRIT) - if(!stasis) - to_chat(src, span_notice("You wake up from the stasis.")) - set_stat(CONSCIOUS) - regenerate_icons() - - updatehealth() - -/mob/living/simple_animal/slime/proc/handle_feeding(seconds_per_tick, times_fired) - var/mob/living/prey = buckled - - if(stat) - Feedstop(silent = TRUE) - - // monke start: make slimes feed faster on mindless mobs and monkeys - var/feed_multiplier = 1 - if(QDELETED(prey.mind) && !istype(prey, /mob/living/simple_animal/pet) && !istype(prey, /mob/living/basic/pet)) // pets have an honorary soul in my book - feed_multiplier += 1 - if(ismonkey(prey)) - feed_multiplier += 0.5 - // monke end - - if(prey.stat == DEAD) // our victim died - if(!client) - if(!rabid && !attacked) - var/mob/last_to_hurt = prey.LAssailant?.resolve() - if(last_to_hurt && last_to_hurt != prey) - if(SPT_PROB(30, seconds_per_tick)) - add_friendship(last_to_hurt, 1) - else - to_chat(src, "This subject does not have a strong enough life energy anymore...") - - if(prey.client && ishuman(prey)) - if(SPT_PROB(61, seconds_per_tick)) - rabid = 1 //we go rabid after finishing to feed on a human with a client. - - Feedstop() - return - - if(iscarbon(prey)) - prey.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - prey.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - - if(SPT_PROB(5, seconds_per_tick) && prey.client) - to_chat(prey, "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]") - - else if(isanimal_or_basicmob(prey)) - var/mob/living/animal_victim = prey - - var/totaldamage = 0 //total damage done to this unfortunate animal - totaldamage += animal_victim.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - - if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop - Feedstop(0, 0) - return - - else - Feedstop(0, 0) - return - - add_nutrition((rand(7, 15) * 0.5 * seconds_per_tick * CONFIG_GET(number/damage_multiplier)) * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - - //Heal yourself. - adjustBruteLoss(-1.5 * seconds_per_tick * feed_multiplier) // monke edit: make slimes feed faster on mindless mobs and monkeys - -/mob/living/simple_animal/slime/proc/handle_nutrition(seconds_per_tick, times_fired) - - if(docile) //God as my witness, I will never go hungry again - set_nutrition(700) //fuck you for using the base nutrition var - return - - if(SPT_PROB(7.5, seconds_per_tick)) - adjust_nutrition(-0.5 * (1 + is_adult) * seconds_per_tick) - - if(nutrition <= 0) - set_nutrition(0) - if(SPT_PROB(50, seconds_per_tick)) - adjustBruteLoss(rand(0,5)) - - else if (nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) - adjust_nutrition(-10 * seconds_per_tick) - amount_grown++ - update_mob_action_buttons() - - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) - if(is_adult && loc.AllowDrop()) - Reproduce() - else - Evolve() - -/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) - set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition())) - if(nutrition >= get_grow_nutrition()) - if(powerlevel<10) - if(prob(30-powerlevel*2)) - powerlevel++ - else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level. - if(powerlevel<5) - if(prob(25-powerlevel*5)) - powerlevel++ - - - - -/mob/living/simple_animal/slime/proc/handle_targets(seconds_per_tick, times_fired) - if(attacked > 50) - attacked = 50 - - if(attacked > 0) - attacked-- - - if(Discipline > 0) - - if(Discipline >= 5 && rabid) - if(SPT_PROB(37, seconds_per_tick)) - rabid = 0 - - if(SPT_PROB(5, seconds_per_tick)) - Discipline-- - - if(!client) - if(!(mobility_flags & MOBILITY_MOVE)) - return - - if(buckled) - return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention - target_patience = 0 - set_target(null) - - if(AIproc && SStun > world.time) - return - - var/hungry = 0 // determines if the slime is hungry - - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && SPT_PROB(13, seconds_per_tick) || nutrition < get_hunger_nutrition()) - hungry = 1 - - if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && SPT_PROB(0.5, seconds_per_tick)) - var/mob/nofriend = pick(Friends) - add_friendship(nofriend, -1) - - if(!Target) - if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - var/ally = FALSE - for(var/F in faction) - if(F == FACTION_NEUTRAL) //slimes are neutral so other mobs not target them, but they can target neutral mobs - continue - if(F in L.faction) - ally = TRUE - break - if(ally) - continue - - if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked || rabid || hungry == 2) - set_target(targets[1]) // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!Discipline && SPT_PROB(2.5, seconds_per_tick)) - if(ishuman(C) || isalienadult(C)) - set_target(C) - break - - if(islarva(C) || ismonkey(C)) - set_target(C) - break - - if (Target) - target_patience = rand(5, 7) - if (is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if (Leader) - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if (holding_still) - holding_still = max(holding_still - (0.5 * hungry * seconds_per_tick), 0) - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(50)) - step(src, pick(GLOB.cardinals)) - - else - if(holding_still) - holding_still = max(holding_still - (0.5 * seconds_per_tick), 0) - else if (docile && pulledby) - holding_still = 10 - else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33)) - step(src, pick(GLOB.cardinals)) - else if(!AIproc) - INVOKE_ASYNC(src, PROC_REF(AIprocess)) - -/mob/living/simple_animal/slime/handle_automated_movement() - return //slime random movement is currently handled in handle_targets() - -/mob/living/simple_animal/slime/handle_automated_speech() - return //slime random speech is currently handled in handle_speech() - -/mob/living/simple_animal/slime/proc/handle_mood(seconds_per_tick, times_fired) - var/newmood = "" - if (rabid || attacked) - newmood = "angry" - else if (docile) - newmood = ":3" - else if (Target) - newmood = "mischievous" - - if (!newmood) - if (Discipline && SPT_PROB(13, seconds_per_tick)) - newmood = "pout" - else if (SPT_PROB(0.5, seconds_per_tick)) - newmood = pick("sad", ":3", "pout") - - if ((current_mood == "sad" || current_mood == ":3" || current_mood == "pout") && !newmood) - if(SPT_PROB(50, seconds_per_tick)) - newmood = current_mood - - if (newmood != current_mood) // This is so we don't redraw them every time - current_mood = newmood - regenerate_icons() - -/mob/living/simple_animal/slime/proc/handle_speech(seconds_per_tick, times_fired) - //Speech understanding starts here - var/to_say - if (speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us - if (findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if (findtext(phrase, "follow")) - if (Leader) - if (Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Follow...") - else if (Friends[who] > Friends[Leader]) // VIVA - set_leader(who) - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) - set_leader(who) - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I no follow...") - else if (findtext(phrase, "stop")) - if (buckled) // We are asked to stop feeding - if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) - Feedstop() - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Target) // We are asked to stop chasing - if (Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) - set_target(null) - if (Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) - add_friendship(who, -1) - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Leader) // We are asked to stop following - if (Leader == who) - to_say = "Yes... I stay..." - set_leader(null) - else - if (Friends[who] > Friends[Leader]) - set_leader(null) - to_say = "Yes... I stop..." - else - to_say = "No... keep follow..." - else if (findtext(phrase, "stay")) - if (Leader) - if (Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else if (Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... stay..." - else - to_say = "No... keep follow..." - else - if (Friends[who] >= SLIME_FRIENDSHIP_STAY) - holding_still = Friends[who] * 10 - to_say = "Yes... stay..." - else - to_say = "No... won't stay..." - else if (findtext(phrase, "attack")) - if (rabid && prob(20)) - set_target(who) - AIprocess() //Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "ATTACK!?!?" - else if (Friends[who] >= SLIME_FRIENDSHIP_ATTACK) - for (var/mob/living/L in view(7,src)-list(src,who)) - if (findtext(phrase, lowertext(L.name))) - if (isslime(L)) - to_say = "NO... [L] slime friend" - add_friendship(who, -1) //Don't ask a slime to attack its friend - else if(!Friends[L] || Friends[L] < 1) - set_target(L) - AIprocess()//Wake up the slime's Target AI, needed otherwise this doesn't work - to_say = "Ok... I attack [Target]" - else - to_say = "No... like [L] ..." - add_friendship(who, -1) //Don't ask a slime to attack its friend - break - else - to_say = "No... no listen" - - speech_buffer = list() - - //Speech starts here - if (to_say) - say (to_say) - else if(SPT_PROB(0.5, seconds_per_tick)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/t = 10 - var/slimes_near = 0 - var/dead_slimes = 0 - var/friends_near = list() - for (var/mob/living/L in view(7,src)) - if(isslime(L) && L != src) - ++slimes_near - if (L.stat == DEAD) - ++dead_slimes - if (L in Friends) - t += 20 - friends_near += L - if (nutrition < get_hunger_nutrition()) - t += 10 - if (nutrition < get_starve_nutrition()) - t += 10 - if (SPT_PROB(1, seconds_per_tick) && prob(t)) - var/phrases = list() - if (Target) - phrases += "[Target]... look yummy..." - if (nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if (nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if (rabid || attacked) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if (current_mood == ":3") - phrases += "Purr..." - if (attacked) - phrases += "Grrr..." - if (bodytemperature < T0C) - phrases += "Cold..." - if (bodytemperature < T0C - 30) - phrases += "So... cold..." - phrases += "Very... cold..." - if (bodytemperature < T0C - 50) - phrases += "..." - phrases += "C... c..." - if (buckled) - phrases += "Nom..." - phrases += "Yummy..." - if (powerlevel > 3) - phrases += "Bzzz..." - if (powerlevel > 5) - phrases += "Zap..." - if (powerlevel > 8) - phrases += "Zap... Bzz..." - if (current_mood == "sad") - phrases += "Bored..." - if (slimes_near) - phrases += "Slime friend..." - if (slimes_near > 1) - phrases += "Slime friends..." - if (dead_slimes) - phrases += "What happened?" - if (!slimes_near) - phrases += "Lonely..." - for (var/M in friends_near) - phrases += "[M]... friend..." - if (nutrition < get_hunger_nutrition()) - phrases += "[M]... feed me..." - if(!stat) - say (pick(phrases)) - -/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it - if (is_adult) - return 1200 - else - return 1000 - -/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat - if (is_adult) - return 1000 - else - return 800 - -/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat - if (is_adult) - return 600 - else - return 500 - -/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else - if(is_adult) - return 300 - else - return 200 - -/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing - if (docile) - return FALSE - if (hunger == 2 || rabid || attacked) - return TRUE - if (Leader) - return FALSE - if (holding_still) - return FALSE - return TRUE diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm deleted file mode 100644 index 131295e4f284..000000000000 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ /dev/null @@ -1,241 +0,0 @@ -#define SIZE_DOESNT_MATTER -1 -#define BABIES_ONLY 0 -#define ADULTS_ONLY 1 - -#define NO_GROWTH_NEEDED 0 -#define GROWTH_NEEDED 1 - -/datum/action/innate/slime - check_flags = AB_CHECK_CONSCIOUS - button_icon = 'icons/mob/actions/actions_slime.dmi' - background_icon_state = "bg_alien" - overlay_icon_state = "bg_alien_border" - var/needs_growth = NO_GROWTH_NEEDED - -/datum/action/innate/slime/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return - var/mob/living/simple_animal/slime/S = owner - if(needs_growth == GROWTH_NEEDED) - if(S.amount_grown >= SLIME_EVOLUTION_THRESHOLD) - return TRUE - return FALSE - return TRUE - -/mob/living/simple_animal/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - - if(stat) - return FALSE - - var/list/choices = list() - for(var/mob/living/nearby_mob in view(1,src)) - if(nearby_mob != src && Adjacent(nearby_mob)) - choices += nearby_mob - - var/choice = tgui_input_list(src, "Who do you wish to feed on?", "Slime Feed", sort_names(choices)) - if(isnull(choice)) - return FALSE - var/mob/living/victim = choice - if(CanFeedon(victim)) - Feedon(victim) - return TRUE - return FALSE - -/datum/action/innate/slime/feed - name = "Feed" - button_icon_state = "slimeeat" - - -/datum/action/innate/slime/feed/Activate() - var/mob/living/simple_animal/slime/S = owner - S.Feed() - -/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/meal, silent = FALSE) - if(!Adjacent(meal)) - return FALSE - - if(buckled) - Feedstop() - return FALSE - - if(issilicon(meal) || meal.mob_biotypes & MOB_ROBOTIC) - return FALSE - - if(isanimal(meal)) - var/mob/living/simple_animal/simple_meal = meal - if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. - if(silent) - return FALSE - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - return FALSE - else if(isbasicmob(meal)) - var/mob/living/basic/basic_meal = meal - if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[CLONE] <= 0) - if (silent) - return FALSE - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - return FALSE - - if(isslime(meal)) - if(silent) - return FALSE - to_chat(src, span_warning("I can't latch onto another slime...")) - return FALSE - - if(docile) - if(silent) - return FALSE - to_chat(src, span_notice("I'm not hungry anymore...")) - return FALSE - - if(stat) - if(silent) - return FALSE - to_chat(src, span_warning("I must be conscious to do this...")) - return FALSE - - if(meal.stat == DEAD) - if(silent) - return FALSE - to_chat(src, span_warning("This subject does not have a strong enough life energy...")) - return FALSE - - if(locate(/mob/living/simple_animal/slime) in meal.buckled_mobs) - if(silent) - return FALSE - to_chat(src, span_warning("Another slime is already feeding on this subject...")) - return FALSE - return TRUE - -/mob/living/simple_animal/slime/proc/Feedon(mob/living/M) - M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) - if(M.buckle_mob(src, force=TRUE)) - layer = M.layer+0.01 //appear above the target mob - M.visible_message(span_danger("[name] latches onto [M]!"), \ - span_userdanger("[name] latches onto [M]!")) - else - to_chat(src, span_warning("I have failed to latch onto the subject!")) - -/mob/living/simple_animal/slime/proc/Feedstop(silent = FALSE, living=1) - if(buckled) - if(!living) - to_chat(src, "[pick("This subject is incompatible", \ - "This subject does not have life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]!") - if(!silent) - visible_message(span_warning("[src] lets go of [buckled]!"), \ - span_notice("I stopped feeding.")) - layer = initial(layer) - buckled.unbuckle_mob(src,force=TRUE) - -/mob/living/simple_animal/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - if(!is_adult) - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - is_adult = 1 - maxHealth = 200 - amount_grown = 0 - for(var/datum/action/innate/slime/evolve/E in actions) - E.Remove(src) - var/datum/action/innate/slime/reproduce/reproduce_action = new - reproduce_action.Grant(src) - regenerate_icons() - update_name() - else - to_chat(src, "I am not ready to evolve yet...") - else - to_chat(src, "I have already evolved...") - -/datum/action/innate/slime/evolve - name = "Evolve" - button_icon_state = "slimegrow" - needs_growth = GROWTH_NEEDED - -/datum/action/innate/slime/evolve/Activate() - var/mob/living/simple_animal/slime/S = owner - S.Evolve() - -/mob/living/simple_animal/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - if(is_adult) - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - var/datum/component/nanites/original_nanites = GetComponent(/datum/component/nanites) - var/turf/drop_loc = drop_location() - - for(var/i in 1 to 4) - var/child_colour - if(mutation_chance >= 100) - child_colour = "rainbow" - else if(prob(mutation_chance)) - child_colour = slime_mutation[rand(1,4)] - else - child_colour = colour - var/mob/living/simple_animal/slime/M - M = new(drop_loc, child_colour) - if(ckey) - M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - M.powerlevel = new_powerlevel - if(i != 1) - step_away(M,src) - M.set_friends(Friends) - babies += M - M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) - SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) - if(original_nanites) - M.AddComponent(/datum/component/nanites, original_nanites.nanite_volume*0.25) - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, original_nanites, TRUE, TRUE) //The trues are to copy activation as well - - var/mob/living/simple_animal/slime/new_slime = pick(babies) - new_slime.set_combat_mode(TRUE) - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - to_chat(src, "I am not ready to reproduce yet...") - else - to_chat(src, "I am not old enough to reproduce yet...") - -/datum/action/innate/slime/reproduce - name = "Reproduce" - button_icon_state = "slimesplit" - needs_growth = GROWTH_NEEDED - -/datum/action/innate/slime/reproduce/Activate() - var/mob/living/simple_animal/slime/S = owner - S.Reproduce() - -#undef SIZE_DOESNT_MATTER -#undef BABIES_ONLY -#undef ADULTS_ONLY -#undef NO_GROWTH_NEEDED -#undef GROWTH_NEEDED diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm deleted file mode 100644 index 01aa8f37e7e3..000000000000 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ /dev/null @@ -1,580 +0,0 @@ -#define SLIME_CARES_ABOUT(to_check) (to_check && (to_check == Target || to_check == Leader || (to_check in Friends))) -/mob/living/simple_animal/slime - name = "grey baby slime (123)" - icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE | PASSGRILLE - gender = NEUTER - faction = list(FACTION_SLIME, FACTION_NEUTRAL) - - harm_intent_damage = 5 - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "stomps on" - response_harm_simple = "stomp on" - emote_see = list("jiggles", "bounces in place") - speak_emote = list("blorbles") - bubble_icon = "slime" - initial_language_holder = /datum/language_holder/slime - - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - - maxHealth = 150 - health = 150 - healable = 0 - melee_damage_lower = 5 - melee_damage_upper = 25 - - verb_say = "blorbles" - verb_ask = "inquisitively blorbles" - verb_exclaim = "loudly blorbles" - verb_yell = "loudly blorbles" - - // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables - // for the sake of cleanliness, though, here they are. - status_flags = CANUNCONSCIOUS|CANPUSH - - footstep_type = FOOTSTEP_MOB_SLIME - - ///The current mood of the slime, set randomly or through emotes (if sentient). - var/current_mood - - var/AIproc = 0 // determines if the AI loop is activated - var/Atkcool = 0 // attack cooldown - var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/SStun = 0 // stun variable - - var/is_adult = 0 - var/docile = 0 - - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside - var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 - - var/powerlevel = 0 // 1-10 controls how much electricity they are generating - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - - var/number = 0 // Used to understand when someone is talking to it - - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person - - var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with - var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place - var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target - - var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting - - var/list/speech_buffer = list() // Last phrase said near it and person who said it - - var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime - var/force_stasis = FALSE - - var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") - ///////////TIME FOR SUBSPECIES - - var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey - var/list/slime_mutation[4] - - var/static/list/slime_colours = list( - "adamantine", - "black", - "blue", - "bluespace", - "cerulean", - "dark blue", - "dark purple", - "gold", - "green", - "grey", - "light pink", - "metal", - "oil", - "orange", - "pink", - "purple", - "pyrite", - "rainbow", - "red", - "sepia", - "silver", - "yellow", - ) - - ///////////CORE-CROSSING CODE - - var/effectmod //What core modification is being used. - var/applied = 0 //How many extracts of the modtype have been applied. - - -/mob/living/simple_animal/slime/Initialize(mapload, new_colour=colour, new_is_adult=FALSE) - var/datum/action/innate/slime/feed/F = new - F.Grant(src) - ADD_TRAIT(src, TRAIT_CANT_RIDE, INNATE_TRAIT) - - is_adult = new_is_adult - - if(is_adult) - var/datum/action/innate/slime/reproduce/R = new - R.Grant(src) - health = 200 - maxHealth = 200 - else - var/datum/action/innate/slime/evolve/E = new - E.Grant(src) - create_reagents(100) - set_colour(new_colour) - . = ..() - set_nutrition(700) - add_cell_sample() - - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/soft_landing) - -/mob/living/simple_animal/slime/Destroy() - for (var/A in actions) - var/datum/action/AC = A - AC.Remove(src) - set_target(null) - set_leader(null) - clear_friends() - return ..() - -/mob/living/simple_animal/slime/create_reagents(max_vol, flags) - . = ..() - RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles removing signal hooks incase someone is crazy enough to reset the reagents datum. -/mob/living/simple_animal/slime/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_QDELETING)) - return NONE - -/mob/living/simple_animal/slime/proc/set_colour(new_colour) - colour = new_colour - update_name() - slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") - regenerate_icons() - -/mob/living/simple_animal/slime/update_name() - if(slime_name_regex.Find(name)) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - real_name = name - return ..() - -/mob/living/simple_animal/slime/proc/random_colour() - set_colour(pick(slime_colours)) - -/mob/living/simple_animal/slime/regenerate_icons() - cut_overlays() - var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime" - icon_dead = "[icon_text] dead" - if(stat != DEAD) - icon_state = icon_text - if(current_mood && !stat) - add_overlay("aslime-[current_mood]") - else - icon_state = icon_dead - ..() - -/** - * Snowflake handling of reagent movespeed modifiers - * - * Should be moved to the reagents at some point in the future. As it is I'm in a hurry. - */ -/mob/living/simple_animal/slime/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod) - var/amount = 0 - if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down - amount = 2 - if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow - amount = 5 - if(amount) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount) - return NONE - -/mob/living/simple_animal/slime/updatehealth() - . = ..() - var/mod = 0 - if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) - var/health_deficiency = (maxHealth - health) - if(health_deficiency >= 45) - mod += (health_deficiency / 25) - if(health <= 0) - mod += 2 - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod) - -/mob/living/simple_animal/slime/adjust_bodytemperature() - . = ..() - var/mod = 0 - if(bodytemperature >= 330.23) // 135 F or 57.08 C - mod = -1 // slimes become supercharged at high temperatures - else if(bodytemperature < 283.222) - mod = ((283.222 - bodytemperature) / 10) * 1.75 - if(mod) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod) - -/mob/living/simple_animal/slime/ObjBump(obj/O) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) - probab = 20 - if(3 to 4) - probab = 30 - if(5 to 6) - probab = 40 - if(7 to 8) - probab = 60 - if(9) - probab = 70 - if(10) - probab = 95 - if(prob(probab)) - if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if (is_adult || prob(5)) - O.attack_slime(src) - Atkcool = TRUE - addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) - -/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - return 2 - -/mob/living/simple_animal/slime/get_status_tab_items() - . = ..() - if(!docile) - . += "Nutrition: [nutrition]/[get_max_nutrition()]" - if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) - if(is_adult) - . += "You can reproduce!" - else - . += "You can evolve!" - - switch(stat) - if(HARD_CRIT, UNCONSCIOUS) - . += "You are knocked out by high levels of BZ!" - else - . += "Power Level: [powerlevel]" - - -/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - if(!forced) - amount = -abs(amount) - return ..() //Heals them - -/mob/living/simple_animal/slime/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - powerlevel = 0 // oh no, the power! - -/mob/living/simple_animal/slime/MouseDrop(atom/movable/A as mob|obj) - if(isliving(A) && A != src && usr == src) - var/mob/living/Food = A - if(CanFeedon(Food)) - Feedon(Food) - return ..() - -/mob/living/simple_animal/slime/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - return - -/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) - return - -/mob/living/simple_animal/slime/attack_ui(slot, params) - return - -/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) - if(..()) //successful slime attack - if(M == src) - return - if(buckled) - Feedstop(silent = TRUE) - visible_message(span_danger("[M] pulls [src] off!"), \ - span_danger("You pull [src] off!")) - return - attacked += 5 - if(nutrition >= 100) //steal some nutrition. negval handled in life() - adjust_nutrition(-(50 + (40 * M.is_adult))) - M.add_nutrition(50 + (40 * M.is_adult)) - if(health > 0) - M.adjustBruteLoss(-10 + (-10 * M.is_adult)) - M.updatehealth() - -/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/user, list/modifiers) - . = ..() - if(.) - attacked += 10 - - -/mob/living/simple_animal/slime/attack_paw(mob/living/carbon/human/user, list/modifiers) - if(..()) //successful monkey bite. - attacked += 10 - -/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L, list/modifiers) - if(..()) //successful larva bite. - attacked += 10 - -/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) - . = ..() - if(!.) - return - discipline_slime(user) - -/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/user, list/modifiers) - if(buckled) - user.do_attack_animation(src, ATTACK_EFFECT_DISARM) - if(buckled == user) - if(prob(60)) - user.visible_message(span_warning("[user] attempts to wrestle \the [name] off!"), \ - span_danger("You attempt to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - user.visible_message(span_warning("[user] manages to wrestle \the [name] off!"), \ - span_notice("You manage to wrestle \the [name] off!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - - else - if(prob(30)) - buckled.visible_message(span_warning("[user] attempts to wrestle \the [name] off of [buckled]!"), \ - span_warning("[user] attempts to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - - else - buckled.visible_message(span_warning("[user] manages to wrestle \the [name] off of [buckled]!"), \ - span_notice("[user] manage to wrestle \the [name] off of you!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - - discipline_slime(user) - else - if(stat == DEAD && surgeries.len) - if(!(user.istate & ISTATE_HARM) || (istate & ISTATE_SECONDARY)) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(..()) //successful attack - attacked += 10 - -/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) - if(..()) //if harm or disarm intent. - attacked += 10 - discipline_slime(user) - - -/mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) - if(stat == DEAD && surgeries.len) - var/list/modifiers = params2list(params) - if(!(user.istate & ISTATE_HARM) || ((istate & ISTATE_SECONDARY))) - for(var/datum/surgery/operations as anything in surgeries) - if(operations.next_step(user, modifiers)) - return TRUE - if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. - add_friendship(user, 1) - to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) - var/obj/item/stack/sheet/mineral/plasma/S = W - S.use(1) - return - if(W.force > 0) - attacked += 10 - if(prob(25)) - user.do_attack_animation(src) - user.changeNext_move(CLICK_CD_MELEE) - to_chat(user, span_danger("[W] passes right through [src]!")) - return - if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - Discipline = 0 - if(W.force >= 3) - var/force_effect = 2 * W.force - if(is_adult) - force_effect = round(W.force/2) - if(prob(10 + force_effect)) - discipline_slime(user) - if(istype(W, /obj/item/storage/bag/xeno)) - var/obj/item/storage/P = W - if(!effectmod) - to_chat(user, span_warning("The slime is not currently being mutated.")) - return - var/hasOutput = FALSE //Have we outputted text? - var/hasFound = FALSE //Have we found an extract to be added? - for(var/obj/item/slime_extract/S in P.contents) - if(S.effectmod == effectmod) - P.atom_storage.attempt_remove(S, get_turf(src), silent = TRUE) - qdel(S) - applied++ - hasFound = TRUE - if(applied >= SLIME_EXTRACT_CROSSING_REQUIRED) - to_chat(user, span_notice("You feed the slime as many of the extracts from the bag as you can, and it mutates!")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - spawn_corecross() - hasOutput = TRUE - break - if(!hasOutput) - if(!hasFound) - to_chat(user, span_warning("There are no extracts in the bag that this slime will accept!")) - else - to_chat(user, span_notice("You feed the slime some extracts from the bag.")) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - return - ..() - -/mob/living/simple_animal/slime/proc/spawn_corecross() - var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) - visible_message(span_danger("[src] shudders, its mutated core consuming the rest of its body!")) - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - var/crosspath - for(var/X in crossbreeds) - var/obj/item/slimecross/S = X - if(initial(S.colour) == colour && initial(S.effect) == effectmod) - crosspath = S - break - if(crosspath) - new crosspath(loc) - else - visible_message(span_warning("The mutated core shudders, and collapses into a puddle, unable to maintain its form.")) - qdel(src) - -/mob/living/simple_animal/slime/proc/apply_water() - adjustBruteLoss(rand(15,20)) - if(!client) - if(Target) // Like cats - set_target(null) - ++Discipline - return - -/mob/living/simple_animal/slime/examine(mob/user) - . = list("This is [icon2html(src, user)] \a [src]!") - if (stat == DEAD) - . += span_deadsay("It is limp and unresponsive.") - else - if (stat == UNCONSCIOUS || stat == HARD_CRIT) // Slime stasis - . += span_deadsay("It appears to be alive but unresponsive.") - if (getBruteLoss()) - . += "" - if (getBruteLoss() < 40) - . += "It has some punctures in its flesh!" - else - . += "It has severe punctures and tears in its flesh!" - . += "\n" - - switch(powerlevel) - if(2 to 3) - . += "It is flickering gently with a little electrical activity." - - if(4 to 5) - . += "It is glowing gently with moderate levels of electrical activity." - - if(6 to 9) - . += span_warning("It is glowing brightly with high levels of electrical activity.") - - if(10) - . += span_warning("It is radiating with massive levels of electrical activity!") - - . += "" - -/mob/living/simple_animal/slime/proc/discipline_slime(mob/user) - if(stat) - return - - if(prob(80) && !client) - Discipline++ - - if(!is_adult) - if(Discipline == 1) - attacked = 0 - - set_target(null) - if(buckled) - Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto. - - SStun = world.time + rand(20,60) - - Stun(3) - if(user) - step_away(src,user,15) - - addtimer(CALLBACK(src, PROC_REF(slime_move), user), 0.3 SECONDS) - - -/mob/living/simple_animal/slime/proc/slime_move(mob/user) - if(user) - step_away(src,user,15) - - -/mob/living/simple_animal/slime/pet - docile = 1 - -/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) - if(..()) - return 3 - -/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) - . = ..(mapload, pick(slime_colours), prob(50)) - -/mob/living/simple_animal/slime/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLIME, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/simple_animal/slime/proc/set_target(new_target) - var/old_target = Target - Target = new_target - if(old_target && !SLIME_CARES_ABOUT(old_target)) - UnregisterSignal(old_target, COMSIG_QDELETING) - if(Target) - RegisterSignal(Target, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -/mob/living/simple_animal/slime/proc/set_leader(new_leader) - var/old_leader = Leader - Leader = new_leader - if(old_leader && !SLIME_CARES_ABOUT(old_leader)) - UnregisterSignal(old_leader, COMSIG_QDELETING) - if(Leader) - RegisterSignal(Leader, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -/mob/living/simple_animal/slime/proc/add_friendship(new_friend, amount = 1) - if(!Friends[new_friend]) - Friends[new_friend] = 0 - Friends[new_friend] += amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -/mob/living/simple_animal/slime/proc/set_friendship(new_friend, amount = 1) - Friends[new_friend] = amount - if(new_friend) - RegisterSignal(new_friend, COMSIG_QDELETING, PROC_REF(clear_memories_of), override = TRUE) - -/mob/living/simple_animal/slime/proc/remove_friend(friend) - Friends -= friend - if(friend && !SLIME_CARES_ABOUT(friend)) - UnregisterSignal(friend, COMSIG_QDELETING) - -/mob/living/simple_animal/slime/proc/set_friends(new_buds) - clear_friends() - for(var/mob/friend as anything in new_buds) - set_friendship(friend, new_buds[friend]) - -/mob/living/simple_animal/slime/proc/clear_friends() - for(var/mob/friend as anything in Friends) - remove_friend(friend) - -/mob/living/simple_animal/slime/proc/clear_memories_of(datum/source) - SIGNAL_HANDLER - if(source == Target) - set_target(null) - if(source == Leader) - set_leader(null) - remove_friend(source) - -#undef SLIME_CARES_ABOUT diff --git a/code/modules/mob/living/simple_animal/slime/slime_say.dm b/code/modules/mob/living/simple_animal/slime/slime_say.dm deleted file mode 100644 index 1a2540c447fa..000000000000 --- a/code/modules/mob/living/simple_animal/slime/slime_say.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), message_range) - . = ..() - if(speaker == src || radio_freq || stat || !(speaker in Friends)) - return - - speech_buffer = list() - speech_buffer += speaker - speech_buffer += lowertext(raw_message) diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm deleted file mode 100644 index 47d45d71fdcd..000000000000 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ /dev/null @@ -1,79 +0,0 @@ -/mob/living/simple_animal/slime/proc/mutation_table(colour) - var/list/slime_mutation_colors[4] - switch(colour) - //Tier 1 - if("grey") - slime_mutation_colors[1] = "orange" - slime_mutation_colors[2] = "metal" - slime_mutation_colors[3] = "blue" - slime_mutation_colors[4] = "purple" - //Tier 2 - if("purple") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "dark blue" - slime_mutation_colors[3] = "green" - slime_mutation_colors[4] = "green" - if("metal") - slime_mutation_colors[1] = "silver" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "gold" - slime_mutation_colors[4] = "gold" - if("orange") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "red" - slime_mutation_colors[4] = "red" - if("blue") - slime_mutation_colors[1] = "dark blue" - slime_mutation_colors[2] = "silver" - slime_mutation_colors[3] = "pink" - slime_mutation_colors[4] = "pink" - //Tier 3 - if("dark blue") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "cerulean" - slime_mutation_colors[4] = "cerulean" - if("dark purple") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "sepia" - slime_mutation_colors[4] = "sepia" - if("yellow") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "bluespace" - slime_mutation_colors[4] = "bluespace" - if("silver") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "pyrite" - slime_mutation_colors[4] = "pyrite" - //Tier 4 - if("pink") - slime_mutation_colors[1] = "pink" - slime_mutation_colors[2] = "pink" - slime_mutation_colors[3] = "light pink" - slime_mutation_colors[4] = "light pink" - if("red") - slime_mutation_colors[1] = "red" - slime_mutation_colors[2] = "red" - slime_mutation_colors[3] = "oil" - slime_mutation_colors[4] = "oil" - if("gold") - slime_mutation_colors[1] = "gold" - slime_mutation_colors[2] = "gold" - slime_mutation_colors[3] = "adamantine" - slime_mutation_colors[4] = "adamantine" - if("green") - slime_mutation_colors[1] = "green" - slime_mutation_colors[2] = "green" - slime_mutation_colors[3] = "black" - slime_mutation_colors[4] = "black" - // Tier 5 - else - slime_mutation_colors[1] = colour - slime_mutation_colors[2] = colour - slime_mutation_colors[3] = colour - slime_mutation_colors[4] = colour - return(slime_mutation_colors) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 5dfdfcc0b78e..d9448372b5ce 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -82,13 +82,6 @@ else to_chat(src, span_warning("This ventilation duct is not connected to anything!")) -/mob/living/simple_animal/slime/can_enter_vent(obj/machinery/atmospherics/components/ventcrawl_target, provide_feedback = TRUE) - if(buckled) - if(provide_feedback) - to_chat(src, span_warning("You can't vent crawl while feeding!")) - return - return ..() - /** * Moves living mob directly into the vent as a ventcrawler * diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 22872424a846..cc300dc070fb 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1006,7 +1006,7 @@ * You can buckle on mobs if you're next to them since most are dense */ /mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, buckle_mob_flags= NONE) - if(M.buckled) + if(M.buckled && LAZYLEN(buckled_mobs) >= max_buckled_mobs) return FALSE return ..(M, force, check_loc, buckle_mob_flags) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e9e28018f4cd..a94bc9b5803b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -234,18 +234,17 @@ for(var/t in bodyparts) qdel(t) - var/mob/living/simple_animal/slime/new_slime + var/mob/living/basic/slime/new_slime if(reproduce) var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) var/list/babies = list() for(var/i in 1 to number) - var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc) - M.set_nutrition(round(nutrition/number)) + var/mob/living/basic/slime/M = new/mob/living/basic/slime(loc) step_away(M,src) babies += M new_slime = pick(babies) else - new_slime = new /mob/living/simple_animal/slime(loc) + new_slime = new /mob/living/basic/slime(loc) new_slime.set_combat_mode(TRUE) new_slime.key = key diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index e80273e1accb..eca84f119e07 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -18,15 +18,15 @@ ///dead slimes, with a var for whatever color you want. /obj/effect/mob_spawn/corpse/slime - mob_type = /mob/living/simple_animal/slime + mob_type = /mob/living/basic/slime icon = 'icons/mob/simple/slimes.dmi' icon_state = "grey baby slime" //sets the icon in the map editor ///the color of the slime you're spawning. - var/slime_species = "grey" + var/slime_species = /datum/slime_color/grey -/obj/effect/mob_spawn/corpse/slime/special(mob/living/simple_animal/slime/spawned_slime) +/obj/effect/mob_spawn/corpse/slime/special(mob/living/basic/slime/spawned_slime) . = ..() - spawned_slime.set_colour(slime_species) + spawned_slime.change_color(slime_species) ///dead facehuggers, great for xeno ruins so you can have a cool ruin without spiraling the entire round into xenomorph hell. also, this is a terrible terrible artifact of time /obj/effect/mob_spawn/corpse/facehugger diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 66d6366cd4c0..fa85c19f05a8 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -433,7 +433,7 @@ name = "EMP-proof slime core" desc = "A yellow slime core infused with plasma. Its organic nature makes it immune to EMPs." icon = 'icons/mob/simple/slimes.dmi' - icon_state = "yellow slime extract" + icon_state = "yellow_slime_extract" custom_materials = null maxcharge = 5000 charge_light_type = null diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 8da6da798265..c0f4fd62281b 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -125,6 +125,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/restricted = FALSE /// do we have a turf exposure (used to prevent liquids doing un-needed processes) var/turf_exposure = FALSE + /// are we slippery? + var/slippery = TRUE /// A list of traits to apply while the reagent is being metabolized. var/list/metabolized_traits /// A list of traits to apply while the reagent is in a mob. diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index f5ed3d865af2..7afbfb2c5f21 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -375,7 +375,7 @@ exposed_open_turf.air.temperature = max(exposed_open_turf.air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit. if(reac_volume < 5) return - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(15,30)) /datum/reagent/consumable/condensedcapsaicin diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index cd100853d4e9..8df7408e8892 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -213,7 +213,7 @@ if(reac_volume >= 5) exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS)) - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.apply_water() var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in exposed_turf) @@ -1370,7 +1370,7 @@ continue movable_content.wash(clean_types) - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(5,10)) /datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 4e57b4dc2409..796c9cf19e06 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -264,7 +264,7 @@ . = ..() if(reac_volume < 5) return - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + for(var/mob/living/basic/slime/exposed_slime in exposed_turf) exposed_slime.adjustToxLoss(rand(15,30)) #undef CRYO_SPEED_PREFACTOR diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 3f27ff2497bc..0f99c7c4321f 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -31,7 +31,7 @@ required_container = /obj/item/slime_extract/grey /datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") + var/mob/living/basic/slime/S = new(get_turf(holder.my_atom), /datum/slime_color/grey) S.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")) ..() @@ -46,7 +46,7 @@ /datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) for(var/i in 1 to 3) - new /obj/item/food/monkeycube(get_turf(holder.my_atom)) + new /obj/item/stack/biomass(get_turf(holder.my_atom)) ..() //Green @@ -313,13 +313,13 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - if(slime.docile) //Undoes docility, but doesn't make rabid. + for(var/mob/living/basic/slime/slime in viewers(get_turf(holder.my_atom), null)) + if(slime.has_slime_trait(/datum/slime_trait/docility)) //Undoes docility, but doesn't make rabid. slime.visible_message(span_danger("[slime] forgets its training, becoming wild once again!")) - slime.docile = FALSE + slime.remove_trait(/datum/slime_trait/docility) slime.update_name() continue - slime.rabid = 1 + ADD_TRAIT(slime, TRAIT_SLIME_RABID, "bloodlust") slime.visible_message(span_danger("The [slime] is driven into a frenzy!")) ..() @@ -527,7 +527,7 @@ S.active = TRUE addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, detonate)), rand(15,60)) else - var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) + var/mob/living/basic/slime/random/S = new (get_turf(holder.my_atom)) S.visible_message(span_danger("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!")) ..() diff --git a/code/modules/research/designs/autolathe/medsci_designs.dm b/code/modules/research/designs/autolathe/medsci_designs.dm index e0b03384044b..599babb107f2 100644 --- a/code/modules/research/designs/autolathe/medsci_designs.dm +++ b/code/modules/research/designs/autolathe/medsci_designs.dm @@ -36,17 +36,6 @@ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL // Science Designs -/datum/design/slime_scanner - name = "Slime Scanner" - id = "slime_scanner" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass =SMALL_MATERIAL_AMOUNT * 2) - build_path = /obj/item/slime_scanner - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_XENOBIOLOGY, - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE /datum/design/petridish name = "Petri Dish" diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 84c5a3ac80ab..05f0defdf8b7 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -46,16 +46,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE -/datum/design/board/xenobiocamera - name = "Xenobiology Console Board" - desc = "Allows for the construction of circuit boards used to build xenobiology camera computers." - id = "xenobioconsole" - build_path = /obj/item/circuitboard/computer/xenobiology - category = list( - RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - /datum/design/board/aiupload name = "AI Upload Board" desc = "Allows for the construction of circuit boards used to build an AI Upload Console." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 2959c9af5de0..4c9bfc3a262a 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -522,16 +522,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE | DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE -/datum/design/board/monkey_recycler - name = "Monkey Recycler Board" - desc = "The circuit board for a monkey recycler." - id = "monkey_recycler" - build_path = /obj/item/circuitboard/machine/monkey_recycler - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - /datum/design/board/seed_extractor name = "Seed Extractor Board" desc = "The circuit board for a seed extractor." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 8b5fc4ff97ed..f689ab713294 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -105,7 +105,6 @@ "shaker", "shot_glass", "signaler", - "slime_scanner", "solar_panel", "solar_tracker", "space_heater", @@ -474,13 +473,19 @@ "gibber", "griddle", "microwave", - "monkey_recycler", "oven", "processor", "range", // should be in a further node, probably "reagentgrinder", "smartfridge", "stove", + "biomass_recycler", + "corral_corner", + "slime_extract_requestor", + "slime_market_pad", + "slime_market", + "slimevac", + ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) discount_experiments = list(/datum/experiment/scanning/random/cytology = 3000) //Big discount to reinforce doing it. @@ -707,7 +712,6 @@ "beacon", "bluespace_crystal", "telesci_gps", - "xenobioconsole", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index b682bed7cdfa..4a8ff0e6ce95 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -89,6 +89,8 @@ To add a crossbreed: if("adamantine") itemcolor = "#008B8B" add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) + if(colour == "rainbow") + rainbow_effect() /obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals. name = "result extract" diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm index 24e44f0a389b..851d9f7f8d0b 100644 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm @@ -16,7 +16,7 @@ Slimecrossing Mobs convert_damage = TRUE convert_damage_type = CLONE - possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime) + possible_shapes = list(/mob/living/basic/slime) /// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human var/remove_on_restore = FALSE @@ -29,14 +29,6 @@ Slimecrossing Mobs if(remove_on_restore) qdel(src) -/// Transformed slime - from Burning Black -/mob/living/simple_animal/slime/transformed_slime - -// Just in case. -/mob/living/simple_animal/slime/transformed_slime/Reproduce() - to_chat(src, span_warning("I can't reproduce...")) // Mood - return - //Slime corgi - Chilling Pink /mob/living/basic/pet/dog/corgi/puppy/slime name = "\improper slime corgi puppy" diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 0b5368f53728..1e6205dc8039 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -183,7 +183,7 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/revive_target, mob/user) +/obj/item/slimepotion/slime_reviver/attack(mob/living/basic/slime/revive_target, mob/user) if(!isslime(revive_target)) to_chat(user, span_warning("The potion only works on slimes!")) return ..() @@ -207,7 +207,7 @@ Slimecrossing Potions icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/stabilize_target, mob/user) +/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/basic/slime/stabilize_target, mob/user) if(!isslime(stabilize_target)) to_chat(user, span_warning("The stabilizer only works on slimes!")) return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index a68a6fafae35..a7c6c3baed07 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -470,10 +470,8 @@ colour = "grey" /datum/status_effect/stabilized/grey/tick() - for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) - if(!(owner in S.Friends)) - to_chat(owner, span_notice("[linked_extract] pulses gently as it communicates with [S].")) - S.set_friendship(owner, 1) + for(var/mob/living/basic/slime/S in range(1, get_turf(owner))) + SEND_SIGNAL(S, COMSIG_FRIENDSHIP_CHANGE, owner, 1) return ..() /datum/status_effect/stabilized/orange diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 14d2f980eb43..b2d8eaaed28f 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -32,11 +32,10 @@ Burning extracts: effect_desc = "Creates a hungry and speedy slime that will love you forever." /obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") + var/mob/living/basic/slime/S = new(get_turf(user)) S.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!")) - S.set_friendship(user, 20) //Gas, gas, gas + SEND_SIGNAL(S, COMSIG_FRIENDSHIP_CHANGE, user, 110) S.bodytemperature = T0C + 400 //We gonna step on the gas. - S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! ..() /obj/item/slimecross/burning/orange @@ -197,14 +196,16 @@ Burning extracts: /obj/item/slimecross/burning/red/do_effect(mob/user) user.visible_message(span_danger("[src] pulses a hazy red aura for a moment, which wraps around [user]!")) - for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user))) + for(var/mob/living/basic/slime/S in view(7, get_turf(user))) + /* if(user in S.Friends) var/friendliness = S.Friends[user] S.clear_friends() S.set_friendship(user, friendliness) else S.clear_friends() - S.rabid = 1 + */ + ADD_TRAIT(S, TRAIT_SLIME_RABID, "burning-red") S.visible_message(span_danger("The [S] is driven into a dangerous frenzy!")) ..() diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index a125cd7276e3..5e14557999cd 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -276,6 +276,6 @@ Charged extracts: /obj/item/slimecross/charged/rainbow/do_effect(mob/user) user.visible_message(span_warning("[src] swells and splits into three new slimes!")) for(var/i in 1 to 3) - var/mob/living/simple_animal/slime/S = new(get_turf(user)) - S.random_colour() + var/mob/living/basic/slime/S = new(get_turf(user)) + S.start_mutating(TRUE) return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 18f5a2849cab..9c37d0df7b87 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -231,9 +231,9 @@ Chilling extracts: /obj/item/slimecross/chilling/red/do_effect(mob/user) var/slimesfound = FALSE - for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7)) + for(var/mob/living/basic/slime/S in view(get_turf(user), 7)) slimesfound = TRUE - S.docile = TRUE + S.add_trait(/datum/slime_trait/docility) if(slimesfound) user.visible_message(span_notice("[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm.")) else diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index 710cf90dd71e..425e8026f896 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -54,7 +54,7 @@ Industrial extracts: /obj/item/slimecross/industrial/grey colour = "grey" effect_desc = "Produces monkey cubes." - itempath = /obj/item/food/monkeycube + itempath = /obj/item/stack/biomass itemamount = 5 /obj/item/slimecross/industrial/orange diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 6460b3a849fe..a0b357d7bdcf 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -197,8 +197,8 @@ Regenerative extracts: /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) if(isslime(target)) target.visible_message(span_warning("The [target] suddenly changes color!")) - var/mob/living/simple_animal/slime/S = target - S.random_colour() + var/mob/living/basic/slime/S = target + S.start_mutating(TRUE) if(isjellyperson(target)) target.reagents.add_reagent(/datum/reagent/mutationtoxin/jelly,5) @@ -237,7 +237,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) var/dummytype = target.type if(ismegafauna(target)) //Prevents megafauna duping in a lame way - dummytype = /mob/living/simple_animal/slime + dummytype = /mob/living/basic/slime to_chat(user, span_warning("The milky goo flows over [target], falling into a weak puddle.")) var/mob/living/dummy = new dummytype(target.loc) to_chat(target, span_notice("The milky goo flows from your skin, forming an imperfect copy of you.")) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index cb903c84d625..f22e6109fb35 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -249,7 +249,7 @@ /datum/reagent/consumable/ice = -2) //Brrr! virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/slime = 1) + resulting_atoms = list(/mob/living/basic/slime = 1) /datum/micro_organism/cell_line/blob_spore //shitty cell line to dilute the pool, feel free to make easier to grow if it doesn't interfer with growing the powerful mobs enough. desc = "Immature blob spores" diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm deleted file mode 100644 index d3b1b581c019..000000000000 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ /dev/null @@ -1,453 +0,0 @@ -//Xenobio control console -/mob/camera/ai_eye/remote/xenobio - visible_icon = TRUE - icon = 'icons/mob/silicon/cameramob.dmi' - icon_state = "generic_camera" - var/allowed_area = null - -/mob/camera/ai_eye/remote/xenobio/Initialize(mapload) - var/area/A = get_area(loc) - allowed_area = A.name - . = ..() - -/mob/camera/ai_eye/remote/xenobio/setLoc(turf/destination, force_update = FALSE) - var/area/new_area = get_area(destination) - if(new_area && new_area.name == allowed_area || new_area && (new_area.area_flags & XENOBIOLOGY_COMPATIBLE)) - return ..() - else - return - -/mob/camera/ai_eye/remote/xenobio/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) - . = ..() - if(!.) - return - var/area/new_area = get_area(.) - if(new_area.name != allowed_area && !(new_area.area_flags & XENOBIOLOGY_COMPATIBLE)) - return FALSE - -/obj/machinery/computer/camera_advanced/xenobio - name = "Slime management console" - desc = "A computer used for remotely handling slimes." - networks = list("ss13") - circuit = /obj/item/circuitboard/computer/xenobiology - - var/obj/machinery/monkey_recycler/connected_recycler - var/list/stored_slimes - var/obj/item/slimepotion/slime/current_potion - var/max_slimes = 5 - var/monkeys = 0 - - icon_screen = "slime_comp" - icon_keyboard = "rd_key" - - light_color = LIGHT_COLOR_PINK - -/obj/machinery/computer/camera_advanced/xenobio/Initialize(mapload) - . = ..() - actions += new /datum/action/innate/slime_place(src) - actions += new /datum/action/innate/slime_pick_up(src) - actions += new /datum/action/innate/feed_slime(src) - actions += new /datum/action/innate/monkey_recycle(src) - actions += new /datum/action/innate/slime_scan(src) - actions += new /datum/action/innate/feed_potion(src) - actions += new /datum/action/innate/hotkey_help(src) - - stored_slimes = list() - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/Destroy() - QDEL_NULL(current_potion) - for(var/thing in stored_slimes) - var/mob/living/simple_animal/slime/S = thing - S.forceMove(drop_location()) - stored_slimes.Cut() - if(connected_recycler) - connected_recycler.connected -= src - connected_recycler = null - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) - current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/CreateEye() - eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src)) - eyeobj.origin = src - eyeobj.visible_icon = TRUE - eyeobj.icon = 'icons/mob/silicon/cameramob.dmi' - eyeobj.icon_state = "generic_camera" - -/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) - ..() - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl)) - RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift)) - - //Checks for recycler on every interact, prevents issues with load order on certain maps. - if(!connected_recycler) - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) - ..() - -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/food/monkeycube)) - monkeys++ - to_chat(user, span_notice("You feed [O] to [src]. It now has [monkeys] monkey cubes stored.")) - qdel(O) - return - else if(istype(O, /obj/item/storage/bag)) - var/obj/item/storage/P = O - var/loaded = FALSE - for(var/obj/G in P.contents) - if(istype(G, /obj/item/food/monkeycube)) - loaded = TRUE - monkeys++ - qdel(G) - if(loaded) - to_chat(user, span_notice("You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.")) - return - else if(istype(O, /obj/item/slimepotion/slime)) - var/replaced = FALSE - if(user && !user.transferItemToLoc(O, src)) - return - if(!QDELETED(current_potion)) - current_potion.forceMove(drop_location()) - replaced = TRUE - current_potion = O - to_chat(user, span_notice("You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].")) - return - ..() - -/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if (istype(I) && istype(I.buffer,/obj/machinery/monkey_recycler)) - to_chat(user, span_notice("You link [src] with [I.buffer] in [I] buffer.")) - connected_recycler = I.buffer - connected_recycler.connected += src - return TRUE - -/datum/action/innate/slime_place - name = "Place Slimes" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_down" - -/datum/action/innate/slime_place/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(remote_eye.loc) - S.visible_message(span_notice("[S] warps in!")) - X.stored_slimes -= S - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - -/datum/action/innate/slime_pick_up - name = "Pick up Slime" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_up" - -/datum/action/innate/slime_pick_up/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - if(X.stored_slimes.len >= X.max_slimes) - break - if(!S.ckey) - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message(span_notice("[S] vanishes in a flash of light!")) - S.forceMove(X) - X.stored_slimes += S - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - - -/datum/action/innate/feed_slime - name = "Feed Slimes" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_down" - -/datum/action/innate/feed_slime/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - if(X.monkeys >= 1) - var/mob/living/carbon/human/species/monkey/food = new /mob/living/carbon/human/species/monkey(remote_eye.loc, TRUE, owner) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - remote_eye.auto_attach_slime(food) // monke edit: hungry slimes that aren't feeding will now immediately latch onto monkeys placed on top of them - to_chat(owner, span_notice("[X] now has [X.monkeys] monkeys stored.")) - else - to_chat(owner, span_warning("[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")) - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - - -/datum/action/innate/monkey_recycle - name = "Recycle Monkeys" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_up" - -/datum/action/innate/monkey_recycle/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - var/obj/machinery/monkey_recycler/recycler = X.connected_recycler - - if(!recycler) - to_chat(owner, span_warning("There is no connected monkey recycler. Use a multitool to link one.")) - return - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/human/M in remote_eye.loc) - if(!ismonkey(M)) - continue - if(M.stat) - M.visible_message(span_notice("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")) - recycler.use_power(500) - X.monkeys += recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(owner, span_notice("[X] now has [X.monkeys] monkeys available.")) - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - -/datum/action/innate/slime_scan - name = "Scan Slime" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_scan" - -/datum/action/innate/slime_scan/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - slime_scan(S, C) - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - -/datum/action/innate/feed_potion - name = "Apply Potion" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_potion" - -/datum/action/innate/feed_potion/Activate() - if(!target || !isliving(owner)) - return - - var/mob/living/C = owner - var/mob/camera/ai_eye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(QDELETED(X.current_potion)) - to_chat(owner, span_warning("No potion loaded.")) - return - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - X.current_potion.attack(S, C) - break - else - to_chat(owner, span_warning("Target is not near a camera. Cannot proceed.")) - -/datum/action/innate/hotkey_help - name = "Hotkey Help" - button_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "hotkey_help" - -/datum/action/innate/hotkey_help/Activate() - if(!target || !isliving(owner)) - return - to_chat(owner, "Click shortcuts:") - to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.") - to_chat(owner, "Ctrl-click a slime to scan it.") - to_chat(owner, "Alt-click a slime to feed it a potion.") - to_chat(owner, "Ctrl-click or a dead monkey to recycle it, or the floor to place a new monkey.") - -// -// Alternate clicks for slime, monkey and open turf if using a xenobio console - - -//Feeds a potion to slime -/mob/living/simple_animal/slime/AltClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) - ..() - -//Picks up slime -/mob/living/simple_animal/slime/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) - ..() - -//Place slimes -/turf/open/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) - ..() - -//scans slimes -/mob/living/simple_animal/slime/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) - ..() - -//picks up dead monkies -/mob/living/carbon/human/species/monkey/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) - ..() - -//places monkies -/turf/open/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) - ..() - -// Scans slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) - SIGNAL_HANDLER - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - slime_scan(S, C) - -//Feeds a potion to slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) - SIGNAL_HANDLER - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(QDELETED(X.current_potion)) - to_chat(C, span_warning("No potion loaded.")) - return - if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - INVOKE_ASYNC(X.current_potion, TYPE_PROC_REF(/obj/item/slimepotion/slime, attack), S, C) - -//Picks up slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) - SIGNAL_HANDLER - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - if(X.stored_slimes.len >= X.max_slimes) - to_chat(C, span_warning("Slime storage is full.")) - return - if(S.ckey) - to_chat(C, span_warning("The slime wiggled free!")) - return - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message(span_notice("[S] vanishes in a flash of light!")) - S.forceMove(X) - X.stored_slimes += S - -//Place slimes -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) - SIGNAL_HANDLER - - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(T) - S.visible_message(span_notice("[S] warps in!")) - X.stored_slimes -= S - -//Place monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) - SIGNAL_HANDLER - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - if(X.monkeys >= 1) - var/mob/living/carbon/human/food = new /mob/living/carbon/human/species/monkey(T, TRUE, C) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - E.auto_attach_slime(food) // monke edit: hungry slimes that aren't feeding will now immediately latch onto monkeys placed on top of them - to_chat(C, span_notice("[X] now has [X.monkeys] monkeys stored.")) - else - to_chat(C, span_warning("[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.")) - -//Pick up monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/human/M) - SIGNAL_HANDLER - if(!ismonkey(M)) - return - if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc)) - to_chat(user, span_warning("Target is not near a camera. Cannot proceed.")) - return - var/mob/living/C = user - var/mob/camera/ai_eye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(M.loc) - if(!X.connected_recycler) - to_chat(C, span_warning("There is no connected monkey recycler. Use a multitool to link one.")) - return - if(mobarea.name == E.allowed_area || (mobarea.area_flags & XENOBIOLOGY_COMPATIBLE)) - if(!M.stat) - return - M.visible_message(span_notice("[M] vanishes as [p_theyre()] reclaimed for recycling!")) - X.connected_recycler.use_power(500) - X.monkeys += connected_recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(C, span_notice("[X] now has [X.monkeys] monkeys available.")) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 3e4f35370ef5..f2606e0310aa 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -3,8 +3,8 @@ /obj/item/slime_extract name = "slime extract" desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/simple/slimes.dmi' - icon_state = "grey slime extract" + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + icon_state = "grey_slime_extract" force = 0 w_class = WEIGHT_CLASS_TINY throwforce = 0 @@ -17,6 +17,8 @@ var/list/activate_reagents = list() ///Reagents required for activation var/recurring = FALSE + var/tier = 1 + /obj/item/slime_extract/examine(mob/user) . = ..() if(Uses > 1) @@ -58,45 +60,16 @@ to_chat(user, span_warning("Nothing happened... This slime extract cannot be activated this way.")) return FALSE -/** -* Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. -* -* By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross. -*/ -/obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - return ..() - if(M.stat) - to_chat(user, span_warning("The slime is dead!")) - return - if(!M.is_adult) - to_chat(user, span_warning("The slime must be an adult to cross its core!")) - return - if(M.effectmod && M.effectmod != effectmod) - to_chat(user, span_warning("The slime is already being crossed with a different extract!")) - return - - if(!M.effectmod) - M.effectmod = effectmod - - M.applied++ - qdel(src) - to_chat(user, span_notice("You feed the slime [src], [M.applied == 1 ? "starting to mutate its core." : "further mutating its core."]")) - playsound(M, 'sound/effects/attackblob.ogg', 50, TRUE) - - if(M.applied >= SLIME_EXTRACT_CROSSING_REQUIRED) - M.spawn_corecross() - /obj/item/slime_extract/grey name = "grey slime extract" - icon_state = "grey slime extract" + icon_state = "grey_slime_extract" effectmod = "reproductive" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) /obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - var/obj/item/food/monkeycube/M = new + var/obj/item/stack/biomass/M = new if(!user.put_in_active_hand(M)) M.forceMove(user.drop_location()) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) @@ -105,7 +78,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_notice("Your [name] starts pulsing...")) if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey") + var/mob/living/basic/slime/S = new(get_turf(user)) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) to_chat(user, span_notice("You spit out [S].")) return 350 @@ -114,9 +87,10 @@ /obj/item/slime_extract/gold name = "gold slime extract" - icon_state = "gold slime extract" + icon_state = "gold_slime_extract" effectmod = "symbiont" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 4 @@ -145,9 +119,10 @@ /obj/item/slime_extract/silver name = "silver slime extract" - icon_state = "silver slime extract" + icon_state = "silver_slime_extract" effectmod = "consuming" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 2 @@ -173,7 +148,7 @@ /obj/item/slime_extract/metal name = "metal slime extract" - icon_state = "metal slime extract" + icon_state = "metal_slime_extract" effectmod = "industrial" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -197,7 +172,7 @@ /obj/item/slime_extract/purple name = "purple slime extract" - icon_state = "purple slime extract" + icon_state = "purple_slime_extract" effectmod = "regenerative" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) @@ -216,9 +191,10 @@ /obj/item/slime_extract/darkpurple name = "dark purple slime extract" - icon_state = "dark purple slime extract" + icon_state = "dark_purple_slime_extract" effectmod = "self-sustaining" activate_reagents = list(/datum/reagent/toxin/plasma) + tier = 2 /obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -239,7 +215,7 @@ /obj/item/slime_extract/orange name = "orange slime extract" - icon_state = "orange slime extract" + icon_state = "orange_slime_extract" effectmod = "burning" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -259,9 +235,10 @@ /obj/item/slime_extract/yellow name = "yellow slime extract" - icon_state = "yellow slime extract" + icon_state = "yellow_slime_extract" effectmod = "charged" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 2 /obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -282,9 +259,10 @@ /obj/item/slime_extract/red name = "red slime extract" - icon_state = "red slime extract" + icon_state = "red_slime_extract" effectmod = "sanguine" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 3 /obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -295,14 +273,14 @@ if(SLIME_ACTIVATE_MAJOR) user.visible_message(span_warning("[user]'s skin flashes red for a moment..."), span_warning("Your skin flashes red as you emit rage-inducing pheromones...")) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null)) - slime.rabid = TRUE + for(var/mob/living/basic/slime/slime in viewers(get_turf(user), null)) + ADD_TRAIT(slime, TRAIT_SLIME_RABID, "red-extract") slime.visible_message(span_danger("The [slime] is driven into a frenzy!")) return 600 /obj/item/slime_extract/blue name = "blue slime extract" - icon_state = "blue slime extract" + icon_state = "blue_slime_extract" effectmod = "stabilized" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) @@ -322,9 +300,10 @@ /obj/item/slime_extract/darkblue name = "dark blue slime extract" - icon_state = "dark blue slime extract" + icon_state = "dark_blue_slime_extract" effectmod = "chilling" activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 2 /obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -345,9 +324,10 @@ /obj/item/slime_extract/pink name = "pink slime extract" - icon_state = "pink slime extract" + icon_state = "pink_slime_extract" effectmod = "gentle" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) + tier = 4 /obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -373,9 +353,10 @@ /obj/item/slime_extract/green name = "green slime extract" - icon_state = "green slime extract" + icon_state = "green_slime_extract" effectmod = "mutative" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) + tier = 4 /obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -397,9 +378,10 @@ /obj/item/slime_extract/lightpink name = "light pink slime extract" - icon_state = "light pink slime extract" + icon_state = "light_pink_slime_extract" effectmod = "loyal" activate_reagents = list(/datum/reagent/toxin/plasma) + tier = 5 /obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -421,9 +403,10 @@ /obj/item/slime_extract/black name = "black slime extract" - icon_state = "black slime extract" + icon_state = "black_slime_extract" effectmod = "transformative" activate_reagents = list(/datum/reagent/toxin/plasma) + tier = 5 /obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -441,9 +424,10 @@ /obj/item/slime_extract/oil name = "oil slime extract" - icon_state = "oil slime extract" + icon_state = "oil_slime_extract" effectmod = "detonating" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) + tier = 5 /obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -465,9 +449,10 @@ /obj/item/slime_extract/adamantine name = "adamantine slime extract" - icon_state = "adamantine slime extract" + icon_state = "adamantine_slime_extract" effectmod = "crystalline" activate_reagents = list(/datum/reagent/toxin/plasma) + tier = 5 /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -494,13 +479,14 @@ /obj/item/slime_extract/bluespace name = "bluespace slime extract" - icon_state = "bluespace slime extract" + icon_state = "bluespace_slime_extract" effectmod = "warping" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) var/teleport_ready = FALSE var/teleport_x = 0 var/teleport_y = 0 var/teleport_z = 0 + tier = 6 /obj/item/slime_extract/bluespace/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -530,9 +516,10 @@ /obj/item/slime_extract/pyrite name = "pyrite slime extract" - icon_state = "pyrite slime extract" + icon_state = "pyrite_slime_extract" effectmod = "prismatic" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) + tier = 3 /obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -557,9 +544,10 @@ /obj/item/slime_extract/cerulean name = "cerulean slime extract" - icon_state = "cerulean slime extract" + icon_state = "cerulean_slime_extract" effectmod = "recurring" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) + tier = 3 /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -577,9 +565,10 @@ /obj/item/slime_extract/sepia name = "sepia slime extract" - icon_state = "sepia slime extract" + icon_state = "sepia_slime_extract" effectmod = "lengthened" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) + tier = 3 /obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -599,9 +588,10 @@ /obj/item/slime_extract/rainbow name = "rainbow slime extract" - icon_state = "rainbow slime extract" + icon_state = "rainbow_slime_extract" effectmod = "hyperchromatic" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. + tier = 6 /obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) @@ -653,21 +643,20 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potsilver" -/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/docility/attack(mob/living/basic/slime/M, mob/user) if(!isslime(M)) to_chat(user, span_warning("The potion only works on slimes!")) return ..() if(M.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.rabid) //Stops being rabid, but doesn't become truly docile. + if(HAS_TRAIT(M, TRAIT_SLIME_RABID)) //Stops being rabid, but doesn't become truly docile. to_chat(M, span_warning("You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.")) to_chat(user, span_notice("You feed the slime the potion, calming its rabid rage.")) - M.rabid = FALSE + REMOVE_TRAIT(M, TRAIT_SLIME_RABID, null) qdel(src) return - M.docile = 1 - M.set_nutrition(700) + M.add_trait(/datum/slime_trait/docility) to_chat(M, span_warning("You absorb the potion and feel your intense desire to feed melt away.")) to_chat(user, span_notice("You feed the slime the potion, removing its hunger and calming it.")) var/newname = sanitize_name(tgui_input_text(user, "Would you like to give the slime a name?", "Name your new pet", "Pet Slime", MAX_NAME_LEN)) @@ -799,22 +788,18 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potred" -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/steroid/attack(mob/living/basic/slime/M, mob/user) if(!isslime(M))//If target is not a slime. to_chat(user, span_warning("The steroid only works on baby slimes!")) return ..() - if(M.is_adult) //Can't steroidify adults - to_chat(user, span_warning("Only baby slimes can use the steroid!")) - return if(M.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.cores >= 5) - to_chat(user, span_warning("The slime already has the maximum amount of extract!")) + if(M.ooze_production >= 50) + to_chat(user, span_warning("The slime is already producing too much ooze!")) return - - to_chat(user, span_notice("You feed the slime the steroid. It will now produce one more extract.")) - M.cores++ + to_chat(user, span_notice("You feed the slime the steroid. It will now produce more ooze.")) + M.ooze_production++ qdel(src) /obj/item/slimepotion/enhancer @@ -829,7 +814,7 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potcyan" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/stabilizer/attack(mob/living/basic/slime/M, mob/user) if(!isslime(M)) to_chat(user, span_warning("The stabilizer only works on slimes!")) return ..() @@ -850,14 +835,14 @@ icon = 'icons/obj/medical/chemical.dmi' icon_state = "potgreen" -/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) +/obj/item/slimepotion/slime/mutator/attack(mob/living/basic/slime/M, mob/user) if(!isslime(M)) to_chat(user, span_warning("The mutator only works on slimes!")) return ..() if(M.stat) to_chat(user, span_warning("The slime is dead!")) return - if(M.mutator_used) + if(HAS_TRAIT(M, TRAIT_MUTATOR_USED)) to_chat(user, span_warning("This slime has already consumed a mutator, any more would be far too unstable!")) return if(M.mutation_chance == 100) @@ -866,7 +851,7 @@ to_chat(user, span_notice("You feed the slime the mutator. It is now more likely to mutate.")) M.mutation_chance = clamp(M.mutation_chance+12,0,100) - M.mutator_used = TRUE + ADD_TRAIT(M, TRAIT_MUTATOR_USED, "slime-mutator") qdel(src) /obj/item/slimepotion/speed diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm deleted file mode 100644 index 4ada9e7b59a3..000000000000 --- a/code/modules/surgery/core_removal.dm +++ /dev/null @@ -1,61 +0,0 @@ -/datum/surgery/core_removal - name = "Core removal" - target_mobtypes = list(/mob/living/simple_animal/slime) - surgery_flags = SURGERY_IGNORE_CLOTHES - possible_locs = list( - BODY_ZONE_R_ARM, - BODY_ZONE_L_ARM, - BODY_ZONE_R_LEG, - BODY_ZONE_L_LEG, - BODY_ZONE_CHEST, - BODY_ZONE_HEAD, - ) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/extract_core, - ) - -/datum/surgery/core_removal/can_start(mob/user, mob/living/target) - if(target.stat == DEAD) - return TRUE - return FALSE - -//extract brain -/datum/surgery_step/extract_core - name = "extract core (hemostat/crowbar)" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 100) - time = 16 - -/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results( - user, - target, - span_notice("You begin to extract a core from [target]..."), - span_notice("[user] begins to extract a core from [target]."), - span_notice("[user] begins to extract a core from [target]."), - ) - -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/simple_animal/slime/target_slime = target - if(target_slime.cores > 0) - target_slime.cores-- - display_results( - user, - target, - span_notice("You successfully extract a core from [target]. [target_slime.cores] core\s remaining."), - span_notice("[user] successfully extracts a core from [target]!"), - span_notice("[user] successfully extracts a core from [target]!"), - ) - - new target_slime.coretype(target_slime.loc) - - if(target_slime.cores <= 0) - target_slime.icon_state = "[target_slime.colour] baby slime dead-nocore" - return ..() - else - return FALSE - else - to_chat(user, span_warning("There aren't any cores left in [target]!")) - return ..() diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 0ae0cbc962a0..902e32bf4364 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -105,6 +105,7 @@ slot = ORGAN_SLOT_BRAIN_ANTISTUN var/static/list/signalCache = list( + COMSIG_LIVING_STAMINA_STUN, COMSIG_LIVING_STATUS_STUN, COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_LIVING_STATUS_IMMOBILIZE, @@ -128,6 +129,7 @@ /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns() if(owner || !(organ_flags & ORGAN_FAILING)) + owner.exit_stamina_stun() owner.SetStun(0) owner.SetKnockdown(0) owner.SetImmobilized(0) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 0e5ed05bf2b3..e8bda6fd8e89 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -191,7 +191,6 @@ #include "security_officer_distribution.dm" #include "serving_tray.dm" #include "siunit.dm" -#include "slime_mood.dm" #include "slips.dm" #include "spawn_humans.dm" #include "spawn_mobs.dm" diff --git a/code/modules/unit_tests/slime_mood.dm b/code/modules/unit_tests/slime_mood.dm deleted file mode 100644 index a0d3edb95c17..000000000000 --- a/code/modules/unit_tests/slime_mood.dm +++ /dev/null @@ -1,12 +0,0 @@ -///Unit test that tests all types of moods for slimes, to make sure they all have proper icons, excluding moods that intentionally don't have an icon. -/datum/unit_test/slime_mood - -/datum/unit_test/slime_mood/Run() - var/mob/living/simple_animal/slime/emoting_slime = allocate(/mob/living/simple_animal/slime) - - for(var/key in GLOB.emote_list) - for(var/datum/emote/slime/mood/slime_mood in GLOB.emote_list[key]) - var/list/states = icon_states(emoting_slime.icon) - if(!slime_mood.mood_key) - continue - TEST_ASSERT(("aslime-[slime_mood.mood_key]" in states), "[slime_mood] is set to give [emoting_slime] the [slime_mood.mood_key] emote, but the icon state can't be found in [emoting_slime.icon].") diff --git a/code/modules/unit_tests/strange_reagent.dm b/code/modules/unit_tests/strange_reagent.dm index 345be4befe97..e754282eb121 100644 --- a/code/modules/unit_tests/strange_reagent.dm +++ b/code/modules/unit_tests/strange_reagent.dm @@ -18,7 +18,7 @@ types_to_check -= /mob/living/simple_animal/pet/gondola/gondolapod // need a pod, which we don't have types_to_check -= typesof(/mob/living/simple_animal/hostile/megafauna) // no types_to_check -= typesof(/mob/living/basic/mouse) // qdel themselves on death; why dont they use DEL_ON_DEATH you might ask. I-unno - types_to_check -= typesof(/mob/living/simple_animal/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves + types_to_check -= typesof(/mob/living/basic/slime) // if they roll the 50% chance to spawn as an adult, they can just at random split and qdel themselves for(var/mob/living/type as anything in types_to_check) var/mob/living/target = allocate_new_target(type) diff --git a/config/game_options.txt b/config/game_options.txt index b336b336d268..9553ef352df5 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -48,7 +48,7 @@ WALK_DELAY 4 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0 +##MULTIPLICATIVE_MOVESPEED /mob/living/basic/slime 0 MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 0 MULTIPLICATIVE_MOVESPEED /mob/living/basic 0 diff --git a/monkestation/code/controllers/subsystem/job.dm b/monkestation/code/controllers/subsystem/job.dm index 1642474d8f56..a9e30e36976b 100644 --- a/monkestation/code/controllers/subsystem/job.dm +++ b/monkestation/code/controllers/subsystem/job.dm @@ -26,7 +26,7 @@ /// Handle antags as well as assigning people to their jobs /datum/controller/subsystem/job/proc/handle_final_setup() var/sanity = 0 - var/max_sane_loops = length(subtypesof(/datum/round_event_control/antagonist/solo) - typesof(/datum/round_event_control/antagonist/solo/ghost)) //not exact, but its close enough + var/max_sane_loops = length(subtypesof(/datum/round_event_control/antagonist/solo) - typesof(/datum/round_event_control/antagonist/solo/from_ghosts)) //not exact, but its close enough pick_desired_roundstart() while(!handle_roundstart_antags() && !sanity >= max_sane_loops) sanity++ diff --git a/monkestation/code/modules/aesthetics/mobs/slime.dm b/monkestation/code/modules/aesthetics/mobs/slime.dm index abde54b2ca69..d660145fb9ba 100644 --- a/monkestation/code/modules/aesthetics/mobs/slime.dm +++ b/monkestation/code/modules/aesthetics/mobs/slime.dm @@ -1,11 +1,8 @@ -/mob/living/simple_animal/slime - icon = 'monkestation/icons/mob/slimes.dmi' - /obj/item/stock_parts/cell/emproof/slime - icon = 'monkestation/icons/mob/slimes.dmi' + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' /obj/item/slime_extract - icon = 'monkestation/icons/mob/slimes.dmi' + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' /obj/item/stock_parts/cell/emproof/slime/hypercharged - icon = 'monkestation/icons/mob/slimes.dmi' + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' diff --git a/monkestation/code/modules/cargo/crates/science.dm b/monkestation/code/modules/cargo/crates/science.dm index 3d9705b86d1e..0ae3dddbc5c6 100644 --- a/monkestation/code/modules/cargo/crates/science.dm +++ b/monkestation/code/modules/cargo/crates/science.dm @@ -5,8 +5,9 @@ access = ACCESS_XENOBIOLOGY contains = list(/obj/item/slime_extract/grey = 2, /obj/item/reagent_containers/syringe/plasma, - /obj/item/circuitboard/computer/xenobiology, - /obj/item/circuitboard/machine/monkey_recycler, - /obj/item/circuitboard/machine/processor/slime) + /obj/item/circuitboard/computer/slime_market, + /obj/item/circuitboard/machine/slime_market_pad, + /obj/item/circuitboard/machine/biomass_recycler, + /obj/item/vacuum_pack) crate_name = "xenobiology starter crate" crate_type = /obj/structure/closet/crate/secure/science diff --git a/monkestation/code/modules/liquids/liquid_controller.dm b/monkestation/code/modules/liquids/liquid_controller.dm index acdb58359679..6fdd85e5ff61 100644 --- a/monkestation/code/modules/liquids/liquid_controller.dm +++ b/monkestation/code/modules/liquids/liquid_controller.dm @@ -46,6 +46,9 @@ SUBSYSTEM_DEF(liquids) if(length(arrayed_groups)) for(var/g in arrayed_groups) var/datum/liquid_group/LG = g + if(!LG) + arrayed_groups -= g + continue while(!MC_TICK_CHECK && length(LG.splitting_array)) // three at a time until we either finish or over-run, this should be done before anything else LG.work_on_split_queue() LG.cleanse_members() @@ -87,6 +90,9 @@ SUBSYSTEM_DEF(liquids) temperature_queue -= temperature_turf if(!temperature_turf.liquids) continue + if(!temperature_turf.liquids.liquid_group) + qdel(temperature_turf.liquids) + continue temperature_turf.liquids.liquid_group.act_on_queue(temperature_turf) run_type = SSLIQUIDS_RUN_TYPE_EVAPORATION diff --git a/monkestation/code/modules/liquids/liquid_effect.dm b/monkestation/code/modules/liquids/liquid_effect.dm index 201d95fae7b3..9e1e8324791f 100644 --- a/monkestation/code/modules/liquids/liquid_effect.dm +++ b/monkestation/code/modules/liquids/liquid_effect.dm @@ -122,6 +122,9 @@ /obj/effect/abstract/liquid_turf/proc/movable_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER + if(!liquid_group) + qdel(src) + return var/turf/T = source if(isobserver(AM)) @@ -143,8 +146,9 @@ liquid_group.expose_atom(stepped_human, 1, TOUCH) else if (isliving(AM)) var/mob/living/L = AM - if(prob(7) && !(L.movement_type & FLYING) && L.body_position == STANDING_UP) - L.slip(30, T, NO_SLIP_WHEN_WALKING, 0, TRUE) + if(liquid_group.slippery) + if(prob(7) && !(L.movement_type & FLYING) && L.body_position == STANDING_UP) + L.slip(30, T, NO_SLIP_WHEN_WALKING, 0, TRUE) if(fire_state) AM.fire_act((T20C+50) + (50*fire_state), 125) @@ -244,6 +248,10 @@ /obj/effect/abstract/liquid_turf/proc/examine_turf(turf/source, mob/examiner, list/examine_list) SIGNAL_HANDLER + if(!liquid_group) + qdel(src) + return + // This should always have reagents if this effect object exists, but as a sanity check... if(!length(liquid_group.reagents.reagent_list)) return diff --git a/monkestation/code/modules/liquids/liquid_groups.dm b/monkestation/code/modules/liquids/liquid_groups.dm index b9193919dbb2..6f74b9f62fa5 100644 --- a/monkestation/code/modules/liquids/liquid_groups.dm +++ b/monkestation/code/modules/liquids/liquid_groups.dm @@ -66,6 +66,8 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) var/exposure = FALSE ///array generated by bulk splitting var/list/splitting_array = list() + ///are we slippery + var/slippery = TRUE ///NEW/DESTROY /datum/liquid_group/New(height, obj/effect/abstract/liquid_turf/created_liquid) @@ -76,8 +78,10 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) add_to_group(created_liquid.my_turf) cached_edge_turfs[created_liquid.my_turf] = list(NORTH, SOUTH, EAST, WEST) SSliquids.active_groups |= src + RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(removed_reagent)) /datum/liquid_group/Destroy() + UnregisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT) SSliquids.active_groups -= src if(src in SSliquids.arrayed_groups) @@ -86,10 +90,16 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) for(var/t in members) var/turf/T = t T.liquids.liquid_group = null - members = null + members = list() burning_members = null return ..() +/datum/liquid_group/proc/removed_reagent(datum/reagents/source, datum/reagent/modified) + for(var/turf/member as anything in members) + if(!member.liquids) + continue + modified.remove_from_member(member.liquids) + ///GROUP CONTROLLING /datum/liquid_group/proc/add_to_group(turf/T) if(!T) @@ -104,6 +114,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) members[T] = TRUE T.liquids.liquid_group = src + for(var/datum/reagent/reagent as anything in reagents.reagent_list) + reagent.add_to_member(T.liquids) + reagents.maximum_volume += 1000 /// each turf will hold 1000 units plus the base amount spread across the group if(group_color) T.liquids.color = group_color @@ -121,6 +134,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) if(T.liquids) T.liquids.liquid_group = null + for(var/datum/reagent/reagent as anything in reagents.reagent_list) + reagent.remove_from_member(T.liquids) + if(!members.len) qdel(src) return @@ -145,7 +161,11 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) add_reagents(reagent_list = created_reagent_list, chem_temp = otherg.group_temperature) cached_edge_turfs |= otherg.cached_edge_turfs - for(var/turf/liquid_turf in otherg.members) + for(var/turf/liquid_turf as anything in members) + for(var/datum/reagent/reagent as anything in reagents.reagent_list) + reagent.add_to_member(liquid_turf.liquids) + + for(var/turf/liquid_turf as anything in otherg.members) otherg.remove_from_group(liquid_turf) add_to_group(liquid_turf) @@ -219,6 +239,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) for(var/turf/listed_turf as anything in members) if(isclosedturf(listed_turf)) remove_from_group(listed_turf) + qdel(listed_turf.liquids) /datum/liquid_group/proc/process_member(turf/member) if(isspaceturf(member)) @@ -237,6 +258,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) turf_reagents = new(100000) exposure = FALSE + slippery = FALSE for(var/reagent_type in reagents.reagent_list) var/datum/reagent/pulled_reagent = reagent_type var/amount = pulled_reagent.volume / members.len @@ -247,6 +269,8 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) turf_reagents.add_reagent(pulled_reagent.type, amount) if(pulled_reagent.turf_exposure && amount > 10) exposure = TRUE + if(pulled_reagent.slippery) + slippery = TRUE /datum/liquid_group/proc/process_turf_disperse() @@ -367,10 +391,34 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) handle_visual_changes() +/datum/liquid_group/proc/transfer_specific_reagents(datum/reagents/secondary_reagent, amount, list/reagents_to_check, obj/effect/abstract/liquid_turf/remover, merge = FALSE) + if(!length(reagents_to_check)) + return + var/total_hits = 0 + var/total_volume = 0 + for(var/datum/reagent/reagent_type in reagents.reagent_list) + if(!(reagent_type.type in reagents_to_check)) + continue + total_hits++ + total_volume += reagent_type.volume + if(!total_hits) + return + + var/precent = (amount / total_volume) + for(var/datum/reagent/reagent_type in reagents.reagent_list) + if(!(reagent_type.type in reagents_to_check)) + continue + secondary_reagent.add_reagent(reagent_type.type, reagent_type.volume * precent, no_react = TRUE) + remove_specific(amount = reagent_type.volume * precent, reagent_type = reagent_type.type) + + process_removal() + handle_visual_changes() + + /datum/liquid_group/proc/process_removal(amount) total_reagent_volume = reagents.total_volume - if(total_reagent_volume) + if(total_reagent_volume && length(members)) //Otherwise we are probably just sending the last of things reagents_per_turf = total_reagent_volume / length(members) else reagents_per_turf = 0 @@ -743,7 +791,7 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) var/list/temp = return_connected_liquids(cardinal.liquids) if(isnull(temp) || !length(temp)) continue - connected_array += list(temp) + connected_array += list(list(temp)) if(!length(connected_array)) return @@ -775,6 +823,9 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) for(var/list/liquid_list as anything in connected_liquids) var/datum/liquid_group/new_group = new(1) + if(!members) + members = list() + trans_to_seperate_group(new_group.reagents, amount_to_transfer) for(var/turf/connected_liquid in liquid_list) new_group.check_edges(connected_liquid) @@ -784,7 +835,6 @@ GLOBAL_VAR_INIT(liquid_debug_colors, FALSE) remove_from_group(connected_liquid, TRUE) new_group.add_to_group(connected_liquid) - trans_to_seperate_group(new_group.reagents, amount_to_transfer) new_group.total_reagent_volume = new_group.reagents.total_volume new_group.reagents_per_turf = new_group.total_reagent_volume / length(new_group.members) diff --git a/monkestation/code/modules/liquids/liquid_status_effect.dm b/monkestation/code/modules/liquids/liquid_status_effect.dm index f431e586f58e..2311372f9d18 100644 --- a/monkestation/code/modules/liquids/liquid_status_effect.dm +++ b/monkestation/code/modules/liquids/liquid_status_effect.dm @@ -29,10 +29,11 @@ return ..() /datum/status_effect/water_affected/on_remove() - owner.remove_movespeed_modifier("water_slow") + owner.remove_movespeed_modifier("liquid_slowdown") /datum/movespeed_modifier/liquids + id = "liquid_slowdown" variable = TRUE blacklisted_movetypes = FLOATING diff --git a/monkestation/code/modules/liquids/liquid_turf.dm b/monkestation/code/modules/liquids/liquid_turf.dm index 2087a5ac0a93..226d9afd6ecd 100644 --- a/monkestation/code/modules/liquids/liquid_turf.dm +++ b/monkestation/code/modules/liquids/liquid_turf.dm @@ -37,6 +37,10 @@ //More efficient than add_liquid for multiples /turf/proc/add_liquid_list(reagent_list, no_react = FALSE, chem_temp) + if(liquids && !liquids.liquid_group) + qdel(liquids) + return + if(!liquids) liquids = new(src) liquids.liquid_group.add_reagents(liquids, reagent_list, chem_temp) diff --git a/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm b/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm index 829ea9762e86..b3f32178b408 100644 --- a/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm +++ b/monkestation/code/modules/ocean_content/fluff/cargo_driver.dm @@ -4,7 +4,7 @@ name = "Cargo Driver" id = MASSDRIVER_CARGO -/obj/machinery/mass_driver/drive(amount) +/obj/machinery/mass_driver/cargo_driver/drive(amount) if(machine_stat & (BROKEN|NOPOWER)) return use_power(active_power_usage) @@ -24,7 +24,8 @@ break use_power(active_power_usage) O.throw_at(target, get_dist(src, target) + 4, power) - addtimer(CALLBACK(O, TYPE_PROC_REF(/atom/movable, attempt_map_sell)), 4 SECONDS / power) + if(length(SSmapping.levels_by_trait(ZTRAIT_OSHAN))) + addtimer(CALLBACK(O, TYPE_PROC_REF(/atom/movable, attempt_map_sell)), 4 SECONDS / power) flick("mass_driver1", src) /atom/movable/proc/attempt_map_sell() diff --git a/monkestation/code/modules/pollution/pollutant_datum.dm b/monkestation/code/modules/pollution/pollutant_datum.dm index 5fc09f0247ba..fe4c09bde95c 100644 --- a/monkestation/code/modules/pollution/pollutant_datum.dm +++ b/monkestation/code/modules/pollution/pollutant_datum.dm @@ -18,14 +18,14 @@ /// Scent of the smell var/scent -///When a pollutant touches an unprotected carbon mob -/datum/pollutant/proc/touch_act(mob/living/carbon/victim, amount) +///When a pollutant touches an unprotected mob +/datum/pollutant/proc/touch_act(mob/living/victim, amount) return ///When a carbon mob breathes in the pollutant /datum/pollutant/proc/breathe_act(mob/living/carbon/victim, amount) return -///When a carbon mob smells scents this is called +///When a carbon mob smells scents this is called /datum/pollutant/proc/on_smell(mob/living/carbon/victim, amount) return diff --git a/monkestation/code/modules/research/xenobiology/xenobio_camera.dm b/monkestation/code/modules/research/xenobiology/xenobio_camera.dm deleted file mode 100644 index bb2302d029f4..000000000000 --- a/monkestation/code/modules/research/xenobiology/xenobio_camera.dm +++ /dev/null @@ -1,15 +0,0 @@ -/mob/camera/ai_eye/remote/xenobio/proc/auto_attach_slime(mob/living/carbon/human/food) - var/mob/living/simple_animal/slime/glutton - for(var/mob/living/simple_animal/slime/slime in range(1, loc)) - if(slime.ckey || slime.amount_grown >= SLIME_EVOLUTION_THRESHOLD) - continue - var/mob/living/slime_eating = slime.buckled - if(!isliving(slime_eating) || slime_eating.stat < DEAD) - continue - if(glutton?.is_adult && !slime.is_adult) - // adult slimes can react faster than baby slimes - continue - if(QDELETED(glutton) || (!glutton.is_adult && slime.is_adult) || (slime.amount_grown > glutton.amount_grown)) - glutton = slime - if(!QDELETED(glutton)) - addtimer(CALLBACK(glutton, TYPE_PROC_REF(/mob/living/simple_animal/slime, Feedon), food), rand(0.1 SECONDS, 0.9 SECONDS)) diff --git a/monkestation/code/modules/slimecore/animations/slime_effects.dm b/monkestation/code/modules/slimecore/animations/slime_effects.dm new file mode 100644 index 000000000000..ae59551d2625 --- /dev/null +++ b/monkestation/code/modules/slimecore/animations/slime_effects.dm @@ -0,0 +1,38 @@ +/obj/effect/abstract/blank + name = "" + alpha = 150 + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon ='monkestation/code/modules/slimecore/icons/filters.dmi' + icon_state = "diag" + vis_flags = VIS_INHERIT_PLANE | VIS_INHERIT_LAYER + blend_mode = BLEND_INSET_OVERLAY + +/atom/movable/proc/rainbow_effect() // this just animates between the primary colors of a rainbow + var/obj/effect/abstract/blank/rainbow_effect = new + + appearance_flags &= ~KEEP_APART + appearance_flags |= KEEP_TOGETHER + vis_contents += rainbow_effect + +/atom/movable/proc/remove_rainbow_effect() + var/obj/effect/abstract/blank/rainbow_effect = locate() in vis_contents + qdel(rainbow_effect) + +/image/proc/rainbow_effect() // this just animates between the primary colors of a rainbow + var/obj/effect/abstract/blank/rainbow_effect = new + + appearance_flags &= ~KEEP_APART + appearance_flags |= KEEP_TOGETHER + vis_contents += rainbow_effect + +/atom/proc/ungulate() + var/matrix/ungulate_matrix = matrix(transform) + ungulate_matrix.Scale(1, 0.9) + var/matrix/base_matrix = matrix(transform) + var/base_pixel_y = pixel_y + + animate(src, transform = ungulate_matrix, time = 0.1 SECONDS, easing = EASE_OUT, loop = -1) + animate(pixel_y = -1, time = 0.1 SECONDS, easing = EASE_OUT) + animate(transform = base_matrix, time = 0.1 SECONDS, easing = EASE_IN) + animate(pixel_y = base_pixel_y, time = 0.1 SECONDS, easing = EASE_IN) diff --git a/monkestation/code/modules/slimecore/assets/xenobiology.dm b/monkestation/code/modules/slimecore/assets/xenobiology.dm new file mode 100644 index 000000000000..b8677ba2e83f --- /dev/null +++ b/monkestation/code/modules/slimecore/assets/xenobiology.dm @@ -0,0 +1,5 @@ +/datum/asset/spritesheet/xenobio_market + name = "xenobio_market" + +/datum/asset/spritesheet/xenobio_market/create_spritesheets() + InsertAll("", 'monkestation/code/modules/slimecore/icons/slimes.dmi') diff --git a/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm b/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm new file mode 100644 index 000000000000..3b3aa14886bb --- /dev/null +++ b/monkestation/code/modules/slimecore/components/basic_scared_of_item.dm @@ -0,0 +1,40 @@ +/datum/component/scared_of_item // this runs independantly of ai_controller so we aren't wasting ai process time on this as its a passive check. + var/range + var/was_scared = FALSE + var/mob/last_scared_by + +/datum/component/scared_of_item/Initialize(item_path, range) + src.range = range + + START_PROCESSING(SSobj, src) + +/datum/component/scared_of_item/process(seconds_per_tick) + var/mob/living/basic/basic_mob = parent + + if(isliving(parent)) + var/mob/living/living = parent + if(living.stat == DEAD) + return + + var/broke = FALSE + for(var/mob/living/carbon/human/human in oview(range, basic_mob)) + for(var/obj/item/item as anything in human.held_items) + if(!item) + continue + if(item.type != basic_mob.ai_controller.blackboard[BB_BASIC_MOB_SCARED_ITEM]) + continue + basic_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE) + + if(!was_scared) + SEND_SIGNAL(basic_mob, COMSIG_EMOTION_STORE, human, EMOTION_SCARED, "chased me with an extinguisher.") + last_scared_by = human + was_scared = TRUE + broke = TRUE + break + if(broke) + return + basic_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) + if(was_scared) + SEND_SIGNAL(basic_mob, COMSIG_EMOTION_STORE, last_scared_by, EMOTION_HAPPY, "stopped chasing me with an extinguisher.", 0) + was_scared = FALSE + last_scared_by = null diff --git a/monkestation/code/modules/slimecore/components/emotion_buffer.dm b/monkestation/code/modules/slimecore/components/emotion_buffer.dm new file mode 100644 index 000000000000..ce715b741706 --- /dev/null +++ b/monkestation/code/modules/slimecore/components/emotion_buffer.dm @@ -0,0 +1,136 @@ +//This is really just a storage cell for mood messages, also handles some basic responding to emotional events for mobs +/datum/component/emotion_buffer + var/mob/living/host + + ///our current emotion + var/current_emotion = EMOTION_HAPPY + + ///the buffer of emotional things with there emotion stored like EMOTION_HAPPY = List("Was fed by x") + var/emotional_buffer = list( + EMOTION_HAPPY = list(), + EMOTION_SAD = list(), + EMOTION_ANGER = list(), + EMOTION_FUNNY = list(), + EMOTION_SCARED = list(), + EMOTION_SUPRISED = list(), + EMOTION_HUNGRY = list(), + ) + + var/emotional_responses = list( + EMOTION_HAPPY = list(), + EMOTION_SAD = list(), + EMOTION_ANGER = list(), + EMOTION_FUNNY = list(), + EMOTION_SCARED = list(), + EMOTION_SUPRISED = list(), + EMOTION_HUNGRY = list(), + ) + + var/emotional_heard = list( + EMOTION_HAPPY = list(), + EMOTION_SAD = list(), + EMOTION_ANGER = list(), + EMOTION_FUNNY = list(), + EMOTION_SCARED = list(), + EMOTION_SUPRISED = list(), + EMOTION_HUNGRY = list(), + ) + + ///these are sent as emotion = icon_state, where the icon is stored inside the sources icon file + var/list/emotional_overlays = list() + +/datum/component/emotion_buffer/Initialize(list/emotional_overlay_states) + . = ..() + host = parent + if(!length(emotional_overlay_states)) + emotional_overlays = list() + emotional_overlays = emotional_overlay_states + +/datum/component/emotion_buffer/RegisterWithParent() + . = ..() + if(length(emotional_overlays)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(emotion_overlay)) + RegisterSignal(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, PROC_REF(replace_overlays)) + + RegisterSignal(parent, COMSIG_EMOTION_STORE, PROC_REF(register_emotional_data)) + RegisterSignal(parent, EMOTION_BUFFER_SPEAK_FROM_BUFFER, PROC_REF(speak_from_buffer)) + RegisterSignal(parent, COMSIG_EMOTION_HEARD, PROC_REF(store_heard)) + RegisterSignal(parent, COMSIG_MOVABLE_HEAR, PROC_REF(hear_speech)) + +/datum/component/emotion_buffer/Destroy(force, silent) + . = ..() + host = null + +/datum/component/emotion_buffer/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_EMOTION_STORE) + UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS) + UnregisterSignal(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES) + UnregisterSignal(parent, EMOTION_BUFFER_SPEAK_FROM_BUFFER) + UnregisterSignal(parent, COMSIG_EMOTION_HEARD) + UnregisterSignal(parent, COMSIG_MOVABLE_HEAR) + + +/datum/component/emotion_buffer/proc/register_emotional_data(datum/source, atom/from, emotion, emotional_text, intensity = 1) + if(!emotional_buffer[emotion]) + return + + if((emotion in list(EMOTION_ANGER, EMOTION_SAD, EMOTION_SCARED)) && intensity) + intensity *= -1 + + + if(from) + emotional_buffer[emotion] += list("[from] [emotional_text]" = FALSE) + if(intensity) + SEND_SIGNAL(parent, COMSIG_FRIENDSHIP_CHANGE, from, intensity) + else + emotional_buffer[emotion] += list("[emotional_text]" = FALSE) + + current_emotion = emotion + +/datum/component/emotion_buffer/proc/emotion_overlay(mob/living/source, list/overlays) + if(!emotional_overlays[current_emotion]) + return + if(source.health <= 0) + return + overlays += mutable_appearance(source.icon, emotional_overlays[current_emotion], source.layer, source) + +/datum/component/emotion_buffer/proc/replace_overlays(mob/living/source, list/new_icon_states) + emotional_overlays = list() + emotional_overlays += new_icon_states + +/datum/component/emotion_buffer/proc/speak_from_buffer(mob/living/source) + if(prob(100)) + var/spoken_emotion = current_emotion + if(prob(25)) + var/list/viable_emotions = list() + for(var/emotion in emotional_buffer) + if(!length(emotional_buffer[emotion])) + continue + viable_emotions |= emotion + if(!length(viable_emotions)) + return + spoken_emotion = pick(viable_emotions) + var/list/speakable_phrases = list() + for(var/phrase in emotional_buffer[spoken_emotion]) + if(emotional_buffer[spoken_emotion][phrase]) + continue + speakable_phrases |= phrase + + if(!length(speakable_phrases)) + return + var/choice = pick(speakable_phrases) + if(!choice) + return + emotional_buffer[spoken_emotion][choice] = TRUE + source.say(choice) + + for(var/mob/living/mob in range(5, source)) + if(mob == source) + continue + SEND_SIGNAL(mob, COMSIG_EMOTION_HEARD, spoken_emotion, choice, source) + +/datum/component/emotion_buffer/proc/store_heard(mob/living/source, emotion, phrase, mob/living/speaker) + emotional_heard[emotion] += list("[speaker] said [phrase]" = FALSE) + +/datum/component/emotion_buffer/proc/hear_speech() diff --git a/monkestation/code/modules/slimecore/components/friendship_tracker.dm b/monkestation/code/modules/slimecore/components/friendship_tracker.dm new file mode 100644 index 000000000000..0c3305b33349 --- /dev/null +++ b/monkestation/code/modules/slimecore/components/friendship_tracker.dm @@ -0,0 +1,56 @@ +/datum/component/friendship_container + ///our friendship thresholds from lowest to highest + var/list/friendship_levels = list() + ///our current friends stored as a weakref = amount + var/list/weakrefed_friends = list() + ///list of friendship levels that we send BEFRIEND signals on, if someone drops below these levels its over + var/befriend_level + ///list of all befriended refs + var/list/befriended_refs = list() + +/datum/component/friendship_container/Initialize(friendship_levels = list(), befriend_level) + . = ..() + if(!length(friendship_levels)) + return FALSE + + src.friendship_levels = friendship_levels + src.befriend_level = befriend_level + + +/datum/component/friendship_container/RegisterWithParent() + RegisterSignal(parent, COMSIG_FRIENDSHIP_CHECK_LEVEL, PROC_REF(check_friendship_level)) + RegisterSignal(parent, COMSIG_FRIENDSHIP_CHANGE, PROC_REF(change_friendship)) + +/datum/component/friendship_container/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_FRIENDSHIP_CHECK_LEVEL) + UnregisterSignal(parent, COMSIG_FRIENDSHIP_CHANGE) + +/datum/component/friendship_container/proc/change_friendship(mob/living/source, atom/target, amount) + for(var/datum/weakref/ref as anything in weakrefed_friends) + if(ref.resolve() == target) + + ///handles registering pet commands and other things that use BEFRIEND + if(amount < 0) + if((friendship_levels[befriend_level] > weakrefed_friends[ref]) && (ref in befriended_refs)) + SEND_SIGNAL(parent, COMSIG_LIVING_UNFRIENDED, ref.resolve()) + befriended_refs -= ref + source.ai_controller?.remove_thing_from_blackboard_key(BB_FRIENDS_LIST, target) + + else if((friendship_levels[befriend_level] <= weakrefed_friends[ref]) && !(ref in befriended_refs)) + SEND_SIGNAL(parent, COMSIG_LIVING_BEFRIENDED, ref.resolve()) + befriended_refs += ref + source.ai_controller?.insert_blackboard_key_lazylist(BB_FRIENDS_LIST, target) + + weakrefed_friends[ref] += amount + return TRUE + weakrefed_friends += list(WEAKREF(target) = amount) + return TRUE + +///Returns {TRUE} if friendship is above a certain threshold else returns {FALSE} +/datum/component/friendship_container/proc/check_friendship_level(mob/living/source, atom/target, friendship_level) + for(var/datum/weakref/ref as anything in weakrefed_friends) + if(ref.resolve() == target) + if(friendship_levels[friendship_level] <= weakrefed_friends[ref]) + return TRUE + return FALSE + return FALSE diff --git a/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm b/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm new file mode 100644 index 000000000000..a8aefc5df81c --- /dev/null +++ b/monkestation/code/modules/slimecore/components/generic_mob_hunger.dm @@ -0,0 +1,94 @@ +/datum/component/generic_mob_hunger + var/current_hunger + var/max_hunger + ///this is the rate at which our hunger passively drains + var/hunger_drain + var/hunger_paused = FALSE + var/feed_pause_time + var/feed_pause_end + +/datum/component/generic_mob_hunger/Initialize(max_hunger = 250, hunger_drain = 0.1, feed_pause_time = 1 MINUTE, starting_hunger) + . = ..() + src.hunger_drain = hunger_drain + src.max_hunger = max_hunger + src.feed_pause_time = feed_pause_time + if(!starting_hunger) + src.current_hunger = max_hunger + else + src.current_hunger = starting_hunger + + START_PROCESSING(SSobj, src) + +/datum/component/generic_mob_hunger/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_STOP_HUNGER, PROC_REF(stop_hunger)) + RegisterSignal(parent, COMSIG_MOB_START_HUNGER, PROC_REF(start_hunger)) + RegisterSignal(parent, COMSIG_MOB_FEED, PROC_REF(on_feed)) + RegisterSignal(parent, COMSIG_MOB_RETURN_HUNGER, PROC_REF(return_hunger)) + RegisterSignal(parent, COMSIG_MOB_ADJUST_HUNGER, PROC_REF(adjust_hunger)) + +/datum/component/generic_mob_hunger/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_MOB_STOP_HUNGER) + UnregisterSignal(parent, COMSIG_MOB_START_HUNGER) + UnregisterSignal(parent, COMSIG_MOB_FEED) + UnregisterSignal(parent, COMSIG_MOB_RETURN_HUNGER) + UnregisterSignal(parent, COMSIG_MOB_ADJUST_HUNGER) + +/datum/component/generic_mob_hunger/proc/stop_hunger() + hunger_paused = TRUE + +/datum/component/generic_mob_hunger/proc/start_hunger() + hunger_paused = FALSE + +/datum/component/generic_mob_hunger/proc/on_feed(datum/source, atom/target, feed_amount) + SIGNAL_HANDLER + if(current_hunger > max_hunger) + SEND_SIGNAL(parent, COMSIG_MOB_REFUSED_EAT) + return + + SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger + feed_amount, max_hunger) + if(current_hunger + feed_amount > max_hunger) + var/temp = (current_hunger + feed_amount) / max_hunger + SEND_SIGNAL(parent, COMSIG_MOB_OVERATE, temp) + ADD_TRAIT(parent, TRAIT_OVERFED, "hunger_trait") + addtimer(CALLBACK(src, PROC_REF(remove_hunger_trait), TRAIT_OVERFED), 5 MINUTES, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + current_hunger += feed_amount + if(feed_pause_time) + feed_pause_end = world.time + feed_pause_time + return + + current_hunger += feed_amount + SEND_SIGNAL(parent, COMSIG_MOB_EAT_NORMAL, current_hunger) + if(feed_pause_time) + feed_pause_end = world.time + feed_pause_time + +/datum/component/generic_mob_hunger/proc/return_hunger() + SIGNAL_HANDLER + return current_hunger / max_hunger + +/datum/component/generic_mob_hunger/process(seconds_per_tick) + if(hunger_paused || !hunger_drain || (feed_pause_end > world.time)) + return + + if(isliving(parent)) + var/mob/living/living = parent + if(living.stat == DEAD) + return + + if(current_hunger >= hunger_drain) + current_hunger -= hunger_drain + SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger, max_hunger) + + var/hunger_precent = current_hunger / max_hunger + + if(hunger_precent <= 0.25) + SEND_SIGNAL(parent, COMSIG_MOB_STARVING, hunger_precent) + else + current_hunger = 0 + SEND_SIGNAL(parent, COMSIG_HUNGER_UPDATED, current_hunger, max_hunger) + SEND_SIGNAL(parent, COMSIG_MOB_FULLY_STARVING) + +/datum/component/generic_mob_hunger/proc/adjust_hunger(datum/source, amount) + current_hunger += amount + +/datum/component/generic_mob_hunger/proc/remove_hunger_trait(trait) + REMOVE_TRAIT(parent, trait, "hunger_trait") diff --git a/monkestation/code/modules/slimecore/components/latch_feeding.dm b/monkestation/code/modules/slimecore/components/latch_feeding.dm new file mode 100644 index 000000000000..5780c4b45efb --- /dev/null +++ b/monkestation/code/modules/slimecore/components/latch_feeding.dm @@ -0,0 +1,123 @@ +/datum/component/latch_feeding + var/damage_type + var/damage_amount + + ///this is the target we are sucking + var/atom/movable/target + ///this is the amount of hunger we are sending per feed process + var/hunger_restore + ///do we stop at crit? + var/stops_at_crit + ///did we just unlatch? + var/unlatching = FALSE + ///our callback + var/datum/callback/check_and_replace + +/datum/component/latch_feeding/Initialize(atom/movable/target, damage_type, damage_amount, hunger_restore, stops_at_crit, datum/callback/callback, checks_loc = TRUE) + . = ..() + src.target = target + if(!target) + return COMPONENT_INCOMPATIBLE + + src.damage_type = damage_type + src.damage_amount = damage_amount + src.hunger_restore = hunger_restore + src.stops_at_crit = stops_at_crit + src.check_and_replace = callback + + if(!latch_target(loc_check = checks_loc)) + return COMPONENT_INCOMPATIBLE + + ADD_TRAIT(parent, TRAIT_FEEDING, LATCH_TRAIT) + + START_PROCESSING(SSobj, src) + +/datum/component/latch_feeding/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_FEEDING, LATCH_TRAIT) + . = ..() + target = null + qdel(check_and_replace) + +/datum/component/latch_feeding/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_buckled)) + RegisterSignal(parent, COMSIG_MOB_OVERATE, PROC_REF(stop_feeding)) + +/datum/component/latch_feeding/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_LIVING_SET_BUCKLED) + UnregisterSignal(parent, COMSIG_MOB_OVERATE) + +/datum/component/latch_feeding/proc/latch_target(init = FALSE, loc_check = TRUE) + var/mob/basic_mob = parent + var/mob/living/living_target = target + SEND_SIGNAL(basic_mob, COMSIG_MOBSTACKER_DESTROY) + basic_mob.unbuckle_all_mobs() + if((living_target.stat >= SOFT_CRIT) && stops_at_crit && living_target.client) + if(init) + return FALSE + else + qdel(src) + return FALSE + + target.unbuckle_all_mobs(force = TRUE) + if(target.buckle_mob(basic_mob, TRUE, loc_check)) + basic_mob.layer = target.layer + 0.1 + target.visible_message(span_danger("[basic_mob] latches onto [target]!"), \ + span_userdanger("[basic_mob] latches onto [target]!")) + ADD_TRAIT(target, TRAIT_LATCH_FEEDERED, "latch_feeding") + return TRUE + else + to_chat(basic_mob, span_notice("You failed to latch onto [target].")) + if(init) + return FALSE + else + qdel(src) + +/datum/component/latch_feeding/proc/unlatch_target(living = TRUE, silent = FALSE) + var/mob/basic_mob = parent + if(!target) + return + if(basic_mob.buckled) + if(!living) + to_chat(basic_mob, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + if(!silent) + basic_mob.visible_message(span_warning("[basic_mob] lets go of [basic_mob.buckled]!"), \ + span_notice("I stopped feeding.")) + + REMOVE_TRAIT(target, TRAIT_LATCH_FEEDERED, "latch_feeding") + basic_mob.layer = initial(basic_mob.layer) + if(basic_mob.buckled) + basic_mob.buckled.unbuckle_mob(basic_mob, force=TRUE) + +/datum/component/latch_feeding/proc/check_buckled(mob/living/source, atom/movable/new_buckled) + if(!new_buckled && !unlatching) + unlatching = TRUE + unlatch_target() + qdel(src) + return + +/datum/component/latch_feeding/proc/stop_feeding() + unlatch_target() + qdel(src) + +/datum/component/latch_feeding/process(seconds_per_tick) + if(!target) + qdel(src) + return + + var/mob/living/living_target = target + if((living_target.stat >= SOFT_CRIT) && stops_at_crit && living_target.client) + stop_feeding() + return + + if(!check_and_replace || (check_and_replace && !check_and_replace.Invoke())) + if(iscarbon(living_target)) + living_target.apply_damage(damage_amount, damage_type, spread_damage = TRUE) + else + living_target.apply_damage(damage_amount, BRUTE, spread_damage = TRUE) + + if(parent) // ??? I was getting runtimes for no parent but IDK how + SEND_SIGNAL(parent, COMSIG_MOB_FEED, target, hunger_restore) + SEND_SIGNAL(target, COMSIG_MOB_FED_ON, parent, hunger_restore) diff --git a/monkestation/code/modules/slimecore/components/liquid_secretion.dm b/monkestation/code/modules/slimecore/components/liquid_secretion.dm new file mode 100644 index 000000000000..5dce38e9a8b8 --- /dev/null +++ b/monkestation/code/modules/slimecore/components/liquid_secretion.dm @@ -0,0 +1,50 @@ +/datum/component/liquid_secretion + ///the reagent we secrete + var/reagent_id + ///the interval of secretion + var/secretion_interval + ///amount of reagents to spawn + var/amount + ///Callback interaction called when the turf has some liquids on it + var/datum/callback/pre_secrete_callback + var/next_secrete = 0 + + + +/datum/component/liquid_secretion/Initialize(reagent_id = /datum/reagent/water, amount = 10, secretion_interval = 1 SECONDS, pre_secrete_callback) + . = ..() + + src.reagent_id = reagent_id + src.secretion_interval = secretion_interval + src.amount = amount + src.pre_secrete_callback = CALLBACK(parent, pre_secrete_callback) + + START_PROCESSING(SSobj, src) + +/datum/component/liquid_secretion/RegisterWithParent() + RegisterSignal(parent, COMSIG_SECRETION_UPDATE, PROC_REF(update_information)) //The only signal allowing item -> turf interaction + +/datum/component/liquid_secretion/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_SECRETION_UPDATE) + +/datum/component/liquid_secretion/proc/update_information(datum/source, reagent_id, amount, secretion_interval) + if(reagent_id) + src.reagent_id = reagent_id + if(amount) + src.amount = amount + if(secretion_interval) + src.secretion_interval = secretion_interval + + +/datum/component/liquid_secretion/process(seconds_per_tick) + if(!parent || (next_secrete > world.time)) + return + next_secrete = world.time + secretion_interval + if(pre_secrete_callback && !pre_secrete_callback.Invoke(parent)) + return + + var/turf/parent_turf = get_turf(parent) + var/list/reagent_list = list() + reagent_list |= reagent_id + reagent_list[reagent_id] = amount + parent_turf.add_liquid_list(reagent_list, FALSE, T20C) diff --git a/monkestation/code/modules/slimecore/components/mob_stacker.dm b/monkestation/code/modules/slimecore/components/mob_stacker.dm new file mode 100644 index 000000000000..4bc78677349a --- /dev/null +++ b/monkestation/code/modules/slimecore/components/mob_stacker.dm @@ -0,0 +1,84 @@ +/datum/component/mob_stacker + var/list/stacked_mobs = list() + ///until we get a better pixel proc this is a constant offset + var/constant_offset = 0 + ///this is our top most atoms + var/mob/living/current_head + ///this is our brain the main dude + var/mob/living/main_dude + + ///are we breaking apart + var/breaking = FALSE + + var/max_size = 1 + + +/datum/component/mob_stacker/Initialize(...) + . = ..() + main_dude = parent + current_head = parent + max_size = rand(1, 7) + main_dude.max_buckled_mobs = max_size + addtimer(CALLBACK(src, PROC_REF(destroy_self)), rand(30 SECONDS, 120 SECONDS)) + +/datum/component/mob_stacker/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_CHECK_CAN_ADD_NEW_STACK, PROC_REF(can_add)) + RegisterSignal(parent, COMSIG_ATOM_JOIN_STACK, PROC_REF(try_join_stack)) + RegisterSignal(parent, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_collapse)) + RegisterSignal(parent, COMSIG_MOBSTACKER_DESTROY, PROC_REF(destroy_self)) + +/datum/component/mob_stacker/Destroy(force, silent) + . = ..() + UnregisterSignal(main_dude, COMSIG_ATOM_JOIN_STACK) + UnregisterSignal(main_dude, COMSIG_LIVING_SET_BUCKLED) + UnregisterSignal(main_dude, COMSIG_CHECK_CAN_ADD_NEW_STACK) + if(main_dude.buckled) + main_dude.buckled.unbuckle_mob(main_dude, force=TRUE) + main_dude = null + current_head = null + for(var/mob/living/dude as anything in stacked_mobs) + if(isbasicmob(dude)) + var/mob/living/basic/basic = dude + basic.ai_controller?.set_ai_status(AI_STATUS_ON) + REMOVE_TRAIT(dude, TRAIT_IN_STACK, "mob_stack") + UnregisterSignal(dude, COMSIG_ATOM_JOIN_STACK) + UnregisterSignal(dude, COMSIG_LIVING_SET_BUCKLED) + if(dude.buckled) + dude.buckled.unbuckle_mob(dude, force=TRUE) + stacked_mobs -= dude + + +/datum/component/mob_stacker/proc/try_join_stack(datum/source, mob/living/joiner) + SIGNAL_HANDLER + if(joiner in stacked_mobs) + return + + if(main_dude.buckle_mob(joiner, force = TRUE)) + ADD_TRAIT(joiner, TRAIT_IN_STACK, "mob_stack") + if(isbasicmob(joiner)) + var/mob/living/basic/basic = joiner + basic.ai_controller?.set_ai_status(AI_STATUS_OFF) + current_head = joiner + stacked_mobs += joiner + RegisterSignal(joiner, COMSIG_ATOM_JOIN_STACK, PROC_REF(try_join_stack)) + RegisterSignal(joiner, COMSIG_LIVING_SET_BUCKLED, PROC_REF(check_collapse)) + joiner.pixel_y += constant_offset + constant_offset += joiner.get_mob_buckling_height(current_head) + +/datum/component/mob_stacker/proc/check_collapse(mob/living/source, atom/movable/new_buckled) + if(new_buckled != main_dude && !breaking) + breaking = TRUE + qdel(src) + +/datum/component/mob_stacker/proc/can_add(datum/source) + SIGNAL_HANDLER + //this isn't a 1 line return because I like to debug + var/value = length(stacked_mobs) + if(value < max_size) + return TRUE + else + return FALSE + +/datum/component/mob_stacker/proc/destroy_self() + qdel(src) diff --git a/monkestation/code/modules/slimecore/components/pollution_scrubber.dm b/monkestation/code/modules/slimecore/components/pollution_scrubber.dm new file mode 100644 index 000000000000..108dfb2bd7a9 --- /dev/null +++ b/monkestation/code/modules/slimecore/components/pollution_scrubber.dm @@ -0,0 +1,28 @@ +/datum/component/pollution_scrubber + ///the amount we try to scrub each process + var/scrubbing_amount + ///the lifetime if set it will delete itself after this point + var/lifetime + +/datum/component/pollution_scrubber/Initialize(scrubbing_amount, lifetime) + . = ..() + src.scrubbing_amount = scrubbing_amount + src.lifetime = lifetime + + if(lifetime) + addtimer(CALLBACK(src, PROC_REF(kill_component)), lifetime) + START_PROCESSING(SSobj, src) + + +/datum/component/pollution_scrubber/proc/kill_component() + qdel(src) + +/datum/component/pollution_scrubber/process(seconds_per_tick) + if(isliving(parent)) + var/mob/living/living = parent + if(living.stat == DEAD) + return + + var/turf/open/turf = get_turf(parent) + if(turf.pollution) + turf.pollution.scrub_amount(scrubbing_amount) diff --git a/monkestation/code/modules/slimecore/components/vac_tagged.dm b/monkestation/code/modules/slimecore/components/vac_tagged.dm new file mode 100644 index 000000000000..317e3889cfa8 --- /dev/null +++ b/monkestation/code/modules/slimecore/components/vac_tagged.dm @@ -0,0 +1,16 @@ +/datum/component/vac_tagged + var/datum/weakref/creator + +/datum/component/vac_tagged/Initialize(mob/creator_mob) + . = ..() + if(!creator_mob) + return COMPONENT_INCOMPATIBLE + + creator = WEAKREF(creator_mob) + +/datum/component/vac_tagged/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_MOB_FED_ON, PROC_REF(on_fed_on)) + +/datum/component/vac_tagged/proc/on_fed_on(mob/living/source, mob/living/feeder, hunger_restored) + SEND_SIGNAL(feeder, COMSIG_FRIENDSHIP_CHANGE, creator.resolve(), (hunger_restored * 0.1)) diff --git a/monkestation/code/modules/slimecore/corral/corral_data.dm b/monkestation/code/modules/slimecore/corral/corral_data.dm new file mode 100644 index 000000000000..9d85e492f8bf --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/corral_data.dm @@ -0,0 +1,78 @@ +//this is just a doc comment but currently the max interior size is 9x9 so 11x11 if you include the corral walls +/datum/corral_data + ///list of all managed slimes + var/list/managed_slimes = list() + ///the installed corral upgrades + var/list/corral_upgrades = list() + + ///the turfs inside the corral + var/list/corral_turfs = list() + ///our corral corners + var/list/corral_corners = list() + ///the corral connecter effects + var/list/corral_connectors = list() + +/datum/corral_data/proc/setup_pen() + for(var/turf/turf as anything in corral_turfs) + RegisterSignal(turf, COMSIG_ATOM_ENTERED, PROC_REF(check_entered)) + RegisterSignal(turf, COMSIG_ATOM_EXITED, PROC_REF(check_exited)) + + for(var/mob/living/basic/slime/slime as anything in turf.contents) + if(!istype(slime)) + continue + managed_slimes |= slime + +/datum/corral_data/Destroy(force, ...) + QDEL_LIST(corral_connectors) + corral_turfs = null + + for(var/obj/machinery/corral_corner/corner as anything in corral_corners) + corner.connected_data = null + corral_corners -= corner + corral_corners = null + for(var/mob/living/basic/slime/slime as anything in managed_slimes) + UnregisterSignal(slime, COMSIG_ATOM_SUCKED) + UnregisterSignal(slime, COMSIG_LIVING_DEATH) + managed_slimes = null + + . = ..() + +/datum/corral_data/proc/check_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + if(!istype(arrived, /mob/living/basic/slime)) + return + + if(isliving(arrived)) + var/mob/living/living = arrived + if(living.stat == DEAD) + return + + if(arrived in managed_slimes) + return + + RegisterSignal(arrived, COMSIG_ATOM_SUCKED, PROC_REF(remove_cause_sucked)) + RegisterSignal(arrived, COMSIG_LIVING_DEATH, PROC_REF(remove_cause_sucked)) + managed_slimes |= arrived + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_entered(arrived, src) + +/datum/corral_data/proc/check_exited(turf/source, atom/movable/gone, direction) + if(!istype(gone, /mob/living/basic/slime)) + return + + var/turf/turf = get_step(source, direction) + if(turf in corral_turfs) + return + + UnregisterSignal(gone, COMSIG_ATOM_SUCKED) + UnregisterSignal(gone, COMSIG_LIVING_DEATH) + managed_slimes -= gone + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_exited(gone) + +/datum/corral_data/proc/remove_cause_sucked(atom/movable/gone) + + UnregisterSignal(gone, COMSIG_ATOM_SUCKED) + UnregisterSignal(gone, COMSIG_LIVING_DEATH) + managed_slimes -= gone + for(var/datum/corral_upgrade/upgrade as anything in corral_upgrades) + upgrade.on_slime_exited(gone) diff --git a/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm b/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm new file mode 100644 index 000000000000..7c095c3cc339 --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/machines/corral_corner.dm @@ -0,0 +1,189 @@ +/obj/item/corral_linker + name = "corral linker" + desc = "A useful tool to help link corrals" + + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "corral_linker" + + var/obj/machinery/corral_corner/host + var/list/corral_corners = list() + +/obj/item/corral_linker/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(target == host) + if(host.submit_corners(corral_corners)) + qdel(src) + return AFTERATTACK_PROCESSED_ITEM + + if(length(corral_corners) == 4) + say("Buffer full!") + return + + if(istype(target, /obj/machinery/corral_corner)) + if(target in corral_corners) + corral_corners -= target + say("Removed corner from buffer!") + return + corral_corners += target + say("Added corner to buffer!") + return + +/obj/machinery/corral_corner + name = "corral fencepost" + desc = "One of the corners of a corral" + + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "corral_corner" + circuit = /obj/item/circuitboard/machine/corral_corner + + density = TRUE + var/max_range = 9 + var/datum/corral_data/connected_data + var/mapping_id + +/obj/machinery/corral_corner/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/corral_corner/LateInitialize() + . = ..() + locate_machinery() + +/obj/machinery/corral_corner/locate_machinery(multitool_connection) + if(!mapping_id || connected_data) + return + var/list/found_corners = list() + for(var/obj/machinery/corral_corner/main in GLOB.machines) + if(main.mapping_id != mapping_id) + continue + found_corners += main + submit_corners(found_corners) + + if(connected_data) + for(var/obj/machinery/slime_pen_controller/controller in GLOB.machines) + if(controller.mapping_id == mapping_id) + controller.linked_data = connected_data + +/obj/machinery/corral_corner/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(connected_data) + return + start_linking_procedure() + +/obj/machinery/corral_corner/multitool_act(mob/living/user, obj/item/tool) + if(!multitool_check_buffer(user, tool)) + return + var/obj/item/multitool/multitool = tool + multitool.buffer = src + to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/corral_corner/proc/start_linking_procedure() + var/obj/item/corral_linker/new_linker = new(loc) + new_linker.host = src + new_linker.corral_corners += src + +/obj/machinery/corral_corner/proc/submit_corners(list/given_corners) + if(length(given_corners) != 4) + return + var/list/steps_and_direction = list() + + var/list/corners = given_corners + + var/list/corners_left = list() + corners_left += corners + + var/turf/current_turf = loc + var/turf/last_found_corner_turf = loc + var/found = FALSE + for(var/num in 1 to 4) + found = FALSE + for(var/direction in GLOB.cardinals) + if(found) + break + current_turf = last_found_corner_turf + var/steps = 0 + for(var/step in 1 to max_range) + current_turf = get_step(current_turf, direction) + + if(current_turf.density) + break + steps++ + + for(var/obj/machinery/corral_corner/found_corner as anything in current_turf.contents) + if(!istype(found_corner)) + continue + + if(!found_corner) + continue + + if((found_corner == src) && length(steps_and_direction) < 3) + continue + + if(!(found_corner in corners_left)) + continue + + steps-- + + corners_left -= found_corner + last_found_corner_turf = current_turf + found = TRUE + steps_and_direction += list("[direction]" = steps) + break + + build_data(steps_and_direction, corners) + return TRUE + +/obj/machinery/corral_corner/proc/build_data(list/steps, list/corners) + var/turf/current_turf = loc + var/list/effects = list() + for(var/step_dir in steps) + for(var/lengths in 1 to steps[step_dir]) + current_turf = get_step(current_turf, text2num(step_dir)) + + var/obj/effect/corral_fence/new_fence = new(current_turf) + new_fence.dir = text2num(step_dir) + effects += new_fence + current_turf = get_step(current_turf, text2num(step_dir)) + + var/datum/corral_data/new_data = new + + new_data.corral_connectors += effects + new_data.corral_corners += corners + + var/turf/last_turf + for(var/obj/machinery/corral_corner/adder as anything in corners) + if((adder.x < x && adder.y < y) || (adder.x > x && adder.y > y) || (adder.x > x && adder.y < y) || (adder.x < x && adder.y > y)) + last_turf = get_turf(adder) + if(adder.connected_data) + continue + adder.connected_data = new_data + + var/list/block_turfs = block(get_turf(src), last_turf) + new_data.corral_turfs += block_turfs + new_data.setup_pen() + +/obj/effect/corral_fence + name = "corral fence" + desc = "A holographic fence designed to prevent slimes from leaving." + anchored = TRUE + can_be_unanchored = FALSE + + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "corral_fence" + can_atmos_pass = ATMOS_PASS_NO + can_astar_pass = CANASTARPASS_ALWAYS_PROC + +/obj/effect/corral_fence/CanPass(atom/movable/mover, border_dir) + . = ..() + if(mover.pulledby) + return TRUE + if((istype(mover, /mob/living/basic/slime) || ismonkey(mover) || istype(mover, /mob/living/basic/xenofauna)) && !HAS_TRAIT(mover, VACPACK_THROW)) + return FALSE + return TRUE + + +/obj/effect/corral_fence/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(pass_info.xenofauna_or_slime) + return FALSE + return TRUE //anything expect slimes can astar pass diff --git a/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm new file mode 100644 index 000000000000..41181294be14 --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/upgrades/_base_upgrade.dm @@ -0,0 +1,14 @@ +/datum/corral_upgrade + var/name = "Generic Corral Upgrade" + var/desc = "Generic Corral Upgrade Description" + ///the amount of xenobiology points this pen upgrade costs + var/cost = 0 + +/datum/corral_upgrade/proc/on_add(datum/corral_data/parent) + return + +/datum/corral_upgrade/proc/on_slime_entered(mob/living/basic/slime/slime) + return + +/datum/corral_upgrade/proc/on_slime_exited(mob/living/basic/slime/slime) + return diff --git a/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm new file mode 100644 index 000000000000..6fa2e8f1c1c2 --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/upgrades/human_docility_upgrade.dm @@ -0,0 +1,16 @@ +/datum/corral_upgrade/human_docility_upgrade + name = "Human Docility Upgrade" + desc = "Makes the non rabid slimes docile to people with souls." + cost = 2500 + +/datum/corral_upgrade/human_docility_upgrade/on_add(datum/corral_data/parent) + for(var/mob/living/basic/slime/slime as anything in parent.managed_slimes) + slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE) + +/datum/corral_upgrade/human_docility_upgrade/on_slime_entered(mob/living/basic/slime/slime) + slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE) + +/datum/corral_upgrade/human_docility_upgrade/on_slime_exited(mob/living/basic/slime/slime) + if(slime.has_slime_trait(/datum/slime_trait/docility)) + return + slime.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, FALSE) diff --git a/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm b/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm new file mode 100644 index 000000000000..830ce0fc93a2 --- /dev/null +++ b/monkestation/code/modules/slimecore/corral/upgrades/obliteration_upgrade.dm @@ -0,0 +1,14 @@ +/datum/corral_upgrade/obliteration_upgrade + name = "Slime Obilteration Upgrade" + desc = "Just obliterates slimes that enter the cage." + cost = 5000 + + +/datum/corral_upgrade/obliteration_upgrade/on_add(datum/corral_data/parent) + for(var/mob/living/basic/slime/slime as anything in parent.managed_slimes) + parent.managed_slimes -= slime + qdel(slime) + +/datum/corral_upgrade/obliteration_upgrade/on_slime_entered(mob/living/basic/slime/slime, datum/corral_data/parent) + parent.managed_slimes -= slime + qdel(slime) diff --git a/monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi b/monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0a611a1418ae1a7ccfd1bcda7c024c0255b3a4ce GIT binary patch literal 653 zcmV;80&@L{P)P)t-s0000) zHY_9{9%wUcW=k@>Y`%j+vU^Q=5u_R_4oX5r?tiL`aKsMurfJlBPk*u zBaA96MnOm{DJ@n|Sa2XAvMn$WtW0$P0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5sVp(Mv@|!qATc>xiHkEOv#1!Pm5Vd2C^0t`#5TmLHomwrFC{Y>D1l3t zvVyCh3)o2jO%5&am8#y|0004KNklGxO&e{Zc@POdZ*mK$e$>Pdq@!Lc zs51r{h{E9gM_x+NQ}`8i*DN^8<8P7+ru~)cehFeFdA_D z>X$Ii#YHTLqX7^ck>HRCU^L)_^IyOnc!>Zh|Omhz55AsU5&*a7SfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3KBSEHSyXG&jB=F*#d_i!&v&s2HS`i!-e#F*g;&HpHqnzPK_kB{LZ) zflHUNf~%hk*hv6Q4lVGNs@~lI00B}-L_t(&f$f*ej)O1^MFRy~2u~9p|No`q&bE%R zOII^KQZ^C2M}buG4Z(37$8j7Rh5pgf9`XpG(hI8E98!d)ZnXITPu3uXlu$h@&w4q5NRm|+s+v}==0Mx?s(AB3RXPcw+9f$_if!0Exmv}fh;&pg7bZQ zlmzttli?d|{0XAaaPWmLpZ*7#YuZS|JzZ06zT-HK<2a6`1bl$41bo0%3CPq6Jr^Zl zzJ0ul5|D7cD-cUS!d*FCXOT<5f!gt15(p(A-51Cu;Jh!8O8~iV3*-_o|Idc-12Z}j UQX=Tm4gdfE07*qoM6N<$g3yu?RsaA1 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/slimecore/icons/equipment.dmi b/monkestation/code/modules/slimecore/icons/equipment.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a28f8c167fc59987ce9ac8e51f9e5a0f001c57b7 GIT binary patch literal 5347 zcmZ8FbyO2j_ZuOtlz_l!>F(a>M$ys2knWa7aDX&OOM|4;2+7fcv?z^$v`RB_jQaNd z&iVfNopWED^X|RxzT4-;KG)YEBc>+?003lKnyN3bYdCgT5kA1qvq3>x*kvpTYT~PE z=VRmTS|N z5u=HxSm#%#g3s?dKR9N}2zDM-6~zBFGn$reY1{U;19up}k+XB@4Sm5SoMp`1i~`_W zlA#ujgBBk6uM8fV22(*7&dp!sZ<<@ZBiKXqKrN;BG8DFU#7-$qLJ$3WhQvrwERrf! z+$l|bCt~Y*QfASiuxoPU5*c>gdb!x+!=aJH$eQp&O%(=%(1pg=1C$wG10$u`t}!?` z@1BU+Yj)pZT#6A0b`z7UW!{S5;LB%6nmC3RAlC412nv&?U%GYctlg{W6~)h5;I;WJ zB_m^yi}{Guaq%?}{chu&E6S;alS+=0COnfwfEoej!F!30KO!J;m-)oIrhbH!Dhe??=bR460{`DK~J<++8LD%hPXW8UAme5-Mn&KBRkvlHFT2_Swxe`Y?^RE?QGC>oYiNSl z;Qse#Nw(WQ)p$Q|o{i=2wh|7w@5btpaQv9W14y1Q2Rc3kOdBtAUN6w(a$hhl4`FZH zXY*S2zdZ=j)jh>m!>`6q83$FkIvu$N#T#BtE}g!bl|24l-a7mQOc6e_g~y9vSO{*+ z(I`(?AGZtQfLmN4qh9UcGD_SOu29CX(a9gtt`vZS?w?-YeJUdXE~NCl46vTY(dwZJ zXHRmI={tKoy}u>bpQ35}0xA24MD^sdpc9hd&0Bc*yWfVy$n!q!bO9C|WuRv!n7!oW z+BtIj?E5Afrr7%Tb1iSNkETaOy+GBHXB|ZER?O6 zTljI3-2zuD-}2!d+60g>y^rU|{OY5ho@Xz~Al!-%mrBBGMpKKTyWX0!aU*qgiqm?L0136^nfHcDsm= z<1v@)>@)(O#SeH`6Rue*r;L=Hd%2ZRIE-E{pC;RX8G$w@0Pk{b>#xaaEDb3_sJ}*@895q9VQQZyjGqcLDhMzx(y~i z)D|w9BiX+MkqMXG6ZbaU(}u~#^;+~CC3>tOxCib)MW6MG%4=~0T?i!HKp&UnKB%er zj+#U3&FB>56XOkMEtBz7Px$!wM#jf&?{2Q-um8AB-P@p)#p%g*c6KUfoiFz97@V7P zUORlrAC1F>j_l}aw$s+9D6(!_()%V}$ltyI)NRR?A1Sm=wj33&Ud~A!KPb>`UHqk# zU|58*C(ttjs^o_Ak5+tI`4n)gwSEbHn`WHUJ@94uvu?g@MrtZ0wU##}6_t~#YiV2C z$0}{IuVT}mt7e{CT0ZRUNa;Cfbk&#w{p7;=K{`jY^F}*aK-u?hxoqhYd3*+%UNOai z9S^6A{5LK*zh6DY2F``Ag*gHHhMT!YOdumj)59zbn@Re|3;zO-gI(FkU%LupVeyjW z2qVG33-gy`309{cJH3Z1MFU0=3p%uWX;w zd?Gm7K~LB#DEE`QOYSu|POA9*mE}bQAEBMj=}8AUDNnXIwnp+*Kk$Y2@*Ekch=fl& zLUd0bE73wM4&HD+D`3$q^LF0dHMu^#w=eu&V}B9jm4C7;A^9dLmU**5UgVhvgu0LY z<+mbahTq}7)BssL+fK2JCI_W8JBz4D=F!9bHDuGOsE?7LRTJaymbc-Jl`q;zeX?Di zjb$iW71nzVQt=<}6$FK{Remlmh^OTx$0Jf_g%5&5>;KKXyL=t#(>>;v6|nvMZM_fy zplqt^+>5{fPeePqp|crx;xm=1PEFoCbc+9_Fu&}B@UPKH-dHKV>~?bX)Ym`P)YmU3 zmVmvwgSWH)^)BxoZ_PcStb-GG0CYKVVF$OVJnb)k&~Y#-2Cu91EqDH~_}%O>|KQpi zu+SZfe0DV$2tfI-5ZG0wPLF6I3mK=R%|e$YYv^}Fl7!xDZEqJtc^8`;9%1?8{L?iO zCMWvAnn7$MDh6zOZb}4+9JEHZ4>O{`< z^$x#>1wQTIsG%Cc;D_qLZkh*)vKbO_dZY*s?~XBO);~eSy#7bUi6QS}fLSd~m*uL<7OrY}MOptMN&dsqiZb}1^}U-oeO}A&ji#Q1 z`qgplyV3xz<_+Ht$S^9p9{rr~R=n`>oPSGVt`hW?K@Bl^D5_9SW>>Kw?J~-I{h_~w zVN470hYwP6cFkz+&-&Qraj`p5O1J6cd2vHh9cFi~`<(L8>V6ow-V}YlPn&o5K`1$d z{bs)}_BQ8VU44sHv90l)JF67yBg347zW6yaGKs$A0y5fX9YH( z;@wcnBa27lj9`0K$Vlww4fo#y{nD&F>F-zr$vtk{IY^FT2Ir}~s)}@grFri+H7Wbl z_O@P6rt}0g*sjB$(Cy(MtIAqY1LgRs*b0O1W%yyPXeZ?>r)>Dsr%(T#W86>WQWZUZ z%O?+YQmFK50I#ZPm-s?MS18u!n}&2W-!Iy5;&oIhMv1Mz41#7l0#8m(emFN%)6fvt zZOKsP=H-pwT%BTlDmiqE<*q==gK2PZ5bJ1xPah!gJnxplw;dwJr_AaOt_$@_FHB6h zr6~#W^^gItILs=hi(h=+U%LDqJXv7OuOdIxAaBeX;0Ang)G^i#3%>0z{>%94ezjkv z2V-Y~X9=k_lAFMnCjQjcwxHjw+4he=?oouQH7H8VeOVgH``FaflqrflaAATFuy(vi zBCl|&cR0Gaj5n>g2os@ZUi2ZfLgH( z^lO*XwET7b1;ntWr~ZwMwG_LI_ZA^Dlj5us7HJV6*@IfrAA$v3Nv)*re8)*(kTT;I z>Y<~7GqmM|8l&aFESYjxWzIM^udw|)58_zA#Eq2fPf=n``d?>;+0KC&^IJ5IkH}!w zN)BFgi9(Le0Y^fC-(u4p6obHyrJ7|grruX+>S~sr?eAC_Ql%bOlLUl~i1m|3!3UpY z^M4<wp$V6qYe5^t>)5nq2(o=Zp^{2<%3fp&nsS~+ zv7@sw(RE^#VUWreU$f(1h3m7rMVj^*bwr<`aj(iDf@x_Vtw_XO#l@{fbA_`LP55cv z^KIsDY`UDkXNtGlNwtI9tgKcGT}#lDYfyI=Trblub)9(0igPCO6$Hgu`6{iL0fx}% z)etK&kLC{g3VF_^STl>nuCRx`AvZ}C1(f!{XvUiR6;pQ84%=+un-PhXg0M?24}d2( zTaMNy7cSaPjf2N)+#Xoh6(uu zu{u0ddBEkLd!%l0snc=OmxHty<`|5};IHmpE)u0{myIXHuxQ}?Y~?o6I1eYSCoaMz#o@+TyF9e$Hba*vf2S{b2i<-?Ww>*3C;Ng@?Ntb4hZ*P_C+>va z1YItvpD44Q?oQ)=RqlGMw*S95oEQ|!Gg$H=WQA2&Oc~zs^(y)CDVm-a{YzOjqwd^y>g#W39xXV{|bplqruGbj}|aL z_do|6V{ZDUjO0&v)>E~T?VgK!XA7)g%|>a;CO&sssq(8PNs{LFYSMiYwxw6>{vGAd zR*7hE8>AnZW|$`tL7~1#F6KG=Uo+F(j9v~G)v?6&&brK*!`cpa6*M;saiUgQoj7Q z=ba;N6vp2AhHgDb!fRW5Yu*hsLljY&n8>A;qN}4y3PY0r*{dlOHPrI+lPo)7z3FNw z2-1ldnp>q^Xt7Q#y|N|)(Nj&(x*UIDu5q%Wu$HnFm_{MoO6oIr@}@$gV9#)y8$^Cg z!TF~yoNKBD1TLagyOmvUvG(pTTbf88ro_b2vi7#R*lS%bds2?<<&>*X*fJ9?+bE=sI88#P{I6FOMm&{C9Fo6oxh9J5VMqJOT zlQYJ)N~@;~%7g9?3%Yw-9=mYNiRR~rJafV&dW-))rW*cUl?-Q19hpJgL={w`$_||3n@H zf6ERSva_!fFy#=DlUs7S%4WxwR)HvKKAxA$|S4kj}p=}f~SSU|Rxkq6AS)ZmFVCz2MAOMK*AnDI)Iba$28zgdhJG`}Pt1a{fe zxwRx&Lyo$@TT!UR?5}W4WGxcRvOvC9XdxVp%W#=eti79o0Ucc{={-3wJOmcqT+Qzf zg>*ec;QyFMq1cvFgvu{DiJD0Mcw)L>qF3Nx4Ls|vN6xM=>e_qXN4h!Vk;u}7U>A^X zj_%c&hQb}VK$s;DLb0-vhmbn*xWy9IZ*lP^LG!JrKbejTew^kz2UqggKtI6~E@VH7 zKhb{X^QR+<$cK6DF4&vSfB#4^ONJ#R{4R14->2GNdkW%VE0?EU#rS2u2`|lMF&=tRmF7E-`)68Z21M}%w z1^(JS(4fq?)QEI&_talef;_4K!=)b%rvU2}ES-&CAER#XWtMvy^SBH79*q{$<-C7! zd1hRW+30-NPWmJ*sWcFBq>pK7M8DJfH7pzTfX})B__umJ56rKp+r{{#{)Y5D5JF{2v1y@IM<$ zW#+&K4)NH`NB5;S+{?+s$I0Cd1PaLLPLN{?lVyLiyzo?@`cuDSqqO-u6M;RMq~EGH zQ(o!ow4kQHgmE!{^t-AoC_oG%S~0Y3BqhglsUkm@RR_4W!$u1UAl z|7EyUYjFUr{fBDDzH-Pn-Us^6VQK+RWo?eWu6@BW!XJN}^rWXC@19C8IJFVszM3L- zFE2PH3`mAuulNvtUEvf25(eq(YCjIh*uWaZxs3XKg3f(NP2dO|t;q{s6TnwtKE%1k zgTunZW7rjssC|mH6j!RKQ4L<4QFKTtW%dvE>BF=uw3hDjFou9x`0k=(-p5&*1}$IS z35h!5OLtf*o65NEZ*HBKW^zSLL2Nk1yGw4`|M^my^G>!9+0nvu|LDl9va-_D^k%Bz z+U)F?ig8!h%JJ&@`l9vq_3G;Cyw1+f>e||0CnqP>RaHN0YHH5E+uhwgKLWmcR)qIO zBB6g;?aO}V<*oWWOYF!w8%LeEC+6i*_AqAy2iw~vz)dHorYdln8XAN1^YBD}Z|_Iz z`_-G9n`_6%)o$+Y>jwuF=SMp`rNEIh)(TG|krb+Gm(QQ7o^nW;TG;hpa92vNuB$7I zj*eE-)GW%+&p*&PYihc6f&|V-U<=dJ)ARBiN_QPhhbTuv6u61$K8CW3nsQT0M+67| z0^VoLt@3^Z@Q2@1=H_0=+D~CJGlvjZH~Aa&${`_?^OIqTIG%){kdUcXRA8WLd?$st zxtZ0GBXl~69C1-9A9Yznk&7rdf94&>QMNVR^7Fcd;4e={`deCVTUuJ)9OdTbCLjP4 zjQ&a|#KP|94vbAs7Eq3@DeF0TYkHc;eO&ydh4^(}%jeI3PnXcT2$`!+C26J_rcGe6 z*z*U7#(%-OX)m+8tPXz(FJu^}CmM56%rR>hh#)^p~HXUmEO5zA0g2 zW3c`-nc@X3=JooW>*K(xE42XzaSh>>A!`i-UI)0OgujDBE<{LZ{Mp3ls1sS6zP*Jt zgp5ZafvXJa_Y5p#Ijh>6>Q*99daU!*-m92pxKjGi=BAsVpx{mNX&LGO2Ry1btlg&8 zOb7xwcS;Vl_R7-I_jBI_jtYy4__d!ue?B-lX=xFx)SEQligp5Q=*saz*y;-K3pEKH zMo+mYdxU(Q!%aP}cd)G%b5Y_)E6#W9tEU>i^7pS)rK)YC6X9NZTYsJmf?@6z$lzcN9!(>TbyjmHe!vMK z5J(!KU-P)$OlmBEv|0|s;KqHSXR4X|c7W%xeHEk@rGc|o;7>1t_q0Z%Go}eqRzT>f z?oor@g0`CF=H%RK@m^r>ZopOUR0mAy2FF9DM3KbX&!FaK>J62nF3%o!s06z2%%bA4 z+QpLG$X+09Zg53AApX?UIPb1;qx6)!D!JdeO8Tz7EjcMG8+Fn00bx-(!4f~LeA>(= zg+O*FR6XG2=?-gkr7EfP<2fC&i)rCrEPa6Aj{OnQlF_1mB7-pe>e*R7Z%^cxl@)nb zXN?Usc;PXay5K%~iUKSF*qFcl8D%s5grRuGy*y3-!0ytOYX)A?o(^de}6onJT6 ziHqyaiA|t{NJyog>nM;iZg`DjUP^Lk!;ET1>oTd}8msrIzeCx2k2@nYIRxOG+uQ0U@U{ln5c<+x1Nl^ur-(588xX>3!NA7#hQdH}=6(zt8)8v+*3Kl98UP2YCJ&BjRrCwd8 z90x1@0%X{+>1iP}w(Xw1E#SEahllj|#kANAuc-;W{*)2wX@_531!8JNs{O_E^z?+W z_6fk}&aVQ@9FXXp^yh_*9t_#sBSICjNhIR?`X1IO(fIiLKLr;4rO2-!J(PsyJcQ0+k$`8Qp`H zC82ULwH~fgjF+xNQ+-=hIM_!(?_$5O;jxiNh*h4}G~q6qQU2BULZgL6+As-CZkqc_ zx+O{@KrG}By%L^|X8I~d^}9|)yd4b#^}C_JL$wyPtEJrdXNHDM%VacU^)zFH1;|G) zjX%~`3A+@f(%$QI?4)tLxOSV5Hx!Ye#*&!OJ~cHpqZa$e#HyzV9GY}jO<>S+S{0fk^01}oAuSL?-s@p--1XF8U7C5hmWyDLXW ze>#-SFY8Ojj=c2;3L!xN0%2``UzIDAGZ_go)XL$s%ooEZzb~m_Rmg<7x_LAcd}I>X zoN*lN^D_#5@`6}%qTikPTgdKo*(3e2k2qF_m0g^s`x{>q!&tQ~4G~Z~{ae4ZnQuwS zj15dPgz-uibd<-@%nC)6K=}d*0Knbg4h=_2g=kOw_mV;h~Oh0!2>zD%ZXT(R`a~^Agm|S{)g^{obR(hHEN{q4UCo~m_NI9n3#zJce$ei9EW`A>7RM)mXq8|-v-+XfU#}n1 zzDc;YQ!Vx~%ta5nf?d0c$GIsM{g*4E@b%C*5iATOKlMn(%zm9Suc}{RVPRZRW7NcN zj}l%&$NS3l+!~-j`lE@FjBUdLQQKPotl(O@ocJRrUfSM^GmT0MWlISLLN2J-(^AMs zr`s9aAr4uii|zY_;K1d}6x>+a%gv3A-^YdPw?B2b-KmQROE;=`OK{oV4_Fs8XeRSvT1#cl@XxiIwo*Pk*I?hZY& zT;AL)998z})ojq^<0}4|AnILRu2<{#LSS_ct56iHWkxN5Zfa_3JW7}!+%yw+6fK4p zcdN?v7|E!$U$SGgz&bq48b&_TmEWY=@>lKsI~GEeQ? zxi8UZ4f+E;Yh+K&43DN47{>h9;*y+-gy!y7B{VP-X#bPRmgUr)+D*8s6*R_Ew+wFb zya1v)&=5|n=Lmc`*1^=4RWe{K4co2Z7C!dBNe0}rVXV}R` znKt37e*3uFzNREB@w z92FK8W(`^Ay_$J5x;py?887CL@PY1kaANI=)?g}A-}_^|SR~M=-xfk=`!jzFZe2fK zCXoWgKt5f@3(u{smH&D+(;t0!eO@%Is=c>z(60UypqR}}iXMzr2p&v6_8m}09JF%d zZ45;V_Yn{e2JeZ{-WH%v*K|F<)OJQ-s1BUi4BNN5xp(FoWID7oJkpe5_e_z$r#{oT ze`7^;AkQdFb*-hOlGu}3ele$hUg zfep-e$&l`ngUDaQ(AvOVd(ht%kc~|i)X(SMotc@L&yx|hUO+#PX>}nbkq!jj%x${5 z7FxLcI-URi=G4Z_6&k9&o5se*^cD20X~B7U>m;gcdU|@)4Zb;x-Sk+#hSk;8&vdH{ zgKEYyYRY0-2<)$0--`^t1MWfHhOegg7-+&NidTDn0yli;)tkKHdNh2o9k**YsUCf6 zT1wKDE)~MrecZZw)AQ(rm$5H`nYEUY4wwV7jIQzOYGF`kfu=(?&NsOK@z*k+1!(zj z%~!N#qGP^pgp!FAay|cS%7QRNPl#71?ezJU!qMD+wwKUv7A03n$L602u75oK#occB z+92%jKP`A$`+nrXNj>ExY|;&qtjrg%E}8g`DCHC6xRQPw6%a7ulSGr!m-W(4C~xY9 znmcE=W84o_(V_mNV=4r{t*gh)|uF4c73KY0x~I*M#VzUEX#$wpA=+ z7$5klfshnKVk&bu5$iqK0^dK*?zS&e)6fuLXIf}_USkw*rNRs1L=#s#w@=(99&yE{rsN>Y=@NpPw57h-5EIWG@LqMr^bc5jQ%m8Wr_8QD*~AIIG{7c$ybD@&{q zB)MEfFZZSw$GdlxpKeu9BMG; zQn>1WFFu2L#Jn3>dc7|-P%fg8oG-5RE)0m#bDv}&{vHX?o)2b?jg4gjTR_-x&lDtz z3mq@MaU0cry#oCF2>gp>5Y~q>O+kr_^Ewhz zF3gkW3@cQZdvYAAy!mFI9<@auc3X3J13WIG3WK@Hn+wEeIa7^=%852bj;r}VK>1l@==?n8x81auR%tE zdl<~mv=KfNV>$$C#v1(2TQfdeFs7SXj{GabaAldTE%|QSx=7nUzS08Zb_;jdePfA# zSx_ySsh3d&3d7=<<|jBxy0Sapw$6i}&YWLP=I+D%x}ti_v(HAyY3>|zc;VXHZe;2# z%>H_j+{%_X@W_^w{H0P-|{LSJ#bXzd!vlUO(BB#uy z(c$_>2p)qXbLDu{cT+i=+@O^(f4!=z28xMLiZ_?oRh6a2eQtNsUeMlVNk&G7Mq(mb z!9E=rO7?-oKv%H}5+1OCvs^MI3dAQ7zj~UoFf?8jZp})#T+x0gz_?&`w#7y%9({rs zfX;co>iFsFzNNqOgYR{{>lx(~Lm3d@<@~rTTC}>fg1=gv#p0@zt{rZ<9}7aVCF&2z z_bIPWdc#wV3}y{`?90I5KgfeohcH9B>2Lc}Wy3)UsbU=Ssz_{24gcQkc`F$kcal|b zsLaQ4-8)+B?R>0T`x9QuQlMTji061E!^!Y72FhKoAchBWZLgEl)3{9$u|aA(!0N}3jXbM z#niE7;{}F}{Uav#=q=&D1HRLNk9GR0xRJGktzX&4L09jCLJ^z|8&m~?7{jKRj+^WQ zz0^B|{S)Nt|B9?QRKWGheki(hTPsWWi;&j3Y1XPHlgC!3kJZb=YHb?F}yzBt^`0x(2y7WA?x>-5&rZ#y@N!0xM~ z)SK+auzBy2#JbdA0auQ12O1d=(%8Cz$!ojdNBnQsR)9X?@9jgn2Jvbunz^@RtsN_k zs_rS&GV&sNk$=T2p$avyI?$u$_h}Tq$pM=0fd#}C7@($UY$E2jwu)I+U*BGXte_2aqsHCzI-w>&z+>pM?y=?DI z)tdI`TI#FD2ZCVF!8gwEg|-_C)9Njs=I^*qP1t1P5Y(k*ki(a41WJ8 zcsbNBj7(0t;@5}%@VMi`4wgrH(QS_AMq+{60d=+QUNNhT2RqxbOOZz;2>x>_^F;=y zy^gDid%x}nn+^#S4!s&;_~iNRuxoDlZMW4e`c3Ksl_%<6Z$*~>^+>%}eC%#SN)>mk ziWzXq{T1y}Io^mgFu$jD=c3k_)`6scWWAiUHT{kP?^b=Sd$-pIh7VGwhrjg`Er$lW zTj(fxYf~f4As&Joih`i^38d`k#Kgq!NCuM~^6lD6mM*M2Huto{uD`;O`j3=O`*L<1 z4B^*SM5F};%lF%gvg}v|7(qvQEYW(9H)k58kv<*V3<9!Z)-yWA`qmI582FH1fy2xy z4&?QrK!~BI#cI8MhUsdJ^zvAf!NTqbmJMLaxi27L`)ZjIsyu$lOdlXq5 z!po1pNea+7uq#;4<8$HOKYao!Fv@d@~M8%%s+~ zwmjG^pFqErF<%&t&YmeDDYGM_f8kbr)Y@sxFm&b^c`d#rpf@oWVy-p4*}(g(h!`X2 zk-NB?DL`xgkJ)@rOdn11eC&EL!!WCY8$LcEZM#F{pqH#YX zM0e*RBpI^xY}TrHnsRnX-=!Z8)Koy6-PBSH@(q;D5$W> zAHg&!KBs^?3OWd#PN=Co+#Fn6^dfbEo1#i;Y1GtJe_3td|>@4?y55HVvkK)M;w8mvXR(fHzU6z4&3)iR%L)~ik zq2*pr@LECxjy!>5xsWq#A@jm!2LSyo_CgbO$hDMfOlfYKM~!S*|KXfIxq2OlZk348 z8639ZyF!ZJkA=UNN=#%rwqkGp-o9Fu!-oA4-RkhXsH>f2?i(uLXE3+Lwr^EJe_LPu zC9(u4ps>Uj<2J)Dm73qymiwp{Ebc>8>^8g5KC`Ua`hA7Toc@rv3M3=EfGE!7Ivn4% zi_f*Dvtwvh7s}7GO^#!0QZkR@?HlDn8PXYfr)zN%iNJmgS_bW2o!dd-q^?!;1sajqcvY ziL;Ft^>MtsI|pcq_jGk{_i~> z-SOn)q#xxi@v>IP@QxQGn)DtMZ-O{Dg(2+jPt5<}szqJwqhy<*azyIrg znZ1vrRO%06kC=0GQ8DAnia}59O`-W=qu(>9yzQpMsEZzXfG54J+015HYzyfJ5DAja z_YJ5@6Rq}rG;@X0;bala;crr9-F^XhOD%#4bd*CCbR~6%ioL58oHLhj zJuk}FFy|9Ca6RBHlqj)yLS{o9HHG3^zodtk2;2{a2{4X2nh6Kkt2V;xDP6cz!vQEH zx&zNN_A?eBJC^!XbT)3pyGRTWQIr$v28FGY$M#k+sVzMk8nC(`I%e|kknVS&I$+anGzwbZ&}Tff?Gj7 zFE($(QJXk&mBWFPjqin5O6k!2=<}=7e2=O7_f%43#&DEVoaT7y!nQ(1?d;I}mfC(= z=!lz}8y$IzkNgvJ{L>*euFdiFGwI}l&93E`|8g=TLGc~WKGV%^qsZ&lLb}CH3hZ2z zc|Nc^$I1Rc#r2n_>S#lh2d5cVNFs$~FUDAB#5;TBZfZqU%N{ith+FQfbMzK_wR zW9uTkt1ZwU4gnA=(2Opvj*>9S#2C%{;0X4giotWHM4cj5(Fg#V1@E z$!4VV3O#&zy5&IS8tqO?LlundCq1>V(>fuB7CN1w4{NcjDJ=`Vp#g(cv`fYrdC@F6 zz5qZ6WNXDk(|v+FDv15|;;A?=sK8)Bmx9$;My`^<%_7=iBj=9gaO{w=f~uLUI9YKK z8liD+q;>czag6fz9x#chcw?+d_F><*Al61c*uBJ(i!p?0qX6&m-x7yg}mI@>b;$+sw&xgqc3i$n-NW#}0lpp9_pL(NV#o!G|iv6?S-j2?o zu_JOx_=-1A2Zx7&g<1NeYxQ6U2dr#t0Btzj*r*L;f}zF5m*-?HfRI@IFHueb$nLB@ zfOJy}U1Vv+{=hL6I^*YYZ!$tsc{0JBmg+mbpV4f zGBSDv5QE*_-NLR6W~FEltifJB_4i-|x7(09eRIWZZ3Xu{K;r`J@TY$C={Af=#6Vu^ zh-axHkKrUt@J>hBrF?~puxi?Ii5+={qXi%Q)CNsTjuR&2*y$uouzo7luIsR+rA7Ez ztNARAXHXAX2tTX-+Z}Z>juXHcb|gZYIwo9{2*r=L{^15hsb|JzGgvFm>Pg-1upj}Q z?_30|aqd9HPho}289(0wP<)$P_}Sio@wj(uZF+Zt<gCCRsgg$58SZwV`_4EPG7^rUfwo@Q^q2!+&ADpXe?&;N*|WqPRc zw**b|9~XvYYkwV2oeE!-jA5J?UVLft*J7 zkPs^X%DHi25J{rQu=b%yJ#48 z=n^r3ZmZ;>h#)&PrUQSq9DtM&`)j7>*fz(-3I-5+D(QIQHHbHdy7*Z^R)Rd_o7fmY zqu}vG2*2?KdQwQtTkd+SEB+}VCH~p&F+7v{?Vf85a*W;P^8w?W=@4vwkgZ(7;ZfdH z0ct+>ky9b%3$?ily=;GGbirf zKx#<$4GbI|R*V&Zm$9fHqlM#f`a2TL!$kv;s|(1T4#_ai5^O?~H`Py_hFHXNfBDfG zU7h+&+aGypaL@s$s{xP4m)F#c|5cNiQuU|UdBo-&P2Mq5S5rfLy46}N*9-_SzCV|s z-O3I0_@qDGpZ`@*K!EwHM$#dmnt1y3Y1qV7D~T`S^0H=iM8%|m*ut_tVCv_u=k91~ z8i0b&uzUN{N~BkKe5^)J0kS;hL@(04#xd{_jGmF8hg-q z1F9K7S0KD^ul_r?!y&36%H@;?T|`ofYr2wV zuRV875d1RpKjz|F@6J-LlIz2sl;Zhdenfxr@P4~SNr=pvLqFMf(qrMT|X?QSsi{xp8K#qQ2^`W~G6 z-)!sijdw0Mzmvzw_V-PJjLdhk8>@+{^v^IgZHkz9+;E(aSdJu#gwsHP)a}|mXSc(P zk0AIwV@rMAqjX6BTxI{0p5JpzYim4^NIJpeKcFR~sh`S0Vax)==-ZV*1kgpC?jtOL zBvC;3+ROa6(VIRqmv#aNyYdL1z_ym4Hh@9>_F=S@CzpH44NuT6##iWpKs?CMW0$g&;bL|F! zJ#*&f3nnKqfN}*j7%8XxNtut)@En{lPK?8Mn9Y*%f)H#9M3*ZOA+ z(g5JqK`kEcgIlO0#?NZxr9mdp!hHsbA;U(Gj0Au53siK=i}8Cz8tWsh5pR>6% zA-FR8uGE)Nm*K)UO-!pFD#UecLV5w$Cfl5b?06zI5dP5hjI$OjVRo!1(vpH_z1@|q8@`c3>YwVrWsG~QmrrCl^ENRiVxI|8&AY77jLiae$No1 zmlZe|3%a+H&v&ty@t@U^oxBsABDb z?QlkcXGp=YyC<{1K>yBlBK(aM5fG?XnM2_$Ni!WAgcj@3Ij%0G2_ z=+a>V4(L;WBBxB+-T3_IE{KUUxhB0;6e4qMh;1BpOXbcH3f~zg_<3OZ06Ab8T*WM> z@X_|6xR8P@ekG82hFzO%$_LZ}<2rV=J?`lOJg5(GIGwL-=9OQjc_caODl3(RZGv{= zze6Eh>@z+0gNJY0IDPhQJ{Q2{59I+33cdgAt?I%!poyoiIda^Q1IgK=IoWjZF-bB@@7OsyYwzaqI;;!xl{AtH@+fxG)l&;il;RVv$ zCZ8XUor_)|P)IQ2>LojBmoBj1;tH;hE%s~Zv0Rt%g zY#<)DjxS0-eOhF7^Yi5krJEwk!&FMRG*R{Vg?Yy~U#)wc^M_*4n9Dg9=A5x19S!jp z*AwDO-oT`iJI~pN5lv;Hg>@lE;#&=X@%El2VGOgfLNdlDgBErH=oow!JXH6}y1Z!Y zDIx#B^dt}Ye}@!x*PTkr!SvJzeu-c|L>nncM_2Q;^13$bQ2yJW>O_~5Hp-EZF(5?T z=0>hIdKa4UJD(o!5Gh+iXHEL1L(?R6l!NfJ$aPZhIZF)w zB`v!w9XHjfYSmART6ZTGoS#FkLHQd*ZsN8xvVosx1y2a7x5BGZtvvqqdab56%>ixe zaXxCl$S5!GY-;)>$YR|EXy4zg0_!EHXpr~M7vf&xx7Inoy7~g>D$iks`@orJ)07j7 zzlT6^_4}&kMRtrc^n6c-DM?n`SfGTVw%97#%M4@v{=KIijWaxXsWw`%ib2iFoW22` zNb^{a;<%oRU%ExkcydqhWXM7tUYehGHfMbr4QN=c$wStYh;>DIg!*x7>u6%?jyL42 z-}=}9_ztx#bJpVLB0W&i>T~j8BFXrq6Gf5%40bkDfBba(aP&!tvh(EV-H%I0WODt^ z)3bko2(%J)Qdw!VYwlNs758V3`17eg`gEE+IX!u>v2xk`ENISs&eGU@oKO)m%N=5C zvX64sT6o@}DG{%Fc#l=lzvbvxZr-ftCP;~9MpTv-pEdWqQ#g(gLK1(){kH?Zt12Tf z{W1Eq%hc;V!EgLsZA|8I0{3gQ=Usv;`N08)y)QN#v31gyG%mdqWS#c z&a4_OLPJ%R*F|6!s+D?^Zv1se)Nv9a3T93z-C8P7t5Z)|%X zs(1k+PCky3^&am@>g)A~R6hLF>y_@)!$4~}K0fYX+((PXDirAHkSb|tGyY0NKE>we z>g-IxqNUsH#%8zG+CQmQ@-a5_NnG*CK9Tbo}$MZTo0y*{}~W@9#S76@)CzODh`?tz;cAPh`^^6=})2 zb&U>wX~m&(BwwF4WuF}Mp%>u4X0FB@4F6J@W?#|qM@UL&amIZ_05YWIMK7L{ak>_`>3JHn@okJRn4}A!k&MlPQ zFDD>vk%8&$p4)!O`wa0c>=FhGW~hqG8!0$hhb$E63=ohefSq5r1s@%uh+K;;bnHQ0 zey>_V3wwLNC+BbHbV`debjY`Y@+40>(Tl)Pg}IHaN_S!wwibOW!~YW)g3H^UA5DF+ z8vKYShAtWiPwuWD-Ntyn)az=sN-e3q#Ok8!^duQ=TwGRt4xYuK5j#j~|DO4i$aWfc z`ekG(Jxw!`K>*?8KJt%NoE)N-spQ@lw&JR9C%XHP7La=qq_=MxdP#_cJv3#>(zHV# z_DECvP~D_iD4}{)^)e7^RsSfBiwRD@py8<-Vrr~cwe0;|0GS5rYXgS!0{pte&j%7o zf|mi)`j{PaK z!6mwrk&-d7@n31dN5>UlTXgZI=2o=%OSe0@!g=+nY$Yr37o5S4FbBmB!FC(7Do&C5QyUq zlDQ1W^oYtdcjjJ0WnPvbCW$7=SrXrCcIhuJ%aF3k{2-3O+Up8p0nV#mJC$%Rok$>* z2RR2^3f0bQJK}PQ>zHBNX5Zfm8rr(^Ytd^IG@PjnHsh$eaY=ql!2@(`C9SH>^T3}k zZd>jB<9+FibMX&a4Xu%h8Qw>G<20!t7ZNrqBp|@iKV4l14!dg%{=Fg%F6MrHQpXnL z&coXFRYf#3JTFg`D)vr>nytk?&=oj|AAZS26$0ArZ5QV~U@jCBar>k&I+`GN)qB#= ze+lUdB#BHZt$VTU&1_*!b+yI)j}DA|+#TpioBW5?57^-ASa;d`=#7pZJWq-Tk<((s zau?pk*u#4{zy+!W5v$M3wc!6{jZaa4Du16Ap9J_+0-yz>&TTz3d6`DOytAtM)Q#>1 zYH4G`MVNaM5o_I_yZ+~BGM|GG zsa3NT{#D!hs`6s`<5p1)KIO@8$qOtT=92n>j8t`~4)M7q234`*shbM#?!;|k7I%3Q z*}En8jujbWW#=TEjxpuJg_-pO!Yx)~=tu7YlWr#P_{DUq^UaZYw7&AMe+pDiRlB@W zEfj8p-nfm*O18T6Y1f?!&}q5lpj~p?5D7ZCP(Cp+)Y~74+13JYw3)H|Qb8P}JP%Hg zRFWJinS6;H0gJy{4RW%GK}O$}H5nP`vn#j7qc*>-LKM4 zCA2p84yD^Q*1MDe7;ga9%Fw_86gH$fQ@8kF(AQk;vFZ@U_#n#srDZ^RtsTxJ;z{*d zuFGyvEMiK<)!pq}Rm5j@u~3kdH=7vx-T|s}EHB=$y0&U)SFIccE0g^+nmF#gmFIKu z^&``qH;CB@APV?dYj36#k85T5^-Q4(4+C-eBw=tcPR zm{Gl6v%cq?#@sRqxzLOM#^x10MVS8PblV%>l*Jo)O@J1G`!Pv~_0R~c56sK=iFX89 zfsFYNfY1VR*h6;@7>3Qn!zf#a)s6RqSUP4{C@xnve%ZgTq>%^xU6VI-FEZJ;At3K9 z+r6eI!8a1)fhu9--a3;uYP@b+gM1ndC|;c(ro;)4xhSzTNC~A*h0nU^tW9&sB1YXX zM!9bz1wPIg?o2uN!dJfaLqiTbBqIQ>k6B4iwrAAkKnj|C)xA?lOtaGgsjULQ6k$KE zWW(TG^1+XB2J&QOhRAKZ@brh6sK$f~-B;b<6=Lp1ycwe<-9lGomMfKW-TaEHX_BH> zzp=q>=yI&?wPKV#i!GJZQ}7-If1?#n=ENSUu#BKrd>+4^O)2e9yi2NWPoMwjWp{^4 zd1ti@2X0a+MM0@5U{QZFB--TWexoKT4_xJRaGYbc*MP@$j_6wQK z=t_rbO$ol-yp0B}@31cu$2ty-b1Nf1@8DEH8M|{yT=PpMOuUT1?i&Xu8{$@H;5Su5 zOr{6+SG3pGWhYgw#Jd{+N*Kh-jlZQVabNu&+??J714ymI1ie+<28GM)XG4z0R4I_$ zOeGied`M)ZnX|67Q3-$i{j=4SXLW5G4Do`M@$t?&vG2_2{iK8X%q~)s=O)zqF{!2< z3@zc|1N6h<;BQTtfS`WEJoWFxr$Axkak8}VlexgB;+iu7^5lMlEGb#aWPzpUFL#`{ zT;|IXC{1)k{Jee~k=*=<3VW3Dyj`>dy;RWse7spfDTIs8DsA9B_6Id`!8=A^@=r*7 zxNV#e(%RAzIxcOX_D@Y|%b~e(x;CmYXYyp@Tu{MiB)=P_bWX-gigi~^efiI>C3|!I!<*ua0r!pPlD(kx$Q{F6y%=q3E$JE?yB9{%&k^$gOA>W9sUj(^UPehg!+E(|DL@I(f zsyM$loj}M;i0N~{BlUYV5@Gd=$e*!{%p zC;Y^eX_1T!dWO9ukh5B4bn%|ooUKjOj}lsZOYP(szh&<{4{87SZ?uESb}9fvK8fDr zAa$unNU2>QfNef_u1!A__HGd=S;U`znG}YO>^8msH<7RVD)yFC6psgc ze+NQ8ge?d9GzJr>BoYeNO|R9cgwiXZUL?kTF0nO<*S(YRVLJMtQG^qP11m07$pmLz zf)=g%j4}MRv-^74WbPTPOOb#f3gdDdKm2}VvG3zdOP;YAf;^FT2psug+*^q}3jG`# z;&NR=j53{~U7uO5*93D2 z`7-7RY;>^*HZ)q=lzSe+2O_uAb_$5iL4@b`5eZZXrB^Yc1MxqdW3GzLW?4amFj)gH zkYxtF9D?F@=;WzDv9&>M}|YhR}Yp4Lyop#3#^T5!bSS3f&6i-?dp8yj1JS*%;I zf(-ILNVksA`%`hfB9E@Yu3@3COILG+yMJ5yZ?elZaGkQ-xZ;7qyB_5IEh1PJf0I}3 znqRmLc3@-s)?JMs-G@bBG;gR`{ZFQ^YvOiRboPf}L-BW8C$&Q@yKxZ7#17%;SzNJ_ zeqx`Dp3#(sjv9`wV!d2k3%?b=UaqGZQ`w~;v+(|6FEAF2)6@h^rVEGF(-W3Wd!r!v z4o7CDgw?!&b(xM$um~i#X_lFKm6~(?Ej^KOP#q^_$1KwvboN%p>@5(#JXOrmo ztdur3Mm4G2(e-lfw4ETYf$KO1hSFs+z!g~}op%@4c(=;+k_wi8?X}_@I2k(NnlKpj zZp^y&ambQ!1x;|As_%SYJ0(&7uB4bXd?%MyuuJ{a2=6_0@m6E4{P~ zHh))f`N!JTX?JX@Eb|c^{CLiJtS}ggt2bsY(Ks{4c+~=+I7@J9x_Cn{rg?Kua=s#1 z9sWzX^T0f;w$kvhk%NmZ+u*sM_}c#KSV2!S=~C}AZ%D82@b$9#)V#gpe{zrJ^ywXY zTG3OWAhfY}o2*j1FqX!6&g_El027p&*V&Lu*M3gy*z@?Z7^o23DS3odWK=YTwA$s*@gjdxF51~^v1vA5AbgT^DH5}d{R_ybrpu$Kl$ z1ah(l)+@{2*14|JAvIxuXyY!9bR>Tem-w+^T}^rQAZePvChCo26DBmg7;L8iRDS$@ z3517bK0YFY$!BQ%o4!z9UbpiHHZ_Mc$wXTgjZ7))^pzq>oRQYBzs6L?Zik)xkH(&Y z_7eTgn=%b~uV}Ty>f_u*F8s)IpmTJ;=8t;cfn%ih3Fgd!8fnZhHwM*^>zG#psaDi! zwcZsP($O#r?=c96N^5`5_2;LS4;JKljm=Jq`!#i46HYR1($o6vkozpfJvP}E(rN1&+?ur}_? zz0orZHu_SSi77Qm2@DF^bErXv^xr9xv0kD`xQE%qsyEi_fvQ*&7y4CgyTJ`p_b0?G z1#X!v!sii~GH1!~6){(=WDr2j^6v*3d3_K%E{BgbEyTD$Lo`b>e7-sxno7|q;>MdLYjtJq>mRgqP{AkZDS~bI2_5( zTYqzzJ@Dz6LBTS4*|@WHDgD0&mO*%amI zw751~*j7wU(*tBKxQ&V3_-nVv+z|eP_OM|J0}jZ`x^NnhV@PM^@6NBt8DGvHSEVd> zkRyDPQ($LAyiq!JN=#&;lx>vFicVTDP+E=ZovzSIh>L%AHU_fttZ-3bmNW z`b?}_jD>Q4cjmt;1QM^_ywM={H7JUqKw*7MtGPBPJIYvUrF(be1hV>csA1J(VX++! z;Lx!j^g#mNwXMStirC!W?Rzu+gR? zl@O;L88z!4R9D-|rR5Gm^yPAAXU9Hg27PXfyOH;aFy~gZzm!!~2Xy+;wo;Vm`#xd9 z$gT2Bx(e8i!yT9uP0)4gV_u-8rQ|GyR>c93T~c2sNV(LWpq<|Ljq zLR&?w;gI8jyOo)LRSok=W!dsdc7z;UJTaD)2;Ka(FL#i&F*P!cM|daZ%^bbb z%`gp#rM&e}O?<#cAoUiAXu#2M(wdbe46-4`XDy}&BWRKk0Y6cnhAjQ>yDU$wF`Ww8MR-(Im47^^F6!Q(a!!ZtLjbFC?HMN9$2={KDFL^qI z-ebN?q$UXzQSP)-jaRl2O5y^i8PNwjEUnN8&}94zy(h7mHx|CpVy5FO&pIh?%8jllV&FGKaG$+9G~sng41hdQf6cUK;~wL8tZ zwaFly5~fTlUT={~1JRO3sP*K4Tvc$?GKXusZC0n>LK9zQ9EYJ2%;^+0+;ZrmvyRgg zyB4RuED?3BBjR=gRuYO0s*#3wZXcLHNHvc_B!rexEN8=HVHyk@&VK#I(V+GRV=k<| z@>1UcRCoo865^QknSJ9hH3@M%3+|}e;&~*r$@Ftce9F)}F0{S~V>E2$GgFd&+FRL{ z75+a|y>(R6?H@P3(MSt7-5}sC(oABMB5_ODf+Af?jFKEMLPB5zLAnGL1L+VLC7lD2 zhJiE^BL<^+F229>{LXp);v6<*yFORFU-fpVC$*pbI>B_2#!L}Ko{LzLEomZEq{(>3 zX5N5Y$x@f}G0MkaY3zsLiKV29_^zzZkr^GCZw~oFqu++zSLrM@RbRCCbq%{dPxk=v zbf}V6myoZk+J{?SO<$zhRwL$QO7KOoqWT;`F7)wCr^aNQcY+u5cz1sehWQ+h)7hP% zq{;&AC+|RphF(ci8z1$&5cked1GelihTJO<*&wwy20qr-2J;NnG6ma@@|7fdQ+ zMd{b6Y($@JH^|S)F)wh+Q?8uv-T&Dz(=uyZTbiHtRg_u1c% z*MIT`;G{SMq<8$f$oa|7&2x4TXE}r`<Q^YbigQD%utdZ_4rLl&X+$ozYP`ol*peuRo1e`DjNljE85AW&N<$h;R>h+B0F z&4Z5dkx{Im9>~;Z7&h)#7As13^BL^)NHpJIf6DbiV14`e;W$MtAR^em%j$%ANZ-~D z{E|YVrjQ(3NQ~2!E(mgoN;~rUqc#MdHM@}Q0C}*H!airf3%y3;!~F;e;1PHhrSd?X zQD6E}Z)paK{-)Z_wy>9r>@!SKJ4|2zn?LA{;c#RoVliC=zX_X#<&_?OM;-MMEvBiV z_8ob(p9&Ch8awWpqvg7Km{=oe#|VcX3ux7#+EQ?R3Zum++p3%XxdKLMd{3pwe;HDC zt-5-69G0Uf-AR){$`>&>%5DUw{|X0_=xrUG`qyk&oozHUV|nFUcFW>nP9HuieWv|9 zOyDF}N?LktZY~d~$R^5lgw=ebvRDTIZRVgRs9BHKlXp)GL_)mZ0R?6RHy;FPbI#$|I6I zK5nU6#~=t*LhSFle$!w$eE2Bv{CK7q;Ib9ELE?hku?N%2ZalV+)DmZ6j;0!prwJp= zIl<~mmQ#uR2{!KJi{{py#s*1NAQ{R~OAgR;Y!B2O98uDNs6EmdO zNxzWlqFVo%weEQ6t?{GbNP!>|fa8Z9SNWT}4G)b6T-E3j&qAA#yj#@|W-mk+h-w!i zJQ!C;n=_M$^v8UdRVnfmIVTdm*pPl#Miw{!Tf-OFEGx32E@sLwhXr!*?{NL0@Z`K+ zhGJ7HK4nw8Iso|Xf%|?p802t_6l?U5vh3WGJ2Jk(&t!MfaLbiuQWuh^Q^eUcA*kBO z*!W_|KNe@=ioQCSe}14rOU9|GZt~?u$=9zJ@}yVZ-jBf!^a=zZtN_Wzne9#~wKL3U zhwE8Xrv?y-fZ+!5D&JE(7Cw<&cA7cAC@+?;&rp-ioNoH8t*;keNUQ42tMm6|M}7xx zD($)!7s_u3#R4Z+1F4=c40J(%0iOE`NP)m#*;ta-Yzy3~=Z`%HaSblYiU(NC#XI-D zBZmL{u}Z|9-Z4FI$t|aO^IhqDgE)U@HRbD90&-dPm9MV}0*`%B@JxI);LH;rNbZGL zuUGcT`QJYU3~p9t=5OFAIu0h(t)A}w2U!YKxv$Xw_0}0ES=PV@*f5b?yPoe_wWqqn zB?7^uROUcVy2NvS1J`b1V&Z-j!;y1c+p6_wBP0VzYZ_-Fgyqj&1YUljRQXZw8?+yG+uuK;EM4_6=_^@{0_2oKLfy7{$wh2ky; zpavNn9Mn`tGwlqy_EPJsCy#p){TJi~bB)yxKLDZJ8kp)=p&~8Ub`I5~!nr8?7g`8v z9|wZA!UTQ;YxBkH4uXD}Mp+X?D%yr%Ch0&O5~-Jx+Lk zo9;0}IAU&Z5C}KKXF&)@#?MYR3hG>LuK*C41YCm<;)O_)8Vkf^OQ?msPfK!^DkkmUvCX1BjrbpxmJ-bcs~@9@P6#$SF{MYM1lr31&h5W~FV~ z;nhg`>e(%aNOK^e58Dm~I?p)m{{DU{(OEyz*to4teL+q`?2ud$h%00lCHHX)@Yy3>AnOJU`-NT+C=?9GwV#{P zv|MwWp6`h_{sj5#=U!cAM_w!WQ`Ex9LT{%lwDH)Ai3mh@AnIr=`)Wm9o$A1~FVPo> zE5S8yW!TJrft+SQ{p?^q8K&ve31fLUT>d$R$ILTBc3~({BcqQBLcCCOYnlU+%>9^UFi1_eRVZRwgLX5?)CF|j0Qj4+P~DKV*7Z7y})vZYN*gt3^KVXPq_``tmSHV z`;Hv?5-#)c1R%=wCwR-Y&*aH+8&_uPR@>Wy0sGb$GS79BfP>HT{ZR4mP37}9l2-+Yl0bFof=Dnv&cAfFp|4Q+v{ z=lA%y=`Mxre{VKv&-NpxFm2YdCMbZQ?*R>QmGuG;If9e?_k|;9^gv(hWITL_uni>lUDU*X@`K2ik| zj6G?%-G~NfVk$M4fd7D;tm$g1(M*;(hP*STX3KD+ zvm9S@UCcPC`AeAZMQ#S;!3ogw4*03O0;1(?dE@7(=Q@v!UmpOD#G-h`bqmamy=H0w zdir?i!$&~gSFJw@q_H(}5RI~|^Qx1S&d9b?pkLf?1PYFHqa1XlhML;ni60$Or;dii(;V-};Xhryef{rW0rr z5oH0S=L_XLo8W8&6U_-kh{T;PEG(qmc&KP_{sBoM-vNSb{?3`18APpk-jDh~(uYTy zDGC;3ECe;Ai|CqMhY!3qkT zf9M1IKMxJ*$?W+3NnaqZeQs_(0%X}=l+5>0=E4H-Z(w>`&O(_(gmPXRT5SS%E>}nz z{uzX!i6D{#bV3a5K>istc}7Dc%^uUf4>l$j_qXN;a&-vFx|e$D`zUZUhzMxX{OX{A zS}bIo&^MWN}HQ})tNH977f?f1E8MeOuJ5budvfHc&%b*|L3)$!j#N+M=QXK59 zBWld54ljZ?Mk#5&;+5_ARgE|x>+>#ek&s~FoLJ3F?v?-`@dXBNm#O3xzXft!>mA)93Ww-3fdo963>i5mjv+(kT9a?heAAJ|JC4y$&ofcqHm z>pKMp2U`-v1Sa_h-7i~6lO6s4nyCLrB6aRFu|NtUkgCF68(33jEKbUP@!~h$s^0ri zR7|34+@b>-pqb)CXT05F66;Q29RA1IgvGHFcvawZMfbT-eZG~y^jXS_ z;-nnH`4Py11F!r~G_@aS(5YvYoyuAF0@_5*S0>74Z091s`z1TFhisg2jWFZo`_ zd7NUe&M5VLdIP4%(MOA;k3j8&INwJwCD|z3WauNGHyYPG8fIKw`ukoa(5e_cb z7lJU?02_n)IwoGFSY9ue@ef^J`0n-0n^#*LS6XC%Ft`!K=?H8Ty|@!Fae4kW`?-kS zlA#FO&=-eCk4`V_NFaRff8X-EUEJ^^xOvacZex7M)e~o1Uy%M*hluQhHlD3D;ul1u zH~t+(yG&H|^=sY#xN-vGuka0l$Iga$;8{SNEg@is#4k5;qD7J}VU=GKkie1bGP()2 zm^=A9*1CVZ>%Pw%X3crfq*bYLixT!$_Q(UTaEgx;+ns8hzkNhE zpWaD6{*@UJD7Heb{U!L){_mc#!M1(>YJ9&UPQI4(qtJ;JI5Ao*I|M0w0a*Bwd)(ZE z_i(kQiZQ-^+I3RO@NYP=MOExUdn)6J@?@P$8i_ezxNhU`MOXs4pBIC@C2PD}H?;-! zn+u35FAX zT%A2$$0p6J8DmZYEH!lC^$zU^NpYk-p;tM(D=AvP{Fk!d0^gJlgjSC*)STLpMG=#| z9WF%X4emmB%1(X4f^lgj*-+amNqJm6~#uEQ1byNmURm@(HGKRk1`@jaoBsT8v_hDd$&7p&N^JnXb94` zOrK`t3k2bg=MK0Z!+`~d;V#JN;1P0Ty*5c4UmbJOm+be*6*yapN_yT6e0dx9_a=0` z|H^FiHBPF>4|^^IYC=@JU&7pJeujU3u?wfISq=%}B8(9dZ4ERJ{lpLk`*(KCh3k=A z3R5Yv#p^xYYb+K_QS#iK+nBD^t~wR0@`ioD%^*UQqG z!1ny9G~x9A!*{lKACaG?Lj(n9+OjAzA)O{~TLWxuLvuKDS}CH(rhv>S}h71q;1;K55|FkSy)rm6=(m06Aq*C;&#Akse75 zsXD>T*!yWE2XMO@qdoGbC2x0ht__NN6oQ6w!h4Z4euaGIACi}|~E16MYH<7OKGNpqK#TsEw z(nsA^+_eE@rS{~FbFnTumZ8+1mu0G$^5cvG&#GFFL zo~TxHqM+%wF77;VB@{sID^FUUWDIP*4)ea=Ni<#-$|!S4N~=7%U@DvR6W(n_B|=Z6<)`(CC{Qj|%xxj)~KJHY->_S4qYl+Kcv6nQhXpGh?&FPP5IFq&zwi@lk zznzzNnw1VM*hL?lAC}4g2^y;_3wrLOg_C5{OqP9mt{iFVWMvN5;2OMHp)D+?0!K{V z@^5+}Z`0~@Xe2K-o^D$TRi&)Ya%7{nh!hw@8nk+E?-SK5w)HM{el_2+tJQeQ4N_JQ5A% z-}db_s{5mDb-~FgW*OyVu{w^gWCktiGw*^D!-3`Q@KAnw;LaB=mHfP3#3zRgx~vHC z1kuFAxh_t5bhh{lOKlb|sBJ>xd4cYnQ$UCqip$Nv$zH9%p~vS(mB!lk4*{;j5~XQG zCWU6pQLnn#mT;Y}3ibvkDM~WBYo5S@I*vr@n(%+)s9A2cw3X4LZaTWt(Ul`VNVcE$ zvi!^qZWjC>6Z};=Bok)8v;DI=yTpl{Y(}3tO8tYO`*%^wJX%!pbMMTN{!|8SepQ=X zSzQ|=y&~nw1RplJB7RP}{iLkxqr$bgJ>$UF)2$l$Khz*4Hq=e~Yj5Et<2 z90x_*@1*)&(Q5wE9lkJYvg&$8c5arMKK@m;E{O9qgAMR{T3iD`22 zB0+HUMN|@DJ0J*Nz~3>J%9XL_%B;Xic2-XV=Sxl^RFcPYTXN}=2@zaK4GoK=&QT4% zX>~Zf;uyK&>3@o?Ud9B;m(QMmL}GFj!_h*Gg*ATt@_Vg^UgMV+%9)H@fC04H1#cAi z>AU#$LCJ%s_P+iLP7YDeli+pTs;U7Ak>yV_+m^~_1tX_K->&5-FJu>86g!N%ViQE9 z$Rs9gc2K$kD7t*$bvAyrA+*9y3ia_YIx8v^5cxrW)a~u$)hNjacb#K@{1TCelu0m@ zndPS}t@*8v|9VEOXQ6G{za+bplBW{(sF(=}YnF(UU#t^QyQM(Od6(WEIHDJ(EvaOm zej@M|@uUs}EWNv);Uo?TAU$KZx<13my2@)Y%EGYgZa-g z5UM>=zrpvbr!aIGtJ@^zpxKAJ<#DCw&y?1kH5k0m;1oYOFfvRJpd{buqaei^x?g9-mT zbNh?r`T8Q0tgx752+sW3qsoj9xrNun9WHSjX`Uhba;{EqA-L!46c-SnxVRYP@g(M4 zSNmx0m`)Le3>cw$Pmw2E_WdjLpx`8y)6vwp^R^|EQkQIpizyeS;7nNpp#uFti}t1( znf_dY5KL^g_OZ7^IqDNsjA&~ATWs!;u9he+wF04Tl@GnbI)C^e(30K*pNR( zJWG7@C>|@qmzP^1i|0Wp*VO827Df{H6HijZ0NzM-#uX@IKk{9G7NmMS6_A`+NF1kD zb-c)p26!^SgSn<`-q|9?wbej%5eL}7m0leT(iJh2^#O!2S^Nf=KE5jRSwq%+jjszA zXs*$rSd%$bWN8in9dxUMFXDw(a7K!$ao@GnJB?3qP+kOFW)J{F6*36}edjo}{e8A| zp~blmS~@U)Z_h1WK}cA}*Z9T8y`Q$m111cp_~h%ElIg(Yz<-j&l0$n*u4J9qP_OA3 zy1_R@&3@Z88mF3+kkcwpbw)+OjU(%Z*VJ2iWxrBspYAz4UcB8^{?M`Wwk|3(UrpMm z+T3gM&TZ#v;~R^M=$=AD({r)b!f8-0qbI8JPrq{WzQ>8sJH{q{R_wyv6St)j1fb7# zp&Z3E>iun^DJJKzl*9GDb)e|>!P&p6O3vDlC%nL_GzZx0VS$hoLRv9zw4?vI6z2UF|8#kD`c>&L6} zgM$O-DNyysA$=!23DNaw+nUs!=Eb9X7h?@@_6($kVw#|sz$2}0OfA!V_1UBJ?&4eWV-N?;9*u2CV^=-blspi{=Pd!7%yus&^dH0Z;<AoN1&Q!P_=)q~PWcpBzk>><$Ng_yK6?ls*^lXnE-4OpVapwF4P4z#U zc?Td3yh}bWmbYi_yZ;V5!6!c83#?%>3QR}pou)xniq(Rnn0B}VEI$mL5uxxlDgeT8 zALL|btKT^VK?BX@VjxxJ+h`_3Q!hso%gM-^racr>B{`IF$FY|K9jeb*=FP`=XlnEK zZ{QtYS7|GL1AU(??77l2iabi-#rJvAQy!<@7tM?0b(bvrwF zEks#=NA`gAbQ<3ADT?=3l++`Ik7mQjxZ*qWg2aB28dLNNK*8Kayd$ zvY)t`WAgI(K;{{MPW>N;*{rYNJ)Te6Og%C-?zJtA3(=S-^=F9+I6Kx&GcItWOv(AH zhYW-6yXxdJi=9%R1Y&fDSpf;6T>n?R;yz((Og?Y1c4e|PGH$Sd|1dXLHz0O;A#s1^ z*}0e?t^>ro1G=-SvjdWO&sB%NDp;d?;+4xt<0w0YFUTmRLDfEZi^>0QWDJlvJat{v z1Pv!mwaZ9f-_Kxg1^DQ95O>gAbc2Wp3~(ua{7tK(%@>5^mK$=KlI9Wd>hl_a^#Sv| z`JQh32msFQCzGU3Ds1NyaynH7$klzin{Y9&|E9-qh$ycRQA3b~MJl=g@|)Z)myP^q zku!3u#t}^r!$;?iml_;AypOKzo&g)Bj8IzWe~0=%`4OS){x=T9nEkZK^r&Vj1UW+0 zTyYGI%SHK9Q1aCvt}WdZh}0?0pJzYPb7=Ba8z~CnpRM8F$5wK~LR0Tca1RVZ{!7ev z=afoJH%EWVxve!g>&{4Z*nrY{;x=Rh3ZSIp;}STw5P zjRgtZz&0%79TfTvlp~eq#ncP8h;1reimqg>t|fFtlp#L|OK9JKrD0WP7{;-JvxT1T z9SYXD5Y}BFrW>HZAm<=B9b@qQfNoq?I^Fy?^w3sIlA&~TJ(@E--bJ$lE2+Xm@86mN ziG?qyp8mdbOU2ISGFhh!1r=ovY&>-((K(Sm%irU)C4oBTr*d%nOoqk%&-D^XIb2ZD zL#1K8(m`b(%r{-gSlkWlzyKvGr;;PjnYd}~Nv8ETvBsy5a+#7R+o*ti+%&+w8|*{F zfZ-r-s;I+ryOr|rbjaA8pe|BN^r_z|Mm)6BM`;Y^ndNCIe$eS09tQi4Gfv( z6C-7RY%I0I50IP?Ptsz52@#{jn+GU;$Tb8r5647>EQT&^X>a4ZKVVE9+%e7mMXZ&t{(GIh+zu9IXUV5M##518an2=vLx&Xlcq2D zd!IzrY;ely=4tk*gNsA0=U3j@VxWYjCz4ukWKP=p9rC@f)p!v1}Z=#IKV>r z5CDZCC!2MrTQ!-i@$hTi`S$e!Ro2b!*d)cKeWu%~tF7gZb4*Axm0OsUwTk?}tze(AP2Z~P}65x9Aah+eusKB^jIDP#WxkCx0(X+%=joG`=qo*`3-)BZ^ z)3^KggHS|OY}8l0Uz=DT{~?6J*9PzY`&+e15C#%(nrAmSz3cjuu;KmRWor2SbDOHc zJApNjjD>kW;~lF(PLu&k>R^bY$D5e&iU|`exuFWmK4@+=-w=mw{%)a~r9db3tjR2G zxW4)Yl`Ct{MnfZS-)=~;@H@NfijOaMrhU23qzBmAsVKDfo3)X^dqsdzrwwVh8X@z{N9#9?gme{lD{Wv5mTbcXaGFfUs^chNtUc``O^ev4W z$*Uej4_Ddn=HmnJntOKYhy~6z2Z?1#irdyu165O5x|Ltqnot@Q$ERIVv^)-Gf_)OUV zIYX7AbKm8JAtU|(^edGt^<7O*sTJ`LIrBPz!Zs!8WtB6tLZF_yTH#w#M|Di7!Y-d! zq%Uq$u!nk!k5Z0W%)DvznK47Fk=kCT11!LY{c(3B1n6pz%&#G}MW>qTD8YGhv&$5G z@5s-LLi`v7e_j|}C%+%6m2;21gVJs(t^!I%Y;xXV9gl3{Bh{?+d8U~woo-FMXZrmd zdtGIZ2@2RAMw+PI5d#UcYK{%dI`7YXe!!ywzZ3FE?Y0KmA577;lM^h^)KM+WuSClF zPH)|4;@=|m{ZKm;d)|o&Ba@qRPiHMq>!G3!)DoZthh>>~E zj**k>$=4G6fI$ogi9hpKm6#!oY)IXp-P+XJqLlG!-;upj>jKNJFcGEv$UKF=T8t{_teF%2HE_ zw)4d-;O(et(V;~^2iJ$I;5aQIU#y`-b1Q)5LRFD0Ie#*!poXBKSlXu?;$l7@TnhK=;~F|%NXHQlaN~Bx$ZcS{|D=u09<1Bf4B(X&d|9bLr6|!zbS!rTG5P12K#qX=J;MnW8BE&&=o=n(D?z zjr32}TD2=iD&6KK`PuZ_aQ6Lz01g`Ztiam|`n8?jU;81ctg-8$kG%Lk6FyCa=U)x>#xjvFAW-(({wCUF?wliAa}g9X;oQ^dr@n zJa>)5erK2yb?p6J_utE2IbaLkScfvE(Kg-luqJOi|NrDhpuEHXRp&BXB5hy~(xt*u zDGX4+*sF>Cpn(HhCyya^WWWNqge{UB@A8Lz%WDiYEG;*DC8B4Ua;};K`~9m;fYZDlD~d#$|EX2h$)wEr9D>9Y`>>}td4n8X7m=R;v)M;;WDcfp zs4bQ)L4s`qG9T?p+O1XEGgpjm?5%c2pU-D1Uz17Z(-Z*p*!7K-+EI{PWtnyO?#nI2 z$7}Eaedv*bx0b>KNTs!p-9}V9}e}Duw8mg!%;1n5>hOyWD(%&pj^HDC~Dm*rU7zuR* zBZSDXt^*WGb=&98;6+euTCaK0Q#0!Lby5 z!#)b!t(xfY&M+WI8~Mu&x+|Rv1Q7OxkCTT3&=%UZ?P@z^qu%pHWj>Ft?f)6mvza6g zy~jNm0(F);O=vC?!+#pId5^9BdH6mz&r(Pt>hs6@Z+QC?hKMiVOpi$qMEZ(6W*+0^ zJr>o1PU8>Lwh!Y{YrLoT@f}5qLQe{#ELsu0%1f#9JA5|%79i8&@}Wt4ssqeJ&YZ^s zGyWzX#*ewPy5^;Fokg0~E!G&#d_5lqZ*aA3+KO34xVW?-)d{fzL7_83K-!-Ge&0PH;Mv_vL%KSD_Q3U>t6ok6b<12Porq=dUbTAqt zPeK*3OE?VXJJG{0{{geSEfpyEl2*c|A`i3F zF1o03GDh;*tar9=m8{wbnmB@e`u65**y7Zs<~LomM^!E{u@k#hLb-pgRJlBp@kt_E zW<%@b_ao)0yHTKP{Yr9w-xD-O{#!0K$ZXlbx_kI-T`u5YRm)XSqeeXee7rE#@mlu;tePl@;Qo0cJ@kRPuV#h&l zSiHm9Kd}uW$PsD}JGLgL4^;1(Jz)(yzWhCfH`XSbj?7mm8W7q|30C-hS#XNAL1x=# zDMex>toQ@h^zA)N57{4i4Im{g6Eukxy{Y#2+B`V=$MATmK&{nU;;(y< zxS;n+6IC0cRxU_63M=D?ZIVCJqu2W<-%oCI%TR{_#ZWZJpioj)zDmhrIfwUs5@uQt z8Iz#)iWg$OCUgz;{rh*{)4kF8jF}VrtFLvqK!25Fn&C%xlVz`o2>*BMnX-oCQU2g( zPDVnhXGM-(miuyj04L-qzBIshd8T)H*XY&98v#!n58Y%jqc70>IdYHz4OP`^ zB+LGC?4-WEfj4>z7v(ape>Q=lgELO2 z)JzJL8lNA$4!x{EKQ{o245M#KFlHdjgL^6Qwga7Lny(-v{Ow8$zd^PwRwya?n|ZcB ze}|XK#sW$w{~qWZ)J83Uy!*CP6KdWoNkg{))+$&ZM%pQV3b-ji(>j5cKQaJj=n(}C zciKVUJ+Nb-ZzNk8ODpL@7tEb~ooNgNisM8@v8}XCdMbp__yBbvI_e24a3)TXo>D*z zRuUCDwE!&6k=h?2A>AG&aY!a^9un#tUZ?t3kA_=B^TS3Io)PoUThetXRCxzgl@H-Dw*5XsNKvF(=$aa{Odsv!3ur#z$9|4` zN3i3hIlakddC=umelyNQAUo5uv!+oIp(cC@r{8K}X2zy0lD=U6>CqY{%f03933`d9 z>9$m1J$9z!67Q|I9WNsVM8c#(gBZy2n_@gUYnVLSuDyPOwwCMdB&~9+Dd!a7qftkv zkraF2V>%-c9Ue8YL5%`nulsn3R-)-r=Z_-spCcM679+xfvms!%g6Gq=cAM6d;Fr0-}^ac=D$WGDE&s#M44bi16E^yJ$IbW_WmRyC0a*9 z_%B9b%g?GQo(2(dnjM<^Y3KzD+m6+`?A$x|G#DfGn|8YCh-}`ld?C6`pinBna^s@s zU;EdaI}l=)r*-0SGC}AcW~<30O-l&4HmL+y(jWU}X8Yv4j<7D9a|?Rimd4QJ3zs@n zU-4LC_juWPRre3MP48FSc^dfn~eRQQ_|j&6;?6 zb&||7?6cql<+*M@1$wbsWz|;TOQhVaAlG@f{j&1Sw(k^|h-b>RY2H^mf2Z=Yym(Cn zD%NP6Q3H%rVRPF+ESSt=m6p}pTHg1wH(-|ONzgdWqNtMMmf=t!gS~();wyLQRjQB>a<#g)}qC&iUt?7=3eKmaik? zhd9pQDNC$na%l$Lh}8_9=m#mta>4hQb-(S2Nw3zmUyt(KipDtyIH|pWvLL3c#JyUm zpM~O*dO$zy4LW@4u2GW=P|OX;AY2sSRJR5@-5-~s!4{!)m1UcJ4cuWlFz&>YL2BK4 zU{$<5@|-JW5)2bq{&S$Yk=>>zr6>&@spmFR?>no*%%p-pdUFPHGgC7I$?ufl9kafH zG8*dUZyGbhv^JU{Hhx6&9867q?Hv;o1*=WG;d~VKzU*)3|&@ zW&21HiIh@rOme=k4XUlg!`U~a&v&FVqM|fTS~Q%qOnPiwCtvBqHqOq}@xkY(4EFvl zc^waqPm0fviov^zk&D+{q#h|eH=0=51((~n#C(yFXtSY3Qz_zf*JN?vhLfRoE8!GR zs8oJ`$@qokt}>g0IjUFgyt!(XPJt>+>(4piY?DxxeeG6pvbd$J~pH;kqcQR}HeL`Xac^^x` zA?;l?1ywHdF%~D*tSsAY(m|zmn~n?6_sa{4Wli;2h+UKGAo}Y?&iTnQ_{tXNdlrbp z2ETP>p;77_hIfmZPd+(u_La;PpL7>1u&`XT7#)-w-GZ8iFGnapf0430HE$WGB97q& z#Y%_t=`U$T7T{W&T7J6Lk5s7};`?N$wkk}AQ)Z|wj0F3X#`&(sjP{2XJtqUN{8rqX zshEK*@<>tLS<;zWue)M`yX}!BoJB=uoKyZEZAEPLh@_@v^*BvJ<}TUy%5*C?{>bg+ z0F=e?)5)rjM?ELg6B84;^R4eGnS$OXEj(pM_d0}AyzW*{0$8h&+z4F{9jeAkDox}p zGjguZD0OCPs?`_1$qD0tl$ch-f{h+7pCky}b3R(o`a&ft@FuhxTWeanv}3X~u~<>` zHcwd}&K;*h$yKBmTAh6Z!*j(&-SI0KUTt^^F0~Q9jAXJ|Vg1Lk2-)NJ4A*GK zg|9gucm-udfA@?n`aNgfA9yb}@mcnbGvlDQB;MrzuB6BKW0O~k7yJCYstb~o{RA#i z#&~WFU`(VG2 zoo76Z+;$TNN4{`;)Tb3DxF_f_wRDBhBJ|!#y7t8g&J{RNFjX#hv_k&DzJB{8z%e!@ zP)l2&hDKyJV=g7={11)D8?BXRMXeqd!g;>my^Y2k5*bPokG7cR!>mGQ2KtZt)@3gX zjhl+RIQgyr4-CucxcN@)X?p$RCk%38?TZpZ*3Z4H&&s7h0U0ZJV9yN1}Jd9@)AV$clbB^EPb>`IYm8as&CjM z8eJymZtvo=tv(?rWA7{2Sg?oI@v;{WV4D(kGJ6TpHl` z%+~CZzPI|1s}d6|vmxS%ktjv)@>v=5Ei*qST}U6#rSjRlRIUz7nJA#KuOg$5Y`On$ zM!qe3z6d)TMa)3Vm1~;xxoYb{jTTFo2dXDZ)?cS{-}%L5dLnur<7s-8Oe(aQFHr~Y%ei{hK8#wQ&{z}(Nc$_!oPQ2q)sbER>GnJH6_tZS9-ZTK1d2YRrqRo zip?qvPvFu(XFRw!%k)gq&5Jk7QWPtj)^4_AI$6a>gLc37DT{%b>7~si<(d;vvjhK_ zwMtfU5agdDQBK^oXU4g73!NsrU)I+%h{|tPtiK|j4?1%8u3{G=rO&D!*6jl9VNE&(D42>2(Fn82s_i_Ft!q zbrQ(%w{2a*UtZ@fg^0*duq?SC5I$SWQzkO%T0CtOgqIZ?HKmr#t=lG(RoCs_O6Xmq zEO8=Sv)mrJ=|LB9=)@WGx~G&FzD;CkvkGhR{c~e?o)z0ij#z5Vz3BKl&eIZM>Z>{K zx>T8eyS<7fwQMDa0lG>1(nm)M-em5<{!K!`%~@8K+ER;2Ft0@vUxb)7|vH! zSC~!j$@MO2sgulFeAwcvZ{K~3IEoEW&q?tdj~W}h>>k{xp4?LqHk#MaYtRc;#k`7A$atb*D(6!@b<-Zv}S6T0gqZgfF*QnQ2ge|`FSG^wN^6ZJ{ zaf(090n=}fU^p=VTn15X*7w>GzsYURX#BG}t9@$MasXfkgezjVt}xWFVH< zUuwV>$mw6s(#Ztnq36$TYsHIlXBP;)+{d^ZaU9ARUA4!dM>*G;E^$(#3ZAOck19*} z!gv{D64DIB+(EN(bdME2q@|NJPu}E4|Di0?(5k{kp*3XM^O*d!lmQo4p|gChD59?cXK;GKzR+#$2Iyu`oAp z2Tzn&K%fJ#TFS|h`OVHzg*Pm)zW0_gwtuP~-2DBH?;?Blz8-KM@c<8rI|v-i_2G{K zy$mhrS^Q)4($q5XzH#tM7amaLbHa#ze**gwaV1HOHZjo zxdBG<9!>0M#XUVd^Bd|^flf*n>_57w-czKy^rZovT%C-=vQdnj4z0rkI{ac_4lzJ! zcaKb+|6gGhx#eRk?WT_$F>USooDqhy@U0)C0ZPI&>N9ve`)lprVfVGo*9&F5efyUj zuW2r^b2Z2B`PX~=N0|`8MAcAVf4zX+BxtLQLHEx)8yXi>s`%{9{;=@k!dojpV?dJL zINOVg*7lBj%udR;271+YmRNV94We5?IBQJk5=k5R*uN9C*A8OF(l{n;<*vrFcJD4M zd{D{*S9Cix!j(VUa<#J^u&<^Tyo|9^a|YyD zLeg;8h%ibl-ji)kq!TdRDo0ehthzYNl1!mNlA{;&IjX$ZC;D;E$unPuTU>ADwZl_v zM9A5!U)x^k4LouC+{@g8LZVToEb`3!6XDi!>U1ZzW&)I`%P_tt?zvG}1C`L&sQ#f# zAzEcmC z?+-lj%?Z>x!75pHufgA10rDeIN_fSb49IeYZT4YclMOo%fPp(D;j_=u40{H&B2pp8YzjxOVJe0~nm zYbA&`-S-qVQpbGzg!F`lv4X_ZYIh`(7a&nt%S7ATodlXwzb&%}lru`so6z=4!BF|i z5ooBx2^9~aP5dKX5y(E}r7|sX3wAD2+r}?RgI-=vol|;FPd(g@Nm&W6 z5faGez>u|WmqfNGq11Q}SzbT&RSROLxySt9!Ol+E79P_f=-&5JdoTcwR*AmkwCreV z6*4pr_0YREc+tiKW8}sk}YFC`xDBibAP!{1|UC&@`(}k0pf`FG?|_ z6+ZrUp8`rjQL#Zy&aG2=KT<&AK2N|=YL+BN9EzOgjQ)d>us?D#2sJza$sWJFZh3PY$Cz8^BXUYo7b6SW8 zT)x0g=&s`oIamiXN3#@`%QfycuFg>J>F$0nR#JtDJSj(2hsRgb^z({jD|0A-jFsSU z$?hhqrYwg)yGr(FIk#?JyKXa1{5TUlmgwQ(art7;LL$wwO*cgqlBcLp6nxz`#6w&l z+v;%p12^yn@L1fvz1hM0C{x-YV@}&#)`!dw2|S(i)o+OuyQz49D_B$9?JY|0su9Z} zZp2R$)y|16$7m&n6R?)y(%}sYZ*C@Cd&AKYhTBlHKWgudF1zRZDTci1rk!LZR@kPS zDi3x>e>!I(i%9HGGEhuI`3X0EUr`r+Ej?8w4h1#(r z+uQEZ`x2UhWL=cc6-IalrB2@c37bWGQapLnw6|G0#_OtUE>+dlF&wR-ebi8U%HF9&RO^A;LvK?%_GK-{)pUo&9lal>r-0vrHXZ=fnFD*u*fYLl8xKehcxlYk3XuQ&g? zt1fMhm1w6vh~qUt^VhRZm#~&F(pACEctgkzt+oJsc}D}Q+xp+w-E@u|(yX@gO-mT) zU&YBMoXflCA+TbKE>FqvTT_;CVHc7SVMN6hzZd0!bC0gaZ}a^-_3}0+%k=a8Aa-`F zLvNGQQUHvsMuoBMo;*ZC>xthVFF8^yon5%8*8q&yd1m0?*^$pMpJiOQ7R3 z+sWjy;&S1aafcGRDcZNdz_+=Ha3pKAyO?VVETGg3Yo;_1yR-abXt31B0FJd_@r9Vr zP&Vpv?T)GN8;+H}_p+>X3!yi;>8U8m=C~uiJf=(n2*&frK}5=l$4D3?DZoSe>w_I5 zPW6`Hem_CS$9dX*YD4CBg)SAML>;wfr==wioo#k88Z`}Sz zBa9e1Iwmp%VT8cwl3A32fJm3p45hmT1_(+>qo`j|N>G&U9*EM?Fc74Mu#vyZ-*Mbe z?)wke9(?xMb-m+to~LKsXGFushg)KcJE|5yZMmssxIG6*)7v~(^s;T?GW0H_9IV#_ z1RmJBF8=%c8EfUtp8{LB+D)0Ohq{JHPwE)Or-^UJjGnf??|`7VNO{juoOf2JQXK{$ zMZV@(t!w>M758Gps=PalQ|mutuL>3_-qYBRC%<6q$7XYdqR7dc*1P1y$|+idxbiFv{*SkvH(itB)gdO0+&( zUUJP!VNg#g;8(&vcWlu|*`1_b9W6_&7A@wO8Zv?kf120)+COC(PIakok0Kkq^XnWU z!(o#Uis%aNVV^oFh65m}Mb3lGEsh(E6j(!+9w|{*yolP-dfN!`@!pJEZQEwiXIX4L z+hHrSDToY*t5RNDH5!aSCaI8bPQl`tjN1>-#re-fmkxc7>yO1inPHGl@Tp*D%OnIJ zVveeDi$52O&)DuY(5KEiaIP(@dHChm$>9u0z4Qa3T-OcNYBtF%dqkr~B6as$H zo62G}qO3M_+n!cybi}K2=zG?V=z|Xwv{oG#AFz3aW(U&wuDYb@8(YRb*3WyD$Uw`>NdLJ-Ep>~NrlG#TF<#J zVT88@4mYkP#@i_uu>_y1r^j!Tn2hA!aAPO~AoqsSp@@x_MUY;NszCJBOV3gQcbO z-~_SC5Y9Kz^UWw!zm-AF%Jh^$TM@WvA%2)W$j5I^Gd}l>y}RQF@5k?v=tki&#AO?@d` z)U&;&E9rX&gpH;J+u5dUqOelK#7^6BMMCk10>PwcD{r;?QtHJMuk$a6kfd3%lInSd zpczS2Y%%^PL)Mn9a2|F}b;3UGK8 zRWkv$-r%O;6Zg!Y+j4^B-=CpJ)Zi2D)c3wtJ|^iJZBW@ZU$L|TGG8OE7H!pime#TY zdv7}hUe338+Gcb?ZOAwsNFBMquW8cLJxVu9ag<5Qo4?ogdX@9P@XxiiPv@WdD`@3^ zDt*}7D!x!5*D9$)URtH2=vr)tZ-@R{=eGD)(F^1SRqV8=)?!{Hha&{X>Xi&`E9$K9 zhl^8D0WI*28N$Yf6ma(FbC^o6rl?@mDTop?znSZ0U=Q_A`uN0$dNug=z|rS9f{R0q zMF-d@w_1W2m}%bf+1GfU6**t?mlzHRR#&f|5`PSij9uYF${TSQX_JGjhd4^J!l4>b zziP@(dtxXDCg-C|ub0{WNARY~>lVXY5z7Ph9Akw^Z*R4RPq`HTaD&w6r^zPiC0hqj z$p<(4W1-K+;3oq^nPeNWfgnD^&J+sauU#%9aRA~@2w$_$*L6sjRWcZvcuA0Z#B1Md zR;&d!{5LulL5pSxBZlAn+B>YDzv9A%n4@p+xCmpRO(`h=`!a7GWs%5YYKQNs0wLW2 zild5#Sxl@jlw4$JJy>J|K4ri0q?zSdi=UrABbdK)JWaA{S!3K>nC`*nI6}VZ&TfTS>S(#Aji)f^K^j)HMN?pF|`*i~9m{p^OwKU^1U9N>5GMpSNSb zhtfd8g3ipzZN6=6dSMzb6Fb$rH6iG_-+1N5WJ80Zits=0(yx|D*l=(k385Od=K#?p z-z8|jzi&Jg)l#?^LZJUan^j2_WD=k!r1m+9hiYz>3SB{A=ZzJZd1;Ll%M@y(BDHPh z-CO*;C!*VZn$-9c%2APd@C^2#aBgFD4#E@Jd(gRB#Ge`mt&ykohd4MOJH(}R85gs< zOwzmRjhO7g<|k$(1XCALi~lKYvKT~%Q%sIK>KBHiKPZaJN1Pa+DnbCImq%kJuOaxYtKAtH z#^E&+XScXGPzs9eyj7~@KAj!P{sFOcczEtrC$%Jj*Pe^I?J;uw6)A-2rzngT9B;AL zLJDbxq*B2(o+^o3uicL=fJ-K_^7Npfsq7&T;$YgVJVB1+uHRQOnS{%6)Gjzke6R`a z;N=!gyt)bVo{vLvWd%%>7j^c_NRyUoQ4zkZlXD01>nm&PE>wUILQ1zzTL;_jR?Ldf z%v2@FP+9ipb4Wg0q-XztR=UxLll}_aViukAligU){hN1zIsMWbR4|9Q!<$x$xTp*O zE&y6TFO*3NtO}_^cLX82u+B3kOcq6Oia}O%c(yFeL{!E`saOUhq~U@hXynqL|KU8( zwr>)V{+z~Nd~agQ7r2C&&uusFsnZ6vNzqbIzMd=vt`7`LOWi4N%bkMNoJ;X`CAS!n zRGzgjWOR14g%;cDjQ5KziJnx>RPGcCWiL5ja2NVb*aw??4awDCU$Q0i%qZ0>?R#d4 zj&ux_t!W@*>J0sPR~2_$z43w!pK#4OMMZINzHJ0vW$86jDL4Eg_;8q`*;e zz?7zd86L*$PiM1~Zn=z9(NcGu@)NYy3h?);v6#z0!F&lrf!La$ut^SV^g>At4AOSL z9(bYv3=QnT1qs^Gnn?v!-xu$5g&uq`6?^8*;jY2=LAw;pY}rF%brp zzI0|EQ#|wAu|34-6*};5tj_*H3%>(F;_ZDj2TH)cL?@{E{Ig)c?|GU*QJ0NIdm*AW zS^f%09bqYX*BT2>8kg~b&bZm7fw0RlZeoigbXCTBzIau;dbcMrMW~nFIUi|K8utSm z76vA;Rj8r2{=J-jE2^F1e9|csf`#hXjD(UaN^0_${M-|VsFz`V{Lb1Xo>IY9CsX_s z&0$HJRz(euNCcOzLE8EnHq>5532X#EoU&H6dTDm0GC7=(rI}HSl~mN)Z%md$;ed`0 z?fbKe$$e>{cg$xq{kmKTAzw`i6~TH$h;zRi=9LmrJ62#jeNxWT^d zy1ga`&!E>{US(^`9Zrzq%jZ6vdtoAW_Gfdm6P%f{`a}9JhPN)qj}1R$;!N~U3a7`r z`Nr#Qw6q2X?O1IGY)88U$QWC7XIKW|S>7~%U91c2*>jKIxEtQ})pBC5VQsjR&Qeh~ zX-|w#HR#o;f$8-Lh{`kVhf%RRC?@Z-b+;y_iy@|X(B2MXuzpd!Bqy_)nWmq7E^~b~3pSHL` zf`7nzg(kHWOns6His|vwk-tO zLLuY`azdm_1`V&pE|BsZzaMn;4AMgbdxsIsT=dMtiOVXwJ})}>pHE6uQ1l=e zp?|Cgqgjd?-^(j8(+L%o$9 z)>!cTv$_`)mBxM0*Av#(Ffrl-jAdc-jZ&0FyR30^^?Wo*3q3*BQhtNU%gE;CpZr!g z+91YzbFH)~REMQEtlf@_Zdm*OJ-sjzCuo98AC1lP$%h3#(UU)MJ3pTLkcHn|M04XR z{e--MC&Kh`@z1>y+p9j_{O_(5 z_z2D%ee-!WU)OiMBQh{k8a{1;P7=AG@~Qx?)wnKyxB*dRle4CULv~pJs_pINHH2UK3B-%Y?fmq-j7UYf)@7LYSJD;vTz{C2Zl!aE-_Zg+Hw7Zlu;500Ik3o=zO7|EDs zJQ8sU_Q1pj@mNsQ?&eOBQ1@PNtBTB#Kzt$}fr8C3YYTT?ZUfq|@n>qH8fT+%HERmu zNXMA3g+;-Ahv*d*d^|Cf<}6>bV~JveYk|y1C!ykWeK5UIv11CXDn<{RkuR_xkEHE9 z>>NlvPa7FZxcV39lLAMD6dFuJ!tT8}WO?I`f@j!4_hs|J{Q|D>?Wz*p!>486&v+jx zdND(2lH!)GRaOL1>|!vs*O_>GDEVPm$a6G6N9Li&FD=>5y8OFADp(M;g>_(qEx)o( zVr75iI9MQA;N!s%DpKfwhDd3+kkVo? zhgW0RD`T&?&B;Sosr^5;F0@2;gTxJu?MW~c8Bw1|)JE)zp#NaI z_ybZ|Dx~VNr3Vw9J51F&3h5a}@IInvpx`;O5H8k<`aoB{xW(@Zmw3kfMbFtl_8M*p)1y z!w7`QqCrs#<oMjwPyVQ6=Gg!1nhjJ~e5=a;4^3c^NKz-q8sCd*LniaFIZ{54Kqvk8cQI@Sxg%=3Tv8^#E#IaNA zKTvbXH*fR+97WWtFAd(hHM&)e%&QS8Ple)S>%|P0UFFpolwjH;&?j!gMk%e``@`eQKc;}=;FX|B^oDmK^E)SPQoL&-`-drCYHLX8ATz@_Nyu(Ao ztT}J7!meAbJ2B5PQC;g_K$ZQF!usvxKM<1#?H{omsH%nT zzRnblag($j4qcO9gI#{?e8ppN@h_#oJ;+L3 z@A|7+G=D>K{^iIve{yvtRby#NH%y=5WJI>v4Yg>_kKQdBsiA&L(>{Np07juqeu;%_ z+`5qa`gjMeDvtvERp@nd^9qr?sB2><| zd{v0Q#fc>Ixu2Ww_F*%n*$2}+`lRZQVEx1}TUS7|dZC(fN!LbE!_*BKTLuCBGupk_ zv}0*^wSK>B$g8ldxvKc1ww9hSyc@*q_U0vo0xwx+!QRP1AqjijmqLz&(y_l;2uYt%v0F1}KKc$?YEp8JLr&AQL-ySXMF| z>tOZFFS=F$#ckyOfh~bhUp>aL&JfaKAYGwG zZA=PDsEcq&Tyw^2$`Hr$-Xlf1ey#4FXx*_^ZB7o8p;6NVlp2TWl*W%K`}4uaq`qR7 zAk#f`P$T>qpctUA4`cVoCha%Oj$=^*5kL4N>fu@J{*g*yfIgRnBzA}bD8L?=s_D`7 zQ+->&GE4GZkU=?g6%+;Uygf z2Y?7Ort!+=AzlWDGB_H;pn!oqA+1s!*Rnfh$13_X*R`TQDyW62PCW_s{y5|v ziwR-jRq3_=$U{*MY%}Yf)%`tLj+?K&T`P@8B5z%y>|1AsuZb%O}exqJ&jnn%@|Q+j&GzspY_ zy{xobtV8o$x0aip|1aq#{-wo3&65$$UjS1)B^G!x{nRUCPv~sSqrWU=`_-^_`If;f zpsYy${Br^7$Y@Q{agFakRt#fmf*W>=rSUlV%rpl_on|)fz2=(CZ>rx)I2a_OD_sM6 z5;mak{Ew|qcQdD;eM2m9r!|y}_{$<;`GjD4@dT%pGo>)1(*1jX;H}tOGY4)trFS@o z{qAw+INu4qb?*AZzxd;R{6DObsM<6ls@Xa8fOa70u&w0E>X?JvMEK9bu4^0|6gy`H zM|B0RqN0tv&&xk;S6m=;$A*z+T+)8Y zQjA+}>G-B#)BE~DXGeSO;EOCMaC1bI&j{H}S`F3M(UKmCEC+T*)X}9(Y!h*)=*u}Z zb$`dr>+d+W$`Bx=4@UP6PCwS~q*sb)UX~J?n9C9rdfUC#a#%E=EE`QO(-NMvhf))O@d!JM<+A~D3p;4yo>*dB?r+fD`!hjri6Vm80I!(;krA+iBs%76lwIZrfN1FZEa_OuY>bG9{IY6 z{*Gbur2S%k@WIN;1)#d_)zKzl_jFr_1w~%W2wr6D?CfG3?dqSqWae!yTn0=#z8=?u zDFwz;o^GZjjYdjzq2XX=YWomN10}XQ>jg+DibB+GNnVn9maB)0-<>Xs|C`S($rxmh zM668xyzF0!dj^01P^A}TkU`D(jK+OJZ#2ZFq|fbv?eZ%5ot}qY#w|ZJQ#{syb~l$j zpzbSvH-o9LO9zBK0!94y>*Hc0`BW=8H6Hc^O$<@tX}eC zo=QJ1CfvA=E%93PT6D5Ggv7kK(qfMKb@$qSD@j0b4GhZqovLpQPS>t8xg+Bz6Y8v% zfCHAdkIyY=F;fJ0fSxZ-lYkcB$EGVy@s#$#3QJP{`3c`Xmw^yG9K4{Ebm=9JL{I-u zjo9(+vWFSb2+^$->Z#XuUqI+ulD6%puz+pr9t^=FZG8LT>2^aAtOyOdMoQ6)}aP)+Y>c0x_1o zdA2k0$Q1uU2B>|j%C5#U{^gRSlb5`9x3H~pYSeD4S9|t`AM$+s`*r7wd|9VtvabK1 z;E8yVa@@uMhVKqv^hW!H$hIP!jz`%Nm&5daY)O?kLA(oZ=;i zmTCnX0Yl%*D+Ucp!}O*gquz2L+aB zOOR=?iv1m^D{2{r*o#ubESOWHHzT)%@RT*81FEl>o@?=yB#N{}QS7%uyrfiuf$y>m zpNILY8RI^?|DJ18inF#(@i{j#Db4@2=SR=C4k7YY5(m-jAViW7rE7a>b@0RdUwNfm zhcv&(_hsvj6*1321>)FZOaCY4@VOd$P%J7o_pMd|lhAkZt-3<+(g(#HSRM0pIwn_G zF}aTUxg|*TvYzl>5Ah+5W7HnUF^+03o)N)19Kui6%Z={0 z*B{-``dMtaUJt&iyku;$_7XEnrQKe9SMF8@;Ev&E3Z^A%2kb0dk=46N-7k6(AvE7p zEt(YXbKYqYUmY^xWq(T7dfvxIj2Uta zt}-nvwY+E8HZur0I`tWQabRJg2vk*wI?j@=HA94W~xc6F^b=SZlQK z1@7O`hF7u03J!tH3!^iICAz(s^oX=_34ac1S9X?3YYJ`>GYNH<)%b@m z?R)R7otmA_gdF^m8;ku@n6k4R@&qZ@&NrMKJtsliGn*I>p7bU0Fk!!K$eVYuS=(n8 z(H+V@J1LIgiU2`K1Ud%*7ZKrBP-fLv=!|E~JnxsO|NMM(BE=~xlmVIblSYc#DZYF@ z!jh%DTH}6SaLkx5ysa6miCl6@b64l|9>(JPjWf8P%c%)p675Cw7PT$3t#@LDdF#G? zTjxLU^k)-GE(3drYotg9O@>r?Ppjv@u*JPeF5udFrS+%-$$(~q*(Ex7U&qO6_Y z&^qsBc9A*Z$yIvQbEnGYc`-MHfJ6#pz;oE!V0UVERnN9xyvpM$ zG)8-`mDIK9U9@#M^4@xv#K@ddYF*K*am^%%dg2>#3mACVIXl0JetF&% ztT2JO1jmIV)Sa9Ls4(0`m9qG3{}qZdcNyd^^iq~e1y!1Hh`h0oDGvIiV$95nJZ@bj zo~R`#Gs1&7ipW=R{RcMF@SFLD>kKG0UjG-|e2KAfzrixtjvh*G84KpR(=;m+Ona!e zSx8`z(Y>lz3dXqLvi-g@Bnxe}Zhk&UVdoXD(LR-{YBMp7eip<=0?RdV!1N<6xl}Lsze|17jcEplTcxD--ikmV-lA24x zqz&jWcl`MQWe#?8s^lCXjl)s)l4R>IGvi+^W}74H>EBwOS3(J<*n`&{QM9%4cFcDp z38i^z6{~ZO+ylJ7qS&5q*9#Q?atn`bvyJdiE(#i~rW`bcozgli4TaCX2+OC5r3?hu zO`M=wd5h7DjvPSo`rdJh>8-aphUQh%&ik3hnmTP#m7fZ@O7e;Lq?8HmWpw@7F%!!1 zSV?%9sJ#2wm$u58$7j|RcC*piY8D60V_HP8F4#k$}7^yO^D8beV;Kkkuwh1*a}?aTLgfwn7JGr~i_H%PGP!9Jc_)!BZ6;RD$dsIB*1=hz zx3;T{2iVQ~E)WVL);`0_r*iL`8S+C`J>=aZ+g+?-Po&<`oF3Lx?&Ct`!CH_*ih#Y& zS>}soa5pOw7Ei|U!#aMBN~!f64>Cjb zfd!&$NZa5F%K_Gd$wJWC@S4MfcXd5R4{FA5vwX(~7`gr1o$2KNu$ocu}DzrV$ zxR$Po{n4YG!0LTfD%H~OG%=vFyUXCS8BC8Kv?Q?IqR?qK{ zESc^{HKQJ(jg}ghJEvEW^@@%0NPYS!2eF$Gsp)4E71{U7BvwAerY;58Gg(_(d#XLl zMfdLc{FL0Q4(&_J8V&H(fsL8pbSfI8r$f!_Tmq)>dS2glpkYduuY;MosZbA6Q=kQG~F_G zVPQ@1UqG7pL&v(Cao#+=yjo=88<&>kHgKf<2eXg)(`FpV73rC0_!q&slS+;Hx_et& z2{g%~#XD-RK#BfLUVhpYk+Qo;O-o?9sTq`J^~JnyoBp@Zaf^@?c5QazVe>if8Z+ta zCqmGNygL1~<8c;~#C=Pjynq(^G*$nLn(_6`Ba@BH*S`Vn5)a+=$zEC-D)rH*8{XB& z^SO4@RTPkYhlZu^9t7_%&iZ=skGzc^k(o(t7ao^0`Espa9Kq9~ODL@P$h@=89zGm8 zn%5pLiE{OMzIZ?f;gOiHc6+-!xmPk$v@GXWaxPnFg0y@@2>scp+FU{v2qM-bV07eX zz^v9zBIF7CPt{nPZB|w!{9hfX_8=%`Pz+Rn9YB->X1|o@cJ#CjMGGBxRwg5ZB3Y$Q z;YKrcOn*R?YX=RF=`OH=BFUH2uPqcQyRB8f>9eb(XeNdM6AF8c0>7tdOQV!ZTLiz( z#MZ$LiE6%+zI>_J4E=UY0*dimIZQ=>!)^Ji}GqxWia@XTWT zO@Pi#ze9K!0V{eg)XUvwqDo<}CfHT&j8|E_%#!B5LPbLQ=S4X?m@vP69L9HTh8T1aHXt;r4rJOf#5s1wEOr-*7CTmAP`SNB+R8wK)x8Pf zLscv8%Lu(QetzYcR1+r8Ph!r5Wc+4aa%zbkX;H(0Iws)Yn593r^x?mMJo1U6GGJ!@ z6{-f$n#JfFxvw)t>CuDUOcBbO2ZYB@|6N#7@}QnN18)Rap8MJ87)456{nFI%IUZ@! z1{_$5QojE_II0AxRh?a;QQT@5`RIFkB}98WfA9xR3iG~@_Y@W67ZS?nu2r=~JRJER}4!TL9?Z=t$ui9igtUaMXU`+d9MqSwcUD>80#OCUgNloA_35&e1BaZ8>D^KaKJXZTD-ct#$7zVY}z8Q6dr(qDIu$E|jO@?s)W zPB3K=G}-@_BxE8%7I+9XUFB_~-hAko*+u{bna->rq(9H_jo8Bwpj}DtIS&qQgs4hn z=E0|m09jFn>G>??xNs@&8f)Cb@D?6mTu9^75M z18T1I%Y2rjA&O5Gqhp620tH1!g59)+d+S$<{0h_6xRP6R)P)p0f`9b1^q?Sffj*+Z z&nGa@f?DA9b%NPAoI-w5;BzwwbjoB;g?&kCC`N)#OCm2H$U%YT1r#k>LMZl0L+Hz4 z^BpJX_)N-kRFE0aQ(Px+gI~`%qR0WA^vs2#qbr)n`Ed}>%7B$9hgIi;2?y7$GB5HnAbE>_TARjeuV45UQrWus5&B_tp?X1At0YtdY7phXucRAim;jJ#FS1=p6RIs5-?DLS;i3U#YIW%{KpG?)0M@lPWipq?|ucA{M0!%RAz}<`RYNnmEO6hW=a#;wL6uAk3GKE*EY&& zB1C5b*FO}$uNHAI;Eny1Ki|;RUXMDH&Z^Ya;u}{TyoM^92RcZY3bYwuE{RFnJhi(z zyA3AepK>?sL|QY3UG8vjvr=B~OK&c&;*K7Yy%2Oyf$zGcv1nzjyM0)gCIG5$P=5gu zCfjI!82p0PJVl%%qMalcvJ$SA5i_KwAk*NrQPkpm=zQ2YEB`6BSlmYyjZPS|3i<#S zFmx-t8bb&3(F}Ss5hZ`d^O+z-=M1{`II3}A(#5q%mD@Y4u=FL>z(MYy<+%50*AUA~ z7jNo+BGlOU2EOLhrQ07!{0TogJ*gaMl8$Yodm?-uLC_Y3%Db;jMV0MLv!tWmjEiFg zj?E*`ELZo=-2oxooInN?Ll~sd&iw01bKJ@2=?2#%Y?mp7Sf3hMBgcze5+Ws_5eO>D zW}(x0A!%22f)fApm1A}s6Lyio_Aq?9C|xS^lhE0Ykc?bHWlwyPt-@%1QRlaB1GnE4 z^&PooxRf`Y22PX>goiONK zJzx5%saHg_sEJ7Ii*Ei6 zqj~380&4Fjpz=Q)b)68~ekf-Uth?%;L07<8wm? z0)mFRkZiB1mJ6YOB|l+$LBs*2#N1IFW7UFEufto$$?gY= zNu_`OFv4J(`}UfnJtZr`?bs+mM~~du|CU#B@wMJ^ClLj2+H|_jP~XOZqoc$`Lw&uJ z?d9i}^h5?@wtGeUp|Oo^>WmR|AwYP2aY^|;(@nm~eJkSmD#Y|aNUz`*amd>(a76&0 z`=>gO+eos^AFKW2xqc}@!;=%sDIe(*;7 z*GKMkmRy10;LNyP!to*a@FX-L)`xl}L^D4nhpo7P-}@7gGnmBUa}a*Lr(FE)Ih2E( zRx3@8LjiW8w`*C9vswb8_vm!>P6w9fvO_&yz%b6u+F(-XeDtsO15I?=#sLY%<;j^GDMx zFFyFoL)rH!p}tB^5cE!@xfpPQvWX45LB5E?73{rX)K+oa4-6=(m3q?dc79BNkQ&s_ zm1&aYcsVUr0<54(X(yuSI+k|lEZV5Hki4vYQr#QQRI-Qd7I>{s`-fWrkYv&=4MkDM z(Rt7;P21ye(^=o*k$4fG_Up?-pwW2qFg?Xv1KF3zc&&=xVrLtT<4PL?uV+HMaWELh z{FB{<(o$t$dAl#GDW156Ke!XA25tqmY+Div2W-V&^f^YXqgt~yg38spjB0YJyGU5J zL(pbp$3EJorL@`l(du}mqNe8V z+}ro>4wicYY$9S{Gan3ag5R0XJ6UNeexN z!8bWJG9Ko>@}Y~_vq!u#G+>Dat$NrTDiPGdW1&r3^@hoIU?Kn9^yGTb z!5fRct{u1t5%Dm*N%->jL8kSDI>=XjE{Ur}^Wh|!a%X(dfbvSsQ#Iklewr~iNSfwI z&0r5UjVWp@@hEPjhy7&_%;}d09dg90fd4PggC6FnqoqbB+9<=XQHt9zxZszUMdxUv z3g^%9-0vE3F8bcW|5XGss9m^JRh+accz;p6ENA9XP3Z5}$q%_qXGaplcPJ$-cI?`f zZ!=HAqoux}vz=wW+zh{H^(Za8f%!0HM;sXFnQ&bn>A7~5s}LcHX>D}gj8b=A#S@5w z%EtbBt>&Hem@Z;|iDm}wNbAm{E~Y=Zo@QGdza8Zlq2u< z<(so11SPW7Y1k9yqIq`CFHVls(=IFu1<+@RA7xoQ-#9;V-fEhiRUVvSTRQq579ie| z=cQo-Q>)|rN_EkN!u%`(cOtSZj-O)r zEu!gQa=U@&{-r9vFxgt-xFBgIon7hAKdvd9PGgA3)2fF#5|PA>f&EwKqwZ-N$s}vc;*4NbhNDY(j=%6V-rc_v~JSHmIRCu>Vv zyvo+ZI2%P z3~6N8Gnk5Pj%*JBMX?ElXU2=(gKFWNllJbBTew7f^UJokso|YR+jiBEl}YjROu%q zdQ2{s2dC6fs{PrSvMrqVUHPrI>CVw|_}$kvc;HyaN>0YL^M~QI4-MkaH(*7 zN8?XKN&SP$sA2?zk8U?Si0i7P)nPOSKOV98i0~*4`8SBsX24bZ;RJmp{RSkf_PIoe z-kR|{PFP;oZF>&+ja$SlQvP%4r<_+>g|G>^g$}ZM`DgWJAIvU|2f%W~Ur;!tj{O@C z$+%6`>J|k2ZTRq|(0x?~15xOFdYcm_#?s2$M>KNGCI7in;23_d(beczQ%3~0AYdOS z0KxE1Y&YMBhTwc2#fmG1dd9W$*_uynMlltXH{3*zSr~lGV&|>uA(ivr##+ES@+IE5<2iLHI`#lxQAyu6E~t)n*VK^tx3lQWi*9@2Y06Lj2L;P7$E!-BFu zp;zvmR;qobuRUc3CscKsPY zs`bX6*JsAjp;?AR- zPdR=`(~}UiO3m%GE_bo)l4J`Zt5S|?ics^td2hl|jt7pC)A&OYZHvsI}`_=Q?(g?7rbu;z;@=y>`#LzS3mpxcR#*fnN^tE0rD?@ z-RHcKo>JBCzk!t?xx>~ACKt`(-(g>xH0~9h{FN!3Cj4kShp5?~*7a1ba5gpwn!f!T zS+?@ZxMmz&tyc`K!nv-m!UH2SCv;0whFal46h8e4j?&yk<0Lo>UjJ?BtFqK;5uX?V zyv44k`dQhxoUWrEStt38BUL(f)5^KPT{yVWsFYxOd-C+dvaF~g6t!#9ut@IlDtP#F z(>hVOj6V4->P*oG_Dg)z3E?v1)MhMyYtz2bsQoL$_aNF3mhuL-)knuGoY_x)q+{>H zenEu!q{FrxVOd8RWY0E2&D~YP;Nq|9lAp27dL%)1mzcPN6hHpT885J3fc->GGtSPW zfCTk|+3;D)%U|lBxuW2@KpJHNU+jqtj~uYFSJVoSITze6zjbgVu)MzGcVSUhh^`6S zZrd?P%G2$cdColvR%L2`*&kv_DYql!96|+XWHsq;4G2OKOF)XD73s zqN1k&iTuxf>M=$8z<|NIOCh`z#@u^(2#Qi{YjzY*2r@qyNPX_6uPyd-u z)(%B~RJzR9XaP8N42xI$IeYvYg?}bjVE0TI-qAu1oqcOM`o_f*xh2gG_V_%mNwXLs z$FFMjo47W>eR+;q{2sOOJqf3qLC)AMhhYqyEL*+_^c%2ZbYe$9p;y>Sh7s+hb zUD(|rOpkSrscFep^5xUcx?*0-(=DX|Ax>_7KG(8yK0#CRVMYa~D=Z$9G>Vt*>7-ls zM0AbA3AbZYuZON{OoI{~Bbj?_!mGGKgq{jFbEUcJ$YhTx;>6cbY6y zpa3;k^`Unjgt@IiLPZ5X*^Z`O(JA?8-lQ}(6-M%Vnc25AHuHIzSQ_BZXYg_+?Aw?o z`p`4@_WA#4H%jtwrO7VV`Ui;6lUHjj$0X{E2=-n*apc=cAwu!aZ{4%qojIgr4rkcM zqc{zQ3zCnDX_C@X1P&gS?f)Q_yf+xTYqdg^hAUAXsg-;32@7x?4wTwEF}A#lSdFoG z>5yk-LSLV!*kiO;5NlX!M5&OSc9|}#nr>B^&c+~9`ke$o)hK9T} zNt(lg`gp##JcQfJWsS6F-d4&tzvE(iqNc$J8(^&d=VxTI&>lV=#upr^_tR|2dBHId!fdD?W4x> zH5O$-gl0K~*#D#HyyMyWqdp#c7qw@s+O54w>`}XvQiM{YlqxkU5=E_=rM34~MOAC> zS$otdYS$i#7$G4~e$VrI{!Mao^F8P0d++O<_xXGd)L6s|?EbE=UU%y`RD-gz`?=|T z@pc67rlAdn4?gG?D%xskERp*H#ay&Jy)Up*0>KLH9=@t(+nv4gP$_rr zh);E2=wJRmIX;#z0_yPwL+}`l)pV3TUW|PkwR7mg3fpK_UzzV&uzzOq{ZUk>O>;I` zp7k|B+Yrj*wN63ti<9y~DVR%aOteyiQH#&nCVq63bx*a%_JDN>o!|4oDb=no={hvz zthPvmw3@{@d{-XcIUT~I*4a6K0>)nNPf5=0T>@7J^>jOLE+I)PoB!@osQ%;(`*+da z#61Or%m6vLxR{F9NKU5B9zHR@8&zetEG#HS88UeB+MaZ%vS0iac%jnjr@M|(z6@u& znpJNc{a?2P$y=|cFz@>LJNK!1^Ils$T={)4#4px~H;R(Jv!)bsEt}R{JjEFbFrOWt zByyEL;pgTAP}9nO{|=b=UhK3PaVnHG`n>8mB6w{lQn7w*w&6QLqw*Rc2BJQ|PVLj)iCykCVod%1aUbCUHde?^VvfWsUUHAqqszJKc*$TPF}N5*-;T$)uNppLOP54LoMEE z%Nvn;8KwTR;N3O#6pZyKi#HOtyjoZ3^i*%BrrLQqI1i$moeFZtS)Y}_j(&kp#T@q4 zVe=xeUFzHDzTcoda{_)q04ps?(d z2kE)ZfwLSk#Bnz^Yg181~2VnPS>wPRatxAL@o;KCO@P1SbM@Esc zTqw@@z8!Pi%Jn{*zs{$>I6A=i*F0lA(}F?=G9fYjL`_8gq62PH1AfCf6fJ^_`9UzO zBOH~Rb6K213*BFlbKue2#^EPY6hs;A<3CbasB)`_HTNmcoZI-ytFL0W6%4m%vAg>7 zj}x1P1yx>{PPx)%H!@7#PPi8*+y*9;K+9_mA^fc{Q^lefXnW;!$nH7^5}bzd#>;Y2SNPf6 zC&6V-TdX@3PA(-sIux#|UO;D(Lx{6)ynspzM-Y^L=OyvY@r}&Qw$|Pb5{@||b2y9o z_yVJW&2ma#KD3@zO=F&3HCq2v`B)3lfw$QK-u|P zHXAd*EjT_J@pG>ee^EU~(`t9=&U^C16V0DhgV3qg@df{I;6Ypb$*z3caM3Y(rOrR* z_SKTtHW!{}v?!I%GWcrT&m&J@Ej>CAJMY~tG(L0QycWz&pGrbQHiTR%_E+s9ih$e% zZLC(nQc8mV7$f366S*uGRAf&7R7i+VL;08+?T^PtVQGk>YTxx1!u@NioI@ z?*>_cf6n18jml^%BP;08xzEXs^4ni!>zhS5o6uYT$jJac0}01r zAh`X1=5iUcDBQtf~dcQ5td_8O`RRu|J`o!MGDTTPwV;J;I7K;Aw}O{jKi0c}N8N);JbE9wi>KV1u9U z#o(GDu#-5kkl94#7v?ONgEIkeFKxeukAo-mekh(KC2NFDW}(054FZw?WaZp>l7aF< z;~T^yDe5rRy!O!X161(}%6av#ushFPxzY68bm|ep+626tM)>ML^vPuT|2hSp!Ur`mw$&Ixf8k7JMf+3W;%~}cC5y1vE{1hQX`eR;SNT(+7pXYPuULvqjE9tq5v(`xIj`xp* z;y;tqK*lT-<(ac0=jU4ul?n3%@B^9g{yS{2@6$TSBLACej>{SB0e*tJ=UvR$_ch5V zc~~;3$1MPg)y@Z&n z)f#!Z`NnJZ_L!fuJD#&{5vckD974#8I5wIC6}l2VKdtww{l;Yv7yacpu!a7as>4&Q zlD`K>(RMy(x#cx*g|loQHfkB-_u=;QEm}@WT0Bal>u|e-bnSR~$q$vE>4L04p#qpGh1X zV|@vY|5vPS7A~x<Fjv^RN+Kmztez9{0&%Iv7gIEIy6JO`WHUDZB&l*|D z^xU2{mF^#jK7r~2!wPbO8mGrm#;9NP!C>PtwnAVc0AJGlz-d%IGrs%>vCv&Od+|eQ z!oxX-U-cSqBZVKoOS9gZGO_slr=AX%E%W4!FVgG3_gZ(dlLQh zRqOb05Mi2ji@O1eLBwhgMh8P%Rt)EF)THGP>Mzdap9CCN8}@g~T+@c4({=JQZGatWMXxy>aeKltZMTulf~*kCo@KkNnnt9NXeDE>>{G!U0{%a(q)~7ym1oz zKLE~)JJpHE<=!3ee^pxLT;>xvC?D^lb3e4-_m!*%Ud9FwS+Ksx527eJ@#vL2D2<|R zGbx{8O&a9tP>NGvbiYaA~Y=lcFf93OE!Dc*vq7?`q8;4o zKN}UZX@A=MtN}l#vc@R%!w*bds;K-L7PUQ=9o5y=nvYN5CVu*bC|$8gV}0#Ul5X*T zJeK?9@LVvzyQ}k-MQU`fQ?yW&dUIppJ=K?Op=tb4LzF6f%4Q|}YBTtW1C>kuXI#9r z(Y<(*>KlH^_y{o&*ubh^d6G`j{l-JXUQq6&L0@0rso2qKG#+?x#>W+OcznzZqmP{x zMO35zrnk4ZC$uf$<1A#_1bm>}jle^8ci%XLB{N-zN%`xnw}jqkOo7%TV83g}l5mdI zOi_&TG(?E5_k#xse5uuIH@8olZq>IKis9GWFSz{wk&AFs7x0e#oatO)xbed+J<*Ea zd;2}kbvC3#LW|??>LoXS*XQHMd$qSZ(?IC9O#YtbqvzEsdMbZp-gFFx*i^W)Ck^I? z%G(u(UeDwov#O_cs67F{V`3H5vSxc$KaD^Bp|^)m8&dbr{6_{%O_B8S#!2(^2N?Pj z3~eW+^$4GLd@02It<`QY-s)*BB&w2{A2fe zcmw?Qzz}uk^dywnGGz633x}=E#6KW>;5|OcgYEy zY93x6DjS&;^>Q{OXcpa??5cfs{3hQYH+<4c*&J*+bV+Y4vG^Fpd$#oC`TJWO|8+#; z%G)ogTY>LW)Fxtnd<>NP#1twoePtuf>9^6#x{9Z3OdeZD5z0WXx zRE_`MiHR9U+e{f@Jp%3_`!=zj|d05<)UIIaOw|0M%e->i{=Dd@;|$LiMG9l8V^ z34Rhlx;(?es5_V2Uwz10`DC^6LOb@O?S6{o)}!>^i&3N(;^Y5b z-%{0*b*QW!Xyu|kz>)&q>AQ+0_wLxZ74CsNdGd;wUcr1ZP+M7#@Wt}SvH>n^hluPJ2T_=qb&aB581(4VF-zu+KFZeCwg> z@XhPfo0s!7_A)Pv?kiT%K!JiHrEFNcwxB8Z0)vmNC}EEQJM%O=YC1Vm#gAilg+EdeFvZL2OF#zYi0jqEXF{RO&W7T>=d8!Gy0T&nM%Rrk8kg zAlRVL(7#UDj?cYp(Gsr!imr0QI|mt4Z*B1cdH5yBd{JTu-C)Rn6-guY7<`?Gp-?2+ z3@S-Uxsoup5EmEE2nGoNhL(wi3Hs!e9|ScsYZJaBb4ECldBce9{H(Le5+SivVF&ZI z*|%o7cI3WpAPRu@#(MmHV~d@Y*E1~hk?5PJ5J(`i^}lx<{`b#wRTd41);kzF^u=-f zlu~Q|Svk_*wWMXy{4MBxU5u$~Yda)Y<0jbiRI!Z8ubq97n4dU|zon*aUtG*D^EUkvd%}8m1X*I|_AjCQQ8ZQ14TynPa3r(i z#2LYLQ`VW4;ujUTIY7f7)^ruqIH*wW>*ehlTO_>ehSdApX6lc-=}1l9B#epVrO&*8 z;vNd0WhZvf;mb+;9X%UN7u7nF_s>oDnL>deGBqPQ4rL0`XH$=@ndbM z#PpUQbnn+J@4nuz3ziM%4K#9k`eSd#E)mU@g<^3bz09X`uqy5?YDkPp$i8-7X8SuG z(S|J{@XGIHLgSQwX6Rv`uwpTMBUXrWpgZ%0yXC|W?&A}r-Zj<%L9PlW-xx^XD7&M4 zeYAerleAF`GQa8Q+M-UUVk*)tP6>8x`|D3bu{~+Um{A_uHZ1&WeOBD*my|<99&D^?AJs$=`vvU_jTK$c?IM){hJ(Cr+k+ zj(C5NCilouY+@u--jB<7{dc>GKbM3jKP@kdM|jBU%?@Otx6*gkv2dNjW;`*0MOAzX#OPCjWeYNIkF$`!GRqCYdl8a{7d{?p=)QkP6(QtlSZFfOkLNA zwkK8TD!erGok3fS?h$Xdu0pV{b^0YSQ|$zKlX?f|6!8nIa2~%WiIns`>4bE)&S`+S z8igGXi9D(Goh-+Z^+9~Cd|c0z-{#gg6%WPfrInwf*%{WNbo~U|>*^e>x&)mz^&Y0s zo$0j&+me-rmT}w-Gc+_*R92>>e6&wQp$#wLx~mAwOFEL-d;gwfaK0*9+Cc5KQ?M-b;l>za`HHb0iv5=U(F0qk#cN_Pp!83ROgo+hSLj zE%9qe4E$(O&dssQT4(2JzF$KAHT_+v&e3`(-&+R&ee0(P;>jiygvm$p!jUD_KdE=e zO^%*Nz;XE{C*k=AdW07B6oWf$Ut)FoeQ;83&TLaHbTu)b6L?~#%ydH|`6&LMFsWw%LpK*8E)h%ix#(kg z1~XJ{pEuFOO_M!3NpA-Wg(pNv>rJcc4JL(>Y73OgmMI+DU9#m(q=gc!$++YbApSwn z;c0#DO=jduC@p>;d=e{^__xqGyyzPq&aM~QuvIN~vYYLUU_u_#CRB$R`5SjjuDfAv z3D^z{+HT>!k)HMqY!$7xtMon+=1#Y^O61*A6d2zaF+>Y2=O^hw$LFnHCIhG`0Nm&L zJ<;J0ws&^MN}hlcx@dzhSD8AEJFI@K;)EQ@QiBhN!HF_B1Hj5bV3oi>f8V#$ zh;O%O6iHqxTc<(D%St0m`AVcy;W0KNsfz%k@!rT=8sHP0rSFF`ezt$9#k>107*8Y2lh?2D6G2Pe_3BF0n!bpJijkA~+AiD4(l)oG4S07Ij4 zFgfUNTrElF5hk7 z{T=$udj=SCk~RcJZ|5e2ZXZnH*i#}u8Pe^0rM;9)k##9{My&~|I1BlVGa6_91czRL zr)cOc-ZirSNkbf*HU_BHK*X-?t$>ITj7Qxmo%dqp3FpQjG>vS5Hof64_f_wE!y$TZ z>CRU(9HBvWyUC;9fEyJYtESPu1=h4L+-JHTT=P|ayMP7)?)i^5pM*5SlcEbTi*6M-5UA8+O(TMiTew#Ws?kU0VTUS`g-{4w zf1V`L+=K2t+D}Rk-E%F->@_$2h--##w}Hybk(0qb)FF##2xI^JRrtqwg}AQL2E_CZ z6I@p&Yl?9f{dpqXG<^%Ap`)R$m-^4wKUC2JbX8p{QbF=e*&d6#itQ#$0LJnKz={Y{ zb9Y{%>(<=VI`N0bnH%n!HLILOPe*j7DOF)yruk=Rr*0Pb^2j(x9+&9}`puQjjm{*{_&1-Y7;WlV zx^yMumf^|UI@wl-3&Ra9parx7fvipb@dC9OgHqM~HDPo%@}Z2K7c4`crbz6wN{qzK z3i0sp{$e}M;M0+(0knx5u*$GKmiE@Wnba0d&-?~)x*E+q?(@kWUPxJ$X~{bvcKk<# z9>=isTwa4Uu%)=q>GXdND%Bi1-d6QwCHmEr2ipc;A(!nRxh04jg9)8h=5Qt1U&v_s4ieU{?cL^I;!30 z7l+FPPfhS!j?WjgeY&Gf%u97jud)4rN$Y&(;etrXoW5m8cu8S-2)KAB zNq>x-)?I9GdGMX!veF#q3TTCcwxnTYjy3k`WFbWbu#+Gu$bU&yugf()RESB|e3&P3 z6z#sh6Hd<#2{(HEahT?v1RF>xTVU|g*QR}Qfc64R2JwQ?yNcWys7rG#B^6}0r&8zT z(%>`qW#h1C($J~pdw%33K)lfpq~iY;Od|Aci; zC0hey#O+eQUuMKraZ&v`MQZ~EvCo$u%MHJlQ*L$seD7LV=jY$>+k6Ww5mLDtAP_YS z4SJSAbJ7GjTM=GQj~+k4TRiupk-?yt9TOmA146qqc%h8%uW23Le$Kb7{3sbO@SBoS#Ii2y81FRdYK3fZ-LJfBx)v z?T+?nhV7X~kA$=cGZ(!gkbst}JL(Q)lVCRaT#4ed4q`iF#;_PVJ#gWH;84(?DQjW= z;0|PdnzwDw=ld9Cr%3;Y;3q^wdVA>#^HNcKHS+!|12hja=CyZi;EPcggxpg!!1B$M!*M+zfyNsq$J=xVQ0I73 z%lVRVP$BI7qK(seg|m3)$T7L1f{_x8}YXb7GGH!A-W!LAsuW}~% zZ|9N9p4}8WnehZu(Q#!B8i4-!(&Ek6(D60H^(5pI_WYr|^o^50seE7KW2m@8w^Bm3 zdnwo7vwB+b*b-<%N@h$lSA866QzsOwA+-iilMhFqe^xZcikx?zwk)C|a$GF=4N=9SvYpf$NY(S4m z^Nb|9=m~b4-Cc{1_e$5)!SaKQxlu+#vPelq#w+#0Hc>jwXfpO#gL!%~eO?!81JUhC z^gdc+&=ih%K<&n)UX`B?SWZznG<41T;%&8_o_fhWrIPlr6*xwLytmZqa0*>7GjQe| zv&bR9mO~o;5uU!49bi>-<)$Ku-SZRbPC5(CW`+s21a#3?-wV8V#(i-86Yz(=fn}-w- zt(ZsIcQ&#WK)`&xzm%OrY=e+?S~J#gpQ2H;QM6I|`jF_*uYQ)WD+ll)TH!%&;Uhwy zc)ffqDtOPA%c7E$Zl;F}Mli3ya95y^NjC<0)^@P|&rjnYCXBC-FzLWl=D?+h!u032 zpYOuu(tHxAYVjUFPdg>gyL!pKSif<6i%vc1#P&Dx@FqwI+#}5lwrJAUDAVm3w=^C3=SK-KFoS}^Jr$p=l&5nylD3DL%=*Ly& zL8xk_0^1g+P4?YE{4^hsxb@a(9e%04Qz60Mt9~QlHF~8P=a+z6_PZ8|6)&cF%-?n< z8P0#HoY_CYU|GBty`L?Ad*TV(sV$I}I#qubi_^!AN{@SGIC05bm47MR1$v{dC96~vTi9zLFL0j@N;@Wh&sb_hu}HSns#Ht&Ww9T zT<{&AUepD4L`bJnbsn8`Q(m_juPzflb~nuET?`a<{e4(Fwx>fbS?TKaYjh6wnm|!- z)ngrg%TLJkt2uM@l}hhe-`d5$@tq0!I%Mb%vG!(d%@+ZCGEa8>{8ti1XJ<<&cJG9A zir2k4{erAv4Vz$VZC?pU_DY+pd*;dLJa~zb$c3&K-Z{qIgIe`k8>vmN^%Xdhr_jfA z@Z1+A6MlN68uaS@+Zx)l8v*G4OcN3V*nYS%(_T${@M-+KcpbmTHS!Ff6C@-vpJ{AE zzd_+^s2E^qwnEp)rO2!H&YN)HxuVx?6OxRpJOS4X{>g+8*6c~YRy8klBwprm9Zvt5 zyIgvopsy7`EJ|_|FTHc0>cN8@Zjv6-k1GJEvej#ZSk}=is7h6yDy#yB$Lay5^?Jf+ z{@2s5)j_5I!k~Gd@9k#`+)D1z!76V4A!nN_-Vg+6KCud;F==I>dD$TwB+XMdcFy-c zxpysrZIxlGJh5|0PRfJ`)D_FA^IztFf#(d?pHpFeB)7-zWY-RVF(q^b^0--jc;Gy4 z_(s(G#az}W_lw@fYxTK5$I^>M*t+i>U}mgYhpGseY)Y$b^Td8i=jVGa{wz zp;s5CIrJApE+9t&wSHyEgXsChmr{drVm5DrJ<^?8(Ac3`)NnsogGBa) z`MAxOHy_Bc8c` zZfx=M_ZE_buXnfXUH&|-wTV1zn?8j$?v#H9)YvY9w`_j0eEqpeJ*6NC^2yNV%VA95 zDf$AIa}PU+$N`;rTAeLN8Mv`kd-heh)UYU$N(O4SIU#!YJT^C@ag7+A=SAEWispBF zw>?!+FoU408@~i#D2BjAdVpfq~O{36J5&OvNufPDkjDhan%-OvWnr4 zKYfeOVXY05y?9%dkN8^lIok9{g$=~3?M8`{f?Aa;Z3=8a(m1t1uZJ-vVWAm_V9gOPBSF8ohr{7sBWWN#A>f9M*D$}U8oqG#&)-<@; z#6NRhB>_VH=UlX#8UK<8oD-1$ExRy>rBos2$ywc-^m^My$Fvyq;IDGk=oYXGF?_H+#I_m*r^06r%0o?BIKyY4{^r@6J1 zS#XnM3LzcH6IicwZQG9PnvKY5ToXUEm|BKzb!R)uJd#D3JwE@)57c4U2DO2%-vEKP z5&-f(yp$o|zY>@G$j^UgQsXmh5N+#_UghetA+}cV2KbkG=A0I4!0SVWT~esXX1|1} z!b>Q&hSCF3uOYIWZky&49nhf@7QHu<+Bl)Y+$q7vABEaB7&^=rCeSN?NYbOSZ+qhM^Ar+#iLhM^t<~V(Yw(TPgOl`qeVuBZfvhjno&_WRnYsx#Qd!z z&ctC~Ftco(!`>o7B; zx~)=snFp7Km6rpMzJ?P!;K)SxBgYAEvWZ{wqkP7h1}RccC>CB)pQ4@*BgcWTlNr$z zzDH#sp<{EGrFAOBzl`OaK47M`S@uFIIr{NKJyW!csCa|~Xc7$%%--giQZ&hWIy@tP zcOu-T>37birX+?CSzp!m>~Mz#2XWNe(LGe|43+1Cbxn)-`1J}7dUXJv;KZrM_Pu_B zoQ^e^Aw4TVAkaZsjRZDfRhznkl5mns0lfaetTS8J_c!(wi{&LJCF@+LhPtBuS_^oV~CG!>7x^ z>Fz<&XC;gbHm>(l5h*$7z5)v}g$cL4P1HSqvL8!>EamYh+c^5X`ODUchi1Qd9g8Cg zHsAsKu&RUNUqVb3pQK8>3pLRyphj|-D;6vdXzB>nX8HevD~o$K*IbHvT2$0ipoN8Aq7Z>KbVfAJ?Nq*I&>h{L@XW8$RFs%q*{ocX{Zf+thCNqms zr8wmWM-J!haP*8~y1 zKjqV$$kRUa2rV`bz^_dkXo=}6+;w?!X%|2~N!`p_U%Dd5A6>i&-0ep=Fp89i`{+Kg z7)YNuP0|GeE%MLyliHv_I2!8t9h{F2gbAvf_>ZuLTI7p6c6~PaoS)~3RrppgW0y=* zZvKAXG#7f^5o&D07ll@70^J$o(b+GfYJIYi(P|QO0^O{|{$5*(e*Df>Hf{P_lxh1x zrg}=sj6*E9e)2<0@s3V3ApxIo4`j?ks;lYhE-Fy5s~Bp3 zl_9c>`Uzc+p#ku7qk7Bt+TW5So_S>cV&MyyWtfcaP6x7MeOAkMrpeyRJt24|=K{ZP zoCirGwaob7qB(R2N4zoks(O*X-s??~9`Gb*14rl670E$V-6v8;;=?wN4!WuzOkQJ6 z1{-5J^ujh#1+;QM_D0|Qen6>rudJ))lBANj+Q533MSUmV4V%pbVB-1eeyg9#PB2pC zI9NwbH2 zkA9~+a_N@!e*7`CoqErHYYW98oSc6WfI36s$mGLVKVugMa^c(v+`W~_(o@-jNprn1 zrq46fQWl9ambSzw>;~@Sv{P@I;KfUxJ%NfJp4%}dgmunj6pIyCXA?(>V=`b>hm z1*9R=lT-)z;S?3r{sM zWx-t}@kOsU$qFCkbKJhoUpJ=82fp0vo)`NGYP!jJd79JN&&MYZKpF%7TqG)h<;?YM zM2mS(Td?&xH#?b%afp%03bb=+36*SCuRG7?dp#C8+2|?tfy7mHKUNx-HZ)g(R1T@M z1J*lSR|b+wV=gXF;waBpPiIughrllyV8h(FyDP|oF0gv@(Jb;Pb<14wiB{HLb@f`8o0BX;D zmu}w%b}-*?NH#BPVohYJQNz62@iIV#yfpBS(yHi@H%khWO$q%UsQ2A6wnGHsCFb;J z@zBqt9oiQBd`#T`MrR~DY@L;`jser~_Q4;K3aEjJbFbN%;dqgyfMK?&pwHJIA{!&+ z;xoyKjuzqrc8mKo3@F*8=8Z*ETn5f`FvVS)p93@e9$fn z*4rT~WqM8D@e0-o(s^StE7o5B=iq*aBbt>x|KTJ1NZ_5o`vbsez`mfpEQhfiv0jHD zU6E_C(p#d2Z4!5^s{3-j6B}}^;&z)Nl$tO(+dMlmRzYLfJ$gaY71_l^MEyPy->>JG?}D>SNCEQAwYxUys$6ban=2%gm%vIXcN%GZK6kcyil=Nqeby?2U0Nq+8fa8 zQ#aXS5esT4S?T4YS$=sj>bPNgB+3rpUevEt{vLPsA^A1;XNGdKkrqI}5^+`3w2@Y- z>oT=UnjmRWBb6irCZ^kll#tUC`@1*2PEfZc(J0QlgN=a$+Icwpk$cV zQ^O{DSsYj6iv-#ACpB1Rp~mh=z>nU0GMX!fcV#(VxNsD`XpGbSZfim$QuyxiQ?iPm z>7zqXAA3)SfxWf$z^F-ecGik__i~lljla+zer*NSQopGxl}pB7`esB=4+Ryy<|YlQ zDgwT^e?2Mu>mCku2u44brE|yf(Rd-Nmg^P%p9Lt0>n#;kHXxhzW~w+LkUKyPcNNFU zvzOYLNg>LfrESw(1lFO9A-9nV@NeU0&B=fQf1eh-Jwc?slucJPjhkzn9|NSnm!D7k z*4MD<=u}QR;OqBiex~b_cezYLBTZkHLVIZ4G*Hh1O{X$|`K0V?_60RW`j&yN4Zm85Y1lmwSw%0!7oH{`*qKHX< zog1u8xa(S!u)6b&G--A)EG{igoOGWb0j|Qs(@_W6cRSjsF5Z8Csue%!wxwE<-Qk}9 zOK0taSJrj-Q9b|B6p~;4%y2`7lPrJTpv4r_(Y1h>2k#~9vT;VHU!b%+q&ChA8(535 zib&H!+!$$#0oh;M*_?+}T)(RVHpbt20<%3a`nGR=2Po9dRXTgNMyV*Y2HhwfMA-Nc zWVcHG8y*F(v$IwKswO*f%KBHoIQzK)XRWwq|IygT|*p)SymR%OBl7%$pb3Z-l1 zc%Ky=Q7b1|Kvj^P*=V`?bZ}r?P&rq*YK%slyV|LyF>3sptHHCD14u0~@8wf*tU$TW zMKih#pK$wp_|@6djp3_6w|8Sye}o+8#n0s5Cj~!|E$7{bUyI8|UMi5fgS3r^P{{Mm zuGu-|xt|JCRo35H&201r`o(yucFGzuEO+2~A{u;l*G#*k?>M%mOzy!$yqOxa~ zyoS))X?$CJz8LGV9@sxYKi3xHd%70ewni!8t|`gz`1qs9?fDKPPPyPGAImEvcdY(a z{siYAq6gXed4B)hJL4E}Ac6U_=yGY6*ql|sRvHqLx~h{=n8jXaHoTOrh+e5ai5dU6ZIb3jFFfj|*&W0x z%iQV6j>dhm#HP<%IGsoCmtW`ruEQx*E2kYjUVwdAek6#VA^AP1{%!1(SX^KP(Dbc| zo0vi0bp<4ZAJUaOkRm(nv9XgWOO~msH-UrT8gcZXD}HM@lMCD(eqa)w?(l;>DWE&e zhUobH(bsLy2*k~7dg$0g50~sRo3C%lS~-rSJ?q-*+JEGBUveDRzTDZIKUwY@_#z>V zWe!jXFkDw4Lf`JM-!2BQjlDQwu0wsCRo%bepb#)p;V2=?eh<;kbRWAjv%lQujnVM~ z8Q50L28_6ON%V0{)|MkcwCf!;Va8-^A8+Z|6|z4lX?eZD|SFJ*U^ zU4%w_ucG$XSD{Eq7dn(6w|+qT(JCBeS;Hxytke|= zN4^SXj4zL>gEX%3jd<5b=-VsbO%%Q(f`cHM?(-7xJg1Gj5+9J>xMY)jSs`x>W&UYm zo>U%#!-f7E9O7qJpMTmlP{YNx+VQ7bOu|);v4w}B|8WD524M^8U^kzCN+BQMNxD7$ zRjuuMI`Ql3yir>UZWsN=>(HAOJ2$4X5Q?0&!;TJhI)Zcfpv6~v6`C_i=SyANVlb%# z3=%;lo1zJwsWss``q^JA6j*2Od~+$w-`T2z_Wf55C}2@4p%>%OK+&reMC#}RhPr}( z?VGdoLQiDXwBq(Q;QM=r`f&0q3oUGUbobuk(-y-{mx_`5_QrW?<#8?SL{P1{dqW20KnT$cqX+Q`1oOW)bLxHTKy;a zm25$OSnMgC4xZ8>^8^q**lWbBl6QP zJREU^d%7~6piQdD5w6wdKRu9+3NMU0O{4cba$1bTmfs`Gz2?qcSt53IeTF}a-dmf2 zRTV$JxH?R(d{tS1?LGESE_la2=d;?kEhbU)=0H9GQqQhYo>gG~MlQ@%UFH$`DG7QD zGs!+Mw&V`qV-kp^-lqBt?u;8Vwr^Xw&Q&U2V(%$`;A+TL zFMmUI^fx_OAaK%=J$70-JEX_O7R|whS?5R)qjdme zdN8i=NXya?wY9CP*@T^Je#7)FrStBsqYf5GHoL4Z=Z`uqZ~*Mi1L`{jh=Y-l^y?&! zA}Ak?=`J*DVDwyvEmrk#8vmw9TPk*%J6WI&--Id7F(NdB z{8v|~qa5MUn%nvTkMEaQe}KJ69Y03d%Tx@Fww zzCq8~u#c}5-xX_&9*9bUyqPZH?LSRty*1pSR(K^Il3V-BhzNXrFO1wZ!FXLsgEK!3 z7fGp@utNMhiK*y-Yex!VgiZ#G89v`ZD@tbp1%~jr+Px0CYg<1A^q$jf@j% zo(QPW-+dWbIG8T4hTpVOpW&;nS=Szoh#&km2i2DAMK1tiM#0~M$^pwiMihnO+fb?r zl^Y-O0}m_GiFNO!2s+0FL4wTB9E8WLA#6+#;%OKisT;_0R~CV~rX{G}dDU$o1N#NT z7Z?gC)w7bgE01U2<;|>#dl^%f@&6?O!U6Yu8`2zvsZTW>yF@ z+$)pg5*j=dS#G@^T2_(?B1W<6<@2go?F` zCEf;}UBB4lV1g+$p8!tsuDS zs4eM;Ui{qSGq>nItKu#nrqwXnC12N+xV?V&*xtCV(@LxT4H3tZf)VD60omhPt`hqG zyAzsqrB2Jnp|c|ofw8A#3sPB<&6VG(&0G>>f4u)pxbEx`9EX;Vu7K~z4GOpw9b-49 zXLBlE2D9gICY#P*%B@tOL3ajeUqqG1Kz`${VJ5dRdVA+o;<*%;;0g491eHi4LUmbT zA^)}e4il?!Up|;%L!`texgdro9Cf!^{ch$zj42!L#9ND8GBvX*iI77z_@C64I?oqk zp5MBTF_BdhP~`L<6TQbwp9XhCV*n+p1pmX-dxtgEJYmD3H|f1b1O-8g(p%^t2m%UH zrKt4YTj-&vAgF*!3%yH`-m8ELgkA*_S_A|F5lE=t;rYGqcfJ3dM$yR$R*%-p+Y z7UFru-ksce``<-M-~EMd?9jUFjpK~cdrLM1rH_GW)nWu(`*A>i{xWoeGx|mCQ%yz_ z{v{fhC82V%x22-o8Sh1tnw{4XQYjBO%+6ebR=#Ld6LthWtk5+bcQ<|S$7Q!6VwDF6w)q#v0L*kl}tQ*6&s|cgqr*!;GNw;5)bIx3E|jStpa) zsYV1}H8;p`F0AgB8XFwy{g9={bQ)r&SL0{)62bSI29$6+XLj0L_2%3S=Ph#L30pz; zFI}gagqj;ahNUUeQv-TC6Yrvag@U6rD!t$8#iHuD%&dYU`l#-i2F>M4*V^bLWe;*4;Ql)Gh!o!B z@Ie*d0pYC+Q-zE;p%?KBItF@}9a2d!fVxyBJ)pa==`-8=R^1K80wa!uDMHP()x^mM ztIjCxpbue#>;AV`wjR9ND#Efg{+l3tWx<~`yr~_hYI$BWAkEd;!B^HPh9{h!Czzs7 z>2)Q88zJO4mEzwFlnC>geJp?bh|p-SqhJ`OBAu9Hk%uto_aphd5uNC;egBwNA{?8X z@#Spy%p(yIvx%)wr4{s4H>8{tDu_xQ?@mPYVO7V4hE>l!3Q|d*Xc6(j;}7hd!N$w! zH7-eieK;PnQ&(Dg=FK}fz{z|tj5d73vntV;9MYMxrZEr67(@Y^jWaBG7ZlkXpB(*< z1a)6AiW0Xl@MbD=C&#xs#-XKLQse?n+lFd#-m ztx&fWH-DT%ywWA6*&pV~1#c3d70WaTgxnMC$teY87z*1K*0j-Ke)&u2;Vzoll$~!f zIFP){FUpM@Kom&CDPP0bs!T1iRzK2}!2X@aUZ{R0b1~Bi8{IqRJCi*TEbzDsh70;m zm7s)4@b#m6dkQ00(!GL`Qu zg0m7R58M@i16qgJ@yS%mObrePt}PjZuaUoS-Q@61a1u3lLZAj%jZ)Adm76V?$jFh4 zQ^*;y@Bs?lwZ5J5nElFJk#<9vm-tkZLl6F1YvU<>KH-}?DKs&g5FXcWAMT0xS=5~C zpdM9obFFxy>rcg!m6P1YD3nA*am23hS3!yiMXN;@Q6v#WI62eq){CN(gf(o)sdf1M zPVpnk^|i&*qAfK40YHar8J@fA_`08-*3s;+5z?m$XR^WUZjueZP$`J^X%~B0eP{iVnN+*4l+yMeAm9-#qpvv`%n?0z)8m zE1hw$$a#6~pVe%V88D$gCL1Q?^dKnr z4p6@&;#SXYNEmVRg}|-Jar-g6 zyu=B~L@=jjko7@SCFpwh>08)2Ygg(e&-P``>gBtHOPZ+5cfk(RmR-H~I>t2C8USW` zS9{zIdHuyruk=9Rt!3g06rin1Li@VL+$3!>B|YdN93!)L-aTR_#c3Rrb{wVabR7(EHb-1_>O^2OSC~MUSTShNjbG26J&Ws&01C4MSKuJJtSX{zQ{YU> z30yds6xDTcym;s0-=u+pd&yAYvm!wkXczKXapsha7H=#0+ zxT0EjKb7=>1GGWcJ4Z{dfIVA^qvBeQ4w40Sek}yyrr7{epsIr|S4Q-h!TF7>tb44griV z6J@U~JFxY2Yu%afV{f3O*t#pB-T43x^IjGR#D`=tBNx&m6t0A-97K?=6(Q~!;%E#T zV`td8!~1&Reh_B&f;5u&`PA4ju0C2aZq}1&6%zmSxaUUF{+WvGG6hte=m2<^Po!j2 z71v1{H@mUYRvmG%!+vge;l$->cEvqDO!j|dltKC3Nz!PSzqGOKj~}CPo9@f9fT+h$ zG#e~6E0!tWPNj%Dn9^EnKqt+0wy<-$&vqVIdo$x$A`F z4tIT<$xUaH_!KSd1g`L)0bu)>!r7WK{l>nU7-Xb?&XOfkb#dF!ay`Hc=fUC{lj+V5icG5y;IzV!-mEb9#N3prNx%WgT z`{0SH7k2F8>?FJ16LJ_v_lifj_vHR{t?>z5bejH3qoYccHw@Tm=|7cTlE5B-nSh)2f53k{v5=XDn zNei4BaqqAvm0qQfJQ7f0g`i8t&x)jfspf8h6O$1KqTS02sednOEbH zEcDr3I zoj7!L#$P0HPbqM_8E5M9ecs7iG}o?sE&*YiIspmIy6wD=sQp;bBPsrF=lZOlXxBB`LB)YvmQv3>+KhCuPLa;GhSj+(-ls8UT?@UN3)0(P z<)yDFTKVpUJ%+tXqG}misP#@Zi*#mN>+hK@eU(fA*dI!O$F5&m> zI$@}mT_VZpt1qqVZkR2&8{!qp9b{h?RXD90lci)hF1u)jy?dXS235x^2SREI^d!0K z%6Og4+_Dbdq5~h@iTqpLP}6a==_N6S2bm`WhYS^NZ7&ha>`D8f(6xa(Gy&G~{kl!4 z(XQ*MT)3ZMAa`C|fp2hSPx`anA@#et%^@=wE1e${fIq;W4xonX@4bm zmUd^Z@5xKDucMT6JMke+Z<8D*0X9@J2ZCUu}YCI zcp2BPLXFFAH|ydo=^>#6-0<6dU71$jmj*aG!khg|Dlj8EC77MBQf|AIY34Bp!(+Lx zi~IEY*DqgxW8{thzUCZZJud#y0(&YhxO-B2Z&~L+E@yv`ofL6mLq7slxwfC{*)sh5 zSi@A^E@J(!_T+D?zsL%GliYdG9>0IPMa35WfhPx8<%<+j?aUhou#y@r!Cf&U)mz8X zt-5@RuyMs9GD8OtTSmhE8Yld7Rn5T#TLf-HByHYlb#H{lI?M=f)i^fO8U4X^jO29x z3^^pAbt2)stg$;?{e-qA5KEIG*72s0$W6))3MvZog1xPw9km(1g-6|SxeA%wTxn0* zo)O;ebeEZGPg_d*;966A=?L|j3fo}hJOBQeXyh1NzDe|OJJ6^CXeKT9cr*QwBE6sX zD-3mpJa-yB%O?Zj@WCfUyd+_5~E6I$|;0lL@h`Q;X zw{6mY>(lt>zD}orh)iv>^ocUYC7m~cDndHdx6M$p|(h7pMUN=GlS<~ z8_(ZxUMj?@9C2TE0%mM%vzR#Sxm>pP-Bd=e#nH2RZQc})*eilaLzyqMPrNUV^{1?Z z$5SmA=lf?y-v;!5JxJ1esz`r_bpX>Pp2ojM_%N8UNgWq$0(_bjE?s@79mVB2(Am z%S9Q5ppEa+9!rlg6T*!-E)%L!;>0&rJvV4oow-(eI2LeB9?RB)pRDIK@_qMyFZ5N2 z?b-qYaqB#^+Dllh7Z7J!T3#3(6j+I|##V--??_)BYTgS-MHl|ZQHGHG$hIu)IAzG9 zm)S|LX7_esS#1lQcnNUl7ayJwbAV<%i88BmCtG8WtELk^JZ5ePNGmc4jm~&@7wYfk z@A0DP;x@ldv;|S=H3b~X9BQV`I3tjD#9Mw0lZ?{h1H*GTN2s23j#BeyYfdfbyHm`4 z-{tQSPKrcKJc`FOWoZ7Y-I4M7N(3!;hh}d_nLX;>&E#%Bv|1eHJJh3b4Az7Jn#N`? z9RCq{W+{~TElr*M{6W~gZJRH{7pSCH&t|qreW`lekDG@iU#Wz-=QXUU~Sx zFDjD%`-2J->+YZ$-<>zxWahET+ZE_ZCHd;m8`~vlrrn~ig z0iu^i4+&|D4E>3D=p(q$YMuur1IJJho>ICv#Vvip;D!J%*o0Pw7DkQF9V4h zl$22XTZ9dFK3FhPOCF4F5_Gl)uV_Sk-M>BeyY@o2m3ykyI#ln9Y%Ne82pBjM_NS*e ze6GJSSJ{oVG=1XL%=@)xT}rRsshWzCl?s=bT`<)v*sl<5Sz z`Kar++W;0B;nvat5cXb48eeJI{#}!WBLX@#mad?$91-WG0u&req%1r8wjOK0?wnRE zT4)E(PA9aQRMDHAYq3LjiQN2OBvsF>R`|0-9rJqd)MKWL+@E=Hx0!&ub_&1Vd4eI` zj{89CC00f>r!t{$=qjC>zDO)hYcbcppT6ikhh7oshX+SFNGfIEBLQ^%FWk$Mt>-KD ztg9-BrJie;ZarejNV>C1JV!XDJ5#%8*4t4*aXi}!IOV_l9`mJK%JOerHDYnwrIH!N z^O2=bJ%KgnTh@PVE9M8ReIm057>=u#`z{wC;S=R+dkb-#%v1js@(yCw3=k(pk{KDD zon-~zGR$_kU%0kKb;x@)k83#Y@?^N4HJ@m32YR~Igf~OTtLS5)UJg8o9)kea7xAs{ zw7?{?!8);FSLE;4CNHx^&5{t>>1{}OV8grWr8&fJ?NH@ud&V1)6LBQ$pQ*WW&n>^=Xt7S> zas@S}RPN{1`XvBNpX<^ciyr_Fyfkvn6;33mapdlwx%dMzIcLN|N-wG-zmIZc>`L*I zaa>uGxt^KSZ+G=A49sSo&HY=jllpKA>i_%E_FS1eyN%OCdBM0_ZXmgvOr$(Z?YLt9 zLPv$!qD>#;5sQbL+u~ViSlJYhDPKkv>9ykbRTgHWW7zB;#omH;?X{hJOAN7Mqg$MpXU>K}OQ`f4Ig+)0W-b zOSo`RpjiDVw&zt_VA`;kZ?ThaqNLK+`YK1;THz2AHbSslf#Ou@Z2qp^SnkL9R);lS z>R8cdf#9Yr=tQc9*tAdLv_Y(@H7G&Iayq1T*$DUV`tG{3iWN~sUX0h(hzoj2J$GI_ z<6>2nD*ll>R`GBlZ|};M`kto<$zkm6hf_&Yw9;~B8ZWoT6qDNnhMlw~i~k>df1|Fd zV!o2}pcPx1>p;|^p!UJRP>bkpNz@mShumOefl9XAOuz9B1t%7#o2biBi1=af81&X| zOuk8qgz>IChuwS9Cj(>-VLW?S6`Jr>R~X4Prb|sRg|6v_H zRUFVRg4#kZUwKAo5f$)!bdY*{z0RNU|0X!zUQ)IOBuFg7fPRsbxHj`=@$k{}q8~^= zhphCy4sri6JA*p6rD`aaE+;tHW{CxoY$PML`n0YKQfgW+162oiVRx~+tRP^#39m3K zq5Dc?eS?|A_=~I4*)E8;-ea+@bDzBnu)x9X2-y+I|8i6yIy4p>xN_FE_25^BH7%cV z14$`&+V3QQCh=tTApg!M$n%GsGE9mk{EA&eSUC4!n6(S1NdUU84C#aM=l{OaX+QD( zE&U}2LJ@mI)U|(SmezPm^PjXAMbIXd2k~nQ-@t4RA* zJ8j-~atR~x14=J)BzGh4)LHj-sPLRi^IQ5&%^og7+@})B!@K#hv9Zcw7-WxRCZ=SP zm<$6P`Lc<=LtdKwz|4^J-z3AQtFnaRQ;u_!jN&|+Yz|0d7sjC2`3)H@4-)r>JRbP? z^M_npTRRAYB;X0!Dj=i9r~of(%lF0<@cE9W+G$^&;c&R>%hT#B`Iv|||4c84Bchm9 zMAd4)y#=L%D#>kC)vQSSZ>z`$tF#hon5bA2Oc2YOf%XV-+MrO--cQQ#Sjgp9x)i#U zW(uS?2uy~Nj5Hvmg-B0EI{2OP!&E--H~Vb-tj~PF{3f5=s3=-jkxEU;HMRIIkPy+| z>9D2+&O7H9&+4+?XB!+;y08Q%Cwo^$D4>Itlq?6QoHbB;>X?~j6jYOp0sg$M8H5@3;Zk#z4FB;Q9S2$gEk=j+0BZ)@FVNXVzm z7mQA2uwaLer|Rgw4)00^sj>ytm`n`IH0~tZ1VW*SvhV0M35UUuf~R-x-ky;BJ|08%=OpAE3nPn~ zmF(67J*T6rozR|;(P&Uc+X;;?TAkF&Dw&fSUhkm2!x0aDC`S0cM9+xRA(Q5NdPs%oGjIDN zN?@c27^&aEgy!v6i33lJih+%yxB2ycrr+=KU+y`Je|Q%5?~Lj*96ksf2&G4!{Xplg zQqt`eSTR&pNmwsLY2$?b->h%4wsv`E*P! zKp&@3O?2RbyIe zfPFk-6|+b}zhO{wGy>TVzp{9F*U@59?Y42;m!s6X$(cAI3s8qA?A=vU%JF@flb)G4 zSOVQ3bH8_DON*RuR%WL9#trhDhdYX6YA`BJ<$nv5DK7{AZd$(#Q|uX%Gf>Hv77-I$ z1Ije@vvy)g6tVv#=seFepS}*DqJZC)v!o8yV$9VodLao1%5@=sZVQQ4TVNN>8B~DM zT%2lWwY_n!_ecHpn%61Co^4*lsQ){AhSizh2TUq9mI;`Xgf%u@(lBviqoRD+JFy_# zeFzaYH-vz9m5ff7W3-l14b%5koq(*Ti*HjxUK4D{q#5)lFCNo^2&2i&%xw1GVS!v8 zB&$mf=HXMRWV@4ZB}5qRnt$kKd~pYeH66ZAU@D)2+3`!v{IgZ5_Aeh5pUWJ2|0ya#Jo+7%YzjH})5SMqp5>W7B#`}MZFTUu>`9qz za4`F{3-hC2kD52}k)*DoBoH_+A&cPl9`b^yumf^>F-4w($9M9jsx8pnfA36jYa$?; zWAt|xK5SFpOKYwyP9nT z<|tqGi!T%&S_PB8e{+f2bXLYvv8qTPj@<9r`geGESk~~KDu-Vu#hCG)m`H_Svt2aJ zPh8NP=bOtX;7(B3RX@2NlT}x8c$ed_x7ChOaZC6erLG#=-WG$mrJlM8e-fk_ga-OI zUF3apX4KK6x^#pW-Xa6$=v`UG*?20^L4I_sZKn9H3in!ZVzr|$WAajS6yRPlBu|+j zpET^R^^0Q!fe=RZK@}uXshbyLKgsx0pP7oS^~O?_^vX&^3jm#~D7{0G{wWP4^x)Hc zi=r;hi!s|mO7$j#i@wb^Lj1yq*f2w$fMULD>i)>laqPM#%hf}#j>LJk2Uz+ZT6=SP7KC0H2= z@`^>g(W3_vVa$ds&NK2SSfK0Wc^%5)z=h}ru4$2u#`?0>x9b^ohVaIo`guK<709~tf>(sg3i zIpv02Co^Am){gyHJKw8h&p2#DZl_GJ|L=tqx)-+mi#qQde-O{^pY&xU)3eQE+|F1( zgV(<-Lv2!&OPsj)VcmV;FgExZ5hp4@-Bl@OIUZH8^pgsnf{3Sr$BVy>&K#$3wzDJn zWGZGUGMI^0f3$}yZYnDJK?!D17ZKbbEJ0IbOWLSE zSTJNtVyfiU97je*s}2Uy_+qO(hgen8bQ9OsUTXW+cM(v^!Pg}y9xEP2lbz?rdBmv)} z^N5Wq!&C{91`%)9*t#xuJ-@(*JzlEz3hpWs|(g3tQWn|NXoFWjM@|A_F%6wGvaNbCc(PVLTF8?ZP%)vms;;2LDea zkHNMl^({Zmw`=l|y(=OjviiVsQXe1kCWaa?EXDh%wakSFy@0;*oA6KfQ>c{QnSM$g zJ;ZlNa1>HChQdaLbY7KoA&Wa)L$P;RSlpTe#=~TIr}*#rfmELby&|F_rO49bUeNBZ z_H0`GVoQCws7wY*(dO_(dr~KrS3PtO$k}pv~~%y^nUyc)y>VP{i40 z%4t~39#izyeERh1VCt#Cmzyz&P0i-C;HzRm=rdkAS_xWvhW|gmIE+gCUvdJy*s(z% zX%#*>0p!kOwO@}OHFJ&m0Eqg6h%U=;$Hc0$-Qp*U(mnfvg@-`QElTE zzXpflHa_TFu=&=crMQdeu3dPz9kRFh*Du!J4;vH51gp2!d4hwae*vKxZp1TO!f=g( zk}t3E*HGIir7*Lz;|`rJXlq3mx2O`u!$=2xZ{#Zda#LmnG5PB>QtiDj5TVNMoy3Qm z3ij^e(eS~qBl^Ej&(Q~SFOxU4o6~Y9-&}joYiKKS4i1)UE)`6M`U=2>fcMKjcHb0Y zv@)C~EE^*JWL#ke;Uj$LEP~Y?O1Y`?)G^kL2bPjSQ7%XCvn+Q=t(uVN`KLE_!@osNE}{QgS(#{pOQl!T zj3S#BlK6hx1c<0ndKz}z?eH!(=ZMZv3cUUhNf|*#sZS4j(zf;Yt=xg0QK?R5O8uzS zDf0EMl71?^os@Yfctq~M? zcXmt885E+@0JodCAOEw^+2Ztq{3}Yje5TKt!$F1t@++RxuuxEH%`KSV73KUU8$4n_xbnNYOaS~_zm7OHrO|Mf{M+5KgMUH-zb5mly( z;NfoXgH7~6MOu;?S$uqKv6THS%FKmx|Fvj`wp5BrKi;}jT8iAPJ zY#!ZsG%4Qp9z*~3N-_%stZ)J>q@fmwnhzAW^fL;M_P1Q6 zSFODNdF8>*5T3AXw(q=`(8+F+idFPgU*V(7`M>>>-#F-$Sq}-ue^)5hnOn1q_EW~D z3H*H~`W5*HC)lj3Iv#KXg_Y~o(f*M}El;P0M8)&;qH|_lo5Lup`luMP zuIw*Jht%7=#2@(YTF;7jg#!_eIR4`krypEAvdFVQtFCvVmeYg@6ghSLezF}A7)Z#4 zHL!~^b8$_pbxZtjj<8eKPLQ!xb@jH4Lr3tx2?)!nF8OVp-r<*SdyjMIetemfctcyN z2O>;%5I)>u%E7{zawWTSN;YKQdxtQ)I$FjRtkvB7c|c}lZr;29G=#e8{{J zYy3^CfRq)-KT^L3G$xrKglFIF=3@RwNgJ~LtN9-%{RMKP7ySQ{)Cu{5YEs&`F&0W* zk?Wlc0xS>#O3@*5p3w7La-LhAELI43qtX!`Ze`*>pV6G3iw7wx0bhc{*c{%*04$K;Tbug-^bg0RNe>j{6u@Pe8GpA+S|3agm)y{vV!xb36U6x7tR3n{Cp z?In?5Py!9ja$uPB7mA|qj89s+DO?QirR05TJ>miKW{|v2!jYghCrl+emWq?%=5ZFd zk-vnV-;bhIZ%Cp}u#$OSEwA zn|l7nOqXi3m4Xb~MWw|eaeswf9@Mi`9JQbJuWjXGl$=O~nAk9Q#o&G8M^+90pz zHjkytN0wFuJd0otuwj?yh^uoA*XE?;;@i+=O<085`FF8!?^_+=z@azU;v4N7SKmMH zordmrplwr^JZw`h&)DkQN5%gE%WBQd=k${eSk+Mswa;g_tuuta zxqa`K*D%9hw6W)!Y6**l9fDDMF`&ku4Ie%E)=!nPi?J6xAxa9ef;vqliYcv0WZ<*6 z&JkKi2K7pqE zIsa|y9A>ys%}iB=uYPl(dKT4`m;M>Y8>yr;d7=$kW~S%&*bY#nLV6dDgELBa4|tv& zh!QWyrd+|8&Jr-LAd!a$3MxEm8rAcIO<9D(kyb<+)F~B&FEq;oDnYn}R)ZJJ-OOz# zq)P=#pnXjxau6*+^E+~|_L~OHn{tYg-JavD?#AnFpgncuYzmG$(uPPjQiF;?D^)|@;(rF~e^Y5oe^+!X`K2bMRkZQ`+-exs z2-FpqLRMOM6&wDU9@)-mP;ufH!Mys3d8n8;{8p6BzsRN+Gon%U4;6)A*r;%0-4gxT zl!asRsE3`jQ7dZ20a9;Ia&PWYA{|f9@I|0-f-BAtmTrF#H7J>2L=Na0&W`x+5i?Qn zb2Sy@8;6->$|&ukeyI_~KfZXet2VO^zS$`S-Tkc?;cm!OXozWqc9SN!3pB#nLV-L1 zDdsI6@kbiWogF!pvv9Oc#^5q_H`$+9UX~=0A9|}O(jbkNinKuoMo4&ilnnu{j0u;P zB3F0Z2PHXUjf5LVw%x@%r8sXV{QZdfWzpHU>|;avfTHt%1ej&or-ihC9WTEWkyAl` zf8-&&x>V>!MIZrAh%Yno>gss3`bW}QYe5OwOVL1PpTN65cVEAI!n~pS?y~>IkASRl z#q}S+9x%ZFH@`~z`sOaSbR(S&esPH&8j|11b&5V2H> z+Wf)yZWkKr)i!76xid1~myG(e8O;HD7fwHAYq#_2(ox=}^zs=6gv;76*1#k_bbcL$ zwSFGO0v)a^?TvqX6q`i56llQn_-fJ6XXD&I(i(#&izq3(py6qseBL+IZP2;G31LNa+z-V) zl@0MUqJ9~K`IUymt|S|jNTvSj9<;8!3cHEJ+%4@zFLqVfNOR+U6JN3`;m(7}p5y-J zH6DKHD4q}ogCQqTyhw?-#Q+wqmHYiL#6Q&&!) zE0xf=xMX}#B^BI&>R!AH2G3SN2^TYrMwr-Egm)ODd})&!7nvZ(nNiOm6+P$&TFj8p zf%5vL-)D^@Y=WVU?ID%&Hx~jzPu5XP5EWtQ3-EbTx+%QT(g24Ok&$`f-XsT7>q)6IpZz+ALudn|xtYK?!ay zri8Dkis3$wrXfCH=Bc)s0wBJa+CisY$9@~*1rHiXo0$pD%08bG?)tfY6y3Z9Ra+tY zHYz{~Rz(wGN6W@wv|Zq`-gvP@A!v=VNi4!$VVeX#o-!&>>6?^>5Oom2G5uC!grv8* zc9)oOLP!S7F?eA=lrO=@8GJMKfCwho%k@Db_U_wdcbP8IQ283{{QPTqc>HpV0!|if zT;7XL7AVJ{F4UMIpJ$CxSdy2Qn&rDJF$jpfd(){>)ul~QK${ebD6l^}nHJnPTaIZ- z6oppVMr~Vs1O}aMSx@?BHsI}4%@DrXB)MX+nzsl`(ebp50={~&Z)c-Q4cUw{iKT5X zq=XyX5UyV$g&}x^Fn60xdK^PO^Rdsk7Nwz_ch}(fb2|Nst>7`VY z)uOu@AQ#gp1j*Bm$9$o{!-;0RAR@wGnHw8Vz~}ntIuL|ULKey~>ZpnHlLMEU+8o8j zKVgI{rprRxX-iWv^R<9ADnAEA%UD&6!25L%{uQo-D&pqQz}((le&XCV^59{_j5&Ue zf@Dxn);JbnpJ+B(;$Fg8ID&_bmQX{=d?0yPitKAqaJxY__=w@$W3h-OK+swLX;%K?b z0L7MB9TlJfo1-T&N;fy5y&Sr}6jC@h2>>x5NA8miNNk=aHRK#L-0*J6!#N9>`juQN zaNXNEk0v(gFcphFuDe6(86@CG<6<8vwERTRb;GwG#`nhaQhN$7nZ>9zh1X~@r;-Po z#`r!4tSyINoSKXm8Zh#Z6%sfQf8j&vNK39Tda?2HO_QyUGY@h0`-uHK`c5{Qi6}^=DlnekagOJSq7|tP@WCoKMO*6zAKwDR6#c% zctA}eZcxg@J25(2P$-)JFVsQVSgr)nUeg)?s~iD**{-o==_|SHwh8Q0C4$(b>!=sk zrXf7HXGh(yreTP6UF^cchD8xdxKeu>Li{Aak`(fBl}0CvR=O2+6PCR380&j`3pnuu zD75jNcXhNx4EjV4?lelCKk678+9nd}*#bOmPeV%t_xI%#GUooY>y+b$uRjR)d6pd2 zC-AI&ce5*irGOHQy;qL8e>UVHOOAXR#=}47^1Nw@rKcn$=@pW(3i@U>(uVX4?9A8mjY_4u-=%cswIzbY6-NlOD|f8(FDh(!hz$mj%`~5@b$Rx^x56o z=~iY)7g&TAe%lvfx47#-2c3c$)F$76T9-<5Ng}aan5a8Yx8%k}pSGpbDyYNWQ;$AX za&RBoSXhNA%YaxhWf?CCa?;2)Xr68Zl)xA8x-C|o(QM%x0A^S}Qh!n5&k4ox6^`O@ zoHQ9_XP-<^zRi8ewxxVdngygUJ>W9U^1jZvW1>WHOfuzgHW#3MxC`seT{NC}v;^_f z(H>VBlw%Nqo?H{9t!c%YA1LMlqWc8Eswf-Z9ux|=)LXkh1y%t~#kQ!rG+Ew&cs*x^ zfX!H{ff5fme`zilW?q{Xa>f$cof|0Y)ik?B4d2y4|0IiB@*0awR(j?IspxZ*MNdA7 ziNqdQbIr-;0V7Gjcm~)2n>kwIOFY7UK*(K&42-R2tX=ZBkL&(bjtO4LoeXG`t$0KY zX`4QR40kL&Gs92qTedb@`d$wq+H%Vm684PyE^zhOC;H(7F`?d-D*!+aBf#)RNs%cz=XJ? z9Pi`q%?DW8Z%E9?tmbAY2noYaJEX1}try*=(-8kW*43_U-_G%vKzJK^YxKu707X`d zi0QTIlnFeHlZR6O+Cju364brXYkiLJ*Ui`iR9%cFBLo`om>F{AF}yJ9IGtwT4GI7j ztkRY3OfscDf9joH9xqtctrSn=1S$fDi zpTs6_Q~>~T9}sjz=q}7I8xcA-=dwf!hSZj0yvYu4j{sf;y?$#8^|GQ={RRXT6?vgv zybD+!B_x!^qq+-aTasP1QmHxPHp-qiO#oopf^q?V0xjwj;t+99@DOl8EqJ*1&^mV zsMFb3=uHYB8e#sgZI(jMHtsP>FwOdPfDl@B`ri0@vhSbOAvB!PzCgSjdY&=?s2w9g zZXuR}z-+r0O$)?7y-ffDy+vZ%?*sE0XB0~dem8D`Z$1fdN7tz>j`W~S1Nwjc>52dJ zC$Nw(3)p|OcrCj&(+-P?QOE798sD$V^k~K@SYj>J}&Yx@M}kK zT^!aN42cwl()=1tGw??h#n85wQ^K1@%$Om^nk-dNnulaynYh;4KNFbw3Wz0tw!zkCQ$0g4ps_tO&wR!xa>KNfN(q46N;g zZncSqKeTfYGc)T;kD5hjr}ti+V39iDz!~H~M2=!kh25)B?BAK4q_>Bdfxja{)a~OH zaZizcopCbN#w&^K^bT~CPkn+b;SakU_N1EYFN2%oPlnqAxekiTX zC#B-+aYI@85z9z&A(k=Z`dW7ypQM=VbUKvOxx)6&la%$@xQ{m+C+0u}4fhkjFwj=M z%8%aewZN}lZtv#CdDj7t)Vr#qj&x@|86TOaTCOGql%;L3?uOdp_ppDpIY|1cS z5o>P_Y(%ErYHk)71mYQG`R=crgCdxD(ST;Jz3G;>p+0I?Zx=&Y$7eoQQ7K5b!bvi)o8ik17kQ_T5`5A#*W(`dCG*KB< z&HWTZuKhPgdFvb&i{;xo_w&E^860M5Ej(iIXF4DThMlC|3Y}Cv#3pQNi7Stg&4fA> z20~Elgx4OVkSrL@SfRRruO|>k-z?`%i}6zb4V({~_apn>kUShHPvjTgJCLI-c@gm; z08*FJ$m|b6#Zm(yfj#o$PdrS?-SDSsmSW+nI$ye6Bs3aN@nLkZqG!YafSzH*kF}Y^ zcbqzC0l!Vy?;r~VpOEVE^>40zJd^{^PLk%c1`44WkL!6mD-AZFy*bi?n>Q=7Lj>lA zxnKlV`><=|!poB%#lmT*@P zOvr%)?b<>BI!7LEwy4iX<}JU12fAGQgZaOkO~7{K8>*u}qHC~Q?CL22-)cEjx_`7P zhf29k1Zx!4V<`k=D<_}6`&($vI|u@@9O;%9*AdYqNq6d~qshKxDt3zs4t!+?ZE{&( zU?|W6>s&cDF@+yRHnI&a1pO@ukngYT?aOj})_cpfS8}8QA&TOLk5Z|vJY7X9LEtX< zZxi+HP@5Li0%cWB6-S&O#2tJN09(4mo0$~fpt^ViS!G`DQO7S_%cMEl#;3HmHlQy) zQoYJDn42U8Le`@m<=LluL~#48Z@dS5g098#>7TfpL2w!u(U1aM8dMwrxewBnhkNPlZ>Rj1SY{j8fKOj- zVA2D>0fV@ltLL)5y9@3044A8zgF`Uy10Z$=ZKo}E*#;{)jqJ6T-#Z36DpY3hz!tE- z(B2jl&t>I0hCln>A2h}SU7GSSc0?(;bjk-(RYJ|bb@yb~Ir+Um&;%y~&{aTx?iLT> zRZiA@B92|z9-!+=OOk-wwdsDNsI5)R3t!`(KYB^Cw5L$7It(0vV0qVB+x6xbtoO%X z(-NlYYG_8+HXT4g{?i*bA5GWD9v_IilDlcLjk@lCH5Z4Qsx>5rv!H%;!aU?~yf#-he5dL4Bff~Aw3B)J|MrV!oF=q8~I)q18Vt>fB z2t#361_IX?N9xzvi2BFno&j_Owrc3f;~udM=;>?<5Us6iz7$IdJ}W-2uOF43#Y0$zZXXw-y_f&P9|U3&-?cD+Vd}E}HQd zdkcpT&Hmj{l>e{+05zi}FT>R`vJA}BWo6o{Zvm-VV^$oGl6_y&;E1P`Fq+NwN6t5b zzduE)wJdw4$Ji5u03j0y{(-JyfGJJNkxr0< z*N{@l#RszZ1QjZH3ZpR#Xve#I&|Zpn=0SG1m8*$gWhbvp=3GChnPW5w(EoyxBzk|y zxcdyyH&j-!fdU#+EcFnLVaRSu^9@?U`i3jK0rDt4QPY@p_9Jm8gWw`A^&{Gtf2pBz z;0T`)5iOGJH_1k6OYfXQfyzfW4> zFdjJPjKCMt5wb9?JOtz%mb_1h3Y80ZG_nytm+zu64uHE_e)_SmBK+wT{vHsss_!L+ z*rC^w%T5^lAYsUl6Zn6z$vF0-o2cuwsObWEV-u6&|1BH%o%K&VMXOx<69AQ++Frwr z_FYoEAd?)?RGa`L03)r$veQBOmf9$RfltY4x`2wfa&kZV`vXtZ+QjIZpzEG4(O3gB z=uTo9Ux+m)guHN^YJ0zchp}FRla?hxe>UO)M$T8RJqj%V0Q-?|5XGi|n;VVisUVO= zq4Ag>h*C0hblolJha6Kv%Fz;%$g*q$qDU>kd?maLp3sP)&SC4Lju%|kQh=16^~q!F zh)K|lfWA)PgQS{s8cVShcV^dXD}kp+0#A>L#%|Get7aSU#YI+PUvFYy`yHPFu;H*R z@C_EO(~&QrgwE6kPiYWy z@Gg5_n&?Z+Pq~Dw7>qU~x%BcolxMs?PT-GX{_LAw%tu4Ndysc_e7e>=A7<4zv0bM^ZHcYfR4nqiDj8dhzVKMdCRCA)<3 z(e=_o@G-Q@WN(%VkH{s=)1tXFEz>q6>;oAKB&|W-6 z2%6qG*?d}#?7ofqs45UBapDzk?SH}sYfN(FL}L@`2P+SOmZwvE>Ey^z$xt4ni(kOt z0Ex^8YgiPN1IqIM6>Q-e_Jsk>%w#k>6uts)v$rMYK=4oKJWMEJt@*n(Q66IP!)^B2B~ zRbE!j?8ZD$(JlRXj*WnXDDYVexcW!HF2uaC!W-J&d+b8^2h0bmf{RclrMz5GXCz&H8ABB;PPSoKi1uE5<47th!@bn>50G zHLcH~ZB?p!)q$v$@4y|_f=%F_2z2ngK6$;9`@AWMMq4hc-2cW{0T?(u>*@j>3=VL@@aiqC zjay_Il6u8GWbFz}<38TgENiGbX%ZE11h(~bWj5-o= zq0rw(mdf;(&T0_Sjj19ToEHK_qDeVTI56Po<26Cwu36N$u+SDaY-rPjsn9#q`c@=R zFxM`b{sY9}Hk)P2_|M#)n)v~QG|goa4*={d1PcR3=eDOG7dROu6e~M92$gTRVzU^0 zbvs^QNQ#)t$(#w+o>+_<4mf&nuYves3@R+9?~g6mqv!w?@KepU;vPhmgoLv36sY0L zxotB2>HD~NGUXQ*4LYADF!yp2=1Z19idWdcjvlp-t!A+}?Oz|Z_ z;Zl*mTT722zI<4h=b9xmOh<6%C2e-5^`naJA<2kCYaTf<8)d1_q@#m` z1Ou7U{KXdjGrn*yDqfA4xo5rMu>T{x6|=vj!Nx5yWk5?F*b5H{M;tpx$wg;u93R-; z;ofiFbjju$0V?d_qH9{$?i_=0HSx-}sYi4mXMVuH!tu(Km0+tH17v`W`qyJPzfZ4M z{1pm8-L8WrrF%sfZ}ht+XZquSBCf-Q$eEMSjY|;{I{|^0_>6H3W=17vS3J_|zSxfx z1Ki(wkXhTASN)zI2UG%D3?NTq4sD*`lb+{R&NwAd@;Q}dhY~eEm+xUx(+oylMSWN% zIylK~51bUIG5z=FGUD!as_#JRtz^R-_XU$R0407@xrEXCi0o2`jRo{ok~WvsetLpe zS-+KralI0#?a$z9LDQ`@PE1`;)2wGia3I_>khcHsruXr10S*t1L%hJr$4UNbm*^mH a(lU{uJ=L|;>^g^o4`bK9#Ov`H#s2~cs>%-l literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/slimecore/icons/machinery.dmi b/monkestation/code/modules/slimecore/icons/machinery.dmi new file mode 100644 index 0000000000000000000000000000000000000000..28c64774745ac6e28929bd0649f55c92405911a9 GIT binary patch literal 13814 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6dfd587fef44946129631826f0f93e97b52096d8 GIT binary patch literal 21622 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/slimecore/icons/slimes.dmi b/monkestation/code/modules/slimecore/icons/slimes.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5a8833104f25cf7d2a3f72360bce571d4a85a719 GIT binary patch literal 81239 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 Q+=<_^i@len3{Ncj8_VWwp8x;= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e9dfb5027b00d61ba5a87019842c51ea3592e605 GIT binary patch literal 1898 zcmV-w2bK7VP)V=-0C=30&bM0=K)%r4eh2H;65Y;$ zXLxhm>bq{C8ci=7*e^3As?(Xo+Yiw}qAW-_>z^*JhogxW5?Ks}U2n#bGZKRj42cVg zM=+CJ_Yc|?M{s!rS4rIaWip)3{kk2kn@oppa(88S{U>wOt%7PaeE>}5fMKHF7N-CJ z28&5VK~#90?VDd{TU8v#zny(BW!=_cF<=l1n;_hFVLBfwOgAoc6Q5cJ+705Eig6Sb zi*!(=3KIqOX14dvIY3X`oC;g_*k4#$-)pWw7@8ke-{HE;l*n z-gEzC`+XoZIl1?IfA{>(`JLOF-wz-Nf*=TjAP9mWh(;z98BIMNq9(|;B@`J=u|8E* z)!55;jIsTT#9~UshGtP?03Z{Kb{UP>JJ3IU3P@#Q(Jqnx>}ba0@h0}(Nn0|pXxH(? zVrpvcXKjB^4=!H11a)`}z&lzz9&b`rwW2*f)Yq9Y*jA4XqQ*oA`oTm2Kph^#FGGEu zP7Ho6O*ZIm*fKTL*QpMVVSaud0Fa+JiTyo2rI~Ni&fE7BqQ-2PO`KAP$B?@*g*(|S zwiN$Dc*hQ`YTC%`?CfWv{n^!Y!hm|CJ|aK;N0I& zVej@$di$Mh7QFgGD*ynp*(~xCCo7C$Gr%d#G~Kj?X)rEKPU?RTfABUg6hZ)iC)Fd^ z_2IYNdy%jMm@&JDPU)XTMP+HaWlK7pZpvn}$mMd#<#Nbovp5`yAQ%kd(24UnedJZV zw35WLp%Bgu9>9-huT1lXL7`2U83RCj@L&bGTuv9g`@&IfQCXU9*%FG3rrsRrpFaK8 z%bfsl=)`%TzPOgR3StnCF64?y^m{~~c-@X3E^XzS1N7QwI)9Kk(usiEy=zsKXFY@&YaX2tPo1;O)-3dWf#J^wm6+?yXqLF9{7kAW$C=3SC}qrfp}najgKo7RuvI zcs*_H0ZX%vw{O7t)z&bZuvZuzVI{`bgF6IySt8^Im?K06|JLPV>2=OL8VGH|UX=&| zYj-u>GJAB6TbD~Asn)aIvF{MWyyAEzPKThD{ zWpeGOMF6G!Kt!9%0hw5|YZORjOlqLqs*NgN*u##HIq+6in^oP0ejL56xBL)L_KatJ z8=cH&xe0zd!WLAT1#*~v5G*)ivGQo!SI`Y*|}xb|47fcb-Bo` z|IiAsn-4#iDIm~cJx2RgUld+_-2ry<;pZ|16j87oqy4OJ1z!DTCT=GmelAmhofz$R zeYLE{BFW-#dzO0j+_JRUKg*_`<^SS|5D+4{gGBZ?l{_pC`u4sM)Hg|K3PR|GSYZ07`>- z;MjAP^-cc|uv>j1^L)`5Z>MI9SO1lx}PklpGNC(pNwpY=@*vYQVt z^ZY=^itxj*iqAgQZ-^h|xAm%8wHaA!0Av-uD2toq?1H3Bsv~P1c#sB~S07*qoM6N<$f^Tn>$^ZZW literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/slimecore/icons/xenofauna.dmi b/monkestation/code/modules/slimecore/icons/xenofauna.dmi new file mode 100644 index 0000000000000000000000000000000000000000..57719f2fd9f3895ab3e51fb654da7d76924cbd90 GIT binary patch literal 62414 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 literal 0 HcmV?d00001 diff --git a/monkestation/code/modules/slimecore/items/crossbreeds.dm b/monkestation/code/modules/slimecore/items/crossbreeds.dm new file mode 100644 index 000000000000..a34505d47550 --- /dev/null +++ b/monkestation/code/modules/slimecore/items/crossbreeds.dm @@ -0,0 +1,2 @@ +/obj/item/slimecross + icon = 'monkestation/code/modules/slimecore/icons/slimecrossing_plort_version.dmi' diff --git a/monkestation/code/modules/slimecore/items/mutation_syringe.dm b/monkestation/code/modules/slimecore/items/mutation_syringe.dm new file mode 100644 index 000000000000..fd3998c06be8 --- /dev/null +++ b/monkestation/code/modules/slimecore/items/mutation_syringe.dm @@ -0,0 +1,82 @@ +/obj/item/slime_mutation_syringe + name = "slime mutation syringe" + desc = "Infuses a mutation into a slime." + + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + icon_state = "mutation_syringe" + + ///the path we infuse + var/datum/slime_trait/infusing_trait_path + /// have we been used? + var/used = FALSE + + +/obj/item/slime_mutation_syringe/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!infusing_trait_path || used) + return + if(!istype(target, /mob/living/basic/slime)) + return + + var/mob/living/basic/slime/slime = target + if(slime.add_trait(infusing_trait_path)) + used = TRUE + icon_state = "mutation_syringe-empty" + to_chat(user, span_notice("You inject [target] with [src].")) + + +/obj/item/slime_mutation_syringe/cleaner + name = "cleaner slime mutation syringe" + infusing_trait_path = /datum/slime_trait/cleaner + +/obj/item/slime_mutation_syringe/polluter + name = "polluter slime mutation syringe" + infusing_trait_path = /datum/slime_trait/polluter + +/obj/item/slime_mutation_syringe/gooey_cat + name = "gooey cat slime mutation syringe" + infusing_trait_path = /datum/slime_trait/visual/cat + +/obj/item/slime_mutation_syringe/radioactive + name = "radioactive slime mutation syringe" + infusing_trait_path = /datum/slime_trait/radioactive + +/obj/item/slime_mutation_syringe/never_evolving + name = "never splitting slime mutation syringe" + infusing_trait_path = /datum/slime_trait/never_evolving + +/obj/item/slime_mutation_syringe/never_ooze + name = "never ooze slime mutation syringe" + infusing_trait_path = /datum/slime_trait/never_ooze + +/obj/item/slime_mutation_syringe/soda_slime + name = "soda slime mutation syringe" + infusing_trait_path = /datum/slime_trait/soda_slime + +/obj/item/slime_mutation_syringe/beer_slime + name = "beer slime mutation syringe" + infusing_trait_path = /datum/slime_trait/beer_slime + +/obj/item/slime_mutation_syringe_random + name = "slime mutation syringe" + desc = "Infuses a mutation into a slime." + + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + icon_state = "mutation_syringe" + + /// have we been used? + var/used = FALSE + + +/obj/item/slime_mutation_syringe_random/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(used) + return + if(!istype(target, /mob/living/basic/slime)) + return + + var/mob/living/basic/slime/slime = target + slime.start_mutating(TRUE) + used = TRUE + icon_state = "mutation_syringe-empty" + to_chat(user, span_notice("You inject [target] with [src].")) diff --git a/monkestation/code/modules/slimecore/items/vacuum_pack.dm b/monkestation/code/modules/slimecore/items/vacuum_pack.dm new file mode 100644 index 000000000000..7129ed06c519 --- /dev/null +++ b/monkestation/code/modules/slimecore/items/vacuum_pack.dm @@ -0,0 +1,589 @@ +#define NORMAL_VACUUM_PACK_CAPACITY 3 +#define UPGRADED_VACUUM_PACK_CAPACITY 6 +#define ILLEGAL_VACUUM_PACK_CAPACITY 12 + +#define NORMAL_VACUUM_PACK_RANGE 3 +#define UPGRADED_VACUUM_PACK_RANGE 4 +#define ILLEGAL_VACUUM_PACK_RANGE 5 + +#define NORMAL_VACUUM_PACK_SPEED 12 +#define UPGRADED_VACUUM_PACK_SPEED 8 +#define ILLEGAL_VACUUM_PACK_SPEED 6 + +#define VACUUM_PACK_UPGRADE_STASIS "stasis" +#define VACUUM_PACK_UPGRADE_HEALING "healing" +#define VACUUM_PACK_UPGRADE_CAPACITY "capacity" +#define VACUUM_PACK_UPGRADE_RANGE "range" +#define VACUUM_PACK_UPGRADE_SPEED "speed" +#define VACUUM_PACK_UPGRADE_PACIFY "pacification" +#define VACUUM_PACK_UPGRADE_BIOMASS "biomass printer" + +/datum/action/item_action/toggle_nozzle + name = "Toggle Vacuum Nozzle" + +/obj/item/vacuum_pack + name = "backpack xenofauna storage" + desc = "A Xynergy Solutions brand vacuum xenofauna storage with an extendable nozzle. Do not use to practice kissing." + icon = 'monkestation/code/modules/slimecore/icons/equipment.dmi' + icon_state = "vacuum_pack" + inhand_icon_state = "vacuum_pack" + worn_icon_state = "waterbackpackjani" + lefthand_file = 'monkestation/code/modules/slimecore/icons/backpack_lefthand.dmi' + righthand_file = 'monkestation/code/modules/slimecore/icons/backpack_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + actions_types = list(/datum/action/item_action/toggle_nozzle) + max_integrity = 200 + resistance_flags = FIRE_PROOF | ACID_PROOF + + var/obj/item/vacuum_nozzle/nozzle + var/nozzle_type = /obj/item/vacuum_nozzle + var/list/stored = list() + var/capacity = NORMAL_VACUUM_PACK_CAPACITY + var/range = NORMAL_VACUUM_PACK_RANGE + var/speed = NORMAL_VACUUM_PACK_SPEED + var/illegal = FALSE + var/list/upgrades = list() + var/obj/machinery/biomass_recycler/linked + var/give_choice = TRUE //If set to true the pack will give the owner a radial selection to choose which object they want to shoot + var/check_backpack = TRUE //If it can only be used while worn on the back + var/static/list/storable_objects = typecacheof(list(/mob/living/basic/slime, + /mob/living/basic/cockroach/rockroach, + )) + var/modified = FALSE //If the gun is modified to fight with revenants + var/mob/living/basic/revenant/ghost_busting //Stores the revenant we're currently sucking in + var/mob/living/ghost_buster //Stores the user + var/busting_beam //Stores visual effects + COOLDOWN_DECLARE(busting_throw_cooldown) + +/obj/item/vacuum_pack/Initialize(mapload) + . = ..() + nozzle = new nozzle_type(src) + +/obj/item/vacuum_pack/Destroy() + QDEL_NULL(nozzle) + if(VACUUM_PACK_UPGRADE_HEALING in upgrades) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/vacuum_pack/multitool_act(mob/living/user, obj/item/tool) + . = ..() + modified = !modified + to_chat(user, span_notice("You turn the safety switch on [src] [modified ? "off" : "on"].")) + +/obj/item/vacuum_pack/process(delta_time) + if(!(VACUUM_PACK_UPGRADE_HEALING in upgrades)) + STOP_PROCESSING(SSobj, src) + + for(var/mob/living/basic/animal in stored) + animal.adjustBruteLoss(-5 * delta_time) + +/obj/item/vacuum_pack/examine(mob/user) + . = ..() + if(LAZYLEN(stored)) + . += span_notice("It has [LAZYLEN(stored)] creatures stored in it.") + if(LAZYLEN(upgrades)) + for(var/upgrade in upgrades) + . += span_notice("It has [upgrade] upgrade installed.") + +/obj/item/vacuum_pack/attackby(obj/item/item, mob/living/user, params) + if(item == nozzle) + remove_nozzle() + return + + if(user.istate & ISTATE_HARM) + return ..() + + if(istype(item, /obj/item/disk/vacuum_upgrade)) + var/obj/item/disk/vacuum_upgrade/upgrade = item + + if(illegal) + to_chat(user, span_warning("[src] has no slot to insert [upgrade] into!")) + return + + if(upgrade.upgrade_type in upgrades) + to_chat(user, span_warning("[src] already has a [upgrade.upgrade_type] upgrade!")) + return + + upgrades += upgrade.upgrade_type + upgrade.on_upgrade(src) + to_chat(user, span_notice("You install a [upgrade.upgrade_type] upgrade into [src].")) + playsound(user, 'sound/machines/click.ogg', 30, TRUE) + qdel(upgrade) + return + + return ..() + +/obj/item/vacuum_pack/ui_action_click(mob/user) + toggle_nozzle(user) + +/obj/item/vacuum_pack/proc/toggle_nozzle(mob/living/user) + if(!istype(user)) + return + + if(user.get_item_by_slot(user.getBackSlot()) != src && check_backpack) + to_chat(user, span_warning("[src] must be worn properly to use!")) + return + + if(user.incapacitated()) + return + + if(QDELETED(nozzle)) + nozzle = new nozzle_type(src) + + if(nozzle in src) + if(!user.put_in_hands(nozzle)) + to_chat(user, span_warning("You need a free hand to hold [nozzle]!")) + return + else + playsound(user, 'sound/mecha/mechmove03.ogg', 75, TRUE) + else + remove_nozzle() + +/obj/item/vacuum_pack/item_action_slot_check(slot, mob/user) + if(slot == user.getBackSlot()) + return TRUE + +/obj/item/vacuum_pack/equipped(mob/user, slot) + . = ..() + if(slot != ITEM_SLOT_BACK) + remove_nozzle() + +/obj/item/vacuum_pack/proc/remove_nozzle() + if(!QDELETED(nozzle)) + if(ismob(nozzle.loc)) + var/mob/wearer = nozzle.loc + wearer.temporarilyRemoveItemFromInventory(nozzle, TRUE) + playsound(loc, 'sound/mecha/mechmove03.ogg', 75, TRUE) + nozzle.forceMove(src) + +/obj/item/vacuum_pack/attack_hand(mob/user, list/modifiers) + if (user.get_item_by_slot(user.getBackSlot()) == src) + toggle_nozzle(user) + else + return ..() + +/obj/item/vacuum_pack/MouseDrop(obj/over_object) + var/mob/wearer = loc + if(istype(wearer) && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/hand = over_object + wearer.putItemFromInventoryInHandIfPossible(src, hand.held_index) + return ..() + +/obj/item/vacuum_pack/dropped(mob/user) + ..() + remove_nozzle() + +/obj/item/vacuum_nozzle + name = "vacuum pack nozzle" + desc = "A large nozzle attached to a vacuum pack." + icon = 'monkestation/code/modules/slimecore/icons/equipment.dmi' + icon_state = "vacuum_nozzle" + inhand_icon_state = "vacuum_nozzle" + lefthand_file = 'monkestation/code/modules/slimecore/icons/mister_lefthand.dmi' + righthand_file = 'monkestation/code/modules/slimecore/icons/mister_righthand.dmi' + w_class = WEIGHT_CLASS_HUGE + item_flags = NOBLUDGEON | ABSTRACT + slot_flags = NONE + + var/obj/item/vacuum_pack/pack + +/obj/item/vacuum_nozzle/Initialize(mapload) + . = ..() + pack = loc + if(!istype(pack)) + return INITIALIZE_HINT_QDEL + +/obj/item/vacuum_nozzle/doMove(atom/destination) + if(destination && (destination != pack.loc || !ismob(destination))) + if (loc != pack) + to_chat(pack.loc, span_notice("[src] snaps back onto [pack].")) + destination = pack + . = ..() + +/obj/item/vacuum_nozzle/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + + if(pack.modified && pack.ghost_busting && target != pack.ghost_busting && COOLDOWN_FINISHED(pack, busting_throw_cooldown)) + pack.ghost_busting.throw_at(get_turf(target), get_dist(pack.ghost_busting, target), 3, user) + COOLDOWN_START(pack, busting_throw_cooldown, 3 SECONDS) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades)) + to_chat(user, span_warning("[pack] does not posess a required upgrade!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(!pack.linked) + to_chat(user, span_warning("[pack] is not linked to a biomass recycler!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/list/items = list() + var/list/item_names = list() + + for(var/printable_type in GLOB.biomass_unlocks) + pack.linked.vacuum_printable_types |= printable_type + pack.linked.vacuum_printable_types[printable_type] = GLOB.biomass_unlocks[printable_type] + + for(var/printable_type in pack.linked.vacuum_printable_types) + var/atom/movable/printable = printable_type + var/image/printable_image = image(icon = initial(printable.icon), icon_state = initial(printable.icon_state)) + items += list(initial(printable.name) = printable_image) + item_names[initial(printable.name)] = printable_type + + + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) + + if(!pick) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/spawn_type = item_names[pick] + if(pack.linked.stored_matter < pack.linked.vacuum_printable_types[spawn_type]) + to_chat(user, span_warning("[pack.linked] does not have enough stored biomass for that! It currently has [pack.linked.stored_matter] out of [pack.linked.vacuum_printable_types[spawn_type]] unit\s required.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/atom/movable/spawned = new spawn_type(user.loc) + spawned.AddComponent(/datum/component/vac_tagged, user) + + pack.linked.stored_matter -= pack.linked.vacuum_printable_types[spawn_type] + playsound(user, 'sound/misc/moist_impact.ogg', 50, TRUE) + spawned.transform = matrix().Scale(0.5) + spawned.alpha = 0 + animate(spawned, alpha = 255, time = 8, easing = QUAD_EASING|EASE_OUT, transform = matrix(), flags = ANIMATION_PARALLEL) + + if(isturf(user.loc)) + ADD_TRAIT(spawned, VACPACK_THROW, "vacpack") + spawned.pass_flags |= PASSMOB + spawned.throw_at(target, min(get_dist(user, target), (pack.illegal ? 5 : 11)), 1, user, gentle = TRUE) //Gentle so eggs have 50% instead of 12.5% to spawn a chick + + user.visible_message(span_warning("[user] shoots [spawned] out their [src]!"), span_notice("You fabricate and shoot [spawned] out of your [src].")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/vacuum_nozzle/afterattack(atom/movable/target, mob/user, proximity, params) + . = ..() + if(pack.ghost_busting) + return + + if(pack.modified && !pack.ghost_busting && isrevenant(target) && get_dist(user, target) < 4) + start_busting(target, user) + return + + if(istype(target, /obj/machinery/biomass_recycler) && target.Adjacent(user)) + if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades)) + to_chat(user, span_warning("[pack] does not posess a required upgrade!")) + return + pack.linked = target + to_chat(user, span_notice("You link [pack] to [target].")) + return + + if(pack.linked) + var/can_recycle + for(var/recycable_type in pack.linked.recyclable_types) + if(istype(target, recycable_type)) + can_recycle = recycable_type + break + + var/target_stat = FALSE + if(isliving(target)) + var/mob/living/living_target = target + target_stat = living_target.stat + + if(can_recycle && (!is_type_in_typecache(target, pack.storable_objects) || target_stat != CONSCIOUS)) + if(!(VACUUM_PACK_UPGRADE_BIOMASS in pack.upgrades)) + to_chat(user, span_warning("[pack] does not posess a required upgrade!")) + return + + if(!pack.linked) + to_chat(user, span_warning("[pack] is not linked to a biomass recycler!")) + return + + if(target_stat == CONSCIOUS) + to_chat(user, span_warning("[target] is struggling far too much for you to suck it in!")) + return + + if(isliving(target)) + var/mob/living/living = target + if(living.buckled) + living.buckled.unbuckle_mob(target, TRUE) + target.unbuckle_all_mobs(TRUE) + + if(!do_after(user, pack.speed, target, timed_action_flags = IGNORE_TARGET_LOC_CHANGE)) + return + + playsound(src, 'sound/effects/refill.ogg', 50, TRUE) + var/matrix/animation_matrix = matrix() + animation_matrix.Scale(0.5) + animation_matrix.Translate((user.x - target.x) * 32, (user.y - target.y) * 32) + animate(target, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, transform = animation_matrix, flags = ANIMATION_PARALLEL) + sleep(8) + user.visible_message(span_warning("[user] sucks [target] into their [pack]!"), span_notice("You successfully suck [target] into your [src] and recycle it.")) + qdel(target) + playsound(user, 'sound/machines/juicer.ogg', 50, TRUE) + pack.linked.use_power(500) + pack.linked.stored_matter += pack.linked.cube_production * pack.linked.recyclable_types[can_recycle] + return + + if(is_type_in_typecache(target, pack.storable_objects)) + if(get_dist(user, target) > pack.range) + to_chat(user, span_warning("[target] is too far away!")) + return + + if(!(target in view(user, pack.range))) + to_chat(user, span_warning("You can't reach [target]!")) + return + + if(target.anchored || target.move_resist > MOVE_FORCE_STRONG) + to_chat(user, span_warning("You can't manage to suck [target] in!")) + return + + if(isslime(target)) + var/mob/living/basic/slime/slime = target + if(HAS_TRAIT(slime, TRAIT_SLIME_RABID) && !pack.illegal && !(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades)) + to_chat(user, span_warning("[slime] is wiggling far too much for you to suck it in!")) + return + + if(LAZYLEN(pack.stored) >= pack.capacity) + to_chat(user, span_warning("[pack] is already filled to the brim!")) + return + + if(!do_after(user, pack.speed, target, timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE, extra_checks = CALLBACK(src, .proc/suck_checks, target, user))) + return + + if(SEND_SIGNAL(target, COMSIG_LIVING_VACUUM_PRESUCK, src, user) & COMPONENT_LIVING_VACUUM_CANCEL_SUCK) + return + + suck_victim(target, user) + return + + if(LAZYLEN(pack.stored) == 0) + to_chat(user, span_warning("[pack] is empty!")) + return + + var/mob/living/spewed + + if(pack.give_choice) + var/list/items = list() + var/list/items_stored = list() + for(var/atom/movable/stored_obj in pack.stored) + var/image/stored_image = image(icon = stored_obj.icon, icon_state = stored_obj.icon_state) + stored_image.color = stored_obj.color + items += list(stored_obj.name = stored_image) + items_stored[stored_obj.name] = stored_obj + + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) + + if(!pick) + return + spewed = items_stored[pick] + else + spewed = pick(pack.stored) + + playsound(user, 'sound/misc/moist_impact.ogg', 50, TRUE) + spewed.transform = matrix().Scale(0.5) + spewed.alpha = 0 + animate(spewed, alpha = 255, time = 8, easing = QUAD_EASING|EASE_OUT, transform = matrix(), flags = ANIMATION_PARALLEL) + spewed.forceMove(user.loc) + + if(isturf(user.loc)) + ADD_TRAIT(spewed, VACPACK_THROW, "vacpack") + spewed.pass_flags |= PASSMOB + spewed.throw_at(target, min(get_dist(user, target), (pack.illegal ? 5 : 11)), 1, user) + if(prob(99) && spewed.stat != DEAD) + playsound(spewed, 'sound/misc/woohoo.ogg', 50, TRUE) + + if(istype(spewed, /mob/living/basic/slime)) + var/mob/living/basic/slime/slime = spewed + slime.slime_flags &= ~STORED_SLIME + if(slime.ai_controller) + slime.ai_controller.set_ai_status(AI_STATUS_ON) + if(VACUUM_PACK_UPGRADE_STASIS in pack.upgrades) + REMOVE_TRAIT(slime, TRAIT_SLIME_STASIS, "vacuum_pack_stasis") + + if(pack.illegal) + + ADD_TRAIT(slime, TRAIT_SLIME_RABID, "syndicate_slimepack") + + user.changeNext_move(CLICK_CD_RAPID) //Like a machine gun + + else if(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades) + REMOVE_TRAIT(slime, TRAIT_SLIME_RABID, null) + + + pack.stored -= spewed + user.visible_message(span_warning("[user] shoots [spewed] out their [src]!"), span_notice("You shoot [spewed] out of your [src].")) + +/obj/item/vacuum_nozzle/proc/suck_checks(atom/movable/target, mob/user) + if(get_dist(user, target) > pack.range) + return FALSE + + if(!(target in view(user, pack.range))) + return FALSE + + if(target.anchored || target.move_resist > MOVE_FORCE_STRONG) + return FALSE + + if(isslime(target)) + var/mob/living/basic/slime/slime = target + if(HAS_TRAIT(slime, TRAIT_SLIME_RABID) && !pack.illegal && !(VACUUM_PACK_UPGRADE_PACIFY in pack.upgrades)) + return FALSE + + if(LAZYLEN(pack.stored) >= pack.capacity) + return FALSE + + return TRUE + +/obj/item/vacuum_nozzle/proc/suck_victim(atom/movable/target, mob/user, silent = FALSE) + if(!suck_checks(target, user)) + return + + if(!silent) + playsound(user, 'sound/effects/refill.ogg', 50, TRUE) + var/matrix/animation_matrix = target.transform + animation_matrix.Scale(0.5) + animation_matrix.Translate((user.x - target.x) * 32, (user.y - target.y) * 32) + animate(target, alpha = 0, time = 8, easing = QUAD_EASING|EASE_IN, transform = animation_matrix, flags = ANIMATION_PARALLEL) + sleep(8) + target.unbuckle_all_mobs(TRUE) + target.forceMove(pack) + pack.stored += target + if((VACUUM_PACK_UPGRADE_STASIS in pack.upgrades) && isslime(target)) + var/mob/living/basic/slime/slime = target + ADD_TRAIT(slime, TRAIT_SLIME_STASIS, "vacuum_pack_stasis") + SEND_SIGNAL(target, COMSIG_ATOM_SUCKED) + if(!silent) + user.visible_message(span_warning("[user] sucks [target] into their [pack]!"), span_notice("You successfully suck [target] into your [src].")) + var/mob/living/basic/slime/slime = target + slime.slime_flags |= STORED_SLIME + if(slime.ai_controller) + slime.ai_controller.set_ai_status(AI_STATUS_OFF) + slime.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, null) + +/obj/item/vacuum_nozzle/proc/start_busting(mob/living/basic/revenant/revenant, mob/living/user) + revenant.visible_message(span_warning("[user] starts sucking [revenant] into their [src]!"), span_userdanger("You are being sucked into [user]'s [src]!")) + pack.ghost_busting = revenant + pack.ghost_buster = user + pack.busting_beam = user.Beam(revenant, icon_state="drain_life") + bust_the_ghost() + +/obj/item/vacuum_nozzle/proc/bust_the_ghost() + while(check_busting()) + if(!do_after(pack.ghost_buster, 0.5 SECONDS, target = pack.ghost_busting, extra_checks = CALLBACK(src, .proc/check_busting), timed_action_flags = IGNORE_TARGET_LOC_CHANGE|IGNORE_USER_LOC_CHANGE)) + pack.ghost_busting = null + pack.ghost_buster = null + QDEL_NULL(pack.busting_beam) + return + + //pack.ghost_busting.adjustHealth(5) + //pack.ghost_busting.reveal(0.5 SECONDS, TRUE) + +/obj/item/vacuum_nozzle/proc/check_busting() + if(!pack.ghost_busting || !pack.ghost_busting.loc || QDELETED(pack.ghost_busting)) + return FALSE + + if(!pack.ghost_buster || !pack.ghost_buster.loc || QDELETED(pack.ghost_buster)) + return FALSE + + if(loc != pack.ghost_buster) + return FALSE + + if(get_dist(pack.ghost_buster, pack.ghost_busting) > 3) + return FALSE + + if(pack.ghost_busting.essence <= 0) //Means that the revenant is dead + return FALSE + + return TRUE + +/obj/item/disk/vacuum_upgrade + name = "vacuum pack upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage." + icon_state = "rndmajordisk" + var/upgrade_type + +/obj/item/disk/vacuum_upgrade/proc/on_upgrade(obj/item/vacuum_pack/pack) + +/obj/item/disk/vacuum_upgrade/stasis + name = "vacuum pack stasis upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to keep all slimes inside of it in stasis." + upgrade_type = VACUUM_PACK_UPGRADE_STASIS + +/obj/item/disk/vacuum_upgrade/healing + name = "vacuum pack healing upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that makes the pack passively heal all the slimes inside of it." + upgrade_type = VACUUM_PACK_UPGRADE_HEALING + +/obj/item/disk/vacuum_upgrade/healing/on_upgrade(obj/item/vacuum_pack/pack) + START_PROCESSING(SSobj, pack) + +/obj/item/disk/vacuum_upgrade/capacity + name = "vacuum pack capacity upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that expands it's internal slime storage." + upgrade_type = VACUUM_PACK_UPGRADE_CAPACITY + +/obj/item/disk/vacuum_upgrade/capacity/on_upgrade(obj/item/vacuum_pack/pack) + pack.capacity = UPGRADED_VACUUM_PACK_CAPACITY + +/obj/item/disk/vacuum_upgrade/range + name = "vacuum pack range upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that strengthens it's pump and allows it to reach further." + upgrade_type = VACUUM_PACK_UPGRADE_RANGE + +/obj/item/disk/vacuum_upgrade/range/on_upgrade(obj/item/vacuum_pack/pack) + pack.range = UPGRADED_VACUUM_PACK_RANGE + +/obj/item/disk/vacuum_upgrade/speed + name = "vacuum pack speed upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that upgrades it's motor and allows it to suck slimes up faster." + upgrade_type = VACUUM_PACK_UPGRADE_SPEED + +/obj/item/disk/vacuum_upgrade/speed/on_upgrade(obj/item/vacuum_pack/pack) + pack.speed = UPGRADED_VACUUM_PACK_SPEED + +/obj/item/disk/vacuum_upgrade/pacification + name = "vacuum pack pacification upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to pacify all stored slimes." + upgrade_type = VACUUM_PACK_UPGRADE_PACIFY + +/obj/item/disk/vacuum_upgrade/biomass + name = "vacuum pack biomass printer upgrade disk" + desc = "An upgrade disk for a backpack vacuum xenofauna storage that allows it to automatically recycle dead biomass and make living creatures on right click." + upgrade_type = VACUUM_PACK_UPGRADE_BIOMASS + +/obj/item/vacuum_pack/syndicate + name = "modified backpack xenofauna storage" + desc = "An illegally modified vacuum backpack xenofauna storage that has much more power, capacity and will make every slime it shoots out rabid." + icon_state = "vacuum_pack_syndicate" + inhand_icon_state = "vacuum_pack_syndicate" + range = ILLEGAL_VACUUM_PACK_RANGE + capacity = ILLEGAL_VACUUM_PACK_CAPACITY + speed = ILLEGAL_VACUUM_PACK_SPEED + illegal = TRUE + nozzle_type = /obj/item/vacuum_nozzle/syndicate + upgrades = list(VACUUM_PACK_UPGRADE_HEALING, VACUUM_PACK_UPGRADE_STASIS, VACUUM_PACK_UPGRADE_BIOMASS) + give_choice = FALSE + +/obj/item/vacuum_nozzle/syndicate + name = "modified vacuum pack nozzle" + desc = "A large black and red nozzle attached to a vacuum pack." + icon_state = "vacuum_nozzle_syndicate" + inhand_icon_state = "vacuum_nozzle_syndicate" + + +#undef NORMAL_VACUUM_PACK_CAPACITY +#undef UPGRADED_VACUUM_PACK_CAPACITY +#undef ILLEGAL_VACUUM_PACK_CAPACITY + +#undef NORMAL_VACUUM_PACK_RANGE +#undef UPGRADED_VACUUM_PACK_RANGE +#undef ILLEGAL_VACUUM_PACK_RANGE + +#undef NORMAL_VACUUM_PACK_SPEED +#undef UPGRADED_VACUUM_PACK_SPEED +#undef ILLEGAL_VACUUM_PACK_SPEED + +#undef VACUUM_PACK_UPGRADE_STASIS +#undef VACUUM_PACK_UPGRADE_HEALING +#undef VACUUM_PACK_UPGRADE_CAPACITY +#undef VACUUM_PACK_UPGRADE_RANGE +#undef VACUUM_PACK_UPGRADE_SPEED +#undef VACUUM_PACK_UPGRADE_PACIFY +#undef VACUUM_PACK_UPGRADE_BIOMASS diff --git a/monkestation/code/modules/slimecore/machines/biomass_recycler.dm b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm new file mode 100644 index 000000000000..be89b669ffe2 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm @@ -0,0 +1,181 @@ +GLOBAL_LIST_INIT(biomass_unlocks, list()) + +/obj/machinery/biomass_recycler + name = "biomass recycler" + desc = "A machine used for recycling dead biomass and fabricating dehydrated creatures and eggs." + icon = 'icons/obj/kitchen.dmi' + icon_state = "grinder" + layer = BELOW_OBJ_LAYER + density = TRUE + circuit = /obj/item/circuitboard/machine/biomass_recycler + var/stored_matter = 0 + var/cube_production = 0.2 + + var/static/list/recyclable_types = list(/mob/living/carbon/human/species/monkey = 1) + var/list/printable_types = list(/obj/item/stack/biomass = 1, /obj/item/food/monkeycube = 1) + var/list/vacuum_printable_types = list(/mob/living/carbon/human/species/monkey = 1) + +/obj/machinery/biomass_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled + . = ..() + cube_production = 0.2 + for(var/obj/item/stock_parts/manipulator/B in component_parts) + cube_production += B.rating * 0.1 + for(var/obj/item/stock_parts/matter_bin/M in component_parts) + cube_production += M.rating * 0.1 + +/obj/machinery/biomass_recycler/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += span_notice("The status display reads: Recycles [cube_production] biomass units per unit inserted.") + +/obj/machinery/biomass_recycler/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(default_unfasten_wrench(user, tool)) + power_change() + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/biomass_recycler/attackby(obj/item/O, mob/user, params) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) + return + + if(default_pry_open(O)) + return + + if(default_deconstruction_crowbar(O)) + return + + if(machine_stat) //NOPOWER etc + return + + if(HAS_TRAIT(O, TRAIT_NODROP)) + return + + if(istype(O, /obj/item/stack/biomass)) + var/obj/item/stack/biomass/biomass = O + to_chat(user, span_notice("You insert [biomass.amount] cube\s of biomass into [src].")) + stored_matter += biomass.amount + qdel(biomass) + return + + var/can_recycle + for(var/recycable_type in recyclable_types) + if(istype(O, recycable_type)) + can_recycle = recycable_type + break + + if(can_recycle) + recycle(O, user, can_recycle) + +/obj/machinery/biomass_recycler/MouseDrop_T(mob/living/target, mob/living/user) + if(!istype(target)) + return + + var/can_recycle + for(var/recycable_type in recyclable_types) + if(istype(target, recycable_type)) + can_recycle = recycable_type + break + + if(can_recycle) + stuff_creature_in(target, user, can_recycle) + +/obj/machinery/biomass_recycler/proc/stuff_creature_in(mob/living/target, mob/living/user, recycable_type) + if(!istype(target)) + return + if(target.stat == CONSCIOUS) + to_chat(user, span_warning("[target] is struggling far too much to put it in the recycler.")) + return + if(target.buckled || target.has_buckled_mobs()) + to_chat(user, span_warning("[target] is attached to something.")) + return + + recycle(target, user, recycable_type) + +/obj/machinery/biomass_recycler/proc/recycle(atom/movable/target, mob/living/user, recycable_type) + qdel(target) + to_chat(user, span_notice("You stuff [target] into the machine.")) + playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE) + var/offset = prob(50) ? -2 : 2 + animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking + use_power(active_power_usage) + stored_matter += cube_production * recyclable_types[recycable_type] + addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x)) + addtimer(CALLBACK(GLOBAL_PROC, /proc/to_chat, user, span_notice("The machine now has [stored_matter] unit\s of biomass stored."))) + +/obj/machinery/biomass_recycler/interact(mob/user) + var/list/items = list() + var/list/item_names = list() + for(var/printable_type in GLOB.biomass_unlocks) + printable_types |= printable_type + printable_types[printable_type] = GLOB.biomass_unlocks[printable_type] + + recyclable_types |= list(printable_type = 1) + + for(var/printable_type in printable_types) + var/atom/movable/printable = printable_type + var/image/printable_image = image(icon = initial(printable.icon), icon_state = initial(printable.icon_state)) + items += list(initial(printable.name) = printable_image) + item_names[initial(printable.name)] = printable_type + + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) + + if(!pick) + return + + var/spawn_type = item_names[pick] + if(stored_matter < printable_types[spawn_type]) + to_chat(user, span_warning("[src] does not have enough stored biomass for that! It currently has [stored_matter] out of [printable_types[spawn_type]] unit\s required.")) + return + + var/spawned = new spawn_type(user.loc) + to_chat(user, span_notice("The machine hisses loudly as it condenses the biomass. After a moment, it dispenses a brand new [spawned].")) + playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE) + stored_matter -= printable_types[spawn_type] + to_chat(user, span_notice("The machine's display flashes that it has [stored_matter] unit\s of biomass left.")) + +/obj/item/stack/biomass + name = "biomass cubes" + desc = "A few cubes of green biomass." + icon = 'monkestation/code/modules/slimecore/icons/stack_objects.dmi' + icon_state = "biomass" + base_icon_state = "biomass" + max_amount = 5 + singular_name = "biomass cube" + merge_type = /obj/item/stack/biomass + flags_1 = CONDUCT_1 + +/obj/item/stack/biomass/update_icon_state() + . = ..() + icon_state = (amount == 1) ? "[base_icon_state]" : "[base_icon_state]_[min(amount, 5)]" + +/obj/item/disk/biomass_upgrade + name = "biomass recycler upgrade disk" + desc = "An upgrade disk for biomass recycler." + icon_state = "rndmajordisk" + var/list/printable_types = list() + var/list/vacuum_printable_types = list() + +/obj/item/disk/biomass_upgrade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(istype(target, /obj/machinery/biomass_recycler)) + var/obj/machinery/biomass_recycler/recycler = target + to_chat(user, span_notice("You install [src] into [recycler].")) + playsound(user, 'sound/machines/click.ogg', 30, TRUE) + + for(var/print_type in printable_types) + recycler.printable_types[print_type] = printable_types[print_type] + + for(var/print_type in vacuum_printable_types) + recycler.vacuum_printable_types[print_type] = vacuum_printable_types[print_type] + +/* +/obj/item/disk/biomass_upgrade/wobble + name = "\"Wobble Chicken\" biomass recycler upgrade disk" + printable_types = list(/obj/item/food/wobble_egg = 0.75) + vacuum_printable_types = list(/obj/item/food/wobble_egg = 0.75) +*/ + +/obj/item/disk/biomass_upgrade/rockroach + name = "\"Rockroach\" biomass recycler upgrade disk" + printable_types = list(/mob/living/basic/cockroach/rockroach = 0.4) + vacuum_printable_types = list(/mob/living/basic/cockroach/rockroach = 0.4) diff --git a/monkestation/code/modules/slimecore/machines/extract_requestor.dm b/monkestation/code/modules/slimecore/machines/extract_requestor.dm new file mode 100644 index 000000000000..1e254d48b130 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/extract_requestor.dm @@ -0,0 +1,180 @@ +/obj/machinery/slime_extract_requestor + name = "extract requestor pad" + desc = "A tall device with a hole for retrieving slime extracts." + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "civilian_pad" + base_icon_state = "civilian_pad" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 2000 + circuit = /obj/item/circuitboard/machine/slime_extract_requestor + var/obj/machinery/computer/slime_market/console + var/list/current_requests = list() + + var/static/list/extracts = list() + var/static/list/name_to_path = list() + + +/obj/machinery/slime_extract_requestor/Initialize(mapload) + . = ..() + if(GLOB.default_slime_market) + console = GLOB.default_slime_market + console.request_pad = src + + if(!length(extracts)) + for(var/obj/item/slime_extract/extract as anything in subtypesof(/obj/item/slime_extract)) + var/obj/item/slime_extract/new_extract = new extract + extracts |= list("[new_extract.name]" = image(icon = new_extract.icon, icon_state = new_extract.icon_state)) + name_to_path |= list("[new_extract.name]" = new_extract.type) + qdel(new_extract) + +/obj/machinery/slime_extract_requestor/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!console) + to_chat(user, span_warning("[src] does not have a console linked to it!")) + return + var/obj/item/card/id/card = user.get_idcard(TRUE) + if(!card) + to_chat(user, span_warning("Unable to locate an ID card!")) + return + + if(check_in_requests(card)) + if(check_finished_request(card)) + return + say("You already have an ongoing request, would you like to cancel it?") + if(tgui_alert(user, "You already have an ongoing request, would you like to cancel it?", "[name]", list("Yes", "No")) == "Yes") + cancel_request(card) + return + create_request(user, card) + +/obj/machinery/slime_extract_requestor/multitool_act(mob/living/user, obj/item/tool) + if(!panel_open) + return + if(!multitool_check_buffer(user, tool)) + return + var/obj/item/multitool/multitool = tool + multitool.buffer = src + to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/slime_extract_requestor/proc/check_in_requests(obj/item/card/id/card) + for(var/datum/extract_request_data/listed_request as anything in current_requests) + if(!(listed_request.host_card == card)) + continue + return TRUE + return FALSE + +/obj/machinery/slime_extract_requestor/proc/check_finished_request(obj/item/card/id/card) + for(var/datum/extract_request_data/listed_request as anything in current_requests) + if(!(listed_request.host_card == card)) + continue + if(listed_request.ready_for_pickup) + var/obj/item/storage/box/box = new(loc) + for(var/i in 1 to listed_request.extracts_needed) + new listed_request.extract_path(box) + current_requests -= listed_request + listed_request.finish_request(console) + qdel(listed_request) + return TRUE + return FALSE + +/obj/machinery/slime_extract_requestor/proc/cancel_request(obj/item/card/id/card) + for(var/datum/extract_request_data/listed_request as anything in current_requests) + if(!(listed_request.host_card == card)) + continue + current_requests -= listed_request + listed_request.cancel_request_early(console) + qdel(listed_request) + +/obj/machinery/slime_extract_requestor/proc/create_request(mob/user, obj/item/card/id/card) + var/choice = show_radial_menu(user, src, extracts, require_near = TRUE, tooltips = TRUE) + + if(!(choice in name_to_path)) + return + + var/number_choice = tgui_input_number(user, "How many extracts do you want?", "[name]", default = 1, min_value = 1, round_value = 1, max_value = 15) + if(!number_choice) + return + + var/payout = tgui_input_number(user, "How much will the payout be for this request?", "[name]", default = 0, min_value = 0, round_value = 1, max_value = card.registered_account.account_balance) + if(payout) + card.registered_account.adjust_money(-payout, "Slime Extract Request") + + var/datum/extract_request_data/request = new + + request.host_card = card + request.extract_path = name_to_path[choice] + request.extracts_needed = number_choice + request.payout = payout + request.linked_console = console + request.request_name = "[card.registered_name]'s [choice] request ([number_choice])" + request.on_creation() + + var/obj/item/slime_extract/request_extract = name_to_path[choice] + request.radial_data = list("[request.request_name]" = image(icon = initial(request_extract.icon), icon_state = initial(request_extract.icon_state))) + + current_requests += request + console.say("A new request has been made.") + +/datum/extract_request_data + ///the name of our request + var/request_name + ///our linked_console purely for when something is early deleted + var/obj/machinery/computer/slime_market/linked_console + ///the card from which the request was made + var/obj/item/card/id/host_card + ///the extract we spawn + var/extract_path + ///the amount of extracts we need + var/extracts_needed = 1 + ///the payoff sent to the scientist that finished the bounty + var/payout = 0 + //radial information + var/list/radial_data = list() + ///amount of extracts given + var/extracts_given = 0 + ///finished request + var/ready_for_pickup = FALSE + +/datum/extract_request_data/proc/on_creation() + RegisterSignal(host_card, COMSIG_QDELETING, PROC_REF(end_request_qdeleted)) + +/datum/extract_request_data/Destroy(force, ...) + UnregisterSignal(host_card, COMSIG_QDELETING) + host_card = null + linked_console = null + QDEL_LIST(radial_data) + . = ..() + +/datum/extract_request_data/proc/end_request_qdeleted() + SIGNAL_HANDLER + + linked_console.say("[host_card.registered_name]'s request has been cancelled.") + linked_console.return_extracts(extract_path, extracts_given) + linked_console.stored_credits += payout * 0.5 + qdel(src) + +/datum/extract_request_data/proc/cancel_request_early(obj/machinery/computer/slime_market/console) + console.say("[host_card.registered_name]'s request has been cancelled.") + console.return_extracts(extract_path, extracts_given) + if(payout) + host_card.registered_account.adjust_money(payout * 0.5, "Slime Extract Request Cancelled Early") + console.stored_credits += payout * 0.5 + qdel(src) + +/datum/extract_request_data/proc/finish_request(obj/machinery/computer/slime_market/console) + console.say("[host_card.registered_name]'s request has been collected.") + console.stored_credits += payout + SSresearch.xenobio_points += payout * 3 + qdel(src) + + +/datum/extract_request_data/proc/add_extract() + extracts_given++ + if(extracts_given >= extracts_needed) + ready_for_pickup = TRUE + declare_ready() + +/datum/extract_request_data/proc/declare_ready() + host_card.say("Extract Request has been completed, please come collect your request.") diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm new file mode 100644 index 000000000000..8baef0b70d46 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm @@ -0,0 +1,214 @@ +#define CROSSBREED_BASE_PATHS list(\ +/datum/compressor_recipe/crossbreed/burning,\ +/datum/compressor_recipe/crossbreed/charged,\ +/datum/compressor_recipe/crossbreed/chilling,\ +/datum/compressor_recipe/crossbreed/consuming,\ +/datum/compressor_recipe/crossbreed/industrial,\ +/datum/compressor_recipe/crossbreed/prismatic,\ +/datum/compressor_recipe/crossbreed/regenerative,\ +/datum/compressor_recipe/crossbreed/reproductive,\ +/datum/compressor_recipe/crossbreed/selfsustaining,\ +/datum/compressor_recipe/crossbreed/stabilized,\ +) + +/obj/machinery/plumbing/ooze_compressor + name = "ooze compressor" + desc = "Compresses ooze into extracts." + + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + base_icon_state = "cross_compressor" + icon_state = "cross_compressor" + category="Distribution" + + anchored = TRUE + + idle_power_usage = 10 + active_power_usage = 1000 + + buffer = 5000 + reagent_flags = NO_REACT + + var/compressing = FALSE + var/repeat_recipe = FALSE + + var/list/reagents_for_recipe = list() + var/datum/compressor_recipe/current_recipe + + var/static/list/recipe_choices = list() + var/static/list/base_choices = list() + var/static/list/cross_breed_choices = list() + var/static/list/choice_to_datum = list() + +/obj/machinery/plumbing/ooze_compressor/Initialize(mapload, bolt, layer) + . = ..() + if(!length(recipe_choices)) + for(var/datum/compressor_recipe/listed as anything in (subtypesof(/datum/compressor_recipe) - typesof(/datum/compressor_recipe/crossbreed))) + var/datum/compressor_recipe/stored_recipe = new listed + recipe_choices |= list("[initial(stored_recipe.output_item.name)]" = image(icon = initial(stored_recipe.output_item.icon), icon_state = initial(stored_recipe.output_item.icon_state))) + choice_to_datum |= list("[initial(stored_recipe.output_item.name)]" = stored_recipe) + + if(!length(cross_breed_choices)) + for(var/datum/compressor_recipe/listed as anything in CROSSBREED_BASE_PATHS) + var/datum/compressor_recipe/stored_recipe = new listed + var/obj/item/slimecross/crossbreed = stored_recipe.output_item + var/image/new_image = image(icon = initial(stored_recipe.output_item.icon), icon_state = initial(stored_recipe.output_item.icon_state)) + new_image.color = return_color_from_string(initial(crossbreed.colour)) + if(initial(crossbreed.colour) == "rainbow") + new_image.rainbow_effect() + base_choices |= list("[initial(stored_recipe.output_item.name)]" = new_image) + cross_breed_choices |= list("[initial(stored_recipe.output_item.name)]" = list()) + + for(var/datum/compressor_recipe/subtype as anything in subtypesof(listed)) + var/datum/compressor_recipe/subtype_stored = new subtype + var/obj/item/slimecross/subtype_breed = subtype_stored.output_item + var/image/subtype_image = image(icon = initial(subtype_stored.output_item.icon), icon_state = initial(subtype_stored.output_item.icon_state)) + subtype_image.color = return_color_from_string(initial(subtype_breed.colour)) + if(initial(subtype_breed.colour) == "rainbow") + subtype_image.rainbow_effect() + + cross_breed_choices["[initial(stored_recipe.output_item.name)]"] |= list("[initial(subtype_breed.colour)] [initial(subtype_stored.output_item.name)]" = subtype_image) + choice_to_datum |= list("[initial(subtype_breed.colour)] [initial(subtype_stored.output_item.name)]" = subtype_stored) + + AddComponent(/datum/component/plumbing/ooze_compressor, bolt, layer) + register_context() + +/obj/machinery/plumbing/ooze_compressor/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle Repeated Extract Compression" + context[SCREENTIP_CONTEXT_LMB] = "Select a normal extract to make" + context[SCREENTIP_CONTEXT_RMB] = "Select a crossbreed to make" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/plumbing/ooze_compressor/create_reagents(max_vol, flags) + . = ..() + RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) + RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) + +/obj/machinery/plumbing/ooze_compressor/update_icon_state() + . = ..() + if(compressing) + icon_state = "cross_compressor_running" + else + icon_state = base_icon_state + +/obj/machinery/plumbing/ooze_compressor/examine(mob/user) + . = ..() + if(!current_recipe) + return + for(var/datum/reagent/reagent as anything in current_recipe.required_oozes) + var/reagent_volume = 0 + for(var/datum/reagent/listed_reagent as anything in reagents.reagent_list) + if(listed_reagent.type != reagent) + continue + reagent_volume = listed_reagent.volume + . += span_notice("[reagent_volume] out of [current_recipe.required_oozes[reagent]] units of [initial(reagent.name)].") + reagent_volume = 0 + +/obj/machinery/plumbing/ooze_compressor/update_overlays() + . = ..() + if(length(reagents.reagent_list) >= 1 && length(reagents_for_recipe) >= 1) + var/needed_reagents = reagents_for_recipe[1] + var/datum/reagent/first_reagent = reagents.reagent_list[1] + var/filled_precent = first_reagent.volume / reagents_for_recipe[needed_reagents] + + var/state = "quarter" + switch(filled_precent) + if(0.5 to 0.99) + state = "half" + if(1 to INFINITY) + state = "full" + + var/mutable_appearance/right_side = mutable_appearance(icon, "cross_compressor_right_[state]", layer, src) + right_side.color = first_reagent.color + . += right_side + + if(length(reagents.reagent_list) >= 2 && length(reagents_for_recipe) >= 2) + var/needed_reagents = reagents_for_recipe[2] + var/datum/reagent/first_reagent = reagents.reagent_list[2] + var/filled_precent = first_reagent.volume / reagents_for_recipe[needed_reagents] + + var/state = "quarter" + switch(filled_precent) + if(0.5 to 0.99) + state = "half" + if(1 to INFINITY) + state = "full" + + var/mutable_appearance/left_side = mutable_appearance(icon, "cross_compressor_left_[state]", layer, src) + left_side.color = first_reagent.color + . += left_side + + . += mutable_appearance(icon, "cross_compressor_tank", layer + 0.01, src) + +/// Handles properly detaching signal hooks. +/obj/machinery/plumbing/ooze_compressor/proc/on_reagents_del(datum/reagents/reagents) + SIGNAL_HANDLER + UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) + return NONE + +/// Handles stopping the emptying process when the chamber empties. +/obj/machinery/plumbing/ooze_compressor/proc/on_reagent_change(datum/reagents/holder, ...) + SIGNAL_HANDLER + update_appearance() + if(holder.total_volume == 0 && !compressing) //we were emptying, but now we aren't + holder.flags |= NO_REACT + return NONE + +/obj/machinery/plumbing/ooze_compressor/process(seconds_per_tick) + if(!compressing) + use_power(active_power_usage * seconds_per_tick) + +/obj/machinery/plumbing/ooze_compressor/proc/compress_recipe() + compressing = TRUE + update_appearance() + if(!repeat_recipe) + reagents_for_recipe = list() + addtimer(CALLBACK(src, PROC_REF(finish_compressing)), 3 SECONDS) + +/obj/machinery/plumbing/ooze_compressor/proc/finish_compressing() + for(var/i in 1 to current_recipe.created_amount) + new current_recipe.output_item(loc) + compressing = FALSE + update_appearance() + reagents.clear_reagents() + if(!repeat_recipe) + current_recipe = null + +/obj/machinery/plumbing/ooze_compressor/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(change_recipe(user)) + reagents.clear_reagents() + +/obj/machinery/plumbing/ooze_compressor/attack_hand_secondary(mob/living/user, list/modifiers) + . = ..() + if(change_recipe(user, TRUE)) + reagents.clear_reagents() + +/obj/machinery/plumbing/ooze_compressor/AltClick(mob/user) + if(anchored) + visible_message(span_notice("[user] presses a button turning the repeat recipe system [repeat_recipe ? "Off" : "On"]")) + repeat_recipe = !repeat_recipe + return TRUE + . = ..() + +/obj/machinery/plumbing/ooze_compressor/proc/change_recipe(mob/user, cross_breed = FALSE) + var/choice + if(cross_breed) + var/base_choice = show_radial_menu(user, src, base_choices, require_near = TRUE, tooltips = TRUE) + if(!base_choice) + return + choice = show_radial_menu(user, src, cross_breed_choices[base_choice], require_near = TRUE, tooltips = TRUE) + else + choice = show_radial_menu(user, src, recipe_choices, require_near = TRUE, tooltips = TRUE) + + if(!(choice in choice_to_datum)) + return + + if(compressing) + return + + current_recipe = choice_to_datum[choice] + reagents_for_recipe = list() + reagents_for_recipe += current_recipe.required_oozes + +#undef CROSSBREED_BASE_PATHS diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm new file mode 100644 index 000000000000..ea3f0838b69c --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_plumbing.dm @@ -0,0 +1,31 @@ +/datum/component/plumbing/ooze_compressor + demand_connects = NORTH + +/datum/component/plumbing/ooze_compressor/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/ooze_compressor)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/ooze_compressor/send_request(dir) + var/obj/machinery/plumbing/ooze_compressor/chamber = parent + if(chamber.compressing || !chamber.current_recipe) + return + var/present_amount + var/diff + for(var/required_reagent in chamber.reagents_for_recipe) + //find how much amount is already present if at all + present_amount = 0 + for(var/datum/reagent/containg_reagent as anything in reagents.reagent_list) + if(required_reagent == containg_reagent.type) + present_amount = containg_reagent.volume + break + + //compute how much more is needed and round it + diff = chamber.reagents_for_recipe[required_reagent] - present_amount + if(diff >= CHEMICAL_QUANTISATION_LEVEL * 10) //should be safe even after rounding + process_request(min(diff, MACHINE_REAGENT_TRANSFER), required_reagent, dir) + return + + chamber.compress_recipe() //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update + //everything for every chemical removed, wich isn't a good option either. + chamber.on_reagent_change(reagents) //We need to check it now, because some reactions leave nothing left. diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm new file mode 100644 index 000000000000..a60288732cb3 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm @@ -0,0 +1,6 @@ +/datum/compressor_recipe + var/list/required_oozes = list() + var/obj/item/output_item + var/created_amount = 1 + +/datum/compressor_recipe/crossbreed diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm new file mode 100644 index 000000000000..3138caf36bbf --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/burning.dm @@ -0,0 +1,154 @@ +/datum/compressor_recipe/crossbreed/burning // EXISTS FOR SUBTYPING + output_item = /obj/item/slimecross/burning/grey +/datum/compressor_recipe/crossbreed/burning/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/grey + +/datum/compressor_recipe/crossbreed/burning/orange + required_oozes = list( + /datum/reagent/slime_ooze/orange = 1000, + ) + output_item = /obj/item/slimecross/burning/orange + +/datum/compressor_recipe/crossbreed/burning/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/purple + +/datum/compressor_recipe/crossbreed/burning/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/blue + +/datum/compressor_recipe/crossbreed/burning/metal + required_oozes = list( + /datum/reagent/slime_ooze/metal = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/metal + +/datum/compressor_recipe/crossbreed/burning/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/yellow + +/datum/compressor_recipe/crossbreed/burning/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/darkpurple + +/datum/compressor_recipe/crossbreed/burning/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/darkblue + +/datum/compressor_recipe/crossbreed/burning/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/silver + +/datum/compressor_recipe/crossbreed/burning/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/bluespace + +/datum/compressor_recipe/crossbreed/burning/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/cerulean + +/datum/compressor_recipe/crossbreed/burning/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/sepia + +/datum/compressor_recipe/crossbreed/burning/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/pyrite + +/datum/compressor_recipe/crossbreed/burning/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/red + +/datum/compressor_recipe/crossbreed/burning/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/green + +/datum/compressor_recipe/crossbreed/burning/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/pink + +/datum/compressor_recipe/crossbreed/burning/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/gold + +/datum/compressor_recipe/crossbreed/burning/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/oil + +/datum/compressor_recipe/crossbreed/burning/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/black + +/datum/compressor_recipe/crossbreed/burning/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/lightpink + +/datum/compressor_recipe/crossbreed/burning/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/adamantine + +/datum/compressor_recipe/crossbreed/burning/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/burning/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm new file mode 100644 index 000000000000..b93b35eff4de --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/charged.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/charged + output_item = /obj/item/slimecross/charged/grey + +/datum/compressor_recipe/crossbreed/charged/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/grey + +/datum/compressor_recipe/crossbreed/charged/orange + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/charged/orange + +/datum/compressor_recipe/crossbreed/charged/metal + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/charged/metal + +/datum/compressor_recipe/crossbreed/charged/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/purple + +/datum/compressor_recipe/crossbreed/charged/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/blue + +/datum/compressor_recipe/crossbreed/charged/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 1000, + ) + output_item = /obj/item/slimecross/charged/yellow + +/datum/compressor_recipe/crossbreed/charged/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/darkpurple + +/datum/compressor_recipe/crossbreed/charged/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/darkblue + +/datum/compressor_recipe/crossbreed/charged/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/silver + +/datum/compressor_recipe/crossbreed/charged/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/bluespace + +/datum/compressor_recipe/crossbreed/charged/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/sepia + +/datum/compressor_recipe/crossbreed/charged/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/pyrite + +/datum/compressor_recipe/crossbreed/charged/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/red + +/datum/compressor_recipe/crossbreed/charged/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/green + +/datum/compressor_recipe/crossbreed/charged/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/pink + +/datum/compressor_recipe/crossbreed/charged/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/gold + +/datum/compressor_recipe/crossbreed/charged/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/oil + +/datum/compressor_recipe/crossbreed/charged/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/black + +/datum/compressor_recipe/crossbreed/charged/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/lightpink + +/datum/compressor_recipe/crossbreed/charged/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/adamantine + +/datum/compressor_recipe/crossbreed/charged/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/cerulean + +/datum/compressor_recipe/crossbreed/charged/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/yellow = 500, + ) + output_item = /obj/item/slimecross/charged/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm new file mode 100644 index 000000000000..e902f179f5fd --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/chilling.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/chilling + output_item = /obj/item/slimecross/chilling/grey + +/datum/compressor_recipe/crossbreed/chilling/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/grey + +/datum/compressor_recipe/crossbreed/chilling/orange + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/chilling/orange + +/datum/compressor_recipe/crossbreed/chilling/metal + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/chilling/metal + +/datum/compressor_recipe/crossbreed/chilling/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/purple + +/datum/compressor_recipe/crossbreed/chilling/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/blue + +/datum/compressor_recipe/crossbreed/chilling/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/yellow + +/datum/compressor_recipe/crossbreed/chilling/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/darkpurple + +/datum/compressor_recipe/crossbreed/chilling/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 1000, + ) + output_item = /obj/item/slimecross/chilling/darkblue + +/datum/compressor_recipe/crossbreed/chilling/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/silver + +/datum/compressor_recipe/crossbreed/chilling/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/bluespace + +/datum/compressor_recipe/crossbreed/chilling/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/sepia + +/datum/compressor_recipe/crossbreed/chilling/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/pyrite + +/datum/compressor_recipe/crossbreed/chilling/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/red + +/datum/compressor_recipe/crossbreed/chilling/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/green + +/datum/compressor_recipe/crossbreed/chilling/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/pink + +/datum/compressor_recipe/crossbreed/chilling/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/gold + +/datum/compressor_recipe/crossbreed/chilling/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/oil + +/datum/compressor_recipe/crossbreed/chilling/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/black + +/datum/compressor_recipe/crossbreed/chilling/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/lightpink + +/datum/compressor_recipe/crossbreed/chilling/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/adamantine + +/datum/compressor_recipe/crossbreed/chilling/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/cerulean + +/datum/compressor_recipe/crossbreed/chilling/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/darkblue = 500, + ) + output_item = /obj/item/slimecross/chilling/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm new file mode 100644 index 000000000000..ff9d3754bcd6 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/colors.dm @@ -0,0 +1,87 @@ +/datum/compressor_recipe/grey + required_oozes = list(/datum/reagent/slime_ooze/grey = 20) + output_item = /obj/item/slime_extract/grey + +/datum/compressor_recipe/metal + required_oozes = list(/datum/reagent/slime_ooze/metal = 20) + output_item = /obj/item/slime_extract/metal + +/datum/compressor_recipe/orange + required_oozes = list(/datum/reagent/slime_ooze/orange = 20) + output_item = /obj/item/slime_extract/orange + +/datum/compressor_recipe/purple + required_oozes = list(/datum/reagent/slime_ooze/purple = 20) + output_item = /obj/item/slime_extract/purple + +/datum/compressor_recipe/yellow + required_oozes = list(/datum/reagent/slime_ooze/yellow = 20) + output_item = /obj/item/slime_extract/yellow + +/datum/compressor_recipe/darkpurple + required_oozes = list(/datum/reagent/slime_ooze/darkpurple = 20) + output_item = /obj/item/slime_extract/darkpurple + +/datum/compressor_recipe/darkblue + required_oozes = list(/datum/reagent/slime_ooze/darkblue = 20) + output_item = /obj/item/slime_extract/darkblue + +/datum/compressor_recipe/silver + required_oozes = list(/datum/reagent/slime_ooze/silver = 20) + output_item = /obj/item/slime_extract/silver + +/datum/compressor_recipe/blue + required_oozes = list(/datum/reagent/slime_ooze/blue = 20) + output_item = /obj/item/slime_extract/blue + +/datum/compressor_recipe/cerulean + required_oozes = list(/datum/reagent/slime_ooze/cerulean = 20) + output_item = /obj/item/slime_extract/cerulean + +/datum/compressor_recipe/sepia + required_oozes = list(/datum/reagent/slime_ooze/sepia = 20) + output_item = /obj/item/slime_extract/sepia + +/datum/compressor_recipe/bluespace + required_oozes = list(/datum/reagent/slime_ooze/bluespace = 20) + output_item = /obj/item/slime_extract/bluespace + +/datum/compressor_recipe/pyrite + required_oozes = list(/datum/reagent/slime_ooze/pyrite = 20) + output_item = /obj/item/slime_extract/pyrite + +/datum/compressor_recipe/red + required_oozes = list(/datum/reagent/slime_ooze/red = 20) + output_item = /obj/item/slime_extract/red + +/datum/compressor_recipe/green + required_oozes = list(/datum/reagent/slime_ooze/green = 20) + output_item = /obj/item/slime_extract/green + +/datum/compressor_recipe/pink + required_oozes = list(/datum/reagent/slime_ooze/pink = 20) + output_item = /obj/item/slime_extract/pink + +/datum/compressor_recipe/oil + required_oozes = list(/datum/reagent/slime_ooze/oil = 20) + output_item = /obj/item/slime_extract/oil + +/datum/compressor_recipe/black + required_oozes = list(/datum/reagent/slime_ooze/black = 20) + output_item = /obj/item/slime_extract/black + +/datum/compressor_recipe/lightpink + required_oozes = list(/datum/reagent/slime_ooze/lightpink = 20) + output_item = /obj/item/slime_extract/lightpink + +/datum/compressor_recipe/adamantine + required_oozes = list(/datum/reagent/slime_ooze/adamantine = 20) + output_item = /obj/item/slime_extract/adamantine + +/datum/compressor_recipe/rainbow + required_oozes = list(/datum/reagent/slime_ooze/rainbow = 20) + output_item = /obj/item/slime_extract/rainbow + +/datum/compressor_recipe/gold + required_oozes = list(/datum/reagent/slime_ooze/gold = 20) + output_item = /obj/item/slime_extract/gold diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm new file mode 100644 index 000000000000..ce77d9f1407f --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/consuming.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/consuming + output_item = /obj/item/slimecross/consuming/grey + +/datum/compressor_recipe/crossbreed/consuming/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/grey + +/datum/compressor_recipe/crossbreed/consuming/orange + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/consuming/orange + +/datum/compressor_recipe/crossbreed/consuming/metal + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/consuming/metal + +/datum/compressor_recipe/crossbreed/consuming/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/purple + +/datum/compressor_recipe/crossbreed/consuming/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/blue + +/datum/compressor_recipe/crossbreed/consuming/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/yellow + +/datum/compressor_recipe/crossbreed/consuming/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/darkpurple + +/datum/compressor_recipe/crossbreed/consuming/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 1000, + ) + output_item = /obj/item/slimecross/consuming/silver + +/datum/compressor_recipe/crossbreed/consuming/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/silver + +/datum/compressor_recipe/crossbreed/consuming/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/bluespace + +/datum/compressor_recipe/crossbreed/consuming/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/sepia + +/datum/compressor_recipe/crossbreed/consuming/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/pyrite + +/datum/compressor_recipe/crossbreed/consuming/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/red + +/datum/compressor_recipe/crossbreed/consuming/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/green + +/datum/compressor_recipe/crossbreed/consuming/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/pink + +/datum/compressor_recipe/crossbreed/consuming/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/gold + +/datum/compressor_recipe/crossbreed/consuming/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/oil + +/datum/compressor_recipe/crossbreed/consuming/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/black + +/datum/compressor_recipe/crossbreed/consuming/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/lightpink + +/datum/compressor_recipe/crossbreed/consuming/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/adamantine + +/datum/compressor_recipe/crossbreed/consuming/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/cerulean + +/datum/compressor_recipe/crossbreed/consuming/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/silver = 500, + ) + output_item = /obj/item/slimecross/consuming/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm new file mode 100644 index 000000000000..07a54976d8da --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/industrial.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/industrial + output_item = /obj/item/slimecross/industrial/grey + +/datum/compressor_recipe/crossbreed/industrial/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/grey + +/datum/compressor_recipe/crossbreed/industrial/metal + required_oozes = list( + /datum/reagent/slime_ooze/metal = 1000, + ) + output_item = /obj/item/slimecross/industrial/metal + +/datum/compressor_recipe/crossbreed/industrial/orange + required_oozes = list( + /datum/reagent/slime_ooze/metal = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/industrial/orange + +/datum/compressor_recipe/crossbreed/industrial/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/purple + +/datum/compressor_recipe/crossbreed/industrial/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/blue + +/datum/compressor_recipe/crossbreed/industrial/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/yellow + +/datum/compressor_recipe/crossbreed/industrial/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/darkpurple + +/datum/compressor_recipe/crossbreed/industrial/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/darkblue + +/datum/compressor_recipe/crossbreed/industrial/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/silver + +/datum/compressor_recipe/crossbreed/industrial/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/bluespace + +/datum/compressor_recipe/crossbreed/industrial/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/sepia + +/datum/compressor_recipe/crossbreed/industrial/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/pyrite + +/datum/compressor_recipe/crossbreed/industrial/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/red + +/datum/compressor_recipe/crossbreed/industrial/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/green + +/datum/compressor_recipe/crossbreed/industrial/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/pink + +/datum/compressor_recipe/crossbreed/industrial/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/gold + +/datum/compressor_recipe/crossbreed/industrial/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/oil + +/datum/compressor_recipe/crossbreed/industrial/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/black + +/datum/compressor_recipe/crossbreed/industrial/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/lightpink + +/datum/compressor_recipe/crossbreed/industrial/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/adamantine + +/datum/compressor_recipe/crossbreed/industrial/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/cerulean + +/datum/compressor_recipe/crossbreed/industrial/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/industrial/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm new file mode 100644 index 000000000000..c891dda82357 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/prismatic.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/prismatic + output_item = /obj/item/slimecross/prismatic/grey + +/datum/compressor_recipe/crossbreed/prismatic/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/grey + +/datum/compressor_recipe/crossbreed/prismatic/orange + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/prismatic/orange + +/datum/compressor_recipe/crossbreed/prismatic/metal + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/prismatic/metal + +/datum/compressor_recipe/crossbreed/prismatic/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/purple + +/datum/compressor_recipe/crossbreed/prismatic/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/blue + +/datum/compressor_recipe/crossbreed/prismatic/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/yellow + +/datum/compressor_recipe/crossbreed/prismatic/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/darkpurple + +/datum/compressor_recipe/crossbreed/prismatic/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 1000, + ) + output_item = /obj/item/slimecross/prismatic/pyrite + +/datum/compressor_recipe/crossbreed/prismatic/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/silver + +/datum/compressor_recipe/crossbreed/prismatic/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/bluespace + +/datum/compressor_recipe/crossbreed/prismatic/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/sepia + +/datum/compressor_recipe/crossbreed/prismatic/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/darkblue + +/datum/compressor_recipe/crossbreed/prismatic/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/red + +/datum/compressor_recipe/crossbreed/prismatic/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/green + +/datum/compressor_recipe/crossbreed/prismatic/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/pink + +/datum/compressor_recipe/crossbreed/prismatic/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/gold + +/datum/compressor_recipe/crossbreed/prismatic/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/oil + +/datum/compressor_recipe/crossbreed/prismatic/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/black + +/datum/compressor_recipe/crossbreed/prismatic/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/lightpink + +/datum/compressor_recipe/crossbreed/prismatic/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/adamantine + +/datum/compressor_recipe/crossbreed/prismatic/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/cerulean + +/datum/compressor_recipe/crossbreed/prismatic/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/pyrite = 500, + ) + output_item = /obj/item/slimecross/prismatic/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm new file mode 100644 index 000000000000..fc0b74619efa --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/recurring.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/recurring + output_item = /obj/item/slimecross/recurring/grey + +/datum/compressor_recipe/crossbreed/recurring/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/grey + +/datum/compressor_recipe/crossbreed/recurring/orange + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/recurring/orange + +/datum/compressor_recipe/crossbreed/recurring/metal + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/recurring/metal + +/datum/compressor_recipe/crossbreed/recurring/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/purple + +/datum/compressor_recipe/crossbreed/recurring/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/blue + +/datum/compressor_recipe/crossbreed/recurring/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/yellow + +/datum/compressor_recipe/crossbreed/recurring/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/darkpurple + +/datum/compressor_recipe/crossbreed/recurring/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/cerulean = 1000, + ) + output_item = /obj/item/slimecross/recurring/cerulean + +/datum/compressor_recipe/crossbreed/recurring/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/silver + +/datum/compressor_recipe/crossbreed/recurring/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/bluespace + +/datum/compressor_recipe/crossbreed/recurring/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/sepia + +/datum/compressor_recipe/crossbreed/recurring/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/darkblue + +/datum/compressor_recipe/crossbreed/recurring/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/red + +/datum/compressor_recipe/crossbreed/recurring/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/green + +/datum/compressor_recipe/crossbreed/recurring/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/pink + +/datum/compressor_recipe/crossbreed/recurring/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/gold + +/datum/compressor_recipe/crossbreed/recurring/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/oil + +/datum/compressor_recipe/crossbreed/recurring/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/black + +/datum/compressor_recipe/crossbreed/recurring/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/lightpink + +/datum/compressor_recipe/crossbreed/recurring/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/adamantine + +/datum/compressor_recipe/crossbreed/recurring/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/pyrite + +/datum/compressor_recipe/crossbreed/recurring/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/recurring/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm new file mode 100644 index 000000000000..afaa3cb751da --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/regenerative.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/regenerative + output_item = /obj/item/slimecross/regenerative/grey + +/datum/compressor_recipe/crossbreed/regenerative/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/grey + +/datum/compressor_recipe/crossbreed/regenerative/orange + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/regenerative/orange + +/datum/compressor_recipe/crossbreed/regenerative/metal + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/regenerative/metal + +/datum/compressor_recipe/crossbreed/regenerative/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/regenerative/cerulean + +/datum/compressor_recipe/crossbreed/regenerative/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/blue + +/datum/compressor_recipe/crossbreed/regenerative/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/yellow + +/datum/compressor_recipe/crossbreed/regenerative/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/darkpurple + +/datum/compressor_recipe/crossbreed/regenerative/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 1000, + ) + output_item = /obj/item/slimecross/regenerative/purple + +/datum/compressor_recipe/crossbreed/regenerative/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/silver + +/datum/compressor_recipe/crossbreed/regenerative/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/bluespace + +/datum/compressor_recipe/crossbreed/regenerative/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/sepia + +/datum/compressor_recipe/crossbreed/regenerative/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/darkblue + +/datum/compressor_recipe/crossbreed/regenerative/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/red + +/datum/compressor_recipe/crossbreed/regenerative/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/green + +/datum/compressor_recipe/crossbreed/regenerative/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/pink + +/datum/compressor_recipe/crossbreed/regenerative/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/gold + +/datum/compressor_recipe/crossbreed/regenerative/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/oil + +/datum/compressor_recipe/crossbreed/regenerative/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/black + +/datum/compressor_recipe/crossbreed/regenerative/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/lightpink + +/datum/compressor_recipe/crossbreed/regenerative/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/adamantine + +/datum/compressor_recipe/crossbreed/regenerative/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/pyrite + +/datum/compressor_recipe/crossbreed/regenerative/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/purple = 500, + ) + output_item = /obj/item/slimecross/regenerative/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm new file mode 100644 index 000000000000..f583194de434 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/reproductive.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/reproductive + output_item = /obj/item/slimecross/reproductive/purple + +/datum/compressor_recipe/crossbreed/reproductive/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/purple + +/datum/compressor_recipe/crossbreed/reproductive/orange + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/reproductive/orange + +/datum/compressor_recipe/crossbreed/reproductive/metal + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/reproductive/metal + +/datum/compressor_recipe/crossbreed/reproductive/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/reproductive/cerulean + +/datum/compressor_recipe/crossbreed/reproductive/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/blue + +/datum/compressor_recipe/crossbreed/reproductive/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/yellow + +/datum/compressor_recipe/crossbreed/reproductive/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/darkpurple + +/datum/compressor_recipe/crossbreed/reproductive/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 1000, + ) + output_item = /obj/item/slimecross/reproductive/grey + +/datum/compressor_recipe/crossbreed/reproductive/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/silver + +/datum/compressor_recipe/crossbreed/reproductive/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/bluespace + +/datum/compressor_recipe/crossbreed/reproductive/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/sepia + +/datum/compressor_recipe/crossbreed/reproductive/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/darkblue + +/datum/compressor_recipe/crossbreed/reproductive/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/red + +/datum/compressor_recipe/crossbreed/reproductive/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/green + +/datum/compressor_recipe/crossbreed/reproductive/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/pink + +/datum/compressor_recipe/crossbreed/reproductive/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/gold + +/datum/compressor_recipe/crossbreed/reproductive/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/oil + +/datum/compressor_recipe/crossbreed/reproductive/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/black + +/datum/compressor_recipe/crossbreed/reproductive/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/lightpink + +/datum/compressor_recipe/crossbreed/reproductive/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/adamantine + +/datum/compressor_recipe/crossbreed/reproductive/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/pyrite + +/datum/compressor_recipe/crossbreed/reproductive/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/grey = 500, + ) + output_item = /obj/item/slimecross/reproductive/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm new file mode 100644 index 000000000000..60d960c607d9 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/selfsustaining.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/selfsustaining + output_item = /obj/item/slimecross/selfsustaining/purple + +/datum/compressor_recipe/crossbreed/selfsustaining/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/purple + +/datum/compressor_recipe/crossbreed/selfsustaining/orange + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/orange + +/datum/compressor_recipe/crossbreed/selfsustaining/metal + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/metal + +/datum/compressor_recipe/crossbreed/selfsustaining/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/cerulean + +/datum/compressor_recipe/crossbreed/selfsustaining/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/blue + +/datum/compressor_recipe/crossbreed/selfsustaining/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/yellow + +/datum/compressor_recipe/crossbreed/selfsustaining/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/grey + +/datum/compressor_recipe/crossbreed/selfsustaining/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 1000, + ) + output_item = /obj/item/slimecross/selfsustaining/darkpurple + +/datum/compressor_recipe/crossbreed/selfsustaining/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/silver + +/datum/compressor_recipe/crossbreed/selfsustaining/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/bluespace + +/datum/compressor_recipe/crossbreed/selfsustaining/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/sepia + +/datum/compressor_recipe/crossbreed/selfsustaining/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/darkblue + +/datum/compressor_recipe/crossbreed/selfsustaining/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/red + +/datum/compressor_recipe/crossbreed/selfsustaining/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/green + +/datum/compressor_recipe/crossbreed/selfsustaining/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/pink + +/datum/compressor_recipe/crossbreed/selfsustaining/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/gold + +/datum/compressor_recipe/crossbreed/selfsustaining/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/oil + +/datum/compressor_recipe/crossbreed/selfsustaining/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/black + +/datum/compressor_recipe/crossbreed/selfsustaining/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/lightpink + +/datum/compressor_recipe/crossbreed/selfsustaining/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/adamantine + +/datum/compressor_recipe/crossbreed/selfsustaining/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/pyrite + +/datum/compressor_recipe/crossbreed/selfsustaining/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/darkpurple = 500, + ) + output_item = /obj/item/slimecross/selfsustaining/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm new file mode 100644 index 000000000000..446563660f71 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/stabilized.dm @@ -0,0 +1,155 @@ +/datum/compressor_recipe/crossbreed/stabilized + output_item = /obj/item/slimecross/stabilized/purple + +/datum/compressor_recipe/crossbreed/stabilized/purple + required_oozes = list( + /datum/reagent/slime_ooze/purple = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/purple + +/datum/compressor_recipe/crossbreed/stabilized/orange + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/orange = 500, + ) + output_item = /obj/item/slimecross/stabilized/orange + +/datum/compressor_recipe/crossbreed/stabilized/metal + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/metal = 500, + ) + output_item = /obj/item/slimecross/stabilized/metal + +/datum/compressor_recipe/crossbreed/stabilized/cerulean + required_oozes = list( + /datum/reagent/slime_ooze/blue = 500, + /datum/reagent/slime_ooze/cerulean = 500, + ) + output_item = /obj/item/slimecross/stabilized/cerulean + +/datum/compressor_recipe/crossbreed/stabilized/darkpurple + required_oozes = list( + /datum/reagent/slime_ooze/darkpurple = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/darkpurple + +/datum/compressor_recipe/crossbreed/stabilized/yellow + required_oozes = list( + /datum/reagent/slime_ooze/yellow = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/yellow + +/datum/compressor_recipe/crossbreed/stabilized/grey + required_oozes = list( + /datum/reagent/slime_ooze/grey = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/grey + +/datum/compressor_recipe/crossbreed/stabilized/blue + required_oozes = list( + /datum/reagent/slime_ooze/blue = 1000, + ) + output_item = /obj/item/slimecross/stabilized/blue + +/datum/compressor_recipe/crossbreed/stabilized/silver + required_oozes = list( + /datum/reagent/slime_ooze/silver = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/silver + +/datum/compressor_recipe/crossbreed/stabilized/bluespace + required_oozes = list( + /datum/reagent/slime_ooze/bluespace = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/bluespace + +/datum/compressor_recipe/crossbreed/stabilized/sepia + required_oozes = list( + /datum/reagent/slime_ooze/sepia = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/sepia + +/datum/compressor_recipe/crossbreed/stabilized/darkblue + required_oozes = list( + /datum/reagent/slime_ooze/darkblue = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/darkblue + +/datum/compressor_recipe/crossbreed/stabilized/red + required_oozes = list( + /datum/reagent/slime_ooze/red = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/red + +/datum/compressor_recipe/crossbreed/stabilized/green + required_oozes = list( + /datum/reagent/slime_ooze/green = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/green + +/datum/compressor_recipe/crossbreed/stabilized/pink + required_oozes = list( + /datum/reagent/slime_ooze/pink = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/pink + +/datum/compressor_recipe/crossbreed/stabilized/gold + required_oozes = list( + /datum/reagent/slime_ooze/gold = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/gold + +/datum/compressor_recipe/crossbreed/stabilized/oil + required_oozes = list( + /datum/reagent/slime_ooze/oil = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/oil + +/datum/compressor_recipe/crossbreed/stabilized/black + required_oozes = list( + /datum/reagent/slime_ooze/black = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/black + +/datum/compressor_recipe/crossbreed/stabilized/lightpink + required_oozes = list( + /datum/reagent/slime_ooze/lightpink = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/lightpink + +/datum/compressor_recipe/crossbreed/stabilized/adamantine + required_oozes = list( + /datum/reagent/slime_ooze/adamantine = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/adamantine + +/datum/compressor_recipe/crossbreed/stabilized/pyrite + required_oozes = list( + /datum/reagent/slime_ooze/pyrite = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/pyrite + +/datum/compressor_recipe/crossbreed/stabilized/rainbow + required_oozes = list( + /datum/reagent/slime_ooze/rainbow = 500, + /datum/reagent/slime_ooze/blue = 500, + ) + output_item = /obj/item/slimecross/stabilized/rainbow diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm new file mode 100644 index 000000000000..a7d46b403e6c --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/shitcode.dm @@ -0,0 +1,42 @@ +/obj/machinery/plumbing/ooze_compressor/proc/return_color_from_string(string) + switch(string) + if("orange") + return "#FFA500" + if("purple") + return "#B19CD9" + if("blue") + return "#ADD8E6" + if("metal") + return "#7E7E7E" + if("yellow") + return "#FFFF00" + if("dark purple") + return "#551A8B" + if("dark blue") + return "#0000FF" + if("silver") + return "#D3D3D3" + if("bluespace") + return "#32CD32" + if("sepia") + return "#704214" + if("cerulean") + return "#2956B2" + if("pyrite") + return "#FAFAD2" + if("red") + return "#FF0000" + if("green") + return "#00FF00" + if("pink") + return "#FF69B4" + if("gold") + return "#FFD700" + if("oil") + return "#505050" + if("black") + return "#000000" + if("light pink") + return "#FFB6C1" + if("adamantine") + return "#008B8B" diff --git a/monkestation/code/modules/slimecore/machines/ooze_sucker.dm b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm new file mode 100644 index 000000000000..216edb7dfdbe --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm @@ -0,0 +1,130 @@ +///this cannablizes floor_pump code but rips specific reagents and and such just does stuff itself so it can be expanded easier in the future + +/obj/machinery/plumbing/ooze_sucker + name = "ooze sucker" + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + base_icon_state = "ooze_sucker" + icon_state = "ooze_sucker" + anchored = FALSE + density = FALSE + idle_power_usage = 10 + active_power_usage = 1000 + buffer = 3000 + category="Distribution" + reagent_flags = NO_REACT + + /// Pump is turned on by engineer, etc. + var/turned_on = FALSE + + var/obj/machinery/slime_pen_controller/linked_controller + ///if we have this on mapload we will look in a range for a controller + var/mapping_id + + /// Floor tile is placed down + var/tile_placed = FALSE + + var/processes = 0 + var/processes_required = 5 + + /// Base amount to drain + var/drain_flat = 20 + /// Additional ratio of liquid volume to drain + var/drain_percent = 1 + +/obj/machinery/plumbing/ooze_sucker/Initialize(mapload, bolt, layer) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/plumbing/ooze_sucker/LateInitialize() + . = ..() + locate_machinery() + +/obj/machinery/plumbing/ooze_sucker/locate_machinery(multitool_connection) + if(!mapping_id) + return + for(var/obj/machinery/slime_pen_controller/main in GLOB.machines) + if(main.mapping_id != mapping_id) + continue + linked_controller = main + main.linked_sucker = src + return + +/obj/machinery/plumbing/ooze_sucker/examine(mob/user) + . = ..() + . += span_notice("It's currently turned [turned_on ? "ON" : "OFF"].") + + +/obj/machinery/plumbing/ooze_sucker/update_icon_state() + . = ..() + if(turned_on) + icon_state = "[base_icon_state]-on" + else + icon_state = base_icon_state + +/obj/machinery/plumbing/ooze_sucker/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + turned_on = FALSE + update_icon_state() + + +/obj/machinery/plumbing/ooze_sucker/proc/toggle_state() + turned_on = !turned_on + update_appearance() + +/obj/machinery/plumbing/ooze_sucker/proc/can_run() + return is_operational \ + && turned_on \ + && anchored \ + && !panel_open \ + && isturf(loc) \ + && are_reagents_ready() + +/obj/machinery/plumbing/ooze_sucker/proc/are_reagents_ready() + return reagents.total_volume < reagents.maximum_volume + +/obj/machinery/plumbing/ooze_sucker/process(seconds_per_tick) + if(!can_run()) + return + + // Determine what tiles should be pumped. We grab from a 3x3 area, + // but overall try to pump the same volume regardless of number of affected tiles + var/turf/local_turf = get_turf(src) + var/list/turf/candidate_turfs = local_turf.get_atmos_adjacent_turfs(alldir = TRUE) + candidate_turfs += local_turf + + var/list/turf/affected_turfs = list() + + for(var/turf/candidate as anything in candidate_turfs) + if(isturf(candidate)) + affected_turfs += candidate + + if(!length(affected_turfs)) + return + + // note that the length was verified to be > 0 directly above and is a local var. + var/multiplier = 1 / length(affected_turfs) + + // We're good, actually pump. + for(var/turf/affected_turf as anything in affected_turfs) + pump_turf(affected_turf, seconds_per_tick, multiplier) + +/obj/machinery/plumbing/ooze_sucker/proc/pump_turf(turf/affected_turf, seconds_per_tick, multiplier) + if(processes < processes_required) + processes++ + return + processes = 0 + if(!affected_turf.liquids || !affected_turf.liquids.liquid_group) + return + + var/target_value = seconds_per_tick * (drain_flat + (affected_turf.liquids.liquid_group.total_reagent_volume * drain_percent)) * multiplier + //Free space handling + var/free_space = reagents.maximum_volume - reagents.total_volume + if(target_value > free_space) + target_value = free_space + + var/datum/liquid_group/targeted_group = affected_turf.liquids.liquid_group + if(!targeted_group.reagents_per_turf) + return + targeted_group.transfer_specific_reagents(reagents, target_value, reagents_to_check = typesof(/datum/reagent/slime_ooze), merge = TRUE) diff --git a/monkestation/code/modules/slimecore/machines/slime_grinder.dm b/monkestation/code/modules/slimecore/machines/slime_grinder.dm new file mode 100644 index 000000000000..4cb79b472b19 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_grinder.dm @@ -0,0 +1,73 @@ +///your an evil person for grinding poor slimes up into ooze + +/obj/machinery/plumbing/slime_grinder + name = "slime grinder" + desc = "An unholy creation, does not grind the slimes quickly." + + icon = 'monkestation/code/modules/slimecore/icons/slime_grinder.dmi' + icon_state = "slime_grinder_backdrop" + base_icon_state = "slime_grinder_backdrop" + idle_power_usage = 10 + active_power_usage = 1000 + buffer = 3000 + category="Distribution" + + var/grind_time = 5 SECONDS + ///this is the face you see when you start grinding the poor slime up + var/mob/living/basic/slime/poster_boy + ///list of all the slimes we have + var/list/soon_to_be_crushed = list() + ///the amount of souls we have grinded + var/trapped_souls = 0 + ///are we grinding some slimes + var/GRINDING_SOME_SLIMES = FALSE + + +/obj/machinery/plumbing/slime_grinder/Initialize(mapload, bolt, layer) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) + +/obj/machinery/plumbing/slime_grinder/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(length(soon_to_be_crushed) && !GRINDING_SOME_SLIMES) + Shake(6, 6, 10 SECONDS) + GRINDING_SOME_SLIMES = TRUE + var/datum/looping_sound/microwave/new_loop = new(src) + new_loop.start() + machine_do_after_visable(src, 10 SECONDS) + GRINDING_SOME_SLIMES = FALSE + new_loop.stop() + playsound(src, 'sound/machines/blender.ogg', 50, TRUE) + grind_slimes() + +/obj/machinery/plumbing/slime_grinder/proc/grind_slimes() + poster_boy = null + update_appearance() + for(var/mob/living/basic/slime/slime as anything in soon_to_be_crushed) + trapped_souls++ + + var/datum/slime_color/current_color = slime.current_color + reagents.add_reagent(current_color.secretion_path, 25) + soon_to_be_crushed -= slime + qdel(slime) + soon_to_be_crushed = list() + +/obj/machinery/plumbing/slime_grinder/update_overlays() + . = ..() + if(poster_boy) + var/mutable_appearance/slime = poster_boy.appearance + . += slime + . += mutable_appearance(icon, "slime_grinder_overlay", layer + 0.1, src) + +/obj/machinery/plumbing/slime_grinder/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + . = ..() + if(isslime(AM)) + if(!poster_boy) + poster_boy = AM + poster_boy.layer = layer + poster_boy.plane = plane + SEND_SIGNAL(AM, COMSIG_EMOTION_STORE, null, EMOTION_SCARED, "I'm trapped inside a blender, I don't want to die!") + AM.update_appearance() + soon_to_be_crushed |= AM + AM.forceMove(src) + update_appearance() diff --git a/monkestation/code/modules/slimecore/machines/slime_market.dm b/monkestation/code/modules/slimecore/machines/slime_market.dm new file mode 100644 index 000000000000..8e299bec9cda --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_market.dm @@ -0,0 +1,137 @@ +/obj/machinery/slime_market_pad + name = "intergalactic market pad" + desc = "A tall device with a hole for inserting slime extracts. IMPs are widely used for trading small items on large distances all over the galaxy." + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "market_pad" + base_icon_state = "market_pad" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 2000 + circuit = /obj/item/circuitboard/machine/slime_market_pad + var/obj/machinery/computer/slime_market/console + +/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) + user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) + update_appearance() + return TRUE + + if(default_unfasten_wrench(user, I)) + return TRUE + + if(default_deconstruction_crowbar(I)) + return TRUE + + . = ..() + +/obj/machinery/slime_market_pad/examine(mob/user) + . = ..() + if(!panel_open) + . += span_notice("The panel is screwed in.") + +/obj/machinery/slime_market_pad/update_overlays() + . = ..() + if(panel_open) + . += "market_pad-panel" + +/obj/machinery/slime_market_pad/Initialize(mapload) + . = ..() + link_console() + +/obj/machinery/slime_market_pad/AltClick(mob/user) + . = ..() + link_console() + +/obj/machinery/slime_market_pad/proc/link_console() + if(console) + return + + for(var/direction in GLOB.cardinals) + console = locate(/obj/machinery/computer/slime_market, get_step(src, direction)) + if(console) + console.link_market_pad() + break + +/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/living/user, params) + . = ..() + if(!console) + to_chat(user, span_warning("[src] does not have a console linked to it!")) + return + + if(istype(I, /obj/item/slime_extract)) + var/obj/item/slime_extract/extract = I + if(extract.tier == 0) + to_chat(user, span_warning("[src] doesn't seem to accept this extract!")) + return + flick("[base_icon_state]_vend", src) + sell_extract(extract) + return + + else if(istype(I, /obj/item/storage/bag/xeno)) + if(tgui_alert(user, "Are you sure you want to sell all extracts from [I]?", "<3?", list("Yes", "No")) != "Yes") + return + + flick("[base_icon_state]_vend", src) + for(var/obj/item/slime_extract/extract in I) + if(extract.tier == 0) + continue + sell_extract(extract) + return + +/obj/machinery/slime_market_pad/proc/sell_extract(obj/item/slime_extract/extract) + SSresearch.xenobio_points += round(SSresearch.slime_core_prices[extract.type]) + + var/price_mod = rand(SLIME_SELL_MODIFIER_MIN * 10000, SLIME_SELL_MODIFIER_MAX * 10000) / 10000 + var/price_limiter = 1 - ((SSresearch.default_core_prices[extract.tier] * SLIME_SELL_MINIMUM_MODIFIER) / SSresearch.slime_core_prices[extract.type]) + SSresearch.slime_core_prices[extract.type] = (1 + price_mod * price_limiter) * SSresearch.slime_core_prices[extract.type] + + for(var/core_type in SSresearch.slime_core_prices) + if(core_type == extract.type) + continue + + var/obj/item/slime_extract/core = core_type + price_mod = rand(SLIME_SELL_OTHER_MODIFIER_MIN * 100000, SLIME_SELL_OTHER_MODIFIER_MAX * 100000) / 100000 + price_limiter = 1 - (SSresearch.slime_core_prices[core_type] / (SSresearch.default_core_prices[initial(core.tier)] * SLIME_SELL_MAXIMUM_MODIFIER)) + + SSresearch.slime_core_prices[core_type] = (1 + price_mod * price_limiter) * SSresearch.slime_core_prices[core_type] + qdel(extract) + +/obj/machinery/slime_market_pad/attackby_secondary(obj/item/weapon, mob/user, params) + if(!console) + to_chat(user, span_warning("[src] does not have a console linked to it!")) + return + + if(!console.request_pad) + to_chat(user, span_warning("[console] does not have a request_pad linked to it!")) + return + + if(!length(console.request_pad.current_requests)) + to_chat(user, span_warning("There are no current extract requests!")) + return + + if(istype(weapon, /obj/item/slime_extract)) + var/list/radial_choices = list() + var/list/choice_to_request = list() + var/obj/item/slime_extract/extract = weapon + for(var/datum/extract_request_data/current as anything in console.request_pad.current_requests) + if((current.extract_path != extract.type) || current.ready_for_pickup) + continue + radial_choices |= current.radial_data + choice_to_request |= list(current.request_name = current) + + if(!length(radial_choices)) + say("There are no current extract requests that need this extract!") + return + + var/choice = show_radial_menu(user, src, radial_choices, require_near = TRUE, tooltips = TRUE) + if(!choice_to_request[choice]) + return + + var/datum/extract_request_data/chosen = choice_to_request[choice] + chosen.add_extract() + + flick("[base_icon_state]_vend", src) + qdel(extract) + + return diff --git a/monkestation/code/modules/slimecore/machines/slime_market_computer.dm b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm new file mode 100644 index 000000000000..3c86eb44af7a --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm @@ -0,0 +1,169 @@ +GLOBAL_DATUM(default_slime_market, /obj/machinery/computer/slime_market) + +/obj/machinery/computer/slime_market + name = "slime market console" + desc = "Used to sell slime cores and manage intergalactic slime bounties." + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + icon_state = "market" + icon_screen = "market_screen" + icon_keyboard = "" + keyboard_change_icon = FALSE + light_color = LIGHT_COLOR_LAVENDER + circuit = /obj/item/circuitboard/computer/slime_market + var/obj/machinery/slime_market_pad/market_pad + var/obj/machinery/slime_extract_requestor/request_pad + var/stored_credits = 0 + + var/static/list/slime_shop_items = list() + +/obj/machinery/computer/slime_market/Initialize(mapload, obj/item/circuitboard/C) + . = ..() + if(!GLOB.default_slime_market && is_station_level(z)) + GLOB.default_slime_market = src + + link_market_pad() + +/obj/machinery/computer/slime_market/Destroy() + . = ..() + if(GLOB.default_slime_market == src) + GLOB.default_slime_market = null + + if(market_pad) + market_pad.console = null + if(request_pad) + request_pad.console = null + + request_pad = null + market_pad = null + +/obj/machinery/computer/slime_market/proc/link_market_pad() + if(market_pad) + return + + for(var/direction in GLOB.cardinals) + market_pad = locate(/obj/machinery/slime_market_pad, get_step(src, direction)) + if(market_pad) + market_pad.link_console() + break + + return market_pad + +/obj/machinery/computer/slime_market/attackby(obj/item/weapon, mob/user, params) + if(panel_open) + if(weapon.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, weapon)) + return + var/obj/item/multitool/M = weapon + if(!M.buffer) + return + var/obj/machinery/slime_extract_requestor/pad = M.buffer + if(!istype(pad)) + return + pad.console = src + request_pad = pad + to_chat(user, span_notice("You link the [pad] to the [src].")) + . = ..() + +/obj/machinery/computer/slime_market/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/xenobio_market), + ) + +/obj/machinery/computer/slime_market/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenobioMarket", name) + ui.open() + +/obj/machinery/computer/slime_market/ui_static_data(mob/user) + var/list/data = list() + if(!length(slime_shop_items)) + for(var/datum/slime_store_item/subtype as anything in subtypesof(/datum/slime_store_item)) + slime_shop_items += new subtype + + data["shop_items"] = list() + for(var/datum/slime_store_item/listed as anything in slime_shop_items) + var/list/shop_item = list() + shop_item += list( + "name" = listed.name, + "desc" = listed.desc, + "icon_state" = initial(listed.item_path.icon_state), + "cost" = listed.cost, + "item_path" = listed.item_path, + ) + data["shop_items"] += list(shop_item) + return data + +/obj/machinery/computer/slime_market/ui_data() + var/data = list() + var/list/prices = list() + var/list/price_row = list() + var/iter = 1 + for(var/core_type in (subtypesof(/obj/item/slime_extract) - subtypesof(/obj/item/slime_extract/rainbow))) + if(iter % 4 == 1) + prices.Add(list(list("key" = LAZYLEN(prices), "prices" = price_row.Copy()))) + price_row = list() + + if(core_type == /obj/item/slime_extract/grey) + price_row.Add(list(list("key" = iter % 4))) + iter += 1 + + var/obj/item/slime_extract/core = core_type + var/list/core_data = list("icon" = "[initial(core.icon_state)]", + "price" = SSresearch.slime_core_prices[core_type], + "key" = iter % 4, + ) + price_row.Add(list(core_data)) + iter += 1 + + if(core_type == /obj/item/slime_extract/grey) + core = /obj/item/slime_extract/rainbow + var/list/rainbow_core_data = list("icon" = "[initial(core.icon_state)]", + "price" = SSresearch.slime_core_prices[/obj/item/slime_extract/rainbow], + "key" = iter % 4, + ) + price_row.Add(list(rainbow_core_data)) + iter += 1 + price_row.Add(list(list("key" = iter % 4))) + iter += 1 + + data["points"] = SSresearch.xenobio_points + data["prices"] = prices + data["requests"] = list() + if(request_pad) + for(var/datum/extract_request_data/request as anything in request_pad.current_requests) + var/list/request_data = list() + var/obj/item/request_item = request.extract_path + request_data += list( + "icon" = initial(request_item.icon_state), + "amount" = request.extracts_needed, + "name" = request.request_name, + "payout" = request.payout, + "amount_give" = request.extracts_given, + ) + data["requests"] += list(request_data) + + return data + +/obj/machinery/computer/slime_market/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("buy") + for(var/datum/slime_store_item/item as anything in slime_shop_items) + if(text2path(params["path"]) == item.item_path) + try_buy(item) + return TRUE + +/obj/machinery/computer/slime_market/proc/return_extracts(obj/item/slime_extract/type, amount) + for(var/i in 1 to amount) + new type(loc) + +/obj/machinery/computer/slime_market/proc/try_buy(datum/slime_store_item/attempt) + if(SSresearch.xenobio_points < attempt.cost) + return + new attempt.item_path(get_turf(src)) + SSresearch.xenobio_points -= attempt.cost diff --git a/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm new file mode 100644 index 000000000000..7e758bec7dcf --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm @@ -0,0 +1,188 @@ +/obj/item/wallframe/slime_pen_controller + name = "slime pen management frame" + desc = "Used for building slime pen consoles." + icon_state = "button" + result_path = /obj/machinery/slime_pen_controller + custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT) + pixel_shift = 24 + + +/obj/machinery/slime_pen_controller + name = "slime pen management console" + desc = "It seems most of the features are locked down, the developers must have been pretty lazy. Can turn the ooze sucker on and off though. Can link a sucker to this using a multitool." + + icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' + base_icon_state = "slime_panel" + icon_state = "slime_panel" + + var/obj/machinery/plumbing/ooze_sucker/linked_sucker + var/datum/corral_data/linked_data + var/mapping_id + +/obj/machinery/slime_pen_controller/Initialize(mapload) + . = ..() + register_context() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/slime_pen_controller/LateInitialize() + . = ..() + locate_machinery() + + +/obj/machinery/slime_pen_controller/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(linked_sucker) + context[SCREENTIP_CONTEXT_RMB] = "Toggle Linked Scrubber" + return CONTEXTUAL_SCREENTIP_SET + +/obj/machinery/slime_pen_controller/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "SlimePenController", "[src]") + ui.open() + +/obj/machinery/slime_pen_controller/ui_data(mob/user) + . = ..() + var/list/data = list() + if(!linked_data) + data["slimes"] = list() + data["corral_upgrades"] = list() + data["buyable_upgrades"] = list() + + else + data["slimes"] = list() + for(var/mob/living/basic/slime/slime as anything in linked_data.managed_slimes) + var/list/slime_data = list() + slime_data += list( + "name" = slime.name, + "health" = round((slime.health / slime.maxHealth) * 100), + "slime_color" = capitalize(slime.current_color.name), + "hunger_precent" = slime.hunger_precent, + "mutation_chance" = slime.mutation_chance, + "accessory" = slime.worn_accessory ? slime.worn_accessory.name : "None", + ) + slime_data["possible_mutations"] = list() + for(var/datum/slime_mutation_data/mutation_data as anything in slime.possible_color_mutations) + var/list/mutation_info = list() + var/mob_string + for(var/mob/living/mob as anything in mutation_data.latch_needed) + mob_string += "[mutation_data.latch_needed[mob]] units of genetic data from [initial(mob.name)]. \n" + var/item_string + for(var/obj/item/item as anything in mutation_data.needed_items) + item_string += "[initial(item.name)]. \n" + + mutation_info += list( + "color" = capitalize(initial(mutation_data.output.name)), + "weight" = mutation_data.weight, + "mutate_chance" = mutation_data.mutate_probability, + "mobs_needed" = mob_string, + "items_needed" = item_string, + ) + slime_data["possible_mutations"] += list(mutation_info) + + slime_data["traits"] = list() + for(var/datum/slime_trait/trait as anything in slime.slime_traits) + var/list/trait_data = list() + trait_data += list( + "name" = trait.name, + "desc" = trait.desc, + "food" = (FOOD_CHANGE in trait.menu_buttons), + "environment" = (ENVIRONMENT_CHANGE in trait.menu_buttons), + "behaviour" = (BEHAVIOUR_CHANGE in trait.menu_buttons), + "danger" = (DANGEROUS_CHANGE in trait.menu_buttons), + "docile" = (DOCILE_CHANGE in trait.menu_buttons), + ) + slime_data["traits"] += list(trait_data) + + data["slimes"] += list(slime_data) + + data["corral_upgrades"] = list() + for(var/datum/corral_upgrade/upgrade as anything in linked_data.corral_upgrades) + data["corral_upgrades"] += list(list( + "name" = upgrade.name, + "desc" = upgrade.desc, + )) + + data["buyable_upgrades"] = list() + for(var/datum/corral_upgrade/listed as anything in subtypesof(/datum/corral_upgrade)) + var/list/upgrade_data = list() + upgrade_data += list( + "name" = listed.name, + "desc" = listed.desc, + "cost" = listed.cost, + "owned" = (listed in linked_data.corral_upgrades), + "path" = listed.type, + ) + data["buyable_upgrades"] += list(upgrade_data) + + data["reagent_amount"] = 0 + data["reagent_data"] = list() + if(linked_sucker) + data["reagent_amount"] = linked_sucker.reagents.total_volume + data["reagent_data"] = list() + for(var/datum/reagent/reagent as anything in linked_sucker.reagents.reagent_list) + data["reagent_data"] += list(list( + "name" = reagent.name, + "amount" = reagent.volume, + )) + + return data + +/obj/machinery/slime_pen_controller/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("buy") + for(var/datum/corral_upgrade/item as anything in subtypesof(/datum/corral_upgrade)) + if(text2path(params["path"]) == item) + try_buy(item) + return TRUE + +/obj/machinery/slime_pen_controller/proc/try_buy(datum/corral_upgrade/item) + if(!linked_data) + return + if(SSresearch.xenobio_points < initial(item.cost)) + return + + var/datum/corral_upgrade/new_upgrade = new item + SSresearch.xenobio_points -= new_upgrade.cost + new_upgrade.on_add(linked_data) + linked_data.corral_upgrades |= new_upgrade + +/obj/machinery/slime_pen_controller/locate_machinery(multitool_connection) + if(!mapping_id) + return + for(var/obj/machinery/plumbing/ooze_sucker/main in GLOB.machines) + if(main.mapping_id != mapping_id) + continue + linked_sucker = main + main.linked_controller = src + return + +/obj/machinery/slime_pen_controller/attack_hand_secondary(mob/user, list/modifiers) + if(linked_sucker) + visible_message(span_notice("[user] fiddles with the [src] toggling the pens ooze sucker.")) + linked_sucker.toggle_state() + return TRUE + . = ..() + +/obj/machinery/slime_pen_controller/attackby(obj/item/weapon, mob/user, params) + if(weapon.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, weapon)) + return + var/obj/item/multitool/M = weapon + if(!M.buffer) + return + var/obj/machinery/corral_corner/pad = M.buffer + if(!istype(pad)) + return + if(!pad.connected_data) + return + linked_data = pad.connected_data + to_chat(user, span_notice("You link the [pad] to the [src].")) + return + . = ..() diff --git a/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm b/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm new file mode 100644 index 000000000000..8c51a33c63f4 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_store/_base_item.dm @@ -0,0 +1,5 @@ +/datum/slime_store_item + var/name = "Generic Store Item" + var/desc = "A generic store item description." + var/obj/item/item_path + var/cost = 1000 diff --git a/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm b/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm new file mode 100644 index 000000000000..19130ddef486 --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_store/mutators.dm @@ -0,0 +1,53 @@ +/datum/slime_store_item/cleaner_mutation + name = "Cleaner Slime Mutation Syringe" + desc = "Adds the Cleaner Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/cleaner + cost = 2500 + +/datum/slime_store_item/polluter_mutation + name = "Polluter Slime Mutation Syringe" + desc = "Adds the Polluter Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/polluter + cost = 2500 + +/datum/slime_store_item/cat_mutation + name = "Gooey Cat Slime Mutation Syringe" + desc = "Adds the Gooey Cat Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/gooey_cat + cost = 2500 + +/datum/slime_store_item/radioactive_mutation + name = "Radioactive Slime Mutation Syringe" + desc = "Adds the Radioactive Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/radioactive + cost = 5000 + +/datum/slime_store_item/neverchanging_mutation + name = "Never Changing Slime Mutation Syringe" + desc = "Adds the Never Changing Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/never_evolving + cost = 2500 + +/datum/slime_store_item/noooze_mutation + name = "No Ooze Mutation Syringe" + desc = "Adds the No Ooze Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/never_ooze + cost = 2500 + +/datum/slime_store_item/random_color_mutator + name = "Random Color Mutation Syringe" + desc = "Adds the No Ooze Slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe_random + cost = 3000 + +/datum/slime_store_item/soda_slime + name = "Soda Slime Mutation Syringe" + desc = "Adds the soda slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/soda_slime + cost = 3000 + +/datum/slime_store_item/beer_slime + name = "Beer Slime Mutation Syringe" + desc = "Adds the beer slime mutation to a single slime." + item_path = /obj/item/slime_mutation_syringe/beer_slime + cost = 3000 diff --git a/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm b/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm new file mode 100644 index 000000000000..b0a9a913926a --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/slime_store/vac_upgrades.dm @@ -0,0 +1,5 @@ +/datum/slime_store_item/biomass_vac + name = "Slime Vac Biomass Link Upgrade" + desc = "A module for the slime vac that lets you link with a biomass recycler." + item_path = /obj/item/disk/vacuum_upgrade/biomass + cost = 1000 diff --git a/monkestation/code/modules/slimecore/mobs/_base_slime.dm b/monkestation/code/modules/slimecore/mobs/_base_slime.dm new file mode 100644 index 000000000000..dfbe5d102b8a --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/_base_slime.dm @@ -0,0 +1,467 @@ +/mob/living/basic/slime + name = "grey baby slime (123)" + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + icon_state = "grey baby slime" + base_icon_state = "grey baby slime" + icon_dead = "grey baby slime dead" + + maxHealth = 150 + health = 150 + + ai_controller = /datum/ai_controller/basic_controller/slime + density = FALSE + + maximum_survivable_temperature = 2000 + + pass_flags = PASSTABLE | PASSGRILLE + gender = NEUTER + faction = list(FACTION_SLIME) + + melee_damage_lower = 5 + melee_damage_upper = 15 + + //emote_see = list("jiggles", "bounces in place") + speak_emote = list("blorbles") + bubble_icon = "slime" + initial_language_holder = /datum/language_holder/slime + + + response_help_continuous = "pets" + response_help_simple = "pet" + attack_verb_continuous = "glomps" + attack_verb_simple = "glomp" + + verb_say = "blorbles" + verb_ask = "inquisitively blorbles" + verb_exclaim = "loudly blorbles" + verb_yell = "loudly blorbles" + + can_be_held = TRUE + + minimum_survivable_temperature = 100 + maximum_survivable_temperature = 600 + + // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables + // for the sake of cleanliness, though, here they are. + status_flags = CANUNCONSCIOUS|CANPUSH + + ///we track flags for slimes here like ADULT_SLIME, and PASSIVE_SLIME + var/slime_flags = NONE + + ///our current datum for slime color + var/datum/slime_color/current_color = /datum/slime_color/grey + ///this is our last cached hunger precentage between 0 and 1 + var/hunger_precent = 0 + ///how much hunger we need to produce + var/production_precent = 0.6 + ///our list of slime traits + var/list/slime_traits = list() + ///used to help our name changes so we don't rename named slimes + var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") + ///our number + var/number + + ///list of all possible mutations + var/list/possible_color_mutations = list() + + var/list/compiled_liked_foods = list() + ///this is our list of trait foods + var/list/trait_foods = list() + ///the in progress mutation used for descs + var/datum/slime_color/mutating_into + ///this is our mutation chance + var/mutation_chance = 30 + + var/obj/item/slime_accessory/worn_accessory + + ///this is a list of trees that we replace goes from base = replaced + var/list/replacement_trees = list() + ///this is our emotion overlay states + var/list/emotion_states = list( + EMOTION_HAPPY = "aslime-happy", + EMOTION_SAD = "aslime-sad", + EMOTION_ANGER = "aslime-angry", + EMOTION_FUNNY = "aslime-mischevous", + EMOTION_SCARED = "aslime-scared", + EMOTION_SUPRISED = "aslime-happy", + EMOTION_HUNGRY = "aslime-pout", + ) + + ///if set and with the trait replaces the grey part with this + var/icon_state_override + var/overwrite_color + var/datum/reagent/chemical_injection + var/overriding_name_prefix + + + /// Commands you can give this carp once it is tamed, not static because subtypes can modify it + var/friendship_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + /datum/pet_command/point_targeting/attack/latch, + /datum/pet_command/stop_eating, + ) + ///the amount of ooze we produce + var/ooze_production = 10 + +/mob/living/basic/slime/Initialize(mapload, datum/slime_color/passed_color) + . = ..() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_SLIME, 0.5, -11) + AddElement(/datum/element/soft_landing) + + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_CAREFUL_STEPS, INNATE_TRAIT) + + if(!passed_color) + current_color = new current_color + else + current_color = new passed_color + current_color.on_add_to_slime(src) + + AddComponent(/datum/component/obeys_commands, friendship_commands) + + AddComponent(/datum/component/liquid_secretion, current_color.secretion_path, ooze_production, 10 SECONDS, TYPE_PROC_REF(/mob/living/basic/slime, check_secretion)) + AddComponent(/datum/component/generic_mob_hunger, 400, 0.1, 5 MINUTES, 200) + AddComponent(/datum/component/scared_of_item, 5) + AddComponent(/datum/component/emotion_buffer, emotion_states) + AddComponent(/datum/component/friendship_container, list(FRIENDSHIP_HATED = -100, FRIENDSHIP_DISLIKED = -50, FRIENDSHIP_STRANGER = 0, FRIENDSHIP_NEUTRAL = 10, FRIENDSHIP_ACQUAINTANCES = 25, FRIENDSHIP_FRIEND = 50, FRIENDSHIP_BESTFRIEND = 100), FRIENDSHIP_FRIEND) + + RegisterSignal(src, COMSIG_HUNGER_UPDATED, PROC_REF(hunger_updated)) + RegisterSignal(src, COMSIG_MOB_OVERATE, PROC_REF(attempt_change)) + + for(var/datum/slime_mutation_data/listed as anything in current_color.possible_mutations) + var/datum/slime_mutation_data/data = new listed + data.on_add_to_slime(src) + possible_color_mutations += data + if(length(data.needed_items)) + compiled_liked_foods |= data.needed_items + + update_slime_varience() + if(length(compiled_liked_foods)) + recompile_ai_tree() + + +/mob/living/basic/slime/death(gibbed) + . = ..() + if(buckled) + buckled?.unbuckle_all_mobs() + +/mob/living/basic/slime/Destroy() + . = ..() + for(var/datum/slime_trait/trait as anything in slime_traits) + remove_trait(trait) + UnregisterSignal(src, COMSIG_HUNGER_UPDATED) + UnregisterSignal(src, COMSIG_MOB_OVERATE) + + for(var/datum/slime_mutation_data/mutation as anything in possible_color_mutations) + qdel(mutation) + + QDEL_NULL(current_color) + +/mob/living/basic/slime/mob_try_pickup(mob/living/user, instant) + if(!SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_FRIEND)) + to_chat(user, span_notice("[src] doesn't trust you enough to let you pick them up")) + return FALSE + . = ..() + +/mob/living/basic/slime/examine(mob/user) + . = ..() + if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_FRIEND)) + if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_BESTFRIEND)) + . += span_notice("You are one of [src]'s best friends!") + else + . += span_notice("You are one of [src]'s friends") + +/mob/living/basic/slime/resolve_right_click_attack(atom/target, list/modifiers) + if(GetComponent(/datum/component/latch_feeding)) + unbuckle_all_mobs() + return + else if(CanReach(target) && !HAS_TRAIT(target, TRAIT_LATCH_FEEDERED)) + AddComponent(/datum/component/latch_feeding, target, TOX, 2, 4, FALSE, CALLBACK(src, TYPE_PROC_REF(/mob/living/basic/slime, latch_callback), target)) + return + . = ..() + + +/mob/living/basic/slime/proc/rebuild_foods() + compiled_liked_foods |= trait_foods + +/mob/living/basic/slime/proc/recompile_ai_tree() + var/list/new_planning_subtree = list() + rebuild_foods() + + RemoveElement(/datum/element/basic_eating) + + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/pet_planning) + + if(!HAS_TRAIT(src, TRAIT_SLIME_RABID)) + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item) + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/flee_target) + + if(slime_flags & CLEANER_SLIME) + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/cleaning_subtree) + + if(!(slime_flags & PASSIVE_SLIME)) + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/simple_find_target_no_trait/slime) + + if(length(compiled_liked_foods)) + AddElement(/datum/element/basic_eating, food_types = compiled_liked_foods) + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/find_food) + ai_controller.override_blackboard_key(BB_BASIC_FOODS, compiled_liked_foods) //since list we override + + new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/basic_melee_attack_subtree/slime) + + ai_controller.replace_planning_subtrees(new_planning_subtree) + +/mob/living/basic/slime/proc/add_or_replace_tree(datum/ai_planning_subtree/checker) + if(checker in replacement_trees) + return replacement_trees[checker] + return checker + +/mob/living/basic/slime/proc/update_slime_varience() + var/prefix = "grey" + if(icon_state_override) + prefix = icon_state_override + else + prefix = current_color.icon_prefix + + if(slime_flags & ADULT_SLIME) + icon_state = "[prefix] adult slime" + icon_dead = "[prefix] baby slime dead" + else + icon_state = "[prefix] baby slime" + icon_dead = "[prefix] baby slime dead" + + if(stat == DEAD) + icon_state = icon_dead + + update_name() + if(!chemical_injection) + SEND_SIGNAL(src, COMSIG_SECRETION_UPDATE, current_color.secretion_path, ooze_production, 10 SECONDS) + else + SEND_SIGNAL(src, COMSIG_SECRETION_UPDATE, chemical_injection, ooze_production, 10 SECONDS) + +/mob/living/basic/slime/update_overlays() + . = ..() + if(worn_accessory) + if(slime_flags & ADULT_SLIME) + .+= mutable_appearance(worn_accessory.accessory_icon, "[worn_accessory.accessory_icon_state]-adult", layer + 0.15, src, appearance_flags = (KEEP_APART | RESET_COLOR)) + else + .+= mutable_appearance(worn_accessory.accessory_icon, "[worn_accessory.accessory_icon_state]-baby", layer + 0.15, src, appearance_flags = (KEEP_APART | RESET_COLOR)) + +/mob/living/basic/slime/proc/check_secretion() + if((!(slime_flags & ADULT_SLIME)) || (slime_flags & STORED_SLIME) || (slime_flags & MUTATING_SLIME) || (slime_flags & NOOOZE_SLIME)) + return FALSE + if(stat == DEAD) + return FALSE + if(hunger_precent < production_precent) + return FALSE + return TRUE + +/mob/living/basic/slime/proc/hunger_updated(datum/source, current_hunger, max_hunger) + hunger_precent = current_hunger / max_hunger + if(hunger_precent > 0.6) + slime_flags |= ADULT_SLIME + else + slime_flags &= ~ADULT_SLIME + update_slime_varience() + update_appearance() + +/mob/living/basic/slime/proc/add_trait(datum/slime_trait/added_trait) + for(var/datum/slime_trait/trait as anything in slime_traits) + if(added_trait in trait.incompatible_traits) + return FALSE + + var/datum/slime_trait/new_trait = new added_trait + new_trait.on_add(src) + slime_traits += new_trait + return TRUE + +///unlike add trait this uses a type and is checked against the list don't pass the created one pass the type +/mob/living/basic/slime/proc/remove_trait(datum/slime_trait/removed_trait) + for(var/datum/slime_trait/trait as anything in slime_traits) + if(trait.type != removed_trait) + continue + slime_traits -= trait + qdel(trait) + return + +///unlike add trait this uses a type and is checked against the list don't pass the created one pass the type +/mob/living/basic/slime/proc/has_slime_trait(datum/slime_trait/checked_trait) + for(var/datum/slime_trait/trait as anything in slime_traits) + if(trait.type != checked_trait) + continue + return TRUE + return FALSE + +/mob/living/basic/slime/update_name() + if(slime_name_regex.Find(name)) + if(!number) + number = rand(1, 1000) + if(overriding_name_prefix) + name = "[overriding_name_prefix] [current_color.name] [(slime_flags & ADULT_SLIME) ? "adult" : "baby"] slime ([number])" + else + name = "[current_color.name] [(slime_flags & ADULT_SLIME) ? "adult" : "baby"] slime ([number])" + real_name = name + return ..() + +/mob/living/basic/slime/proc/start_split() + ai_controller.set_ai_status(AI_STATUS_OFF) + slime_flags |= SPLITTING_SLIME + + visible_message(span_notice("[name] starts to flatten, it looks to be splitting.")) + + addtimer(CALLBACK(src, PROC_REF(finish_splitting)), 15 SECONDS) + +/mob/living/basic/slime/proc/finish_splitting() + SEND_SIGNAL(src, COMSIG_MOB_ADJUST_HUNGER, -200) + update_slime_varience() + + slime_flags &= ~SPLITTING_SLIME + ai_controller.set_ai_status(AI_STATUS_ON) + + var/mob/living/basic/slime/new_slime = new(loc, current_color.type) + new_slime.mutation_chance = mutation_chance + for(var/datum/slime_trait/trait as anything in slime_traits) + new_slime.add_trait(trait.type) + +/mob/living/basic/slime/proc/start_mutating(random = FALSE) + if(!pick_mutation(random)) + return FALSE + + ai_controller.set_ai_status(AI_STATUS_OFF) + visible_message(span_notice("[name] starts to undulate, it looks to be mutating.")) + slime_flags |= MUTATING_SLIME + + ungulate() + + + addtimer(CALLBACK(src, PROC_REF(finish_mutating)), 30 SECONDS) + mutation_chance = 30 + return TRUE + +/mob/living/basic/slime/proc/change_color(datum/slime_color/new_color) + var/datum/slime_color/new_slime_color = new new_color + QDEL_NULL(current_color) + current_color = new_slime_color + new_slime_color.on_add_to_slime(src) + + update_slime_varience() + + compiled_liked_foods = list() + + QDEL_LIST(possible_color_mutations) + possible_color_mutations = list() + + for(var/datum/slime_mutation_data/listed as anything in current_color.possible_mutations) + var/datum/slime_mutation_data/data = new listed + data.on_add_to_slime(src) + possible_color_mutations += data + if(length(data.needed_items)) + compiled_liked_foods |= data.needed_items + + recompile_ai_tree() + +/mob/living/basic/slime/proc/finish_mutating() + animate(src) // empty animate to break ungulating + if(!mutating_into) + return + SEND_SIGNAL(src, COMSIG_MOB_ADJUST_HUNGER, -200) + change_color(mutating_into) + + slime_flags &= ~MUTATING_SLIME + ai_controller.set_ai_status(AI_STATUS_ON) + + +/mob/living/basic/slime/proc/pick_mutation(random = FALSE) + mutating_into = null + var/list/valid_choices = list() + for(var/datum/slime_mutation_data/listed as anything in possible_color_mutations) + if(!random && !listed.can_mutate) + continue + if(random && listed.syringe_blocked) + continue + valid_choices += listed + valid_choices[listed] = listed.weight + if(!length(valid_choices)) + return FALSE + + var/datum/slime_mutation_data/picked = pick_weight(valid_choices) + if(!picked) + return FALSE + mutating_into = picked.output + return TRUE + +/mob/living/basic/slime/proc/attempt_change(datum/source, hunger_precent) + if(slime_flags & NOEVOLVE_SLIME) + return + if(prob(mutation_chance)) // we try to mutate 30% of the time + if(!start_mutating()) + start_split() + else + mutation_chance += 10 + start_split() + +/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, params) + . = ..() + if(!istype(attacking_item, /obj/item/slime_accessory)) + return + worn_accessory = attacking_item + attacking_item.forceMove(src) + update_appearance() + +/mob/living/basic/slime/attack_hand(mob/living/carbon/human/user, list/modifiers) + . = ..() + if(worn_accessory) + visible_message("[user] takes the [worn_accessory] off the [src].") + worn_accessory = null + worn_accessory.forceMove(get_turf(user)) + update_appearance() + +/mob/living/basic/slime/Life(seconds_per_tick, times_fired) + if(isopenturf(loc)) + var/turf/open/my_our_turf = loc + if(my_our_turf.pollution) + my_our_turf.pollution.touch_act(src) + . = ..() + +/mob/living/basic/slime/proc/apply_water() + adjustBruteLoss(rand(15,20)) + if(!client) + if(buckled) + unbuckle_mob(buckled, TRUE) + return + +/mob/living/basic/slime/proc/latch_callback(mob/living/target) + if(!chemical_injection) + return FALSE + if(!target.reagents) + return FALSE + target.reagents.add_reagent(chemical_injection, 3) // guh + return TRUE + +/mob/living/basic/slime/rainbow + current_color = /datum/slime_color/rainbow + +/mob/living/basic/slime/random + +/mob/living/basic/slime/random/Initialize(mapload, datum/slime_color/passed_color) + current_color = pick(subtypesof(/datum/slime_color)) + . = ..() + +/mob/living/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(HAS_TRAIT(src, VACPACK_THROW)) + REMOVE_TRAIT(src, VACPACK_THROW, "vacpack") + pass_flags &= ~PASSMOB + +/mob/living/basic/slime/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, gentle, quickstart) + force = 0 + . = ..() + +/mob/living/basic/slime/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, throwingdatum.thrower, FRIENDSHIP_FRIEND)) + if(!HAS_TRAIT(hit_atom, TRAIT_LATCH_FEEDERED) && isliving(hit_atom)) + AddComponent(/datum/component/latch_feeding, hit_atom, TOX, 2, 4, FALSE, CALLBACK(src, PROC_REF(latch_callback), hit_atom), FALSE) + visible_message(span_danger("[throwingdatum.thrower] hucks [src] at [hit_atom] causing the [src] to stick to [hit_atom].")) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm new file mode 100644 index 000000000000..36172a0bb356 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/clean_target.dm @@ -0,0 +1,42 @@ +/datum/ai_behavior/execute_clean + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/execute_clean/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/execute_clean/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/atom/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.visible_message(span_notice("[living_pawn] dissolves the [target].")) + SEND_SIGNAL(living_pawn, COMSIG_MOB_FEED, target, 20) + qdel(target) // Sent to the shadow realm to never be seen again + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/execute_clean/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target) || is_type_in_typecache(target, controller.blackboard[BB_HUNTABLE_TRASH])) + return + if(!iscarbon(target)) + controller.clear_blackboard_key(target_key) + return + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/find_and_set/in_list/clean_targets + action_cooldown = 2 SECONDS + +/datum/ai_behavior/find_and_set/in_list/clean_targets/search_tactic(datum/ai_controller/controller, locate_paths, search_range) + var/list/found = typecache_filter_list(oview(search_range, controller.pawn), locate_paths) + if(length(found)) + return pick(found) + diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm new file mode 100644 index 000000000000..9e19ada40e61 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/feed.dm @@ -0,0 +1,22 @@ +/datum/ai_behavior/basic_melee_attack/try_latch_feed + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + terminate_after_action = TRUE + melee_attacks = FALSE + +/datum/ai_behavior/basic_melee_attack/try_latch_feed/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + var/mob/living/basic/basic_mob = controller.pawn + if(HAS_TRAIT(basic_mob, TRAIT_FEEDING)) + return FALSE + . = ..() + +/datum/ai_behavior/basic_melee_attack/try_latch_feed/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) + if(SEND_SIGNAL(controller.pawn, COMSIG_FRIENDSHIP_CHECK_LEVEL, controller.blackboard[target_key], FRIENDSHIP_FRIEND)) + controller.clear_blackboard_key(target_key) + else if(succeeded && isliving(controller.blackboard[target_key])) + var/atom/target = controller.blackboard[target_key] + var/mob/living/basic/slime/basic_mob = controller.pawn + if(basic_mob.CanReach(target) && !HAS_TRAIT(target, TRAIT_LATCH_FEEDERED)) + basic_mob.AddComponent(/datum/component/latch_feeding, target, TOX, 2, 4, FALSE, CALLBACK(basic_mob, TYPE_PROC_REF(/mob/living/basic/slime, latch_callback), target)) + controller.clear_blackboard_key(target_key) + . = ..() + diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm new file mode 100644 index 000000000000..4e8fae2271b3 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/find_target_without_trait.dm @@ -0,0 +1,82 @@ +/datum/ai_behavior/find_potential_targets_without_trait + action_cooldown = 2 SECONDS + /// How far can we see stuff? + var/vision_range = 9 + /// Blackboard key for aggro range, uses vision range if not specified + var/aggro_range_key = BB_AGGRO_RANGE + /// Static typecache list of potentially dangerous objs + var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) + ///our max size + var/checks_size = FALSE + +/datum/ai_behavior/find_potential_targets_without_trait/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, trait) + . = ..() + var/mob/living/living_mob = controller.pawn + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + + if(!targeting_strategy) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + + var/atom/current_target = controller.blackboard[target_key] + if (targeting_strategy.can_attack(living_mob, current_target, vision_range)) + finish_action(controller, succeeded = FALSE) + return + + var/aggro_range = controller.blackboard[aggro_range_key] || vision_range + + controller.clear_blackboard_key(target_key) + var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide + + for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, aggro_range)) + potential_targets += HM + + if(!potential_targets.len) + finish_action(controller, succeeded = FALSE) + return + + var/list/filtered_targets = list() + + for(var/mob/living/pot_target in potential_targets) + if(HAS_TRAIT(pot_target, trait)) + continue + + if(SEND_SIGNAL(controller.pawn, COMSIG_FRIENDSHIP_CHECK_LEVEL, pot_target, FRIENDSHIP_FRIEND)) + continue + + if(pot_target.client && controller.blackboard[BB_WONT_TARGET_CLIENTS]) + continue + + if(checks_size && pot_target.mob_size >= living_mob.mob_size)///hello shitcode department? + continue + + if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it? + filtered_targets += pot_target + continue + + if(!filtered_targets.len) + finish_action(controller, succeeded = FALSE) + return + + var/atom/target = pick_final_target(controller, filtered_targets) + controller.set_blackboard_key(target_key, target) + + var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target) + + if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. + controller.set_blackboard_key(hiding_location_key, potential_hiding_location) + + finish_action(controller, succeeded = TRUE) + +/datum/ai_behavior/find_potential_targets_without_trait/finish_action(datum/ai_controller/controller, succeeded, ...) + . = ..() + if (succeeded) + controller.CancelActions() // On retarget cancel any further queued actions so that they will setup again with new target + +/// Returns the desired final target from the filtered list of targets +/datum/ai_behavior/find_potential_targets_without_trait/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets) + return pick(filtered_targets) + + +/datum/ai_behavior/find_potential_targets_without_trait/smaller + checks_size = TRUE diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm new file mode 100644 index 000000000000..2046f2e14e9d --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/flee_from_item.dm @@ -0,0 +1,76 @@ +/datum/ai_behavior/find_potential_targets_with_item + action_cooldown = 2 SECONDS + /// How far can we see stuff? + var/vision_range = 9 + /// Blackboard key for aggro range, uses vision range if not specified + var/aggro_range_key = BB_AGGRO_RANGE + /// Static typecache list of potentially dangerous objs + var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) + +/datum/ai_behavior/find_potential_targets_with_item/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, scared_item_key) + . = ..() + var/mob/living/living_mob = controller.pawn + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + var/obj/item/scared_item_path = controller.blackboard[scared_item_key] + + if(!targeting_strategy) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + + var/atom/current_target = controller.blackboard[target_key] + if (targeting_strategy.can_attack(living_mob, current_target, vision_range)) + finish_action(controller, succeeded = FALSE) + return + + var/aggro_range = controller.blackboard[aggro_range_key] || vision_range + + controller.clear_blackboard_key(target_key) + var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide + + for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, aggro_range)) + potential_targets += HM + + if(!potential_targets.len) + finish_action(controller, succeeded = FALSE) + return + + var/list/filtered_targets = list() + + for(var/atom/pot_target in potential_targets) + if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it? + if(!ishuman(pot_target)) + continue + + var/mob/living/carbon/human/human = pot_target + for(var/obj/item/item as anything in human.held_items) + if(!item) + continue + if(item.type != scared_item_path) + continue + filtered_targets += pot_target + break + + continue + + if(!filtered_targets.len) + finish_action(controller, succeeded = FALSE) + return + + var/atom/target = pick_final_target(controller, filtered_targets) + controller.set_blackboard_key(target_key, target) + + var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target) + + if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. + controller.set_blackboard_key(hiding_location_key, potential_hiding_location) + + finish_action(controller, succeeded = TRUE) + +/datum/ai_behavior/find_potential_targets_with_item/finish_action(datum/ai_controller/controller, succeeded, ...) + . = ..() + if (succeeded) + controller.CancelActions() // On retarget cancel any further queued actions so that they will setup again with new target + +/// Returns the desired final target from the filtered list of targets +/datum/ai_behavior/find_potential_targets_with_item/proc/pick_final_target(datum/ai_controller/controller, list/filtered_targets) + return pick(filtered_targets) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm new file mode 100644 index 000000000000..4967f6a0afaa --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/behaviours/slime_stacker.dm @@ -0,0 +1,62 @@ +/datum/ai_behavior/slime_stacker + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/slime_stacker/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + if(!controller.blackboard[BB_TARGETING_STRATEGY]) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + + if(controller.pawn.GetComponent(/datum/component/mob_stacker)) + return FALSE + + if(HAS_TRAIT(controller.pawn, TRAIT_IN_STACK)) + return FALSE + //Hiding location is priority + var/atom/real_target + var/list/potential_targets = list() + for(var/mob/living/basic/slime/target in oview(4, controller.pawn)) + if(target.GetComponent(/datum/component/latch_feeding)) + continue + if(target.GetComponent(/datum/component/mob_stacker)) + if(target == controller.pawn) + return FALSE + if(!SEND_SIGNAL(target, COMSIG_CHECK_CAN_ADD_NEW_STACK)) + continue + real_target = target + break + if(target == controller.pawn) + continue + + if(HAS_TRAIT(target, TRAIT_IN_STACK)) + continue + + potential_targets += target + + if(!real_target && length(potential_targets)) + real_target = pick(potential_targets) + real_target.AddComponent(/datum/component/mob_stacker) + + if(QDELETED(real_target)) + return FALSE + + controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, real_target) + set_movement_target(controller, real_target) + + + +/datum/ai_behavior/slime_stacker/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, trait) + if (isliving(controller.pawn)) + var/mob/living/pawn = controller.pawn + if (world.time < pawn.next_move) + return + + . = ..() + + finish_action(controller, TRUE, BB_BASIC_MOB_CURRENT_TARGET) + +/datum/ai_behavior/slime_stacker/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + if(succeeded) + var/mob/living/basic/basic_mob = controller.pawn + var/atom/movable/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + SEND_SIGNAL(target, COMSIG_ATOM_JOIN_STACK, basic_mob) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm new file mode 100644 index 000000000000..c4b937fbb729 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/controller.dm @@ -0,0 +1,21 @@ +/datum/ai_controller/basic_controller/slime + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_BASIC_MOB_SCARED_ITEM = /obj/item/extinguisher, + BB_BASIC_MOB_STOP_FLEEING = TRUE, + BB_WONT_TARGET_CLIENTS = FALSE, //specifically to stop targetting clients + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_slime_playful + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + //we try to flee first these flip flop based on flee state which is controlled by a componenet on the mob + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item, + /datum/ai_planning_subtree/flee_target, + //now we try to + /datum/ai_planning_subtree/simple_find_target_no_trait/slime, + /datum/ai_planning_subtree/basic_melee_attack_subtree/slime, + ) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm new file mode 100644 index 000000000000..e1ed36b396c4 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/idle_behavior/slime_playful.dm @@ -0,0 +1,22 @@ +/datum/idle_behavior/idle_slime_playful + ///Chance that the mob random walks per second + var/walk_chance = 25 + ///list of possible play_type + var/list/playing_types = list( + /datum/ai_behavior/slime_stacker, + ) + +/datum/idle_behavior/idle_slime_playful/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(LAZYLEN(living_pawn.do_afters)) + return + + if(SPT_PROB(walk_chance, seconds_per_tick) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + + if(prob(3)) //change this as we see fit + controller.queue_behavior(pick(playing_types)) + else if (prob(4)) + SEND_SIGNAL(controller.pawn, EMOTION_BUFFER_SPEAK_FROM_BUFFER) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm new file mode 100644 index 000000000000..4a4ae0f1ea90 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/basic_melee_tree.dm @@ -0,0 +1,7 @@ +/datum/ai_planning_subtree/basic_melee_attack_subtree/slime + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/try_latch_feed + +/datum/ai_planning_subtree/basic_melee_attack_subtree/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + return diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm new file mode 100644 index 000000000000..f8671b4e1c17 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/cleaning_tree.dm @@ -0,0 +1,17 @@ + +/datum/ai_planning_subtree/cleaning_subtree + +/datum/ai_planning_subtree/cleaning_subtree/SelectBehaviors(datum/ai_controller/basic_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_CLEAN_TARGET)) + controller.queue_behavior(/datum/ai_behavior/execute_clean, BB_CLEAN_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + var/list/final_hunt_list = list() + + final_hunt_list += controller.blackboard[BB_CLEANABLE_DECALS] + final_hunt_list += controller.blackboard[BB_CLEANABLE_BLOOD] + final_hunt_list += controller.blackboard[BB_HUNTABLE_PESTS] + final_hunt_list += controller.blackboard[BB_HUNTABLE_TRASH] + + controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list/clean_targets, BB_CLEAN_TARGET, final_hunt_list) + diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm new file mode 100644 index 000000000000..0631be487a80 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/find_target_slime.dm @@ -0,0 +1,27 @@ +/datum/ai_planning_subtree/simple_find_target_no_trait + var/trait = TRAIT_AI_PAUSED + var/unique_behavior = FALSE + +/datum/ai_planning_subtree/simple_find_target_no_trait/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(!unique_behavior) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets_without_trait, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, trait) + + +/datum/ai_planning_subtree/simple_find_target_no_trait/slime + trait = TRAIT_LATCH_FEEDERED + +/datum/ai_planning_subtree/simple_find_target_no_trait/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + return + . = ..() + +/datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat + trait = TRAIT_LATCH_FEEDERED + unique_behavior = TRUE + +/datum/ai_planning_subtree/simple_find_target_no_trait/slime/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + return + . = ..() + controller.queue_behavior(/datum/ai_behavior/find_potential_targets_without_trait/smaller, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, trait) diff --git a/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm new file mode 100644 index 000000000000..031fe175665f --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/ai_controller/subtrees/flee_with_item.dm @@ -0,0 +1,9 @@ +/// Find the nearest thing which we assume is hostile and set it as the flee target +/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item + +/datum/ai_planning_subtree/simple_find_nearest_target_to_flee_has_item/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + return + controller.queue_behavior(/datum/ai_behavior/find_potential_targets_with_item, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, BB_BASIC_MOB_SCARED_ITEM) + diff --git a/monkestation/code/modules/slimecore/mobs/feeding_flora.dm b/monkestation/code/modules/slimecore/mobs/feeding_flora.dm new file mode 100644 index 000000000000..e4fcac709527 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/feeding_flora.dm @@ -0,0 +1,80 @@ +/mob/living/basic/cockroach/rockroach + name = "rockroach" + desc = "This cockroach has decided to cosplay as a turtle and is carrying a rock shell on it's back." + icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi' + icon_state = "rockroach" + health = 15 + maxHealth = 15 + +/mob/living/basic/cockroach/rockroach/Initialize(mapload) + . = ..() + AddComponent(/datum/component/squashable, squash_chance = 15, squash_damage = 5) + AddElement(/datum/element/death_drops, list(/obj/item/rockroach_shell)) + +/obj/item/rockroach_shell + name = "rockroach shell" + desc = "A rocky shell of some poor rockroach." + icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi' + icon_state = "rockroach_shell" + w_class = WEIGHT_CLASS_SMALL + throw_speed = 2 + throw_range = 7 + +/mob/living/basic/cockroach/iceroach + name = "iceroach" + desc = "This cockroach has decided to cosplay as a turtle and is carrying some ice shards on it's back." + icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi' + icon_state = "rockroach" + health = 15 + maxHealth = 15 + +/mob/living/basic/cockroach/recursive + name = "recursive roach" + desc = "I swear I've seen this one before but I can't remember where." + icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi' + icon_state = "rockroach" + health = 15 + maxHealth = 15 + +/mob/living/basic/xenofauna + desc = "Feed these to the slimes!" + icon = 'monkestation/code/modules/slimecore/icons/xenofauna.dmi' + ai_controller = /datum/ai_controller/basic_controller/cockroach + health = 40 + maxHealth = 40 + +/mob/living/basic/xenofauna/diyaab + name = "diyaab" + icon_state = "diyaab" + +/mob/living/basic/xenofauna/lavadog + name = "lava dog" + icon_state = "lavadog" + +/mob/living/basic/xenofauna/dron + name = "semi-organic bug" + icon_state = "dron" + +/mob/living/basic/xenofauna/greeblefly + name = "greeblefly" + icon_state = "greeblefly" + +/mob/living/basic/xenofauna/possum + name = "possum" + icon_state = "possum" + +/mob/living/basic/xenofauna/thoom + name = "thoom" + icon_state = "thoom" + +/mob/living/basic/xenofauna/meatbeast + name = "meat beast" + icon_state = "meatbeast" + +/mob/living/basic/xenofauna/thinbug + name = "thin bug" + icon_state = "thinbug" + +/mob/living/basic/xenofauna/voxslug + name = "strange slug" + icon_state = "voxslug" diff --git a/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm b/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm new file mode 100644 index 000000000000..e55cf3912b66 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/pet_commands/latch_feed.dm @@ -0,0 +1,2 @@ +/datum/pet_command/point_targeting/attack/latch + attack_behaviour = /datum/ai_behavior/basic_melee_attack/try_latch_feed diff --git a/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm b/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm new file mode 100644 index 000000000000..d93bc55ff5d4 --- /dev/null +++ b/monkestation/code/modules/slimecore/mobs/pet_commands/stop_feeding.dm @@ -0,0 +1,13 @@ +/datum/pet_command/stop_eating + command_name = "Stop Eating" + command_desc = "Command your pet to stop eating." + radial_icon = 'icons/testing/turf_analysis.dmi' + radial_icon_state = "red_arrow" + speech_commands = list("stop eating", "get off") + +/datum/pet_command/stop_eating/execute_action(datum/ai_controller/controller) + var/mob/living/mob = controller.pawn + if(mob.buckled) + mob.buckled.unbuckle_mob(mob, force=TRUE) + + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/monkestation/code/modules/slimecore/readme.md b/monkestation/code/modules/slimecore/readme.md new file mode 100644 index 000000000000..2e6bb87e4c0a --- /dev/null +++ b/monkestation/code/modules/slimecore/readme.md @@ -0,0 +1,36 @@ +## Title: + + +MODULE ID: SLIMECORE + +### Description: + +This PR trys to rework slimes into the cool little blobs they always should have been. + + + + +### TG Proc/File Changes: + + + - N/A + +### Defines: + + + +### Master file additions + + + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Made by Dwasint diff --git a/monkestation/code/modules/slimecore/reagents/_base_reagent.dm b/monkestation/code/modules/slimecore/reagents/_base_reagent.dm new file mode 100644 index 000000000000..a0c1b691692c --- /dev/null +++ b/monkestation/code/modules/slimecore/reagents/_base_reagent.dm @@ -0,0 +1,12 @@ +/datum/reagent/slime_ooze + name = "Generic Slime Ooze" + evaporation_rate = 0.01 + opacity = 225 + slippery = FALSE + var/obj/item/slime_extract/extract_path + +/datum/reagent/proc/add_to_member(obj/effect/abstract/liquid_turf/adder) + return + +/datum/reagent/proc/remove_from_member(obj/effect/abstract/liquid_turf/remover) + return diff --git a/monkestation/code/modules/slimecore/reagents/base_colors.dm b/monkestation/code/modules/slimecore/reagents/base_colors.dm new file mode 100644 index 000000000000..37a526ed01b0 --- /dev/null +++ b/monkestation/code/modules/slimecore/reagents/base_colors.dm @@ -0,0 +1,116 @@ + +/datum/reagent/slime_ooze/grey + name = "Grey Slime Ooze" + color = COLOR_GRAY + extract_path = /obj/item/slime_extract/grey + +/datum/reagent/slime_ooze/blue + name = "Light Blue Slime Ooze" + color = COLOR_CARP_LIGHT_BLUE + extract_path = /obj/item/slime_extract/blue + +/datum/reagent/slime_ooze/darkblue + name = "Dark Blue Slime Ooze" + color = COLOR_BLUE + extract_path = /obj/item/slime_extract/darkblue + +/datum/reagent/slime_ooze/green + name = "Green Slime Ooze" + color = "#D6F264" + extract_path = /obj/item/slime_extract/green + +/datum/reagent/slime_ooze/metal + name = "Metal Slime Ooze" + color = "#6D758D" + extract_path = /obj/item/slime_extract/metal + +/datum/reagent/slime_ooze/purple + name = "Purple Slime Ooze" + color = "#BC4A9B" + extract_path = /obj/item/slime_extract/purple + +/datum/reagent/slime_ooze/orange + name = "Orange Slime Ooze" + color = "#FA6A0A" + extract_path = /obj/item/slime_extract/orange + +/datum/reagent/slime_ooze/pink + name = "Pink Slime Ooze" + color = "#F5A097" + extract_path = /obj/item/slime_extract/pink + +/datum/reagent/slime_ooze/darkpurple + name = "Dark Purple Slime Ooze" + color = "#793A80" + extract_path = /obj/item/slime_extract/darkpurple + +/datum/reagent/slime_ooze/red + name = "Red Slime Ooze" + color = "#B4202A" + extract_path = /obj/item/slime_extract/red + +/datum/reagent/slime_ooze/yellow + name = "Yellow Slime Ooze" + color = "#F9A31B" + extract_path = /obj/item/slime_extract/yellow + +/datum/reagent/slime_ooze/gold + name = "Gold Slime Ooze" + color = "#BB7547" + extract_path = /obj/item/slime_extract/gold + +/datum/reagent/slime_ooze/silver + name = "Silver Slime Ooze" + color = "#8B93AF" + extract_path = /obj/item/slime_extract/silver + +/datum/reagent/slime_ooze/lightpink + name = "Light Pink Slime Ooze" + color = "#E9B5A3" + extract_path = /obj/item/slime_extract/lightpink + +/datum/reagent/slime_ooze/black + name = "Black Slime Ooze" + color = "#333941" + extract_path = /obj/item/slime_extract/black + +/datum/reagent/slime_ooze/rainbow + name = "Rainbow Slime Ooze" + color = "#ffffff" + extract_path = /obj/item/slime_extract/rainbow + +/datum/reagent/slime_ooze/rainbow/add_to_member(obj/effect/abstract/liquid_turf/adder) + adder.rainbow_effect() + +/datum/reagent/slime_ooze/rainbow/remove_from_member(obj/effect/abstract/liquid_turf/remover) + remover.remove_rainbow_effect() + +/datum/reagent/slime_ooze/oil + name = "Oil Slime Ooze" + color = "#242234" + extract_path = /obj/item/slime_extract/oil + +/datum/reagent/slime_ooze/adamantine + name = "Adamantine Slime Ooze" + color = "#5DAF8D" + extract_path = /obj/item/slime_extract/adamantine + +/datum/reagent/slime_ooze/bluespace + name = "Bluespace Slime Ooze" + color = "#C0E4FD" + extract_path = /obj/item/slime_extract/bluespace + +/datum/reagent/slime_ooze/pyrite + name = "Pyrite Slime Ooze" + color = "#FFD541" + extract_path = /obj/item/slime_extract/pyrite + +/datum/reagent/slime_ooze/sepia + name = "Sepia Slime Ooze" + color = "#A08662" + extract_path = /obj/item/slime_extract/sepia + +/datum/reagent/slime_ooze/cerulean + name = "Cerulean Slime Ooze" + color = "#285CC4" + extract_path = /obj/item/slime_extract/cerulean diff --git a/monkestation/code/modules/slimecore/research_and_recipes.dm b/monkestation/code/modules/slimecore/research_and_recipes.dm new file mode 100644 index 000000000000..1063300564be --- /dev/null +++ b/monkestation/code/modules/slimecore/research_and_recipes.dm @@ -0,0 +1,102 @@ +/obj/item/circuitboard/machine/biomass_recycler + name = "Biomass Recycler (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/biomass_recycler + req_components = list( + /datum/stock_part/matter_bin = 3, + /datum/stock_part/manipulator = 2) + needs_anchored = FALSE + +/obj/item/circuitboard/machine/corral_corner + name = "Corral Corner (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/corral_corner + req_components = list( + /datum/stock_part/matter_bin = 1, + /datum/stock_part/manipulator = 1) + needs_anchored = TRUE + +/obj/item/circuitboard/machine/slime_extract_requestor + name = "Extract Request Pad (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/slime_extract_requestor + req_components = list( + /datum/stock_part/manipulator = 2, + /obj/item/stack/sheet/glass = 1) + def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) + +/obj/item/circuitboard/computer/slime_market + name = "Slime Market (Computer Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/computer/slime_market + +/obj/item/circuitboard/machine/slime_market_pad + name = "Intergalactic Market Pad (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/slime_market_pad + req_components = list( + /datum/stock_part/manipulator = 2, + /obj/item/stack/sheet/glass = 1) + def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) + + +/datum/design/slimevac + name = "Slime Vacuum" + id = "slimevac" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/vacuum_pack + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/slime_market_pad + name = "Slime Market Pad Board" + desc = "The circuit board for a slime market pad." + id = "slime_market_pad" + build_path = /obj/item/circuitboard/machine/slime_market_pad + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/slime_market + name = "Slime Market Computer Board" + desc = "The circuit board for a slime market computer." + id = "slime_market" + build_path = /obj/item/circuitboard/computer/slime_market + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/slime_extract_requestor + name = "Slime Extract Requestor Board" + desc = "The circuit board for a slime extract requestor." + id = "slime_extract_requestor" + build_path = /obj/item/circuitboard/machine/slime_extract_requestor + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/corral_corner + name = "Corral Corner Board" + desc = "The circuit board for a corral corner piece." + id = "corral_corner" + build_path = /obj/item/circuitboard/machine/corral_corner + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/biomass_recycler + name = "Biomass Recycler Board" + desc = "The circuit board for a biomass recycler." + id = "biomass_recycler" + build_path = /obj/item/circuitboard/machine/biomass_recycler + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_FAB + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm b/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm new file mode 100644 index 000000000000..6dd3f44115a7 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_accessories.dm/_base_accessory.dm @@ -0,0 +1,12 @@ +/obj/item/slime_accessory + name = "Generic Accessory" + desc = "Can be worn by a slime." + + icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + icon_state = "witch_hat" + + var/accessory_icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + var/accessory_icon_state = "witch_hat" + +/obj/item/slime_accessory/witch_hat + name = "Slime Witch Hat" diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm b/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm new file mode 100644 index 000000000000..341224e91b69 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_color_mutations/_base_color.dm @@ -0,0 +1,25 @@ +GLOBAL_LIST_INIT(unlocked_slime_colors, list()) + +/datum/slime_color + ///the name of the slime color + var/name = "Generic Color" + ///this is appended to the icon_states of the slime + var/icon_prefix = "grey" + ///secretion path + var/secretion_path = /datum/reagent/slime_ooze/grey + ///our slimes true color + var/slime_color = "#FFFFFF" + ///list of possible mutations from this color + var/list/possible_mutations = list() + +/datum/slime_color/proc/on_add_to_slime(mob/living/basic/slime/slime) + return + +/datum/slime_color/New() + . = ..() + if(!(type in GLOB.unlocked_slime_colors)) + on_first_unlock() + GLOB.unlocked_slime_colors |= type + +/datum/slime_color/proc/on_first_unlock() + return diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm b/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm new file mode 100644 index 000000000000..97c9f1e167d2 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_color_mutations/colors.dm @@ -0,0 +1,238 @@ +/datum/slime_color/grey + name = "grey" + icon_prefix = "grey" + secretion_path = /datum/reagent/slime_ooze/grey + slime_color = "#FFFFFF" // I know this is white its because the base colors are greyed + possible_mutations = list( + /datum/slime_mutation_data/metal, + /datum/slime_mutation_data/orange, + /datum/slime_mutation_data/purple, + /datum/slime_mutation_data/blue, + ) + +/datum/slime_color/grey/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1) + +/datum/slime_color/blue + name = "blue" + icon_prefix = "blue" + secretion_path = /datum/reagent/slime_ooze/blue + slime_color = "#25F8E6" + possible_mutations = list( + /datum/slime_mutation_data/silver, + /datum/slime_mutation_data/dark_blue, + /datum/slime_mutation_data/pink, + ) + +/datum/slime_color/blue/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/meatbeast = 2) + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/diyaab = 1) + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/thinbug = 1) + +/datum/slime_color/dark_blue + name = "dark blue" + icon_prefix = "dark blue" + secretion_path = /datum/reagent/slime_ooze/darkblue + slime_color = "#3375F9" + possible_mutations = list( + /datum/slime_mutation_data/blue, + /datum/slime_mutation_data/purple, + /datum/slime_mutation_data/cerulean, + ) + + +/datum/slime_color/dark_blue/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1) + GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/recursive = 1) + +/datum/slime_color/green + name = "green" + icon_prefix = "green" + secretion_path = /datum/reagent/slime_ooze/green + slime_color = "#D6F264" + possible_mutations = list( + /datum/slime_mutation_data/black, + ) + +/datum/slime_color/green/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/thoom = 2) + +/datum/slime_color/metal + name = "metal" + icon_prefix = "metal" + secretion_path = /datum/reagent/slime_ooze/metal + slime_color = "#6D758D" + possible_mutations = list( + /datum/slime_mutation_data/silver, + /datum/slime_mutation_data/yellow, + /datum/slime_mutation_data/gold, + ) + +/datum/slime_color/metal/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/meatbeast = 2) + +/datum/slime_color/purple + name = "purple" + icon_prefix = "purple" + secretion_path = /datum/reagent/slime_ooze/purple + slime_color = "#BC4A9B" + possible_mutations = list( + /datum/slime_mutation_data/green, + /datum/slime_mutation_data/dark_blue, + /datum/slime_mutation_data/darkpurple, + ) + +/datum/slime_color/purple/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/greeblefly = 2) + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/diyaab = 1) + +/datum/slime_color/orange + name = "orange" + icon_prefix = "orange" + secretion_path = /datum/reagent/slime_ooze/orange + slime_color = "#FA6A0A" + possible_mutations = list( + /datum/slime_mutation_data/darkpurple, + /datum/slime_mutation_data/yellow, + /datum/slime_mutation_data/red, + ) + +/datum/slime_color/orange/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/lavadog = 1) + +/datum/slime_color/pink + name = "pink" + icon_prefix = "pink" + secretion_path = /datum/reagent/slime_ooze/pink + slime_color = "#F5A097" + possible_mutations = list( + /datum/slime_mutation_data/lightpink, + ) + +/datum/slime_color/pink/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/voxslug = 1) + +/datum/slime_color/darkpurple + name = "dark purple" + icon_prefix = "dark purple" + secretion_path = /datum/reagent/slime_ooze/darkpurple + slime_color = "#793A80" + possible_mutations = list( + /datum/slime_mutation_data/sepia, + /datum/slime_mutation_data/purple, + /datum/slime_mutation_data/orange, + ) + +/datum/slime_color/darkpurple/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/possum = 1) + +/datum/slime_color/red + name = "red" + icon_prefix = "red" + secretion_path = /datum/reagent/slime_ooze/red + slime_color = "#B4202A" + possible_mutations = list( + /datum/slime_mutation_data/oil, + ) + +/datum/slime_color/darkpurple/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/xenofauna/dron = 1) + +/datum/slime_color/yellow + name = "yellow" + icon_prefix = "yellow" + secretion_path = /datum/reagent/slime_ooze/yellow + slime_color = "#F9A31B" + possible_mutations = list( + /datum/slime_mutation_data/bluespace, + /datum/slime_mutation_data/metal, + /datum/slime_mutation_data/orange, + ) + +/datum/slime_color/gold + name = "gold" + icon_prefix = "gold" + secretion_path = /datum/reagent/slime_ooze/gold + slime_color = "#BB7547" + possible_mutations = list( + /datum/slime_mutation_data/adamantine, + ) + +/datum/slime_color/silver + name = "silver" + icon_prefix = "silver" + secretion_path = /datum/reagent/slime_ooze/silver + slime_color = "#8B93AF" + possible_mutations = list( + /datum/slime_mutation_data/pyrite, + /datum/slime_mutation_data/metal, + /datum/slime_mutation_data/blue, + ) + +/datum/slime_color/silver/on_first_unlock() + GLOB.biomass_unlocks |= list(/mob/living/basic/cockroach/iceroach = 1) + +/datum/slime_color/lightpink + name = "light pink" + icon_prefix = "light pink" + secretion_path = /datum/reagent/slime_ooze/lightpink + slime_color = "#E9B5A3" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/black + name = "black" + icon_prefix = "black" + secretion_path = /datum/reagent/slime_ooze/black + slime_color = "#333941" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/rainbow + name = "rainbow" + icon_prefix = "rainbow" + secretion_path = /datum/reagent/slime_ooze/rainbow + slime_color = "#FFFFFF" + +/datum/slime_color/rainbow/on_add_to_slime(mob/living/basic/slime/slime) + slime.rainbow_effect() + +/datum/slime_color/oil + name = "oil" + icon_prefix = "oil" + secretion_path = /datum/reagent/slime_ooze/oil + slime_color = "#242234" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/sepia + name = "sepia" + icon_prefix = "sepia" + secretion_path = /datum/reagent/slime_ooze/sepia + slime_color = "#A08662" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/adamantine + name = "adamantine" + icon_prefix = "adamantine" + secretion_path = /datum/reagent/slime_ooze/adamantine + slime_color = "#5DAF8D" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/bluespace + name = "bluespace" + icon_prefix = "bluespace" + secretion_path = /datum/reagent/slime_ooze/bluespace + slime_color = "#C0E4FD" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/pyrite + name = "pyrite" + icon_prefix = "pyrite" + secretion_path = /datum/reagent/slime_ooze/pyrite + slime_color = "#FFD541" + possible_mutations = list(/datum/slime_mutation_data/rainbow) + +/datum/slime_color/cerulean + name = "cerulean" + icon_prefix = "cerulean" + secretion_path = /datum/reagent/slime_ooze/cerulean + slime_color = "#285CC4" + possible_mutations = list(/datum/slime_mutation_data/rainbow) diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm new file mode 100644 index 000000000000..0d26407b2584 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/_base_mutation.dm @@ -0,0 +1,59 @@ +/datum/slime_mutation_data + var/mob/living/basic/slime/host + ///mutation weight + var/weight = 10 + ///our probability of being mutated after weight + var/mutate_probability = 100 + ///are we blocked from color mutation syringes + var/syringe_blocked = FALSE + ///can we mutate + var/can_mutate = FALSE + ///The slime mutation we pass on if we succeed + var/datum/slime_color/output + ///Items to feed the slime in order to mutate + var/list/needed_items = list() + ///the liquids we need to consume in order to mutate + var/list/needed_reagents = list() + ///the mobs needed to be latch fed in order to mutate - stored in type = amount + var/list/latch_needed = list() + +/datum/slime_mutation_data/Destroy(force, ...) + . = ..() + host = null + +/datum/slime_mutation_data/proc/on_add_to_slime(mob/living/basic/slime/host) + src.host = host + if(length(needed_items)) + RegisterSignal(host, COMSIG_LIVING_ATE, PROC_REF(check_ate)) + + /* + if(length(needed_reagents)) + */ + + if(length(latch_needed)) + RegisterSignal(host, COMSIG_MOB_FEED, PROC_REF(check_latch)) + +/datum/slime_mutation_data/proc/recheck_mutation() + if(length(latch_needed) || length(needed_reagents) || length(needed_items)) + return + can_mutate = TRUE + UnregisterSignal(host, COMSIG_LIVING_ATE) + UnregisterSignal(host, COMSIG_MOB_FEED) + +/datum/slime_mutation_data/proc/check_latch(datum/source, mob/living/target, amount) + if(!(target.type in latch_needed)) + return + + latch_needed[target.type] -= amount + if(latch_needed[target.type] <= 0) + latch_needed -= target.type + recheck_mutation() + +/datum/slime_mutation_data/proc/check_ate(datum/source, atom/target) + for(var/item in needed_items) + if(!istype(target, item)) + continue + needed_items -= item + + recheck_mutation() + diff --git a/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm new file mode 100644 index 000000000000..e090430f7645 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_color_mutations/mutations/colors.dm @@ -0,0 +1,93 @@ +/datum/slime_mutation_data/metal + output = /datum/slime_color/metal + needed_items = list(/obj/item/stack/sheet/iron) + +/datum/slime_mutation_data/orange + output = /datum/slime_color/orange + needed_items = list(/obj/item/stack/sheet/mineral/plasma) + +/datum/slime_mutation_data/purple + output = /datum/slime_color/purple + needed_items = list(/obj/item/stack/medical/gauze) + +/datum/slime_mutation_data/blue + output = /datum/slime_color/blue + latch_needed = list(/mob/living/basic/cockroach/iceroach = 50) + +/datum/slime_mutation_data/cerulean + output = /datum/slime_color/cerulean + latch_needed = list(/mob/living/basic/cockroach/recursive = 40) + +/datum/slime_mutation_data/dark_blue + output = /datum/slime_color/dark_blue + latch_needed = list(/mob/living/basic/xenofauna/diyaab = 75) + +/datum/slime_mutation_data/red + output = /datum/slime_color/red + latch_needed = list(/mob/living/basic/xenofauna/lavadog = 50) + +/datum/slime_mutation_data/oil + output = /datum/slime_color/oil + latch_needed = list(/mob/living/basic/xenofauna/dron = 65) + +/datum/slime_mutation_data/yellow + output = /datum/slime_color/yellow + needed_items = list(/obj/item/stock_parts/cell) + +/datum/slime_mutation_data/green + output = /datum/slime_color/green + latch_needed = list(/mob/living/basic/xenofauna/greeblefly = 65) + +/datum/slime_mutation_data/sepia + output = /datum/slime_color/sepia + latch_needed = list(/mob/living/basic/xenofauna/possum = 65) + +/datum/slime_mutation_data/black + output = /datum/slime_color/black + latch_needed = list(/mob/living/basic/xenofauna/thoom = 50) + +/datum/slime_mutation_data/silver + output = /datum/slime_color/silver + latch_needed = list(/mob/living/basic/xenofauna/meatbeast = 80) + +/datum/slime_mutation_data/gold + output = /datum/slime_color/gold + needed_items = list(/obj/item/stack/sheet/mineral/gold) + +/datum/slime_mutation_data/adamantine + output = /datum/slime_color/adamantine + needed_items = list(/obj/item/rockroach_shell) + +/datum/slime_mutation_data/darkpurple + output = /datum/slime_color/darkpurple + needed_items = list(/obj/item/slime_extract/purple) + +/datum/slime_mutation_data/pink + output = /datum/slime_color/pink + latch_needed = list(/mob/living/basic/xenofauna/thinbug = 80) + +/datum/slime_mutation_data/pyrite + output = /datum/slime_color/pyrite + needed_items = list(/obj/item/toy/crayon/rainbow) + +/datum/slime_mutation_data/bluespace + output = /datum/slime_color/bluespace + needed_items = list(/obj/item/stack/ore/bluespace_crystal) + +/datum/slime_mutation_data/lightpink + output = /datum/slime_color/lightpink + latch_needed = list(/mob/living/basic/xenofauna/voxslug = 80) + +/datum/slime_mutation_data/rainbow + output = /datum/slime_color/rainbow + needed_items = list( + /obj/item/slime_extract/orange = 1, + /obj/item/slime_extract/purple = 1, + /obj/item/slime_extract/blue = 1, + /obj/item/slime_extract/metal = 1, + /obj/item/slime_extract/yellow = 1, + /obj/item/slime_extract/darkblue = 1, + /obj/item/slime_extract/darkpurple = 1, + /obj/item/slime_extract/silver = 1, + ) + syringe_blocked = TRUE diff --git a/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm b/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm new file mode 100644 index 000000000000..ff7b5d45e980 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/_base_trait.dm @@ -0,0 +1,57 @@ +/datum/slime_trait + var/name = "Base Trait" + var/desc = "You shouldn't see this, this means someone forgot to set a trait desc or your seeing the base trait." + + //flags this trait has like TRAIT_PROCESS, TRAIT_ON_DEATH, TRAIT_ON_LIFE, etc + var/trait_flags = NONE + + ///what buttons do we show in the trait menu ie FOOD_CHANGE, ENVIRONMENT_CHANGE + var/list/menu_buttons = list() + + ///this is type paths of traits don't work together + var/list/incompatible_traits = list() + + ///our host slime + var/mob/living/basic/slime/host + +/datum/slime_trait/proc/on_add(mob/living/basic/slime/parent) + if(!parent) + return + host = parent + if(trait_flags & TRAIT_ON_DEATH) + RegisterSignal(host, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + if(trait_flags & TRAIT_VISUAL) + RegisterSignal(host, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_overlays)) + host.update_overlays() + +/datum/slime_trait/proc/on_remove(mob/living/basic/slime/parent) + return + +/datum/slime_trait/proc/on_death() + return + +/datum/slime_trait/proc/apply_overlays(obj/item/source, list/overlays) + return + + +/datum/slime_trait/visual + + trait_flags = (TRAIT_VISUAL) + //the visual icon_state of the trait + var/trait_icon_state + ///the icon path of the trait + var/trait_icon + + +/datum/slime_trait/visual/apply_overlays(obj/item/source, list/overlays) + if(!trait_icon || !trait_icon_state) + return + + var/mutable_appearance/slime_visual = mutable_appearance(trait_icon, trait_icon_state, host.layer, host, host.plane) + + if(!host.overwrite_color) + slime_visual.color = host.current_color.slime_color + else + slime_visual.color = host.overwrite_color + + overlays += slime_visual diff --git a/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm b/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm new file mode 100644 index 000000000000..c47630c4a6c1 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/beer_slime.dm @@ -0,0 +1,17 @@ +/datum/slime_trait/beer_slime + name = "Beer Slime" + desc = "Modifies their genomes to allow them to produce beer instead of ooze" + menu_buttons = list(BEHAVIOUR_CHANGE) + +/datum/slime_trait/beer_slime/on_add(mob/living/basic/slime/parent) + . = ..() + var/datum/reagent/reagent = pick(typesof(/datum/reagent/consumable/ethanol)) + parent.chemical_injection = reagent + parent.overriding_name_prefix = initial(reagent.name) + parent.update_slime_varience() + +/datum/slime_trait/beer_slime/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.chemical_injection = null + parent.overriding_name_prefix = null + parent.update_slime_varience() diff --git a/monkestation/code/modules/slimecore/slime_traits/cleaner.dm b/monkestation/code/modules/slimecore/slime_traits/cleaner.dm new file mode 100644 index 000000000000..0bd7ffff9f19 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/cleaner.dm @@ -0,0 +1,67 @@ +/datum/slime_trait/cleaner + name = "Cleaner" + desc = "Changes the slime to consume pollution and grime." + menu_buttons = list(FOOD_CHANGE, DOCILE_CHANGE, BEHAVIOUR_CHANGE) + incompatible_traits = list(/datum/slime_trait/polluter) + + ///decals we can clean + var/static/list/cleanable_decals = typecacheof(list( + /obj/effect/decal/cleanable/ants, + /obj/effect/decal/cleanable/ash, + /obj/effect/decal/cleanable/confetti, + /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/fuel_pool, + /obj/effect/decal/cleanable/generic, + /obj/effect/decal/cleanable/glitter, + /obj/effect/decal/cleanable/greenglow, + /obj/effect/decal/cleanable/insectguts, + /obj/effect/decal/cleanable/molten_object, + /obj/effect/decal/cleanable/oil, + /obj/effect/decal/cleanable/food, + /obj/effect/decal/cleanable/robot_debris, + /obj/effect/decal/cleanable/shreds, + /obj/effect/decal/cleanable/glass, + /obj/effect/decal/cleanable/vomit, + /obj/effect/decal/cleanable/wrapping, + /obj/effect/decal/remains, + )) + ///blood we can clean + var/static/list/cleanable_blood = typecacheof(list( + /obj/effect/decal/cleanable/xenoblood, + /obj/effect/decal/cleanable/blood, + /obj/effect/decal/cleanable/trail_holder, + )) + ///pests we hunt + var/static/list/huntable_pests = typecacheof(list( + /mob/living/basic/cockroach, + /mob/living/basic/mouse, + )) + ///trash we will burn + var/static/list/huntable_trash = typecacheof(list( + /obj/item/trash, + /obj/item/food/deadmouse, + )) + +/datum/slime_trait/cleaner/on_add(mob/living/basic/slime/parent) + . = ..() + parent.AddComponent(/datum/component/pollution_scrubber, 15) + + parent.slime_flags |= (CLEANER_SLIME | PASSIVE_SLIME) + + parent.ai_controller.set_blackboard_key(BB_CLEANABLE_DECALS, cleanable_decals) + parent.ai_controller.set_blackboard_key(BB_CLEANABLE_BLOOD, cleanable_blood) + parent.ai_controller.set_blackboard_key(BB_HUNTABLE_PESTS, huntable_pests) + parent.ai_controller.set_blackboard_key(BB_HUNTABLE_TRASH, huntable_trash) + + ADD_TRAIT(parent, TRAIT_SLIME_DUST_IMMUNE, "trait") + parent.recompile_ai_tree() + +/datum/slime_trait/cleaner/on_remove(mob/living/basic/slime/parent) + . = ..() + + parent.slime_flags &= ~(CLEANER_SLIME | PASSIVE_SLIME) + + parent.recompile_ai_tree() + + qdel(parent.GetComponent(/datum/component/pollution_scrubber)) + REMOVE_TRAIT(parent, TRAIT_SLIME_DUST_IMMUNE, "trait") diff --git a/monkestation/code/modules/slimecore/slime_traits/docility.dm b/monkestation/code/modules/slimecore/slime_traits/docility.dm new file mode 100644 index 000000000000..30e1a1c4de91 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/docility.dm @@ -0,0 +1,11 @@ +/datum/slime_trait/docility + name = "Docility Mutation" + desc = "Mutates a slime so they avoid people with souls" + +/datum/slime_trait/docility/on_add(mob/living/basic/slime/parent) + . = ..() + parent.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, TRUE) + +/datum/slime_trait/docility/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.ai_controller.set_blackboard_key(BB_WONT_TARGET_CLIENTS, FALSE) diff --git a/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm b/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm new file mode 100644 index 000000000000..f12c99315b86 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/endisnigh.dm @@ -0,0 +1,18 @@ +/datum/slime_trait/endisnigh + name = "Ash" + desc = "This feels like a reference?" + + +/datum/slime_trait/endisnigh/on_add(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags |= OVERWRITES_COLOR + parent.icon_state_override = "ash" + parent.overwrite_color = "#242234" + SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, list()) + +/datum/slime_trait/endisnigh/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags &= ~OVERWRITES_COLOR + parent.icon_state_override = null + parent.overwrite_color = null + SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states) diff --git a/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm b/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm new file mode 100644 index 000000000000..d80ff898b780 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/never_ooze.dm @@ -0,0 +1,11 @@ +/datum/slime_trait/never_ooze + name = "Ooze Prevention" + desc = "Prevents slimes from making ooze." + +/datum/slime_trait/never_ooze/on_add(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags |= NOOOZE_SLIME + +/datum/slime_trait/never_ooze/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags &= ~NOOOZE_SLIME diff --git a/monkestation/code/modules/slimecore/slime_traits/never_split.dm b/monkestation/code/modules/slimecore/slime_traits/never_split.dm new file mode 100644 index 000000000000..0be6e81ade1a --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/never_split.dm @@ -0,0 +1,12 @@ +/datum/slime_trait/never_evolving + name = "Never Changing Slime" + desc = "Prevents the slime from splitting or mutating" + + +/datum/slime_trait/never_evolving/on_add(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags |= NOEVOLVE_SLIME + +/datum/slime_trait/never_evolving/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.slime_flags &= ~NOEVOLVE_SLIME diff --git a/monkestation/code/modules/slimecore/slime_traits/polluter.dm b/monkestation/code/modules/slimecore/slime_traits/polluter.dm new file mode 100644 index 000000000000..405c1da69cfc --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/polluter.dm @@ -0,0 +1,28 @@ +/datum/slime_trait/polluter + name = "Polluter" + desc = "Emits large quanitities of pollution." + menu_buttons = list(ENVIRONMENT_CHANGE) + incompatible_traits = list(/datum/slime_trait/cleaner) + +/datum/slime_trait/polluter/on_add(mob/living/basic/slime/parent) + . = ..() + parent.AddElement(/datum/element/pollution_emitter, /datum/pollutant/slime_dust, 30) + +/datum/slime_trait/polluter/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.RemoveElement(/datum/element/pollution_emitter) + +/datum/pollutant/slime_dust + name = "Slime Dust" + pollutant_flags = POLLUTANT_APPEARANCE | POLLUTANT_BREATHE_ACT | POLLUTANT_TOUCH_ACT + thickness = 3 + color = "#5769a5" + +/datum/pollutant/slime_dust/touch_act(mob/living/victim, amount) + if(!istype(victim, /mob/living/basic/slime) || amount < 90) + return + if(HAS_TRAIT(victim, TRAIT_SLIME_DUST_IMMUNE)) + return + + victim.adjustBruteLoss(1) + diff --git a/monkestation/code/modules/slimecore/slime_traits/radioactive.dm b/monkestation/code/modules/slimecore/slime_traits/radioactive.dm new file mode 100644 index 000000000000..77afec774bbd --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/radioactive.dm @@ -0,0 +1,13 @@ +/datum/slime_trait/radioactive + name = "Radioactive" + desc = "Emits violent rays of radiation." + menu_buttons = list(ENVIRONMENT_CHANGE, DANGEROUS_CHANGE) + +/datum/slime_trait/radioactive/on_add(mob/living/basic/slime/parent) + . = ..() + parent.add_filter("radio_slime", 10, outline_filter(12, "#39ff1430")) + parent.AddComponent(/datum/component/radioactive_emitter, cooldown_time = 5 SECONDS, range = 3, threshold = RAD_MEDIUM_INSULATION) + +/datum/slime_trait/radioactive/on_remove(mob/living/basic/slime/parent) + . = ..() + qdel(parent.GetComponent(/datum/component/radioactive_emitter)) diff --git a/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm b/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm new file mode 100644 index 000000000000..ab200dd42f69 --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/slime_cat.dm @@ -0,0 +1,20 @@ +/datum/slime_trait/visual/cat + name = "Gooey Cat" + desc = "A docile slime with cat ears!" + + trait_icon_state = "cat_ears" + trait_icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' + menu_buttons = list(FOOD_CHANGE, DOCILE_CHANGE, BEHAVIOUR_CHANGE) + +/datum/slime_trait/visual/cat/on_add(mob/living/basic/slime/parent) + . = ..() + parent.replacement_trees += list(/datum/ai_planning_subtree/simple_find_target_no_trait/slime = /datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat) + parent.emotion_states[EMOTION_HAPPY] = "aslime-:33" + SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states) + parent.recompile_ai_tree() + +/datum/slime_trait/visual/cat/on_remove (mob/living/basic/slime/parent) + parent.replacement_trees -= list(/datum/ai_planning_subtree/simple_find_target_no_trait/slime = /datum/ai_planning_subtree/simple_find_target_no_trait/slime_cat) + parent.emotion_states[EMOTION_HAPPY] = "aslime-happy" + SEND_SIGNAL(parent, EMOTION_BUFFER_UPDATE_OVERLAY_STATES, parent.emotion_states) + parent.recompile_ai_tree() diff --git a/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm b/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm new file mode 100644 index 000000000000..81f1edfc4d1c --- /dev/null +++ b/monkestation/code/modules/slimecore/slime_traits/soda_slime.dm @@ -0,0 +1,32 @@ +/datum/slime_trait/soda_slime + name = "Soda Slime" + desc = "Modifies their genomes to allow them to produce soda instead of ooze" + menu_buttons = list(BEHAVIOUR_CHANGE) + +/datum/slime_trait/soda_slime/on_add(mob/living/basic/slime/parent) + . = ..() + var/datum/reagent/reagent = pick( + /datum/reagent/consumable/space_cola, + /datum/reagent/consumable/dr_gibb, + /datum/reagent/consumable/grenadine, + /datum/reagent/consumable/icetea, + /datum/reagent/consumable/menthol, + /datum/reagent/consumable/pwr_game, + /datum/reagent/consumable/shamblers, + /datum/reagent/consumable/spacemountainwind, + /datum/reagent/consumable/sodawater, + /datum/reagent/consumable/sol_dry, + /datum/reagent/consumable/space_up, + /datum/reagent/consumable/tonic, + /datum/reagent/consumable/ethanol/thirteenloko, + /datum/reagent/consumable/ethanol/whiskey_cola, + ) + parent.chemical_injection = reagent + parent.overriding_name_prefix = initial(reagent.name) + parent.update_slime_varience() + +/datum/slime_trait/soda_slime/on_remove(mob/living/basic/slime/parent) + . = ..() + parent.chemical_injection = null + parent.overriding_name_prefix = null + parent.update_slime_varience() diff --git a/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm index d90993f09861..c655e25f9b84 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm @@ -30,6 +30,7 @@ /datum/round_event_control/antagonist/solo/changeling/midround name = "Genome Awakening (Changelings)" + antag_flag = ROLE_CHANGELING_MIDROUND prompted_picking = TRUE max_occurrences = 2 shared_occurences = list(/datum/round_event_control/antagonist/solo/changeling/roundstart) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm index 74c7cf7cf320..0a60d45d24dc 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm @@ -24,11 +24,11 @@ max_occurrences = 1 prompted_picking = TRUE -/datum/round_event_control/antagonist/solo/ghost/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) +/datum/round_event_control/antagonist/solo/from_ghosts/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) . = ..() if(!.) return - if(GLOB.wizardstart.len == 0) + if(!length(GLOB.wizardstart)) return FALSE /datum/round_event/antagonist/solo/ghost/wizard diff --git a/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm index 653e57269421..7514064a56db 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm @@ -1,5 +1,5 @@ /datum/round_event_control/antagonist/solo/traitor - antag_flag = ROLE_TRAITOR + antag_flag = ROLE_SYNDICATE_INFILTRATOR tags = list(TAG_COMBAT) antag_datum = /datum/antagonist/traitor/infiltrator protected_roles = list( @@ -21,7 +21,7 @@ /datum/round_event_control/antagonist/solo/traitor/roundstart name = "Traitors" - antag_flag = ROLE_SYNDICATE_INFILTRATOR + antag_flag = ROLE_TRAITOR antag_datum = /datum/antagonist/traitor roundstart = TRUE earliest_start = 0 SECONDS diff --git a/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm b/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm index 30f0bdc27bd9..d3c3e7e11357 100644 --- a/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm +++ b/monkestation/code/modules/virology/disease/symtoms/restricted/stage1.dm @@ -80,7 +80,7 @@ /datum/symptom/transformation/slime name = "Advanced Mutation Transformation" - new_form = /mob/living/simple_animal/slime + new_form = /mob/living/basic/slime /datum/symptom/transformation/corgi name = "The Barkening" diff --git a/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm b/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm index 03bab0cecf05..c67263b7f628 100644 --- a/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm +++ b/monkestation/code/modules/wiremod_chem/components/ouputs/factory_output.dm @@ -28,21 +28,13 @@ /obj/structure/chemical_tank/factory/proc/load_styles() //expertly copypasted from chemmasters - var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) pill_styles = list() for (var/x in 1 to PILL_STYLE_COUNT) - var/list/SL = list() - SL["id"] = x - SL["class_name"] = assets.icon_class_name("pill[x]") - pill_styles += list(SL) - var/datum/asset/spritesheet/simple/patches_assets = get_asset_datum(/datum/asset/spritesheet/simple/patches) + pill_styles += list("[x]" = image(icon = 'icons/obj/medical/chemical.dmi', icon_state = "pill[x]")) + patch_styles = list() for (var/raw_patch_style in PATCH_STYLE_LIST) - //adding class_name for use in UI - var/list/patch_style = list() - patch_style["style"] = raw_patch_style - patch_style["class_name"] = patches_assets.icon_class_name(raw_patch_style) - patch_styles += list(patch_style) + patch_styles += list("[raw_patch_style]" = image(icon = 'icons/obj/medical/chemical.dmi', icon_state = raw_patch_style)) /obj/structure/chemical_tank/factory/proc/generate_product(mob/user) if(reagents.total_volume < current_volume) @@ -52,7 +44,10 @@ reagents.trans_to(P, current_volume) P.name = trim("[product_name] pill") user.put_in_hands(P) - P.icon_state = "pill[rand(1,21)]" + if(pill_number == RANDOM_PILL_STYLE) + P.icon_state = "pill[rand(1,21)]" + else + P.icon_state = "pill[pill_number]" if(P.icon_state == "pill4") //mirrored from chem masters P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." else if (product == "patch") @@ -69,6 +64,8 @@ /obj/structure/chemical_tank/factory/AltClick(mob/user) . = ..() + if(!length(pill_styles) || !length(patch_styles)) + load_styles() var/choice_product = tgui_input_list(user, "Pick Product", "[name]", list("pill", "patch", "bottle")) if(choice_product) product = choice_product @@ -81,6 +78,17 @@ if(choice_volume) current_volume = choice_volume + if(choice_product == "patch") + var/patch_choice = show_radial_menu(user, src, patch_styles) + if(patch_choice) + patch_style = patch_choice + + if(choice_product == "pill") + var/pill_choice = show_radial_menu(user, src, pill_styles) + if(pill_choice) + pill_number = text2num(pill_choice) + + /obj/structure/chemical_tank/factory/attack_hand(mob/living/user, list/modifiers) . = ..() generate_product(user) diff --git a/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm b/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm index d358dd196b5c..5db28e73425f 100644 --- a/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm +++ b/monkestation/code/modules/wiremod_chem/components/ouputs/injector_output.dm @@ -7,7 +7,8 @@ reagent_flags = TRANSPARENT var/max_inject = 20 - var/inject_amount = 10 + var/inject_amount = 0 + var/creator_ckey = "" /obj/structure/chemical_tank/injector/Initialize(mapload) . = ..() @@ -23,12 +24,17 @@ return if(!iscarbon(AM)) return + if(!inject_amount) + return visible_message("[name] pricks [AM] with a needle injecting [inject_amount] units into them.") reagents.trans_to(AM, inject_amount, methods = INJECT) + if(creator_ckey) + logger.Log(LOG_CATEGORY_ATTACK, "[creator_ckey] injected [AM] with [inject_amount] units using a remote injector.") /obj/structure/chemical_tank/injector/AltClick(mob/user) . = ..() - var/inject_choice = tgui_input_number(user, "How much to put into a patch?", "[name]", inject_amount, max_inject, 1) + var/inject_choice = tgui_input_number(user, "How much to inject someone with?", "[name]", inject_amount, max_inject, 1) if(inject_choice) inject_amount = inject_choice + creator_ckey = user.client?.ckey diff --git a/sound/misc/woohoo.ogg b/sound/misc/woohoo.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fbbc4f08ca789ac0e7943520ee219826274632c3 GIT binary patch literal 13944 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 0fc736069411..398b9a2a19f2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -411,6 +411,7 @@ #include "code\__DEFINES\~monkestation\power.dm" #include "code\__DEFINES\~monkestation\projectiles.dm" #include "code\__DEFINES\~monkestation\robots.dm" +#include "code\__DEFINES\~monkestation\slimes.dm" #include "code\__DEFINES\~monkestation\smoothing.dm" #include "code\__DEFINES\~monkestation\span.dm" #include "code\__DEFINES\~monkestation\status_effects.dm" @@ -424,6 +425,7 @@ #include "code\__DEFINES\~monkestation\dcs\signals\signals_carbon.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_guns.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_item.dm" +#include "code\__DEFINES\~monkestation\dcs\signals\signals_mob.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_traitor.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_lists.dm" @@ -2123,7 +2125,6 @@ #include "code\game\objects\items\devices\scanners\health_analyzer.dm" #include "code\game\objects\items\devices\scanners\scanner_wand.dm" #include "code\game\objects\items\devices\scanners\sequence_scanner.dm" -#include "code\game\objects\items\devices\scanners\slime_scanner.dm" #include "code\game\objects\items\devices\scanners\t_scanner.dm" #include "code\game\objects\items\food\_food.dm" #include "code\game\objects\items\food\bait.dm" @@ -3680,7 +3681,6 @@ #include "code\modules\food_and_drinks\machinery\grill.dm" #include "code\modules\food_and_drinks\machinery\icecream_vat.dm" #include "code\modules\food_and_drinks\machinery\microwave.dm" -#include "code\modules\food_and_drinks\machinery\monkeyrecycler.dm" #include "code\modules\food_and_drinks\machinery\oven.dm" #include "code\modules\food_and_drinks\machinery\processor.dm" #include "code\modules\food_and_drinks\machinery\smartfridge.dm" @@ -4633,13 +4633,6 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\slime\death.dm" -#include "code\modules\mob\living\simple_animal\slime\emote.dm" -#include "code\modules\mob\living\simple_animal\slime\life.dm" -#include "code\modules\mob\living\simple_animal\slime\powers.dm" -#include "code\modules\mob\living\simple_animal\slime\slime.dm" -#include "code\modules\mob\living\simple_animal\slime\slime_say.dm" -#include "code\modules\mob\living\simple_animal\slime\subtypes.dm" #include "code\modules\mob_spawn\mob_spawn.dm" #include "code\modules\mob_spawn\corpses\job_corpses.dm" #include "code\modules\mob_spawn\corpses\mining_corpses.dm" @@ -5148,7 +5141,6 @@ #include "code\modules\research\techweb\_techweb_node.dm" #include "code\modules\research\techweb\all_nodes.dm" #include "code\modules\research\techweb\techweb_types.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" #include "code\modules\research\xenobiology\xenobiology.dm" #include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" #include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" @@ -5297,7 +5289,6 @@ #include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\burn_dressing.dm" #include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\dissection.dm" @@ -6725,7 +6716,6 @@ #include "monkestation\code\modules\research\nanites\nanite_programs\utility.dm" #include "monkestation\code\modules\research\nanites\nanite_programs\weapon.dm" #include "monkestation\code\modules\research\techweb\all_nodes.dm" -#include "monkestation\code\modules\research\xenobiology\xenobio_camera.dm" #include "monkestation\code\modules\security\code\holographic_handcuffs.dm" #include "monkestation\code\modules\security\code\weapons\lawbringer.dm" #include "monkestation\code\modules\security\code\weapons\paco.dm" @@ -6737,6 +6727,85 @@ #include "monkestation\code\modules\skyrat_snipes\vending_machines\vending_snacks.dm" #include "monkestation\code\modules\skyrat_snipes\vending_machines\vendors.dm" #include "monkestation\code\modules\slash_commands\world_topics.dm" +#include "monkestation\code\modules\slimecore\research_and_recipes.dm" +#include "monkestation\code\modules\slimecore\machines\slime_grinder.dm" +#include "monkestation\code\modules\slimecore\slime_accessories.dm\_base_accessory.dm" +#include "monkestation\code\modules\slimecore\animations\slime_effects.dm" +#include "monkestation\code\modules\slimecore\assets\xenobiology.dm" +#include "monkestation\code\modules\slimecore\components\basic_scared_of_item.dm" +#include "monkestation\code\modules\slimecore\components\emotion_buffer.dm" +#include "monkestation\code\modules\slimecore\components\friendship_tracker.dm" +#include "monkestation\code\modules\slimecore\components\generic_mob_hunger.dm" +#include "monkestation\code\modules\slimecore\components\latch_feeding.dm" +#include "monkestation\code\modules\slimecore\components\liquid_secretion.dm" +#include "monkestation\code\modules\slimecore\components\mob_stacker.dm" +#include "monkestation\code\modules\slimecore\components\pollution_scrubber.dm" +#include "monkestation\code\modules\slimecore\components\vac_tagged.dm" +#include "monkestation\code\modules\slimecore\corral\corral_data.dm" +#include "monkestation\code\modules\slimecore\corral\machines\corral_corner.dm" +#include "monkestation\code\modules\slimecore\corral\upgrades\_base_upgrade.dm" +#include "monkestation\code\modules\slimecore\corral\upgrades\human_docility_upgrade.dm" +#include "monkestation\code\modules\slimecore\corral\upgrades\obliteration_upgrade.dm" +#include "monkestation\code\modules\slimecore\items\crossbreeds.dm" +#include "monkestation\code\modules\slimecore\items\mutation_syringe.dm" +#include "monkestation\code\modules\slimecore\items\vacuum_pack.dm" +#include "monkestation\code\modules\slimecore\machines\biomass_recycler.dm" +#include "monkestation\code\modules\slimecore\machines\extract_requestor.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_sucker.dm" +#include "monkestation\code\modules\slimecore\machines\slime_market.dm" +#include "monkestation\code\modules\slimecore\machines\slime_market_computer.dm" +#include "monkestation\code\modules\slimecore\machines\slime_pen_controller.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor_plumbing.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\shitcode.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\_base_recipe.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\burning.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\charged.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\chilling.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\colors.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\consuming.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\industrial.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\prismatic.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\recurring.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\regenerative.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\reproductive.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\selfsustaining.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\stabilized.dm" +#include "monkestation\code\modules\slimecore\machines\slime_store\_base_item.dm" +#include "monkestation\code\modules\slimecore\machines\slime_store\mutators.dm" +#include "monkestation\code\modules\slimecore\machines\slime_store\vac_upgrades.dm" +#include "monkestation\code\modules\slimecore\mobs\_base_slime.dm" +#include "monkestation\code\modules\slimecore\mobs\feeding_flora.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\controller.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\clean_target.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\feed.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\find_target_without_trait.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\flee_from_item.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\behaviours\slime_stacker.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\idle_behavior\slime_playful.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\basic_melee_tree.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\cleaning_tree.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\find_target_slime.dm" +#include "monkestation\code\modules\slimecore\mobs\ai_controller\subtrees\flee_with_item.dm" +#include "monkestation\code\modules\slimecore\mobs\pet_commands\latch_feed.dm" +#include "monkestation\code\modules\slimecore\mobs\pet_commands\stop_feeding.dm" +#include "monkestation\code\modules\slimecore\reagents\_base_reagent.dm" +#include "monkestation\code\modules\slimecore\reagents\base_colors.dm" +#include "monkestation\code\modules\slimecore\slime_color_mutations\_base_color.dm" +#include "monkestation\code\modules\slimecore\slime_color_mutations\colors.dm" +#include "monkestation\code\modules\slimecore\slime_color_mutations\mutations\_base_mutation.dm" +#include "monkestation\code\modules\slimecore\slime_color_mutations\mutations\colors.dm" +#include "monkestation\code\modules\slimecore\slime_traits\_base_trait.dm" +#include "monkestation\code\modules\slimecore\slime_traits\beer_slime.dm" +#include "monkestation\code\modules\slimecore\slime_traits\cleaner.dm" +#include "monkestation\code\modules\slimecore\slime_traits\docility.dm" +#include "monkestation\code\modules\slimecore\slime_traits\endisnigh.dm" +#include "monkestation\code\modules\slimecore\slime_traits\never_ooze.dm" +#include "monkestation\code\modules\slimecore\slime_traits\never_split.dm" +#include "monkestation\code\modules\slimecore\slime_traits\polluter.dm" +#include "monkestation\code\modules\slimecore\slime_traits\radioactive.dm" +#include "monkestation\code\modules\slimecore\slime_traits\slime_cat.dm" +#include "monkestation\code\modules\slimecore\slime_traits\soda_slime.dm" #include "monkestation\code\modules\spells\spell_types\aoe_spell\mind_swap.dm" #include "monkestation\code\modules\spells\spell_types\conjure_item\summon_mjollnir.dm" #include "monkestation\code\modules\spells\spell_types\pointed\smite.dm" diff --git a/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx b/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx index 9f7eec043bbb..c59a3b8065e8 100644 --- a/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx +++ b/tgui/packages/tgui/interfaces/Fabrication/MaterialIcon.tsx @@ -47,7 +47,7 @@ const MATERIAL_ICONS: Record = { [17, 'sheet-titanium_2'], [34, 'sheet-titanium_3'], ], - 'bluespace crystal': [[0, 'bluespace_crystal']], + 'bluespace crystal': [[0, 'polycrystal']], 'plastic': [ [0, 'sheet-plastic'], [17, 'sheet-plastic_2'], diff --git a/tgui/packages/tgui/interfaces/SlimePenController.js b/tgui/packages/tgui/interfaces/SlimePenController.js new file mode 100644 index 000000000000..65e555d3f1ca --- /dev/null +++ b/tgui/packages/tgui/interfaces/SlimePenController.js @@ -0,0 +1,272 @@ +import { useBackend, useLocalState } from '../backend'; +import { Box, Table, Tabs, Collapsible, Stack, LabeledList, ProgressBar, Section, Button } from '../components'; +import { Window } from '../layouts'; +import { toFixed } from 'common/math'; + +export const SlimePenController = (_, context) => { + const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 1); + + return ( + + + + setTabIndex(1)}> + Slime Data + + setTabIndex(2)}> + Corral Data + + + {tabIndex === 1 && } + {tabIndex === 2 && } + + + ); +}; + +const SlimeData = (_, context) => { + const { data } = useBackend(context); + const { slimes } = data; + return ( + + {slimes.map((slime) => ( + + + + + + + {toFixed(slime.health, 0.1) + ' %'} + + + + + {toFixed(slime.hunger_precent * 100, 0.1) + ' %'} + + + + + {toFixed(slime.mutation_chance, 0.1) + ' %'} + + + + + {slime.possible_mutations.map((mutation) => ( +
+ + {mutation.color + ' Slime'} +
+ ))} +
+
+ + + {slime.traits.map((trait) => ( +
+ + {trait.name + ' Slime'} +
+ ))} +
+
+
+
+
+
+ ))} +
+ ); +}; + +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} + + + + + +
+ ))} +
+ ); +};