Merge commit 'ec9ee7eb00' into kek # Conflicts: # code/game/machinery/computer/launchpad_control.dm # code/modules/wiremod/components/utility/combiner.dm # code/modules/wiremod/port.dm # code/modules/wiremod/shell/brain_computer_interface.dm # tgui/packages/tgui/interfaces/IntegratedCircuit/index.js # # It looks like you may be committing a merge. # If this is not correct, please remove the file # .git/MERGE_HEAD # and try again. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch kek # All conflicts fixed but you are still merging. # # Changes to be committed: # modified: .github/CONTRIBUTING.md # modified: .github/workflows/compile_changelogs.yml # modified: .github/workflows/gbp.yml # modified: .github/workflows/gbp_collect.yml # modified: _maps/map_files/Deltastation/DeltaStation2.dmm # modified: _maps/map_files/IceBoxStation/IceBoxStation.dmm # modified: _maps/map_files/KiloStation/KiloStation.dmm # modified: _maps/map_files/MetaStation/MetaStation.dmm # modified: _maps/map_files/debug/runtimestation.dmm # modified: _maps/map_files/tramstation/tramstation.dmm # modified: code/__DEFINES/ai.dm # modified: code/__DEFINES/atom_hud.dm # modified: code/__DEFINES/botany.dm # modified: code/__DEFINES/dcs/signals.dm # new file: code/__DEFINES/drone.dm # modified: code/__DEFINES/logging.dm # modified: code/__DEFINES/machines.dm # modified: code/__DEFINES/misc.dm # deleted: code/__DEFINES/nanites.dm # new file: code/__DEFINES/polls.dm # modified: code/__DEFINES/power.dm # modified: code/__DEFINES/projectiles.dm # modified: code/__DEFINES/research.dm # modified: code/__DEFINES/subsystems.dm # modified: code/__DEFINES/traits.dm # modified: code/__DEFINES/wiremod.dm # modified: code/__HELPERS/files.dm # modified: code/__HELPERS/game.dm # modified: code/__HELPERS/path.dm # modified: code/__HELPERS/unsorted.dm # renamed: code/_globalvars/lists/admin.dm -> code/_globalvars/admin.dm # modified: code/_globalvars/lists/maintenance_loot.dm # modified: code/_globalvars/lists/mobs.dm # deleted: code/_globalvars/misc.dm # new file: code/_globalvars/time_vars.dm # new file: code/controllers/subsystem/ai_controllers.dm # modified: code/controllers/subsystem/explosions.dm # new file: code/controllers/subsystem/processing/ai_behaviors.dm # deleted: code/controllers/subsystem/processing/ai_controllers.dm # deleted: code/controllers/subsystem/processing/nanites.dm # modified: code/controllers/subsystem/processing/tramprocess.dm # modified: code/datums/ai/_ai_behavior.dm # modified: code/datums/ai/_ai_controller.dm # new file: code/datums/ai/_ai_planning_subtree.dm # modified: code/datums/ai/bane/bane_controller.dm # new file: code/datums/ai/bane/bane_subtrees.dm # modified: code/datums/ai/cursed/cursed_controller.dm # new file: code/datums/ai/cursed/cursed_subtrees.dm # modified: code/datums/ai/dog/dog_controller.dm # new file: code/datums/ai/dog/dog_subtrees.dm # modified: code/datums/ai/hauntium/haunted_controller.dm # new file: code/datums/ai/hauntium/hauntium_subtrees.dm # modified: code/datums/ai/hostile/hostile_controller.dm # modified: code/datums/ai/monkey/monkey_controller.dm # new file: code/datums/ai/monkey/monkey_subtrees.dm # modified: code/datums/ai/movement/ai_movement_jps.dm # modified: code/datums/ai/objects/vending_machines/vending_machine_controller.dm # modified: code/datums/ai/robot_customer/robot_customer_controller.dm # new file: code/datums/ai/robot_customer/robot_customer_subtrees.dm # modified: code/datums/components/crafting/recipes.dm # deleted: code/datums/components/footstep.dm # deleted: code/datums/components/nanites.dm # modified: code/datums/components/rust.dm # modified: code/datums/components/shell.dm # modified: code/datums/components/usb_port.dm # modified: code/datums/dash_weapon.dm # modified: code/datums/datacore.dm # deleted: code/datums/diseases/advance/symptoms/nanites.dm # new file: code/datums/elements/footstep.dm # renamed: code/datums/components/kneecapping.dm -> code/datums/elements/kneecapping.dm # renamed: code/datums/components/spooky.dm -> code/datums/elements/spooky.dm # modified: code/datums/greyscale/json_configs/meter.json # modified: code/datums/greyscale/json_configs/plushie_lizard.json # new file: code/datums/id_trim/admin.dm # renamed: code/datums/id_trim/misc.dm -> code/datums/id_trim/outfits.dm # modified: code/datums/mood_events/generic_negative_events.dm # modified: code/datums/mood_events/generic_positive_events.dm # modified: code/game/area/space_station_13_areas.dm # modified: code/game/data_huds.dm # modified: code/game/machinery/computer/crew.dm # modified: code/game/machinery/computer/launchpad_control.dm # modified: code/game/machinery/computer/security.dm # modified: code/game/machinery/computer/tram_controls.dm # modified: code/game/machinery/porta_turret/portable_turret_construct.dm # modified: code/game/machinery/scan_gate.dm # modified: code/game/objects/effects/glowshroom.dm # modified: code/game/objects/effects/misc.dm # modified: code/game/objects/effects/spawners/bundle.dm # modified: code/game/objects/effects/spawners/lootdrop.dm # new file: code/game/objects/items/bouquets.dm # new file: code/game/objects/items/choice_beacon.dm # modified: code/game/objects/items/circuitboards/computer_circuitboards.dm # modified: code/game/objects/items/circuitboards/machine_circuitboards.dm # modified: code/game/objects/items/devices/scanners.dm # modified: code/game/objects/items/granters.dm # new file: code/game/objects/items/gun_maintenance.dm # modified: code/game/objects/items/holy_weapons.dm # modified: code/game/objects/items/implants/implant_deathrattle.dm # deleted: code/game/objects/items/miscellaneous.dm # modified: code/game/objects/items/pinpointer.dm # modified: code/game/objects/items/plushes.dm # modified: code/game/objects/items/pneumaticCannon.dm # new file: code/game/objects/items/skub.dm # modified: code/game/objects/items/storage/bags.dm # modified: code/game/objects/items/storage/boxes.dm # modified: code/game/objects/items/storage/wallets.dm # new file: code/game/objects/items/virgin_mary.dm # deleted: code/game/objects/structures/cannon.dm # new file: code/game/objects/structures/cannons/cannon.dm # new file: code/game/objects/structures/cannons/cannon_instructions.dm # renamed: code/game/objects/items/stacks/cannonballs.dm -> code/game/objects/structures/cannons/cannonballs.dm # modified: code/game/objects/structures/crates_lockers/closets/bodybag.dm # modified: code/game/objects/structures/signs/signs_departments.dm # modified: code/game/turfs/open/floor/iron_floor.dm # modified: code/game/turfs/open/floor/misc_floor.dm # modified: code/game/turfs/open/floor/plating/asteroid.dm # modified: code/game/turfs/turf.dm # modified: code/modules/admin/admin_investigate.dm # modified: code/modules/admin/admin_verbs.dm # modified: code/modules/admin/verbs/adminpm.dm # modified: code/modules/admin/verbs/diagnostics.dm # modified: code/modules/admin/verbs/mapping.dm # modified: code/modules/antagonists/changeling/powers/mutations.dm # modified: code/modules/antagonists/disease/disease_abilities.dm # modified: code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm # modified: code/modules/antagonists/revenant/revenant_abilities.dm # modified: code/modules/antagonists/slaughter/slaughter.dm # modified: code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm # modified: code/modules/atmospherics/machinery/other/meter.dm # modified: code/modules/capture_the_flag/ctf_classes.dm # modified: code/modules/capture_the_flag/ctf_equipment.dm # modified: code/modules/client/player_details.dm # modified: code/modules/clothing/spacesuits/hardsuit.dm # modified: code/modules/clothing/under/costume.dm # modified: code/modules/events/fake_virus.dm # modified: code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm # modified: code/modules/hydroponics/grown/flowers.dm # modified: code/modules/hydroponics/grown/rainbow_bunch.dm # modified: code/modules/hydroponics/hydroponics.dm # modified: code/modules/hydroponics/plant_genes.dm # modified: code/modules/instruments/items.dm # modified: code/modules/mining/lavaland/necropolis_chests.dm # modified: code/modules/mining/minebot.dm # modified: code/modules/mob/dead/new_player/poll.dm # modified: code/modules/mob/living/brain/brain_item.dm # modified: code/modules/mob/living/carbon/alien/alien.dm # modified: code/modules/mob/living/carbon/alien/humanoid/humanoid.dm # modified: code/modules/mob/living/carbon/carbon_defines.dm # modified: code/modules/mob/living/carbon/human/human.dm # modified: code/modules/mob/living/carbon/human/human_defines.dm # modified: code/modules/mob/living/carbon/human/species_types/jellypeople.dm # modified: code/modules/mob/living/carbon/human/species_types/zombies.dm # modified: code/modules/mob/living/living_defense.dm # modified: code/modules/mob/living/living_defines.dm # modified: code/modules/mob/living/simple_animal/constructs.dm # modified: code/modules/mob/living/simple_animal/eldritch_demons.dm # modified: code/modules/mob/living/simple_animal/friendly/drone/_drone.dm # modified: code/modules/mob/living/simple_animal/friendly/robot_customer.dm # modified: code/modules/mob/living/simple_animal/simple_animal.dm # modified: code/modules/mob/living/simple_animal/slime/powers.dm # modified: code/modules/mob/mob_helpers.dm # modified: code/modules/modular_computers/computers/item/computer_power.dm # modified: code/modules/modular_computers/file_system/programs/radar.dm # modified: code/modules/modular_computers/hardware/recharger.dm # modified: code/modules/power/apc.dm # modified: code/modules/power/power.dm # renamed: code/modules/projectiles/ammunition/caseless/misc.dm -> code/modules/projectiles/ammunition/caseless/energy.dm # new file: code/modules/projectiles/ammunition/caseless/harpoon.dm # renamed: code/modules/projectiles/boxes_magazines/internal/misc.dm -> code/modules/projectiles/boxes_magazines/internal/meathook.dm # modified: code/modules/projectiles/gun.dm # modified: code/modules/projectiles/guns/ballistic.dm # renamed: code/modules/projectiles/guns/misc/bow.dm -> code/modules/projectiles/guns/ballistic/bow.dm # renamed: code/modules/projectiles/guns/misc/beam_rifle.dm -> code/modules/projectiles/guns/energy/beam_rifle.dm # renamed: code/modules/projectiles/guns/misc/blastcannon.dm -> code/modules/projectiles/guns/special/blastcannon.dm # renamed: code/modules/projectiles/guns/misc/chem_gun.dm -> code/modules/projectiles/guns/special/chem_gun.dm # renamed: code/modules/projectiles/guns/misc/grenade_launcher.dm -> code/modules/projectiles/guns/special/grenade_launcher.dm # renamed: code/modules/projectiles/guns/misc/medbeam.dm -> code/modules/projectiles/guns/special/medbeam.dm # renamed: code/modules/projectiles/guns/misc/syringe_gun.dm -> code/modules/projectiles/guns/special/syringe_gun.dm # renamed: code/modules/projectiles/projectile/bullets/cannon.dm -> code/modules/projectiles/projectile/bullets/cannonball.dm # renamed: code/modules/projectiles/projectile/energy/misc.dm -> code/modules/projectiles/projectile/energy/decloner.dm # new file: code/modules/projectiles/projectile/energy/ninja.dm # modified: code/modules/research/designs.dm # modified: code/modules/research/designs/comp_board_designs.dm # modified: code/modules/research/designs/electronics_designs.dm # modified: code/modules/research/designs/machine_designs.dm # deleted: code/modules/research/designs/nanite_designs.dm # deleted: code/modules/research/nanites/extra_settings/_extra_setting.dm # deleted: code/modules/research/nanites/extra_settings/boolean.dm # deleted: code/modules/research/nanites/extra_settings/number.dm # deleted: code/modules/research/nanites/extra_settings/text.dm # deleted: code/modules/research/nanites/extra_settings/type.dm # deleted: code/modules/research/nanites/nanite_chamber.dm # deleted: code/modules/research/nanites/nanite_chamber_computer.dm # deleted: code/modules/research/nanites/nanite_cloud_controller.dm # deleted: code/modules/research/nanites/nanite_hijacker.dm # deleted: code/modules/research/nanites/nanite_misc_items.dm # deleted: code/modules/research/nanites/nanite_program_hub.dm # deleted: code/modules/research/nanites/nanite_programmer.dm # deleted: code/modules/research/nanites/nanite_programs.dm # deleted: code/modules/research/nanites/nanite_programs/buffing.dm # deleted: code/modules/research/nanites/nanite_programs/healing.dm # deleted: code/modules/research/nanites/nanite_programs/protocols.dm # deleted: code/modules/research/nanites/nanite_programs/rogue.dm # deleted: code/modules/research/nanites/nanite_programs/sensor.dm # deleted: code/modules/research/nanites/nanite_programs/suppression.dm # deleted: code/modules/research/nanites/nanite_programs/utility.dm # deleted: code/modules/research/nanites/nanite_programs/weapon.dm # deleted: code/modules/research/nanites/nanite_remote.dm # deleted: code/modules/research/nanites/program_disks.dm # deleted: code/modules/research/nanites/public_chamber.dm # deleted: code/modules/research/nanites/rules.dm # modified: code/modules/research/techweb/all_nodes.dm # modified: code/modules/station_goals/bsa.dm # modified: code/modules/tgui/tgui_alert.dm # modified: code/modules/unit_tests/designs.dm # modified: code/modules/vehicles/scooter.dm # modified: code/modules/vending/_vending.dm # modified: code/modules/vending/autodrobe.dm # modified: code/modules/vending/clothesmate.dm # modified: code/modules/wiremod/component_printer.dm # modified: code/modules/wiremod/components/abstract/compare.dm # modified: code/modules/wiremod/components/abstract/module.dm # modified: code/modules/wiremod/components/action/light.dm # modified: code/modules/wiremod/components/action/mmi.dm # modified: code/modules/wiremod/components/action/pathfind.dm # modified: code/modules/wiremod/components/action/pull.dm # modified: code/modules/wiremod/components/action/radio.dm # modified: code/modules/wiremod/components/action/soundemitter.dm # modified: code/modules/wiremod/components/action/speech.dm # modified: code/modules/wiremod/components/atom/direction.dm # modified: code/modules/wiremod/components/atom/gps.dm # modified: code/modules/wiremod/components/atom/health.dm # modified: code/modules/wiremod/components/atom/hear.dm # modified: code/modules/wiremod/components/atom/self.dm # modified: code/modules/wiremod/components/atom/species.dm # modified: code/modules/wiremod/components/list/concat.dm # modified: code/modules/wiremod/components/list/get_column.dm # modified: code/modules/wiremod/components/list/index.dm # modified: code/modules/wiremod/components/list/index_table.dm # modified: code/modules/wiremod/components/list/select.dm # modified: code/modules/wiremod/components/list/split.dm # modified: code/modules/wiremod/components/math/arithmetic.dm # modified: code/modules/wiremod/components/math/length.dm # modified: code/modules/wiremod/components/math/not.dm # modified: code/modules/wiremod/components/math/random.dm # modified: code/modules/wiremod/components/sensors/pressuresensor.dm # modified: code/modules/wiremod/components/sensors/tempsensor.dm # modified: code/modules/wiremod/components/string/concat.dm # modified: code/modules/wiremod/components/string/textcase.dm # modified: code/modules/wiremod/components/string/tonumber.dm # modified: code/modules/wiremod/components/string/tostring.dm # modified: code/modules/wiremod/components/utility/clock.dm # new file: code/modules/wiremod/components/utility/combiner.dm # modified: code/modules/wiremod/components/utility/delay.dm # modified: code/modules/wiremod/components/utility/multiplexer.dm # new file: code/modules/wiremod/duplicator.dm # modified: code/modules/wiremod/integrated_circuit.dm # modified: code/modules/wiremod/port.dm # modified: code/modules/wiremod/shell/airlock.dm # modified: code/modules/wiremod/shell/brain_computer_interface.dm # modified: code/modules/wiremod/shell/compact_remote.dm # modified: code/modules/wiremod/shell/controller.dm # modified: code/modules/wiremod/shell/moneybot.dm # modified: code/modules/wiremod/shell/scanner.dm # deleted: html/changelogs/AutoChangeLog-pr-60095.yml # deleted: html/changelogs/AutoChangeLog-pr-60139.yml # new file: html/changelogs/AutoChangeLog-pr-60157.yml # new file: html/changelogs/AutoChangeLog-pr-60314.yml # deleted: html/changelogs/AutoChangeLog-pr-60338.yml # deleted: html/changelogs/AutoChangeLog-pr-60392.yml # deleted: html/changelogs/AutoChangeLog-pr-60395.yml # deleted: html/changelogs/AutoChangeLog-pr-60398.yml # deleted: html/changelogs/AutoChangeLog-pr-60408.yml # deleted: html/changelogs/AutoChangeLog-pr-60414.yml # deleted: html/changelogs/AutoChangeLog-pr-60419.yml # deleted: html/changelogs/AutoChangeLog-pr-60420.yml # deleted: html/changelogs/AutoChangeLog-pr-60425.yml # deleted: html/changelogs/AutoChangeLog-pr-60428.yml # deleted: html/changelogs/AutoChangeLog-pr-60429.yml # new file: html/changelogs/AutoChangeLog-pr-60433.yml # new file: html/changelogs/AutoChangeLog-pr-60476.yml # new file: html/changelogs/AutoChangeLog-pr-60483.yml # new file: html/changelogs/AutoChangeLog-pr-60492.yml # new file: html/changelogs/AutoChangeLog-pr-60498.yml # new file: html/changelogs/AutoChangeLog-pr-60501.yml # modified: html/changelogs/archive/2021-07.yml # new file: icons/effects/rust_overlay.dmi # modified: icons/mob/actions/actions_items.dmi # modified: icons/mob/clothing/under/costume.dmi # modified: icons/mob/hud.dmi # modified: icons/mob/lavaland/lavaland_monsters.dmi # modified: icons/obj/atmospherics/pipes/meter.dmi # new file: icons/obj/cannons.dmi # modified: icons/obj/clothing/under/costume.dmi # modified: icons/obj/computer.dmi # modified: icons/obj/decals.dmi # modified: icons/obj/device.dmi # modified: icons/obj/guns/projectiles.dmi # renamed: icons/obj/machines/nanite_chamber.dmi -> icons/obj/machines/bci_implanter.dmi # modified: icons/obj/machines/research.dmi # modified: icons/obj/stack_objects.dmi # modified: icons/obj/surgery.dmi # modified: icons/obj/wiremod_fab.dmi # modified: icons/turf/areas.dmi # modified: icons/turf/walls/wall.dmi # modified: strings/cas_white.txt # modified: strings/locations.json # modified: tgstation.dme # modified: tgui/packages/tgui/interfaces/AlertModal.js # modified: tgui/packages/tgui/interfaces/IntegratedCircuit/index.js # deleted: tgui/packages/tgui/interfaces/NaniteChamberControl.js # deleted: tgui/packages/tgui/interfaces/NaniteCloudControl.js # deleted: tgui/packages/tgui/interfaces/NaniteProgramHub.js # deleted: tgui/packages/tgui/interfaces/NaniteProgrammer.js # deleted: tgui/packages/tgui/interfaces/NaniteRemote.js # modified: tgui/packages/tgui/interfaces/ScannerGate.js # modified: tgui/packages/tgui/interfaces/Techweb.js # # ------------------------ >8 ------------------------ # Do not modify or remove the line above. # Everything below it will be ignored. diff --git a/strings/cas_white.txt b/strings/cas_white.txt index 9429f88bcc..644ffdf21c 100644 --- a/strings/cas_white.txt +++ b/strings/cas_white.txt @@ -304,7 +304,7 @@ The vomitgoose. Ziptie hogtying. Defeating a changeling by sticking your hand down its pants. A crateful of fresh organs. -The primal, nerve-slapping sex that nanites are having inside you. +The primal, nerve-slapping sex that nanites were having inside you. Calling a shuttle because I broke a toenail. Chunks of dead flyperson. Curse of the Barnyard. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 81c872cdd4..64778b8b6b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -828,3 +828,5 @@ This repository uses `LF` line endings for all code as specified in the **.gitat Unless overridden or a non standard git binary is used the line ending settings should be applied to your clone automatically. Note: VSC requires an [extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) to take advantage of editorconfig. + +Github actions that require additional configuration are disabled on the repository until ACTION_ENABLER secret is created with non-empty value. diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index fc2f436986..9943765d6f 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -9,36 +9,36 @@ jobs: name: "Compile changelogs" runs-on: ubuntu-20.04 steps: - - name: "Check for CHANGELOG_ENABLER secret and pass true to output if it exists to be checked by later steps" + - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" id: value_holder env: - CHANGELOG_ENABLER: ${{ secrets.CHANGELOG_ENABLER }} + ENABLER_SECRET: ${{ secrets.ACTION_ENABLER }} run: | unset SECRET_EXISTS - if [ -n $CHANGELOG_ENABLER ]; then SECRET_EXISTS='true' ; fi - echo ::set-output name=CL_ENABLED::${SECRET_EXISTS} + if [ -n $ENABLER_SECRET ]; then SECRET_EXISTS='true' ; fi + echo ::set-output name=ACTIONS_ENABLED::${SECRET_EXISTS} - name: "Setup python" - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/setup-python@v1 with: python-version: '3.x' - name: "Install deps" - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED run: | python -m pip install --upgrade pip python -m pip install pyyaml sudo apt-get install dos2unix - name: "Checkout" - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v1 with: fetch-depth: 25 - name: "Compile" - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED run: | python tools/ss13_genchangelog.py html/changelogs - name: Commit - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED run: | git config --local user.email "action@github.com" git config --local user.name "Changelogs" @@ -46,7 +46,7 @@ jobs: git add html/changelogs git commit -m "Automatic changelog compile [ci skip]" -a || true - name: "Push" - if: steps.value_holder.outputs.CL_ENABLED + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: ad-m/github-push-action@master with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/gbp.yml b/.github/workflows/gbp.yml index 454046068a..655f1241a1 100644 --- a/.github/workflows/gbp.yml +++ b/.github/workflows/gbp.yml @@ -6,13 +6,24 @@ jobs: gbp: runs-on: ubuntu-latest steps: + - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" + id: value_holder + env: + ENABLER_SECRET: ${{ secrets.ACTION_ENABLER }} + run: | + unset SECRET_EXISTS + if [ -n $ENABLER_SECRET ]; then SECRET_EXISTS='true' ; fi + echo ::set-output name=ACTIONS_ENABLED::${SECRET_EXISTS} - name: Checkout + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v2 - name: Setup git + if: steps.value_holder.outputs.ACTIONS_ENABLED run: | git config --global user.name "gbp-action" git config --global user.email "<>" - name: Checkout alternate branch + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v2 with: ref: "gbp-balances" # The branch name @@ -20,8 +31,10 @@ jobs: # This is to ensure we keep the gbp.toml from master # without having to update our separate branch. - name: Copy configuration + if: steps.value_holder.outputs.ACTIONS_ENABLED run: cp ./.github/gbp.toml ./gbp-balances/.github/gbp.toml - name: GBP action + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: tgstation/gbp-action@master with: branch: "gbp-balances" diff --git a/.github/workflows/gbp_collect.yml b/.github/workflows/gbp_collect.yml index 1f79f930fc..69701e546d 100644 --- a/.github/workflows/gbp_collect.yml +++ b/.github/workflows/gbp_collect.yml @@ -8,13 +8,24 @@ jobs: gbp_collection: runs-on: ubuntu-latest steps: + - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" + id: value_holder + env: + ENABLER_SECRET: ${{ secrets.ACTION_ENABLER }} + run: | + unset SECRET_EXISTS + if [ -n $ENABLER_SECRET ]; then SECRET_EXISTS='true' ; fi + echo ::set-output name=ACTIONS_ENABLED::${SECRET_EXISTS} - name: Checkout + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v2 - name: Setup git + if: steps.value_holder.outputs.ACTIONS_ENABLED run: | git config --global user.name "github-actions[bot]" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - name: Checkout alternate branch + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/checkout@v2 with: ref: "gbp-balances" # The branch name @@ -22,8 +33,10 @@ jobs: # This is to ensure we keep the gbp.toml from master # without having to update our separate branch. - name: Copy configuration + if: steps.value_holder.outputs.ACTIONS_ENABLED run: cp ./.github/gbp.toml ./gbp-balances/.github/gbp.toml - name: GBP action + if: steps.value_holder.outputs.ACTIONS_ENABLED uses: Mothblocks/gbp-action@collate-changes with: collect: "true" diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 41299db9a1..98f5b1d22a 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -4182,6 +4182,26 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/dark/corner, /area/engineering/atmos) +"aCt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "aCu" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/hangover, @@ -4394,6 +4414,22 @@ }, /turf/open/floor/iron/grimy, /area/hallway/secondary/service) +"aEM" = ( +/obj/machinery/light/directional/east, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "aEN" = ( /obj/effect/spawner/randomarcade{ dir = 1 @@ -5524,6 +5560,29 @@ }, /turf/open/floor/iron, /area/cargo/qm) +"aNy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "aNC" = ( /obj/effect/landmark/start/prisoner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -7824,13 +7883,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/cafeteria, /area/security/prison) -"bhD" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/science/misc_lab) "bhH" = ( /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/tile/blue{ @@ -8295,12 +8347,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ai_monitored/security/armory) -"bly" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "blB" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -11764,17 +11810,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/service/chapel/main) -"bLH" = ( -/obj/machinery/light/directional/north, -/obj/machinery/component_printer, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "bLU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -12218,6 +12253,13 @@ }, /turf/open/space, /area/space/nearstation) +"bNG" = ( +/obj/structure/sign/poster/official/build{ + pixel_y = -32 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/white, +/area/science/misc_lab) "bNM" = ( /obj/machinery/door/poddoor/preopen{ id = "justicechamber"; @@ -13447,6 +13489,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/grimy, /area/ai_monitored/turret_protected/aisat_interior) +"bTz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "bTB" = ( /obj/item/kirbyplants/random, /obj/machinery/turretid{ @@ -15385,6 +15443,10 @@ }, /turf/open/floor/iron, /area/hallway/primary/central/aft) +"ccN" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/science/misc_lab) "ccU" = ( /obj/effect/spawner/randomsnackvend, /obj/machinery/light/directional/west, @@ -18412,6 +18474,12 @@ }, /turf/open/space, /area/space/nearstation) +"crF" = ( +/obj/structure/table/reinforced, +/obj/item/screwdriver, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/iron, +/area/science/misc_lab) "crG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -19931,16 +19999,6 @@ }, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) -"cGu" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "cGJ" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Chapel Maintenance"; @@ -26213,77 +26271,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/science/genetics) -"djF" = ( -/turf/closed/wall/r_wall, -/area/science/nanite) -"djG" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"djH" = ( -/obj/machinery/nanite_programmer, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"djI" = ( -/obj/machinery/computer/nanite_chamber_control, -/obj/structure/sign/poster/random{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"djJ" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"djK" = ( -/turf/closed/wall, -/area/science/nanite) "djL" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -26695,57 +26682,6 @@ }, /turf/open/floor/iron/dark, /area/science/genetics) -"dlt" = ( -/obj/machinery/power/apc/auto_name/west, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dlu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dlv" = ( -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "dlz" = ( /obj/structure/sign/warning/nosmoking, /turf/closed/wall, @@ -26923,70 +26859,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/science/genetics) -"dmF" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/science/nanite) -"dmG" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dmH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dmI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dmJ" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "dmL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -27808,55 +27680,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/science/genetics) -"dqo" = ( -/obj/structure/table/reinforced, -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/nanite_scanner{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) -"dqr" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "dqu" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -28103,65 +27926,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/science/genetics) -"drM" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/disks_nanite{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/storage/box/disks_nanite{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/camera{ - c_tag = "Research Division - Nanite Lab"; - dir = 4; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) -"drN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"drO" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/loading_area, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "drP" = ( /turf/closed/wall/r_wall, /area/science/mixing) @@ -28518,22 +28282,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/tcommsat/server) -"dtg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "dti" = ( /obj/structure/closet/bombcloset, /obj/effect/turf_decal/stripes/line{ @@ -28840,57 +28588,6 @@ }, /turf/open/floor/carpet, /area/command/bridge) -"duz" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) -"duD" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) -"duE" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 8 - }, -/obj/structure/sign/poster/random{ - pixel_x = 32 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "duF" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -29129,6 +28826,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/science/mixing) +"dwo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "dwt" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -32805,6 +32508,13 @@ heat_capacity = 1e+006 }, /area/maintenance/port/aft) +"dMi" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/science/misc_lab) "dMt" = ( /obj/structure/closet/firecloset, /obj/machinery/light/small/directional/south, @@ -33789,23 +33499,6 @@ }, /turf/open/floor/iron, /area/medical/virology) -"dQV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/science/misc_lab) "dQW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34830,9 +34523,6 @@ /turf/open/floor/iron, /area/engineering/atmos) "dVY" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -34847,6 +34537,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "dVZ" = ( @@ -35060,23 +34753,13 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/hallway/secondary/exit/departure_lounge) +/turf/open/floor/iron/grimy, +/area/service/chapel/main) "dWU" = ( +/obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "dWV" = ( @@ -37287,12 +36970,6 @@ }, /turf/open/floor/iron, /area/commons/fitness/recreation) -"ehi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "ehq" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -38554,20 +38231,6 @@ }, /turf/open/floor/iron/dark, /area/science/xenobiology) -"eAB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/science/nanite) "eAI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -38955,12 +38618,6 @@ }, /turf/open/floor/iron/white, /area/medical/virology) -"eFU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/service/chapel/main) "eFX" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -40690,13 +40347,6 @@ }, /turf/open/floor/iron, /area/engineering/atmos/upper) -"faO" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "faY" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -41090,6 +40740,13 @@ }, /turf/open/floor/iron, /area/service/bar/atrium) +"ffG" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/south, +/turf/open/floor/iron/white, +/area/science/misc_lab) "ffH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -41708,6 +41365,22 @@ }, /turf/open/floor/iron/grimy, /area/service/theater/abandoned) +"foP" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/mmi, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "fph" = ( /turf/open/floor/engine/vacuum, /area/engineering/atmos/upper) @@ -42073,29 +41746,6 @@ }, /turf/open/floor/iron, /area/engineering/atmos/upper) -"fuF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Nanite Lab"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/nanite) "fuJ" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/structure/cable, @@ -42871,6 +42521,30 @@ }, /turf/open/floor/iron/dark, /area/engineering/storage/tech) +"fGC" = ( +/obj/machinery/door/airlock/research{ + name = "Research Testing Range"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "fGF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -44248,6 +43922,10 @@ }, /turf/open/floor/iron, /area/security/prison) +"geO" = ( +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/misc_lab) "geT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -44866,6 +44544,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/service/chapel/main) "goR" = ( @@ -44890,22 +44571,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/hallway/secondary/service) -"gpg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/door/window/brigdoor{ - dir = 4; - name = "Test Range" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "gpk" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/tile/red{ @@ -45162,12 +44827,6 @@ }, /turf/open/floor/engine/co2, /area/engineering/atmos) -"gsi" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/south, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/white, -/area/science/misc_lab) "gsn" = ( /obj/machinery/door/airlock/command{ name = "Chief Medical Officer's Office"; @@ -45403,6 +45062,16 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gve" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "gvf" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -46053,24 +45722,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/central/aft) -"gFZ" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "gGK" = ( /obj/machinery/modular_computer/console/preset/id{ dir = 8 @@ -47726,30 +47377,6 @@ }, /turf/open/floor/iron/white, /area/hallway/primary/central/aft) -"hgS" = ( -/obj/machinery/door/airlock/research{ - name = "Circuits Testing Lab"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "hgT" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48339,6 +47966,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/commons/dorms) +"hpL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/science/misc_lab) "hpM" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, @@ -48465,6 +48096,23 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/security/office) +"hrL" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "hrT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -50013,12 +49661,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/maintenance/port/fore) -"hOV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "hOZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -52002,22 +51644,6 @@ /obj/machinery/power/apc/auto_name/west, /turf/open/floor/iron, /area/cargo/sorting) -"imL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "imN" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -52111,6 +51737,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/command/gateway) +"iod" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera{ + c_tag = "Science - Experimentation Lab"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/iron, +/area/science/misc_lab) "iog" = ( /obj/item/clothing/suit/hazardvest{ desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; @@ -52871,6 +52507,10 @@ }, /turf/open/floor/iron/dark, /area/security/interrogation) +"iyK" = ( +/obj/effect/turf_decal/tile/purple, +/turf/closed/wall/r_wall, +/area/science/misc_lab) "iyX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53939,18 +53579,6 @@ /obj/machinery/power/apc/auto_name/east, /turf/open/floor/iron, /area/cargo/miningoffice) -"iNP" = ( -/obj/structure/sign/poster/official/build{ - pixel_y = -32 - }, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "iNS" = ( /obj/structure/chair/office{ dir = 4 @@ -54463,6 +54091,25 @@ }, /turf/open/floor/iron/white, /area/science/research) +"iTT" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/item/storage/toolbox/electrical{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "iUx" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -54861,6 +54508,22 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/command/heads_quarters/hos) +"jca" = ( +/obj/machinery/light/directional/east, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "jcj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -56804,6 +56467,10 @@ }, /turf/open/floor/iron/grimy, /area/command/heads_quarters/captain) +"jER" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/science/misc_lab) "jES" = ( /obj/structure/table/reinforced, /obj/item/folder/yellow, @@ -57053,19 +56720,6 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/command/bridge) -"jHZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "jId" = ( /obj/structure/table/wood, /obj/item/lipstick/random{ @@ -58108,17 +57762,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/wood, /area/command/meeting_room/council) -"jWm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/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, -/area/hallway/secondary/exit/departure_lounge) "jWo" = ( /obj/structure/cable, /turf/open/floor/iron{ @@ -59302,15 +58945,6 @@ }, /turf/open/floor/engine/n2, /area/engineering/atmos) -"kon" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "kot" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall, @@ -60241,6 +59875,20 @@ }, /turf/open/floor/iron, /area/engineering/break_room) +"kzS" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "kAa" = ( /obj/structure/table/wood/poker, /obj/item/storage/box/matches{ @@ -62030,6 +61678,10 @@ }, /turf/open/floor/iron, /area/service/bar/atrium) +"kYl" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/science/misc_lab) "kYo" = ( /obj/effect/turf_decal/bot, /obj/machinery/firealarm/directional/north, @@ -63854,6 +63506,29 @@ /obj/structure/reagent_dispensers/peppertank/directional/west, /turf/open/floor/iron/dark, /area/command/heads_quarters/hos) +"luI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Circuits Lab"; + req_access_txt = "47" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "lvk" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -63903,6 +63578,20 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"lvX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "lvY" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green, @@ -65220,6 +64909,22 @@ }, /turf/open/floor/iron, /area/cargo/office) +"lPk" = ( +/obj/machinery/camera{ + c_tag = "Science - Firing Range"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/structure/table/reinforced, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/ears/earmuffs, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/iron/white, +/area/science/misc_lab) "lPn" = ( /obj/structure/chair/comfy/brown{ buildstackamount = 0; @@ -66638,6 +66343,11 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"mhV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating, +/area/science/misc_lab) "mhX" = ( /obj/machinery/camera{ c_tag = "Art Gallery"; @@ -67657,6 +67367,12 @@ }, /turf/open/floor/wood, /area/commons/vacant_room/office) +"muj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 5 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "muI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -68497,6 +68213,9 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/service/library/abandoned) +"mHE" = ( +/turf/open/floor/engine, +/area/science/misc_lab) "mHH" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random, @@ -68870,21 +68589,6 @@ }, /turf/open/floor/iron, /area/commons/vacant_room/commissary) -"mLZ" = ( -/obj/structure/closet/crate, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/syndicate, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/science/misc_lab) "mMg" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green, @@ -69084,18 +68788,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/commons/toilet/restrooms) -"mPh" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/ears/earmuffs, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/white, -/area/science/misc_lab) "mPo" = ( /obj/machinery/research/explosive_compressor, /obj/effect/turf_decal/bot, @@ -70823,6 +70515,35 @@ }, /turf/open/floor/iron/dark, /area/command/heads_quarters/hos) +"nku" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera{ + c_tag = "Research Division - Circuits Lab"; + dir = 4; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/multitool{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/multitool{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "nkz" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp, @@ -72951,6 +72672,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/engineering/atmos/upper) +"nNa" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/science/misc_lab) "nNm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/filingcabinet/filingcabinet, @@ -73452,37 +73177,6 @@ /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) -"nTq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Genetics Lab"; - req_access_txt = "9" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "nTx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -73696,18 +73390,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/maintenance/port/fore) -"nUV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/multitool/circuit{ - pixel_x = 7 - }, -/obj/item/multitool/circuit, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "nUZ" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -75094,10 +74776,6 @@ }, /turf/open/floor/iron/white, /area/hallway/primary/central/aft) -"oly" = ( -/obj/machinery/modular_computer/console/preset/civilian, -/turf/open/floor/iron/white, -/area/science/misc_lab) "olC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -75416,6 +75094,24 @@ }, /turf/open/floor/iron/dark, /area/engineering/atmos) +"ooQ" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "ooT" = ( /obj/effect/spawner/randomsnackvend, /obj/effect/turf_decal/tile/red{ @@ -75471,6 +75167,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/cargo/sorting) +"ops" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/controller, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "opA" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -76064,7 +75776,9 @@ /turf/open/floor/iron, /area/cargo/warehouse) "oyj" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/iron/grimy, /area/service/chapel/main) "oyx" = ( @@ -76293,6 +76007,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/prison) +"oBr" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/science/misc_lab) "oBs" = ( /turf/closed/wall, /area/cargo/qm) @@ -76590,6 +76309,29 @@ }, /turf/open/floor/iron, /area/maintenance/starboard/fore) +"oFz" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/item/multitool/circuit{ + pixel_x = 7 + }, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/item/multitool/circuit, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "oFE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -77161,6 +76903,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "oLh" = ( @@ -78461,6 +78206,20 @@ }, /turf/open/floor/iron, /area/engineering/main) +"pbQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "pcq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -78884,6 +78643,21 @@ }, /turf/open/floor/iron, /area/hallway/secondary/command) +"pkr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/component_printer, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "pkx" = ( /obj/effect/turf_decal/tile/green, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80798,32 +80572,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/hallway/primary/port) -"pLc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "pLf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -81105,6 +80853,28 @@ }, /turf/open/floor/iron/dark/corner, /area/maintenance/disposal/incinerator) +"pPE" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "pPX" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/landmark/start/hangover, @@ -81252,6 +81022,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"pRL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "pRW" = ( /obj/machinery/computer/slot_machine, /obj/effect/decal/cleanable/dirt, @@ -82208,25 +81991,6 @@ }, /turf/open/floor/iron, /area/science/research) -"qdJ" = ( -/obj/machinery/nanite_programmer, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "qdO" = ( /obj/machinery/light/directional/south, /obj/structure/table/reinforced, @@ -83738,15 +83502,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/circuit/green, /area/engineering/main) -"qyo" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/misc_lab) "qyu" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -84418,10 +84173,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/hallway/secondary/entry) -"qGq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/science/misc_lab) "qGs" = ( /obj/machinery/light/directional/west, /obj/machinery/camera{ @@ -84698,6 +84449,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/engineering/main) +"qKy" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "qKC" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -85501,22 +85258,6 @@ }, /turf/open/floor/iron, /area/cargo/storage) -"qUc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "qUh" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -88539,18 +88280,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/science/research) -"rKf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/controller, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/item/compact_remote, -/obj/item/compact_remote, -/turf/open/floor/iron/white, -/area/science/misc_lab) "rKh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -88825,6 +88554,17 @@ dir = 1 }, /area/hallway/secondary/entry) +"rMT" = ( +/obj/structure/closet/crate, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/turf/open/floor/iron/white, +/area/science/misc_lab) "rMV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -88939,6 +88679,10 @@ }, /turf/open/floor/iron, /area/cargo/storage) +"rOQ" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/science/misc_lab) "rPb" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral{ @@ -89769,19 +89513,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/medical/medbay/central) -"saJ" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "saQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/virology{ @@ -90530,6 +90261,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/hallway/secondary/entry) +"sle" = ( +/obj/structure/sign/poster/random{ + pixel_x = 32 + }, +/turf/open/floor/engine, +/area/science/misc_lab) "slt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -92663,15 +92400,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/medical/virology) -"sKO" = ( -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/obj/structure/rack, -/obj/item/integrated_circuit/loaded/speech_relay, -/obj/item/integrated_circuit/loaded/hello_world, -/turf/open/floor/iron/white, -/area/science/misc_lab) "sKP" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -92989,6 +92717,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/maintenance/port/fore) +"sPX" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "sQk" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/yellow{ @@ -93163,6 +92905,12 @@ }, /turf/open/floor/iron, /area/maintenance/starboard/aft) +"sSW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "sTm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -93448,6 +93196,26 @@ }, /turf/open/floor/iron, /area/security/office) +"sWs" = ( +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/integrated_circuit/loaded/speech_relay, +/obj/item/integrated_circuit/loaded/hello_world, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "sWu" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -93545,6 +93313,21 @@ }, /turf/open/floor/iron, /area/cargo/miningoffice) +"sXf" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "sXh" = ( /obj/structure/transit_tube/horizontal, /obj/effect/turf_decal/tile/neutral{ @@ -95204,13 +94987,6 @@ }, /turf/open/floor/iron, /area/maintenance/starboard/fore) -"tuj" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "tuq" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/red{ @@ -96629,9 +96405,6 @@ /obj/machinery/door/airlock/grunge{ name = "Chapel Hall" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -96761,6 +96534,37 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"tNB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/research{ + name = "Genetics Lab"; + req_access_txt = "9" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "tNO" = ( /obj/structure/table/wood, /obj/item/taperecorder, @@ -98748,6 +98552,25 @@ }, /turf/open/floor/iron, /area/hallway/primary/central/fore) +"uqk" = ( +/obj/machinery/power/apc/auto_name/west, +/obj/structure/cable, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/item/compact_remote, +/obj/item/compact_remote, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "uqr" = ( /obj/structure/table/wood, /obj/item/newspaper{ @@ -99772,6 +99595,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/grimy, /area/command/heads_quarters/hos) +"uCC" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/obj/structure/rack, +/turf/open/floor/iron, +/area/science/misc_lab) "uCT" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -100226,6 +100056,21 @@ }, /turf/open/floor/iron, /area/command/heads_quarters/ce) +"uIy" = ( +/obj/effect/landmark/start/scientist, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "uID" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -100297,10 +100142,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) -"uJJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/science/misc_lab) "uJK" = ( /obj/machinery/button/crematorium{ id = "cremawheat"; @@ -100476,6 +100317,20 @@ heat_capacity = 1e+006 }, /area/commons/fitness/recreation) +"uMh" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Test Range" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/misc_lab) "uMi" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -101102,6 +100957,10 @@ }, /turf/open/floor/iron, /area/cargo/storage) +"uWD" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/science/misc_lab) "uWH" = ( /obj/structure/table/wood, /obj/item/storage/photo_album, @@ -101527,18 +101386,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/command/heads_quarters/captain) -"veb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "vec" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/tank_holder/emergency_oxygen, @@ -102381,6 +102228,21 @@ }, /turf/open/floor/iron, /area/cargo/miningoffice) +"voj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "voq" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/purple{ @@ -102842,20 +102704,6 @@ }, /turf/open/floor/iron, /area/service/hydroponics) -"vwU" = ( -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "vxa" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -103731,13 +103579,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, /turf/open/floor/iron, /area/engineering/supermatter/room) -"vJu" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Nanite Lab Maintenance"; - req_access_txt = "47" - }, -/turf/open/floor/plating, -/area/maintenance/port) "vJB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/morgue{ @@ -104632,6 +104473,13 @@ }, /turf/open/floor/iron, /area/cargo/sorting) +"vUT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Circuits Lab Maintenance"; + req_access_txt = "47" + }, +/turf/open/floor/plating, +/area/maintenance/port) "vVc" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -105167,28 +105015,6 @@ }, /turf/open/floor/carpet, /area/service/chapel/office) -"wbX" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high/plus{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/stock_parts/cell/high/plus, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Research Division - Circuits"; - dir = 4; - name = "science camera"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "wcg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/xeno_spawn, @@ -105674,23 +105500,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/aisat/exterior) -"wjF" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "wjG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -107410,6 +107219,9 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/aisat/exterior) +"wId" = ( +/turf/open/floor/plating, +/area/science/misc_lab) "wIn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -107624,6 +107436,11 @@ dir = 1 }, /area/engineering/atmos) +"wMH" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/turf/open/floor/iron, +/area/science/misc_lab) "wMU" = ( /obj/machinery/button/flasher{ id = "Cell 5"; @@ -108031,22 +107848,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/maintenance/starboard) -"wTa" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "wTb" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/tile/neutral{ @@ -108282,26 +108083,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/engineering/storage) -"wVN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "wWd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/effect/turf_decal/tile/yellow{ @@ -108521,6 +108302,23 @@ }, /turf/open/floor/iron, /area/maintenance/solars/port/aft) +"wZp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "wZs" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, @@ -109446,12 +109244,6 @@ }, /turf/open/floor/iron/dark, /area/service/library) -"xnL" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/grimy, -/area/service/chapel/main) "xnP" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -109480,28 +109272,6 @@ }, /turf/open/floor/iron, /area/service/hydroponics) -"xot" = ( -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "xox" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -109511,17 +109281,6 @@ }, /turf/open/floor/iron/dark/corner, /area/engineering/atmos) -"xoY" = ( -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/science/misc_lab) "xpb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -109789,6 +109548,14 @@ }, /turf/open/floor/iron/grimy, /area/service/chapel/office) +"xsp" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_one_access_txt = "12;47" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/science/misc_lab) "xsP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -110986,6 +110753,14 @@ }, /turf/open/floor/iron, /area/command/heads_quarters/rd) +"xKi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/misc_lab) "xKt" = ( /obj/structure/filingcabinet/employment, /obj/machinery/airalarm/directional/east, @@ -111035,9 +110810,6 @@ /obj/machinery/atmospherics/components/binary/thermomachine/freezer, /turf/open/floor/iron, /area/science/mixing) -"xLa" = ( -/turf/open/floor/iron/white, -/area/science/misc_lab) "xLd" = ( /obj/machinery/holopad, /obj/effect/turf_decal/tile/neutral{ @@ -112126,32 +111898,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/command) -"ybh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "ybi" = ( /turf/open/floor/iron/grimy, /area/command/heads_quarters/hos) @@ -112800,6 +112546,23 @@ }, /turf/open/floor/iron, /area/command/heads_quarters/cmo) +"ykV" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "ykY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ @@ -137533,11 +137296,11 @@ exk swm pfQ tCh +crF +rOQ +gSi map vGv -vGv -vGv -vGv lmF gSi dul @@ -137790,10 +137553,10 @@ ced wXQ moY tCh +iod +qKy +gSi mLI -xKO -xKO -xKO bfJ aST gSi @@ -138047,11 +137810,11 @@ cMY ceb moY tCh +wMH +nNa +gSi uRm -qGq -ehi -ehi -faO +xKO aST gSi dlg @@ -138304,11 +138067,11 @@ cMY cea kEw tCh +nNa +nNa +gSi mLI xKO -xKO -xKO -ehi mGu gSi dum @@ -138560,12 +138323,12 @@ dcb cMY cea laE -tCh -kon -qyo -qyo -qyo -jHZ +xsp +jER +muj +gSi +mLI +sSW aST gSi yjc @@ -138818,11 +138581,11 @@ cMY deX aiu tCh -nUV -saJ -wbX -mPh -gpg +nNa +dwo +gSi +gve +uMh nGU gSi dun @@ -139075,12 +138838,12 @@ cMY deX joJ tCh -oly -tuj -xLa -xLa -xoY -gsi +mhV +ccN +gSi +lPk +xKi +ffG gSi duo dmu @@ -139332,12 +139095,12 @@ cMY deY oAw tCh -bLH -bly -xLa -uJJ +wId +xKO +gSi +oBr ifR -veb +dMi gSi dup dlg @@ -139589,12 +139352,12 @@ cMY cjp hST tCh -cGu -hOV -hOV -hOV +wId +wId +gSi +kYl oox -iNP +bNG gSi duq dlh @@ -139846,11 +139609,11 @@ cMY deZ joJ tCh -sKO -rKf -bhD -mLZ -dQV +uCC +uWD +iyK +rMT +oox qhk gSi dur @@ -140107,7 +139870,7 @@ tCh tCh gSi sUT -hgS +fGC gSi gSi dus @@ -142673,16 +142436,16 @@ cNd cOM dgt cMY -djF -djF -djF -nTq -djF -djF -djF -djF -djF -djF +gSi +gSi +gSi +tNB +gSi +gSi +gSi +gSi +gSi +gSi cxO oFE caE @@ -142930,16 +142693,16 @@ ddR cNd cNd cMY -djG -dlt -dmG -ybh -dqo -drM -gFZ -duz -wTa -djF +foP +uqk +ops +aNy +oFz +iTT +nku +ooQ +ykV +gSi dzp pxk caE @@ -143187,16 +142950,16 @@ vHZ vHZ vHZ cMY -djH -dlu -dmH -pLc -drN -vwU -dtg -dtg -dtg -vJu +voj +sXf +kzS +aNy +pRL +uIy +bTz +bTz +bTz +vUT cxN wJa dBY @@ -143444,16 +143207,16 @@ cNd cON eAA cMY -djI -wjF -dmI -wVN -eAB -imL -drN -duD -qUc -djF +sWs +pRL +pbQ +aCt +lvX +wZp +mHE +geO +mHE +gSi dzo oks exk @@ -143701,16 +143464,16 @@ ddR cNd cNd cMY -djJ -dlv -dmJ -xot -dqr -drO -djJ -duE -qdJ -djF +pkr +jca +sPX +pPE +hrL +aEM +mHE +sle +mHE +gSi tbn cjq dBZ @@ -143958,16 +143721,16 @@ cNc cMY cMY dhU -djK -djK -dmF -fuF -dmF -djF -djF -djF -djF -djF +tCh +tCh +hpL +luI +hpL +gSi +gSi +gSi +gSi +gSi drP drP drP @@ -148614,7 +148377,7 @@ gKO dYu nlB noK -xnL +hPv oyj nqU rPJ @@ -148871,8 +148634,8 @@ vcI dSJ nlB yjE -eFU hPv +dWS lJI dTS iWi @@ -149386,8 +149149,8 @@ dST dTJ dUB dVl +dWU dVl -dWS tpS dVl dZn @@ -149644,7 +149407,7 @@ sCL vHW vHW oLg -jWm +gzW gzW gzW gzW @@ -149901,7 +149664,7 @@ dTE dUx dUx dVY -dWU +dUx dUx dUx dUx diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index da42c20b8a..8a59befed3 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -7972,20 +7972,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"aQx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/science/nanite) -"aQy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/science/nanite) "aQB" = ( /obj/structure/sign/warning/securearea{ pixel_x = 32 @@ -8090,6 +8076,16 @@ icon_state = "damaged2" }, /area/icemoon/surface/outdoors) +"aRs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/flora/rock/pile/icy{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "aRK" = ( /turf/open/floor/iron, /area/command/heads_quarters/ce) @@ -10264,6 +10260,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/science/lab) +"bia" = ( +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "bic" = ( /obj/item/radio/intercom/directional/north, /obj/structure/table/glass, @@ -17434,10 +17433,6 @@ }, /turf/open/floor/iron, /area/science/misc_lab) -"cbe" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "cbh" = ( /obj/structure/table, /obj/item/folder/white, @@ -21372,6 +21367,12 @@ /obj/item/reagent_containers/food/drinks/flask/gold, /turf/open/floor/carpet, /area/command/heads_quarters/captain) +"dky" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "dkZ" = ( /obj/machinery/light/small/directional/west, /mob/living/simple_animal/mouse/brown/tom, @@ -21911,12 +21912,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/service/kitchen) -"dFk" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/science/nanite) "dFo" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 @@ -22504,7 +22499,6 @@ dir = 8 }, /obj/structure/table, -/obj/item/stamp/qm, /obj/item/pen/red, /obj/item/pen{ pixel_x = 4; @@ -22590,9 +22584,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/surface/outdoors) -"dYq" = ( -/turf/closed/wall, -/area/science/nanite) "dYC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -22922,13 +22913,6 @@ }, /turf/open/floor/iron, /area/commons/dorms) -"eja" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/nanite_chamber_control{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "ejg" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -23153,12 +23137,6 @@ }, /turf/open/floor/iron/dark, /area/medical/virology) -"epI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/nanite) "epN" = ( /obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ dir = 4 @@ -23244,6 +23222,10 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/security/processing) +"esv" = ( +/obj/machinery/module_duplicator, +/turf/open/floor/iron, +/area/science/misc_lab) "esy" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -23467,6 +23449,12 @@ }, /turf/open/floor/iron, /area/engineering/main) +"eAd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "eAh" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/light/directional/east, @@ -23644,6 +23632,15 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/maintenance/port/fore) +"eGA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "eGU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -24105,6 +24102,13 @@ /obj/machinery/light/small/directional/east, /turf/open/openspace/icemoon, /area/security/execution/transfer) +"eXz" = ( +/obj/effect/turf_decal/bot, +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "eXP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -24260,6 +24264,10 @@ "fbm" = ( /turf/open/floor/iron, /area/command/heads_quarters/rd) +"fbx" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/science/research) "fbH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -24290,6 +24298,12 @@ }, /turf/open/floor/plating, /area/engineering/storage/tech) +"fcy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "fdf" = ( /obj/machinery/power/apc/auto_name/west, /obj/machinery/camera{ @@ -24765,6 +24779,17 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat/maint) +"frS" = ( +/obj/structure/table, +/obj/machinery/requests_console/directional/east{ + department = "Circuits Lab"; + departmentType = 2; + name = "Circuits Lab Requests Console"; + receive_ore_updates = 1 + }, +/obj/item/clothing/shoes/wheelys/skishoes, +/turf/open/floor/iron/dark, +/area/science/research) "frW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -26432,15 +26457,6 @@ "gnP" = ( /turf/closed/wall, /area/cargo/storage) -"gnX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/chair/office/light{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/nanite) "gor" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26699,12 +26715,6 @@ }, /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) -"gwd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "gxp" = ( /obj/machinery/light_switch/directional/north, /obj/structure/cable, @@ -27030,6 +27040,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/commons/fitness) +"gHf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/statue/snow/snowman{ + pixel_x = 6 + }, +/obj/item/toy/snowball{ + pixel_x = 16; + pixel_y = 4 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "gHj" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -27183,12 +27206,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/plating, /area/security/prison/safe) -"gLd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "gLf" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -27472,6 +27489,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/science/robotics/lab) +"gTG" = ( +/obj/structure/statue/snow/snowman, +/obj/item/toy/snowball{ + pixel_x = -10; + pixel_y = 4 + }, +/obj/item/food/snowcones/pwrgame{ + pixel_x = 12 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "gTH" = ( /obj/structure/rack, /obj/item/clothing/shoes/magboots, @@ -28146,6 +28174,11 @@ }, /turf/open/floor/iron/freezer, /area/maintenance/starboard/fore) +"hrr" = ( +/obj/structure/table, +/obj/item/food/grown/carrot, +/turf/open/floor/iron/dark, +/area/science/research) "hrF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -28458,11 +28491,6 @@ }, /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) -"hAK" = ( -/obj/structure/table, -/obj/item/storage/box/disks_nanite, -/turf/open/floor/iron/dark, -/area/science/nanite) "hBg" = ( /obj/effect/turf_decal/delivery, /obj/structure/disposalpipe/segment, @@ -29335,9 +29363,6 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/engineering/atmos) -"hZk" = ( -/turf/open/floor/iron, -/area/science/nanite) "hZo" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, @@ -29404,11 +29429,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white, /area/science/mixing) -"ibG" = ( -/obj/machinery/nanite_programmer, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "ibP" = ( /obj/machinery/door/airlock/external{ name = "External Access"; @@ -29439,10 +29459,6 @@ }, /turf/open/floor/engine, /area/engineering/supermatter/room) -"icS" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/science/nanite) "icU" = ( /obj/machinery/status_display/evac/directional/east, /obj/effect/turf_decal/tile/red{ @@ -29714,6 +29730,11 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/dark, /area/hallway/primary/aft) +"ini" = ( +/obj/effect/turf_decal/loading_area, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/science/research) "ink" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -30025,6 +30046,10 @@ "iwd" = ( /turf/open/floor/carpet, /area/service/chapel/main) +"iwz" = ( +/obj/structure/flora/tree/dead, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "iwH" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -31291,6 +31316,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/engineering/atmos) +"jiO" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "rnd2"; + name = "research lab shutters" + }, +/turf/open/floor/plating, +/area/science/research) "jjv" = ( /turf/open/floor/iron/freezer, /area/commons/toilet/locker) @@ -32943,6 +32976,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/cargo/storage) +"kfx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "kfV" = ( /obj/structure/sink/kitchen{ pixel_y = 28 @@ -34140,6 +34179,10 @@ }, /turf/open/floor/iron, /area/commons/dorms) +"kPz" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "kPF" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -34459,6 +34502,11 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/command/heads_quarters/hos) +"kYW" = ( +/obj/structure/table, +/obj/item/clothing/shoes/wheelys/skishoes, +/turf/open/floor/iron/dark, +/area/science/research) "kZi" = ( /obj/machinery/air_sensor/atmos/nitrogen_tank, /turf/open/floor/engine/n2, @@ -35750,13 +35798,6 @@ }, /turf/open/floor/plating, /area/engineering/atmos) -"lLp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/science/nanite) "lLw" = ( /obj/effect/landmark/blobstart, /obj/effect/landmark/blobstart, @@ -35937,16 +35978,6 @@ }, /turf/open/floor/iron, /area/cargo/sorting) -"lQm" = ( -/obj/machinery/camera{ - c_tag = "Nanite Lab"; - dir = 4; - network = list("ss13","rd") - }, -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "lQz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -37322,15 +37353,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"mBm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "mBy" = ( /obj/structure/urinal/directional/north, /turf/open/floor/iron/freezer, @@ -37492,6 +37514,14 @@ /obj/structure/cable, /turf/open/floor/iron, /area/hallway/primary/starboard) +"mFt" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/bot, +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "mFv" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -37537,14 +37567,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/command/nuke_storage) -"mGC" = ( -/obj/machinery/power/apc/auto_name/west, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/science/nanite) "mGX" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -38417,12 +38439,6 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/cargo/miningdock) -"nee" = ( -/obj/machinery/light/directional/south, -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "nes" = ( /obj/machinery/light/directional/east, /obj/item/radio/intercom/directional/east, @@ -38549,11 +38565,6 @@ /obj/item/book/manual/wiki/security_space_law, /turf/open/floor/iron, /area/security/office) -"nhP" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) "nhQ" = ( /turf/open/floor/carpet, /area/service/library) @@ -41297,12 +41308,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/commons/storage/tools) -"oMN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/science/nanite) "oMZ" = ( /obj/item/radio/intercom/directional/south, /obj/effect/landmark/event_spawn, @@ -41879,6 +41884,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/command/teleporter) +"peS" = ( +/obj/effect/turf_decal/bot, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/research) "pfQ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/button/crematorium{ @@ -42222,6 +42235,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/security/office) +"pnZ" = ( +/obj/machinery/power/apc/auto_name/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/science/research) +"poa" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/science/research) "ppl" = ( /obj/effect/landmark/xeno_spawn, /obj/structure/cable, @@ -42821,11 +42847,6 @@ }, /turf/open/floor/iron/white, /area/medical/virology) -"pDu" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "pEc" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/blue{ @@ -42916,6 +42937,10 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/cargo/office) +"pFJ" = ( +/obj/structure/flora/grass/brown, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "pFO" = ( /obj/machinery/camera{ c_tag = "Holodeck - Fore"; @@ -43252,6 +43277,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/service/library) +"pOq" = ( +/obj/machinery/camera{ + c_tag = "Circuits Lab"; + dir = 4; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/bot, +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "pOt" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -43887,15 +43924,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) -"qea" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "qek" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/blue, @@ -43944,15 +43972,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/command/heads_quarters/captain) -"qeQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "qfA" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -44670,12 +44689,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay) -"qGG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/nanite) "qGO" = ( /obj/structure/window/reinforced{ dir = 8 @@ -45444,6 +45457,15 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"rcN" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/bot, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/science/research) "ren" = ( /obj/machinery/light_switch/directional/west, /obj/machinery/autolathe, @@ -46635,14 +46657,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/white, /area/medical/medbay/lobby) -"rIN" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/bot, -/obj/machinery/computer/nanite_chamber_control{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "rIW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -46839,6 +46853,15 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/wood, /area/commons/vacant_room/office) +"rOb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "rOc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47102,6 +47125,10 @@ dir = 9 }, /area/science/research) +"rXF" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron/dark, +/area/science/research) "rXH" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/red, @@ -47516,10 +47543,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/circuit, /area/ai_monitored/command/nuke_storage) -"sjr" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron/dark, -/area/science/nanite) "sjv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 5 @@ -47925,13 +47948,6 @@ }, /turf/open/floor/plating, /area/security/office) -"suU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/science/nanite) "suY" = ( /obj/machinery/vending/cigarette, /turf/open/floor/wood, @@ -48202,12 +48218,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) -"sDW" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "sEt" = ( /obj/machinery/power/rad_collector/anchored, /obj/structure/window/plasma/reinforced{ @@ -48816,6 +48826,12 @@ }, /turf/open/floor/iron/white, /area/science/xenobiology) +"sVf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "sVk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -49187,16 +49203,6 @@ }, /turf/open/floor/iron, /area/science/xenobiology) -"tgl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron, -/area/science/nanite) "tgF" = ( /obj/structure/table, /obj/item/wrench, @@ -50491,17 +50497,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/security/warden) -"tTk" = ( -/obj/structure/table, -/obj/item/nanite_remote, -/obj/machinery/requests_console/directional/east{ - department = "Nanite Lab"; - departmentType = 2; - name = "Nanite Lab Requests Console"; - receive_ore_updates = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "tTm" = ( /obj/structure/chair{ dir = 8 @@ -51124,6 +51119,14 @@ }, /turf/open/floor/carpet, /area/command/heads_quarters/captain) +"uji" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/airalarm/directional/south, +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "ujx" = ( /obj/structure/cable, /obj/structure/sign/poster/random{ @@ -51845,12 +51848,6 @@ }, /turf/open/floor/iron/cafeteria, /area/command/heads_quarters/rd) -"uzl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/science/nanite) "uzt" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/mug/coco{ @@ -51870,7 +51867,6 @@ pixel_x = -3; pixel_y = 7 }, -/obj/item/stamp/qm, /obj/effect/turf_decal/tile/brown{ dir = 1 }, @@ -51943,6 +51939,15 @@ /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, /area/engineering/main) +"uBX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "uBY" = ( /obj/machinery/power/apc/auto_name/north, /obj/structure/cable, @@ -53721,9 +53726,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/security/brig) -"vHt" = ( -/turf/open/floor/iron, -/area/science/misc_lab) "vHw" = ( /obj/machinery/door/airlock/security/glass{ name = "Equipment Room"; @@ -53758,6 +53760,16 @@ }, /turf/open/floor/iron/dark, /area/command/gateway) +"vIe" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "vIi" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/red{ @@ -53780,6 +53792,10 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/service/hydroponics) +"vKo" = ( +/obj/structure/flora/grass/green, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "vKs" = ( /obj/machinery/modular_computer/console/preset/civilian{ dir = 4 @@ -54731,14 +54747,6 @@ /obj/item/assembly/timer, /turf/open/floor/iron, /area/security/office) -"wkN" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rnd2"; - name = "research lab shutters" - }, -/turf/open/floor/plating, -/area/science/nanite) "wld" = ( /turf/open/floor/iron, /area/commons/fitness) @@ -54832,6 +54840,7 @@ "wnf" = ( /obj/structure/table, /obj/structure/cable, +/obj/item/stamp/qm, /turf/open/floor/carpet, /area/cargo/qm) "wnj" = ( @@ -54912,11 +54921,6 @@ /obj/item/trash/cheesie, /turf/open/floor/plating, /area/maintenance/port) -"wpH" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/science/nanite) "wpS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/securearea{ @@ -54950,11 +54954,6 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/commons/storage/emergency/port) -"wqH" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "wqZ" = ( /obj/machinery/field/generator, /turf/open/floor/plating, @@ -55580,6 +55579,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/science/mixing) +"wMX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/stack/sheet/mineral/snow{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "wNj" = ( /obj/structure/sign/warning/securearea{ pixel_x = -32 @@ -56213,6 +56222,14 @@ }, /turf/open/floor/iron/white, /area/science/genetics) +"xeS" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/bot, +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "xfb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56365,6 +56382,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/starboard/aft) +"xje" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/flora/grass/both{ + pixel_x = -4; + pixel_y = -4 + }, +/turf/open/floor/plating/asteroid/snow/standard_air, +/area/science/research) "xju" = ( /obj/structure/chair/office{ dir = 1 @@ -57191,11 +57218,6 @@ }, /turf/open/floor/iron, /area/commons/storage/primary) -"xEM" = ( -/obj/structure/table, -/obj/item/nanite_scanner, -/turf/open/floor/iron/dark, -/area/science/nanite) "xFn" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -58243,16 +58265,6 @@ /obj/machinery/power/apc/auto_name/east, /turf/open/floor/iron/white, /area/medical/medbay/lobby) -"yiW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "yjo" = ( /obj/machinery/camera{ c_tag = "Chapel South"; @@ -105036,13 +105048,13 @@ boB qaX jrH sve -dYq -dYq -dYq -wkN -wkN -wkN -dYq +bhA +bhA +bhA +jiO +jiO +jiO +bhA bhA xtW ovK @@ -105064,7 +105076,7 @@ bPN uOi cba gZY -vHt +esv bQZ nlW xIk @@ -105293,13 +105305,13 @@ iEK bpZ uIv bta -mGC -nhP -sDW -eja -hAK -ibG -lQm +pnZ +ini +xeS +peS +hrr +eXz +pOq bEC bEC bGc @@ -105550,13 +105562,13 @@ bng boQ brx bro -aQx -suU -qeQ -tgl -qGG -oMN -wpH +uBX +kfx +dky +dky +gHf +aRs +poa bEC umY uej @@ -105807,13 +105819,13 @@ boA bpZ bqf bBD -gLd -qea -hZk -hZk -hZk -icS -nee +sVf +eGA +pFJ +bia +bia +kPz +mFt pLE nCs gLx @@ -106064,13 +106076,13 @@ bnk bpo bqk bBD -gLd -gwd -hZk -hZk -hZk -icS -dFk +sVf +eAd +iwz +gTG +vKo +kPz +uji pLE ont eeA @@ -106321,13 +106333,13 @@ biW bpZ bth brn -aQy -lLp -mBm -gnX -epI -uzl -cbe +rOb +xje +fcy +fcy +fcy +wMX +fbx pLE kdp dFZ @@ -106578,13 +106590,13 @@ bnl bpq vdl kXt -yiW -sjr -wqH -rIN -xEM -tTk -pDu +vIe +rXF +eXz +rcN +kYW +frS +eXz pLE tZf mqf @@ -106840,8 +106852,8 @@ bpE bpE bpE bpE -dYq -dYq +boB +boB pLE qSi sql diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 623f8b2fd9..c80ee5f72e 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -5023,6 +5023,15 @@ icon_state = "platingdmg1" }, /area/maintenance/starboard/fore) +"aow" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/machinery/bounty_board/directional/north, +/turf/open/floor/iron/dark, +/area/science/research) "aox" = ( /turf/closed/wall, /area/maintenance/central) @@ -5780,6 +5789,11 @@ /obj/machinery/power/apc/auto_name/north, /turf/open/floor/carpet, /area/medical/psychology) +"aqQ" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/sheet/glass, +/turf/open/floor/plating/airless, +/area/space/nearstation) "aqR" = ( /obj/machinery/door/airlock/maintenance{ name = "morgue maintenance"; @@ -11572,6 +11586,9 @@ /obj/structure/cable, /turf/open/floor/iron, /area/hallway/primary/fore) +"aNt" = ( +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "aNu" = ( /turf/closed/wall, /area/medical/morgue) @@ -15445,15 +15462,6 @@ /obj/structure/tank_dispenser, /turf/open/floor/iron/dark, /area/science/mixing) -"aXE" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) "aXH" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -15603,23 +15611,6 @@ "aXW" = ( /turf/closed/wall/rust, /area/maintenance/starboard/fore) -"aXX" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) "aXY" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -15866,21 +15857,6 @@ icon_state = "panelscorched" }, /area/maintenance/central) -"aYN" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/research) "aYO" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ @@ -15904,58 +15880,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/science/research) -"aYR" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) -"aYS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) -"aYT" = ( -/obj/machinery/nanite_programmer, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) -"aYU" = ( -/obj/machinery/nanite_program_hub, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/research) "aYY" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -16167,21 +16091,6 @@ dir = 1 }, /area/hallway/primary/fore) -"aZt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/science/research) "aZu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -16482,23 +16391,6 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/medical/medbay/central) -"aZX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/nanite_chamber_control{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) "aZZ" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -16989,17 +16881,6 @@ "bbi" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) -"bbj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/storage/box/disks_nanite{ - pixel_y = 4 - }, -/obj/item/hand_labeler, -/turf/open/floor/iron/dark, -/area/science/research) "bbk" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -17162,17 +17043,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/hallway/primary/starboard) -"bbJ" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) "bbK" = ( /obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, /obj/effect/mapping_helpers/airlock/locked, @@ -17181,17 +17051,6 @@ }, /turf/open/floor/engine, /area/science/mixing/chamber) -"bbL" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/research) "bbN" = ( /turf/closed/wall, /area/science/mixing) @@ -18182,23 +18041,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/science/research) -"beE" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/dark, -/area/science/research) "beI" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/effect/turf_decal/bot, @@ -31610,6 +31452,37 @@ }, /turf/open/floor/plating, /area/security/prison) +"cfs" = ( +/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, +/obj/structure/sign/warning/xeno_mining{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) "cft" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -37018,25 +36891,6 @@ icon_state = "platingdmg3" }, /area/maintenance/port/aft) -"cxk" = ( -/obj/machinery/power/solar_control{ - dir = 4; - id = "aftport"; - name = "Port Quarter Solar Control" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/solars/port/aft) "cxl" = ( /obj/structure/sign/warning/nosmoking{ pixel_x = 30 @@ -37804,6 +37658,14 @@ /obj/machinery/power/apc/auto_name/west, /turf/open/floor/iron/dark, /area/security/processing) +"czz" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "czA" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -41007,24 +40869,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/engineering/supermatter/room) -"cYO" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/showroomfloor, -/area/command/heads_quarters/rd) "cYR" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -41497,6 +41341,22 @@ /obj/structure/cable, /turf/open/floor/plating, /area/command/heads_quarters/hos) +"dkL" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera{ + c_tag = "Toxins Launch Site"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/dark, +/area/science/test_area) "dkX" = ( /obj/structure/sign/poster/contraband/random, /turf/closed/wall/rust, @@ -42006,18 +41866,6 @@ /obj/effect/landmark/start/bartender, /turf/open/floor/wood, /area/service/bar) -"dyq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/rebels_unite{ - pixel_x = -32; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "dyu" = ( /obj/structure/flora/grass/jungle{ icon_state = "bushb1" @@ -42898,6 +42746,24 @@ dir = 1 }, /area/service/chapel/main) +"dWe" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/solars/port/aft) "dWo" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -43812,6 +43678,23 @@ }, /turf/open/floor/engine, /area/engineering/supermatter) +"erH" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/research_director, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "erO" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -44832,6 +44715,24 @@ /obj/effect/landmark/start/cook, /turf/open/floor/iron/showroomfloor, /area/service/kitchen) +"eML" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Research Hallway"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/research) "eNm" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -46440,6 +46341,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) +"fxL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_x = -32; + pixel_y = -32 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/item/toy/plush/plasmamanplushie{ + name = "Dianion XV" + }, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) "fyi" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -47499,19 +47417,6 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/engineering/break_room) -"fRy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/computer/rdconsole{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/command/heads_quarters/rd) "fSn" = ( /turf/closed/wall/r_wall/rust, /area/medical/psychology) @@ -48945,6 +48850,27 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/service/library) +"gCO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) +"gCQ" = ( +/obj/machinery/computer/robotics{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/command/heads_quarters/rd) "gDl" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -49292,6 +49218,11 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/service/chapel/main) +"gOl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) "gOw" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, @@ -49986,22 +49917,6 @@ luminosity = 2 }, /area/engineering/storage/tech) -"hdL" = ( -/obj/structure/chair/office/light, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/showroomfloor, -/area/command/heads_quarters/rd) "hdT" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -50274,6 +50189,16 @@ /obj/structure/sign/departments/custodian, /turf/closed/wall/rust, /area/service/janitor) +"hiG" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/research_director, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "hjs" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -50490,27 +50415,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/engine, /area/engineering/supermatter/room) -"hop" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/clipboard, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/nanite_scanner{ - pixel_x = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/dark, -/area/science/research) "hoE" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -50641,6 +50545,11 @@ }, /turf/open/floor/iron/dark, /area/science/xenobiology) +"hsn" = ( +/obj/effect/turf_decal/box, +/obj/structure/cable, +/turf/open/floor/iron/solarpanel/airless, +/area/solars/starboard/aft) "hsu" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/closed/wall/rust, @@ -50753,6 +50662,22 @@ /obj/machinery/bounty_board/directional/north, /turf/open/floor/iron/dark, /area/medical/storage) +"hwx" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/mug/coco, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "hwB" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -52927,6 +52852,12 @@ }, /turf/open/floor/iron/dark, /area/security/office) +"ivb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "ivj" = ( /obj/structure/sign/warning/electricshock, /turf/closed/wall/r_wall, @@ -54388,6 +54319,19 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/engineering/atmos) +"iYZ" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/kirbyplants/potty, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "iZc" = ( /obj/structure/chair/sofa{ color = "#c45c57" @@ -54438,6 +54382,20 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/starboard) +"jaC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/computer/rdconsole{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/command/heads_quarters/rd) "jaD" = ( /obj/effect/turf_decal/delivery, /obj/machinery/space_heater, @@ -56137,21 +56095,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/engineering/supermatter/room) -"jPh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/solars/starboard/aft) "jPk" = ( /obj/structure/table/glass, /obj/item/storage/box/rxglasses{ @@ -58068,27 +58011,6 @@ }, /turf/open/floor/engine, /area/engineering/supermatter/room) -"kzj" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/nanite_chamber_control, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Nanite Lab"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/dark, -/area/science/research) "kzk" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/decal/cleanable/dirt, @@ -60737,6 +60659,23 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/command/heads_quarters/hop) +"lGH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/item/toy/plush/plasmamanplushie{ + name = "Lithium II" + }, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) "lGO" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -64215,6 +64154,16 @@ icon_state = "panelscorched" }, /area/maintenance/disposal/incinerator) +"njW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/science/research) "nlh" = ( /obj/structure/frame/machine, /obj/effect/turf_decal/stripes/line{ @@ -65368,20 +65317,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/dark, /area/cargo/warehouse) -"nOe" = ( -/obj/machinery/computer/aifixer{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/command/heads_quarters/rd) "nOQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -65529,6 +65464,18 @@ }, /turf/open/floor/engine, /area/engineering/storage/tech) +"nRi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_x = -32; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) "nRr" = ( /obj/machinery/power/solar{ id = "aftstarboard"; @@ -68686,6 +68633,26 @@ icon_state = "platingdmg1" }, /area/maintenance/disposal/incinerator) +"pid" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/computer/shuttle/mining/common, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/commons/fitness/recreation) "pie" = ( /obj/machinery/power/port_gen/pacman, /obj/structure/sign/warning/electricshock{ @@ -69070,11 +69037,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) -"pqf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "pqg" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -72052,23 +72014,6 @@ /obj/machinery/vending/drugs, /turf/open/floor/iron/showroomfloor, /area/medical/surgery) -"qBh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/rebels_unite{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/item/toy/plush/plasmamanplushie{ - name = "Lithium II" - }, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "qCn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -72842,6 +72787,18 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"qRl" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/dark, +/area/science/research) "qRs" = ( /obj/effect/turf_decal/bot, /obj/machinery/conveyor{ @@ -73449,6 +73406,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) +"rhC" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/sheet/glass, +/turf/open/space/basic, +/area/solars/port/aft) "rhG" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral{ @@ -74201,6 +74163,20 @@ dir = 4 }, /area/service/chapel/main) +"rvF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/research) "rwo" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -74978,6 +74954,26 @@ "rPt" = ( /turf/closed/wall/r_wall/rust, /area/command/heads_quarters/captain) +"rPu" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/showroomfloor, +/area/command/heads_quarters/rd) "rQj" = ( /obj/effect/turf_decal/arrows/white{ dir = 4 @@ -75977,27 +75973,6 @@ icon_state = "platingdmg3" }, /area/maintenance/port/aft) -"smq" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 10 - }, -/obj/effect/landmark/start/research_director, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/showroomfloor, -/area/command/heads_quarters/rd) "sns" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -79426,6 +79401,21 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"tNe" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 9 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/research/explosive_compressor, +/turf/open/floor/iron/showroomfloor, +/area/science/test_area) "tNt" = ( /turf/open/floor/plating, /area/maintenance/disposal/incinerator) @@ -79579,19 +79569,6 @@ }, /turf/open/floor/iron, /area/engineering/break_room) -"tOW" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 10 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/showroomfloor, -/area/command/heads_quarters/rd) "tPt" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/wood, @@ -79924,20 +79901,6 @@ /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, /area/service/chapel/main) -"tWx" = ( -/obj/machinery/computer/robotics{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/command/heads_quarters/rd) "tXc" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -80451,22 +80414,6 @@ /obj/machinery/light/floor, /turf/open/floor/engine/vacuum, /area/engineering/atmos) -"uhS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera{ - c_tag = "Toxins Launch Site"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/research/explosive_compressor, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/science/test_area) "uij" = ( /obj/machinery/door/poddoor/preopen{ id = "gravity"; @@ -81348,15 +81295,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/cargo/warehouse) -"uBq" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor, -/area/command/heads_quarters/rd) "uBS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -82441,6 +82379,21 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/aft) +"vbD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/plasmaman/belt/full, +/obj/structure/table, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_x = 32; + pixel_y = -32 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/item/flashlight/lamp, +/turf/open/floor/plating/plasma/rust, +/area/maintenance/space_hut/plasmaman) "vbO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -83271,22 +83224,6 @@ }, /turf/open/floor/iron/dark, /area/science/mixing) -"vse" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/folder, -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote, -/obj/machinery/light/directional/east, -/obj/machinery/bounty_board/directional/north, -/turf/open/floor/iron/dark, -/area/science/research) "vsF" = ( /obj/machinery/light/directional/north, /obj/effect/spawner/structure/window/hollow/reinforced/middle{ @@ -83614,13 +83551,6 @@ dir = 1 }, /area/maintenance/aft) -"vzj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "vzr" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -83678,41 +83608,6 @@ }, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) -"vAo" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 9 - }, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/assembly/signaler{ - desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/assembly/signaler{ - desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/assembly/signaler{ - desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted."; - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/science/test_area) "vAx" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -85130,21 +85025,6 @@ }, /turf/open/floor/iron/dark, /area/commons/storage/primary) -"wiR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/structure/table, -/obj/structure/sign/poster/contraband/rebels_unite{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/item/flashlight/lamp, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "wje" = ( /obj/structure/table/glass, /obj/machinery/computer/med_data/laptop, @@ -85487,6 +85367,12 @@ icon_state = "platingdmg1" }, /area/security/office) +"woi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/research) "woB" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "ceprivate"; @@ -85508,6 +85394,14 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/showroomfloor, /area/medical/medbay/central) +"woH" = ( +/mob/living/simple_animal/hostile/carp{ + environment_smash = 0; + name = "Tuna"; + real_name = "Tuna" + }, +/turf/open/floor/plating/asteroid/airless, +/area/space/nearstation) "woL" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -87076,26 +86970,6 @@ }, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) -"wYW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/computer/shuttle/mining/common, -/turf/open/floor/iron, -/area/commons/fitness/recreation) "wZx" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/sand/plating, @@ -87429,6 +87303,10 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/science/test_area) +"xfU" = ( +/obj/item/circuitboard/computer/solar_control, +/turf/open/floor/plating/asteroid/airless, +/area/space/nearstation) "xgo" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -87782,6 +87660,20 @@ }, /turf/open/floor/iron/dark, /area/engineering/atmos) +"xoq" = ( +/obj/machinery/computer/aifixer{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/command/heads_quarters/rd) "xoK" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/delivery, @@ -89337,23 +89229,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/command/heads_quarters/ce) -"xUP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/rebels_unite{ - pixel_x = -32; - pixel_y = -32 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/item/toy/plush/plasmamanplushie{ - name = "Dianion XV" - }, -/turf/open/floor/plating/rust/plasma, -/area/maintenance/space_hut/plasmaman) "xUW" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -89490,6 +89365,18 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/service/bar) +"xYR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/science/research) "xZt" = ( /obj/structure/chair/stool/directional/north, /obj/structure/cable, @@ -102324,7 +102211,7 @@ tnI oUy aau aeU -cmU +aqQ jOe jOe jOe @@ -102840,7 +102727,7 @@ asO cmU cmU foo -foo +rhC foo foo foo @@ -104315,7 +104202,7 @@ aeu aeU aeU coy -aeU +woH aDS nBm bFI @@ -104640,7 +104527,7 @@ acK cmU aeU aUz -aeU +xfU aeU cnS cuU @@ -105415,7 +105302,7 @@ vIb cnO kuW cuZ -cxk +dWe cnN aeu aeU @@ -107692,7 +107579,7 @@ wrV wrV wrV ich -wYW +pid ney vqR qlh @@ -127970,12 +127857,12 @@ ifJ rYN aWW aZv -vse -aXE +aow +aXI +aXI aXI -aYR beD -bbj +woi aOi bep aZi @@ -128228,10 +128115,10 @@ iOj vlS rJG rJG -kzj -aXX -aYS -aZt +eML +xYR +xYR +rvF bbl aOi cmg @@ -128486,10 +128373,10 @@ ltR mjr vlS vlS -aYN -aYT -aYS -bbJ +vlS +vlS +njW +bbl aOo bgj aYe @@ -128741,11 +128628,11 @@ aww wtC uNr lov -nOe -vlS +iYZ +hwx +xoq vlS -aYU -beE +njW bbl aOi aRp @@ -128998,12 +128885,12 @@ aWU iOj hea hRI -cYO -tWx +aNt +hiG +gCQ vlS -vlS -aZX -bbL +njW +bbl aOi bep baU @@ -129255,12 +129142,12 @@ baJ iOj pvu xsN -uBq -hdL +ivb +czz eSG vlS rJG -hop +qRl aOr aRB aSJ @@ -129511,8 +129398,8 @@ fsn bcH iOj tGO -smq -tOW +rPu +erH dPy fPK qOj @@ -129770,7 +129657,7 @@ iOj iOj pgF swx -fRy +jaC oAb tJP vlS @@ -129845,7 +129732,7 @@ erS deb aeu ckU -jPh +cfs cGv cGV clb @@ -131898,10 +131785,10 @@ aeu aUz cmU nRr -nRr -nRr -nRr -nRr +hsn +hsn +hsn +hsn kuv nRr nRr @@ -132413,15 +132300,15 @@ aeU cmU nRr nRr -nRr -nRr -nRr +hsn +hsn +hsn kuv nRr nRr nRr -nRr -nRr +hsn +hsn acm aeo acm @@ -132607,7 +132494,7 @@ bbi caT xpL pbn -vAo +tNe xEu xEu gVX @@ -132862,7 +132749,7 @@ cbk aOU kRX qoN -uhS +dkL sln cHQ sLE @@ -132926,7 +132813,7 @@ aeU cmU nRr nRr -nRr +hsn nRr nRr xOh @@ -133442,12 +133329,12 @@ nRr nRr nRr nRr -nRr +hsn xOh kuv xOh -nRr -nRr +hsn +hsn nRr nRr nRr @@ -133959,9 +133846,9 @@ nRr nRr nRr kuv -nRr -nRr -nRr +hsn +hsn +hsn nRr nRr acm @@ -139809,8 +139696,8 @@ aaa aeo aaa pFC -dyq -xUP +nRi +fxL pFC viq aaa @@ -140066,8 +139953,8 @@ aaa aaQ aaa pFC -pqf -vzj +gOl +gCO pFC viq aaa @@ -140323,8 +140210,8 @@ aaa aeo aaa pFC -qBh -wiR +lGH +vbD pFC viq aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d3950a6b8b..164edfdd93 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -1405,6 +1405,37 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/cargo/sorting) +"ajN" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Entrance"; + req_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "ajO" = ( /obj/structure/closet, /obj/item/clothing/gloves/color/fyellow, @@ -4374,9 +4405,6 @@ /obj/effect/spawner/lootdrop/maintenance/three, /turf/open/floor/plating, /area/maintenance/starboard) -"aHw" = ( -/turf/open/floor/plating, -/area/medical/medbay/central) "aHx" = ( /turf/closed/wall/r_wall, /area/hallway/primary/fore) @@ -4748,16 +4776,6 @@ icon_state = "platingdmg1" }, /area/maintenance/port/fore) -"aLn" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/science/nanite) "aLs" = ( /obj/structure/sign/plaques/kiddie{ pixel_y = 32 @@ -6020,21 +6038,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"aXh" = ( -/obj/machinery/door/window/northleft{ - name = "Nanite Lab" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/science/nanite) "aXm" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/disposalpipe/segment{ @@ -7072,6 +7075,21 @@ }, /turf/open/floor/iron, /area/security/brig) +"bih" = ( +/obj/structure/chair/comfy{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron, +/area/science/research) "bio" = ( /obj/machinery/camera{ c_tag = "AI Chamber - Aft"; @@ -7282,20 +7300,6 @@ }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) -"bkv" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/nanite) "bkB" = ( /obj/item/extinguisher, /turf/open/floor/plating, @@ -7534,14 +7538,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) -"bmT" = ( -/obj/machinery/nanite_program_hub, -/obj/machinery/requests_console/directional/north{ - department = "Nanite Lab"; - name = "Nanite Lab Requests Console" - }, -/turf/open/floor/circuit/green, -/area/science/nanite) "bmX" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -7823,6 +7819,21 @@ }, /turf/open/floor/iron, /area/security/checkpoint/customs) +"bpx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "bpF" = ( /obj/structure/toilet{ pixel_y = 8 @@ -10776,6 +10787,14 @@ /obj/machinery/atmospherics/components/unary/cryo_cell, /turf/open/floor/iron/dark/textured, /area/medical/cryo) +"cah" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/turf/open/floor/circuit/green/off, +/area/science/research) "car" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -12867,9 +12886,6 @@ }, /turf/open/floor/engine, /area/engineering/supermatter/room) -"ctL" = ( -/turf/closed/wall/r_wall, -/area/science/nanite) "ctU" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Post - Cargo"; @@ -12902,6 +12918,23 @@ }, /turf/open/floor/wood, /area/cargo/qm) +"cui" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/research) "cuj" = ( /obj/machinery/camera{ c_tag = "Supermatter Chamber"; @@ -14228,6 +14261,18 @@ }, /turf/open/floor/iron, /area/security/checkpoint/science) +"cHh" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/science/research) "cHu" = ( /obj/structure/cable, /obj/machinery/camera{ @@ -15503,6 +15548,22 @@ }, /turf/open/space/basic, /area/space) +"cTr" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Science Break Room"; + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron, +/area/science/research) "cTz" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -15527,13 +15588,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) -"cTN" = ( -/obj/structure/sign/warning/securearea, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/science/nanite) "cTU" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/north, @@ -16546,6 +16600,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/maintenance/fore) +"dhj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/iron, +/area/science/research) "dhn" = ( /obj/structure/table, /obj/item/poster/random_contraband, @@ -16803,6 +16868,26 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/science/lab) +"dkc" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 28 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "dki" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible, /turf/closed/wall/r_wall, @@ -18550,16 +18635,6 @@ }, /turf/open/floor/iron/white, /area/medical/pharmacy) -"dMl" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/donkpockets, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/science/nanite) "dMw" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/status_display/evac/directional/south, @@ -19116,6 +19191,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/service/bar) +"dWO" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/science/research) "dWU" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, @@ -21984,20 +22070,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"eQK" = ( -/obj/structure/table/glass, -/obj/item/storage/box/disks_nanite{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/storage/box/disks_nanite{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "eRa" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 10 @@ -22421,6 +22493,17 @@ }, /turf/open/floor/iron/dark, /area/command/bridge) +"eWT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/medical/cryo) "eWV" = ( /obj/structure/table, /obj/item/paper/fluff/holodeck/disclaimer, @@ -22723,17 +22806,6 @@ /obj/item/shard, /turf/open/space/basic, /area/space/nearstation) -"fde" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "fdq" = ( /obj/structure/chair/stool/directional/north, /obj/structure/disposalpipe/segment{ @@ -25026,15 +25098,6 @@ }, /turf/open/floor/iron/white, /area/science/mixing) -"fQU" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/science/nanite) "fRh" = ( /obj/item/radio/intercom/directional/west, /obj/structure/table/glass, @@ -25288,6 +25351,18 @@ /obj/item/pen/invisible, /turf/open/floor/engine/cult, /area/service/library) +"fVN" = ( +/obj/structure/cable, +/obj/machinery/light/directional/north, +/obj/machinery/power/apc/auto_name/north, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/mob/living/simple_animal/pet/dog/corgi/puppy/void{ + dir = 4 + }, +/turf/open/floor/grass, +/area/science/research) "fWg" = ( /obj/structure/chair, /obj/machinery/computer/security/telescreen/interrogation{ @@ -25325,6 +25400,20 @@ }, /turf/open/floor/circuit/green, /area/science/robotics/mechbay) +"fXt" = ( +/obj/structure/cable, +/obj/item/food/cracker, +/obj/item/food/cracker{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/item/trash/boritos{ + desc = "Why does it look like boritos? Nobody would feed unhealthy snacks to pets, right?"; + name = "cracker bag"; + pixel_x = -14 + }, +/turf/open/floor/grass, +/area/science/research) "fXC" = ( /obj/structure/window/reinforced{ dir = 8 @@ -25686,11 +25775,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"gdG" = ( -/obj/machinery/computer/nanite_cloud_controller, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/circuit/green, -/area/science/nanite) "gdY" = ( /obj/machinery/photocopier{ pixel_y = 3 @@ -25877,6 +25961,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore) +"ghY" = ( +/mob/living/simple_animal/pet/penguin/baby{ + dir = 8 + }, +/turf/open/floor/grass, +/area/science/research) "gib" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/disposalpipe/segment, @@ -26631,6 +26721,14 @@ }, /turf/open/floor/iron/freezer, /area/security/prison) +"gvE" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/mob/living/simple_animal/pet/dog/corgi/puppy/slime, +/turf/open/floor/grass, +/area/science/research) "gvH" = ( /obj/structure/lattice/catwalk, /obj/item/barcodescanner, @@ -26880,37 +26978,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"gAI" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Nanite Laboratory"; - req_access_txt = "47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "gAP" = ( /obj/structure/sign/departments/cargo, /turf/closed/wall, @@ -27409,6 +27476,10 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/commons/locker) +"gHY" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/aft) "gId" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -27549,32 +27620,6 @@ }, /turf/open/floor/iron/dark, /area/science/mixing) -"gLm" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Space Bridge"; - req_access_txt = "55" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "xeno_blastdoor"; - name = "biohazard containment door" - }, -/turf/open/floor/iron/white, -/area/science/nanite) "gMj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -27821,6 +27866,31 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/engineering/main) +"gTG" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Access"; + req_access_txt = "47" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/science/research) "gTQ" = ( /obj/machinery/light/directional/east, /obj/structure/disposalpipe/segment, @@ -28106,6 +28176,13 @@ /obj/effect/spawner/lootdrop/glowstick, /turf/open/floor/iron/white, /area/medical/abandoned) +"gZq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/science/research) "gZM" = ( /obj/structure/sign/warning/pods, /turf/closed/wall/r_wall, @@ -30757,17 +30834,6 @@ }, /turf/open/floor/iron, /area/service/hydroponics) -"hXe" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/camera{ - c_tag = "Science Maintenance Corridor"; - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "hXg" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -31718,18 +31784,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/commons/dorms) -"inN" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/science/nanite) "inS" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -31756,23 +31810,6 @@ /obj/effect/turf_decal/trimline/brown/warning, /turf/open/floor/iron/white, /area/hallway/primary/central) -"iog" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/nanite) "iov" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -31895,6 +31932,18 @@ }, /turf/open/floor/engine/plasma, /area/engineering/atmos) +"iqC" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/science/research) "iqL" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ @@ -33301,6 +33350,18 @@ }, /turf/open/floor/iron, /area/service/hydroponics/garden) +"iQR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/science/research) "iQX" = ( /obj/machinery/porta_turret/ai, /obj/machinery/flasher/directional/north{ @@ -33699,6 +33760,16 @@ "iXC" = ( /turf/open/floor/engine/air, /area/engineering/atmos) +"iXU" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/science/research) "iYi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35302,6 +35373,10 @@ }, /turf/open/floor/iron, /area/service/hydroponics) +"jBe" = ( +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/iron/white, +/area/science/research) "jBf" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -35686,6 +35761,19 @@ /obj/structure/cable, /turf/open/floor/iron, /area/hallway/secondary/service) +"jJh" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/science/research) "jJq" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -38575,6 +38663,21 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) +"kId" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/science/research) "kIj" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -39443,6 +39546,12 @@ }, /turf/open/floor/iron, /area/cargo/miningoffice) +"kXQ" = ( +/obj/structure/frame/machine{ + anchored = 1 + }, +/turf/open/floor/circuit/green/off, +/area/science/research) "kYe" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -40766,13 +40875,6 @@ }, /turf/open/floor/iron/white, /area/science/storage) -"lta" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/circuit/green, -/area/science/nanite) "ltg" = ( /obj/machinery/door/airlock/grunge{ name = "Prison Workshop" @@ -43518,6 +43620,10 @@ /obj/effect/spawner/lootdrop/gross_decal_spawner, /turf/open/floor/iron/white, /area/medical/abandoned) +"mpa" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall, +/area/science/research) "mph" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, @@ -43908,6 +44014,12 @@ /obj/structure/cable, /turf/open/floor/wood, /area/service/lawoffice) +"mvj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/science/research) "mvv" = ( /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/cobweb, @@ -44245,6 +44357,20 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) +"mAN" = ( +/obj/machinery/door/window/northleft{ + name = "Petting Zoo" + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/science/research) "mBw" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ @@ -44371,6 +44497,13 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/commons/dorms) +"mCH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/flora/ausbushes/stalkybush, +/turf/open/floor/grass, +/area/science/research) "mDk" = ( /obj/machinery/power/rad_collector/anchored, /obj/structure/window/plasma/reinforced{ @@ -45157,13 +45290,6 @@ /obj/machinery/libraryscanner, /turf/open/floor/wood, /area/service/library) -"mQQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "mQU" = ( /obj/structure/plasticflaps, /obj/structure/window/reinforced{ @@ -46351,6 +46477,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/command/heads_quarters/hos) +"niR" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/science/research) "niS" = ( /obj/machinery/light/directional/east, /obj/structure/disposalpipe/segment, @@ -46446,11 +46590,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/commons/storage/primary) -"nkS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/science/nanite) "nkV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -46668,31 +46807,6 @@ }, /turf/open/floor/iron/dark, /area/service/chapel/main) -"noS" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Nanite and Xenobiology Access"; - req_access_txt = "47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/science/research) "noT" = ( /obj/structure/table/glass, /obj/item/food/chips{ @@ -46890,20 +47004,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/starboard) -"nsC" = ( -/obj/machinery/door/window/northright{ - name = "Nanite Lab" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/science/nanite) "nsG" = ( /obj/machinery/hydroponics/soil, /obj/machinery/camera{ @@ -47965,17 +48065,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/service/chapel/office) -"nIx" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/science/nanite) "nID" = ( /obj/machinery/door/airlock/maintenance{ name = "Genetics Maintenance"; @@ -48070,6 +48159,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/hallway/primary/port) +"nJl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/science/research) "nJN" = ( /obj/machinery/power/apc/auto_name/east, /obj/structure/cable, @@ -49109,6 +49205,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port/fore) +"obj" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/camera{ + c_tag = "Science Maintenance Corridor"; + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/science/research) "obv" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = 32 @@ -49786,17 +49893,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/hallway/primary/port) -"onG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/medical/coldroom) "onR" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -50083,20 +50179,6 @@ }, /turf/open/floor/iron, /area/security/brig) -"orG" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "orL" = ( /obj/machinery/biogenerator, /obj/effect/decal/cleanable/dirt, @@ -50727,18 +50809,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/medical/medbay/central) -"oDK" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/medical/medbay/central) "oDQ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -51418,15 +51488,6 @@ /obj/structure/cable/multilayer/connected, /turf/open/floor/iron/dark, /area/ai_monitored/aisat/exterior) -"oOD" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/siding/green{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "oOF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -51709,6 +51770,10 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark, /area/command/heads_quarters/hos) +"oTI" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/science/research) "oTJ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -51749,11 +51814,6 @@ dir = 1 }, /area/hallway/primary/central) -"oTY" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/science/nanite) "oUb" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple{ @@ -52602,6 +52662,21 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"pgi" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/science/research) "pgt" = ( /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, @@ -54523,16 +54598,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"pPZ" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/green{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "pQi" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -54927,6 +54992,10 @@ }, /turf/open/floor/iron, /area/science/robotics/lab) +"pWO" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall/r_wall, +/area/science/research) "pWR" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -54965,6 +55034,20 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark, /area/engineering/storage/tech) +"pXA" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "pXT" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -56658,20 +56741,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/security/office) -"qCP" = ( -/obj/structure/chair/comfy{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/science/nanite) "qCQ" = ( /obj/structure/window/reinforced{ dir = 1; @@ -57223,22 +57292,6 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/engineering/atmos) -"qMf" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Science Break Room"; - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/science/nanite) "qMr" = ( /turf/closed/wall, /area/service/kitchen/coldroom) @@ -58262,14 +58315,6 @@ icon_state = "platingdmg3" }, /area/solars/port/fore) -"rdZ" = ( -/obj/structure/cable, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "rec" = ( /obj/docking_port/stationary/random{ dir = 4; @@ -58852,16 +58897,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"rnM" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Science Nanites Lab"; - dir = 8 - }, -/turf/open/floor/circuit/green, -/area/science/nanite) "rnV" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, @@ -59034,26 +59069,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"rqN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 28 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "rqO" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -59068,6 +59083,17 @@ /obj/structure/cable, /turf/open/floor/iron, /area/security/brig) +"rqT" = ( +/obj/machinery/camera{ + c_tag = "Science Petting Zoo"; + dir = 8 + }, +/obj/structure/frame/computer{ + anchored = 1; + dir = 8 + }, +/turf/open/floor/circuit/green/off, +/area/science/research) "rrj" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room"; @@ -59232,19 +59258,6 @@ }, /turf/open/floor/iron, /area/engineering/break_room) -"rsu" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/nanite) "rtc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -61180,10 +61193,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood, /area/command/heads_quarters/captain/private) -"rYp" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/medical/medbay/central) "rYC" = ( /turf/open/floor/plating{ icon_state = "platingdmg2" @@ -61318,6 +61327,14 @@ }, /turf/open/floor/iron, /area/hallway/secondary/command) +"sbQ" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/science/research) "sbW" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -62148,6 +62165,20 @@ "soZ" = ( /turf/open/floor/wood, /area/command/corporate_showroom) +"spa" = ( +/obj/structure/window/reinforced/tinted{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/research) "spg" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating, @@ -62178,10 +62209,6 @@ dir = 1 }, /area/engineering/atmos) -"spG" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall, -/area/science/nanite) "spT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -62877,6 +62904,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/robotics/mechbay) +"sBX" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/science/research) "sCb" = ( /obj/machinery/door/airlock/command{ name = "Command Desk"; @@ -62946,6 +62983,12 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"sDy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/science/research) "sDL" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64108,13 +64151,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/engineering/main) -"sVU" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/science/misc_lab) "sWb" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 6 @@ -66693,21 +66729,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/command/bridge) -"tOv" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/science/nanite) "tOw" = ( /obj/structure/sink{ dir = 8; @@ -67623,23 +67644,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/science/robotics/mechbay) -"ueO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/nanite) "ueU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -68667,6 +68671,13 @@ }, /turf/open/floor/iron, /area/commons/locker) +"uuh" = ( +/obj/structure/sign/warning/securearea, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/science/research) "uui" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -68754,6 +68765,32 @@ }, /turf/open/floor/iron, /area/engineering/gravity_generator) +"uvd" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/airlock/research{ + name = "Xenobiology Space Bridge"; + req_access_txt = "55" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "xeno_blastdoor"; + name = "biohazard containment door" + }, +/turf/open/floor/iron/white, +/area/science/research) "uvj" = ( /obj/structure/closet/lasertag/blue, /obj/effect/turf_decal/tile/neutral{ @@ -68901,21 +68938,6 @@ }, /turf/open/floor/iron/dark, /area/science/genetics) -"uxi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "uxy" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -69220,6 +69242,11 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/dark, /area/ai_monitored/security/armory) +"uDl" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/grass, +/area/science/research) "uDq" = ( /obj/structure/sign/poster/contraband/random{ pixel_x = -32 @@ -69332,18 +69359,6 @@ }, /turf/open/floor/plating, /area/engineering/supermatter/room) -"uFU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/science/nanite) "uFV" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -69360,10 +69375,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/science/robotics/lab) -"uFZ" = ( -/obj/machinery/nanite_programmer, -/turf/open/floor/circuit/green, -/area/science/nanite) "uGc" = ( /obj/structure/girder, /obj/structure/grille, @@ -69728,6 +69739,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/engineering/main) +"uML" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/aft) "uMZ" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/wood, @@ -69753,14 +69772,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/smooth_large, /area/medical/treatment_center) -"uNj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/medical/medbay/central) "uNx" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/techstorage/security, @@ -69875,6 +69886,19 @@ }, /turf/open/floor/iron/dark, /area/command/gateway) +"uPi" = ( +/obj/machinery/door/window/northright{ + name = "Petting Zoo" + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/science/research) "uPD" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -70588,10 +70612,6 @@ }, /turf/open/floor/iron/white, /area/science/research) -"uZY" = ( -/obj/machinery/nanite_chamber, -/turf/open/floor/circuit/green, -/area/science/nanite) "vaD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71578,21 +71598,6 @@ icon_state = "wood-broken5" }, /area/service/library) -"vqp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/science/nanite) "vqw" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -73212,6 +73217,18 @@ }, /turf/open/floor/iron/white, /area/science/cytology) +"vSv" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/aft) "vSJ" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/camera{ @@ -74017,10 +74034,6 @@ }, /turf/open/floor/iron, /area/security/warden) -"whv" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall, -/area/science/nanite) "whB" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, @@ -75418,20 +75431,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/engineering/gravity_generator) -"wHW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/science/nanite) "wHY" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ @@ -76733,6 +76732,14 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/dark, /area/command/heads_quarters/rd) +"xev" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/machinery/module_duplicator, +/turf/open/floor/iron/white, +/area/science/misc_lab) "xeO" = ( /obj/machinery/door/airlock/engineering{ name = "Starboard Quarter Solar Access"; @@ -77238,12 +77245,6 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron/dark, /area/commons/locker) -"xmN" = ( -/obj/effect/turf_decal/siding/green{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "xmT" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -77441,10 +77442,6 @@ /obj/effect/landmark/start/chaplain, /turf/open/floor/iron/dark, /area/service/chapel/main) -"xrs" = ( -/obj/effect/decal/cleanable/garbage, -/turf/open/floor/iron/white, -/area/science/nanite) "xrA" = ( /obj/machinery/air_sensor/atmos/carbon_tank, /turf/open/floor/engine/co2, @@ -78597,30 +78594,6 @@ }, /turf/open/floor/iron, /area/maintenance/department/science/xenobiology) -"xJV" = ( -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/nanite_scanner{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/table/glass, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/north, -/turf/open/floor/iron/dark, -/area/science/nanite) "xJX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/external{ @@ -79736,6 +79709,20 @@ }, /turf/open/floor/iron/dark, /area/security/brig) +"ydr" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/science/research) "ydE" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -79778,12 +79765,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/solars/port/aft) -"yeh" = ( -/obj/effect/turf_decal/siding/green{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "yej" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -100820,7 +100801,7 @@ bLd css lUJ olq -onG +eWT tqf aiX mRw @@ -102910,7 +102891,7 @@ vgF wMP cqi tay -aHw +jNL diR bbw iRA @@ -103166,12 +103147,12 @@ dqj cEP cFS cGN -oDK -uNj +vSv +uML cJr qqO cLd -iRA +wRK sNW uXo qkk @@ -103424,11 +103405,11 @@ wEy tfh fTw tay -rYp +gHY diR aQv pfR -iRA +wRK axD aSC cmS @@ -103685,7 +103666,7 @@ tay tay tay mhN -iRA +wRK yih aSC qis @@ -104199,7 +104180,7 @@ rXb fRx qRV sjN -iRA +wRK cFQ nMX kKn @@ -104456,7 +104437,7 @@ aCl fej tay mhN -iRA +wRK fZo nMX kKn @@ -104713,7 +104694,7 @@ tay tay tay pug -iRA +wRK qOc nMX kKn @@ -104970,7 +104951,7 @@ leR leR leR cvC -iRA +wRK wRK ldn sxa @@ -113934,7 +113915,7 @@ yjC lGi eAF xAx -sVU +xev nhL oLk kYe @@ -116257,7 +116238,7 @@ cIg cIg cIg dpV -noS +gTG dpV nOc bjK @@ -116513,9 +116494,9 @@ xZW eZf gXs wmS -vqp -rqN -uxi +bpx +dkc +kId gkv uhC fsL @@ -116770,9 +116751,9 @@ dwL cmY ifi ovj -hXe -orG -xrs +obj +pXA +jBe dvY kQY lFg @@ -117024,12 +117005,12 @@ ovj ovj ovj dwL -ctL -ctL -ctL -cTN -gAI -whv +cgo +cgo +cgo +uuh +ajN +mpa nOc dyc bjK @@ -117280,14 +117261,14 @@ myQ xZF gGR nGT -ctL -uFZ -lta -uZY -tOv -ueO -qMf -ctL +cgo +kXQ +cah +kXQ +pgi +cui +cTr +cgo cEz bjK dyc @@ -117537,14 +117518,14 @@ ovj cpJ ten ovj -ctL -xJV -pPZ -xmN -rsu -ueO -fQU -ctL +cgo +fVN +gZq +mCH +jJh +cui +cHh +cgo qfG jTf xaN @@ -117794,14 +117775,14 @@ cos dxh hPn crZ -ctL -bmT -rdZ -nkS -aXh -iog -qCP -ctL +cgo +mvj +fXt +uDl +mAN +niR +bih +cgo vPM ciL sgX @@ -118051,14 +118032,14 @@ cot cnb cra csa -ctL -gdG -mQQ -oTY -nsC -uFU -nIx -ctL +cgo +sbQ +ghY +oTI +uPi +iQR +dWO +cgo dww cFu dyc @@ -118308,14 +118289,14 @@ nbv nbv cou csb -ctL -eQK -oOD -yeh -bkv -wHW -dMl -ctL +cgo +gvE +sDy +nJl +spa +ydr +iXU +cgo dvY dvY dvY @@ -118565,14 +118546,14 @@ mhf nbv rYC csc -ctL -uFZ -rnM -uZY -inN -fde -aLn -ctL +cgo +kXQ +rqT +kXQ +iqC +dhj +sBX +cgo aaa aaa aaa @@ -118823,13 +118804,13 @@ cpK cwG pPA dwL -ctL -ctL -ctL -spG -gLm -spG -ctL +cgo +cgo +cgo +pWO +uvd +pWO +cgo aaa aaa aaa diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 066fffbf7e..adaecc5ce3 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1472,10 +1472,6 @@ }, /turf/open/floor/plating, /area/cargo/storage) -"fd" = ( -/obj/structure/sign/departments/nanites, -/turf/closed/wall/r_wall, -/area/construction) "fe" = ( /obj/machinery/computer/cargo{ dir = 8 @@ -2053,11 +2049,9 @@ /turf/open/floor/iron, /area/hallway/primary/central) "kp" = ( -/obj/machinery/computer/rdconsole{ - dir = 1 - }, +/obj/structure/server, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "kQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -2092,7 +2086,7 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "nq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -2136,12 +2130,6 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/engineering/atmos) -"qd" = ( -/obj/machinery/airalarm/unlocked{ - pixel_y = 23 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "qQ" = ( /turf/open/floor/engine, /area/cargo/miningoffice) @@ -2164,10 +2152,9 @@ /turf/open/floor/iron, /area/hallway/primary/central) "sr" = ( -/obj/machinery/public_nanite_chamber, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/iron, -/area/hallway/secondary/entry) +/obj/machinery/door/airlock/shell, +/turf/open/floor/iron/dark, +/area/construction) "sE" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, @@ -2178,6 +2165,10 @@ /obj/item/storage/box/shipping, /turf/open/floor/iron, /area/commons/storage/primary) +"tE" = ( +/obj/machinery/door/airlock/research, +/turf/open/floor/iron/dark, +/area/construction) "tG" = ( /obj/docking_port/stationary/random{ id = "pod_lavaland"; @@ -2185,6 +2176,10 @@ }, /turf/open/space/basic, /area/space) +"tV" = ( +/obj/structure/bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "uf" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -2212,14 +2207,25 @@ /turf/open/floor/iron, /area/commons/storage/primary) "uQ" = ( -/obj/machinery/nanite_programmer, /obj/machinery/light/directional/west, +/obj/structure/table, +/obj/item/compact_remote, +/obj/item/compact_remote, +/obj/item/compact_remote{ + pixel_x = -5 + }, +/obj/item/controller{ + pixel_x = 5 + }, +/obj/item/controller{ + pixel_x = 5 + }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "vm" = ( -/obj/machinery/computer/nanite_cloud_controller, +/mob/living/circuit_drone, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "vv" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, @@ -2272,7 +2278,7 @@ /area/hallway/primary/central) "wU" = ( /turf/closed/wall/r_wall, -/area/science/nanite) +/area/science/misc_lab) "yK" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -2286,9 +2292,11 @@ /turf/open/floor/iron, /area/engineering/atmos) "AE" = ( -/obj/item/disk/tech_disk/debug, +/obj/machinery/airalarm/unlocked{ + pixel_y = 23 + }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "AP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -2326,11 +2334,9 @@ /turf/open/floor/iron, /area/cargo/miningoffice) "CT" = ( -/obj/machinery/computer/nanite_chamber_control{ - dir = 8 - }, +/obj/machinery/component_printer, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "CV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, @@ -2338,9 +2344,11 @@ /area/medical/chemistry) "Df" = ( /obj/machinery/light/directional/east, -/mob/living/carbon/human, +/obj/item/integrated_circuit/loaded/hello_world, +/obj/item/integrated_circuit/loaded/speech_relay, +/obj/structure/rack, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "DW" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -2397,7 +2405,7 @@ "Ir" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/science/nanite) +/area/science/misc_lab) "Iy" = ( /obj/structure/closet/secure_closet/research_director{ locked = 0 @@ -2444,13 +2452,13 @@ /turf/open/floor/iron/dark, /area/medical/chemistry) "LH" = ( -/obj/machinery/door/airlock, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/science/nanite) +/obj/machinery/door/airlock/research, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "LW" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -2471,9 +2479,9 @@ /turf/open/floor/iron, /area/engineering/atmos) "Nb" = ( -/obj/machinery/nanite_chamber, +/obj/machinery/bci_implanter, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "Nc" = ( /obj/machinery/chem_recipe_debug, /turf/open/floor/iron, @@ -2488,9 +2496,13 @@ /turf/open/floor/iron, /area/science) "Ov" = ( -/obj/machinery/nanite_program_hub, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/bluespace, +/obj/item/stock_parts/cell/bluespace, +/obj/item/stock_parts/cell/bluespace, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "OU" = ( /obj/item/disk/tech_disk/debug, /turf/open/floor/iron, @@ -2574,7 +2586,7 @@ dir = 4 }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "Vy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -2605,6 +2617,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/engineering/gravity_generator) +"WK" = ( +/obj/structure/money_bot, +/turf/open/floor/iron/dark, +/area/science/misc_lab) "WT" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2634,16 +2650,17 @@ /area/science) "XN" = ( /obj/structure/table, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 +/obj/item/organ/cyberimp/bci{ + pixel_y = 5 + }, +/obj/item/organ/cyberimp/bci{ + pixel_y = 5 }, -/obj/item/nanite_scanner{ - pixel_x = 4; - pixel_y = -4 +/obj/item/organ/cyberimp/bci{ + pixel_y = 5 }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "XR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 @@ -2661,9 +2678,15 @@ /area/commons/storage/primary) "Ym" = ( /obj/structure/table, -/obj/item/storage/box/disks_nanite, +/obj/item/storage/toolbox/electrical, +/obj/item/multitool/circuit{ + pixel_x = -4 + }, +/obj/item/multitool{ + pixel_x = 4 + }, /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) "Yy" = ( /obj/machinery/light/directional/north, /obj/machinery/rnd/production/circuit_imprinter/department, @@ -2677,7 +2700,7 @@ /area/engineering/atmos) "ZP" = ( /turf/open/floor/iron/dark, -/area/science/nanite) +/area/science/misc_lab) (1,1,1) = {" aa @@ -5851,7 +5874,7 @@ eh eh eh rn -sr +eh eh ge aa @@ -6125,11 +6148,11 @@ dn dn dn dL -ef +sr nn ZP ZP -ZP +WK Ir aa aa @@ -6217,7 +6240,7 @@ dn dn dn dL -ef +cN AE kp XN @@ -6309,11 +6332,11 @@ dn dn dn dL -cN -qd +tE ZP ZP ZP +tV Ir aa aa @@ -6401,7 +6424,7 @@ dn dn dn dL -fd +cN ZP Df Nb diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 7d118dfed3..8a40af6c2c 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -332,16 +332,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) -"abe" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/effect/turf_decal/trimline/green/filled/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/hallway/primary/port) "abg" = ( /obj/machinery/door/airlock/external{ name = "Port Docking Bay 1"; @@ -350,16 +340,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/hallway/secondary/entry) -"abi" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/effect/turf_decal/trimline/green/filled/warning{ - dir = 9 - }, -/turf/open/floor/iron, -/area/hallway/primary/port) "abj" = ( /obj/effect/decal/cleanable/cobweb, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -565,10 +545,6 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/security/prison) -"abP" = ( -/obj/item/assembly/igniter, -/turf/closed/mineral/random/stationside/asteroid, -/area/maintenance/department/medical) "abU" = ( /obj/effect/turf_decal/trimline/green/filled/corner, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -613,16 +589,6 @@ /obj/structure/ladder, /turf/open/floor/iron/dark, /area/ai_monitored/command/nuke_storage) -"ace" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/security/courtroom) "acg" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -1673,11 +1639,6 @@ }, /turf/open/floor/iron, /area/security/courtroom) -"afR" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/security_unit/directional/south, -/turf/open/floor/wood, -/area/service/library) "afU" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -2556,12 +2517,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/command/gateway) -"ajj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/commons/vacant_room/commissary) "ajk" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -2758,25 +2713,6 @@ /obj/structure/closet/wardrobe/mixed, /turf/open/floor/iron/cafeteria, /area/commons/locker) -"ajT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/hallway/primary/port) "ajU" = ( /obj/structure/railing/corner, /turf/open/floor/glass, @@ -3295,17 +3231,6 @@ }, /turf/open/floor/iron, /area/maintenance/tram/mid) -"alu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) "alx" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/stripes/line{ @@ -3734,17 +3659,6 @@ dir = 8 }, /area/service/chapel) -"anf" = ( -/obj/machinery/computer/nanite_chamber_control, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/requests_console/directional/north{ - department = "Nanite Lab"; - name = "Nanite Lab Requests Console" - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "anj" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -4779,11 +4693,6 @@ }, /turf/open/floor/iron, /area/security/brig) -"aqf" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/wood, -/area/service/library) "aqg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -4836,13 +4745,6 @@ /obj/machinery/power/apc/auto_name/north, /turf/open/floor/carpet, /area/security/detectives_office) -"aqo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/hallway/primary/tram/left) "aqp" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -5782,14 +5684,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/service/bar) -"asL" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/north, -/turf/open/floor/iron/dark, -/area/science/nanite) "asM" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -6250,22 +6144,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/command/gateway) -"auc" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/item/storage/box/disks_nanite{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/storage/box/disks_nanite{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/science/nanite) "auf" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -6585,13 +6463,6 @@ /obj/item/stamp/hos, /turf/open/floor/carpet, /area/command/heads_quarters/hos) -"avj" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/turf/open/floor/iron, -/area/hallway/primary/tram/left) "avk" = ( /obj/effect/turf_decal/trimline/white/filled/line{ dir = 1 @@ -6815,29 +6686,11 @@ }, /turf/open/floor/iron, /area/hallway/primary/tram/center) -"avX" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/hallway/primary/tram/center) "avY" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/hallway/primary/tram/right) -"awe" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron, -/area/hallway/primary/tram/right) "awf" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/disposalpipe/segment{ @@ -7149,10 +7002,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/engineering/break_room) -"awX" = ( -/obj/machinery/newscaster/security_unit/directional/east, -/turf/open/floor/wood, -/area/service/lawoffice) "awY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7710,9 +7559,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/service/kitchen) -"ayQ" = ( -/turf/closed/wall/r_wall, -/area/science/nanite) "ayR" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -8189,16 +8035,6 @@ /obj/item/radio/intercom, /turf/open/floor/iron, /area/security/courtroom) -"aAs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/structure/reagent_dispensers/water_cooler, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/security/courtroom) "aAt" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -8604,15 +8440,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/arrow_ccw, /turf/open/floor/iron, /area/hallway/primary/tram/center) -"aBS" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/lawyer, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/wood, -/area/service/lawoffice) "aBU" = ( /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/door/poddoor/shutters{ @@ -8962,13 +8789,6 @@ }, /turf/open/floor/wood, /area/service/library) -"aCU" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/turf/open/floor/iron, -/area/hallway/primary/tram/left) "aDa" = ( /obj/structure/bed, /obj/item/bedsheet/dorms, @@ -9018,23 +8838,6 @@ }, /turf/open/floor/carpet, /area/security/detectives_office) -"aDo" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/hallway/primary/tram/center) -"aDp" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/turf/open/floor/iron/grimy, -/area/hallway/secondary/entry) "aDq" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -9368,20 +9171,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/hallway/primary/tram/left) -"aEo" = ( -/obj/machinery/newscaster/security_unit/directional/east, -/turf/open/floor/iron/dark, -/area/service/chapel) -"aEp" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/hallway/primary/tram/right) "aEq" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -9505,12 +9294,6 @@ "aEJ" = ( /turf/closed/wall, /area/construction/mining/aux_base) -"aEK" = ( -/obj/machinery/newscaster/security_unit/directional/south, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/turf/open/floor/iron, -/area/hallway/primary/tram/left) "aEL" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -10430,16 +10213,6 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/floor/iron, /area/commons/storage/art) -"aHM" = ( -/obj/structure/table/wood, -/obj/machinery/computer/med_data/laptop, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/medical/psychology) "aHN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -10630,18 +10403,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/tram/left) -"aIs" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/machinery/light_switch/directional/east, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark, -/area/science/nanite) "aIu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -10771,14 +10532,6 @@ name = "Holodeck Projector Floor" }, /area/holodeck/rec_center) -"aIT" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/science/nanite) "aIU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -12911,6 +12664,15 @@ /obj/item/stack/package_wrap, /turf/open/floor/iron, /area/commons/storage/primary) +"aWS" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/lawyer, +/obj/machinery/firealarm/directional/south, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/service/lawoffice) "aWV" = ( /obj/machinery/vending/wardrobe/chap_wardrobe, /turf/open/floor/iron/grimy, @@ -13300,29 +13062,16 @@ }, /turf/open/floor/plating/airless, /area/mine/explored) -"bap" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line{ +"bav" = ( +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, -/obj/item/nanite_scanner{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/nanite_scanner{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/nanite_remote{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/nanite_remote{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) +/obj/machinery/firealarm/directional/west, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/medical/psychology) "baB" = ( /obj/structure/girder, /obj/effect/decal/cleanable/dirt, @@ -13371,14 +13120,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/hallway/primary/tram/right) -"baY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/science/nanite) "bbb" = ( /obj/machinery/door/airlock/maintenance_hatch{ req_one_access_txt = "12" @@ -13498,6 +13239,20 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit) +"bdd" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/service/bar) "bdh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -14325,10 +14080,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) -"bsR" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/science/nanite) "bsW" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -14352,14 +14103,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/tcommsat/computer) -"btO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rnd2"; - name = "research lab shutters" - }, -/turf/open/floor/plating, -/area/science/nanite) "btP" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 1 @@ -14379,6 +14122,17 @@ }, /turf/open/floor/iron/dark, /area/service/hydroponics) +"bum" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/service/bar) "bup" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -14601,14 +14355,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/engineering/atmos) -"byG" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/machinery/newscaster/security_unit/directional/south, -/turf/open/floor/iron, -/area/service/hydroponics/garden) "byJ" = ( /obj/structure/table/glass, /obj/machinery/light/directional/west, @@ -14701,6 +14447,14 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) +"bAL" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/engineering/break_room) "bAS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/robot_debris, @@ -14940,15 +14694,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/commons/storage/art) -"bFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "bFS" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -15346,23 +15091,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/port) -"bMh" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/science/research) -"bMz" = ( -/obj/machinery/nanite_programmer, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/circuit/green, -/area/science/nanite) "bMC" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -15559,6 +15287,15 @@ }, /turf/open/floor/iron, /area/hallway/primary/tram/center) +"bQd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Civilian - Library Back Room"; + dir = 5 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/grimy, +/area/service/library) "bQC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -16192,21 +15929,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /turf/open/floor/iron/dark, /area/science/xenobiology) -"cdt" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/south, -/turf/open/floor/iron/white, -/area/medical/medbay/central) "cdu" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, @@ -17254,6 +16976,14 @@ }, /turf/open/floor/iron/white, /area/science/research) +"czW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/hallway/primary/tram/center) "cAa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17301,13 +17031,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/maintenance/central/secondary) -"cAT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "cAU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17620,17 +17343,6 @@ /obj/effect/spawner/lootdrop/food_packaging, /turf/open/floor/plating, /area/maintenance/central) -"cII" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/dark, -/area/service/bar) "cIN" = ( /obj/structure/rack, /obj/item/stack/sheet/iron/ten, @@ -18545,18 +18257,6 @@ }, /turf/open/floor/iron/dark, /area/science/xenobiology) -"dbl" = ( -/obj/machinery/nanite_chamber, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Science - Nanite Lab"; - dir = 6; - network = list("ss13","science") - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "dbr" = ( /obj/machinery/door/airlock/medical/glass{ name = "Treatment Center"; @@ -18912,6 +18612,10 @@ }, /turf/open/floor/iron, /area/security/checkpoint/medical) +"djm" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/service/lawoffice) "djI" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/delivery, @@ -18927,16 +18631,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/central/secondary) -"dkt" = ( -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/turf/open/floor/iron/dark, -/area/engineering/engine_smes) "dku" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -20037,13 +19731,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) -"dFo" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/dark, -/area/science/nanite) "dFv" = ( /obj/effect/spawner/lootdrop/food_packaging, /obj/effect/decal/cleanable/dirt, @@ -21117,6 +20804,16 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"dZf" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/science/lab) "dZO" = ( /obj/machinery/light/directional/west, /obj/machinery/camera/motion{ @@ -21753,15 +21450,6 @@ }, /turf/open/floor/iron, /area/security/prison) -"emO" = ( -/obj/machinery/newscaster/security_unit/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera{ - c_tag = "Civilian - Library Back Room"; - dir = 5 - }, -/turf/open/floor/iron/grimy, -/area/service/library) "emS" = ( /obj/machinery/light/small/directional/south, /obj/machinery/button/door/directional/west{ @@ -22347,6 +22035,13 @@ /obj/item/clothing/shoes/sneakers/orange, /turf/open/floor/iron/cafeteria, /area/security/prison) +"ewP" = ( +/obj/effect/spawner/randomcolavend, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/science/breakroom) "ewQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -22619,6 +22314,16 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) +"eCL" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/hallway/primary/tram/right) "eCN" = ( /obj/effect/landmark/start/depsec/supply, /obj/structure/chair/office{ @@ -23448,6 +23153,10 @@ }, /turf/open/floor/iron, /area/hallway/secondary/exit) +"eWl" = ( +/obj/item/assembly/igniter, +/turf/closed/mineral/random/stationside/asteroid, +/area/mine/explored) "eWn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -23655,13 +23364,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"fat" = ( -/obj/effect/spawner/randomcolavend, -/obj/machinery/newscaster/security_unit/directional/west, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/science/breakroom) "fay" = ( /obj/machinery/modular_computer/console/preset/engineering{ dir = 4 @@ -23861,6 +23563,14 @@ "ffq" = ( /turf/open/floor/iron, /area/hallway/secondary/command) +"ffr" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/cargo/miningdock) "ffs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -25298,20 +25008,6 @@ }, /turf/open/floor/iron, /area/maintenance/tram/mid) -"fIg" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/commons/dorms) "fIp" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/oil/slippery, @@ -26483,9 +26179,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/white, /area/science/research) -"gfd" = ( -/turf/open/floor/circuit/green, -/area/science/nanite) "gfe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -26612,6 +26305,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/medical/medbay/central) +"ghR" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/security/courtroom) "ghY" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/light/small/directional/north, @@ -26964,6 +26667,16 @@ }, /turf/open/floor/plating, /area/maintenance/tram/mid) +"gqH" = ( +/obj/machinery/computer/atmos_alert{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/engineering/engine_smes) "gqQ" = ( /obj/machinery/door/airlock/virology{ name = "Break Room"; @@ -27734,6 +27447,27 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/carpet, /area/commons/vacant_room/office) +"gGs" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/engineering/main) +"gGD" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/green/filled/warning{ + dir = 9 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/hallway/primary/port) "gGM" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -28618,14 +28352,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/engineering/supermatter/room) -"gXR" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/engineering/break_room) "gYh" = ( /obj/machinery/computer/operating{ dir = 8 @@ -28957,6 +28683,13 @@ /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"hdD" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/hallway/primary/tram/left) "hdK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 9 @@ -29760,26 +29493,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/maintenance/disposal/incinerator) -"hqq" = ( -/obj/machinery/door/airlock/research{ - name = "Nanite Laboratory"; - req_one_access_txt = "7" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "hqr" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -30991,19 +30704,6 @@ }, /turf/open/floor/iron, /area/cargo/office) -"hPF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "hPX" = ( /obj/machinery/light/small/directional/east, /obj/effect/decal/cleanable/dirt, @@ -31526,17 +31226,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/hallway/primary/port) -"idv" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/airalarm/directional/north, -/obj/machinery/newscaster/security_unit/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/engineering/atmos) "idX" = ( /obj/machinery/door/airlock/maintenance_hatch{ req_one_access_txt = "12" @@ -31811,6 +31500,19 @@ }, /turf/open/floor/iron, /area/engineering/main) +"iiG" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/east, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/commons/dorms) "iiH" = ( /turf/open/openspace, /area/science/research) @@ -32193,18 +31895,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/grimy, /area/service/chapel/office) -"ist" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/machinery/newscaster/security_unit/directional/west, -/turf/open/floor/iron/dark, -/area/science/robotics/lab) "isF" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 1 @@ -32435,18 +32125,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/command/bridge) -"ixu" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Science - Lower Main South"; - dir = 6; - network = list("ss13","science") - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/white, -/area/science/research) "ixB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -33304,6 +32982,21 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) +"iLM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/medical/medbay/central) "iLW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera{ @@ -33942,6 +33635,16 @@ }, /turf/open/floor/iron/dark, /area/medical/psychology) +"iWB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/firealarm/directional/north, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/security/courtroom) "iWV" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -34800,13 +34503,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/science/explab) -"jqL" = ( -/obj/machinery/nanite_program_hub, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/circuit/green, -/area/science/nanite) "jqQ" = ( /turf/open/floor/engine, /area/engineering/supermatter/room) @@ -34939,6 +34635,12 @@ }, /turf/open/floor/iron/white, /area/medical/treatment_center) +"jtT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/plating, +/area/commons/vacant_room/commissary) "jtY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria{ @@ -35366,6 +35068,13 @@ "jCF" = ( /turf/open/floor/iron, /area/command/heads_quarters/ce) +"jCN" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/hallway/primary/tram/left) "jDb" = ( /obj/structure/table, /obj/item/paper/pamphlet/radstorm, @@ -38108,11 +37817,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/command/teleporter) -"kzT" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/science/nanite) "kzW" = ( /obj/effect/spawner/lootdrop/garbage_spawner, /obj/effect/decal/cleanable/dirt, @@ -38299,13 +38003,6 @@ }, /turf/closed/wall/r_wall, /area/engineering/supermatter) -"kDj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/white, -/area/medical/medbay/central) "kDm" = ( /obj/structure/chair/plastic{ dir = 1 @@ -38399,6 +38096,16 @@ }, /turf/open/floor/engine/vacuum, /area/engineering/atmos) +"kEQ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/commons/lounge) "kFd" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/north, @@ -39285,14 +38992,6 @@ }, /turf/open/floor/engine, /area/engineering/supermatter/room) -"kXA" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/cargo/qm) "kXD" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -41034,6 +40733,13 @@ }, /turf/open/floor/iron, /area/cargo/storage) +"lCz" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/grimy, +/area/hallway/secondary/entry) "lCG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -41146,6 +40852,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/security/prison) +"lGl" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/head/welding, +/obj/item/clothing/glasses/welding, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/science/robotics/lab) "lGw" = ( /obj/machinery/door/airlock/security{ name = "Permanent Cell 5" @@ -43048,6 +42766,25 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/white, /area/medical/medbay/central) +"mvS" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/obj/effect/landmark/start/hangover, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/hallway/primary/port) "mvV" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/effect/landmark/start/geneticist, @@ -43225,17 +42962,6 @@ }, /turf/open/floor/iron/dark, /area/command/teleporter) -"mzy" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/structure/rack, -/obj/machinery/light/directional/south, -/obj/item/controller, -/obj/item/compact_remote, -/obj/item/compact_remote, -/turf/open/floor/iron, -/area/science/misc_lab) "mzF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, @@ -44753,6 +44479,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/maintenance/port/fore) +"nie" = ( +/obj/machinery/biogenerator, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/service/hydroponics/garden) "niO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 @@ -44766,16 +44500,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat_interior) -"nju" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/commons/lounge) "njM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -44799,21 +44523,6 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/commons/locker) -"nkz" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "nkC" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -44927,6 +44636,18 @@ }, /turf/open/floor/iron/dark, /area/command/bridge) +"nnC" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Science - Lower Main South"; + dir = 6; + network = list("ss13","science") + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/science/research) "nnQ" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access"; @@ -45104,6 +44825,11 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron, /area/science/lab) +"nrv" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/service/library) "nrF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -47427,6 +47153,20 @@ }, /turf/open/floor/iron, /area/ai_monitored/command/storage/eva) +"ond" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/light/directional/west, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/commons/dorms) "one" = ( /turf/closed/wall/r_wall, /area/engineering/atmos) @@ -48429,15 +48169,6 @@ }, /turf/open/floor/iron/dark, /area/ai_monitored/security/armory) -"oHX" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/structure/rack, -/obj/item/integrated_circuit/loaded/speech_relay, -/obj/item/integrated_circuit/loaded/hello_world, -/turf/open/floor/iron, -/area/science/misc_lab) "oIj" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -48816,6 +48547,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/central) +"oPN" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/structure/rack, +/obj/machinery/light/directional/south, +/obj/item/controller, +/obj/item/compact_remote, +/obj/item/integrated_circuit/loaded/hello_world, +/obj/item/integrated_circuit/loaded/speech_relay, +/obj/item/compact_remote, +/turf/open/floor/iron, +/area/science/misc_lab) "oPY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -49103,20 +48847,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/security/brig) -"oUr" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/dark, -/area/service/bar) "oUw" = ( /obj/structure/table, /obj/item/stock_parts/scanning_module{ @@ -49681,11 +49411,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/engineering/atmospherics_engine) -"pfi" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/science/nanite) "pfo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 @@ -49855,6 +49580,13 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/central/secondary) +"pie" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/module_duplicator, +/turf/open/floor/iron, +/area/science/misc_lab) "pil" = ( /obj/structure/railing/corner{ dir = 1 @@ -51405,6 +51137,16 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/maintenance/central) +"pNm" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/hallway/primary/tram/center) "pNt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51769,6 +51511,13 @@ }, /turf/open/floor/iron, /area/hallway/primary/tram/left) +"pTk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/medical/medbay/central) "pTG" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -51793,10 +51542,6 @@ }, /turf/open/floor/iron/dark, /area/security/brig) -"pUB" = ( -/obj/machinery/computer/nanite_cloud_controller, -/turf/open/floor/circuit/green, -/area/science/nanite) "pUM" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, @@ -52054,16 +51799,6 @@ }, /turf/open/floor/iron, /area/security/prison) -"qab" = ( -/obj/structure/cable, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/machinery/light_switch/directional/north{ - pixel_x = 12 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/command/heads_quarters/rd) "qan" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -52101,6 +51836,23 @@ /obj/effect/spawner/lootdrop/food_packaging, /turf/open/floor/plating, /area/maintenance/starboard/central) +"qbv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/hallway/secondary/construction/engineering) "qbC" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -52253,6 +52005,24 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"qeq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/multitool, +/obj/machinery/camera/emp_proof{ + c_tag = "Secure - Telecomms Control Room"; + dir = 6 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/tcommsat/computer) "qes" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -52405,14 +52175,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, /area/mine/explored) -"qiA" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/cargo/miningdock) "qiW" = ( /turf/open/floor/iron, /area/security/processing) @@ -53663,6 +53425,16 @@ }, /turf/open/floor/iron/dark, /area/tcommsat/computer) +"qJo" = ( +/obj/structure/disposalpipe/segment, +/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/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "qJp" = ( /obj/effect/decal/cleanable/dirt, /obj/item/chair, @@ -54433,13 +54205,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /turf/open/floor/iron/white, /area/science/mixing) -"rbD" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "rbI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -55481,26 +55246,6 @@ }, /turf/open/floor/iron, /area/security/office) -"rwO" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "rwY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 @@ -58923,6 +58668,20 @@ }, /turf/open/floor/iron, /area/hallway/secondary/construction/engineering) +"sPg" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/science/research) "sPj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -61406,12 +61165,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/maintenance/disposal) -"tJq" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "tJC" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -61747,16 +61500,6 @@ }, /turf/open/floor/iron, /area/engineering/atmos) -"tOO" = ( -/obj/machinery/door/airlock/research{ - name = "Nanite Laboratory"; - req_one_access_txt = "7" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/science/nanite) "tOS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -61891,17 +61634,6 @@ }, /turf/open/floor/iron, /area/service/hydroponics/garden) -"tRs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron, -/area/engineering/main) "tRt" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -62809,19 +62541,6 @@ }, /turf/open/floor/vault, /area/hallway/primary/tram/center) -"uhs" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/newscaster/security_unit/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/commons/dorms) "uht" = ( /turf/closed/wall, /area/medical/treatment_center) @@ -62859,6 +62578,17 @@ }, /turf/open/floor/iron, /area/maintenance/tram/right) +"uiu" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/west, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/engineering/atmos) "uiJ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -63130,6 +62860,16 @@ /obj/structure/railing, /turf/open/floor/plating, /area/maintenance/tram/right) +"uoz" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/hallway/primary/tram/right) "uoJ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -63420,6 +63160,16 @@ }, /turf/open/floor/carpet, /area/service/library) +"utD" = ( +/obj/structure/cable, +/obj/machinery/light_switch/directional/north{ + pixel_x = 12 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/command/heads_quarters/rd) "utP" = ( /obj/structure/fluff/tram_rail/end{ dir = 8 @@ -64118,16 +63868,6 @@ /obj/item/clothing/mask/breath, /turf/open/floor/iron, /area/engineering/atmos) -"uLU" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/white, -/area/science/lab) "uLZ" = ( /obj/effect/turf_decal/trimline/red/corner, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -64348,20 +64088,6 @@ "uQe" = ( /turf/open/floor/plating, /area/science/mixing) -"uQm" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/science/nanite) "uQq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -64371,24 +64097,11 @@ }, /turf/open/floor/plating, /area/science/xenobiology) -"uQs" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/machinery/camera/emp_proof{ - c_tag = "Secure - Telecomms Control Room"; - dir = 6 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/tcommsat/computer) +"uQv" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/wood, +/area/service/library) "uQB" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medical Freezer"; @@ -64446,14 +64159,6 @@ icon_state = "wood-broken3" }, /area/maintenance/central) -"uRy" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/dark, -/area/science/nanite) "uRU" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -64465,6 +64170,28 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/commons/dorms) +"uRZ" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/camera{ + c_tag = "Civilian - Lounge South"; + dir = 6 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/commons/lounge) "uSn" = ( /obj/machinery/door/airlock/hatch, /obj/effect/decal/cleanable/dirt, @@ -65076,10 +64803,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/starboard/central) -"vfl" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/circuit/green, -/area/science/nanite) "vfo" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -65723,6 +65446,16 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/security/interrogation) +"vqD" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/green/filled/warning{ + dir = 5 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/hallway/primary/port) "vrc" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/iron/dark/telecomms, @@ -65798,19 +65531,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/maintenance/starboard/secondary) -"vux" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/science/nanite) "vuO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -66163,20 +65883,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) -"vDR" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/science/research) "vDX" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -67650,18 +67356,6 @@ }, /turf/open/floor/iron/white, /area/medical/medbay/central) -"wdt" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/electrical, -/obj/item/clothing/head/welding, -/obj/item/clothing/glasses/welding, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron/dark, -/area/science/robotics/lab) "wdJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -67770,23 +67464,6 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/cargo/miningdock) -"wfD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/machinery/newscaster/security_unit/directional/north, -/turf/open/floor/iron, -/area/hallway/secondary/construction/engineering) "wfN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 9 @@ -68165,6 +67842,12 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/hallway/secondary/entry) +"wmU" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/hallway/primary/tram/left) "wnM" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -68572,6 +68255,13 @@ }, /turf/open/floor/iron/dark, /area/service/hydroponics) +"wuT" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/hallway/primary/tram/left) "wuW" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -69763,6 +69453,10 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, /area/tcommsat/computer) +"wOc" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/service/chapel) "wOm" = ( /obj/structure/table, /obj/machinery/light/directional/north, @@ -70654,28 +70348,6 @@ }, /turf/open/floor/plating/airless, /area/mine/explored) -"xib" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/newscaster/security_unit/directional/north, -/obj/machinery/camera{ - c_tag = "Civilian - Lounge South"; - dir = 6 - }, -/turf/open/floor/iron, -/area/commons/lounge) "xif" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -72538,6 +72210,18 @@ }, /turf/open/floor/iron, /area/hallway/primary/tram/right) +"xQT" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/science/robotics/lab) "xQU" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -72937,6 +72621,14 @@ }, /turf/open/floor/iron, /area/engineering/atmos) +"xXj" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/cargo/qm) "xXn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -88974,7 +88666,7 @@ aCa arm aqW awG -emO +bQd aeB bfh jIX @@ -91796,7 +91488,7 @@ fyx ahI lmq aCa -aqf +uQv rBn dQU ahj @@ -91806,7 +91498,7 @@ ufR aeQ dQU jBt -afR +nrv aCa rCB fNa @@ -92548,7 +92240,7 @@ aXi aXi aXi aej -oUr +bdd aLM aej aae @@ -94362,7 +94054,7 @@ aMK ldH aNF aOP -nju +kEQ jAa aQb aQy @@ -95411,7 +95103,7 @@ aOP aOP aOP aOP -xib +uRZ itG arc aUD @@ -98202,7 +97894,7 @@ aam aam aam aej -cII +bum aLM aej cIH @@ -100284,7 +99976,7 @@ awp ann cRi ain -aEo +wOc axc axc axc @@ -100553,7 +100245,7 @@ nSi guA xBP sXN -uQs +qeq tYP pcR tnM @@ -103372,7 +103064,7 @@ awy awy awy aUb -dkt +gqH aln kZF aIG @@ -103633,7 +103325,7 @@ aUb aUb aUb aIG -tRs +gGs iTQ nsJ lAN @@ -105164,7 +104856,7 @@ ahg dCy iiQ afB -wfD +qbv aim iXL ntM @@ -105915,7 +105607,7 @@ aBM aBM aBM aiF -ajj +jtT cuP akO alh @@ -106195,7 +105887,7 @@ afB fxN gcl iXL -gXR +bAL gOs kSp vNq @@ -106720,7 +106412,7 @@ uYT imM viG otN -idv +uiu pJF pVU kIo @@ -115403,7 +115095,7 @@ aae aae aae sHb -qiA +ffr svb bWH aht @@ -115441,7 +115133,7 @@ adS vkh ifA xaQ -fat +ewP uJg gJC awJ @@ -116481,7 +116173,7 @@ bJd bJd bJd bJd -ixu +nnC vyG fls aRL @@ -119580,7 +119272,7 @@ xVI omI kgw nAo -oHX +pie der mkm czI @@ -119837,7 +119529,7 @@ pft ixB utS vVw -mzy +oPN der der der @@ -155534,7 +155226,7 @@ dDP koi jKC aGt -byG +nie abG yee yee @@ -156037,7 +155729,7 @@ oev aBa erb tjo -aDp +lCz tpy aFB tjo @@ -158084,7 +157776,7 @@ ahu ahu ahu aak -ajT +mvS akz alV iZU @@ -158869,7 +158561,7 @@ azw axV axV aEX -aCU +jCN aEx anG iSC @@ -159607,7 +159299,7 @@ aae aae aak aak -abe +vqD act adf adK @@ -159655,7 +159347,7 @@ wBq sXx sXx vkV -uhs +iiG kGg uRU aOb @@ -159888,7 +159580,7 @@ aGY auf aGY aGY -aqo +wuT auY awK axX @@ -161954,7 +161646,7 @@ qbg axX aBH bxq -aEK +wmU aJV aJV pwy @@ -162177,7 +161869,7 @@ aae aae aak aak -abi +gGD acv adl adM @@ -162225,7 +161917,7 @@ kqJ qhf qhf kqJ -fIg +ond iiX dGK aOb @@ -162973,7 +162665,7 @@ ptd aZQ aZQ ara -avj +hdD aEn axZ aYE @@ -163462,7 +163154,7 @@ aae aae aae aFF -aAs +iWB epC bTH wQD @@ -163475,7 +163167,7 @@ aFF api doY aep -aBS +aWS abW ahu ahu @@ -164760,7 +164452,7 @@ aFF aJc aBE ahv -awX +djm abW aae aae @@ -165004,7 +164696,7 @@ aae ccM ccM aFF -ace +ghR aSe jiB oXV @@ -169149,7 +168841,7 @@ iBv ibO ayf aFa -aDo +pNm iUK avn avn @@ -170200,7 +169892,7 @@ aIk uYR uht uht -kDj +pTk dJz xCV jyn @@ -172244,7 +171936,7 @@ nbz nbz aHr eLP -cdt +iLM uht uht qch @@ -173253,7 +172945,7 @@ bhS aLX xyy atB -avX +czW aEy ayn uZH @@ -173787,7 +173479,7 @@ rKf kdk vKS eVQ -aHM +bav adD hVT aez @@ -176633,7 +176325,7 @@ agq lbM jwN sYs -agq +aae aae aae aae @@ -176890,7 +176582,7 @@ jOR wEN fwP fwP -agq +aae aae aae aae @@ -177135,7 +176827,7 @@ aae aae aae aae -agq +aae lbM agq xCz @@ -177146,8 +176838,8 @@ fwP jOR aEg lAc -agq -agq +aae +aae aae aae aae @@ -177383,7 +177075,7 @@ aBM aae aae dyg -ist +xQT hHc ooo cVj @@ -177403,8 +177095,8 @@ wWv jOR aEg hYK -abP -agq +eWl +aae aae aae aae @@ -177652,16 +177344,16 @@ aae lbM tAu sYs -agq -agq +aae +aae wEN oWE lbM jOR -agq -agq -agq -agq +aae +aae +aae +aae aae aae aae @@ -177908,14 +177600,14 @@ dyg aae lbM lbM -ayQ -ayQ -ayQ -ayQ -ayQ -ayQ -ayQ -ayQ +aae +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -178154,7 +177846,7 @@ wbP akA bdB gIt -wdt +lGl tuP aPX kvX @@ -178165,14 +177857,14 @@ dyg aae aae aae -ayQ -bap -auc -alu -bMz -vfl -pUB -ayQ +aae +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -178422,14 +178114,14 @@ dyg aae aae aae -ayQ -anf -dFo -cAT -vux -uQm -gfd -ayQ +aae +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -178679,14 +178371,14 @@ dyg der der der -ayQ -dbl -kzT -cAT -rwO -vux -jqL -ayQ +der +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -178936,14 +178628,14 @@ dyg bwc dCn pto -ayQ -asL -bsR -hPF -baY -bFL -uRy -ayQ +der +aae +aae +aae +aae +aae +aae +aae aae aae aae @@ -179193,13 +178885,13 @@ dyg lSU wtF jhg -ayQ -aIs -rbD -nkz -pfi -tJq -aIT +der +aae +aae +aae +aae +aae +aae lQG lQG lQG @@ -179408,7 +179100,7 @@ gJG okm jZN bSv -kXA +xXj ari scx tEA @@ -179421,7 +179113,7 @@ vfE uEE oDL atP -awe +eCL aEE ayw hlI @@ -179450,13 +179142,13 @@ dyg der jFq der -ayQ -ayQ -btO -hqq -tOO -btO -ayQ +der +der +der +der +der +der +der lQG dGu dGu @@ -179710,8 +179402,8 @@ ydX eaF eaF eaF -vDR -bMh +sPg +qJo fgV czV lQG @@ -180733,7 +180425,7 @@ yju hIG jrL vmv -qab +utD lev lev lev @@ -182008,7 +181700,7 @@ ojc ngB buy kvg -uLU +dZf vLU kkY ply @@ -183541,7 +183233,7 @@ aAS ayA ayA aFi -aEp +uoz aGb aod dCt diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index 66caa5bdf6..d6018a8d8e 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -1,4 +1,4 @@ -#define GET_AI_BEHAVIOR(behavior_type) SSai_controllers.ai_behaviors[behavior_type] +#define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type] #define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) #define AI_STATUS_ON 1 @@ -12,6 +12,10 @@ ///For JPS pathing, the maximum length of a path we'll try to generate. Should be modularized depending on what we're doing later on #define AI_MAX_PATH_LENGTH 30 // 30 is possibly overkill since by default we lose interest after 14 tiles of distance, but this gives wiggle room for weaving around obstacles +///Cooldown on planning if planning failed last time + +#define AI_FAILED_PLANNING_COOLDOWN 1.5 SECONDS + ///Flags for ai_behavior new() #define AI_CONTROLLER_INCOMPATIBLE (1<<0) @@ -20,6 +24,10 @@ ///Does this task let you perform the action while you move closer? (Things like moving and shooting) #define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<1) +///Subtree defines + +///This subtree should cancel any further planning, (Including from other subtrees) +#define SUBTREE_RETURN_FINISH_PLANNING 1 // Monkey AI controller blackboard keys diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 6495c88136..855e4d7242 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -38,8 +38,6 @@ #define GLAND_HUD "17" #define SENTIENT_DISEASE_HUD "18" #define AI_DETECT_HUD "19" -#define NANITE_HUD "20" -#define DIAG_NANITE_FULL_HUD "21" /// Displays launchpads' targeting reticle #define DIAG_LAUNCHPAD_HUD "22" //for antag huds. these are used at the /mob level diff --git a/code/__DEFINES/botany.dm b/code/__DEFINES/botany.dm index 20371614bd..01e3803150 100644 --- a/code/__DEFINES/botany.dm +++ b/code/__DEFINES/botany.dm @@ -64,3 +64,7 @@ #define REAGENT_TRANSFER_ID (1<<5) /// Plants that have a unique effect on attack_self. #define ATTACK_SELF_ID (1<<6) + +#define GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR 10 +#define GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM 0.2 +#define GLOWSHROOM_BASE_INTEGRITY 60 diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index a33ff8b10c..b625e7fb94 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -515,6 +515,8 @@ ///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) #define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" +///from base of /mob/living/attack_alien(): (user) +#define COMSIG_MOB_ATTACK_ALIEN "mob_attack_alien" ///from base of /mob/throw_item(): (atom/target) #define COMSIG_MOB_THROW "mob_throw" ///from base of /mob/verb/examinate(): (atom/target) @@ -1107,49 +1109,6 @@ ///(customer, container) venue signal sent when a venue sells an item. source is the thing sold, which can be a datum, so we send container for location checks #define COMSIG_ITEM_SOLD_TO_CUSTOMER "item_sold_to_customer" -//Nanites - -///() returns TRUE if nanites are found -#define COMSIG_HAS_NANITES "has_nanites" -///() returns TRUE if nanites have stealth -#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" -///() deletes the nanite component -#define COMSIG_NANITE_DELETE "nanite_delete" -///(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" -///(amount) Returns nanite amount -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" -///(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" -///(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" -///(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" -///(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" -///(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" -///(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" -///(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" -///(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_SIGNAL "nanite_signal" -///(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" -///(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_SCAN "nanite_scan" -///(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" -///(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" - ///Installation successful - #define COMPONENT_PROGRAM_INSTALLED (1<<0) - ///Installation failed, but there are still nanites - #define COMPONENT_PROGRAM_NOT_INSTALLED (1<<1) -///(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component -#define COMSIG_NANITE_SYNC "nanite_sync" - // /datum/component/storage signals ///() - returns bool. @@ -1369,6 +1328,12 @@ /// Cancels the attack chain, but without performing any other action. #define COMSIG_CANCEL_USB_CABLE_ATTACK (1<<2) +/// Called when the circuit component is saved. +#define COMSIG_CIRCUIT_COMPONENT_SAVE "circuit_component_save" + +/// Called when an external object is loaded. +#define COMSIG_MOVABLE_CIRCUIT_LOADED "movable_circuit_loaded" + /// Sent from /obj/structure/industrial_lift/tram when its travelling status updates. (travelling) #define COMSIG_TRAM_SET_TRAVELLING "tram_set_travelling" diff --git a/code/__DEFINES/drone.dm b/code/__DEFINES/drone.dm new file mode 100644 index 0000000000..46c19fdbaf --- /dev/null +++ b/code/__DEFINES/drone.dm @@ -0,0 +1,28 @@ + +/// If drones are blacklisted from certain sensitive machines +GLOBAL_VAR_INIT(drone_machine_blacklist_enabled, TRUE) + +#define DRONE_HANDS_LAYER 1 +#define DRONE_HEAD_LAYER 2 +#define DRONE_TOTAL_LAYERS 2 + +/// Message displayed when new drone spawns in drone network +#define DRONE_NET_CONNECT span_notice("DRONE NETWORK: [name] connected.") +/// Message displayed when drone in network dies +#define DRONE_NET_DISCONNECT span_danger("DRONE NETWORK: [name] is not responding.") + +/// Maintenance Drone icon_state (multiple colors) +#define MAINTDRONE "drone_maint" +/// Repair Drone icon_state +#define REPAIRDRONE "drone_repair" +/// Scout Drone icon_state +#define SCOUTDRONE "drone_scout" +/// Clockwork Drone icon_state +#define CLOCKDRONE "drone_clock" + +/// [MAINTDRONE] hacked icon_state +#define MAINTDRONE_HACKED "drone_maint_red" +/// [REPAIRDRONE] hacked icon_state +#define REPAIRDRONE_HACKED "drone_repair_hacked" +/// [SCOUTDRONE] hacked icon_state +#define SCOUTDRONE_HACKED "drone_scout_hacked" diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 863c65f05c..755f30e908 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -14,7 +14,6 @@ #define INVESTIGATE_HALLUCINATIONS "hallucinations" #define INVESTIGATE_RADIATION "radiation" #define INVESTIGATE_EXONET "exonet" -#define INVESTIGATE_NANITES "nanites" #define INVESTIGATE_PRESENTS "presents" #define INVESTIGATE_HYPERTORUS "hypertorus" #define INVESTIGATE_ACCESSCHANGES "id_card_changes" diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 0958d7472c..6e47918df5 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -41,7 +41,6 @@ #define BIOGENERATOR (1<<4) //Uses biomass #define LIMBGROWER (1<<5) //Uses synthetic flesh #define SMELTER (1<<6) //uses various minerals -#define NANITE_COMPILER (1<<7) //Prints nanite disks /// Protolathes for offstation roles. More limited tech tree. #define AWAY_LATHE (1<<8) /// Imprinters for offstation roles. More limited tech tree. diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bd90150936..6cc07276f5 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -180,15 +180,6 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) //Maximum amount of time, (in deciseconds) a tile can be wet for. #define MAXIMUM_WET_TIME 5 MINUTES -//unmagic-strings for types of polls -#define POLLTYPE_OPTION "OPTION" -#define POLLTYPE_TEXT "TEXT" -#define POLLTYPE_RATING "NUMVAL" -#define POLLTYPE_MULTI "MULTICHOICE" -#define POLLTYPE_IRV "IRV" - - - //subtypesof(), typesof() without the parent path #define subtypesof(typepath) ( typesof(typepath) - typepath ) @@ -494,7 +485,6 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 -#define VOMIT_NANITE 3 //chem grenades defines #define GRENADE_EMPTY 1 diff --git a/code/__DEFINES/nanites.dm b/code/__DEFINES/nanites.dm deleted file mode 100644 index abd2327dd5..0000000000 --- a/code/__DEFINES/nanites.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define NANITE_SYNC_DELAY 300 - -#define NANITE_SHOCK_IMMUNE 1 -#define NANITE_EMP_IMMUNE 2 - -#define NANITE_PROGRAM_LIMIT 20 - - -#define NANITE_BASE_RESEARCH 3.5 - -#define NANITE_CLOUD_TOGGLE 1 -#define NANITE_CLOUD_DISABLE 2 -#define NANITE_CLOUD_ENABLE 3 - -//Nanite excess thresholds -#define NANITE_EXCESS_MINOR 25 -#define NANITE_EXCESS_VOMIT 100 -#define NANITE_EXCESS_BURST 350 - -///Nanite Protocol types -#define NANITE_PROTOCOL_REPLICATION "nanite_replication" -#define NANITE_PROTOCOL_STORAGE "nanite_storage" - -///Nanite extra settings types: used to help uis know what type an extra setting is -#define NESTYPE_TEXT "text" -#define NESTYPE_NUMBER "number" -#define NESTYPE_TYPE "type" -#define NESTYPE_BOOLEAN "boolean" - -///Nanite Extra Settings - Note that these will also be the names displayed in the UI -#define NES_SENT_CODE "Sent Code" -#define NES_DELAY "Delay" -#define NES_MODE "Mode" -#define NES_COMM_CODE "Comm Code" -#define NES_RELAY_CHANNEL "Relay Channel" -#define NES_HEALTH_PERCENT "Health Percent" -#define NES_DIRECTION "Direction" -#define NES_NANITE_PERCENT "Nanite Percent" -#define NES_DAMAGE_TYPE "Damage Type" -#define NES_DAMAGE "Damage" -#define NES_SENTENCE "Sentence" -#define NES_MESSAGE "Message" -#define NES_DIRECTIVE "Directive" -#define NES_INCLUSIVE_MODE "Inclusive Mode" -#define NES_RACE "Race" -#define NES_HALLUCINATION_TYPE "Hallucination Type" -#define NES_HALLUCINATION_DETAIL "Hallucination Detail" -#define NES_MOOD_MESSAGE "Mood Message" -#define NES_PROGRAM_OVERWRITE "Program Overwrite" -#define NES_CLOUD_OVERWRITE "Cloud Overwrite" -#define NES_SCAN_TYPE "Scan Type" -#define NES_BUTTON_NAME "Button Name" -#define NES_ICON "Icon" diff --git a/code/__DEFINES/polls.dm b/code/__DEFINES/polls.dm new file mode 100644 index 0000000000..a5a0616d8d --- /dev/null +++ b/code/__DEFINES/polls.dm @@ -0,0 +1,7 @@ + +//unmagic-strings for types of polls +#define POLLTYPE_OPTION "OPTION" +#define POLLTYPE_TEXT "TEXT" +#define POLLTYPE_RATING "NUMVAL" +#define POLLTYPE_MULTI "MULTICHOICE" +#define POLLTYPE_IRV "IRV" diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index 7c5c2d0a82..ec8888c43a 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -7,3 +7,12 @@ #define SOLAR_TRACK_OFF 0 #define SOLAR_TRACK_TIMED 1 #define SOLAR_TRACK_AUTO 2 + +///conversion ratio from joules to watts +#define WATTS / 0.002 +///conversion ratio from watts to joules +#define JOULES * 0.002 + +GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) + +GLOBAL_LIST_EMPTY(powernets) diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 07137c192f..aecd71092a 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -1,3 +1,6 @@ + +GLOBAL_LIST_EMPTY_TYPED(proj_by_path_key, /obj/projectile) // A list of projectile objects, which are keyed by their path + // check_pierce() return values /// Default behavior: hit and delete self #define PROJECTILE_PIERCE_NONE 0 diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index d8db678bc2..a43053e262 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -22,14 +22,12 @@ //! Techweb names for new point types. Can be used to define specific point values for specific types of research (science, security, engineering, etc.) #define TECHWEB_POINT_TYPE_GENERIC "General Research" -#define TECHWEB_POINT_TYPE_NANITES "Nanite Research" #define TECHWEB_POINT_TYPE_DEFAULT TECHWEB_POINT_TYPE_GENERIC //! Associative names for techweb point values, see: [all_nodes][code/modules/research/techweb/all_nodes.dm] #define TECHWEB_POINT_TYPE_LIST_ASSOCIATIVE_NAMES list(\ TECHWEB_POINT_TYPE_GENERIC = "General Research",\ - TECHWEB_POINT_TYPE_NANITES = "Nanite Research"\ ) /// Amount of cash you can get from a maxcap diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8aca8dad26..586a49d964 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -170,6 +170,7 @@ #define FIRE_PRIORITY_AIR 20 #define FIRE_PRIORITY_NPC 20 #define FIRE_PRIORITY_NPC_MOVEMENT 21 +#define FIRE_PRIORITY_NPC_ACTIONS 22 #define FIRE_PRIORITY_PROCESS 25 #define FIRE_PRIORITY_THROWING 25 #define FIRE_PRIORITY_REAGENTS 26 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4c740d88bb..c499c088f2 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -293,8 +293,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire" /// Galactic Common Sign Language #define TRAIT_SIGN_LANG "sign_language" -/// The mob's nanites are sending a monitoring signal visible on diag HUD -#define TRAIT_NANITE_MONITORING "nanite_monitoring" /// nobody can use martial arts on this mob #define TRAIT_MARTIAL_ARTS_IMMUNE "martial_arts_immune" /// You've been cursed with a living duffelbag, and can't have more added @@ -598,7 +596,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define GENETICS_SPELL "genetics_spell" #define EYES_COVERED "eyes_covered" #define HYPNOCHAIR_TRAIT "hypnochair" -#define NANITES_TRAIT "nanites" #define FLASHLIGHT_EYES "flashlight_eyes" #define IMPURE_OCULINE "impure_oculine" #define BLINDFOLD_TRAIT "blindfolded" diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index 05d30d4359..70182fcc15 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -138,5 +138,7 @@ #define CIRCUIT_FLAG_INPUT_SIGNAL (1<<0) /// Creates an output trigger that sends a pulse whenever the component is successfully triggered #define CIRCUIT_FLAG_OUTPUT_SIGNAL (1<<1) +/// Prohibits the component from being duplicated via the module duplicator +#define CIRCUIT_FLAG_UNDUPEABLE (1<<2) /// This circuit component does not show in the menu. -#define CIRCUIT_FLAG_HIDDEN (1<<2) +#define CIRCUIT_FLAG_HIDDEN (1<<3) diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 3b9d35243f..144f127e3b 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -1,3 +1,11 @@ + +/** + * For FTP requests. (i.e. downloading runtime logs.) + * + * However it'd be ok to use for accessing attack logs and such too, which are even laggier. + */ +GLOBAL_VAR_INIT(fileaccess_timer, 0) + /client/proc/browse_files(root_type=BROWSE_ROOT_ALL_LOGS, max_iterations=10, list/valid_extensions=list("txt","log","htm", "html")) // wow why was this ever a parameter var/root = "data/logs/" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 7d1cd02fc4..99aff26872 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -369,7 +369,7 @@ if(flashwindow) window_flash(M.client) var/list/answers = ignore_category ? list("Yes", "No", "Never for this round") : list("Yes", "No") - switch(tgui_alert(M, Question, "A limited-time offer!", answers, timeout=poll_time)) + switch(tgui_alert(M, Question, "A limited-time offer!", answers, poll_time, autofocus = FALSE)) if("Yes") to_chat(M, span_notice("Choice registered: Yes.")) if(time_passed + poll_time <= world.time) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm index 06388051a3..7ae72c3fa2 100644 --- a/code/__HELPERS/path.dm +++ b/code/__HELPERS/path.dm @@ -16,8 +16,9 @@ * * id: An ID card representing what access we have and what doors we can open. Its location relative to the pathing atom is irrelevant * * simulated_only: Whether we consider turfs without atmos simulation (AKA do we want to ignore space) * * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf + * * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures. */ -/proc/get_path_to(caller, end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude) +/proc/get_path_to(caller, end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE) if(!caller || !get_turf(end)) return @@ -34,6 +35,8 @@ SSpathfinder.mobs.found(l) if(!path) path = list() + if(length(path) > 0 && skip_first) + path.Cut(1,2) return path /** diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2cdf763d8d..411c4f148d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -315,10 +315,10 @@ Turf and target are separate in case you want to teleport some distance from a t // Format an energy value measured in Power Cell units. /proc/DisplayEnergy(units) // APCs process every (SSmachines.wait * 0.1) seconds, and turn 1 W of - // excess power into GLOB.CELLRATE energy units when charging cells. + // excess power into watts when charging cells. // With the current configuration of wait=20 and CELLRATE=0.002, this // means that one unit is 1 kJ. - return DisplayJoules(units * SSmachines.wait * 0.1 / GLOB.CELLRATE) + return DisplayJoules(units * SSmachines.wait * 0.1 WATTS) /proc/get_mob_by_ckey(key) if(!key) diff --git a/code/_globalvars/lists/admin.dm b/code/_globalvars/admin.dm similarity index 86% rename from code/_globalvars/lists/admin.dm rename to code/_globalvars/admin.dm index f2e08ec085..f614061366 100644 --- a/code/_globalvars/lists/admin.dm +++ b/code/_globalvars/admin.dm @@ -10,3 +10,5 @@ GLOBAL_VAR(stickbanadminexemptiontimerid) //stores the timerid of the callback t return smites GLOBAL_LIST_INIT_TYPED(smites, /datum/smite, init_smites()) + +GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when joining the server diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 14ba43ef0e..530542d658 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -314,6 +314,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items list(//misc /obj/item/disk/nuclear/fake = 1, /obj/item/book/granter/crafting_recipe/pipegun_prime = 1, + /obj/item/book/granter/crafting_recipe/trash_cannon = 1, ) = 1, )) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index ff6f2b79b2..1ccd4a338e 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -24,7 +24,7 @@ GLOBAL_LIST_EMPTY(alive_mob_list) //all alive mobs, including clientless. Exclud GLOBAL_LIST_EMPTY(suicided_mob_list) //contains a list of all mobs that suicided, including their associated ghosts. GLOBAL_LIST_EMPTY(drones_list) GLOBAL_LIST_EMPTY(dead_mob_list) //all dead mobs, including clientless. Excludes /mob/dead/new_player -GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin. +GLOBAL_LIST_EMPTY(joined_player_list) //all ckeys that have joined the game at round-start or as a latejoin. GLOBAL_LIST_EMPTY(new_player_list) //all /mob/dead/new_player, in theory all should have clients and those that don't are in the process of spawning and get deleted when done. GLOBAL_LIST_EMPTY(pre_setup_antags) //minds that have been picked as antag by the gamemode. removed as antag datums are set. GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs @@ -39,7 +39,6 @@ GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs GLOBAL_LIST_EMPTY(bots_list) GLOBAL_LIST_EMPTY(aiEyes) GLOBAL_LIST_EMPTY(suit_sensors_list) //all people with suit sensors on -GLOBAL_LIST_EMPTY(nanite_sensors_list) //app people with nanite monitoring program /// All alive mobs with clients. GLOBAL_LIST_EMPTY(alive_player_list) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm deleted file mode 100644 index 32cec5cd52..0000000000 --- a/code/_globalvars/misc.dm +++ /dev/null @@ -1,38 +0,0 @@ -GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when joining the server - -GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the host computer) and 0 world.ticks. - -GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY")) -GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? - - // For FTP requests. (i.e. downloading runtime logs.) - // However it'd be ok to use for accessing attack logs and such too, which are even laggier. -GLOBAL_VAR_INIT(fileaccess_timer, 0) - -GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) - -GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule -GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second) - -GLOBAL_LIST_EMPTY(powernets) - -GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes - -GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details - -///All currently running polls held as datums -GLOBAL_LIST_EMPTY(polls) -GLOBAL_PROTECT(polls) - -///All poll option datums of running polls -GLOBAL_LIST_EMPTY(poll_options) -GLOBAL_PROTECT(poll_options) - -GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag) - -GLOBAL_VAR_INIT(glowshrooms, 0) - -/// If drones are blacklisted from certain sensitive machines -GLOBAL_VAR_INIT(drone_machine_blacklist_enabled, TRUE) - -GLOBAL_LIST_EMPTY_TYPED(proj_by_path_key, /obj/projectile) // A list of projectile objects, which are keyed by their path diff --git a/code/_globalvars/time_vars.dm b/code/_globalvars/time_vars.dm new file mode 100644 index 0000000000..cc83072114 --- /dev/null +++ b/code/_globalvars/time_vars.dm @@ -0,0 +1,6 @@ + +/// The difference betwen midnight (of the host computer) and 0 world.ticks. +GLOBAL_VAR_INIT(timezoneOffset, 0) + +GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY")) +GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013??? diff --git a/code/controllers/subsystem/ai_controllers.dm b/code/controllers/subsystem/ai_controllers.dm new file mode 100644 index 0000000000..5319d7316f --- /dev/null +++ b/code/controllers/subsystem/ai_controllers.dm @@ -0,0 +1,33 @@ +/// The subsystem used to tick [/datum/ai_controllers] instances. Handling the re-checking of plans. +SUBSYSTEM_DEF(ai_controllers) + name = "AI Controller Ticker" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + init_order = INIT_ORDER_AI_CONTROLLERS + wait = 0.5 SECONDS //Plan every half second if required, not great not terrible. + + ///List of all ai_subtree singletons, key is the typepath while assigned value is a newly created instance of the typepath. See setup_subtrees() + var/list/ai_subtrees = list() + ///List of all ai controllers currently running + var/list/active_ai_controllers = list() + +/datum/controller/subsystem/ai_controllers/Initialize(timeofday) + setup_subtrees() + return ..() + +/datum/controller/subsystem/ai_controllers/proc/setup_subtrees() + ai_subtrees = list() + for(var/subtree_type in subtypesof(/datum/ai_planning_subtree)) + var/datum/ai_planning_subtree/subtree = new subtree_type + ai_subtrees[subtree_type] = subtree + +/datum/controller/subsystem/ai_controllers/fire(resumed) + for(var/datum/ai_controller/ai_controller as anything in active_ai_controllers) + if(!COOLDOWN_FINISHED(ai_controller, failed_planning_cooldown)) + continue + + if(!LAZYLEN(ai_controller.current_behaviors)) + ai_controller.SelectBehaviors(wait * 0.1) + if(!LAZYLEN(ai_controller.current_behaviors)) //Still no plan + COOLDOWN_START(ai_controller, failed_planning_cooldown, AI_FAILED_PLANNING_COOLDOWN) diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 7f56fd9564..6810725442 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -414,7 +414,7 @@ SUBSYSTEM_DEF(explosions) /// The probability that a distant explosion SFX will be a far explosion sound rather than an echo. (0-100) #define FAR_SOUND_PROB 75 /// The upper limit on screenshake amplitude for nearby explosions. -#define NEAR_SHAKE_CAP 7 +#define NEAR_SHAKE_CAP 5 /// The upper limit on screenshake amplifude for distant explosions. #define FAR_SHAKE_CAP 1.5 /// The duration of the screenshake for nearby explosions. @@ -458,9 +458,9 @@ SUBSYSTEM_DEF(explosions) continue var/distance = get_dist(epicenter, listener_turf) - var/base_shake_amount - if(near_distance > distance) - base_shake_amount = sqrt((near_distance - distance) / 10) + if(epicenter == listener_turf) + distance = 0 + var/base_shake_amount = sqrt(near_distance / (distance + 1)) if(distance <= round(near_distance + world.view - 2, 1)) // If you are close enough to see the effects of the explosion first-hand (ignoring walls) listener.playsound_local(epicenter, null, 100, TRUE, frequency, S = near_sound) @@ -477,16 +477,14 @@ SUBSYSTEM_DEF(explosions) listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, S = echo_sound, distance_multiplier = 0) if(base_shake_amount || quake_factor) - if(!base_shake_amount) // Devastating explosions rock the station and ground - base_shake_amount = quake_factor * 3 - shake_camera(listener, FAR_SHAKE_DURATION, clamp(base_shake_amount / 4, 0, FAR_SHAKE_CAP)) + base_shake_amount = max(base_shake_amount, quake_factor * 3, 0) // Devastating explosions rock the station and ground + shake_camera(listener, FAR_SHAKE_DURATION, min(base_shake_amount, FAR_SHAKE_CAP)) else if(!isspaceturf(listener_turf) && echo_factor) // Big enough explosions echo through the hull. var/echo_volume if(quake_factor) - base_shake_amount = quake_factor echo_volume = 60 - shake_camera(listener, FAR_SHAKE_DURATION, clamp(base_shake_amount / 4, 0, FAR_SHAKE_CAP)) + shake_camera(listener, FAR_SHAKE_DURATION, clamp(quake_factor / 4, 0, FAR_SHAKE_CAP)) else echo_volume = 40 listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, S = echo_sound, distance_multiplier = 0) diff --git a/code/controllers/subsystem/processing/ai_behaviors.dm b/code/controllers/subsystem/processing/ai_behaviors.dm new file mode 100644 index 0000000000..4c98567405 --- /dev/null +++ b/code/controllers/subsystem/processing/ai_behaviors.dm @@ -0,0 +1,20 @@ +/// The subsystem used to tick [/datum/ai_behavior] instances. Handling the individual actions an AI can take like punching someone in the fucking NUTS +PROCESSING_SUBSYSTEM_DEF(ai_behaviors) + name = "AI Behavior Ticker" + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND + priority = FIRE_PRIORITY_NPC_ACTIONS + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + init_order = INIT_ORDER_AI_CONTROLLERS + wait = 1 + ///List of all ai_behavior singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors() + var/list/ai_behaviors + +/datum/controller/subsystem/processing/ai_behaviors/Initialize(timeofday) + SetupAIBehaviors() + return ..() + +/datum/controller/subsystem/processing/ai_behaviors/proc/SetupAIBehaviors() + ai_behaviors = list() + for(var/behavior_type in subtypesof(/datum/ai_behavior)) + var/datum/ai_behavior/ai_behavior = new behavior_type + ai_behaviors[behavior_type] = ai_behavior diff --git a/code/controllers/subsystem/processing/ai_controllers.dm b/code/controllers/subsystem/processing/ai_controllers.dm deleted file mode 100644 index fbdb7adb37..0000000000 --- a/code/controllers/subsystem/processing/ai_controllers.dm +++ /dev/null @@ -1,23 +0,0 @@ -/// The subsystem used to tick [/datum/ai_controllers] instances. Handling the re-checking of plans. -PROCESSING_SUBSYSTEM_DEF(ai_controllers) - name = "AI behavior" - flags = SS_POST_FIRE_TIMING|SS_BACKGROUND - priority = FIRE_PRIORITY_NPC - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - init_order = INIT_ORDER_AI_CONTROLLERS - wait = 8 //Uses the value of CLICK_CD_MELEE because that seemed like a nice standard for the speed of AI behavior - - ///an assoc list of all ai_behaviors by type, to - var/list/ai_behaviors - -/datum/controller/subsystem/processing/ai_controllers/Initialize(timeofday) - SetupAIBehaviors() - return ..() - -/datum/controller/subsystem/processing/ai_controllers/proc/SetupAIBehaviors() - ai_behaviors = list() - for(var/i in subtypesof(/datum/ai_behavior)) - var/datum/ai_behavior/ai_behavior = new i - ai_behaviors[i] = ai_behavior - - diff --git a/code/controllers/subsystem/processing/nanites.dm b/code/controllers/subsystem/processing/nanites.dm deleted file mode 100644 index b8109a904a..0000000000 --- a/code/controllers/subsystem/processing/nanites.dm +++ /dev/null @@ -1,22 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(nanites) - name = "Nanites" - flags = SS_BACKGROUND|SS_POST_FIRE_TIMING|SS_NO_INIT - wait = 1 SECONDS - - var/list/datum/nanite_cloud_backup/cloud_backups = list() - var/list/mob/living/nanite_monitored_mobs = list() - var/list/datum/nanite_program/relay/nanite_relays = list() - var/neural_network_count = 0 - -/datum/controller/subsystem/processing/nanites/proc/check_hardware(datum/nanite_cloud_backup/backup) - if(QDELETED(backup.storage) || (backup.storage.machine_stat & (NOPOWER|BROKEN))) - return FALSE - return TRUE - -/datum/controller/subsystem/processing/nanites/proc/get_cloud_backup(cloud_id, force = FALSE) - for(var/I in cloud_backups) - var/datum/nanite_cloud_backup/backup = I - if(!force && !check_hardware(backup)) - return - if(backup.cloud_id == cloud_id) - return backup diff --git a/code/controllers/subsystem/processing/tramprocess.dm b/code/controllers/subsystem/processing/tramprocess.dm index f72ba30dde..6e1b98ead3 100644 --- a/code/controllers/subsystem/processing/tramprocess.dm +++ b/code/controllers/subsystem/processing/tramprocess.dm @@ -1,5 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(tramprocess) name = "Tram Process" wait = 1 - /// only used on maps with trams, so only enabled by such. + flags = SS_TICKER + // only used on maps with trams, so only enabled by such. can_fire = FALSE diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm index 0ce84505a1..e441236db2 100644 --- a/code/datums/ai/_ai_behavior.dm +++ b/code/datums/ai/_ai_behavior.dm @@ -19,7 +19,7 @@ ///Called when the action is finished. /datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded) - controller.current_behaviors.Remove(src) + LAZYREMOVE(controller.current_behaviors, src) controller.behavior_args -= type if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target. controller.current_movement_target = null diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index d2aee869cc..bcbc063aa4 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -1,6 +1,7 @@ /* AI controllers are a datumized form of AI that simulates the input a player would otherwise give to a atom. What this means is that these datums -have ways of interacting with a specific atom and control it. They posses a blackboard with the information the AI knows and has, and will plan behaviors it will try to execute. +have ways of interacting with a specific atom and control it. They posses a blackboard with the information the AI knows and has, and will plan behaviors it will try to execute through +multiple modular subtrees with behaviors */ /datum/ai_controller @@ -9,7 +10,7 @@ have ways of interacting with a specific atom and control it. They posses a blac ///Bitfield of traits for this AI to handle extra behavior var/ai_traits ///Current actions being performed by the AI. - var/list/current_behaviors = list() + var/list/current_behaviors ///Current actions and their respective last time ran as an assoc list. var/list/behavior_cooldowns = list() ///Current status of AI (OFF/ON) @@ -26,12 +27,20 @@ have ways of interacting with a specific atom and control it. They posses a blac var/continue_processing_when_client = FALSE ///distance to give up on target var/max_target_distance = 14 + ///Cooldown for new plans, to prevent AI from going nuts if it can't think of new plans and looping on end + COOLDOWN_DECLARE(failed_planning_cooldown) + ///All subtrees this AI has available, will run them in order, so make sure they're in the order you want them to run. On initialization of this type, it will start as a typepath(s) and get converted to references of ai_subtrees found in SSai_controllers when init_subtrees() is called + var/list/planning_subtrees + + // Movement related things here ///Reference to the movement datum we use. Is a type on initialize but becomes a ref afterwards. var/datum/ai_movement/ai_movement = /datum/ai_movement/dumb ///Cooldown until next movement COOLDOWN_DECLARE(movement_cooldown) ///Delay between movements. This is on the controller so we can keep the movement datum singleton var/movement_delay = 0.1 SECONDS + + // The variables below are fucking stupid and should be put into the blackboard at some point. ///A list for the path we're currently following, if we're using JPS pathing var/list/movement_path ///Cooldown for JPS movement, how often we're allowed to try making a new path @@ -40,7 +49,9 @@ have ways of interacting with a specific atom and control it. They posses a blac var/paused_until = 0 /datum/ai_controller/New(atom/new_pawn) - ai_movement = SSai_movement.movement_types[ai_movement] + change_ai_movement_type(ai_movement) + init_subtrees() + PossessPawn(new_pawn) /datum/ai_controller/Destroy(force, ...) @@ -48,6 +59,25 @@ have ways of interacting with a specific atom and control it. They posses a blac UnpossessPawn(FALSE) return ..() +///Overrides the current ai_movement of this controller with a new one +/datum/ai_controller/proc/change_ai_movement_type(datum/ai_movement/new_movement) + ai_movement = SSai_movement.movement_types[new_movement] + +///Completely replaces the planning_subtrees with a new set based on argument provided, list provided must contain specifically typepaths +/datum/ai_controller/proc/replace_planning_subtrees(list/typepaths_of_new_subtrees) + planning_subtrees = typepaths_of_new_subtrees + init_subtrees() + +///Loops over the subtrees in planning_subtrees and looks at the ai_controllers to grab a reference, ENSURE planning_subtrees ARE TYPEPATHS AND NOT INSTANCES/REFERENCES BEFORE EXECUTING THIS +/datum/ai_controller/proc/init_subtrees() + if(!LAZYLEN(planning_subtrees)) + return + var/list/temp_subtree_list = list() + for(var/subtree in planning_subtrees) + var/subtree_instance = SSai_controllers.ai_subtrees[subtree] + temp_subtree_list += subtree_instance + planning_subtrees = temp_subtree_list + ///Proc to move from one pawn to another, this will destroy the target's existing controller. /datum/ai_controller/proc/PossessPawn(atom/new_pawn) if(pawn) //Reset any old signals @@ -93,17 +123,16 @@ have ways of interacting with a specific atom and control it. They posses a blac return FALSE return TRUE -/// Generates a plan and see if our existing one is still valid. + +///Runs any actions that are currently running /datum/ai_controller/process(delta_time) if(!able_to_run()) walk(pawn, 0) //stop moving return //this should remove them from processing in the future through event-based stuff. - if(!current_behaviors?.len) - SelectBehaviors(delta_time) - if(!current_behaviors?.len) - PerformIdleBehavior(delta_time) //Do some stupid shit while we have nothing to do - return + if(!LAZYLEN(current_behaviors)) + PerformIdleBehavior(delta_time) //Do some stupid shit while we have nothing to do + return if(current_movement_target && get_dist(pawn, current_movement_target) > max_target_distance) //The distance is out of range CancelActions() @@ -144,7 +173,15 @@ have ways of interacting with a specific atom and control it. They posses a blac ///This is where you decide what actions are taken by the AI. /datum/ai_controller/proc/SelectBehaviors(delta_time) SHOULD_NOT_SLEEP(TRUE) //Fuck you don't sleep in procs like this. - return + if(!COOLDOWN_FINISHED(src, failed_planning_cooldown)) + return FALSE + + LAZYINITLIST(current_behaviors) + + if(LAZYLEN(planning_subtrees)) + for(var/datum/ai_planning_subtree/subtree as anything in planning_subtrees) + if(subtree.SelectBehaviors(src, delta_time) == SUBTREE_RETURN_FINISH_PLANNING) + break ///This proc handles changing ai status, and starts/stops processing if required. /datum/ai_controller/proc/set_ai_status(new_ai_status) @@ -154,9 +191,11 @@ have ways of interacting with a specific atom and control it. They posses a blac ai_status = new_ai_status switch(ai_status) if(AI_STATUS_ON) - START_PROCESSING(SSai_controllers, src) + SSai_controllers.active_ai_controllers += src + START_PROCESSING(SSai_behaviors, src) if(AI_STATUS_OFF) - STOP_PROCESSING(SSai_controllers, src) + STOP_PROCESSING(SSai_behaviors, src) + SSai_controllers.active_ai_controllers -= src CancelActions() /datum/ai_controller/proc/PauseAi(time) @@ -170,7 +209,7 @@ have ways of interacting with a specific atom and control it. They posses a blac arguments[1] = src if(!behavior.setup(arglist(arguments))) return - current_behaviors += behavior + LAZYADD(current_behaviors, behavior) arguments.Cut(1, 2) if(length(arguments)) behavior_args[behavior_type] = arguments @@ -183,6 +222,8 @@ have ways of interacting with a specific atom and control it. They posses a blac behavior.perform(arglist(arguments)) /datum/ai_controller/proc/CancelActions() + if(!LAZYLEN(current_behaviors)) + return for(var/i in current_behaviors) var/datum/ai_behavior/current_behavior = i current_behavior.finish_action(src, FALSE) diff --git a/code/datums/ai/_ai_planning_subtree.dm b/code/datums/ai/_ai_planning_subtree.dm new file mode 100644 index 0000000000..8f186d586a --- /dev/null +++ b/code/datums/ai/_ai_planning_subtree.dm @@ -0,0 +1,6 @@ +///A subtree is attached to a controller and is occasionally called by /ai_controller/SelectBehaviors(), this mainly exists to act as a way to subtype and modify SelectBehaviors() without needing to subtype the ai controller itself +/datum/ai_planning_subtree + +///Determines what behaviors should the controller try processing; if this returns SUBTREE_RETURN_FINISH_PLANNING then the controller won't go through the other subtrees should multiple exist in controller.planning_subtrees +/datum/ai_planning_subtree/proc/SelectBehaviors(datum/ai_controller/controller, delta_time) + return diff --git a/code/datums/ai/bane/bane_controller.dm b/code/datums/ai/bane/bane_controller.dm index 1c9b4d9ce5..8d6820a800 100644 --- a/code/datums/ai/bane/bane_controller.dm +++ b/code/datums/ai/bane/bane_controller.dm @@ -5,6 +5,7 @@ And the only victory you achieved was a lie. Now you understand Gotham is beyond /datum/ai_controller/bane movement_delay = 0.4 SECONDS blackboard = list(BB_BANE_BATMAN = null) + planning_subtrees = list(/datum/ai_planning_subtree/bane_hunting) /datum/ai_controller/bane/TryPossessPawn(atom/new_pawn) if(!isliving(new_pawn)) @@ -16,19 +17,3 @@ And the only victory you achieved was a lie. Now you understand Gotham is beyond if(IS_DEAD_OR_INCAP(living_pawn)) return FALSE return ..() - -/datum/ai_controller/bane/SelectBehaviors(delta_time) - current_behaviors = list() - var/mob/living/batman = blackboard[BB_BANE_BATMAN] - if(!batman) - for(var/mob/living/possibly_the_dark_knight in oview(7, pawn)) - if(IS_DEAD_OR_INCAP(possibly_the_dark_knight)) //I HAVE BROKEN THE BAT - continue - blackboard[BB_BANE_BATMAN] = possibly_the_dark_knight - batman = possibly_the_dark_knight - break - if(batman) - current_movement_target = batman - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/bane) - - diff --git a/code/datums/ai/bane/bane_subtrees.dm b/code/datums/ai/bane/bane_subtrees.dm new file mode 100644 index 0000000000..cd94da40b8 --- /dev/null +++ b/code/datums/ai/bane/bane_subtrees.dm @@ -0,0 +1,14 @@ +///The bat is broken! +/datum/ai_planning_subtree/bane_hunting/SelectBehaviors(datum/ai_controller/controller, delta_time) + var/mob/living/batman = controller.blackboard[BB_BANE_BATMAN] + if(!batman) + for(var/mob/living/possibly_the_dark_knight in oview(7, controller.pawn)) + if(IS_DEAD_OR_INCAP(possibly_the_dark_knight)) //I HAVE BROKEN THE BAT + continue + controller.blackboard[BB_BANE_BATMAN] = possibly_the_dark_knight + batman = possibly_the_dark_knight + break + if(batman) + controller.current_movement_target = batman + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/bane)) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/cursed/cursed_controller.dm b/code/datums/ai/cursed/cursed_controller.dm index f0a33de05a..bc8ee10d62 100644 --- a/code/datums/ai/cursed/cursed_controller.dm +++ b/code/datums/ai/cursed/cursed_controller.dm @@ -12,6 +12,7 @@ BB_TARGET_SLOT, BB_CURSED_THROW_ATTEMPT_COUNT ) + planning_subtrees = list(/datum/ai_planning_subtree/cursed) /datum/ai_controller/cursed/TryPossessPawn(atom/new_pawn) if(!isitem(new_pawn)) @@ -24,23 +25,6 @@ UnregisterSignal(pawn, list(COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_EQUIPPED)) return ..() //Run parent at end -/datum/ai_controller/cursed/SelectBehaviors(delta_time) - current_behaviors = list() - var/obj/item/item_pawn = pawn - - - //make sure we have a target - var/mob/living/carbon/curse_target = blackboard[BB_CURSE_TARGET] - if(!curse_target) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/find_and_set/cursed) - return - //make sure attack is valid - if(get_dist(curse_target, item_pawn) > CURSED_VIEW_RANGE) - blackboard[BB_CURSE_TARGET] = null - return - current_movement_target = curse_target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/cursed) - /datum/ai_controller/cursed/PerformIdleBehavior(delta_time) var/obj/item/item_pawn = pawn if(ismob(item_pawn.loc)) //Being held. dont teleport diff --git a/code/datums/ai/cursed/cursed_subtrees.dm b/code/datums/ai/cursed/cursed_subtrees.dm new file mode 100644 index 0000000000..a692065477 --- /dev/null +++ b/code/datums/ai/cursed/cursed_subtrees.dm @@ -0,0 +1,14 @@ +/datum/ai_planning_subtree/cursed/SelectBehaviors(datum/ai_controller/controller, delta_time) + var/obj/item/item_pawn = controller.pawn + + //make sure we have a target + var/mob/living/carbon/curse_target = controller.blackboard[BB_CURSE_TARGET] + if(!curse_target) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/find_and_set/cursed)) + return + //make sure attack is valid + if(get_dist(curse_target, item_pawn) > CURSED_VIEW_RANGE) + controller.blackboard[BB_CURSE_TARGET] = null + return + controller.current_movement_target = curse_target + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/cursed)) diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index da2ed7b44e..0fc6f0d6db 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -9,10 +9,10 @@ BB_DOG_PLAYING_DEAD = FALSE,\ BB_DOG_HARASS_TARGET = null) ai_movement = /datum/ai_movement/jps + planning_subtrees = list(/datum/ai_planning_subtree/dog) COOLDOWN_DECLARE(heel_cooldown) COOLDOWN_DECLARE(command_cooldown) - COOLDOWN_DECLARE(reset_ignore_cooldown) /datum/ai_controller/dog/process(delta_time) @@ -55,52 +55,6 @@ return simple_pawn.access_card -/datum/ai_controller/dog/SelectBehaviors(delta_time) - current_behaviors = list() - var/mob/living/living_pawn = pawn - - // occasionally reset our ignore list - if(COOLDOWN_FINISHED(src, reset_ignore_cooldown) && length(blackboard[BB_FETCH_IGNORE_LIST])) - COOLDOWN_START(src, reset_ignore_cooldown, AI_FETCH_IGNORE_DURATION) - blackboard[BB_FETCH_IGNORE_LIST] = list() - - // if we were just ordered to heel, chill out for a bit - if(!COOLDOWN_FINISHED(src, heel_cooldown)) - return - - // if we're not already carrying something and we have a fetch target (and we're not already doing something with it), see if we can eat/equip it - if(!blackboard[BB_SIMPLE_CARRY_ITEM] && blackboard[BB_FETCH_TARGET]) - var/atom/movable/interact_target = blackboard[BB_FETCH_TARGET] - if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc))) - current_movement_target = interact_target - if(IS_EDIBLE(interact_target)) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/eat_snack) - else if(isitem(interact_target)) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/simple_equip) - else - blackboard[BB_FETCH_TARGET] = null - blackboard[BB_FETCH_DELIVER_TO] = null - return - - // if we're carrying something and we have a destination to deliver it, do that - if(blackboard[BB_SIMPLE_CARRY_ITEM] && blackboard[BB_FETCH_DELIVER_TO]) - var/atom/return_target = blackboard[BB_FETCH_DELIVER_TO] - if(!can_see(pawn, return_target, length=AI_DOG_VISION_RANGE)) - // if the return target isn't in sight, we'll just forget about it and carry the thing around - blackboard[BB_FETCH_DELIVER_TO] = null - return - current_movement_target = return_target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/deliver_item) - return - - // occasionally see if there's any loose snacks in sight nearby - if(DT_PROB(40, delta_time)) - for(var/obj/item/potential_snack in oview(living_pawn,2)) - if(IS_EDIBLE(potential_snack) && (isturf(potential_snack.loc) || ishuman(potential_snack.loc))) - current_movement_target = potential_snack - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/eat_snack) - return - /datum/ai_controller/dog/PerformIdleBehavior(delta_time) var/mob/living/living_pawn = pawn if(!isturf(living_pawn.loc) || living_pawn.pulledby) @@ -150,7 +104,7 @@ current_movement_target = thrown_thing blackboard[BB_FETCH_TARGET] = thrown_thing blackboard[BB_FETCH_DELIVER_TO] = throwing_datum.thrower - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/fetch) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/fetch)) /// Someone's interacting with us by hand, see if they're being nice or mean /datum/ai_controller/dog/proc/on_attack_hand(datum/source, mob/living/user) @@ -299,7 +253,7 @@ if(COMMAND_DIE) blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE CancelActions() - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/play_dead) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/play_dead)) /// Someone we like is pointing at something, see if it's something we might want to interact with (like if they might want us to fetch something for them) /datum/ai_controller/dog/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable) @@ -330,12 +284,12 @@ blackboard[BB_FETCH_TARGET] = pointed_movable blackboard[BB_FETCH_DELIVER_TO] = pointing_friend if(living_pawn.buckled) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist)//in case they are in bed or something - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/fetch) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/fetch)) if(DOG_COMMAND_ATTACK) pawn.visible_message(span_notice("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and growls intensely!")) current_movement_target = pointed_movable blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(pointed_movable) if(living_pawn.buckled) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist)//in case they are in bed or something - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/harass) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/harass)) diff --git a/code/datums/ai/dog/dog_subtrees.dm b/code/datums/ai/dog/dog_subtrees.dm new file mode 100644 index 0000000000..1eab7b8725 --- /dev/null +++ b/code/datums/ai/dog/dog_subtrees.dm @@ -0,0 +1,40 @@ +/datum/ai_planning_subtree/dog + COOLDOWN_DECLARE(heel_cooldown) + COOLDOWN_DECLARE(reset_ignore_cooldown) + +/datum/ai_planning_subtree/dog/SelectBehaviors(datum/ai_controller/dog/controller, delta_time) + var/mob/living/living_pawn = controller.pawn + + // occasionally reset our ignore list + if(COOLDOWN_FINISHED(src, reset_ignore_cooldown) && length(controller.blackboard[BB_FETCH_IGNORE_LIST])) + COOLDOWN_START(src, reset_ignore_cooldown, AI_FETCH_IGNORE_DURATION) + controller.blackboard[BB_FETCH_IGNORE_LIST] = list() + + // if we were just ordered to heel, chill out for a bit + if(!COOLDOWN_FINISHED(src, heel_cooldown)) + return + + // if we're not already carrying something and we have a fetch target (and we're not already doing something with it), see if we can eat/equip it + if(!controller.blackboard[BB_SIMPLE_CARRY_ITEM] && controller.blackboard[BB_FETCH_TARGET]) + var/atom/movable/interact_target = controller.blackboard[BB_FETCH_TARGET] + if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc))) + controller.current_movement_target = interact_target + if(IS_EDIBLE(interact_target)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/eat_snack)) + else if(isitem(interact_target)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/simple_equip)) + else + controller.blackboard[BB_FETCH_TARGET] = null + controller.blackboard[BB_FETCH_DELIVER_TO] = null + return + + // if we're carrying something and we have a destination to deliver it, do that + if(controller.blackboard[BB_SIMPLE_CARRY_ITEM] && controller.blackboard[BB_FETCH_DELIVER_TO]) + var/atom/return_target = controller.blackboard[BB_FETCH_DELIVER_TO] + if(!can_see(controller.pawn, return_target, length=AI_DOG_VISION_RANGE)) + // if the return target isn't in sight, we'll just forget about it and carry the thing around + controller.blackboard[BB_FETCH_DELIVER_TO] = null + return + controller.current_movement_target = return_target + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/deliver_item)) + return diff --git a/code/datums/ai/hauntium/haunted_controller.dm b/code/datums/ai/hauntium/haunted_controller.dm index 87f4ebfc21..6e9670a85d 100644 --- a/code/datums/ai/hauntium/haunted_controller.dm +++ b/code/datums/ai/hauntium/haunted_controller.dm @@ -4,6 +4,7 @@ blackboard = list(BB_TO_HAUNT_LIST = list(), BB_HAUNT_TARGET, BB_HAUNTED_THROW_ATTEMPT_COUNT) + planning_subtrees = list(/datum/ai_planning_subtree/haunted) /datum/ai_controller/haunted/TryPossessPawn(atom/new_pawn) if(!isitem(new_pawn)) @@ -15,30 +16,6 @@ UnregisterSignal(pawn, COMSIG_ITEM_EQUIPPED) return ..() //Run parent at end -/datum/ai_controller/haunted/SelectBehaviors(delta_time) - current_behaviors = list() - var/obj/item/item_pawn = pawn - - if(ismob(item_pawn.loc)) //We're being held, maybe escape? - if(DT_PROB(HAUNTED_ITEM_ESCAPE_GRASP_CHANCE, delta_time)) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/item_escape_grasp) - return - - if(!DT_PROB(HAUNTED_ITEM_ATTACK_HAUNT_CHANCE, delta_time)) - return - - var/list/to_haunt_list = blackboard[BB_TO_HAUNT_LIST] - - for(var/i in to_haunt_list) - if(to_haunt_list[i] <= 0) - continue - var/mob/living/potential_target = i - if(get_dist(potential_target, item_pawn) <= 7) - blackboard[BB_HAUNT_TARGET] = potential_target - current_movement_target = potential_target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/haunted) - return - /datum/ai_controller/haunted/PerformIdleBehavior(delta_time) var/obj/item/item_pawn = pawn if(ismob(item_pawn.loc)) //Being held. dont teleport diff --git a/code/datums/ai/hauntium/hauntium_subtrees.dm b/code/datums/ai/hauntium/hauntium_subtrees.dm new file mode 100644 index 0000000000..a1b043897b --- /dev/null +++ b/code/datums/ai/hauntium/hauntium_subtrees.dm @@ -0,0 +1,22 @@ +/datum/ai_planning_subtree/haunted/SelectBehaviors(datum/ai_controller/controller, delta_time) + var/obj/item/item_pawn = controller.pawn + + if(ismob(item_pawn.loc)) //We're being held, maybe escape? + if(DT_PROB(HAUNTED_ITEM_ESCAPE_GRASP_CHANCE, delta_time)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_escape_grasp)) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!DT_PROB(HAUNTED_ITEM_ATTACK_HAUNT_CHANCE, delta_time)) + return + + var/list/to_haunt_list = controller.blackboard[BB_TO_HAUNT_LIST] + + for(var/i in to_haunt_list) + if(to_haunt_list[i] <= 0) + continue + var/mob/living/potential_target = i + if(get_dist(potential_target, item_pawn) <= 7) + controller.blackboard[BB_HAUNT_TARGET] = potential_target + controller.current_movement_target = potential_target + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/haunted)) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/hostile/hostile_controller.dm b/code/datums/ai/hostile/hostile_controller.dm index e6681a4127..d4c68c86a6 100644 --- a/code/datums/ai/hostile/hostile_controller.dm +++ b/code/datums/ai/hostile/hostile_controller.dm @@ -41,7 +41,7 @@ return ..() //Run parent at end /datum/ai_controller/hostile_friend/proc/on_prebuckle(mob/source, mob/living/buckler, force, buckle_mob_flags) - if(force) + if(force || ai_status == AI_STATUS_OFF) return if(WEAKREF(buckler) != blackboard[BB_HOSTILE_FRIEND]) return COMPONENT_BLOCK_BUCKLE @@ -114,7 +114,7 @@ if(!COOLDOWN_FINISHED(src, command_cooldown)) return - if(!istype(clicker) || !blackboard[BB_HOSTILE_FRIEND] == WEAKREF(clicker)) + if(!istype(clicker) || blackboard[BB_HOSTILE_FRIEND] == WEAKREF(clicker)) return . = COMPONENT_CANCEL_CLICK_ALT INVOKE_ASYNC(src, .proc/command_radial, clicker) @@ -187,8 +187,8 @@ current_movement_target = commander var/mob/living/living_pawn = pawn if(living_pawn.buckled) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist)//in case they are in bed or something - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/follow) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/follow)) // attack: harass whoever the commander points to if(COMMAND_ATTACK) pawn.visible_message(span_danger("[pawn] [blackboard[BB_HOSTILE_ATTACK_WORD]] at [commander]'s command, and [pawn.p_they()] growl[pawn.p_s()] intensely.")) // imagine getting intimidated by a corgi @@ -218,5 +218,5 @@ current_movement_target = pointed_movable blackboard[BB_ATTACK_TARGET] = WEAKREF(pointed_movable) if(living_pawn.buckled) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist)//in case they are in bed or something - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/attack) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/attack)) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 9641b497d9..921a7b93d2 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -6,6 +6,7 @@ have ways of interacting with a specific mob and control it. /datum/ai_controller/monkey movement_delay = 0.4 SECONDS + planning_subtrees = list(/datum/ai_planning_subtree/monkey_tree) blackboard = list( BB_MONKEY_AGRESSIVE = FALSE, BB_MONKEY_BEST_FORCE_FOUND = 0, @@ -42,6 +43,8 @@ have ways of interacting with a specific mob and control it. RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_paw) + RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_ANIMAL, .proc/on_attack_animal) + RegisterSignal(new_pawn, COMSIG_MOB_ATTACK_ALIEN, .proc/on_attack_alien) RegisterSignal(new_pawn, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) RegisterSignal(new_pawn, COMSIG_ATOM_HITBY, .proc/on_hitby) RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, .proc/on_startpulling) @@ -57,7 +60,7 @@ have ways of interacting with a specific mob and control it. /datum/ai_controller/monkey/UnpossessPawn(destroy) UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_LIVING_START_PULL,\ - COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED, COMSIG_MOB_MOVESPEED_UPDATED)) + COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED, COMSIG_MOB_MOVESPEED_UPDATED, COMSIG_ATOM_ATTACK_ANIMAL, COMSIG_MOB_ATTACK_ALIEN)) RemoveElement(/datum/element/connect_loc_behalf, pawn, loc_connections) return ..() //Run parent at end @@ -78,92 +81,6 @@ have ways of interacting with a specific mob and control it. if(IS_DEAD_OR_INCAP(living_pawn)) return FALSE -/datum/ai_controller/monkey/SelectBehaviors(delta_time) - current_behaviors = list() - var/mob/living/living_pawn = pawn - - if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time)) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO - return //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY. - - var/list/enemies = blackboard[BB_MONKEY_ENEMIES] - - if(HAS_TRAIT(pawn, TRAIT_PACIFISM)) //Not a pacifist? lets try some combat behavior. - return - - var/mob/living/selected_enemy - if(length(enemies) || blackboard[BB_MONKEY_AGRESSIVE]) //We have enemies or are pissed - var/list/valids = list() - for(var/mob/living/possible_enemy in view(MONKEY_ENEMY_VISION, living_pawn)) - if(possible_enemy == living_pawn || (!enemies[possible_enemy] && (!blackboard[BB_MONKEY_AGRESSIVE] || HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey)))) //Are they an enemy? (And do we even care?) - continue - // Weighted list, so the closer they are the more likely they are to be chosen as the enemy - valids[possible_enemy] = CEILING(100 / (get_dist(living_pawn, possible_enemy) || 1), 1) - - selected_enemy = pickweight(valids) - - if(selected_enemy) - if(!selected_enemy.stat) //He's up, get him! - if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle - blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_flee) - return //I'm running fuck you guys - - if(TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing. - return - - blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy - current_movement_target = selected_enemy - if(blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/recruit_monkeys) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/monkey) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_attack_mob) - return //Focus on this - - else //He's down, can we disposal him? - var/obj/machinery/disposal/bodyDisposal = locate(/obj/machinery/disposal/) in view(MONKEY_ENEMY_VISION, living_pawn) - if(bodyDisposal) - blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy - blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/disposal_mob) - return - - if(prob(5)) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/use_in_hand) - - if(selected_enemy || !DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time)) - return - - if(world.time >= blackboard[BB_MONKEY_NEXT_HUNGRY] && TryFindFood()) - return - - if(prob(50)) - var/list/possible_targets = list() - for(var/atom/thing in view(2, living_pawn)) - if(!thing.mouse_opacity) - continue - if(thing.IsObscured()) - continue - possible_targets += thing - var/atom/target = pick(possible_targets) - if(target) - current_movement_target = target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/use_on_object) - return - - if(prob(5) && (locate(/obj/item) in living_pawn.held_items)) - var/list/possible_receivers = list() - for(var/mob/living/candidate in oview(2, pawn)) - possible_receivers += candidate - - if(length(possible_receivers)) - var/mob/living/target = pick(possible_receivers) - current_movement_target = target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/give) - return - - TryFindWeapon() - ///re-used behavior pattern by monkeys for finding a weapon /datum/ai_controller/monkey/proc/TryFindWeapon() var/mob/living/living_pawn = pawn @@ -196,9 +113,9 @@ have ways of interacting with a specific mob and control it. blackboard[BB_MONKEY_PICKUPTARGET] = weapon current_movement_target = weapon if(pickpocket) - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/pickpocket) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/pickpocket)) else - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/ground) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/ground)) return TRUE /// Returns either the best weapon from the given choices or null if held weapons are better @@ -291,16 +208,25 @@ have ways of interacting with a specific mob and control it. if(I.force && I.damtype != STAMINA) retaliate(user) -/datum/ai_controller/monkey/proc/on_attack_hand(datum/source, mob/living/L) +/datum/ai_controller/monkey/proc/on_attack_hand(datum/source, mob/living/user) SIGNAL_HANDLER if(prob(MONKEY_RETALIATE_PROB)) - retaliate(L) + retaliate(user) +/datum/ai_controller/monkey/proc/on_attack_paw(datum/source, mob/living/user) + SIGNAL_HANDLER + if(prob(MONKEY_RETALIATE_PROB)) + retaliate(user) -/datum/ai_controller/monkey/proc/on_attack_paw(datum/source, mob/living/L) +/datum/ai_controller/monkey/proc/on_attack_animal(datum/source, mob/living/user) + SIGNAL_HANDLER + if(user.melee_damage_upper > 0 && prob(MONKEY_RETALIATE_PROB)) + retaliate(user) + +/datum/ai_controller/monkey/proc/on_attack_alien(datum/source, mob/living/user) SIGNAL_HANDLER if(prob(MONKEY_RETALIATE_PROB)) - retaliate(L) + retaliate(user) /datum/ai_controller/monkey/proc/on_bullet_act(datum/source, obj/projectile/Proj) SIGNAL_HANDLER diff --git a/code/datums/ai/monkey/monkey_subtrees.dm b/code/datums/ai/monkey/monkey_subtrees.dm new file mode 100644 index 0000000000..faeb2391ae --- /dev/null +++ b/code/datums/ai/monkey/monkey_subtrees.dm @@ -0,0 +1,84 @@ +/datum/ai_planning_subtree/monkey_tree/SelectBehaviors(datum/ai_controller/monkey/controller, delta_time) + var/mob/living/living_pawn = controller.pawn + + if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist)) //BRO IM ON FUCKING FIRE BRO + return SUBTREE_RETURN_FINISH_PLANNING //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY. + + var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES] + + if(HAS_TRAIT(controller.pawn, TRAIT_PACIFISM)) //Not a pacifist? lets try some combat behavior. + return + + var/mob/living/selected_enemy + if(length(enemies) || controller.blackboard[BB_MONKEY_AGRESSIVE]) //We have enemies or are pissed + var/list/valids = list() + for(var/mob/living/possible_enemy in view(MONKEY_ENEMY_VISION, living_pawn)) + if(possible_enemy == living_pawn || (!enemies[possible_enemy] && (!controller.blackboard[BB_MONKEY_AGRESSIVE] || HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey)))) //Are they an enemy? (And do we even care?) + continue + // Weighted list, so the closer they are the more likely they are to be chosen as the enemy + valids[possible_enemy] = CEILING(100 / (get_dist(living_pawn, possible_enemy) || 1), 1) + + selected_enemy = pickweight(valids) + + if(selected_enemy) + if(!selected_enemy.stat) //He's up, get him! + if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_flee)) + return //I'm running fuck you guys + + if(controller.TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing. + return SUBTREE_RETURN_FINISH_PLANNING + + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + controller.current_movement_target = selected_enemy + if(controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/recruit_monkeys)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/monkey)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_attack_mob)) + return SUBTREE_RETURN_FINISH_PLANNING //Focus on this + + else //He's down, can we disposal him? + var/obj/machinery/disposal/bodyDisposal = locate(/obj/machinery/disposal/) in view(MONKEY_ENEMY_VISION, living_pawn) + if(bodyDisposal) + controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy + controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/disposal_mob)) + return SUBTREE_RETURN_FINISH_PLANNING + + if(prob(5)) + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/use_in_hand)) + + if(selected_enemy || !DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time)) + return + + if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY] && controller.TryFindFood()) + return + + if(prob(50)) + var/list/possible_targets = list() + for(var/atom/thing in view(2, living_pawn)) + if(!thing.mouse_opacity) + continue + if(thing.IsObscured()) + continue + possible_targets += thing + var/atom/target = pick(possible_targets) + if(target) + controller.current_movement_target = target + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/use_on_object)) + return + + if(prob(5) && (locate(/obj/item) in living_pawn.held_items)) + var/list/possible_receivers = list() + for(var/mob/living/candidate in oview(2, controller.pawn)) + possible_receivers += candidate + + if(length(possible_receivers)) + var/mob/living/target = pick(possible_receivers) + controller.current_movement_target = target + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/give)) + return + + controller.TryFindWeapon() diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 015fea1f24..ea05b0fc89 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -19,9 +19,10 @@ // right now I'm just taking the shortest minimum distance of our current behaviors, at some point in the future // we should let whatever sets the current_movement_target also set the min distance and max path length // (or at least cache it on the controller) - for(var/datum/ai_behavior/iter_behavior as anything in controller.current_behaviors) - if(iter_behavior.required_distance < minimum_distance) - minimum_distance = iter_behavior.required_distance + if(LAZYLEN(controller.current_behaviors)) + for(var/datum/ai_behavior/iter_behavior as anything in controller.current_behaviors) + if(iter_behavior.required_distance < minimum_distance) + minimum_distance = iter_behavior.required_distance if(get_dist(movable_pawn, controller.current_movement_target) <= minimum_distance) continue diff --git a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm index 86b617b496..5ed0a4dea3 100644 --- a/code/datums/ai/objects/vending_machines/vending_machine_controller.dm +++ b/code/datums/ai/objects/vending_machines/vending_machine_controller.dm @@ -15,7 +15,7 @@ var/obj/machinery/vending/vendor_pawn = new_pawn vendor_pawn.tiltable = FALSE //Not manually tiltable by hitting it anymore. We are now agressively doing it ourselves. vendor_pawn.AddElement(/datum/element/waddling) - vendor_pawn.AddComponent(/datum/component/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, vary = TRUE) + vendor_pawn.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, vary = TRUE) vendor_pawn.squish_damage = 15 return ..() //Run parent at end @@ -24,7 +24,7 @@ vendor_pawn.tiltable = TRUE vendor_pawn.RemoveElement(/datum/element/waddling) vendor_pawn.squish_damage = initial(vendor_pawn.squish_damage) - qdel(vendor_pawn.GetComponent(/datum/component/footstep)) + RemoveElement(/datum/element/footstep, FOOTSTEP_OBJ_MACHINE, 1, -6, vary = TRUE) return ..() //Run parent at end /datum/ai_controller/vending_machine/SelectBehaviors(delta_time) @@ -34,7 +34,7 @@ if(vendor_pawn.tilted) //We're tilted, try to untilt if(blackboard[BB_VENDING_UNTILT_COOLDOWN] > world.time) return - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_rise_up) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_rise_up)) return else //Not tilted, try to find target to tilt onto. if(blackboard[BB_VENDING_TILT_COOLDOWN] > world.time) @@ -44,6 +44,6 @@ continue current_movement_target = living_target blackboard[BB_VENDING_CURRENT_TARGET] = living_target - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_crush) + LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_crush)) return blackboard[BB_VENDING_TILT_COOLDOWN] = world.time + search_for_enemy_cooldown diff --git a/code/datums/ai/robot_customer/robot_customer_controller.dm b/code/datums/ai/robot_customer/robot_customer_controller.dm index 1ab1e7d535..2c59fe5d94 100644 --- a/code/datums/ai/robot_customer/robot_customer_controller.dm +++ b/code/datums/ai/robot_customer/robot_customer_controller.dm @@ -9,7 +9,7 @@ BB_CUSTOMER_LEAVING = FALSE, BB_CUSTOMER_ATTENDING_VENUE = null, BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE = FALSE) - + planning_subtrees = list(/datum/ai_planning_subtree/robot_customer) /datum/ai_controller/robot_customer/TryPossessPawn(atom/new_pawn) if(!istype(new_pawn, /mob/living/simple_animal/robot_customer)) @@ -23,34 +23,6 @@ UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_ATTACK_HAND)) return ..() //Run parent at end -/datum/ai_controller/robot_customer/SelectBehaviors(delta_time) - current_behaviors = list() - if(blackboard[BB_CUSTOMER_LEAVING]) - var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] - current_movement_target = attending_venue.restaurant_portal - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/leave_venue) - return - - if(blackboard[BB_CUSTOMER_CURRENT_TARGET]) - current_movement_target = blackboard[BB_CUSTOMER_CURRENT_TARGET] - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/robot_customer) - return - - var/obj/my_seat = blackboard[BB_CUSTOMER_MY_SEAT] - - if(!my_seat) //We havn't got a seat yet! find one! - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/find_seat) - return - - current_movement_target = my_seat - - if(!blackboard[BB_CUSTOMER_CURRENT_ORDER]) //We havn't ordered yet even ordered yet. go on! go over there and go do it! - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/order_food) - return - else - current_behaviors += GET_AI_BEHAVIOR(/datum/ai_behavior/wait_for_food) - - /datum/ai_controller/robot_customer/proc/on_attackby(datum/source, obj/item/I, mob/living/user) SIGNAL_HANDLER var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] diff --git a/code/datums/ai/robot_customer/robot_customer_subtrees.dm b/code/datums/ai/robot_customer/robot_customer_subtrees.dm new file mode 100644 index 0000000000..d87643dae7 --- /dev/null +++ b/code/datums/ai/robot_customer/robot_customer_subtrees.dm @@ -0,0 +1,25 @@ +/datum/ai_planning_subtree/robot_customer/SelectBehaviors(datum/ai_controller/controller, delta_time) + if(controller.blackboard[BB_CUSTOMER_LEAVING]) + var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + controller.current_movement_target = attending_venue.restaurant_portal + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/leave_venue)) + return SUBTREE_RETURN_FINISH_PLANNING + + if(controller.blackboard[BB_CUSTOMER_CURRENT_TARGET]) + controller.current_movement_target = controller.blackboard[BB_CUSTOMER_CURRENT_TARGET] + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/robot_customer)) + return SUBTREE_RETURN_FINISH_PLANNING + + var/obj/my_seat = controller.blackboard[BB_CUSTOMER_MY_SEAT] + + if(!my_seat) //We havn't got a seat yet! find one! + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/find_seat)) + return SUBTREE_RETURN_FINISH_PLANNING + + controller.current_movement_target = my_seat + + if(!controller.blackboard[BB_CUSTOMER_CURRENT_ORDER]) //We havn't ordered yet even ordered yet. go on! go over there and go do it! + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/order_food)) + return SUBTREE_RETURN_FINISH_PLANNING + else + LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/wait_for_food)) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index ae175a8af4..5a26c5ac75 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -544,6 +544,32 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON +/datum/crafting_recipe/trash_cannon + name = "Trash Cannon" + always_available = FALSE + tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) + result = /obj/structure/cannon/trash + reqs = list( + /obj/item/melee/skateboard/improvised = 1, + /obj/item/tank/internals/oxygen/red = 1, + /datum/reagent/drug/maint/tar = 15, + /obj/item/restraints/handcuffs/cable = 1, + /obj/item/storage/toolbox = 1, + ) + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/trashball + name = "Trashball" + always_available = FALSE + result = /obj/item/stack/cannonball/trashball + reqs = list( + /obj/item/stack/sheet = 5, + /datum/reagent/consumable/space_cola = 10, + ) + category = CAT_WEAPONRY + subcategory = CAT_AMMO + /datum/crafting_recipe/chainsaw name = "Chainsaw" result = /obj/item/chainsaw diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm deleted file mode 100644 index 01be6039a9..0000000000 --- a/code/datums/components/footstep.dm +++ /dev/null @@ -1,146 +0,0 @@ -///Footstep component. Plays footsteps at parents location when it is appropriate. -/datum/component/footstep - ///How many steps the parent has taken since the last time a footstep was played. - var/steps = 0 - ///volume determines the extra volume of the footstep. This is multiplied by the base volume, should there be one. - var/volume - ///e_range stands for extra range - aka how far the sound can be heard. This is added to the base value and ignored if there isn't a base value. - var/e_range - ///footstep_type is a define which determines what kind of sounds should get chosen. - var/footstep_type - ///This can be a list OR a soundfile OR null. Determines whatever sound gets played. - var/footstep_sounds - ///Whether or not to add variation to the sounds played - var/sound_vary = FALSE - -/datum/component/footstep/Initialize(footstep_type_ = FOOTSTEP_MOB_BAREFOOT, volume_ = 0.5, e_range_ = -8, vary) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - volume = volume_ - e_range = e_range_ - footstep_type = footstep_type_ - sound_vary = vary - switch(footstep_type) - if(FOOTSTEP_MOB_HUMAN) - if(!ishuman(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_humanstep) - return - if(FOOTSTEP_MOB_CLAW) - footstep_sounds = GLOB.clawfootstep - if(FOOTSTEP_MOB_BAREFOOT) - footstep_sounds = GLOB.barefootstep - if(FOOTSTEP_MOB_HEAVY) - footstep_sounds = GLOB.heavyfootstep - if(FOOTSTEP_MOB_SHOE) - footstep_sounds = GLOB.footstep - if(FOOTSTEP_MOB_SLIME) - footstep_sounds = 'sound/effects/footstep/slime1.ogg' - if(FOOTSTEP_OBJ_MACHINE) - footstep_sounds = 'sound/effects/bang.ogg' - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep_machine) //Note that this doesn't get called for humans. - return - if(FOOTSTEP_OBJ_ROBOT) - footstep_sounds = 'sound/effects/tank_treads.ogg' - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep_machine) //Note that this doesn't get called for humans. - return - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/play_simplestep) //Note that this doesn't get called for humans. - -///Prepares a footstep. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open -/datum/component/footstep/proc/prepare_step() - var/turf/open/T = get_turf(parent) - if(!istype(T)) - return - - var/mob/living/LM = parent - - if(!T.footstep || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(LM, TRAIT_IMMOBILIZED)) - return - - if(LM.body_position == LYING_DOWN) //play crawling sound if we're lying - playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1, vary = sound_vary) - return - - if(iscarbon(LM)) - var/mob/living/carbon/C = LM - if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG)) - return - if(C.m_intent == MOVE_INTENT_WALK) - return// stealth - steps++ - - if(steps >= 6) - steps = 0 - - if(steps % 2) - return - - if(steps != 0 && !LM.has_gravity(T)) // don't need to step as often when you hop around - return - return T - -/datum/component/footstep/proc/play_simplestep() - SIGNAL_HANDLER - - var/turf/open/T = prepare_step() - if(!T) - return - if(isfile(footstep_sounds) || istext(footstep_sounds)) - playsound(T, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary) - return - var/turf_footstep - switch(footstep_type) - if(FOOTSTEP_MOB_CLAW) - turf_footstep = T.clawfootstep - if(FOOTSTEP_MOB_BAREFOOT) - turf_footstep = T.barefootstep - if(FOOTSTEP_MOB_HEAVY) - turf_footstep = T.heavyfootstep - if(FOOTSTEP_MOB_SHOE) - turf_footstep = T.footstep - if(!turf_footstep) - return - playsound(T, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary) - -/datum/component/footstep/proc/play_humanstep() - SIGNAL_HANDLER - - if(HAS_TRAIT(parent, TRAIT_SILENT_FOOTSTEPS)) - return - - var/volume_multiplier = 1 - var/range_adjustment = 0 - - if(HAS_TRAIT(parent, TRAIT_LIGHT_STEP)) - volume_multiplier = 0.6 - range_adjustment = -2 - - var/turf/open/T = prepare_step() - if(!T) - return - var/mob/living/carbon/human/H = parent - - if ((H.wear_suit?.body_parts_covered | H.w_uniform?.body_parts_covered | H.shoes?.body_parts_covered) & FEET) - // we are wearing shoes - playsound(T, pick(GLOB.footstep[T.footstep][1]), - GLOB.footstep[T.footstep][2] * volume * volume_multiplier, - TRUE, - GLOB.footstep[T.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) - else - if(H.dna.species.special_step_sounds) - playsound(T, pick(H.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) - else - playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]), - GLOB.barefootstep[T.barefootstep][2] * volume * volume_multiplier, - TRUE, - GLOB.barefootstep[T.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) - - -///Prepares a footstep for machine walking -/datum/component/footstep/proc/play_simplestep_machine() - SIGNAL_HANDLER - - var/turf/open/T = get_turf(parent) - if(!istype(T)) - return - playsound(T, footstep_sounds, 50, falloff_distance = 1, vary = sound_vary) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm deleted file mode 100644 index 4004e1b0a1..0000000000 --- a/code/datums/components/nanites.dm +++ /dev/null @@ -1,479 +0,0 @@ -#define HARMONIC_REGEN_BOOST 0.1 - -/datum/component/nanites - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS - - var/mob/living/host_mob - var/nanite_volume = 100 //amount of nanites in the system, used as fuel for nanite programs - var/max_nanites = 500 //maximum amount of nanites in the system - var/regen_rate = 0.5 //nanites generated per second - var/safety_threshold = 50 //how low nanites will get before they stop processing/triggering - var/cloud_id = 0 //0 if not connected to the cloud, 1-100 to set a determined cloud backup to draw from - var/cloud_active = TRUE //if false, won't sync to the cloud - var/next_sync = 0 - var/list/datum/nanite_program/programs = list() - var/max_programs = NANITE_PROGRAM_LIMIT - - var/list/datum/nanite_program/protocol/protocols = list() ///Separate list of protocol programs, to avoid looping through the whole programs list when cheking for conflicts - var/start_time = 0 ///Timestamp to when the nanites were first inserted in the host - var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans - var/diagnostics = FALSE //if TRUE, displays program list when scanned by nanite scanners - -/datum/component/nanites/Initialize(amount = 100, cloud = 0) - if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup)) - return COMPONENT_INCOMPATIBLE - - nanite_volume = amount - cloud_id = cloud - - //Nanites without hosts are non-interactive through normal means - if(isliving(parent)) - host_mob = parent - - if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) //Shouldn't happen, but this avoids HUD runtimes in case a silicon gets them somehow. - return COMPONENT_INCOMPATIBLE - - start_time = world.time - - host_mob.hud_set_nanite_indicator() - START_PROCESSING(SSnanites, src) - - if(cloud_id && cloud_active) - cloud_sync() - -/datum/component/nanites/RegisterWithParent() - RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites) - RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth) - RegisterSignal(parent, COMSIG_NANITE_DELETE, .proc/delete_nanites) - RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data) - RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs) - RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume) - RegisterSignal(parent, COMSIG_NANITE_ADJUST_VOLUME, .proc/adjust_nanites) - RegisterSignal(parent, COMSIG_NANITE_SET_MAX_VOLUME, .proc/set_max_volume) - RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD, .proc/set_cloud) - RegisterSignal(parent, COMSIG_NANITE_SET_CLOUD_SYNC, .proc/set_cloud_sync) - RegisterSignal(parent, COMSIG_NANITE_SET_SAFETY, .proc/set_safety) - RegisterSignal(parent, COMSIG_NANITE_SET_REGEN, .proc/set_regen) - RegisterSignal(parent, COMSIG_NANITE_ADD_PROGRAM, .proc/add_program) - RegisterSignal(parent, COMSIG_NANITE_SCAN, .proc/nanite_scan) - RegisterSignal(parent, COMSIG_NANITE_SYNC, .proc/sync) - - if(isliving(parent)) - RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/on_emp) - RegisterSignal(parent, COMSIG_LIVING_DEATH, .proc/on_death) - RegisterSignal(parent, COMSIG_MOB_ALLOWED, .proc/check_access) - RegisterSignal(parent, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/on_shock) - RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock) - RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype) - RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal) - RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal) - -/datum/component/nanites/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_HAS_NANITES, - COMSIG_NANITE_IS_STEALTHY, - COMSIG_NANITE_DELETE, - COMSIG_NANITE_UI_DATA, - COMSIG_NANITE_GET_PROGRAMS, - COMSIG_NANITE_SET_VOLUME, - COMSIG_NANITE_ADJUST_VOLUME, - COMSIG_NANITE_SET_MAX_VOLUME, - COMSIG_NANITE_SET_CLOUD, - COMSIG_NANITE_SET_CLOUD_SYNC, - COMSIG_NANITE_SET_SAFETY, - COMSIG_NANITE_SET_REGEN, - COMSIG_NANITE_ADD_PROGRAM, - COMSIG_NANITE_SCAN, - COMSIG_NANITE_SYNC, - COMSIG_ATOM_EMP_ACT, - COMSIG_LIVING_DEATH, - COMSIG_MOB_ALLOWED, - COMSIG_LIVING_ELECTROCUTE_ACT, - COMSIG_LIVING_MINOR_SHOCK, - COMSIG_MOVABLE_HEAR, - COMSIG_SPECIES_GAIN, - COMSIG_NANITE_SIGNAL, - COMSIG_NANITE_COMM_SIGNAL)) - -/datum/component/nanites/Destroy() - STOP_PROCESSING(SSnanites, src) - QDEL_LIST(programs) - if(host_mob) - set_nanite_bar(TRUE) - host_mob.hud_set_nanite_indicator() - host_mob = null - return ..() - -/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud) - if(new_nanites) - adjust_nanites(null, new_nanites.nanite_volume) - else - adjust_nanites(null, amount) //just add to the nanite volume - -/datum/component/nanites/process(delta_time) - if(!IS_IN_STASIS(host_mob)) - adjust_nanites(null, (regen_rate + (SSresearch.science_tech.researched_nodes["nanite_harmonic"] ? HARMONIC_REGEN_BOOST : 0)) * delta_time) - add_research() - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_process() - if(cloud_id && cloud_active && world.time > next_sync) - cloud_sync() - next_sync = world.time + NANITE_SYNC_DELAY - set_nanite_bar() - -///Deletes nanites! -/datum/component/nanites/proc/delete_nanites() - SIGNAL_HANDLER - - qdel(src) - -///Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) -/datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) - SIGNAL_HANDLER - - var/list/programs_to_remove = programs.Copy() - var/list/programs_to_add = source.programs.Copy() - for(var/X in programs) - var/datum/nanite_program/NP = X - for(var/Y in programs_to_add) - var/datum/nanite_program/SNP = Y - if(NP.type == SNP.type) - programs_to_remove -= NP - programs_to_add -= SNP - SNP.copy_programming(NP, copy_activation) - break - if(full_overwrite) - for(var/X in programs_to_remove) - qdel(X) - for(var/X in programs_to_add) - var/datum/nanite_program/SNP = X - add_program(null, SNP.copy()) - -///Syncs the nanites to their assigned cloud copy, if it is available. If it is not, there is a small chance of a software error instead. -/datum/component/nanites/proc/cloud_sync() - if(cloud_id) - var/datum/nanite_cloud_backup/backup = SSnanites.get_cloud_backup(cloud_id) - if(backup) - var/datum/component/nanites/cloud_copy = backup.nanites - if(cloud_copy) - sync(null, cloud_copy) - return - //Without cloud syncing nanites can accumulate errors and/or defects - if(prob(8) && programs.len) - var/datum/nanite_program/NP = pick(programs) - NP.software_error() - -///Adds a nanite program, replacing existing unique programs of the same type. A source program can be specified to copy its programming onto the new one. -/datum/component/nanites/proc/add_program(datum/source, datum/nanite_program/new_program, datum/nanite_program/source_program) - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - if(NP.unique && NP.type == new_program.type) - qdel(NP) - if(programs.len >= max_programs) - return COMPONENT_PROGRAM_NOT_INSTALLED - if(source_program) - source_program.copy_programming(new_program) - programs += new_program - new_program.on_add(src) - return COMPONENT_PROGRAM_INSTALLED - -/datum/component/nanites/proc/consume_nanites(amount, force = FALSE) - if(!force && safety_threshold && (nanite_volume - amount < safety_threshold)) - return FALSE - adjust_nanites(null, -amount) - return (nanite_volume > 0) - -///Modifies the current nanite volume, then checks if the nanites are depleted or exceeding the maximum amount -/datum/component/nanites/proc/adjust_nanites(datum/source, amount) - SIGNAL_HANDLER - - nanite_volume += amount - if(nanite_volume > max_nanites) - reject_excess_nanites() - if(nanite_volume <= 0) //oops we ran out - qdel(src) - -/** - * Handles how nanites leave the host's body if they find out that they're currently exceeding the maximum supported amount - * - * IC explanation: - * Normally nanites simply discard excess volume by slowing replication or 'sweating' it out in imperceptible amounts, - * but if there is a large excess volume, likely due to a programming change that leaves them unable to support their current volume, - * the nanites attempt to leave the host as fast as necessary to prevent nanite poisoning. This can range from minor oozing to nanites - * rapidly bursting out from every possible pathway, causing temporary inconvenience to the host. - */ -/datum/component/nanites/proc/reject_excess_nanites() - var/excess = nanite_volume - max_nanites - nanite_volume = max_nanites - - switch(excess) - if(0 to NANITE_EXCESS_MINOR) //Minor excess amount, the extra nanites are quietly expelled without visible effects - return - if((NANITE_EXCESS_MINOR + 0.1) to NANITE_EXCESS_VOMIT) //Enough nanites getting rejected at once to be visible to the naked eye - host_mob.visible_message(span_warning("A grainy grey slurry starts oozing out of [host_mob]."), span_warning("A grainy grey slurry starts oozing out of your skin."), null, 4); - if((NANITE_EXCESS_VOMIT + 0.1) to NANITE_EXCESS_BURST) //Nanites getting rejected in massive amounts, but still enough to make a semi-orderly exit through vomit - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - host_mob.visible_message(span_warning("[host_mob] vomits a grainy grey slurry!"), span_warning("You suddenly vomit a metallic-tasting grainy grey slurry!"), null); - C.vomit(0, FALSE, TRUE, FLOOR(excess / 100, 1), FALSE, VOMIT_NANITE, FALSE, TRUE, 0) - else - host_mob.visible_message(span_warning("A metallic grey slurry bursts out of [host_mob]'s skin!"), span_userdanger("A metallic grey slurry violently bursts out of your skin!"), null); - if(isturf(host_mob.drop_location())) - var/turf/T = host_mob.drop_location() - T.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - if((NANITE_EXCESS_BURST + 0.1) to INFINITY) //Way too many nanites, they just leave through the closest exit before they harm/poison the host - host_mob.visible_message(span_warning("A torrent of metallic grey slurry violently bursts out of [host_mob]'s face and floods out of [host_mob.p_their()] skin!"), - span_userdanger("A torrent of metallic grey slurry violently bursts out of your eyes, ears, and mouth, and floods out of your skin!")); - - host_mob.blind_eyes(15) //nanites coming out of your eyes - host_mob.Paralyze(120) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) - if(ears) - ears.adjustEarDamage(0, 30) //nanites coming out of your ears - C.vomit(0, FALSE, TRUE, 2, FALSE, VOMIT_NANITE, FALSE, TRUE, 0) //nanites coming out of your mouth - - //nanites everywhere - if(isturf(host_mob.drop_location())) - var/turf/T = host_mob.drop_location() - T.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - for(var/turf/adjacent_turf in oview(host_mob, 1)) - if(adjacent_turf.density || !adjacent_turf.Adjacent(T)) - continue - adjacent_turf.add_vomit_floor(host_mob, VOMIT_NANITE, 0) - -///Updates the nanite volume bar visible in diagnostic HUDs -/datum/component/nanites/proc/set_nanite_bar(remove = FALSE) - var/image/holder = host_mob.hud_list[DIAG_NANITE_FULL_HUD] - var/icon/I = icon(host_mob.icon, host_mob.icon_state, host_mob.dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = null - if(remove || stealth) - return //bye icon - var/nanite_percent = (nanite_volume / max_nanites) * 100 - nanite_percent = clamp(CEILING(nanite_percent, 10), 10, 100) - holder.icon_state = "nanites[nanite_percent]" - -/datum/component/nanites/proc/on_emp(datum/source, severity) - SIGNAL_HANDLER - - nanite_volume *= (rand(60, 90) * 0.01) //Lose 10-40% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - if(prob(40/severity)) - cloud_id = 0 - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_emp(severity) - - -/datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) - SIGNAL_HANDLER - - if(flags & SHOCK_ILLUSION || shock_damage < 1) - return - - if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host - nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_shock(shock_damage) - -/datum/component/nanites/proc/on_minor_shock(datum/source) - SIGNAL_HANDLER - - adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_minor_shock() - -/datum/component/nanites/proc/check_stealth(datum/source) - SIGNAL_HANDLER - - return stealth - -/datum/component/nanites/proc/on_death(datum/source, gibbed) - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_death(gibbed) - -/datum/component/nanites/proc/receive_signal(datum/source, code, source = "an unidentified source") - SIGNAL_HANDLER - - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.receive_signal(code, source) - -/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source") - SIGNAL_HANDLER - - for(var/X in programs) - if(istype(X, /datum/nanite_program/comm)) - var/datum/nanite_program/comm/NP = X - NP.receive_comm_signal(comm_code, comm_message, comm_source) - -/datum/component/nanites/proc/check_viable_biotype() - SIGNAL_HANDLER - - if(!(host_mob.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - qdel(src) //bodytype no longer sustains nanites - -/datum/component/nanites/proc/check_access(datum/source, obj/O) - SIGNAL_HANDLER - - for(var/datum/nanite_program/access/access_program in programs) - if(access_program.activated) - return O.check_access_list(access_program.access) - else - return FALSE - return FALSE - -/datum/component/nanites/proc/set_volume(datum/source, amount) - SIGNAL_HANDLER - - nanite_volume = clamp(amount, 0, max_nanites) - -/datum/component/nanites/proc/set_max_volume(datum/source, amount) - SIGNAL_HANDLER - - max_nanites = max(1, amount) - -/datum/component/nanites/proc/set_cloud(datum/source, amount) - SIGNAL_HANDLER - - cloud_id = clamp(amount, 0, 100) - -/datum/component/nanites/proc/set_cloud_sync(datum/source, method) - SIGNAL_HANDLER - - switch(method) - if(NANITE_CLOUD_TOGGLE) - cloud_active = !cloud_active - if(NANITE_CLOUD_DISABLE) - cloud_active = FALSE - if(NANITE_CLOUD_ENABLE) - cloud_active = TRUE - -/datum/component/nanites/proc/set_safety(datum/source, amount) - SIGNAL_HANDLER - - safety_threshold = clamp(amount, 0, max_nanites) - -/datum/component/nanites/proc/set_regen(datum/source, amount) - SIGNAL_HANDLER - - regen_rate = amount - -/datum/component/nanites/proc/confirm_nanites() - SIGNAL_HANDLER - - return TRUE //yup i exist - -/datum/component/nanites/proc/get_programs(datum/source, list/nanite_programs) - SIGNAL_HANDLER - - nanite_programs |= programs - -/datum/component/nanites/proc/add_research() - var/research_value = NANITE_BASE_RESEARCH - if(!ishuman(host_mob)) - if(!iscarbon(host_mob)) - research_value *= 0.4 - else - research_value *= 0.8 - if(!host_mob.client) - research_value *= 0.5 - if(host_mob.stat == DEAD) - research_value *= 0.75 - SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_NANITES = research_value)) - -/datum/component/nanites/proc/nanite_scan(datum/source, mob/user, full_scan) - SIGNAL_HANDLER - - if(!full_scan) - if(!stealth) - to_chat(user, span_notice("Nanites Detected")) - to_chat(user, span_notice("Saturation: [nanite_volume]/[max_nanites]")) - return TRUE - else - to_chat(user, span_info("NANITES DETECTED")) - to_chat(user, span_info("================")) - to_chat(user, span_info("Saturation: [nanite_volume]/[max_nanites]")) - to_chat(user, span_info("Safety Threshold: [safety_threshold]")) - to_chat(user, span_info("Cloud ID: [cloud_id ? cloud_id : "None"]")) - to_chat(user, span_info("Cloud Sync: [cloud_active ? "Active" : "Disabled"]")) - to_chat(user, span_info("================")) - to_chat(user, span_info("Program List:")) - if(!diagnostics) - to_chat(user, span_alert("Nanite debugging disabled.")) - else - for(var/X in programs) - var/datum/nanite_program/NP = X - to_chat(user, span_info("[NP.name] | [NP.activated ? "Active" : "Inactive"]")) - return TRUE - -/datum/component/nanites/proc/nanite_ui_data(datum/source, list/data, scan_level) - SIGNAL_HANDLER - - data["has_nanites"] = TRUE - data["nanite_volume"] = nanite_volume - data["regen_rate"] = regen_rate + (SSresearch.science_tech.researched_nodes["nanite_harmonic"] ? HARMONIC_REGEN_BOOST : 0) - data["safety_threshold"] = safety_threshold - data["cloud_id"] = cloud_id - data["cloud_active"] = cloud_active - var/list/mob_programs = list() - var/id = 1 - for(var/X in programs) - var/datum/nanite_program/P = X - var/list/mob_program = list() - mob_program["name"] = P.name - mob_program["desc"] = P.desc - mob_program["id"] = id - - if(scan_level >= 2) - mob_program["activated"] = P.activated - mob_program["use_rate"] = P.use_rate - mob_program["can_trigger"] = P.can_trigger - mob_program["trigger_cost"] = P.trigger_cost - mob_program["trigger_cooldown"] = P.trigger_cooldown / 10 - - if(scan_level >= 3) - mob_program["timer_restart"] = P.timer_restart / 10 - mob_program["timer_shutdown"] = P.timer_shutdown / 10 - mob_program["timer_trigger"] = P.timer_trigger / 10 - mob_program["timer_trigger_delay"] = P.timer_trigger_delay / 10 - var/list/extra_settings = P.get_extra_settings_frontend() - mob_program["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - mob_program["has_extra_settings"] = TRUE - else - mob_program["has_extra_settings"] = FALSE - - if(scan_level >= 4) - mob_program["activation_code"] = P.activation_code - mob_program["deactivation_code"] = P.deactivation_code - mob_program["kill_code"] = P.kill_code - mob_program["trigger_code"] = P.trigger_code - var/list/rules = list() - var/rule_id = 1 - for(var/Z in P.rules) - var/datum/nanite_rule/nanite_rule = Z - var/list/rule = list() - rule["display"] = nanite_rule.display() - rule["program_id"] = id - rule["id"] = rule_id - rules += list(rule) - rule_id++ - mob_program["rules"] = rules - if(LAZYLEN(rules)) - mob_program["has_rules"] = TRUE - id++ - mob_programs += list(mob_program) - data["mob_programs"] = mob_programs - -#undef HARMONIC_REGEN_BOOST diff --git a/code/datums/components/rust.dm b/code/datums/components/rust.dm index 92833de3d8..54fe02ae80 100644 --- a/code/datums/components/rust.dm +++ b/code/datums/components/rust.dm @@ -1,6 +1,6 @@ /** * Adding this component to an Atom will have it automatically render an overlay. - * The overlay can be specified in new as the first and only parameter; it defaults to "rust" if not included. + * The overlay can be specified in new as the first paramter; if not set it defaults to rust_overlay's rust_default */ /datum/component/rust dupe_mode = COMPONENT_DUPE_UNIQUE @@ -19,22 +19,21 @@ var/atom/wall_new = new /turf/open/floor/plating(src) wall_new.AddComponent(/datum/component/rust) -/datum/component/rust/Initialize(rust_iconstate = "rust") +/datum/component/rust/Initialize(mutable_appearance/overlay) . = ..() if(!isatom(parent)) return COMPONENT_INCOMPATIBLE + rust_overlay = overlay || mutable_appearance('icons/effects/rust_overlay.dmi', "rust_default") + // Unfortunately registering with parent sometimes doesn't cause an overlay update + ADD_TRAIT(parent, TRAIT_RUSTY, src) var/atom/parent_atom = parent - if(!(rust_iconstate in icon_states(parent_atom.icon))) - return COMPONENT_INCOMPATIBLE - - rust_overlay = mutable_appearance(parent_atom.icon, rust_iconstate) + parent_atom.update_icon(UPDATE_OVERLAYS) /datum/component/rust/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_rust_overlay) RegisterSignal(parent, list(COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_WELDER), COMSIG_ATOM_SECONDARY_TOOL_ACT(TOOL_RUSTSCRAPER)), .proc/secondary_tool_act) RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/parent_del) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/handle_examine) - ADD_TRAIT(parent, TRAIT_RUSTY, src) /datum/component/rust/UnregisterFromParent() UnregisterSignal(parent,\ diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 9633575f58..3e875dc439 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -23,10 +23,7 @@ src.shell_flags = shell_flags || src.shell_flags src.capacity = capacity || src.capacity - src.unremovable_circuit_components = unremovable_circuit_components - - for(var/obj/item/circuit_component/circuit_component as anything in unremovable_circuit_components) - circuit_component.removable = FALSE + set_unremovable_circuit_components(unremovable_circuit_components) /datum/component/shell/RegisterWithParent() RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attack_by) @@ -39,6 +36,35 @@ if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) RegisterSignal(parent, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, .proc/on_unfasten) RegisterSignal(parent, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) + RegisterSignal(parent, COMSIG_MOVABLE_CIRCUIT_LOADED, .proc/on_load) + +/datum/component/shell/proc/set_unremovable_circuit_components(list/components) + if(unremovable_circuit_components) + QDEL_LIST(unremovable_circuit_components) + + unremovable_circuit_components = components + + for(var/obj/item/circuit_component/circuit_component as anything in unremovable_circuit_components) + circuit_component.removable = FALSE + RegisterSignal(circuit_component, COMSIG_CIRCUIT_COMPONENT_SAVE, .proc/save_component) + +/datum/component/shell/proc/save_component(datum/source, list/objects) + SIGNAL_HANDLER + objects += parent + +/datum/component/shell/proc/on_load(datum/source, obj/item/integrated_circuit/circuit, list/components) + SIGNAL_HANDLER + var/list/components_in_list = list() + for(var/obj/item/circuit_component/component as anything in components) + components_in_list += component.type + + for(var/obj/item/circuit_component/component as anything in unremovable_circuit_components) + if(component.type in components_in_list) + continue + var/new_type = component.type + components += new new_type() + set_unremovable_circuit_components(components) + attach_circuit(circuit) /datum/component/shell/UnregisterFromParent() @@ -51,6 +77,7 @@ COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, + COMSIG_MOVABLE_CIRCUIT_LOADED, )) QDEL_NULL(attached_circuit) @@ -181,9 +208,9 @@ /** * Checks for when the circuitboard moves. If it moves, removes it from the component. */ -/datum/component/shell/proc/on_circuit_moved(obj/item/integrated_circuit/circuit, atom/new_loc) +/datum/component/shell/proc/on_circuit_moved(obj/item/integrated_circuit/circuit, atom/old_loc) SIGNAL_HANDLER - if(new_loc != parent) + if(circuit.loc != parent) remove_circuit() /** @@ -208,7 +235,7 @@ */ /datum/component/shell/proc/attach_circuit(obj/item/integrated_circuit/circuitboard, mob/living/user) var/atom/movable/parent_atom = parent - if(!user.transferItemToLoc(circuitboard, parent_atom)) + if(user && !user.transferItemToLoc(circuitboard, parent_atom)) return locked = FALSE attached_circuit = circuitboard @@ -226,6 +253,9 @@ if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) on_unfasten(parent_atom, parent_atom.anchored) + if(circuitboard.loc != parent_atom) + circuitboard.forceMove(parent_atom) + /** * Removes the circuit from the component. Doesn't do any checks to see for an existing circuit so that should be done beforehand. */ diff --git a/code/datums/components/usb_port.dm b/code/datums/components/usb_port.dm index 4770fd600f..e4022f5ff1 100644 --- a/code/datums/components/usb_port.dm +++ b/code/datums/components/usb_port.dm @@ -15,20 +15,39 @@ /// The beam connecting the USB cable to the machine var/datum/beam/usb_cable_beam + /// The current physical object that the beam is connected to and listens to. + var/atom/movable/physical_object + /datum/component/usb_port/Initialize(list/circuit_component_types) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE circuit_components = list() - for(var/circuit_component_type in circuit_component_types) - var/obj/item/circuit_component/circuit_component = new circuit_component_type(null) - circuit_components += circuit_component + set_circuit_components(circuit_component_types) + +/datum/component/usb_port/proc/set_circuit_components(list/components) + var/should_register = FALSE + if(length(circuit_components)) + UnregisterFromParent() + should_register = TRUE + QDEL_LIST(circuit_components) + + for(var/circuit_component in components) + var/obj/item/circuit_component/component = circuit_component + if(ispath(circuit_component)) + component = new circuit_component(null) + RegisterSignal(component, COMSIG_CIRCUIT_COMPONENT_SAVE, .proc/save_component) + circuit_components += component + + if(should_register) + RegisterWithParent() /datum/component/usb_port/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, .proc/on_atom_usb_cable_try_attach) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_moved) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(parent, COMSIG_MOVABLE_CIRCUIT_LOADED, .proc/on_load) for(var/obj/item/circuit_component/component as anything in circuit_components) component.register_usb_parent(parent) @@ -38,14 +57,36 @@ COMSIG_ATOM_USB_CABLE_TRY_ATTACH, COMSIG_MOVABLE_MOVED, COMSIG_PARENT_EXAMINE, + COMSIG_MOVABLE_CIRCUIT_LOADED, )) for(var/obj/item/circuit_component/component as anything in circuit_components) component.unregister_usb_parent(parent) unregister_circuit_signals() + unregister_physical_signals() attached_circuit = null +/datum/component/usb_port/proc/save_component(datum/source, list/objects) + SIGNAL_HANDLER + objects += parent + +/datum/component/usb_port/proc/on_load(datum/source, obj/item/integrated_circuit/circuit, list/components) + SIGNAL_HANDLER + var/list/components_in_list = list() + for(var/obj/item/circuit_component/component as anything in components) + components_in_list += component.type + + for(var/obj/item/circuit_component/component as anything in circuit_components) + if(component.type in components_in_list) + continue + components += component.type + set_circuit_components(components) + var/obj/item/usb_cable/cable = new(circuit.drop_location()) + cable.attached_circuit = circuit + + on_atom_usb_cable_try_attach(src, cable, null) + /datum/component/usb_port/Destroy() QDEL_LIST(circuit_components) QDEL_NULL(usb_cable_beam) @@ -62,20 +103,23 @@ UnregisterSignal(attached_circuit, list( COMSIG_CIRCUIT_SHELL_REMOVED, COMSIG_PARENT_QDELETING, + COMSIG_CIRCUIT_SET_SHELL, )) - var/shell = attached_circuit.shell - if (!isnull(shell)) - UnregisterSignal(shell, COMSIG_MOVABLE_MOVED) - UnregisterSignal(shell, COMSIG_PARENT_EXAMINE) +/datum/component/usb_port/proc/unregister_physical_signals() + if (isnull(physical_object)) + return + + UnregisterSignal(physical_object, list( + COMSIG_MOVABLE_MOVED, + COMSIG_PARENT_EXAMINE, + )) /datum/component/usb_port/proc/attach_circuit_components(obj/item/integrated_circuit/circuitboard) for(var/obj/item/circuit_component/component as anything in circuit_components) circuitboard.add_component(component) RegisterSignal(component, COMSIG_CIRCUIT_COMPONENT_REMOVED, .proc/on_circuit_component_removed) - return - /datum/component/usb_port/proc/on_examine(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER @@ -95,15 +139,18 @@ var/atom/atom_parent = parent if (!isnull(attached_circuit)) - atom_parent.balloon_alert(user, "usb already connected") + if(user) + atom_parent.balloon_alert(user, "usb already connected") return COMSIG_CANCEL_USB_CABLE_ATTACK if (isnull(connecting_cable.attached_circuit)) - connecting_cable.balloon_alert(user, "connect to a shell first") + if(user) + connecting_cable.balloon_alert(user, "connect to a shell first") return COMSIG_CANCEL_USB_CABLE_ATTACK if (!IN_GIVEN_RANGE(connecting_cable.attached_circuit, parent, USB_CABLE_MAX_RANGE)) - connecting_cable.balloon_alert(user, "too far away") + if(user) + connecting_cable.balloon_alert(user, "too far away") return COMSIG_CANCEL_USB_CABLE_ATTACK usb_cable_ref = WEAKREF(connecting_cable) @@ -111,17 +158,38 @@ connecting_cable.forceMove(attached_circuit) attach_circuit_components(attached_circuit) - attached_circuit.interact(user) + if(user) + attached_circuit.interact(user) - usb_cable_beam = atom_parent.Beam(attached_circuit.shell, "usb_cable_beam", 'icons/obj/wiremod.dmi') + var/new_physical_object = attached_circuit.shell + if(!new_physical_object) + new_physical_object = attached_circuit RegisterSignal(attached_circuit, COMSIG_CIRCUIT_SHELL_REMOVED, .proc/on_circuit_shell_removed) RegisterSignal(attached_circuit, COMSIG_PARENT_QDELETING, .proc/on_circuit_deleting) - RegisterSignal(attached_circuit.shell, COMSIG_MOVABLE_MOVED, .proc/on_moved) - RegisterSignal(attached_circuit.shell, COMSIG_PARENT_EXAMINE, .proc/on_examine_shell) + RegisterSignal(attached_circuit, COMSIG_CIRCUIT_SET_SHELL, .proc/on_set_shell) + set_physical_object(new_physical_object) return COMSIG_USB_CABLE_ATTACHED +/datum/component/usb_port/proc/set_physical_object(atom/movable/new_physical_object) + if(physical_object) + unregister_physical_signals() + if(usb_cable_beam) + QDEL_NULL(usb_cable_beam) + + var/atom/atom_parent = parent + usb_cable_beam = atom_parent.Beam(new_physical_object, "usb_cable_beam", 'icons/obj/wiremod.dmi') + + RegisterSignal(new_physical_object, COMSIG_MOVABLE_MOVED, .proc/on_moved) + RegisterSignal(new_physical_object, COMSIG_PARENT_EXAMINE, .proc/on_examine_shell) + physical_object = new_physical_object + +// Adds support for loading circuits without shells but with usb cables, or loading circuits with shells because the shells might not load first. +/datum/component/usb_port/proc/on_set_shell(datum/source, atom/movable/new_shell) + SIGNAL_HANDLER + set_physical_object(new_shell) + /datum/component/usb_port/proc/on_moved() SIGNAL_HANDLER @@ -157,11 +225,13 @@ component.moveToNullspace() unregister_circuit_signals() + unregister_physical_signals() var/atom/atom_parent = parent usb_cable.forceMove(atom_parent.drop_location()) usb_cable.balloon_alert_to_viewers("snap") + physical_object = null attached_circuit = null usb_cable_ref = null diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm index b13354ce70..1f72fb416e 100644 --- a/code/datums/dash_weapon.dm +++ b/code/datums/dash_weapon.dm @@ -33,11 +33,11 @@ /datum/action/innate/dash/proc/Teleport(mob/user, atom/target) if(!IsAvailable()) return - var/turf/T = get_turf(target) + var/turf/target_turf = get_turf(target) if(target in view(user.client.view, user)) var/obj/spot1 = new phaseout(get_turf(user), user.dir) - user.forceMove(T) - playsound(T, dash_sound, 25, TRUE) + user.forceMove(target_turf) + playsound(target_turf, dash_sound, 25, TRUE) var/obj/spot2 = new phasein(get_turf(user), user.dir) spot1.Beam(spot2,beam_effect,time=2 SECONDS) current_charges-- @@ -49,4 +49,4 @@ owner.update_action_buttons_icon() if(recharge_sound) playsound(dashing_item, recharge_sound, 50, TRUE) - to_chat(owner, span_notice("[src] now has [current_charges]/[max_charges] charges.")) + dashing_item.balloon_alert(owner, "[current_charges]/[max_charges] dash charges") diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 95990b7515..a11e07f2f3 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -1,3 +1,6 @@ + +GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) + //TODO: someone please get rid of this shit /datum/datacore var/list/medical = list() diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm deleted file mode 100644 index 1ca11b28e2..0000000000 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ /dev/null @@ -1,71 +0,0 @@ -/datum/symptom/nano_boost - name = "Nano-symbiosis" - desc = "The virus reacts to nanites in the host's bloodstream by enhancing their replication cycle." - stealth = 0 - resistance = 2 - stage_speed = 2 - transmittable = -1 - level = 7 - severity = 0 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/reverse_boost = FALSE - threshold_descs = list( - "Transmission 5" = "Increases the virus' growth rate while nanites are present.", - "Stage Speed 7" = "Increases the replication boost." - ) - -/datum/symptom/nano_boost/Start(datum/disease/advance/A) - . = ..() - if(!.) - return - if(A.totalTransmittable() >= 5) //reverse boost - reverse_boost = TRUE - if(A.totalStageSpeed() >= 7) //more nanites - power = 2 - -/datum/symptom/nano_boost/Activate(datum/disease/advance/A) - . = ..() - if(!.) - return - var/mob/living/carbon/M = A.affected_mob - SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, 0.5 * power) - if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES)) - if(prob(A.stage_prob)) - A.stage = min(A.stage + 1,A.max_stages) - -/datum/symptom/nano_destroy - name = "Silicolysis" - desc = "The virus reacts to nanites in the host's bloodstream by attacking and consuming them." - stealth = 0 - resistance = 4 - stage_speed = -1 - transmittable = 1 - level = 7 - severity = 0 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/reverse_boost = FALSE - threshold_descs = list( - "Stage Speed 5" = "Increases the virus' growth rate while nanites are present.", - "Resistance 7" = "Severely increases the rate at which the nanites are destroyed." - ) - -/datum/symptom/nano_destroy/Start(datum/disease/advance/A) - . = ..() - if(!.) - return - if(A.totalStageSpeed() >= 5) //reverse boost - reverse_boost = TRUE - if(A.totalResistance() >= 7) //more nanites - power = 3 - -/datum/symptom/nano_destroy/Activate(datum/disease/advance/A) - . = ..() - if(!.) - return - var/mob/living/carbon/M = A.affected_mob - SEND_SIGNAL(M, COMSIG_NANITE_ADJUST_VOLUME, -0.4 * power) - if(reverse_boost && SEND_SIGNAL(M, COMSIG_HAS_NANITES)) - if(prob(A.stage_prob)) - A.stage = min(A.stage + 1,A.max_stages) diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm new file mode 100644 index 0000000000..0c07ea30b9 --- /dev/null +++ b/code/datums/elements/footstep.dm @@ -0,0 +1,155 @@ +///Footstep element. Plays footsteps at parents location when it is appropriate. +/datum/element/footstep + element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + id_arg_index = 2 + ///A list containing living mobs and the number of steps they have taken since the last time their footsteps were played. + var/list/steps_for_living = list() + ///volume determines the extra volume of the footstep. This is multiplied by the base volume, should there be one. + var/volume + ///e_range stands for extra range - aka how far the sound can be heard. This is added to the base value and ignored if there isn't a base value. + var/e_range + ///footstep_type is a define which determines what kind of sounds should get chosen. + var/footstep_type + ///This can be a list OR a soundfile OR null. Determines whatever sound gets played. + var/footstep_sounds + ///Whether or not to add variation to the sounds played + var/sound_vary = FALSE + +/datum/element/footstep/Attach(datum/target, footstep_type = FOOTSTEP_MOB_BAREFOOT, volume = 0.5, e_range = -8, sound_vary = FALSE) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + src.volume = volume + src.e_range = e_range + src.footstep_type = footstep_type + src.sound_vary = sound_vary + switch(footstep_type) + if(FOOTSTEP_MOB_HUMAN) + if(!ishuman(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/play_humanstep) + steps_for_living[target] = 0 + return + if(FOOTSTEP_MOB_CLAW) + footstep_sounds = GLOB.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + footstep_sounds = GLOB.barefootstep + if(FOOTSTEP_MOB_HEAVY) + footstep_sounds = GLOB.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + footstep_sounds = GLOB.footstep + if(FOOTSTEP_MOB_SLIME) + footstep_sounds = 'sound/effects/footstep/slime1.ogg' + if(FOOTSTEP_OBJ_MACHINE) + footstep_sounds = 'sound/effects/bang.ogg' + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/play_simplestep_machine) + return + if(FOOTSTEP_OBJ_ROBOT) + footstep_sounds = 'sound/effects/tank_treads.ogg' + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/play_simplestep_machine) + return + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/play_simplestep) + steps_for_living[target] = 0 + +/datum/element/footstep/Detach(atom/movable/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + steps_for_living -= source + return ..() + +///Prepares a footstep for living mobs. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/open +/datum/element/footstep/proc/prepare_step(mob/living/source) + var/turf/open/turf = get_turf(source) + if(!istype(turf)) + return + + if(!turf.footstep || source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(source, TRAIT_IMMOBILIZED)) + return + + if(source.body_position == LYING_DOWN) //play crawling sound if we're lying + playsound(turf, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1, vary = sound_vary) + return + + if(iscarbon(source)) + var/mob/living/carbon/carbon_source = source + if(!carbon_source.get_bodypart(BODY_ZONE_L_LEG) && !carbon_source.get_bodypart(BODY_ZONE_R_LEG)) + return + if(carbon_source.m_intent == MOVE_INTENT_WALK) + return// stealth + steps_for_living[source] += 1 + var/steps = steps_for_living[source] + + if(steps >= 6) + steps_for_living[source] = 0 + steps = 0 + + if(steps % 2) + return + + if(steps != 0 && !source.has_gravity(turf)) // don't need to step as often when you hop around + return + return turf + +/datum/element/footstep/proc/play_simplestep(mob/living/source) + SIGNAL_HANDLER + + var/turf/open/source_loc = prepare_step(source) + if(!source_loc) + return + if(isfile(footstep_sounds) || istext(footstep_sounds)) + playsound(source_loc, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary) + return + var/turf_footstep + switch(footstep_type) + if(FOOTSTEP_MOB_CLAW) + turf_footstep = source_loc.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + turf_footstep = source_loc.barefootstep + if(FOOTSTEP_MOB_HEAVY) + turf_footstep = source_loc.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + turf_footstep = source_loc.footstep + if(!turf_footstep) + return + playsound(source_loc, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary) + +/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source) + SIGNAL_HANDLER + + if(HAS_TRAIT(source, TRAIT_SILENT_FOOTSTEPS)) + return + + var/volume_multiplier = 1 + var/range_adjustment = 0 + + if(HAS_TRAIT(source, TRAIT_LIGHT_STEP)) + volume_multiplier = 0.6 + range_adjustment = -2 + + var/turf/open/source_loc = prepare_step(source) + if(!source_loc) + return + + if ((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET) + // we are wearing shoes + playsound(source_loc, pick(GLOB.footstep[source_loc.footstep][1]), + GLOB.footstep[source_loc.footstep][2] * volume * volume_multiplier, + TRUE, + GLOB.footstep[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + else + if(source.dna.species.special_step_sounds) + playsound(source_loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) + else + playsound(source_loc, pick(GLOB.barefootstep[source_loc.barefootstep][1]), + GLOB.barefootstep[source_loc.barefootstep][2] * volume * volume_multiplier, + TRUE, + GLOB.barefootstep[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary) + + +///Prepares a footstep for machine walking +/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source) + SIGNAL_HANDLER + + var/turf/open/source_loc = get_turf(source) + if(!istype(source_loc)) + return + playsound(source_loc, footstep_sounds, 50, falloff_distance = 1, vary = sound_vary) diff --git a/code/datums/components/kneecapping.dm b/code/datums/elements/kneecapping.dm similarity index 100% rename from code/datums/components/kneecapping.dm rename to code/datums/elements/kneecapping.dm diff --git a/code/datums/components/spooky.dm b/code/datums/elements/spooky.dm similarity index 73% rename from code/datums/components/spooky.dm rename to code/datums/elements/spooky.dm index b53aae93ac..3643bac10d 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/elements/spooky.dm @@ -1,10 +1,20 @@ -/datum/component/spooky +/datum/element/spooky + element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + id_arg_index = 2 var/too_spooky = TRUE //will it spawn a new instrument? -/datum/component/spooky/Initialize() - RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/spectral_attack) +/datum/element/spooky/Attach(datum/target, too_spooky = TRUE) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + src.too_spooky = too_spooky + RegisterSignal(target, COMSIG_ITEM_ATTACK, .proc/spectral_attack) -/datum/component/spooky/proc/spectral_attack(datum/source, mob/living/carbon/C, mob/user) +/datum/element/spooky/Detach(datum/source) + UnregisterSignal(source, COMSIG_ITEM_ATTACK) + return ..() + +/datum/element/spooky/proc/spectral_attack(datum/source, mob/living/carbon/C, mob/user) SIGNAL_HANDLER if(ishuman(user)) //this weapon wasn't meant for mortals. @@ -36,26 +46,27 @@ C.Jitter(15) C.stuttering = 20 -/datum/component/spooky/proc/spectral_change(mob/living/carbon/human/H, mob/user) +/datum/element/spooky/proc/spectral_change(mob/living/carbon/human/H, mob/user) if((H.getStaminaLoss() > 95) && (!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) H.Paralyze(20) H.set_species(/datum/species/skeleton) H.visible_message(span_warning("[H] has given up on life as a mortal.")) var/T = get_turf(H) if(too_spooky) - if(prob(30)) - new/obj/item/instrument/saxophone/spectral(T) - else if(prob(30)) - new/obj/item/instrument/trumpet/spectral(T) - else if(prob(30)) - new/obj/item/instrument/trombone/spectral(T) + if(prob(90)) + var/obj/item/instrument = pick( + /obj/item/instrument/saxophone/spectral, + /obj/item/instrument/trumpet/spectral, + /obj/item/instrument/trombone/spectral, + ) + new instrument(T) else to_chat(H, span_boldwarning("The spooky gods forgot to ship your instrument. Better luck next unlife.")) to_chat(H, span_boldnotice("You are the spooky skeleton!")) to_chat(H, span_boldnotice("A new life and identity has begun. Help your fellow skeletons into bringing out the spooky-pocalypse. You haven't forgotten your past life, and are still beholden to past loyalties.")) change_name(H) //time for a new name! -/datum/component/spooky/proc/change_name(mob/living/carbon/human/H) +/datum/element/spooky/proc/change_name(mob/living/carbon/human/H) var/t = sanitize_name(stripped_input(H, "Enter your new skeleton name", H.real_name, null, MAX_NAME_LEN)) if(!t) t = "spooky skeleton" diff --git a/code/datums/greyscale/json_configs/meter.json b/code/datums/greyscale/json_configs/meter.json index 3acd68b6f7..73cfb73995 100644 --- a/code/datums/greyscale/json_configs/meter.json +++ b/code/datums/greyscale/json_configs/meter.json @@ -2,9 +2,8 @@ "meter": [ { "type": "icon_state", - "icon_state": "pressure0", - "blend_mode": "overlay", - "color_ids": [ 1 ] + "icon_state": "pressure_off", + "blend_mode": "overlay" }, { "type": "icon_state", diff --git a/code/datums/greyscale/json_configs/plushie_lizard.json b/code/datums/greyscale/json_configs/plushie_lizard.json index 47e86a61d8..5326beac0b 100644 --- a/code/datums/greyscale/json_configs/plushie_lizard.json +++ b/code/datums/greyscale/json_configs/plushie_lizard.json @@ -1,5 +1,5 @@ { - "": [ + "map_plushie_lizard": [ { "type": "icon_state", "icon_state": "plushie_lizard_body", diff --git a/code/datums/id_trim/admin.dm b/code/datums/id_trim/admin.dm new file mode 100644 index 0000000000..0bc937aecc --- /dev/null +++ b/code/datums/id_trim/admin.dm @@ -0,0 +1,18 @@ +/// Trim for admins and debug cards. Has every single access in the game. +/datum/id_trim/admin + assignment = "Jannie" + trim_state = "trim_ert_janitor" + +/datum/id_trim/admin/New() + . = ..() + // Every single access in the game, all on one handy trim. + access = SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)) + +/// Trim for highlander cards, used during the highlander adminbus event. +/datum/id_trim/highlander + assignment = "Highlander" + trim_state = "trim_ert_deathcommando" + +/datum/id_trim/highlander/New() + . = ..() + access = SSid_access.get_region_access_list(list(REGION_CENTCOM, REGION_ALL_STATION)) diff --git a/code/datums/id_trim/misc.dm b/code/datums/id_trim/outfits.dm similarity index 61% rename from code/datums/id_trim/misc.dm rename to code/datums/id_trim/outfits.dm index fdf21a1637..48b4969a20 100644 --- a/code/datums/id_trim/misc.dm +++ b/code/datums/id_trim/outfits.dm @@ -1,21 +1,6 @@ -/// Trim for admins and debug cards. Has every single access in the game. -/datum/id_trim/admin - assignment = "Jannie" - trim_state = "trim_ert_janitor" - -/datum/id_trim/admin/New() - . = ..() - // Every single access in the game, all on one handy trim. - access = SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)) - -/// Trim for highlander cards, used during the highlander adminbus event. -/datum/id_trim/highlander - assignment = "Highlander" - trim_state = "trim_ert_deathcommando" - -/datum/id_trim/highlander/New() - . = ..() - access = SSid_access.get_region_access_list(list(REGION_CENTCOM, REGION_ALL_STATION)) +/** + * This file contains all the trims associated with outfits. + */ /// Trim for the assassin outfit. /datum/id_trim/reaper_assassin diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index cb6774ee6b..b9e02d4a07 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -279,13 +279,6 @@ description = "THEY'RE CUTTING ME OPEN!!\n" mood_change = -8 -/datum/mood_event/nanite_sadness - description = "+++++++HAPPINESS SUPPRESSION+++++++\n" - mood_change = -7 - -/datum/mood_event/nanite_sadness/add_effects(message) - description = "+++++++[message]+++++++\n" - /datum/mood_event/bald description = "I need something to cover my head...\n" mood_change = -3 diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 5be193843e..ef8db10eef 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -186,13 +186,6 @@ description = "What a peculiar emblem. It makes me feel hopeful for my future.\n" mood_change = 10 -/datum/mood_event/nanite_happiness - description = "+++++++HAPPINESS ENHANCEMENT+++++++\n" - mood_change = 7 - -/datum/mood_event/nanite_happiness/add_effects(message) - description = "+++++++[message]+++++++\n" - /datum/mood_event/area description = "" //Fill this out in the area mood_change = 0 diff --git a/code/game/area/space_station_13_areas.dm b/code/game/area/space_station_13_areas.dm index 967bcb5255..307ddf61fe 100644 --- a/code/game/area/space_station_13_areas.dm +++ b/code/game/area/space_station_13_areas.dm @@ -1413,10 +1413,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "abandoned_sci" sound_environment = SOUND_AREA_SMALL_ENCLOSED -/area/science/nanite - name = "Nanite Lab" - icon_state = "nanite" - // Telecommunications Satellite /area/tcommsat diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 50b0770604..5da00a215b 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -18,7 +18,7 @@ /datum/atom_hud/data /datum/atom_hud/data/human/medical - hud_icons = list(STATUS_HUD, HEALTH_HUD, NANITE_HUD) + hud_icons = list(STATUS_HUD, HEALTH_HUD) /datum/atom_hud/data/human/medical/basic @@ -47,7 +47,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD, NANITE_HUD) + hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) /datum/atom_hud/data/human/fan_hud hud_icons = list(FAN_HUD) @@ -55,10 +55,10 @@ /datum/atom_hud/data/diagnostic /datum/atom_hud/data/diagnostic/basic - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_NANITE_FULL_HUD, DIAG_LAUNCHPAD_HUD) + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD) /datum/atom_hud/data/diagnostic/advanced - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_NANITE_FULL_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) /datum/atom_hud/data/bot_path hud_icons = list(DIAG_PATH_HUD) @@ -300,14 +300,6 @@ Security HUDs! Basic mode shows only the job. Diagnostic HUDs! ************************************************/ -/mob/living/proc/hud_set_nanite_indicator() - var/image/holder = hud_list[NANITE_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = null - if(HAS_TRAIT(src, TRAIT_NANITE_MONITORING)) - holder.icon_state = "nanite_ping" - //For Diag health and cell bars! /proc/RoundDiagBar(value) switch(value * 100) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 4ad557c379..8c83ef3b39 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -34,11 +34,6 @@ . = ..() records = add_output_port("Crew Monitoring Data", PORT_TYPE_TABLE) -/obj/item/circuit_component/medical_console_data/Destroy() - records = null - return ..() - - /obj/item/circuit_component/medical_console_data/register_usb_parent(atom/movable/parent) . = ..() if(istype(parent, /obj/machinery/computer/crew)) @@ -189,9 +184,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return data_by_z["[z]"] var/list/results = list() - for(var/tracked_mob in GLOB.suit_sensors_list | GLOB.nanite_sensors_list) + for(var/tracked_mob in GLOB.suit_sensors_list) if(!tracked_mob) - stack_trace("Null entry in suit sensors or nanite sensors list.") + stack_trace("Null entry in suit sensors list.") continue var/mob/living/tracked_living_mob = tracked_mob @@ -208,31 +203,25 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if(pos.z != z && (!is_station_level(pos.z) || !is_station_level(z))) continue - var/sensor_mode - - // Set sensor level based on whether we're in the nanites list or the suit sensor list. - if(tracked_living_mob in GLOB.nanite_sensors_list) - sensor_mode = SENSOR_COORDS - else - var/mob/living/carbon/human/tracked_human = tracked_living_mob + var/mob/living/carbon/human/tracked_human = tracked_living_mob - // Check their humanity. - if(!ishuman(tracked_human)) - stack_trace("Non-human mob is in suit_sensors_list: [tracked_living_mob] ([tracked_living_mob.type])") - continue + // Check their humanity. + if(!ishuman(tracked_human)) + stack_trace("Non-human mob is in suit_sensors_list: [tracked_living_mob] ([tracked_living_mob.type])") + continue - // Check they have a uniform - var/obj/item/clothing/under/uniform = tracked_human.w_uniform - if (!istype(uniform)) - stack_trace("Human without a suit sensors compatible uniform is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform?.type])") - continue + // Check they have a uniform + var/obj/item/clothing/under/uniform = tracked_human.w_uniform + if (!istype(uniform)) + stack_trace("Human without a suit sensors compatible uniform is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform?.type])") + continue - // Check if their uniform is in a compatible mode. - if((uniform.has_sensor <= NO_SENSORS) || !uniform.sensor_mode) - stack_trace("Human without active suit sensors is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform.type])") - continue + // Check if their uniform is in a compatible mode. + if((uniform.has_sensor <= NO_SENSORS) || !uniform.sensor_mode) + stack_trace("Human without active suit sensors is in suit_sensors_list: [tracked_human] ([tracked_human.type]) ([uniform.type])") + continue - sensor_mode = uniform.sensor_mode + var/sensor_mode = uniform.sensor_mode // The entry for this human var/list/entry = list( diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 26513a5e0f..a4bb748cde 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -33,11 +33,24 @@ var/obj/machinery/computer/launchpad/attached_console +/obj/item/circuit_component/bluespace_launchpad/get_ui_notices() + . = ..() + var/current_launchpad = launchpad_id.input_value + if(isnull(current_launchpad)) + return + + var/obj/machinery/launchpad/the_pad = attached_console.launchpads[current_launchpad] + if(isnull(the_pad)) + return + + . += create_ui_notice("Minimum Range: [-the_pad.range]", "orange", "minus") + . += create_ui_notice("Maximum Range: [the_pad.range]", "orange", "plus") + /obj/item/circuit_component/bluespace_launchpad/Initialize() . = ..() - launchpad_id = add_input_port("Launchpad ID", PORT_TYPE_NUMBER, FALSE) - x_pos = add_input_port("X offset", PORT_TYPE_NUMBER, FALSE) - y_pos = add_input_port("Y offset", PORT_TYPE_NUMBER, FALSE) + launchpad_id = add_input_port("Launchpad ID", PORT_TYPE_NUMBER, FALSE, default = 1) + x_pos = add_input_port("X offset", PORT_TYPE_NUMBER) + y_pos = add_input_port("Y offset", PORT_TYPE_NUMBER) send_trigger = add_input_port("Send", PORT_TYPE_SIGNAL) retrieve_trigger = add_input_port("Retrieve", PORT_TYPE_SIGNAL) @@ -46,18 +59,6 @@ why_fail = add_output_port("Fail reason", PORT_TYPE_STRING) on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/bluespace_launchpad/Destroy() - launchpad_id = null - x_pos = null - y_pos = null - send_trigger = null - retrieve_trigger = null - sent = null - retrieved = null - on_fail = null - why_fail = null - return ..() - /obj/item/circuit_component/bluespace_launchpad/register_usb_parent(atom/movable/parent) . = ..() if(istype(parent, /obj/machinery/computer/launchpad)) @@ -78,36 +79,45 @@ on_fail.set_output(COMPONENT_SIGNAL) return +<<<<<<< HEAD var/current_launchpad = launchpad_id.value if(isnull(current_launchpad)) +======= + if(!launchpad_id.input_value) +>>>>>>> ec9ee7eb00 return - var/obj/machinery/launchpad/the_pad = attached_console.launchpads[current_launchpad] + var/obj/machinery/launchpad/the_pad = KEYBYINDEX(attached_console.launchpads, launchpad_id.input_value) if(isnull(the_pad)) + why_fail.set_output("Invalid launchpad selected!") + on_fail.set_output(COMPONENT_SIGNAL) return +<<<<<<< HEAD var/x_dest = x_pos.value if(isnull(x_dest)) return var/y_dest = y_pos.value if(isnull(y_dest)) +======= + the_pad.set_offset(x_pos.input_value, y_pos.input_value) + + if(COMPONENT_TRIGGERED_BY(port, x_pos)) + x_pos.set_input(the_pad.x_offset, FALSE) +>>>>>>> ec9ee7eb00 return - if(x_dest > the_pad.range || y_dest > the_pad.range) - why_fail.set_output("Cannot go that far! Current maximum reach: [the_pad.range]") - on_fail.set_output(COMPONENT_SIGNAL) + if(COMPONENT_TRIGGERED_BY(port, y_pos)) + y_pos.set_input(the_pad.y_offset, FALSE) return var/checks = attached_console.teleport_checks(the_pad) - if(!isnull(checks)) why_fail.set_output(checks) on_fail.set_output(COMPONENT_SIGNAL) return - the_pad.set_offset(x_dest, y_dest) - if(COMPONENT_TRIGGERED_BY(send_trigger, port)) the_pad.doteleport(null, TRUE, alternate_log_name = parent.get_creator()) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 90ce2197c5..1f3e0445c6 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -44,12 +44,6 @@ records = add_output_port("Security Records", PORT_TYPE_TABLE) on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/arrest_console_data/Destroy() - records = null - on_fail = null - return ..() - - /obj/item/circuit_component/arrest_console_data/register_usb_parent(atom/movable/parent) . = ..() if(istype(parent, /obj/machinery/computer/secure_data)) @@ -150,13 +144,6 @@ new_status_set = add_output_port("Set Status", PORT_TYPE_STRING) on_fail = add_output_port("Failed", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/arrest_console_arrest/Destroy() - targets = null - new_status = null - new_status_set = null - on_fail = null - return ..() - /obj/item/circuit_component/arrest_console_arrest/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/game/machinery/computer/tram_controls.dm b/code/game/machinery/computer/tram_controls.dm index 132f9c9bb1..535cda95cd 100644 --- a/code/game/machinery/computer/tram_controls.dm +++ b/code/game/machinery/computer/tram_controls.dm @@ -139,14 +139,6 @@ UnregisterSignal(computer.tram_part, list(COMSIG_TRAM_SET_TRAVELLING, COMSIG_TRAM_TRAVEL)) return ..() -/obj/item/circuit_component/tram_controls/Destroy() - new_destination = null - trigger_move = null - location = null - travelling_output = null - computer = null - return ..() - /obj/item/circuit_component/tram_controls/input_received(datum/port/input/port) . = ..() if (.) diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index d3c7817224..38d2392684 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -19,6 +19,26 @@ var/finish_name = "turret" //the name applied to the product turret var/obj/item/gun/installed_gun = null +/obj/machinery/porta_turret_construct/examine(mob/user) + . = ..() + switch(build_step) + if(PTURRET_UNSECURED) + . += span_notice("The external bolts are unwrenched, and the frame could be pried apart.") + if(PTURRET_BOLTED) + . += span_notice("The frame requires metal for its internal armor, the external bolts are wrenched in place.") + if(PTURRET_START_INTERNAL_ARMOUR) + . += span_notice("The turret's armor needs to be bolted in place, the armor looked like it could be welded out.") + if(PTURRET_INTERNAL_ARMOUR_ON) + . += span_notice("The turret requires an energy based gun to function, the armor is secured by bolts.") + if(PTURRET_GUN_EQUIPPED) + . += span_notice("The turret requires an proximity sensor to function. The energy gun could be removed.") + if(PTURRET_SENSORS_ON) + . += span_notice("The turret's access hatch is unscrewed. The proximity sensor could be removed.") + if(PTURRET_CLOSED) + . += span_notice("The turret requires metal for its external armor, the access hatch could be unscrewed.") + if(PTURRET_START_EXTERNAL_ARMOUR) + . += span_notice("The turret's armor needs to be welded in place, the armor looks like it could be pried off.") + /obj/machinery/porta_turret_construct/attackby(obj/item/I, mob/user, params) //this is a bit unwieldy but self-explanatory switch(build_step) diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 9fd3f0d851..c052f69fe7 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -1,6 +1,5 @@ #define SCANGATE_NONE "Off" #define SCANGATE_MINDSHIELD "Mindshield" -#define SCANGATE_NANITES "Nanites" #define SCANGATE_DISEASE "Disease" #define SCANGATE_GUNS "Guns" #define SCANGATE_WANTED "Wanted" @@ -36,8 +35,6 @@ var/scangate_mode = SCANGATE_NONE ///Is searching for a disease, what severity is enough to trigger the gate? var/disease_threshold = DISEASE_SEVERITY_MINOR - ///If scanning for a nanite strain, what cloud is it looking for? - var/nanite_cloud = 1 ///If scanning for a specific species, what species is it looking for? var/detect_species = SCANGATE_HUMAN ///Flips all scan results for inverse scanning. Signals if scan returns false. @@ -134,14 +131,6 @@ if(SCANGATE_MINDSHIELD) if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) beep = TRUE - if(SCANGATE_NANITES) - if(SEND_SIGNAL(M, COMSIG_HAS_NANITES)) - if(nanite_cloud) - var/datum/component/nanites/nanites = M.GetComponent(/datum/component/nanites) - if(nanites && nanites.cloud_id == nanite_cloud) - beep = TRUE - else - beep = TRUE if(SCANGATE_DISEASE) if(iscarbon(M)) var/mob/living/carbon/C = M @@ -227,7 +216,6 @@ data["locked"] = locked data["scan_mode"] = scangate_mode data["reverse"] = reverse - data["nanite_cloud"] = nanite_cloud data["disease_threshold"] = disease_threshold data["target_species"] = detect_species data["target_nutrition"] = detect_nutrition @@ -254,10 +242,6 @@ var/new_threshold = params["new_threshold"] disease_threshold = new_threshold . = TRUE - if("set_nanite_cloud") - var/new_cloud = text2num(params["new_cloud"]) - nanite_cloud = clamp(round(new_cloud, 1), 1, 100) - . = TRUE //Some species are not scannable, like abductors (too unknown), androids (too artificial) or skeletons (too magic) if("set_target_species") var/new_species = params["new_species"] @@ -279,7 +263,6 @@ #undef SCANGATE_NONE #undef SCANGATE_MINDSHIELD -#undef SCANGATE_NANITES #undef SCANGATE_DISEASE #undef SCANGATE_GUNS #undef SCANGATE_WANTED diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index e4559484ce..bb1613a116 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -1,6 +1,6 @@ -#define GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR 10 -#define GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM 0.2 -#define GLOWSHROOM_BASE_INTEGRITY 60 + +GLOBAL_VAR_INIT(glowshrooms, 0) + /obj/structure/glowshroom name = "glowshroom" desc = "Mycena Bregprox, a species of mushroom that glows in the dark." @@ -252,9 +252,3 @@ myseed.potency = 50 myseed.endurance = 50 myseed.yield = 5 - - - -#undef GLOWSHROOM_SPREAD_BASE_DIMINISH_FACTOR -#undef GLOWSHROOM_SPREAD_DIMINISH_FACTOR_PER_GLOWSHROOM -#undef GLOWSHROOM_BASE_INTEGRITY diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index e5bdececf7..ff6843bfc2 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -65,6 +65,9 @@ /obj/effect/abstract/marker/at name = "active turf marker" +/obj/effect/abstract/marker/intercom + name = "intercom range marker" + color = COLOR_YELLOW /obj/effect/dummy/lighting_obj name = "lighting fx obj" diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index 3e8e2d070f..f6115e2f5b 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -63,6 +63,15 @@ /obj/item/clothing/under/suit/black, /obj/item/clothing/head/that) +/obj/effect/spawner/bundle/costume/referee + name = "referee costume spawner" + items = list( + /obj/item/clothing/mask/whistle, + /obj/item/clothing/gloves/color/latex, + /obj/item/clothing/shoes/laceup, + /obj/item/clothing/head/soft/black, + /obj/item/clothing/under/costume/referee) + /obj/effect/spawner/bundle/costume/highlander name = "highlander costume spawner" items = list( diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 9e52d8279d..9bf1f1ed28 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -489,11 +489,6 @@ /obj/item/circuitboard/computer/teleporter, /obj/item/circuitboard/machine/destructive_analyzer, /obj/item/circuitboard/computer/rdconsole, - /obj/item/circuitboard/computer/nanite_chamber_control, - /obj/item/circuitboard/computer/nanite_cloud_controller, - /obj/item/circuitboard/machine/nanite_chamber, - /obj/item/circuitboard/machine/nanite_programmer, - /obj/item/circuitboard/machine/nanite_program_hub, /obj/item/circuitboard/computer/scan_consolenew, /obj/item/circuitboard/machine/dnascanner ) diff --git a/code/game/objects/items/bouquets.dm b/code/game/objects/items/bouquets.dm new file mode 100644 index 0000000000..c4360015a4 --- /dev/null +++ b/code/game/objects/items/bouquets.dm @@ -0,0 +1,21 @@ +// Bouquets +/obj/item/bouquet + name = "mixed bouquet" + desc = "A bouquet of sunflowers, lilies, and geraniums. How delightful." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "mixedbouquet" + +/obj/item/bouquet/sunflower + name = "sunflower bouquet" + desc = "A bright bouquet of sunflowers." + icon_state = "sunbouquet" + +/obj/item/bouquet/poppy + name = "poppy bouquet" + desc = "A bouquet of poppies. You feel loved just looking at it." + icon_state = "poppybouquet" + +/obj/item/bouquet/rose + name = "rose bouquet" + desc = "A bouquet of roses. A bundle of love." + icon_state = "rosebouquet" diff --git a/code/game/objects/items/choice_beacon.dm b/code/game/objects/items/choice_beacon.dm new file mode 100644 index 0000000000..7b43a6205c --- /dev/null +++ b/code/game/objects/items/choice_beacon.dm @@ -0,0 +1,139 @@ +/obj/item/choice_beacon + name = "choice beacon" + desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence." + icon = 'icons/obj/device.dmi' + icon_state = "gangtool-blue" + inhand_icon_state = "radio" + var/uses = 1 + +/obj/item/choice_beacon/attack_self(mob/user) + if(canUseBeacon(user)) + generate_options(user) + +/obj/item/choice_beacon/proc/generate_display_names() // return the list that will be used in the choice selection. entries should be in (type.name = type) fashion. see choice_beacon/hero for how this is done. + return list() + +/obj/item/choice_beacon/proc/canUseBeacon(mob/living/user) + if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return TRUE + else + playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) + return FALSE + +/obj/item/choice_beacon/proc/generate_options(mob/living/M) + var/list/display_names = generate_display_names() + if(!display_names.len) + return + var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in sortList(display_names) + if(!choice || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + return + + spawn_option(display_names[choice],M) + uses-- + if(!uses) + qdel(src) + else + to_chat(M, span_notice("[uses] use[uses > 1 ? "s" : ""] remaining on the [src].")) + +/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M) + podspawn(list( + "target" = get_turf(src), + "style" = STYLE_BLUESPACE, + "spawn" = choice, + )) + var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(istype(H.ears, /obj/item/radio/headset)) + msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: [span_bold("Item request received. Your package is inbound, please stand back from the landing site.")] Message ends.\"" + to_chat(M, msg) + +/obj/item/choice_beacon/ingredient + name = "ingredient delivery beacon" + desc = "Summon a box of ingredients to help you get started cooking." + icon_state = "gangtool-white" + +/obj/item/choice_beacon/ingredient/generate_display_names() + var/list/ingredients = list() + for(var/V in subtypesof(/obj/item/storage/box/ingredients)) + var/obj/item/storage/box/ingredients/A = V + ingredients[initial(A.theme_name)] = A + return ingredients + +/obj/item/choice_beacon/ingredient/spawn_option(obj/choice,mob/living/M) + new choice(get_turf(M)) + to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from Sophronia Broadcasting. Message as follows: Please enjoy your Sophronia Broadcasting's 'Plasteel Chef' Ingredients Box, exactly as shown in the hit show! Message ends.\"")) + +/obj/item/choice_beacon/hero + name = "heroic beacon" + desc = "To summon heroes from the past to protect the future." + +/obj/item/choice_beacon/hero/generate_display_names() + var/static/list/hero_item_list + if(!hero_item_list) + hero_item_list = list() + var/list/templist = typesof(/obj/item/storage/box/hero) //we have to convert type = name to name = type, how lovely! + for(var/V in templist) + var/atom/A = V + hero_item_list[initial(A.name)] = A + return hero_item_list + +/obj/item/choice_beacon/hero/spawn_option(obj/choice,mob/living/M) + new choice(get_turf(M)) + to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from Sophronia Broadcasting. Message as follows: Please enjoy your Sophronia Broadcasting's 'History Comes Alive branded' Costume Set, exactly as shown in the hit show! Message ends.\"")) + +/obj/item/choice_beacon/augments + name = "augment beacon" + desc = "Summons augmentations. Can be used 3 times!" + uses = 3 + +/obj/item/choice_beacon/augments/generate_display_names() + var/static/list/augment_list + if(!augment_list) + augment_list = list() + var/list/templist = list( + /obj/item/organ/cyberimp/brain/anti_drop, + /obj/item/organ/cyberimp/arm/toolset, + /obj/item/organ/cyberimp/arm/surgery, + /obj/item/organ/cyberimp/chest/thrusters, + /obj/item/organ/lungs/cybernetic/tier3, + /obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof + for(var/V in templist) + var/atom/A = V + augment_list[initial(A.name)] = A + return augment_list + +/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M) + new choice(get_turf(M)) + to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")) + +/obj/item/choice_beacon/holy + name = "armaments beacon" + desc = "Contains a set of armaments for the chaplain." + +/obj/item/choice_beacon/holy/canUseBeacon(mob/living/user) + if(user.mind && user.mind.holy_role) + return ..() + else + playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) + return FALSE + +/obj/item/choice_beacon/holy/generate_display_names() + var/static/list/holy_item_list + if(!holy_item_list) + holy_item_list = list() + var/list/templist = typesof(/obj/item/storage/box/holy) + for(var/V in templist) + var/atom/A = V + holy_item_list[initial(A.name)] = A + return holy_item_list + +/obj/item/choice_beacon/holy/spawn_option(obj/choice,mob/living/M) + if(!GLOB.holy_armor_type) + ..() + playsound(src, 'sound/effects/pray_chaplain.ogg', 40, TRUE) + SSblackbox.record_feedback("tally", "chaplain_armor", 1, "[choice]") + GLOB.holy_armor_type = choice + else + to_chat(M, span_warning("A selection has already been made. Self-Destructing...")) + return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 6c01db3872..b37d5c7d87 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -364,16 +364,6 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/computer/mecha -/obj/item/circuitboard/computer/nanite_chamber_control - name = "Nanite Chamber Control (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/nanite_chamber_control - -/obj/item/circuitboard/computer/nanite_cloud_controller - name = "Nanite Cloud Control (Computer Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/computer/nanite_cloud_controller - /obj/item/circuitboard/computer/rdconsole name = "R&D Console (Computer Board)" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 9a8c25187b..a43f6bd92f 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -885,32 +885,6 @@ /obj/item/stock_parts/manipulator = 1) needs_anchored = FALSE -/obj/item/circuitboard/machine/nanite_chamber - name = "Nanite Chamber (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_chamber - req_components = list( - /obj/item/stock_parts/scanning_module = 2, - /obj/item/stock_parts/micro_laser = 2, - /obj/item/stock_parts/manipulator = 1) - -/obj/item/circuitboard/machine/nanite_program_hub - name = "Nanite Program Hub (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_program_hub - req_components = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/stock_parts/manipulator = 1) - -/obj/item/circuitboard/machine/nanite_programmer - name = "Nanite Programmer (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/nanite_programmer - req_components = list( - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/micro_laser = 2, - /obj/item/stock_parts/scanning_module = 1) - /obj/item/circuitboard/machine/processor/slime name = "Slime Processor (Machine Board)" greyscale_colors = CIRCUIT_COLOR_SCIENCE @@ -921,27 +895,6 @@ greyscale_colors = CIRCUIT_COLOR_SCIENCE build_path = /obj/machinery/rnd/production/protolathe/department/science -/obj/item/circuitboard/machine/public_nanite_chamber - name = "Public Nanite Chamber (Machine Board)" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/public_nanite_chamber - var/cloud_id = 1 - req_components = list( - /obj/item/stock_parts/micro_laser = 2, - /obj/item/stock_parts/manipulator = 1) - -/obj/item/circuitboard/machine/public_nanite_chamber/multitool_act(mob/living/user) - . = ..() - var/new_cloud = input("Set the public nanite chamber's Cloud ID (1-100).", "Cloud ID", cloud_id) as num|null - if(!new_cloud || (loc != user)) - to_chat(user, span_warning("You must hold the circuitboard to change its Cloud ID!")) - return - cloud_id = clamp(round(new_cloud, 1), 1, 100) - -/obj/item/circuitboard/machine/public_nanite_chamber/examine(mob/user) - . = ..() - . += "Cloud ID is currently set to [cloud_id]." - /obj/item/circuitboard/machine/quantumpad name = "Quantum Pad (Machine Board)" greyscale_colors = CIRCUIT_COLOR_SCIENCE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5b76faea2f..183022b171 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -6,7 +6,6 @@ T-RAY HEALTH ANALYZER GAS ANALYZER SLIME SCANNER -NANITE SCANNER GENE SCANNER */ @@ -412,7 +411,6 @@ GENE SCANNER render_list += "Detected cybernetic modifications:\n" render_list += "[cyberimp_detect]\n" - SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last
so we don't need handholding /proc/chemscan(mob/living/user, mob/living/M) @@ -778,35 +776,6 @@ GENE SCANNER \n[span_notice("Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]")]" to_chat(user, to_render + "\n========================") - -/obj/item/nanite_scanner - name = "nanite scanner" - icon = 'icons/obj/device.dmi' - icon_state = "nanite_scanner" - inhand_icon_state = "electronic" - worn_icon_state = "electronic" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - desc = "A hand-held body scanner able to detect nanites and their programming." - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - slot_flags = ITEM_SLOT_BELT - throwforce = 3 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/iron=200) - -/obj/item/nanite_scanner/attack(mob/living/M, mob/living/carbon/human/user) - user.visible_message(span_notice("[user] analyzes [M]'s nanites."), \ - span_notice("You analyze [M]'s nanites.")) - - add_fingerprint(user) - - var/response = SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, TRUE) - if(!response) - to_chat(user, span_info("No nanites detected in the subject.")) - /obj/item/sequence_scanner name = "genetic sequence scanner" icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 48d4e4005f..5e8976e58d 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -444,3 +444,18 @@ /obj/item/book/granter/crafting_recipe/pipegun_prime/recoil(mob/living/carbon/user) to_chat(user, span_warning("The book turns to dust in your hands.")) qdel(src) + +/obj/item/book/granter/crafting_recipe/trash_cannon + name = "diary of a demoted engineer" + desc = "A lost journal. The engineer seems very deranged about their demotion." + crafting_recipe_types = list( + /datum/crafting_recipe/trash_cannon, + /datum/crafting_recipe/trashball, + ) + icon_state = "book1" + oneuse = TRUE + remarks = list("\"I'll show them! I'll build a CANNON!\"", "\"Gunpowder is ideal, but i'll have to improvise...\"", "\"I savor the look on the CE's face when I BLOW down the walls to engineering!\"", "\"If the supermatter gets loose from my rampage, so be it!\"", "\"I'VE GONE COMPLETELY MENTAL!\"") + +/obj/item/book/granter/crafting_recipe/trash_cannon/recoil(mob/living/carbon/user) + to_chat(user, span_warning("The book turns to dust in your hands.")) + qdel(src) diff --git a/code/game/objects/items/gun_maintenance.dm b/code/game/objects/items/gun_maintenance.dm new file mode 100644 index 0000000000..0e8ae498a5 --- /dev/null +++ b/code/game/objects/items/gun_maintenance.dm @@ -0,0 +1,6 @@ +/obj/item/gun_maintenance_supplies + name = "gun maintenance supplies" + desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a Mosin Nagant to clean it." + icon = 'icons/obj/storage.dmi' + icon_state = "plasticbox" + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index c8a5c05214..0aa2211581 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -40,59 +40,6 @@ slowdown = 0 clothing_flags = NONE -/obj/item/choice_beacon/holy - name = "armaments beacon" - desc = "Contains a set of armaments for the chaplain." - -/obj/item/choice_beacon/holy/canUseBeacon(mob/living/user) - if(user.mind && user.mind.holy_role) - return ..() - else - playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) - return FALSE - -/obj/item/choice_beacon/holy/generate_display_names() - var/static/list/holy_item_list - if(!holy_item_list) - holy_item_list = list() - var/list/templist = typesof(/obj/item/storage/box/holy) - for(var/V in templist) - var/atom/A = V - holy_item_list[initial(A.name)] = A - return holy_item_list - -/obj/item/choice_beacon/holy/spawn_option(obj/choice,mob/living/M) - if(!GLOB.holy_armor_type) - ..() - playsound(src, 'sound/effects/pray_chaplain.ogg', 40, TRUE) - SSblackbox.record_feedback("tally", "chaplain_armor", 1, "[choice]") - GLOB.holy_armor_type = choice - else - to_chat(M, span_warning("A selection has already been made. Self-Destructing...")) - return - - -/obj/item/storage/box/holy/clock - name = "Forgotten kit" - -/obj/item/storage/box/holy/clock/PopulateContents() - new /obj/item/clothing/head/helmet/chaplain/clock(src) - new /obj/item/clothing/suit/armor/riot/chaplain/clock(src) - -/obj/item/storage/box/holy - name = "Templar Kit" - -/obj/item/storage/box/holy/PopulateContents() - new /obj/item/clothing/head/helmet/chaplain(src) - new /obj/item/clothing/suit/armor/riot/chaplain(src) - -/obj/item/storage/box/holy/student - name = "Profane Scholar Kit" - -/obj/item/storage/box/holy/student/PopulateContents() - new /obj/item/clothing/suit/armor/riot/chaplain/studentuni(src) - new /obj/item/clothing/head/helmet/chaplain/cage(src) - /obj/item/clothing/suit/armor/riot/chaplain/studentuni name = "student robe" desc = "The uniform of a bygone institute of learning." @@ -109,13 +56,6 @@ dynamic_hair_suffix = "" worn_y_offset = 7 -/obj/item/storage/box/holy/sentinel - name = "Stone Sentinel Kit" - -/obj/item/storage/box/holy/sentinel/PopulateContents() - new /obj/item/clothing/suit/armor/riot/chaplain/ancient(src) - new /obj/item/clothing/head/helmet/chaplain/ancient(src) - /obj/item/clothing/head/helmet/chaplain/ancient name = "ancient helmet" desc = "None may pass!" @@ -128,13 +68,6 @@ icon_state = "knight_ancient" inhand_icon_state = "knight_ancient" -/obj/item/storage/box/holy/witchhunter - name = "Witchhunter Kit" - -/obj/item/storage/box/holy/witchhunter/PopulateContents() - new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src) - new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src) - /obj/item/clothing/suit/armor/riot/chaplain/witchhunter name = "witchunter garb" desc = "This worn outfit saw much use back in the day." @@ -150,13 +83,6 @@ flags_cover = HEADCOVERSEYES flags_inv = HIDEEYES|HIDEHAIR -/obj/item/storage/box/holy/adept - name = "Divine Adept Kit" - -/obj/item/storage/box/holy/adept/PopulateContents() - new /obj/item/clothing/suit/armor/riot/chaplain/adept(src) - new /obj/item/clothing/head/helmet/chaplain/adept(src) - /obj/item/clothing/head/helmet/chaplain/adept name = "adept hood" desc = "Its only heretical when others do it." @@ -171,16 +97,6 @@ icon_state = "crusader" inhand_icon_state = "crusader" -/obj/item/storage/box/holy/follower - name = "Followers of the Chaplain Kit" - -/obj/item/storage/box/holy/follower/PopulateContents() - new /obj/item/clothing/suit/hooded/chaplain_hoodie/leader(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - /obj/item/clothing/suit/hooded/chaplain_hoodie name = "follower hoodie" desc = "Hoodie made for acolytes of the chaplain." diff --git a/code/game/objects/items/implants/implant_deathrattle.dm b/code/game/objects/items/implants/implant_deathrattle.dm index dd41812cb5..a7afe701c2 100644 --- a/code/game/objects/items/implants/implant_deathrattle.dm +++ b/code/game/objects/items/implants/implant_deathrattle.dm @@ -68,7 +68,7 @@ if(implant.imp_in == owner || !implant.imp_in) continue - // Deliberately the same message framing as nanite message + ghost deathrattle + // Deliberately the same message framing as ghost deathrattle var/mob/living/recipient = implant.imp_in to_chat(recipient, "You hear a strange, robotic voice in your head... \"[span_robot("[name] has died at [area].")]\"") recipient.playsound_local(get_turf(recipient), sound, vol = 75, vary = FALSE, pressure_affected = FALSE, use_reverb = FALSE) diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm deleted file mode 100644 index 4bd6c9f00d..0000000000 --- a/code/game/objects/items/miscellaneous.dm +++ /dev/null @@ -1,407 +0,0 @@ -/obj/item/choice_beacon - name = "choice beacon" - desc = "Hey, why are you viewing this?!! Please let CentCom know about this odd occurrence." - icon = 'icons/obj/device.dmi' - icon_state = "gangtool-blue" - inhand_icon_state = "radio" - var/uses = 1 - -/obj/item/choice_beacon/attack_self(mob/user) - if(canUseBeacon(user)) - generate_options(user) - -/obj/item/choice_beacon/proc/generate_display_names() // return the list that will be used in the choice selection. entries should be in (type.name = type) fashion. see choice_beacon/hero for how this is done. - return list() - -/obj/item/choice_beacon/proc/canUseBeacon(mob/living/user) - if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return TRUE - else - playsound(src, 'sound/machines/buzz-sigh.ogg', 40, TRUE) - return FALSE - -/obj/item/choice_beacon/proc/generate_options(mob/living/M) - var/list/display_names = generate_display_names() - if(!display_names.len) - return - var/choice = input(M,"Which item would you like to order?","Select an Item") as null|anything in sortList(display_names) - if(!choice || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - - spawn_option(display_names[choice],M) - uses-- - if(!uses) - qdel(src) - else - to_chat(M, span_notice("[uses] use[uses > 1 ? "s" : ""] remaining on the [src].")) - -/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M) - podspawn(list( - "target" = get_turf(src), - "style" = STYLE_BLUESPACE, - "spawn" = choice, - )) - var/msg = "After making your selection, you notice a strange target on the ground. It might be best to step back!" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(istype(H.ears, /obj/item/radio/headset)) - msg = "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows: [span_bold("Item request received. Your package is inbound, please stand back from the landing site.")] Message ends.\"" - to_chat(M, msg) - -/obj/item/choice_beacon/ingredient - name = "ingredient delivery beacon" - desc = "Summon a box of ingredients to help you get started cooking." - icon_state = "gangtool-white" - -/obj/item/choice_beacon/ingredient/generate_display_names() - var/list/ingredients = list() - for(var/V in subtypesof(/obj/item/storage/box/ingredients)) - var/obj/item/storage/box/ingredients/A = V - ingredients[initial(A.theme_name)] = A - return ingredients - -/obj/item/choice_beacon/ingredient/spawn_option(obj/choice,mob/living/M) - new choice(get_turf(M)) - to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from Sophronia Broadcasting. Message as follows: Please enjoy your Sophronia Broadcasting's 'Plasteel Chef' Ingredients Box, exactly as shown in the hit show! Message ends.\"")) - -/obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef used to spawn with, it shouldn't actually exist. - name = "ingredients box" - illustration = "fruit" - var/theme_name - -/obj/item/storage/box/ingredients/Initialize() - . = ..() - if(theme_name) - name = "[name] ([theme_name])" - desc = "A box containing supplementary ingredients for the aspiring chef. The box's theme is '[theme_name]'." - inhand_icon_state = "syringe_kit" - -/obj/item/storage/box/ingredients/wildcard - theme_name = "wildcard" - -/obj/item/storage/box/ingredients/wildcard/PopulateContents() - for(var/i in 1 to 7) - var/randomFood = pick(/obj/item/food/grown/chili, - /obj/item/food/grown/tomato, - /obj/item/food/grown/carrot, - /obj/item/food/grown/potato, - /obj/item/food/grown/potato/sweet, - /obj/item/food/grown/apple, - /obj/item/food/chocolatebar, - /obj/item/food/grown/cherries, - /obj/item/food/grown/banana, - /obj/item/food/grown/cabbage, - /obj/item/food/grown/soybeans, - /obj/item/food/grown/corn, - /obj/item/food/grown/mushroom/plumphelmet, - /obj/item/food/grown/mushroom/chanterelle) - new randomFood(src) - -/obj/item/storage/box/ingredients/fiesta - theme_name = "fiesta" - -/obj/item/storage/box/ingredients/fiesta/PopulateContents() - new /obj/item/food/tortilla(src) - for(var/i in 1 to 2) - new /obj/item/food/grown/corn(src) - new /obj/item/food/grown/soybeans(src) - new /obj/item/food/grown/chili(src) - -/obj/item/storage/box/ingredients/italian - theme_name = "italian" - -/obj/item/storage/box/ingredients/italian/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/food/grown/tomato(src) - new /obj/item/food/meatball(src) - new /obj/item/reagent_containers/food/drinks/bottle/wine(src) - -/obj/item/storage/box/ingredients/vegetarian - theme_name = "vegetarian" - -/obj/item/storage/box/ingredients/vegetarian/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/grown/carrot(src) - new /obj/item/food/grown/eggplant(src) - new /obj/item/food/grown/potato(src) - new /obj/item/food/grown/apple(src) - new /obj/item/food/grown/corn(src) - new /obj/item/food/grown/tomato(src) - -/obj/item/storage/box/ingredients/american - theme_name = "american" - -/obj/item/storage/box/ingredients/american/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/grown/potato(src) - new /obj/item/food/grown/tomato(src) - new /obj/item/food/grown/corn(src) - new /obj/item/food/meatball(src) - -/obj/item/storage/box/ingredients/fruity - theme_name = "fruity" - -/obj/item/storage/box/ingredients/fruity/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/grown/apple(src) - new /obj/item/food/grown/citrus/orange(src) - new /obj/item/food/grown/citrus/lemon(src) - new /obj/item/food/grown/citrus/lime(src) - new /obj/item/food/grown/watermelon(src) - -/obj/item/storage/box/ingredients/sweets - theme_name = "sweets" - -/obj/item/storage/box/ingredients/sweets/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/grown/cherries(src) - new /obj/item/food/grown/banana(src) - new /obj/item/food/chocolatebar(src) - new /obj/item/food/grown/cocoapod(src) - new /obj/item/food/grown/apple(src) - -/obj/item/storage/box/ingredients/delights - theme_name = "delights" - -/obj/item/storage/box/ingredients/delights/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/grown/potato/sweet(src) - new /obj/item/food/grown/bluecherries(src) - new /obj/item/food/grown/vanillapod(src) - new /obj/item/food/grown/cocoapod(src) - new /obj/item/food/grown/berries(src) - -/obj/item/storage/box/ingredients/grains - theme_name = "grains" - -/obj/item/storage/box/ingredients/grains/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/food/grown/oat(src) - new /obj/item/food/grown/wheat(src) - new /obj/item/food/grown/cocoapod(src) - new /obj/item/reagent_containers/honeycomb(src) - new /obj/item/seeds/poppy(src) - -/obj/item/storage/box/ingredients/carnivore - theme_name = "carnivore" - -/obj/item/storage/box/ingredients/carnivore/PopulateContents() - new /obj/item/food/meat/slab/bear(src) - new /obj/item/food/meat/slab/spider(src) - new /obj/item/food/spidereggs(src) - new /obj/item/food/fishmeat/carp(src) - new /obj/item/food/meat/slab/xeno(src) - new /obj/item/food/meat/slab/corgi(src) - new /obj/item/food/meatball(src) - -/obj/item/storage/box/ingredients/exotic - theme_name = "exotic" - -/obj/item/storage/box/ingredients/exotic/PopulateContents() - for(var/i in 1 to 2) - new /obj/item/food/fishmeat/carp(src) - new /obj/item/food/grown/soybeans(src) - new /obj/item/food/grown/cabbage(src) - new /obj/item/food/grown/chili(src) - -/obj/item/storage/box/ingredients/random - theme_name = "random" - desc = "This box should not exist, contact the proper authorities." - -/obj/item/storage/box/ingredients/random/Initialize() - .=..() - var/chosen_box = pick(subtypesof(/obj/item/storage/box/ingredients) - /obj/item/storage/box/ingredients/random) - new chosen_box(loc) - return INITIALIZE_HINT_QDEL - -/obj/item/choice_beacon/hero - name = "heroic beacon" - desc = "To summon heroes from the past to protect the future." - -/obj/item/choice_beacon/hero/generate_display_names() - var/static/list/hero_item_list - if(!hero_item_list) - hero_item_list = list() - var/list/templist = typesof(/obj/item/storage/box/hero) //we have to convert type = name to name = type, how lovely! - for(var/V in templist) - var/atom/A = V - hero_item_list[initial(A.name)] = A - return hero_item_list - -/obj/item/choice_beacon/hero/spawn_option(obj/choice,mob/living/M) - new choice(get_turf(M)) - to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from Sophronia Broadcasting. Message as follows: Please enjoy your Sophronia Broadcasting's 'History Comes Alive branded' Costume Set, exactly as shown in the hit show! Message ends.\"")) - - -/obj/item/storage/box/hero - name = "Courageous Tomb Raider - 1940's." - desc = "This legendary figure of still dubious historical accuracy is thought to have been a world-famous archeologist who embarked on countless adventures in far away lands, along with his trademark whip and fedora hat." - -/obj/item/storage/box/hero/PopulateContents() - new /obj/item/clothing/head/fedora/curator(src) - new /obj/item/clothing/suit/curator(src) - new /obj/item/clothing/under/rank/civilian/curator/treasure_hunter(src) - new /obj/item/clothing/shoes/workboots/mining(src) - new /obj/item/melee/curator_whip(src) - -/obj/item/storage/box/hero/astronaut - name = "First Man on the Moon - 1960's." - desc = "One small step for a man, one giant leap for mankind. Relive the beginnings of space exploration with this fully functional set of vintage EVA equipment." - -/obj/item/storage/box/hero/astronaut/PopulateContents() - new /obj/item/clothing/suit/space/nasavoid(src) - new /obj/item/clothing/head/helmet/space/nasavoid(src) - new /obj/item/tank/internals/oxygen(src) - new /obj/item/gps(src) - -/obj/item/storage/box/hero/scottish - name = "Braveheart, the Scottish rebel - 1300's." - desc = "Seemingly a legendary figure in the battle for Scottish independence, this historical figure is closely associated with blue facepaint, big swords, strange man skirts, and his ever enduring catchphrase: 'FREEDOM!!'" - -/obj/item/storage/box/hero/scottish/PopulateContents() - new /obj/item/clothing/under/costume/kilt(src) - new /obj/item/claymore/weak/ceremonial(src) - new /obj/item/toy/crayon/spraycan(src) - new /obj/item/clothing/shoes/sandal(src) - -/obj/item/storage/box/hero/carphunter - name = "Carp Hunter, Wildlife Expert - 2506." - desc = "Despite his nickname, this wildlife expert was mainly known as a passionate environmentalist and conservationist, often coming in contact with dangerous wildlife to teach about the beauty of nature." - -/obj/item/storage/box/hero/carphunter/PopulateContents() - new /obj/item/clothing/suit/space/hardsuit/carp/old(src) - new /obj/item/clothing/mask/gas/carp(src) - new /obj/item/kitchen/knife/hunting(src) - new /obj/item/storage/box/papersack/meat(src) - -/obj/item/choice_beacon/augments - name = "augment beacon" - desc = "Summons augmentations. Can be used 3 times!" - uses = 3 - -/obj/item/choice_beacon/augments/generate_display_names() - var/static/list/augment_list - if(!augment_list) - augment_list = list() - var/list/templist = list( - /obj/item/organ/cyberimp/brain/anti_drop, - /obj/item/organ/cyberimp/arm/toolset, - /obj/item/organ/cyberimp/arm/surgery, - /obj/item/organ/cyberimp/chest/thrusters, - /obj/item/organ/lungs/cybernetic/tier3, - /obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof - for(var/V in templist) - var/atom/A = V - augment_list[initial(A.name)] = A - return augment_list - -/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M) - new choice(get_turf(M)) - to_chat(M, span_hear("You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"")) - -/obj/item/skub - desc = "It's skub." - name = "skub" - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "skub" - w_class = WEIGHT_CLASS_BULKY - attack_verb_continuous = list("skubs") - attack_verb_simple = list("skub") - -/obj/item/skub/ComponentInitialize() - . = ..() - AddComponent(/datum/component/container_item/tank_holder, "holder_skub", FALSE) - -/obj/item/skub/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] has declared themself as anti-skub! The skub tears them apart!")) - - user.gib() - playsound(src, 'sound/items/eatfood.ogg', 50, TRUE, -1) - return MANUAL_SUICIDE - -/obj/item/virgin_mary - name = "\proper a picture of the virgin mary" - desc = "A small, cheap icon depicting the virgin mother." - icon = 'icons/obj/blackmarket.dmi' - icon_state = "madonna" - resistance_flags = FLAMMABLE - ///Has this item been used already. - var/used_up = FALSE - ///List of mobs that have already been mobbed. - var/static/list/mob_mobs = list() - -#define NICKNAME_CAP (MAX_NAME_LEN/2) -/obj/item/virgin_mary/attackby(obj/item/W, mob/user, params) - . = ..() - if(resistance_flags & ON_FIRE) - return - if(!burn_paper_product_attackby_check(W, user, TRUE)) - return - if(used_up) - return - if(!isliving(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. - return - var/mob/living/joe = user - - if(joe in mob_mobs) //Only one nickname fuckhead - to_chat(joe, span_warning("You have already been initiated into the mafioso life.")) - return - - to_chat(joe, span_notice("As you burn the picture, a nickname comes to mind...")) - var/nickname = stripped_input(joe, "Pick a nickname", "Mafioso Nicknames", null, NICKNAME_CAP, TRUE) - nickname = reject_bad_name(nickname, allow_numbers = FALSE, max_length = NICKNAME_CAP, ascii_only = TRUE) - if(!nickname) - return - var/new_name - var/space_position = findtext(joe.real_name, " ") - if(space_position)//Can we find a space? - new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" - else //Append otherwise - new_name = "[joe.real_name] \"[nickname]\"" - joe.real_name = new_name - used_up = TRUE - mob_mobs += joe - joe.say("My soul will burn like this saint if I betray my family. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) - to_chat(joe, span_userdanger("Being inducted into the mafia does not grant antagonist status.")) - -#undef NICKNAME_CAP - -/obj/item/virgin_mary/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] starts saying their Hail Mary's at a terrifying pace! It looks like [user.p_theyre()] trying to enter the afterlife!")) - user.say("Hail Mary, full of grace, the Lord is with thee. Blessed are thou amongst women, and blessed is the fruit of thy womb, Jesus. Holy Mary, mother of God, pray for us sinners, now and at the hour of our death. Amen. ", forced = /obj/item/virgin_mary) - addtimer(CALLBACK(src, .proc/manual_suicide, user), 75) - addtimer(CALLBACK(user, /atom/movable/proc/say, "O my Mother, preserve me this day from mortal sin..."), 50) - return MANUAL_SUICIDE - -/obj/item/virgin_mary/proc/manual_suicide(mob/living/user) - user.adjustOxyLoss(200) - user.death(0) - -// Bouquets -/obj/item/bouquet - name = "mixed bouquet" - desc = "A bouquet of sunflowers, lilies, and geraniums. How delightful." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "mixedbouquet" - -/obj/item/bouquet/sunflower - name = "sunflower bouquet" - desc = "A bright bouquet of sunflowers." - icon_state = "sunbouquet" - -/obj/item/bouquet/poppy - name = "poppy bouquet" - desc = "A bouquet of poppies. You feel loved just looking at it." - icon_state = "poppybouquet" - -/obj/item/bouquet/rose - name = "rose bouquet" - desc = "A bouquet of roses. A bundle of love." - icon_state = "rosebouquet" - -/obj/item/gun_maintenance_supplies - name = "gun maintenance supplies" - desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a Mosin Nagant to clean it." - icon = 'icons/obj/storage.dmi' - icon_state = "plasticbox" - w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 072dc87cbd..53b65285c8 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -100,8 +100,6 @@ var/turf/here = get_turf(src) var/turf/there = get_turf(H) if(here && there && (there.z == here.z || (is_station_level(here.z) && is_station_level(there.z)))) // Device and target should be on the same level or different levels of the same station - if (H in GLOB.nanite_sensors_list) - return TRUE if (istype(H.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = H.w_uniform if(U.has_sensor && (U.sensor_mode >= SENSOR_COORDS || ignore_suit_sensor_level)) // Suit sensors must be on maximum or a contractor pinpointer diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 841b5d834e..c99bdfd2f6 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -502,7 +502,7 @@ /obj/item/toy/plush/lizard_plushie name = "lizard plushie" desc = "An adorable stuffed toy that resembles a lizardperson." - icon_state = "map_pushie_lizard" + icon_state = "map_plushie_lizard" greyscale_config = /datum/greyscale_config/plush_lizard attack_verb_continuous = list("claws", "hisses", "tail slaps") attack_verb_simple = list("claw", "hiss", "tail slap") diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index e00fe68aae..6f4da1b5a9 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -83,6 +83,7 @@ else if(W.type == type) to_chat(user, span_warning("You're fairly certain that putting a pneumatic cannon inside another pneumatic cannon would cause a spacetime disruption.")) else if(W.tool_behaviour == TOOL_WRENCH) + playsound(src, 'sound/items/ratchet.ogg', 50, TRUE) switch(pressureSetting) if(1) pressureSetting = 2 diff --git a/code/game/objects/items/skub.dm b/code/game/objects/items/skub.dm new file mode 100644 index 0000000000..a35f817f54 --- /dev/null +++ b/code/game/objects/items/skub.dm @@ -0,0 +1,19 @@ +/obj/item/skub + desc = "It's skub." + name = "skub" + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "skub" + w_class = WEIGHT_CLASS_BULKY + attack_verb_continuous = list("skubs") + attack_verb_simple = list("skub") + +/obj/item/skub/ComponentInitialize() + . = ..() + AddComponent(/datum/component/container_item/tank_holder, "holder_skub", FALSE) + +/obj/item/skub/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] has declared themself as anti-skub! The skub tears them apart!")) + + user.gib() + playsound(src, 'sound/items/eatfood.ogg', 50, TRUE, -1) + return MANUAL_SUICIDE diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 10a8a18236..4281c26161 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -460,6 +460,7 @@ icon_state = "construction_bag" worn_icon_state = "construction_bag" desc = "A bag for storing small construction components." + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS resistance_flags = FLAMMABLE /obj/item/storage/bag/construction/ComponentInitialize() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 75b14bd6cb..3dd39d019a 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -105,14 +105,6 @@ for(var/i in 1 to 7) new /obj/item/disk/data(src) -/obj/item/storage/box/disks_nanite - name = "nanite program disks box" - illustration = "disk_kit" - -/obj/item/storage/box/disks_nanite/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/disk/nanite_program(src) - // Ordinary survival box /obj/item/storage/box/survival name = "survival box" @@ -1392,3 +1384,246 @@ /obj/item/slimecross/stabilized/rainbow=1,\ ) generate_items_inside(items_inside,src) + +/obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef used to spawn with, it shouldn't actually exist. + name = "ingredients box" + illustration = "fruit" + var/theme_name + +/obj/item/storage/box/ingredients/Initialize() + . = ..() + if(theme_name) + name = "[name] ([theme_name])" + desc = "A box containing supplementary ingredients for the aspiring chef. The box's theme is '[theme_name]'." + inhand_icon_state = "syringe_kit" + +/obj/item/storage/box/ingredients/wildcard + theme_name = "wildcard" + +/obj/item/storage/box/ingredients/wildcard/PopulateContents() + for(var/i in 1 to 7) + var/randomFood = pick(/obj/item/food/grown/chili, + /obj/item/food/grown/tomato, + /obj/item/food/grown/carrot, + /obj/item/food/grown/potato, + /obj/item/food/grown/potato/sweet, + /obj/item/food/grown/apple, + /obj/item/food/chocolatebar, + /obj/item/food/grown/cherries, + /obj/item/food/grown/banana, + /obj/item/food/grown/cabbage, + /obj/item/food/grown/soybeans, + /obj/item/food/grown/corn, + /obj/item/food/grown/mushroom/plumphelmet, + /obj/item/food/grown/mushroom/chanterelle) + new randomFood(src) + +/obj/item/storage/box/ingredients/fiesta + theme_name = "fiesta" + +/obj/item/storage/box/ingredients/fiesta/PopulateContents() + new /obj/item/food/tortilla(src) + for(var/i in 1 to 2) + new /obj/item/food/grown/corn(src) + new /obj/item/food/grown/soybeans(src) + new /obj/item/food/grown/chili(src) + +/obj/item/storage/box/ingredients/italian + theme_name = "italian" + +/obj/item/storage/box/ingredients/italian/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/food/grown/tomato(src) + new /obj/item/food/meatball(src) + new /obj/item/reagent_containers/food/drinks/bottle/wine(src) + +/obj/item/storage/box/ingredients/vegetarian + theme_name = "vegetarian" + +/obj/item/storage/box/ingredients/vegetarian/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/grown/carrot(src) + new /obj/item/food/grown/eggplant(src) + new /obj/item/food/grown/potato(src) + new /obj/item/food/grown/apple(src) + new /obj/item/food/grown/corn(src) + new /obj/item/food/grown/tomato(src) + +/obj/item/storage/box/ingredients/american + theme_name = "american" + +/obj/item/storage/box/ingredients/american/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/grown/potato(src) + new /obj/item/food/grown/tomato(src) + new /obj/item/food/grown/corn(src) + new /obj/item/food/meatball(src) + +/obj/item/storage/box/ingredients/fruity + theme_name = "fruity" + +/obj/item/storage/box/ingredients/fruity/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/grown/apple(src) + new /obj/item/food/grown/citrus/orange(src) + new /obj/item/food/grown/citrus/lemon(src) + new /obj/item/food/grown/citrus/lime(src) + new /obj/item/food/grown/watermelon(src) + +/obj/item/storage/box/ingredients/sweets + theme_name = "sweets" + +/obj/item/storage/box/ingredients/sweets/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/grown/cherries(src) + new /obj/item/food/grown/banana(src) + new /obj/item/food/chocolatebar(src) + new /obj/item/food/grown/cocoapod(src) + new /obj/item/food/grown/apple(src) + +/obj/item/storage/box/ingredients/delights + theme_name = "delights" + +/obj/item/storage/box/ingredients/delights/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/grown/potato/sweet(src) + new /obj/item/food/grown/bluecherries(src) + new /obj/item/food/grown/vanillapod(src) + new /obj/item/food/grown/cocoapod(src) + new /obj/item/food/grown/berries(src) + +/obj/item/storage/box/ingredients/grains + theme_name = "grains" + +/obj/item/storage/box/ingredients/grains/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/food/grown/oat(src) + new /obj/item/food/grown/wheat(src) + new /obj/item/food/grown/cocoapod(src) + new /obj/item/reagent_containers/honeycomb(src) + new /obj/item/seeds/poppy(src) + +/obj/item/storage/box/ingredients/carnivore + theme_name = "carnivore" + +/obj/item/storage/box/ingredients/carnivore/PopulateContents() + new /obj/item/food/meat/slab/bear(src) + new /obj/item/food/meat/slab/spider(src) + new /obj/item/food/spidereggs(src) + new /obj/item/food/fishmeat/carp(src) + new /obj/item/food/meat/slab/xeno(src) + new /obj/item/food/meat/slab/corgi(src) + new /obj/item/food/meatball(src) + +/obj/item/storage/box/ingredients/exotic + theme_name = "exotic" + +/obj/item/storage/box/ingredients/exotic/PopulateContents() + for(var/i in 1 to 2) + new /obj/item/food/fishmeat/carp(src) + new /obj/item/food/grown/soybeans(src) + new /obj/item/food/grown/cabbage(src) + new /obj/item/food/grown/chili(src) + +/obj/item/storage/box/ingredients/random + theme_name = "random" + desc = "This box should not exist, contact the proper authorities." + +/obj/item/storage/box/ingredients/random/Initialize() + .=..() + var/chosen_box = pick(subtypesof(/obj/item/storage/box/ingredients) - /obj/item/storage/box/ingredients/random) + new chosen_box(loc) + return INITIALIZE_HINT_QDEL + +/obj/item/storage/box/hero + name = "Courageous Tomb Raider - 1940's." + desc = "This legendary figure of still dubious historical accuracy is thought to have been a world-famous archeologist who embarked on countless adventures in far away lands, along with his trademark whip and fedora hat." + +/obj/item/storage/box/hero/PopulateContents() + new /obj/item/clothing/head/fedora/curator(src) + new /obj/item/clothing/suit/curator(src) + new /obj/item/clothing/under/rank/civilian/curator/treasure_hunter(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/melee/curator_whip(src) + +/obj/item/storage/box/hero/astronaut + name = "First Man on the Moon - 1960's." + desc = "One small step for a man, one giant leap for mankind. Relive the beginnings of space exploration with this fully functional set of vintage EVA equipment." + +/obj/item/storage/box/hero/astronaut/PopulateContents() + new /obj/item/clothing/suit/space/nasavoid(src) + new /obj/item/clothing/head/helmet/space/nasavoid(src) + new /obj/item/tank/internals/oxygen(src) + new /obj/item/gps(src) + +/obj/item/storage/box/hero/scottish + name = "Braveheart, the Scottish rebel - 1300's." + desc = "Seemingly a legendary figure in the battle for Scottish independence, this historical figure is closely associated with blue facepaint, big swords, strange man skirts, and his ever enduring catchphrase: 'FREEDOM!!'" + +/obj/item/storage/box/hero/scottish/PopulateContents() + new /obj/item/clothing/under/costume/kilt(src) + new /obj/item/claymore/weak/ceremonial(src) + new /obj/item/toy/crayon/spraycan(src) + new /obj/item/clothing/shoes/sandal(src) + +/obj/item/storage/box/hero/carphunter + name = "Carp Hunter, Wildlife Expert - 2506." + desc = "Despite his nickname, this wildlife expert was mainly known as a passionate environmentalist and conservationist, often coming in contact with dangerous wildlife to teach about the beauty of nature." + +/obj/item/storage/box/hero/carphunter/PopulateContents() + new /obj/item/clothing/suit/space/hardsuit/carp/old(src) + new /obj/item/clothing/mask/gas/carp(src) + new /obj/item/kitchen/knife/hunting(src) + new /obj/item/storage/box/papersack/meat(src) + +/obj/item/storage/box/holy/clock + name = "Forgotten kit" + +/obj/item/storage/box/holy/clock/PopulateContents() + new /obj/item/clothing/head/helmet/chaplain/clock(src) + new /obj/item/clothing/suit/armor/riot/chaplain/clock(src) + +/obj/item/storage/box/holy + name = "Templar Kit" + +/obj/item/storage/box/holy/PopulateContents() + new /obj/item/clothing/head/helmet/chaplain(src) + new /obj/item/clothing/suit/armor/riot/chaplain(src) + +/obj/item/storage/box/holy/student + name = "Profane Scholar Kit" + +/obj/item/storage/box/holy/student/PopulateContents() + new /obj/item/clothing/suit/armor/riot/chaplain/studentuni(src) + new /obj/item/clothing/head/helmet/chaplain/cage(src) + +/obj/item/storage/box/holy/sentinel + name = "Stone Sentinel Kit" + +/obj/item/storage/box/holy/sentinel/PopulateContents() + new /obj/item/clothing/suit/armor/riot/chaplain/ancient(src) + new /obj/item/clothing/head/helmet/chaplain/ancient(src) + +/obj/item/storage/box/holy/witchhunter + name = "Witchhunter Kit" + +/obj/item/storage/box/holy/witchhunter/PopulateContents() + new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src) + new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src) + +/obj/item/storage/box/holy/adept + name = "Divine Adept Kit" + +/obj/item/storage/box/holy/adept/PopulateContents() + new /obj/item/clothing/suit/armor/riot/chaplain/adept(src) + new /obj/item/clothing/head/helmet/chaplain/adept(src) + +/obj/item/storage/box/holy/follower + name = "Followers of the Chaplain Kit" + +/obj/item/storage/box/holy/follower/PopulateContents() + new /obj/item/clothing/suit/hooded/chaplain_hoodie/leader(src) + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) + new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 570e9a2f92..9f0ec16315 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -43,29 +43,20 @@ /obj/item/storage/wallet/Exited(atom/movable/gone, direction) . = ..() - refreshID(removed = TRUE) + if(istype(gone, /obj/item/card/id)) + refreshID() /** * Calculates the new front ID. * * Picks the ID card that has the most combined command or higher tier accesses. - * Arguments: - * * removed - If this proc was called because a card was removed. There's a chance we don't need to calculate the new front ID if a card was removed. */ -/obj/item/storage/wallet/proc/refreshID(removed = FALSE) +/obj/item/storage/wallet/proc/refreshID() LAZYCLEARLIST(combined_access) - // If the front_id is still in our wallet an we removed a card, we can return early. - if((front_id in src) && removed) - return - front_id = null var/winning_tally = 0 - for(var/card in contents) - var/obj/item/card/id/id_card = card - if(!istype(id_card)) - continue - + for(var/obj/item/card/id/id_card in contents) // Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this. if(HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD)) front_id = id_card @@ -94,7 +85,8 @@ /obj/item/storage/wallet/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() - refreshID(removed = FALSE) + if(istype(arrived, /obj/item/card/id)) + refreshID() /obj/item/storage/wallet/update_overlays() . = ..() diff --git a/code/game/objects/items/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm new file mode 100644 index 0000000000..d5ac9f761f --- /dev/null +++ b/code/game/objects/items/virgin_mary.dm @@ -0,0 +1,57 @@ +/obj/item/virgin_mary + name = "\proper a picture of the virgin mary" + desc = "A small, cheap icon depicting the virgin mother." + icon = 'icons/obj/blackmarket.dmi' + icon_state = "madonna" + resistance_flags = FLAMMABLE + ///Has this item been used already. + var/used_up = FALSE + ///List of mobs that have already been mobbed. + var/static/list/mob_mobs = list() + +#define NICKNAME_CAP (MAX_NAME_LEN/2) +/obj/item/virgin_mary/attackby(obj/item/W, mob/user, params) + . = ..() + if(resistance_flags & ON_FIRE) + return + if(!burn_paper_product_attackby_check(W, user, TRUE)) + return + if(used_up) + return + if(!isliving(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. + return + var/mob/living/joe = user + + if(joe in mob_mobs) //Only one nickname fuckhead + to_chat(joe, span_warning("You have already been initiated into the mafioso life.")) + return + + to_chat(joe, span_notice("As you burn the picture, a nickname comes to mind...")) + var/nickname = stripped_input(joe, "Pick a nickname", "Mafioso Nicknames", null, NICKNAME_CAP, TRUE) + nickname = reject_bad_name(nickname, allow_numbers = FALSE, max_length = NICKNAME_CAP, ascii_only = TRUE) + if(!nickname) + return + var/new_name + var/space_position = findtext(joe.real_name, " ") + if(space_position)//Can we find a space? + new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" + else //Append otherwise + new_name = "[joe.real_name] \"[nickname]\"" + joe.real_name = new_name + used_up = TRUE + mob_mobs += joe + joe.say("My soul will burn like this saint if I betray my family. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) + to_chat(joe, span_userdanger("Being inducted into the mafia does not grant antagonist status.")) + +#undef NICKNAME_CAP + +/obj/item/virgin_mary/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] starts saying their Hail Mary's at a terrifying pace! It looks like [user.p_theyre()] trying to enter the afterlife!")) + user.say("Hail Mary, full of grace, the Lord is with thee. Blessed are thou amongst women, and blessed is the fruit of thy womb, Jesus. Holy Mary, mother of God, pray for us sinners, now and at the hour of our death. Amen. ", forced = /obj/item/virgin_mary) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 75) + addtimer(CALLBACK(user, /atom/movable/proc/say, "O my Mother, preserve me this day from mortal sin..."), 50) + return MANUAL_SUICIDE + +/obj/item/virgin_mary/proc/manual_suicide(mob/living/user) + user.adjustOxyLoss(200) + user.death(0) diff --git a/code/game/objects/structures/cannon.dm b/code/game/objects/structures/cannon.dm deleted file mode 100644 index ce8b1807b8..0000000000 --- a/code/game/objects/structures/cannon.dm +++ /dev/null @@ -1,103 +0,0 @@ -/obj/structure/cannon - name = "cannon" - desc = "Holemaker Deluxe: A sporty model with a good stop power. Any cannon enthusiast should be expected to start here." - density = TRUE - anchored = TRUE - icon_state = "falconet_patina" - max_integrity = 300 - var/obj/item/stack/cannonball/loaded_cannonball = null - var/charge_ignited = FALSE - var/fire_delay = 15 - var/charge_size = 15 - var/fire_sound = 'sound/weapons/gun/general/cannon.ogg' - -/obj/structure/cannon/Initialize() - . = ..() - create_reagents(charge_size) - -/obj/structure/cannon/proc/fire() - for(var/mob/shaken_mob in urange(10, src)) - if(shaken_mob.stat == CONSCIOUS) - shake_camera(shaken_mob, 3, 1) - - playsound(src, fire_sound, 50, TRUE) - if(loaded_cannonball) - var/obj/projectile/fired_projectile = new loaded_cannonball.projectile_type(get_turf(src)) - QDEL_NULL(loaded_cannonball) - fired_projectile.firer = src - fired_projectile.fired_from = src - fired_projectile.fire(dir2angle(dir)) - reagents.remove_all() - charge_ignited = FALSE - -/obj/structure/cannon/attackby(obj/item/W, mob/user, params) - if(charge_ignited) - to_chat(user, span_danger("[src] is about to fire!")) - return - var/ignition_message = W.ignition_effect(src, user) - - if(istype(W, /obj/item/stack/cannonball)) - if(loaded_cannonball) - to_chat(user, span_warning("[src] is already loaded!")) - else - var/obj/item/stack/cannonball/cannoneers_balls = W - loaded_cannonball = new cannoneers_balls.type(src, 1) - loaded_cannonball.copy_evidences(cannoneers_balls) - to_chat(user, span_notice("You load a [cannoneers_balls.singular_name] into [src].")) - cannoneers_balls.use(1, transfer = TRUE) - return - - else if(ignition_message) - if(!reagents.has_reagent(/datum/reagent/gunpowder,15)) - to_chat(user, span_warning("[src] needs at least 15u of gunpowder to fire!")) - return - visible_message(ignition_message) - log_game("Cannon fired by [key_name(user)] in [AREACOORD(src)]") - addtimer(CALLBACK(src, .proc/fire), fire_delay) - charge_ignited = TRUE - return - - else if(istype(W, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/powder_keg = W - if(!(powder_keg.reagent_flags & OPENCONTAINER)) - return ..() - if(istype(powder_keg, /obj/item/reagent_containers/glass/rag)) - return ..() - - if(!powder_keg.reagents.total_volume) - to_chat(user, span_warning("[powder_keg] is empty!")) - return - else if(!powder_keg.reagents.has_reagent(/datum/reagent/gunpowder, charge_size)) - to_chat(user, span_warning("[powder_keg] doesn't have at least 15u of gunpowder to fill [src]!")) - return - if(reagents.has_reagent(/datum/reagent/gunpowder, charge_size)) - to_chat(user, span_warning("[src] already contains a full charge of powder! It would be unwise to add more.")) - return - powder_keg.reagents.trans_id_to(src, /datum/reagent/gunpowder, amount = charge_size) - to_chat(user, span_notice("You load [src] with a charge of powder from [powder_keg].")) - return - if(W.tool_behaviour == TOOL_WRENCH) - if(default_unfasten_wrench(user, W, time = 2 SECONDS)) - return - ..() - -/obj/item/paper/crumpled/muddy/fluff/cannon_instructions - name = "Mast of Cannon's Past's Cannon Instructions" - desc = "A quickly written note detailing the basics of firing a cannon. Who wrote this?" - info = @{" - -Ye don't know how to load cannon, and ye call yerself a fearsome pirate? I think ye be more alike a space sailor under the space monarchy's flag! Alas, everyone must learn how to blast holes in enemy ships. And thus:
- -
HOW YE FIRES A CANNON:
- -BE STEP ONE: LOAD THE LEAD BALL O' YE CHOICE!
-BE STEP TWO: LOAD 15U PIRATE STANDARD CHARGE O' GUNPOWDER!
-BE STEP THREE: LIGHT THE FUSE WITH SOMETHING, AND LET ER' RIP!
- -
CANNONBALL TYPES:
- -REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any limb it hits, and most certainly down anyone hit in the chest! If they are not directly hit, they will be at least hurt by the shrapnel!
-EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!
-MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!
-THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned! - "} diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm new file mode 100644 index 0000000000..395fb3b314 --- /dev/null +++ b/code/game/objects/structures/cannons/cannon.dm @@ -0,0 +1,138 @@ +///how much projectile damage is lost when using a bad fuel +#define BAD_FUEL_DAMAGE_TAX 20 +///extra chance it explodes upon firing +#define BAD_FUEL_EXPLODE_PROBABILTY 10 + +/obj/structure/cannon + name = "cannon" + desc = "Holemaker Deluxe: A sporty model with a good stop power. Any cannon enthusiast should be expected to start here." + density = TRUE + anchored = TRUE + icon_state = "falconet_patina" + max_integrity = 300 + ///whether the cannon can be unwrenched from the ground. + var/anchorable_cannon = TRUE + var/obj/item/stack/cannonball/loaded_cannonball = null + var/charge_ignited = FALSE + var/fire_delay = 15 + var/charge_size = 15 + var/fire_sound = 'sound/weapons/gun/general/cannon.ogg' + +/obj/structure/cannon/Initialize() + . = ..() + create_reagents(charge_size) + +/obj/structure/cannon/examine(mob/user) + . = ..() + . += span_notice("[src] accepts gunpowder or welding fuel.") + . += span_warning("Using welding fuel will weaken the force of the projectile fired.") + +/obj/structure/cannon/proc/fire() + for(var/mob/shaken_mob in urange(10, src)) + if(shaken_mob.stat == CONSCIOUS) + shake_camera(shaken_mob, 3, 1) + + playsound(src, fire_sound, 50, TRUE) + flick(icon_state+"_fire", src) + if(loaded_cannonball) + var/obj/projectile/fired_projectile = new loaded_cannonball.projectile_type(get_turf(src)) + if(reagents.has_reagent(/datum/reagent/fuel, charge_size)) + fired_projectile.damage = max(2, fired_projectile.damage - BAD_FUEL_DAMAGE_TAX) + QDEL_NULL(loaded_cannonball) + fired_projectile.firer = src + fired_projectile.fired_from = src + fired_projectile.fire(dir2angle(dir)) + reagents.remove_all() + charge_ignited = FALSE + +/obj/structure/cannon/attackby(obj/item/used_item, mob/user, params) + if(charge_ignited) + balloon_alert(user, "it's gonna fire!") + return + var/ignition_message = used_item.ignition_effect(src, user) + + if(istype(used_item, /obj/item/stack/cannonball)) + if(loaded_cannonball) + balloon_alert(user, "already loaded!") + else + var/obj/item/stack/cannonball/cannoneers_balls = used_item + loaded_cannonball = new cannoneers_balls.type(src, 1) + loaded_cannonball.copy_evidences(cannoneers_balls) + balloon_alert(user, "loaded a [cannoneers_balls.singular_name]") + cannoneers_balls.use(1, transfer = TRUE) + return + + else if(ignition_message) + if(!reagents.has_reagent(/datum/reagent/gunpowder,charge_size) || !reagents.has_reagent(/datum/reagent/fuel,charge_size)) + balloon_alert(user, "needs [reagents.maximum_volume]u of charge!") + return + visible_message(ignition_message) + log_game("Cannon fired by [key_name(user)] in [AREACOORD(src)]") + addtimer(CALLBACK(src, .proc/fire), fire_delay) + charge_ignited = TRUE + return + + else if(istype(used_item, /obj/item/reagent_containers)) + var/obj/item/reagent_containers/powder_keg = used_item + if(!(powder_keg.reagent_flags & OPENCONTAINER)) + return ..() + if(istype(powder_keg, /obj/item/reagent_containers/glass/rag)) + return ..() + + if(!powder_keg.reagents.total_volume) + balloon_alert(user, "[powder_keg] is empty!") + return + if(reagents.total_volume == reagents.maximum_volume) + balloon_alert(user, "[src] is full!") + return + var/has_enough_gunpowder = powder_keg.reagents.has_reagent(/datum/reagent/gunpowder, charge_size) + var/has_enough_alt_fuel = powder_keg.reagents.has_reagent(/datum/reagent/fuel, charge_size) + if(!has_enough_gunpowder && !has_enough_alt_fuel) + balloon_alert(user, "[powder_keg] needs 15u of charge to load!") + to_chat(user, span_warning("[powder_keg] doesn't have at least 15u of gunpowder to fill [src]!")) + return + if(has_enough_gunpowder) + powder_keg.reagents.trans_id_to(src, /datum/reagent/gunpowder, amount = charge_size) + balloon_alert(user, "[src] loaded with gunpowder") + return + if(has_enough_alt_fuel) + powder_keg.reagents.trans_id_to(src, /datum/reagent/fuel, amount = charge_size) + balloon_alert(user, "[src] loaded with welding fuel") + return + if(anchorable_cannon && used_item.tool_behaviour == TOOL_WRENCH) + if(default_unfasten_wrench(user, used_item, time = 2 SECONDS)) + return + ..() + +/obj/structure/cannon/trash + name = "trash cannon" + desc = "Okay, sure, you could call it a toolbox welded to an opened oxygen tank cabled to a skateboard, but it's a TRASH CANNON to us." + icon_state = "garbagegun" + anchored = FALSE + anchorable_cannon = FALSE + var/fires_before_deconstruction = 5 + +/obj/structure/cannon/trash/fire() + var/explode_chance = 10 + var/used_alt_fuel = reagents.has_reagent(/datum/reagent/fuel, charge_size) + if(used_alt_fuel) + explode_chance += BAD_FUEL_EXPLODE_PROBABILTY + . = ..() + fires_before_deconstruction-- + if(used_alt_fuel) + fires_before_deconstruction-- + if(prob(explode_chance)) + visible_message(span_userdanger("[src] explodes!")) + explosion(src, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) + return + if(fires_before_deconstruction <= 0) + visible_message(span_warning("[src] falls apart from operation!")) + qdel(src) + +/obj/structure/cannon/trash/Destroy() + new /obj/item/stack/sheet/iron/five(src.loc) + new /obj/item/stack/rods(src.loc) + . = ..() + +#undef BAD_FUEL_DAMAGE_TAX +#undef BAD_FUEL_EXPLODE_PROBABILTY diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm new file mode 100644 index 0000000000..1ae484598d --- /dev/null +++ b/code/game/objects/structures/cannons/cannon_instructions.dm @@ -0,0 +1,20 @@ +/obj/item/paper/crumpled/muddy/fluff/cannon_instructions + name = "Mast of Cannon's Past's Cannon Instructions" + desc = "A quickly written note detailing the basics of firing a cannon. Who wrote this?" + info = @{" + +Ye don't know how to load cannon, and ye call yerself a fearsome pirate? I think ye be more alike a space sailor under the space monarchy's flag! Alas, everyone must learn how to blast holes in enemy ships. And thus:
+ +
HOW YE FIRES A CANNON:
+ +BE STEP ONE: LOAD THE LEAD BALL O' YE CHOICE!
+BE STEP TWO: LOAD 15U PIRATE STANDARD CHARGE O' GUNPOWDER!
+BE STEP THREE: LIGHT THE FUSE WITH SOMETHING, AND LET ER' RIP!
+ +
CANNONBALL TYPES:
+ +REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any limb it hits, and most certainly down anyone hit in the chest! If they are not directly hit, they will be at least hurt by the shrapnel!
+EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!
+MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!
+THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned! + "} diff --git a/code/game/objects/items/stacks/cannonballs.dm b/code/game/objects/structures/cannons/cannonballs.dm similarity index 83% rename from code/game/objects/items/stacks/cannonballs.dm rename to code/game/objects/structures/cannons/cannonballs.dm index 4f66129932..62a05a270a 100644 --- a/code/game/objects/items/stacks/cannonballs.dm +++ b/code/game/objects/structures/cannons/cannonballs.dm @@ -56,3 +56,15 @@ /obj/item/stack/cannonball/the_big_one/five amount = 5 + +/obj/item/stack/cannonball/trashball + name = "trashballs" + singular_name = "trashball" + desc = "A clump of tightly packed garbage. It'll work as a cannonball, but it may be unhealthy to actually put this in a real cannon." + max_amount = 4 + icon_state = "trashballs" + merge_type = /obj/item/stack/cannonball/trashball + projectile_type = /obj/projectile/bullet/cannonball/trashball + +/obj/item/stack/cannonball/trashball/four + amount = 4 diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index b2db4a716f..f865ef4688 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -263,11 +263,13 @@ /obj/structure/closet/body_bag/environmental/prisoner/attack_hand_secondary(mob/user, modifiers) if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc)) return - if(!opened) - togglelock(user) - return TRUE + togglelock(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/structure/closet/body_bag/environmental/prisoner/togglelock(mob/living/user, silent) + if(opened) + to_chat(user, span_warning("You can't close the buckles while [src] is unzipped!")) + return if(user in contents) to_chat(user, span_warning("You can't reach the buckles from here!")) return @@ -276,7 +278,7 @@ if(!sinched) for(var/mob/living/target in contents) to_chat(target, span_userdanger("You feel the lining of [src] tighten around you! Soon, you won't be able to escape!")) - user.visible_message(span_notice("You begin sinching down the buckles on [src].")) + user.visible_message(span_notice("[user] begins sinching down the buckles on [src].")) if(!(do_after(user,(sinch_time),target = src))) return sinched = !sinched @@ -330,7 +332,7 @@ /obj/structure/closet/body_bag/environmental/prisoner/syndicate/remove_air(amount) if(sinched) refresh_air() - return air_contents // The internals for this bag are bottomless. Syndicate bluespace trickery. + return air_contents.remove(amount) // The internals for this bag are bottomless. Syndicate bluespace trickery. return ..(amount) /obj/structure/closet/body_bag/environmental/prisoner/syndicate/return_analyzable_air() diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm index 0483fd5f57..222c2dc273 100644 --- a/code/game/objects/structures/signs/signs_departments.dm +++ b/code/game/objects/structures/signs/signs_departments.dm @@ -77,13 +77,6 @@ icon_state = "xenobio" is_editable = TRUE -/obj/structure/sign/departments/nanites - name = "\improper Nanite Lab sign" - sign_change_name = "Department - Science: Nanites" - desc = "A sign labelling an area where testing and development of nanites is performed." - icon_state = "nanites" - is_editable = TRUE - ///////SERVICE /obj/structure/sign/departments/botany diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index 2d208217ec..f430fe4818 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -17,7 +17,8 @@ /turf/open/floor/iron/rust_heretic_act() if(prob(70)) new /obj/effect/temp_visual/glowing_rune(src) - ChangeTurf(/turf/open/floor/plating) + var/atom/changed_turf = ChangeTurf(/turf/open/floor/plating) + changed_turf.AddComponent(/datum/component/rust) return ..() diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 692550c859..eaeb50000a 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -204,8 +204,13 @@ desc = "Corrupted steel." icon_state = "plating_rust" -/turf/open/floor/plating/rust/plasma - initial_gas_mix = "plasma=104;TEMP=293.15" +/turf/open/floor/plating/plasma + initial_gas_mix = ATMOS_TANK_PLASMA +/turf/open/floor/plating/plasma/rust/Initialize(mapload) + . = ..() + // Because this is a fluff turf explicitly for KiloStation it doesn't make sense to ChangeTurf like usual + // Especially since it looks like we don't even change the default icon/iconstate??? + AddComponent(/datum/component/rust) /turf/open/floor/stone name = "stone brick floor" diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 10fc2bda64..6b9bc4ff1e 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -214,3 +214,7 @@ /turf/open/floor/plating/asteroid/snow/atmosphere initial_gas_mix = FROZEN_ATMOS planetary_atmos = FALSE + +/turf/open/floor/plating/asteroid/snow/standard_air + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f51dd30bbf..01d33e4f33 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -586,10 +586,6 @@ GLOBAL_LIST_EMPTY(station_turfs) V.icon_state = "vomitpurp_[pick(1,4)]" else if (toxvomit == VOMIT_TOXIC) V.icon_state = "vomittox_[pick(1,4)]" - else if (toxvomit == VOMIT_NANITE) - V.name = "metallic slurry" - V.desc = "A puddle of metallic slurry that looks vaguely like very fine sand. It almost seems like it's moving..." - V.icon_state = "vomitnanite_[pick(1,4)]" if (purge_ratio && iscarbon(M)) clear_reagents_to_vomit_pool(M, V, purge_ratio) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index ee1a3e9732..9bd7304a62 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -10,7 +10,7 @@ if(!holder) return - var/list/investigates = list(INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_NANITES, INVESTIGATE_PRESENTS, INVESTIGATE_HYPERTORUS, INVESTIGATE_ACCESSCHANGES) + var/list/investigates = list(INVESTIGATE_RESEARCH, INVESTIGATE_EXONET, INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_RADIATION, INVESTIGATE_PRESENTS, INVESTIGATE_HYPERTORUS, INVESTIGATE_ACCESSCHANGES) var/list/logs_present = list("notes, memos, watchlist") var/list/logs_missing = list("---") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 17e425920b..beb42732ac 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -107,7 +107,8 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/polymorph_all, /client/proc/show_tip, /client/proc/smite, - /client/proc/admin_away + /client/proc/admin_away, + /client/proc/load_circuit, )) GLOBAL_PROTECT(admin_verbs_fun) GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character, /datum/admins/proc/beaker_panel)) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 7e9a4e3f65..aaf5c54ea1 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -25,17 +25,17 @@ html = span_danger("Error: Admin-PM-Panel: Only administrators may use this command."), confidential = TRUE) return - var/list/client/targets[0] - for(var/client/T) - if(T.mob) - if(isnewplayer(T.mob)) - targets["(New Player) - [T]"] = T - else if(isobserver(T.mob)) - targets["[T.mob.name](Ghost) - [T]"] = T + var/list/targets = list() + for(var/client/client as anything in GLOB.clients) + if(client.mob) + if(isnewplayer(client.mob)) + targets["(New Player) - [client]"] = client + else if(isobserver(client.mob)) + targets["[client.mob.name](Ghost) - [client]"] = client else - targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T + targets["[client.mob.real_name](as [client.mob.name]) - [client]"] = client else - targets["(No Mob) - [T]"] = T + targets["(No Mob) - [client]"] = client var/target = input(src,"To whom shall we send a message?","Admin PM",null) as null|anything in sortList(targets) cmd_admin_pm(targets[target],null) SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin PM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index bfaa713e50..336a9228a6 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -14,24 +14,22 @@ var/largest_click_time = 0 var/mob/largest_move_mob = null var/mob/largest_click_mob = null - for(var/mob/M in world) - if(!M.client) - continue - if(M.next_move >= largest_move_time) - largest_move_mob = M - if(M.next_move > world.time) - largest_move_time = M.next_move - world.time + for(var/mob/frozen_mob as anything in GLOB.player_list) + if(frozen_mob.next_move >= largest_move_time) + largest_move_mob = frozen_mob + if(frozen_mob.next_move > world.time) + largest_move_time = frozen_mob.next_move - world.time else largest_move_time = 1 - if(M.next_click >= largest_click_time) - largest_click_mob = M - if(M.next_click > world.time) - largest_click_time = M.next_click - world.time + if(frozen_mob.next_click >= largest_click_time) + largest_click_mob = frozen_mob + if(frozen_mob.next_click > world.time) + largest_click_time = frozen_mob.next_click - world.time else largest_click_time = 0 - log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] lastDblClick = [M.next_click] world.time = [world.time]") - M.next_move = 1 - M.next_click = 0 + log_admin("DEBUG: [key_name(frozen_mob)] next_move = [frozen_mob.next_move] lastDblClick = [frozen_mob.next_click] world.time = [world.time]") + frozen_mob.next_move = 1 + frozen_mob.next_click = 0 message_admins("[ADMIN_LOOKUPFLW(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [DisplayTimeText(largest_move_time)]!") message_admins("[ADMIN_LOOKUPFLW(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [DisplayTimeText(largest_click_time)]!") message_admins("world.time = [world.time]") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 30b3dab47c..6df17c6da9 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -54,19 +54,6 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( )) GLOBAL_PROTECT(admin_verbs_debug_mapping) -/obj/effect/debugging/mapfix_marker - name = "map fix marker" - icon = 'icons/hud/screen_gen.dmi' - icon_state = "mapfixmarker" - desc = "I am a mappers mistake." - -/obj/effect/debugging/marker - icon = 'icons/turf/areas.dmi' - icon_state = "yellow" - -/obj/effect/debugging/marker/Move() - return FALSE - /client/proc/camera_view() set category = "Mapping" set name = "Camera Range Display" @@ -149,17 +136,16 @@ GLOBAL_LIST_EMPTY(dirty_vars) set name = "Intercom Range Display" var/static/intercom_range_display_status = FALSE - intercom_range_display_status = !intercom_range_display_status //blame cyberboss if this breaks something + intercom_range_display_status = !intercom_range_display_status //blame cyberboss if this breaks something //blamed - for(var/obj/effect/debugging/marker/M in world) - qdel(M) + for(var/obj/effect/abstract/marker/intercom/marker in GLOB.all_abstract_markers) + qdel(marker) if(intercom_range_display_status) - for(var/obj/item/radio/intercom/I in world) - for(var/turf/T in orange(7,I)) - var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) - if (!(F in view(7,I.loc))) - qdel(F) + for(var/frequency in GLOB.all_radios) + for(var/obj/item/radio/intercom/intercom in GLOB.all_radios[frequency]) + for(var/turf/turf in view(7,intercom.loc)) + new /obj/effect/abstract/marker/intercom(turf) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_show_at_list() diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index b9cac20466..d22afe3a74 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -244,6 +244,7 @@ flags_1 = NONE w_class = WEIGHT_CLASS_HUGE slot_flags = NONE + pinless = TRUE ammo_type = /obj/item/ammo_casing/magic/tentacle fire_sound = 'sound/effects/splat.ogg' force = 0 diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 527969b9b3..21459ce28c 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -23,8 +23,6 @@ new /datum/disease_ability/symptom/powerful/narcolepsy, new /datum/disease_ability/symptom/medium/fever, new /datum/disease_ability/symptom/medium/chills, new /datum/disease_ability/symptom/medium/headache, -new /datum/disease_ability/symptom/medium/nano_boost, -new /datum/disease_ability/symptom/medium/nano_destroy, new /datum/disease_ability/symptom/medium/viraladaptation, new /datum/disease_ability/symptom/medium/viralevolution, new /datum/disease_ability/symptom/medium/disfiguration, @@ -362,12 +360,6 @@ new /datum/disease_ability/symptom/powerful/youth /datum/disease_ability/symptom/medium/headache symptoms = list(/datum/symptom/headache) -/datum/disease_ability/symptom/medium/nano_boost - symptoms = list(/datum/symptom/nano_boost) - -/datum/disease_ability/symptom/medium/nano_destroy - symptoms = list(/datum/symptom/nano_destroy) - /datum/disease_ability/symptom/medium/viraladaptation symptoms = list(/datum/symptom/viraladaptation) short_desc = "Cause your infection to become more resistant to detection and eradication." diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index 63ef9d195f..b3b7dbd59c 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -21,7 +21,6 @@ /turf/open/space, /turf/open/lava, /turf/open/chasm, - /turf/open/floor/plating/rust )) route = PATH_RUST @@ -68,7 +67,7 @@ next_knowledge = list( /datum/eldritch_knowledge/rust_mark, /datum/eldritch_knowledge/armor, - /datum/eldritch_knowledge/essence + /datum/eldritch_knowledge/essence, ) route = PATH_RUST @@ -79,16 +78,15 @@ /datum/eldritch_knowledge/rust_regen/proc/on_move(mob/mover) SIGNAL_HANDLER - if(istype(get_turf(mover),/turf/open/floor/plating/rust)) + var/atom/mover_turf = get_turf(mover) + if(HAS_TRAIT(mover_turf, TRAIT_RUSTY)) ADD_TRAIT(mover,TRAIT_STUNRESISTANCE,type) - else - REMOVE_TRAIT(mover,TRAIT_STUNRESISTANCE,type) + return + + REMOVE_TRAIT(mover,TRAIT_STUNRESISTANCE,type) /datum/eldritch_knowledge/rust_regen/on_life(mob/user) . = ..() - var/turf/user_loc_turf = get_turf(user) - if(!istype(user_loc_turf, /turf/open/floor/plating/rust) || !isliving(user)) - return var/mob/living/living_user = user living_user.adjustBruteLoss(-2, FALSE) living_user.adjustFireLoss(-2, FALSE) @@ -178,7 +176,8 @@ /datum/eldritch_knowledge/final/rust_final/proc/on_move(mob/mover) SIGNAL_HANDLER - var/mover_on_rust = istype(get_turf(mover),/turf/open/floor/plating/rust) + var/atom/mover_turf = get_turf(mover) + var/mover_on_rust = HAS_TRAIT(mover_turf, TRAIT_RUSTY) //We check if we are currently standing on a rust tile, but the immunities are not active, if so apply immunities, set immunities_active to TRUE if(mover_on_rust && !immunities_active) @@ -197,7 +196,7 @@ /datum/eldritch_knowledge/final/rust_final/on_life(mob/user) . = ..() var/turf/user_loc_turf = get_turf(user) - if(!istype(user_loc_turf, /turf/open/floor/plating/rust) || !isliving(user) || !finished) + if(!HAS_TRAIT(user_loc_turf, TRAIT_RUSTY) || !isliving(user) || !finished) return var/mob/living/carbon/human/human_user = user human_user.adjustBruteLoss(-4, FALSE) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 94d2e9491c..13b77f0003 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -262,12 +262,12 @@ floor.broken = 0 floor.burnt = 0 floor.make_plating(TRUE) - if(T.type == /turf/closed/wall && prob(15)) + if(T.type == /turf/closed/wall && prob(15) && !HAS_TRAIT(T, TRAIT_RUSTY)) new /obj/effect/temp_visual/revenant(T) - T.ChangeTurf(/turf/closed/wall/rust) - if(T.type == /turf/closed/wall/r_wall && prob(10)) + T.AddComponent(/datum/component/rust) + if(T.type == /turf/closed/wall/r_wall && prob(10) && !HAS_TRAIT(T, TRAIT_RUSTY)) new /obj/effect/temp_visual/revenant(T) - T.ChangeTurf(/turf/closed/wall/r_wall/rust) + T.AddComponent(/datum/component/rust) for(var/obj/effect/decal/cleanable/food/salt/salt in T) new /obj/effect/temp_visual/revenant(T) qdel(salt) diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index aed8644a72..52df098bfd 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -282,7 +282,7 @@ if(new_stat == DEAD) return - // Someone we've eaten has spontaneously revived; maybe nanites, maybe a changeling + // Someone we've eaten has spontaneously revived; maybe regen coma, maybe a changeling victim.forceMove(get_turf(src)) victim.exit_blood_effect() victim.visible_message(span_warning("[victim] falls out of the air, covered in blood, with a confused look on their face.")) diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 75a46529ac..5c62493d1c 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -52,7 +52,7 @@ critical_threshold_proximity = min(critical_threshold_proximity_archived + (DAMAGE_CAP_MULTIPLIER * melting_point), critical_threshold_proximity) if(internal_fusion.total_moles() >= HYPERTORUS_HYPERCRITICAL_MOLES) - critical_threshold_proximity = min(max(0.001 * internal_fusion.total_moles() - 10, 0), HYPERTORUS_MAX_MOLE_DAMAGE) + critical_threshold_proximity += min(max(0.001 * internal_fusion.total_moles() - 10, 0), HYPERTORUS_MAX_MOLE_DAMAGE) if(moderator_internal.total_moles() >= HYPERTORUS_HYPERCRITICAL_MOLES && !check_cracked_parts()) var/obj/machinery/atmospherics/components/unary/hypertorus/part = create_crack() diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 3e3995dee6..c91f2feca4 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -2,7 +2,7 @@ name = "gas flow meter" desc = "It measures something." icon = 'icons/obj/atmospherics/pipes/meter.dmi' - icon_state = "meter_base" + icon_state = "meter" layer = HIGH_PIPE_LAYER power_channel = AREA_USAGE_ENVIRON use_power = IDLE_POWER_USE @@ -61,15 +61,11 @@ /obj/machinery/meter/process_atmos() if(!(target?.flags_1 & INITIALIZED_1)) - icon_state = "meter0" - greyscale_colors = COLOR_GRAY - set_greyscale(colors=greyscale_colors) + icon_state = "meter" return FALSE if(machine_stat & (BROKEN|NOPOWER)) icon_state = "meter" - greyscale_colors = COLOR_GRAY - set_greyscale(colors=greyscale_colors) return FALSE use_power(5) diff --git a/code/modules/capture_the_flag/ctf_classes.dm b/code/modules/capture_the_flag/ctf_classes.dm index 52ad1af531..b71ba4d01b 100644 --- a/code/modules/capture_the_flag/ctf_classes.dm +++ b/code/modules/capture_the_flag/ctf_classes.dm @@ -61,7 +61,7 @@ /datum/outfit/ctf/instagib name = "CTF Instagib (Solo)" - r_hand = /obj/item/gun/energy/laser/instakill + r_hand = /obj/item/gun/energy/laser/instakill/ctf shoes = /obj/item/clothing/shoes/jackboots/fast icon_state = "ctf_instakill" class_description = "General purpose combat class. Armed with a laser rifle and backup pistol." @@ -99,7 +99,7 @@ /datum/outfit/ctf/red/instagib name = "CTF Instagib (Red)" - r_hand = /obj/item/gun/energy/laser/instakill/red + r_hand = /obj/item/gun/energy/laser/instakill/ctf/red shoes = /obj/item/clothing/shoes/jackboots/fast team_radio_freq = FREQ_CTF_RED @@ -134,7 +134,7 @@ /datum/outfit/ctf/blue/instagib name = "CTF Instagib (Blue)" - r_hand = /obj/item/gun/energy/laser/instakill/blue + r_hand = /obj/item/gun/energy/laser/instakill/ctf/blue shoes = /obj/item/clothing/shoes/jackboots/fast team_radio_freq = FREQ_CTF_BLUE @@ -169,7 +169,7 @@ /datum/outfit/ctf/green/instagib name = "CTF Instagib (Green)" - r_hand = /obj/item/gun/energy/laser/instakill/green + r_hand = /obj/item/gun/energy/laser/instakill/ctf/green shoes = /obj/item/clothing/shoes/jackboots/fast team_radio_freq = FREQ_CTF_GREEN @@ -204,7 +204,7 @@ /datum/outfit/ctf/yellow/instagib name = "CTF Instagib (Yellow)" - r_hand = /obj/item/gun/energy/laser/instakill/yellow + r_hand = /obj/item/gun/energy/laser/instakill/ctf/yellow shoes = /obj/item/clothing/shoes/jackboots/fast team_radio_freq = FREQ_CTF_YELLOW diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index 5cf4ce1784..2a5d8d817d 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -162,13 +162,13 @@ ammo_x_offset = 2 shaded_charge = FALSE -/obj/item/gun/energy/laser/instakill/Initialize() - . = ..() - AddElement(/datum/element/delete_on_drop) - /obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib return +/obj/item/gun/energy/laser/instakill/ctf/Initialize() + . = ..() + AddElement(/datum/element/delete_on_drop) + /obj/item/ammo_casing/energy/instakill projectile_type = /obj/projectile/beam/instakill e_cost = 0 @@ -279,7 +279,7 @@ // Instakill -/obj/item/gun/energy/laser/instakill/red +/obj/item/gun/energy/laser/instakill/ctf/red desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design." icon_state = "instagibred" inhand_icon_state = "instagibred" @@ -338,7 +338,7 @@ // Instakill -/obj/item/gun/energy/laser/instakill/blue +/obj/item/gun/energy/laser/instakill/ctf/blue desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design." icon_state = "instagibblue" inhand_icon_state = "instagibblue" @@ -404,7 +404,7 @@ // Instakill -/obj/item/gun/energy/laser/instakill/green +/obj/item/gun/energy/laser/instakill/ctf/green desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a green design." icon_state = "instagibgreen" inhand_icon_state = "instagibgreen" @@ -470,7 +470,7 @@ // Instakill -/obj/item/gun/energy/laser/instakill/yellow +/obj/item/gun/energy/laser/instakill/ctf/yellow desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a yellow design." icon_state = "instagibyellow" inhand_icon_state = "instagibyellow" diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm index 0c06d96b64..7358cc9cee 100644 --- a/code/modules/client/player_details.dm +++ b/code/modules/client/player_details.dm @@ -1,3 +1,7 @@ + +///assoc list of ckey -> /datum/player_details +GLOBAL_LIST_EMPTY(player_details) + /datum/player_details var/list/player_actions = list() var/list/logging = list() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index f5e3447ffc..d3ebd463e5 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -427,7 +427,7 @@ name = "elite syndicate hardsuit helmet" desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in EVA mode. Property of Gorlex Marauders." alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." - icon_state = "hardsuit0-syndielite" + icon_state = "hardsuit1-syndielite" hardsuit_type = "syndielite" armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 60, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) heat_protection = HEAD @@ -448,7 +448,7 @@ name = "elite syndicate hardsuit" desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode." alt_desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in combat mode." - icon_state = "hardsuit0-syndielite" + icon_state = "hardsuit1-syndielite" hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 60, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, WOUND = 25) diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 8f0f959a93..8ff3d3e845 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -282,3 +282,10 @@ icon_state = "SwagOutfit" inhand_icon_state = "SwagOutfit" can_adjust = FALSE + +/obj/item/clothing/under/costume/referee + name = "referee uniform" + desc = "A standard black and white striped uniform to signal authority." + icon_state = "referee" + inhand_icon_state = "referee" + can_adjust = FALSE diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index accf534cc3..be3906107a 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -2,6 +2,7 @@ name = "Fake Virus" typepath = /datum/round_event/fake_virus weight = 20 + alert_observers = FALSE /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index c516cfc12f..d1d98e1c74 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -215,32 +215,28 @@ desired = text2num(params["amount"]) else desired = input("How many items?", "How many items would you like to take out?", 1) as null|num + if(!desired) + return FALSE if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) // Sanity checkin' in case stupid stuff happens while we wait for input() return FALSE - if(desired == 1 && Adjacent(usr) && !issilicon(usr)) - for(var/obj/item/O in src) - if(O.name == params["name"]) - if(O in component_parts) - CRASH("Attempted removal of [O] component_part from vending machine via vending interface.") - dispense(O, usr) - break - if (visible_contents) - update_appearance() - return TRUE - - for(var/obj/item/O in src) + for(var/obj/item/dispensed_item in src) if(desired <= 0) break - if(O.name == params["name"]) - if(O in component_parts) - CRASH("Attempted removal of [O] component_part from vending machine via vending interface.") - dispense(O, usr) + // Grab the first item in contents which name matches our passed name. + // format_text() is used here to strip \improper and \proper from both names, + // which is required for correct string comparison between them. + if(format_text(dispensed_item.name) == format_text(params["name"])) + if(dispensed_item in component_parts) + CRASH("Attempted removal of [dispensed_item] component_part from smartfridge via smartfridge interface.") + dispense(dispensed_item, usr) desired-- + if (visible_contents) update_appearance() return TRUE + return FALSE diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 08c82b0d98..de4ffa505f 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -15,6 +15,7 @@ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_grow = "poppy-grow" icon_dead = "poppy-dead" + genes = list(/datum/plant_gene/trait/preserved) mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily) reagents_add = list(/datum/reagent/medicine/c2/libital = 0.2, /datum/reagent/consumable/nutriment = 0.05) @@ -68,7 +69,7 @@ icon_grow = "spacemanstrumpet-grow" icon_dead = "spacemanstrumpet-dead" mutatelist = list() - genes = list(/datum/plant_gene/reagent/polypyr) + genes = list(/datum/plant_gene/reagent/polypyr, /datum/plant_gene/trait/preserved) reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) rarity = 30 graft_gene = /datum/plant_gene/reagent/polypyr @@ -136,7 +137,7 @@ potency = 30 instability = 1 growthstages = 4 - genes = list(/datum/plant_gene/trait/plant_type/weed_hardy) + genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/preserved) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy @@ -158,7 +159,7 @@ species = "sunflower" plantname = "Sunflowers" product = /obj/item/grown/sunflower - genes = list(/datum/plant_gene/trait/attack/sunflower_attack) + genes = list(/datum/plant_gene/trait/attack/sunflower_attack, /datum/plant_gene/trait/preserved) endurance = 20 production = 2 yield = 2 @@ -197,7 +198,7 @@ icon_grow = "moonflower-grow" icon_dead = "sunflower-dead" product = /obj/item/food/grown/moonflower - genes = list(/datum/plant_gene/trait/glow/purple) + genes = list(/datum/plant_gene/trait/glow/purple, /datum/plant_gene/trait/preserved) mutatelist = list() reagents_add = list(/datum/reagent/consumable/ethanol/moonshine = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/consumable/nutriment = 0.02) rarity = 15 @@ -221,7 +222,7 @@ icon_grow = "novaflower-grow" icon_dead = "sunflower-dead" product = /obj/item/grown/novaflower - genes = list(/datum/plant_gene/trait/backfire/novaflower_heat, /datum/plant_gene/trait/attack/novaflower_attack) + genes = list(/datum/plant_gene/trait/backfire/novaflower_heat, /datum/plant_gene/trait/attack/novaflower_attack, /datum/plant_gene/trait/preserved) mutatelist = list() reagents_add = list(/datum/reagent/consumable/condensedcapsaicin = 0.25, /datum/reagent/consumable/capsaicin = 0.3, /datum/reagent/consumable/nutriment = 0) rarity = 20 @@ -257,7 +258,7 @@ potency = 15 instability = 20 //Roses crossbreed easily, and there's many many species of them. growthstages = 3 - genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/backfire/rose_thorns) + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/backfire/rose_thorns, /datum/plant_gene/trait/preserved) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_grow = "rose-grow" icon_dead = "rose-dead" @@ -300,7 +301,7 @@ potency = 15 instability = 3 growthstages = 3 - genes = list(/datum/plant_gene/reagent/carbon) + genes = list(/datum/plant_gene/reagent/carbon, /datum/plant_gene/trait/preserved) growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_grow = "carbonrose-grow" icon_dead = "carbonrose-dead" diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 819020b533..66e2921389 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -16,7 +16,7 @@ growthstages = 4 growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_dead = "rainbowbunch-dead" - genes = list(/datum/plant_gene/trait/repeated_harvest) + genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/preserved) reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/rainbow_flower diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 387fd27907..c50d96b848 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -571,7 +571,7 @@ else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) if(!myseed) if(istype(O, /obj/item/seeds/kudzu)) - investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)]","kudzu") + investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)].", INVESTIGATE_BOTANY) if(!user.transferItemToLoc(O, src)) return to_chat(user, span_notice("You plant [O].")) diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index d659ab6452..4729fc0a02 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -921,6 +921,20 @@ trait_flags = TRAIT_HALVES_YIELD mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE +/// Traits for flowers, makes plants not decompose. +/datum/plant_gene/trait/preserved + name = "Natural Insecticide" + mutability_flags = PLANT_GENE_REMOVABLE | PLANT_GENE_MUTATABLE | PLANT_GENE_GRAFTABLE + +/datum/plant_gene/trait/preserved/on_new_plant(obj/item/our_plant, newloc) + . = ..() + if(!.) + return + + var/obj/item/food/grown/grown_plant = our_plant + if(istype(grown_plant)) + grown_plant.preserved_food = TRUE + /// Plant type traits. Incompatible with one another. /datum/plant_gene/trait/plant_type name = "you shouldn't see this" diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index cc0a34447e..e3779da09e 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -40,7 +40,7 @@ ui_interact(user) /obj/item/instrument/ui_interact(mob/living/user) - if(!isliving(user) || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + if(!isliving(user) || user.stat != CONSCIOUS || (HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) && !ispAI(user))) return user.set_machine(src) @@ -181,7 +181,7 @@ /obj/item/instrument/trumpet/spectral/Initialize() . = ..() - AddComponent(/datum/component/spooky) + AddElement(/datum/element/spooky) /obj/item/instrument/trumpet/spectral/attack(mob/living/carbon/C, mob/user) playsound (src, 'sound/runtime/instruments/trombone/En4.mid', 100,1,-1) @@ -205,7 +205,7 @@ /obj/item/instrument/saxophone/spectral/Initialize() . = ..() - AddComponent(/datum/component/spooky) + AddElement(/datum/element/spooky) /obj/item/instrument/saxophone/spectral/attack(mob/living/carbon/C, mob/user) playsound (src, 'sound/runtime/instruments/saxophone/En4.mid', 100,1,-1) @@ -229,7 +229,7 @@ /obj/item/instrument/trombone/spectral/Initialize() . = ..() - AddComponent(/datum/component/spooky) + AddElement(/datum/element/spooky) /obj/item/instrument/trombone/spectral/attack(mob/living/carbon/C, mob/user) playsound (src, 'sound/runtime/instruments/trombone/Cn4.mid', 100,1,-1) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 098018e416..3f2d39c8c0 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -416,6 +416,7 @@ max_charges = 1 item_flags = NEEDS_PERMIT | NOBLUDGEON sharpness = SHARP_POINTY + pinless = TRUE force = 18 /obj/item/gun/magic/hook/shoot_with_empty_chamber(mob/living/user) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 6385036508..0efe462563 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -44,7 +44,7 @@ /mob/living/simple_animal/hostile/mining_drone/Initialize() . = ..() - AddComponent(/datum/component/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, vary = TRUE) + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, vary = TRUE) stored_gun = new(src) var/datum/action/innate/minedrone/toggle_light/toggle_light_action = new() diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 6779ec4d0e..55257d4ac8 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -1,3 +1,12 @@ + +///All currently running polls held as datums +GLOBAL_LIST_EMPTY(polls) +GLOBAL_PROTECT(polls) + +///All poll option datums of running polls +GLOBAL_LIST_EMPTY(poll_options) +GLOBAL_PROTECT(poll_options) + /** * Shows a list of currently running polls a player can vote/has voted on * diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 3b9e5d08a0..4d159a2532 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -161,6 +161,8 @@ O.attack(brainmob, user) //Oh noooeeeee if(O.force != 0 && !(O.item_flags & NOBLUDGEON)) + user.do_attack_animation(src) + playsound(loc, 'sound/effects/meatslap.ogg', 50) setOrganDamage(maxHealth) //fails the brain as the brain was attacked, they're pretty fragile. visible_message(span_danger("[user] hits [src] with [O]!")) to_chat(user, span_danger("You hit [src] with [O]!")) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 5fe2c1c8b0..ae9f0da547 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -128,10 +128,6 @@ Des: Removes all infected images from the alien. new_xeno.real_name = real_name if(mind) mind.transfer_to(new_xeno) - var/datum/component/nanites/nanites = GetComponent(/datum/component/nanites) - if(nanites) - new_xeno.AddComponent(/datum/component/nanites, nanites.nanite_volume) - SEND_SIGNAL(new_xeno, COMSIG_NANITE_SYNC, nanites) qdel(src) /mob/living/carbon/alien/can_hold_items(obj/item/I) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 7b51b8d4ff..a1ed8dfb76 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( /mob/living/carbon/alien/humanoid/Initialize() . = ..() - AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11) AddElement(/datum/element/strippable, GLOB.strippable_alien_humanoid_items) /mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 3bddf26113..e4e68a0e56 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,7 +2,7 @@ blood_volume = BLOOD_VOLUME_NORMAL gender = MALE pressure_resistance = 15 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) has_limbs = 1 held_items = list(null, null) num_legs = 0 //Populated on init through list/bodyparts diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 447c63f902..e16cfa5b84 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -20,7 +20,7 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, .proc/clean_face) AddComponent(/datum/component/personal_crafting) - AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) AddComponent(/datum/component/bloodysoles/feet) AddElement(/datum/element/ridable, /datum/component/riding/creature/human) AddElement(/datum/element/strippable, GLOB.strippable_human_items, /mob/living/carbon/human/.proc/should_strip) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index f32122e733..f96ad786f2 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index b02137ca51..2455a6c3dc 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -240,14 +240,6 @@ spare.domutcheck() spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) - - var/datum/component/nanites/owner_nanites = H.GetComponent(/datum/component/nanites) - if(owner_nanites) - //copying over nanite programs/cloud sync with 50% saturation in host and spare - owner_nanites.nanite_volume *= 0.5 - spare.AddComponent(/datum/component/nanites, owner_nanites.nanite_volume) - SEND_SIGNAL(spare, COMSIG_NANITE_SYNC, owner_nanites, TRUE, TRUE) //The trues are to copy activation as well - H.blood_volume *= 0.45 H.notransform = 0 diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index dabe4092e6..3e7503f780 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -12,6 +12,7 @@ TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_NOMETABOLISM, + TRAIT_NOHUNGER, TRAIT_TOXIMMUNE, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 1150b611e5..7c943cc444 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -217,6 +217,7 @@ return TRUE /mob/living/attack_animal(mob/living/simple_animal/user, list/modifiers) + . = ..() user.face_atom(src) if(user.melee_damage_upper == 0) if(user != src) @@ -306,6 +307,7 @@ return FALSE /mob/living/attack_alien(mob/living/carbon/alien/humanoid/user, list/modifiers) + SEND_SIGNAL(src, COMSIG_MOB_ATTACK_ALIEN, user) if(LAZYACCESS(modifiers, RIGHT_CLICK)) user.do_attack_animation(src, ATTACK_EFFECT_DISARM) return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index baee489db0..68a60f2e01 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -2,7 +2,7 @@ see_invisible = SEE_INVISIBLE_LIVING sight = 0 see_in_dark = 2 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) pressure_resistance = 10 hud_type = /datum/hud/living diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 7012633a3a..e54c4b8e79 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -82,7 +82,15 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]") + var/text_span + switch(theme) + if(THEME_CULT) + text_span = "cult" + if(THEME_WIZARD) + text_span = "purple" + if(THEME_HOLY) + text_span = "blue" + . = list("*---------*\nThis is [icon2html(src, user)] \a [src]!\n[desc]") if(health < maxHealth) if(health >= maxHealth/2) . += span_warning("[t_He] look[t_s] slightly dented.") diff --git a/code/modules/mob/living/simple_animal/eldritch_demons.dm b/code/modules/mob/living/simple_animal/eldritch_demons.dm index 53ccecb9d4..b140b6d24e 100644 --- a/code/modules/mob/living/simple_animal/eldritch_demons.dm +++ b/code/modules/mob/living/simple_animal/eldritch_demons.dm @@ -332,7 +332,7 @@ if(stat == DEAD) return ..() var/turf/T = get_turf(src) - if(istype(T,/turf/open/floor/plating/rust)) + if(HAS_TRAIT(T, TRAIT_RUSTY)) adjustBruteLoss(-1.5 * delta_time, FALSE) adjustFireLoss(-1.5 * delta_time, FALSE) return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 377a53d59a..742e534f2c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -1,29 +1,4 @@ -#define DRONE_HANDS_LAYER 1 -#define DRONE_HEAD_LAYER 2 -#define DRONE_TOTAL_LAYERS 2 - -/// Message displayed when new drone spawns in drone network -#define DRONE_NET_CONNECT span_notice("DRONE NETWORK: [name] connected.") -/// Message displayed when drone in network dies -#define DRONE_NET_DISCONNECT span_danger("DRONE NETWORK: [name] is not responding.") - -/// Maintenance Drone icon_state (multiple colors) -#define MAINTDRONE "drone_maint" -/// Repair Drone icon_state -#define REPAIRDRONE "drone_repair" -/// Scout Drone icon_state -#define SCOUTDRONE "drone_scout" -/// Clockwork Drone icon_state -#define CLOCKDRONE "drone_clock" - -/// [MAINTDRONE] hacked icon_state -#define MAINTDRONE_HACKED "drone_maint_red" -/// [REPAIRDRONE] hacked icon_state -#define REPAIRDRONE_HACKED "drone_repair_hacked" -/// [SCOUTDRONE] hacked icon_state -#define SCOUTDRONE_HACKED "drone_scout_hacked" - /** * # Maintenance Drone * diff --git a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm index bc0a964be9..4ac728daab 100644 --- a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm +++ b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm @@ -26,7 +26,7 @@ ADD_TRAIT(src, TRAIT_NOMOBSWAP, INNATE_TRAIT) //dont push me bitch ADD_TRAIT(src, TRAIT_NO_TELEPORT, INNATE_TRAIT) //dont teleport me bitch ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) //strong arms bitch - AddComponent(/datum/component/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, vary = TRUE) + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, vary = TRUE) var/datum/customer_data/customer_info = SSrestaurant.all_customers[customer_data] clothes_set = pick(customer_info.clothing_sets) ai_controller = customer_info.ai_controller_used diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2fd550b0fb..444edb4848 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -192,7 +192,7 @@ if(damage_coeff) damage_coeff = string_assoc_list(damage_coeff) if(footstep_type) - AddComponent(/datum/component/footstep, footstep_type) + AddElement(/datum/element/footstep, footstep_type) if(!isnull(unsuitable_cold_damage)) unsuitable_cold_damage = unsuitable_atmos_damage if(!isnull(unsuitable_heat_damage)) diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index dfc87f8712..46f017044e 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -175,7 +175,6 @@ 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=1,i<=4,i++) @@ -198,10 +197,6 @@ 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) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1205b60cd8..ecdf7743e1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -214,7 +214,10 @@ . += letter return sanitize(.) +#define TILES_PER_SECOND 0.7 ///Shake the camera of the person viewing the mob SO REAL! +///Takes the mob to shake, the time span to shake for, and the amount of tiles we're allowed to shake by in tiles +///Duration isn't taken as a strict limit, since we don't trust our coders to not make things feel shitty. So it's more like a soft cap. /proc/shake_camera(mob/M, duration, strength=1) if(!M || !M.client || duration < 1) return @@ -224,13 +227,33 @@ var/max = strength*world.icon_size var/min = -(strength*world.icon_size) - for(var/i in 0 to duration-1) - if (i == 0) - animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + //How much time to allot for each pixel moved + var/time_scalar = (1 / world.icon_size) * TILES_PER_SECOND + var/last_x = oldx + var/last_y = oldy + + var/time_spent = 0 + while(time_spent < duration) + //Get a random pos in our box + var/x_pos = rand(min, max) + oldx + var/y_pos = rand(min, max) + oldy + + //We take the smaller of our two distances so things still have the propencity to feel somewhat jerky + var/time = round(max(min(abs(last_x - x_pos), abs(last_y - y_pos)) * time_scalar, 1)) + + if (time_spent == 0) + animate(C, pixel_x=x_pos, pixel_y=y_pos, time=time) else - animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) - animate(pixel_x=oldx, pixel_y=oldy, time=1) + animate(pixel_x=x_pos, pixel_y=y_pos, time=time) + + last_x = x_pos + last_y = y_pos + //We go based on time spent, so there is a chance we'll overshoot our duration. Don't care + time_spent += time + + animate(pixel_x=oldx, pixel_y=oldy, time=3) +#undef TILES_PER_SECOND ///Find if the message has the real name of any user mob in the mob_list /proc/findname(msg) diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index 92d4a812a2..882e10a667 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -13,10 +13,10 @@ if(battery_module && battery_module.battery && battery_module.battery.charge) var/obj/item/stock_parts/cell/cell = battery_module.battery - if(cell.use(amount * GLOB.CELLRATE)) + if(cell.use(amount JOULES)) return TRUE else // Discharge the cell anyway. - cell.use(min(amount*GLOB.CELLRATE, cell.charge)) + cell.use(min(amount JOULES, cell.charge)) return FALSE return FALSE diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index f7abfc7a63..4b14a61152 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -243,8 +243,6 @@ if(!humanoid || !istype(humanoid)) return FALSE if(..()) - if (humanoid in GLOB.nanite_sensors_list) - return TRUE if (istype(humanoid.w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/uniform = humanoid.w_uniform if(uniform.has_sensor && uniform.sensor_mode >= SENSOR_COORDS) // Suit sensors must be on maximum diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index f98382e525..0d9952080b 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -20,7 +20,7 @@ return if(use_power(charge_rate, charging=1)) - holder.give_power(charge_rate * GLOB.CELLRATE) + holder.give_power(charge_rate JOULES) /obj/item/computer_hardware/recharger/apc_recharger diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 8568f7e2ef..63fa893832 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1273,18 +1273,18 @@ if(cell && !shorted) // draw power from cell as before to power the area - var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell + var/cellused = min(cell.charge, lastused_total JOULES) // clamp deduction to a max, amount left in cell cell.use(cellused) if(excess > lastused_total) // if power excess recharge the cell // by the same amount just used cell.give(cellused) - add_load(cellused/GLOB.CELLRATE) // add the load used to recharge the cell + add_load(cellused WATTS) // add the load used to recharge the cell else // no excess, and not enough per-apc - if((cell.charge/GLOB.CELLRATE + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? - cell.charge = min(cell.maxcharge, cell.charge + GLOB.CELLRATE * excess) //recharge with what we can + if((cell.charge WATTS + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + excess JOULES) //recharge with what we can add_load(excess) // so draw what we can from the grid charging = APC_NOT_CHARGING @@ -1332,8 +1332,8 @@ if(chargemode && charging == APC_CHARGING && operating) if(excess > 0) // check to make sure we have enough to charge // Max charge is capped to % per second constant - var/ch = min(excess*GLOB.CELLRATE, cell.maxcharge*GLOB.CHARGELEVEL) - add_load(ch/GLOB.CELLRATE) // Removes the power we're taking from the grid + var/ch = min(excess JOULES, cell.maxcharge JOULES) + add_load(ch WATTS) // Removes the power we're taking from the grid cell.give(ch) // actually recharge the cell else diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 3f9623cf67..ac9c1db17a 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -404,9 +404,9 @@ if (isarea(power_source)) var/area/source_area = power_source - source_area.use_power(drained_energy/GLOB.CELLRATE) + source_area.use_power(drained_energy WATTS) else if (istype(power_source, /datum/powernet)) - var/drained_power = drained_energy/GLOB.CELLRATE //convert from "joules" to "watts" + var/drained_power = drained_energy WATTS //convert from "joules" to "watts" PN.delayedload += (min(drained_power, max(PN.newavail - PN.delayedload, 0))) else if (istype(power_source, /obj/item/stock_parts/cell)) cell.use(drained_energy) diff --git a/code/modules/projectiles/ammunition/caseless/misc.dm b/code/modules/projectiles/ammunition/caseless/energy.dm similarity index 62% rename from code/modules/projectiles/ammunition/caseless/misc.dm rename to code/modules/projectiles/ammunition/caseless/energy.dm index be500bf664..9461bc4b15 100644 --- a/code/modules/projectiles/ammunition/caseless/misc.dm +++ b/code/modules/projectiles/ammunition/caseless/energy.dm @@ -7,11 +7,3 @@ projectile_type = /obj/projectile/beam fire_sound = 'sound/weapons/laser.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy - - // Harpoons (Ballistic Harpoon Gun) - -/obj/item/ammo_casing/caseless/harpoon - name = "harpoon" - caliber = CALIBER_HARPOON - icon_state = "magspear" - projectile_type = /obj/projectile/bullet/harpoon diff --git a/code/modules/projectiles/ammunition/caseless/harpoon.dm b/code/modules/projectiles/ammunition/caseless/harpoon.dm new file mode 100644 index 0000000000..5f1b402cf7 --- /dev/null +++ b/code/modules/projectiles/ammunition/caseless/harpoon.dm @@ -0,0 +1,5 @@ +/obj/item/ammo_casing/caseless/harpoon + name = "harpoon" + caliber = CALIBER_HARPOON + icon_state = "magspear" + projectile_type = /obj/projectile/bullet/harpoon diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/meathook.dm similarity index 100% rename from code/modules/projectiles/boxes_magazines/internal/misc.dm rename to code/modules/projectiles/boxes_magazines/internal/meathook.dm diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 313fea71fd..89a2a140d7 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -54,7 +54,8 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns - + /// True if a gun dosen't need a pin, mostly used for abstract guns like tentacles and meathooks + var/pinless = FALSE var/can_flashlight = FALSE //if a flashlight can be added or removed if it already has one. var/obj/item/flashlight/seclite/gun_light var/datum/action/item_action/toggle_gunlight/alight @@ -124,11 +125,12 @@ /obj/item/gun/examine(mob/user) . = ..() - if(pin) - . += "It has \a [pin] installed." - . += span_info("[pin] looks like it could be removed with some tools.") - else - . += "It doesn't have a firing pin installed, and won't fire." + if(!pinless) + if(pin) + . += "It has \a [pin] installed." + . += span_info("[pin] looks like it could be removed with some tools.") + else + . += "It doesn't have a firing pin installed, and won't fire." if(gun_light) . += "It has \a [gun_light] [can_flashlight ? "" : "permanently "]mounted on it." @@ -276,6 +278,8 @@ return FALSE /obj/item/gun/proc/handle_pins(mob/living/user) + if(pinless) + return TRUE if(pin) if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED)) return TRUE diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index b4265a016b..e25a794513 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -440,9 +440,10 @@ /obj/item/gun/ballistic/attack_self(mob/living/user) if(HAS_TRAIT(user, TRAIT_GUNFLIP)) + SpinAnimation(4,2) if(flip_cooldown <= world.time) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) - to_chat(user, span_userdanger("While trying to flip the [src] you pull the trigger and accidently shoot yourself!")) + to_chat(user, span_userdanger("While trying to flip [src] you pull the trigger and accidently shoot yourself!")) var/flip_mistake = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_CHEST) process_fire(user, user, FALSE, flip_mistake) user.dropItemToGround(src, TRUE) diff --git a/code/modules/projectiles/guns/misc/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm similarity index 100% rename from code/modules/projectiles/guns/misc/bow.dm rename to code/modules/projectiles/guns/ballistic/bow.dm diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm similarity index 100% rename from code/modules/projectiles/guns/misc/beam_rifle.dm rename to code/modules/projectiles/guns/energy/beam_rifle.dm diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm similarity index 100% rename from code/modules/projectiles/guns/misc/blastcannon.dm rename to code/modules/projectiles/guns/special/blastcannon.dm diff --git a/code/modules/projectiles/guns/misc/chem_gun.dm b/code/modules/projectiles/guns/special/chem_gun.dm similarity index 100% rename from code/modules/projectiles/guns/misc/chem_gun.dm rename to code/modules/projectiles/guns/special/chem_gun.dm diff --git a/code/modules/projectiles/guns/misc/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm similarity index 100% rename from code/modules/projectiles/guns/misc/grenade_launcher.dm rename to code/modules/projectiles/guns/special/grenade_launcher.dm diff --git a/code/modules/projectiles/guns/misc/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm similarity index 100% rename from code/modules/projectiles/guns/misc/medbeam.dm rename to code/modules/projectiles/guns/special/medbeam.dm diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm similarity index 100% rename from code/modules/projectiles/guns/misc/syringe_gun.dm rename to code/modules/projectiles/guns/special/syringe_gun.dm diff --git a/code/modules/projectiles/projectile/bullets/cannon.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm similarity index 91% rename from code/modules/projectiles/projectile/bullets/cannon.dm rename to code/modules/projectiles/projectile/bullets/cannonball.dm index b879e80bf9..9ee931e7f1 100644 --- a/code/modules/projectiles/projectile/bullets/cannon.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -57,3 +57,8 @@ if(projectile_piercing == NONE) explosion(target, devastation_range = GLOB.MAX_EX_DEVESTATION_RANGE, heavy_impact_range = GLOB.MAX_EX_HEAVY_RANGE, light_impact_range = GLOB.MAX_EX_LIGHT_RANGE, flash_range = GLOB.MAX_EX_FLASH_RANGE) . = ..() + +/obj/projectile/bullet/cannonball/trashball + name = "trashball" + icon_state = "trashball" + damage = 90 //better than the biggest one but no explosion, so kinda just a worse normal cannonball diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/decloner.dm similarity index 64% rename from code/modules/projectiles/projectile/energy/misc.dm rename to code/modules/projectiles/projectile/energy/decloner.dm index 79ee634a3e..1b11711119 100644 --- a/code/modules/projectiles/projectile/energy/misc.dm +++ b/code/modules/projectiles/projectile/energy/decloner.dm @@ -9,11 +9,3 @@ /obj/projectile/energy/declone/weak damage = 9 irradiate = 30 - -/obj/projectile/energy/dart //ninja throwing dart - name = "dart" - icon_state = "toxin" - damage = 5 - damage_type = TOX - paralyze = 100 - range = 7 diff --git a/code/modules/projectiles/projectile/energy/ninja.dm b/code/modules/projectiles/projectile/energy/ninja.dm new file mode 100644 index 0000000000..901cde426b --- /dev/null +++ b/code/modules/projectiles/projectile/energy/ninja.dm @@ -0,0 +1,7 @@ +/obj/projectile/energy/dart //ninja throwing dart + name = "dart" + icon_state = "toxin" + damage = 5 + damage_type = TOX + paralyze = 100 + range = 7 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ac6172b62c..effbeb88c4 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -27,7 +27,7 @@ other types of metals and chemistry for reagents). var/desc = "Desc" /// The ID of the design. Used for quick reference. Alphanumeric, lower-case, no symbols var/id = DESIGN_ID_IGNORE - /// Bitflags indicating what machines this design is compatable with. ([IMPRINTER]|[AWAY_IMPRINTER]|[PROTOLATHE]|[AWAY_LATHE]|[AUTOLATHE]|[MECHFAB]|[BIOGENERATOR]|[LIMBGROWER]|[SMELTER]|[NANITE_COMPILER]) + /// Bitflags indicating what machines this design is compatable with. ([IMPRINTER]|[AWAY_IMPRINTER]|[PROTOLATHE]|[AWAY_LATHE]|[AUTOLATHE]|[MECHFAB]|[BIOGENERATOR]|[LIMBGROWER]|[SMELTER]) var/build_type = null /// List of materials required to create one unit of the product. Format is (typepath or caregory) -> amount var/list/materials = list() diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 94d8224da8..3d1d0b998f 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -275,22 +275,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING -/datum/design/board/nanite_chamber_control - name = "Computer Design (Nanite Chamber Control)" - desc = "Allows for the construction of circuit boards used to build a new nanite chamber control console." - id = "nanite_chamber_control" - build_path = /obj/item/circuitboard/computer/nanite_chamber_control - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/board/nanite_cloud_control - name = "Computer Design (Nanite Cloud Control)" - desc = "Allows for the construction of circuit boards used to build a new nanite cloud control console." - id = "nanite_cloud_control" - build_path = /obj/item/circuitboard/computer/nanite_cloud_controller - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/board/advanced_camera name = "Computer Design (Advanced Camera Console)" desc = "Allows for the construction of circuit boards used to build advanced camera consoles." diff --git a/code/modules/research/designs/electronics_designs.dm b/code/modules/research/designs/electronics_designs.dm index 7706a3053d..7cb94cfda0 100644 --- a/code/modules/research/designs/electronics_designs.dm +++ b/code/modules/research/designs/electronics_designs.dm @@ -33,40 +33,6 @@ category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/////////////////////////////////// -//////////Nanite Devices/////////// -/////////////////////////////////// -/datum/design/nanite_remote - name = "Nanite Remote" - desc = "Allows for the construction of a nanite remote." - id = "nanite_remote" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_remote - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/nanite_comm_remote - name = "Nanite Communication Remote" - desc = "Allows for the construction of a nanite communication remote." - id = "nanite_comm_remote" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_remote/comm - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/nanite_scanner - name = "Nanite Scanner" - desc = "Allows for the construction of a nanite scanner." - id = "nanite_scanner" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500) - build_path = /obj/item/nanite_scanner - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - - //////////////////////////////////////// //////////Disk Construction Disks/////// //////////////////////////////////////// @@ -99,13 +65,3 @@ build_path = /obj/item/disk/tech_disk category = list("Electronics") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/nanite_disk - name = "Nanite Program Disk" - desc = "Stores nanite programs." - id = "nanite_disk" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = 300, /datum/material/glass = 100) - build_path = /obj/item/disk/nanite_program - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 12f697b8a2..742809a2a4 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -298,38 +298,6 @@ category = list("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/nanite_chamber - name = "Machine Design (Nanite Chamber Board)" - desc = "The circuit board for a Nanite Chamber." - id = "nanite_chamber" - build_path = /obj/item/circuitboard/machine/nanite_chamber - category = list("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/board/public_nanite_chamber - name = "Machine Design (Public Nanite Chamber Board)" - desc = "The circuit board for a Public Nanite Chamber." - id = "public_nanite_chamber" - build_path = /obj/item/circuitboard/machine/public_nanite_chamber - category = list("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/board/nanite_programmer - name = "Machine Design (Nanite Programmer Board)" - desc = "The circuit board for a Nanite Programmer." - id = "nanite_programmer" - build_path = /obj/item/circuitboard/machine/nanite_programmer - category = list("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/board/nanite_program_hub - name = "Machine Design (Nanite Program Hub Board)" - desc = "The circuit board for a Nanite Program Hub." - id = "nanite_program_hub" - build_path = /obj/item/circuitboard/machine/nanite_program_hub - category = list("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/board/dnascanner name = "Machine Design (DNA Scanner)" desc = "The circuit board for a DNA Scanner." @@ -780,3 +748,11 @@ build_path = /obj/item/circuitboard/machine/component_printer category = list("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/module_printer + name = "Machine Design (Module Duplicator)" + desc = "The circuit board for a module duplicator" + id = "module_duplicator" + build_path = /obj/item/circuitboard/machine/module_duplicator + category = list("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm deleted file mode 100644 index d1e61c86b0..0000000000 --- a/code/modules/research/designs/nanite_designs.dm +++ /dev/null @@ -1,573 +0,0 @@ -/datum/design/nanites - name = "None" - desc = "Warn a coder if you see this." - id = "default_nanites" - build_type = NANITE_COMPILER - construction_time = 50 - category = list() - research_icon = 'icons/obj/device.dmi' - research_icon_state = "nanite_program" - var/program_type = /datum/nanite_program - -////////////////////UTILITY NANITES////////////////////////////////////// - -/datum/design/nanites/metabolic_synthesis - name = "Metabolic Synthesis" - desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." - id = "metabolic_nanites" - program_type = /datum/nanite_program/metabolic_synthesis - category = list("Utility Nanites") - -/datum/design/nanites/viral - name = "Viral Replica" - desc = "The nanites constantly send encrypted signals attempting to forcefully copy their own programming into other nanite clusters." - id = "viral_nanites" - program_type = /datum/nanite_program/viral - category = list("Utility Nanites") - -/datum/design/nanites/monitoring - name = "Monitoring" - desc = "The nanites monitor the host's vitals and location, sending them to the suit sensor network." - id = "monitoring_nanites" - program_type = /datum/nanite_program/monitoring - category = list("Utility Nanites") - -/datum/design/nanites/self_scan - name = "Host Scan" - desc = "The nanites display a detailed readout of a body scan to the host." - id = "selfscan_nanites" - program_type = /datum/nanite_program/self_scan - category = list("Utility Nanites") - -/datum/design/nanites/dermal_button - name = "Dermal Button" - desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." - id = "dermal_button_nanites" - program_type = /datum/nanite_program/dermal_button - category = list("Utility Nanites") - -/datum/design/nanites/stealth - name = "Stealth" - desc = "The nanites hide their activity and programming from superficial scans." - id = "stealth_nanites" - program_type = /datum/nanite_program/stealth - category = list("Utility Nanites") - -/datum/design/nanites/nanite_debugging - name = "Nanite Debugging" - desc = "Enables various high-cost diagnostics in the nanites, making them able to communicate their program list to portable scanners. \ - Doing so uses some power, slightly decreasing their replication speed." - id = "debugging_nanites" - program_type = /datum/nanite_program/nanite_debugging - category = list("Utility Nanites") - -/datum/design/nanites/access - name = "Subdermal ID" - desc = "The nanites store the host's ID access rights in a subdermal magnetic strip. Updates when triggered, copying the host's current access." - id = "access_nanites" - program_type = /datum/nanite_program/access - category = list("Utility Nanites") - -/datum/design/nanites/relay - name = "Relay" - desc = "The nanites receive and relay long-range nanite signals." - id = "relay_nanites" - program_type = /datum/nanite_program/relay - category = list("Utility Nanites") - -/datum/design/nanites/repeater - name = "Signal Repeater" - desc = "When triggered, sends another signal to the nanites, optionally with a delay." - id = "repeater_nanites" - program_type = /datum/nanite_program/sensor/repeat - category = list("Utility Nanites") - -/datum/design/nanites/relay_repeater - name = "Relay Signal Repeater" - desc = "When triggered, sends another signal to a relay channel, optionally with a delay." - id = "relay_repeater_nanites" - program_type = /datum/nanite_program/sensor/relay_repeat - category = list("Utility Nanites") - -/datum/design/nanites/emp - name = "Electromagnetic Resonance" - desc = "The nanites cause an electromagnetic pulse around the host when triggered. Will corrupt other nanite programs!" - id = "emp_nanites" - program_type = /datum/nanite_program/emp - category = list("Utility Nanites") - -/datum/design/nanites/spreading - name = "Infective Exo-Locomotion" - desc = "The nanites gain the ability to survive for brief periods outside of the human body, as well as the ability to start new colonies without an integration process; \ - resulting in an extremely infective strain of nanites." - id = "spreading_nanites" - program_type = /datum/nanite_program/spreading - category = list("Utility Nanites") - -/datum/design/nanites/nanite_sting - name = "Nanite Sting" - desc = "When triggered, projects a nearly invisible spike of nanites that attempts to infect a nearby non-host with a copy of the host's nanites cluster." - id = "nanite_sting_nanites" - program_type = /datum/nanite_program/nanite_sting - category = list("Utility Nanites") - -/datum/design/nanites/mitosis - name = "Mitosis" - desc = "The nanites gain the ability to self-replicate, using bluespace to power the process, instead of drawing from a template. This rapidly speeds up the replication rate,\ - but it causes occasional software errors due to faulty copies." - id = "mitosis_nanites" - program_type = /datum/nanite_program/mitosis - category = list("Utility Nanites") - -////////////////////MEDICAL NANITES////////////////////////////////////// -/datum/design/nanites/regenerative - name = "Accelerated Regeneration" - desc = "The nanites boost the host's natural regeneration, increasing their healing speed." - id = "regenerative_nanites" - program_type = /datum/nanite_program/regenerative - category = list("Medical Nanites") - -/datum/design/nanites/regenerative_advanced - name = "Bio-Reconstruction" - desc = "The nanites manually repair and replace organic cells, acting much faster than normal regeneration. \ - However, this program cannot detect the difference between harmed and unharmed, causing it to consume nanites even if it has no effect." - id = "regenerative_plus_nanites" - program_type = /datum/nanite_program/regenerative_advanced - category = list("Medical Nanites") - -/datum/design/nanites/temperature - name = "Temperature Adjustment" - desc = "The nanites adjust the host's internal temperature to an ideal level." - id = "temperature_nanites" - program_type = /datum/nanite_program/temperature - category = list("Medical Nanites") - -/datum/design/nanites/purging - name = "Blood Purification" - desc = "The nanites purge toxins and chemicals from the host's bloodstream." - id = "purging_nanites" - program_type = /datum/nanite_program/purging - category = list("Medical Nanites") - -/datum/design/nanites/purging_advanced - name = "Selective Blood Purification" - desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \ - The added processing power required to analyze the chemicals severely increases the nanite consumption rate." - id = "purging_plus_nanites" - program_type = /datum/nanite_program/purging_advanced - category = list("Medical Nanites") - -/datum/design/nanites/brain_heal - name = "Neural Regeneration" - desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas." - id = "brainheal_nanites" - program_type = /datum/nanite_program/brain_heal - category = list("Medical Nanites") - -/datum/design/nanites/brain_heal_advanced - name = "Neural Reimaging" - desc = "The nanites are able to backup and restore the host's neural connections, potentially replacing entire chunks of missing or damaged brain matter." - id = "brainheal_plus_nanites" - program_type = /datum/nanite_program/brain_heal_advanced - category = list("Medical Nanites") - -/datum/design/nanites/blood_restoring - name = "Blood Regeneration" - desc = "The nanites stimulate and boost blood cell production in the host." - id = "bloodheal_nanites" - program_type = /datum/nanite_program/blood_restoring - category = list("Medical Nanites") - -/datum/design/nanites/repairing - name = "Mechanical Repair" - desc = "The nanites fix damage in the host's mechanical limbs." - id = "repairing_nanites" - program_type = /datum/nanite_program/repairing - category = list("Medical Nanites") - -/datum/design/nanites/defib - name = "Defibrillation" - desc = "The nanites, when triggered, send a defibrillating shock to the host's heart." - id = "defib_nanites" - program_type = /datum/nanite_program/defib - category = list("Medical Nanites") - - -////////////////////AUGMENTATION NANITES////////////////////////////////////// - -/datum/design/nanites/nervous - name = "Nerve Support" - desc = "The nanites act as a secondary nervous system, reducing the amount of time the host is stunned." - id = "nervous_nanites" - program_type = /datum/nanite_program/nervous - category = list("Augmentation Nanites") - -/datum/design/nanites/hardening - name = "Dermal Hardening" - desc = "The nanites form a mesh under the host's skin, protecting them from melee and bullet impacts." - id = "hardening_nanites" - program_type = /datum/nanite_program/hardening - category = list("Augmentation Nanites") - -/datum/design/nanites/refractive - name = "Dermal Refractive Surface" - desc = "The nanites form a membrane above the host's skin, reducing the effect of laser and energy impacts." - id = "refractive_nanites" - program_type = /datum/nanite_program/refractive - category = list("Augmentation Nanites") - -/datum/design/nanites/coagulating - name = "Vein Repressurization" - desc = "The nanites re-route circulating blood away from open wounds, dramatically reducing bleeding rate." - id = "coagulating_nanites" - program_type = /datum/nanite_program/coagulating - category = list("Augmentation Nanites") - -/datum/design/nanites/conductive - name = "Electric Conduction" - desc = "The nanites act as a grounding rod for electric shocks, protecting the host. Shocks can still damage the nanites themselves." - id = "conductive_nanites" - program_type = /datum/nanite_program/conductive - category = list("Augmentation Nanites") - -/datum/design/nanites/mindshield - name = "Mental Barrier" - desc = "The nanites form a protective membrane around the host's brain, shielding them from abnormal influences while they're active." - id = "mindshield_nanites" - program_type = /datum/nanite_program/mindshield - category = list("Augmentation Nanites") - -////////////////////DEFECTIVE NANITES////////////////////////////////////// - -/datum/design/nanites/glitch - name = "Glitch" - desc = "A heavy software corruption that causes nanites to gradually break down." - id = "glitch_nanites" - program_type = /datum/nanite_program/glitch - category = list("Defective Nanites") - -/datum/design/nanites/necrotic - name = "Necrosis" - desc = "The nanites attack internal tissues indiscriminately, causing widespread damage." - id = "necrotic_nanites" - program_type = /datum/nanite_program/necrotic - category = list("Defective Nanites") - -/datum/design/nanites/toxic - name = "Toxin Buildup" - desc = "The nanites cause a slow but constant toxin buildup inside the host." - id = "toxic_nanites" - program_type = /datum/nanite_program/toxic - category = list("Defective Nanites") - -/datum/design/nanites/suffocating - name = "Hypoxemia" - desc = "The nanites prevent the host's blood from absorbing oxygen efficiently." - id = "suffocating_nanites" - program_type = /datum/nanite_program/suffocating - category = list("Defective Nanites") - -/datum/design/nanites/brain_misfire - name = "Brain Misfire" - desc = "The nanites interfere with neural pathways, causing minor psychological disturbances." - id = "brainmisfire_nanites" - program_type = /datum/nanite_program/brain_misfire - category = list("Defective Nanites") - -/datum/design/nanites/skin_decay - name = "Dermalysis" - desc = "The nanites attack skin cells, causing irritation, rashes, and minor damage." - id = "skindecay_nanites" - program_type = /datum/nanite_program/skin_decay - category = list("Defective Nanites") - -/datum/design/nanites/nerve_decay - name = "Nerve Decay" - desc = "The nanites attack the host's nerves, causing lack of coordination and short bursts of paralysis." - id = "nervedecay_nanites" - program_type = /datum/nanite_program/nerve_decay - category = list("Defective Nanites") - -/datum/design/nanites/brain_decay - name = "Brain-Eating Nanites" - desc = "Damages brain cells, gradually decreasing the host's cognitive functions." - id = "braindecay_nanites" - program_type = /datum/nanite_program/brain_decay - category = list("Defective Nanites") - -////////////////////WEAPONIZED NANITES///////////////////////////////////// - -/datum/design/nanites/flesh_eating - name = "Cellular Breakdown" - desc = "The nanites destroy cellular structures in the host's body, causing brute damage." - id = "flesheating_nanites" - program_type = /datum/nanite_program/flesh_eating - category = list("Weaponized Nanites") - -/datum/design/nanites/poison - name = "Poisoning" - desc = "The nanites deliver poisonous chemicals to the host's internal organs, causing toxin damage and vomiting." - id = "poison_nanites" - program_type = /datum/nanite_program/poison - category = list("Weaponized Nanites") - -/datum/design/nanites/memory_leak - name = "Memory Leak" - desc = "This program invades the memory space used by other programs, causing frequent corruptions and errors." - id = "memleak_nanites" - program_type = /datum/nanite_program/memory_leak - category = list("Weaponized Nanites") - -/datum/design/nanites/aggressive_replication - name = "Aggressive Replication" - desc = "Nanites will consume organic matter to improve their replication rate, damaging the host." - id = "aggressive_nanites" - program_type = /datum/nanite_program/aggressive_replication - category = list("Weaponized Nanites") - -/datum/design/nanites/meltdown - name = "Meltdown" - desc = "Causes an internal meltdown inside the nanites, causing internal burns inside the host as well as rapidly destroying the nanite population.\ - Sets the nanites' safety threshold to 0 when activated." - id = "meltdown_nanites" - program_type = /datum/nanite_program/meltdown - category = list("Weaponized Nanites") - -/datum/design/nanites/cryo - name = "Cryogenic Treatment" - desc = "The nanites rapidly skin heat through the host's skin, lowering their temperature." - id = "cryo_nanites" - program_type = /datum/nanite_program/cryo - category = list("Weaponized Nanites") - -/datum/design/nanites/pyro - name = "Sub-Dermal Combustion" - desc = "The nanites cause buildup of flammable fluids under the host's skin, then ignites them." - id = "pyro_nanites" - program_type = /datum/nanite_program/pyro - category = list("Weaponized Nanites") - -/datum/design/nanites/heart_stop - name = "Heart-Stopper" - desc = "Stops the host's heart when triggered; restarts it if triggered again." - id = "heartstop_nanites" - program_type = /datum/nanite_program/heart_stop - category = list("Weaponized Nanites") - -/datum/design/nanites/explosive - name = "Chain Detonation" - desc = "Blows up all the nanites inside the host in a chain reaction when triggered." - id = "explosive_nanites" - program_type = /datum/nanite_program/explosive - category = list("Weaponized Nanites") - -/datum/design/nanites/mind_control - name = "Mind Control" - desc = "The nanites imprint an absolute directive onto the host's brain while they're active." - id = "mindcontrol_nanites" - program_type = /datum/nanite_program/comm/mind_control - category = list("Weaponized Nanites") - -////////////////////SUPPRESSION NANITES////////////////////////////////////// - -/datum/design/nanites/shock - name = "Electric Shock" - desc = "The nanites shock the host when triggered. Destroys a large amount of nanites!" - id = "shock_nanites" - program_type = /datum/nanite_program/shocking - category = list("Suppression Nanites") - -/datum/design/nanites/stun - name = "Neural Shock" - desc = "The nanites pulse the host's nerves when triggered, inapacitating them for a short period." - id = "stun_nanites" - program_type = /datum/nanite_program/stun - category = list("Suppression Nanites") - -/datum/design/nanites/sleepy - name = "Sleep Induction" - desc = "The nanites cause rapid narcolepsy when triggered." - id = "sleep_nanites" - program_type = /datum/nanite_program/sleepy - category = list("Suppression Nanites") - -/datum/design/nanites/paralyzing - name = "Paralysis" - desc = "The nanites actively suppress nervous pulses, effectively paralyzing the host." - id = "paralyzing_nanites" - program_type = /datum/nanite_program/paralyzing - category = list("Suppression Nanites") - -/datum/design/nanites/fake_death - name = "Death Simulation" - desc = "The nanites induce a death-like coma into the host, able to fool most medical scans." - id = "fakedeath_nanites" - program_type = /datum/nanite_program/fake_death - category = list("Suppression Nanites") - -/datum/design/nanites/pacifying - name = "Pacification" - desc = "The nanites suppress the aggression center of the brain, preventing the host from causing direct harm to others." - id = "pacifying_nanites" - program_type = /datum/nanite_program/pacifying - category = list("Suppression Nanites") - -/datum/design/nanites/blinding - name = "Blindness" - desc = "The nanites suppress the host's ocular nerves, blinding them while they're active." - id = "blinding_nanites" - program_type = /datum/nanite_program/blinding - category = list("Suppression Nanites") - -/datum/design/nanites/mute - name = "Mute" - desc = "The nanites suppress the host's speech, making them mute while they're active." - id = "mute_nanites" - program_type = /datum/nanite_program/mute - category = list("Suppression Nanites") - -/datum/design/nanites/voice - name = "Skull Echo" - desc = "The nanites echo a synthesized message inside the host's skull." - id = "voice_nanites" - program_type = /datum/nanite_program/comm/voice - category = list("Suppression Nanites") - -/datum/design/nanites/speech - name = "Forced Speech" - desc = "The nanites force the host to say a pre-programmed sentence when triggered." - id = "speech_nanites" - program_type = /datum/nanite_program/comm/speech - category = list("Suppression Nanites") - -/datum/design/nanites/hallucination - name = "Hallucination" - desc = "The nanites make the host see and hear things that aren't real." - id = "hallucination_nanites" - program_type = /datum/nanite_program/comm/hallucination - category = list("Suppression Nanites") - -/datum/design/nanites/good_mood - name = "Happiness Enhancer" - desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." - id = "good_mood_nanites" - program_type = /datum/nanite_program/good_mood - category = list("Suppression Nanites") - -/datum/design/nanites/bad_mood - name = "Happiness Suppressor" - desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." - id = "bad_mood_nanites" - program_type = /datum/nanite_program/bad_mood - category = list("Suppression Nanites") - -////////////////////SENSOR NANITES////////////////////////////////////// - -/datum/design/nanites/sensor_health - name = "Health Sensor" - desc = "The nanites receive a signal when the host's health is above/below a certain percentage." - id = "sensor_health_nanites" - program_type = /datum/nanite_program/sensor/health - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_damage - name = "Damage Sensor" - desc = "The nanites receive a signal when a host's specific damage type is above/below a target value." - id = "sensor_damage_nanites" - program_type = /datum/nanite_program/sensor/damage - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_crit - name = "Critical Health Sensor" - desc = "The nanites receive a signal when the host first reaches critical health." - id = "sensor_crit_nanites" - program_type = /datum/nanite_program/sensor/crit - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_death - name = "Death Sensor" - desc = "The nanites receive a signal when they detect the host is dead." - id = "sensor_death_nanites" - program_type = /datum/nanite_program/sensor/death - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_voice - name = "Voice Sensor" - desc = "Sends a signal when the nanites hear a determined word or sentence." - id = "sensor_voice_nanites" - program_type = /datum/nanite_program/sensor/voice - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_nanite_volume - name = "Nanite Volume Sensor" - desc = "The nanites receive a signal when the nanite supply is above/below a certain percentage." - id = "sensor_nanite_volume" - program_type = /datum/nanite_program/sensor/nanite_volume - category = list("Sensor Nanites") - -/datum/design/nanites/sensor_species - name = "Species Sensor" - desc = "When triggered, the nanites scan the host to determine their species and output a signal depending on the conditions set in the settings." - id = "sensor_species_nanites" - program_type = /datum/nanite_program/sensor/species - category = list("Sensor Nanites") - -////////////////////NANITE PROTOCOLS////////////////////////////////////// -//Note about the category name: The UI cuts the last 8 characters from the category name to remove the " Nanites" in the other categories -//Because of this, Protocols was getting cut down to "P", so i had to add some padding -/datum/design/nanites/kickstart - name = "Kickstart Protocol" - desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation." - id = "kickstart_nanites" - program_type = /datum/nanite_program/protocol/kickstart - category = list("Protocols_Nanites") - -/datum/design/nanites/factory - name = "Factory Protocol" - desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time. The factory decays if the protocol is not active." - id = "factory_nanites" - program_type = /datum/nanite_program/protocol/factory - category = list("Protocols_Nanites") - -/datum/design/nanites/pyramid - name = "Pyramid Protocol" - desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is more efficient as long as the saturation level is above 80%." - id = "pyramid_nanites" - program_type = /datum/nanite_program/protocol/pyramid - category = list("Protocols_Nanites") - -/datum/design/nanites/offline - name = "Eclipse Protocol" - desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly." - id = "offline_nanites" - program_type = /datum/nanite_program/protocol/offline - category = list("Protocols_Nanites") - -/datum/design/nanites/hive - name = "Hive Protocol" - desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume in a host." - id = "hive_nanites" - program_type = /datum/nanite_program/protocol/hive - category = list("Protocols_Nanites") - -/datum/design/nanites/zip - name = "Zip Protocol" - desc = "Storage Protocol: the nanites are disassembled and compacted when unused, greatly increasing the maximum volume while in a host. However, the process slows down the replication rate slightly." - id = "zip_nanites" - program_type = /datum/nanite_program/protocol/zip - category = list("Protocols_Nanites") - -/datum/design/nanites/free_range - name = "Free-range Protocol" - desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume, but increases the replication rate." - id = "free_range_nanites" - program_type = /datum/nanite_program/protocol/free_range - category = list("Protocols_Nanites") - -/datum/design/nanites/unsafe_storage - name = "S.L.O. Protocol" - desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites,\ - allowing them to reach much higher saturation levels, but at the risk of causing internal damage to the host." - id = "unsafe_storage_nanites" - program_type = /datum/nanite_program/protocol/unsafe_storage - category = list("Protocols_Nanites") diff --git a/code/modules/research/nanites/extra_settings/_extra_setting.dm b/code/modules/research/nanites/extra_settings/_extra_setting.dm deleted file mode 100644 index b3bef77eb4..0000000000 --- a/code/modules/research/nanites/extra_settings/_extra_setting.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/nanite_extra_setting - var/setting_type - var/value - -/datum/nanite_extra_setting/proc/get_value() - return value - -/datum/nanite_extra_setting/proc/set_value(value) - src.value = value - -/datum/nanite_extra_setting/proc/get_copy() - return - -//I made the choice to send the name as part of the parameter instead of storing it directly on -//this datum as a way of avoiding duplication of data between the containing assoc list -//and this datum. -//Also make sure to double wrap the list when implementing this as -//+= is interpreted as a combine on lists, so the outer list gets unwrapped -/datum/nanite_extra_setting/proc/get_frontend_list(name) - return diff --git a/code/modules/research/nanites/extra_settings/boolean.dm b/code/modules/research/nanites/extra_settings/boolean.dm deleted file mode 100644 index 7d66eb988e..0000000000 --- a/code/modules/research/nanites/extra_settings/boolean.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/nanite_extra_setting/boolean - setting_type = NESTYPE_BOOLEAN - var/true_text - var/false_text - -/datum/nanite_extra_setting/boolean/New(initial, true_text, false_text) - value = initial - src.true_text = true_text - src.false_text = false_text - -/datum/nanite_extra_setting/boolean/set_value(value) - if(isnull(value)) - src.value = !src.value - return - . = ..() - -/datum/nanite_extra_setting/boolean/get_copy() - return new /datum/nanite_extra_setting/boolean(value, true_text, false_text) - -/datum/nanite_extra_setting/boolean/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "true_text" = true_text, - "false_text" = false_text - )) diff --git a/code/modules/research/nanites/extra_settings/number.dm b/code/modules/research/nanites/extra_settings/number.dm deleted file mode 100644 index 75489635f5..0000000000 --- a/code/modules/research/nanites/extra_settings/number.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/nanite_extra_setting/number - setting_type = NESTYPE_NUMBER - var/min - var/max - var/unit = "" - -/datum/nanite_extra_setting/number/New(initial, min, max, unit) - value = initial - src.min = min - src.max = max - if(unit) - src.unit = unit - -/datum/nanite_extra_setting/number/set_value(value) - if(istext(value)) - value = text2num(value) - if(!value || !isnum(value)) - return - src.value = clamp(value, min, max) - -/datum/nanite_extra_setting/number/get_copy() - return new /datum/nanite_extra_setting/number(value, min, max, unit) - -/datum/nanite_extra_setting/number/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "min" = min, - "max" = max, - "unit" = unit - )) diff --git a/code/modules/research/nanites/extra_settings/text.dm b/code/modules/research/nanites/extra_settings/text.dm deleted file mode 100644 index d3cad27bcf..0000000000 --- a/code/modules/research/nanites/extra_settings/text.dm +++ /dev/null @@ -1,21 +0,0 @@ -/datum/nanite_extra_setting/text - setting_type = NESTYPE_TEXT - -/datum/nanite_extra_setting/text/New(initial) - value = initial - -/datum/nanite_extra_setting/text/set_value(value) - src.value = trim(value) - -/datum/nanite_extra_setting/text/get_copy() - return new /datum/nanite_extra_setting/text(value) - -/datum/nanite_extra_setting/text/get_value() - return html_encode(value) - -/datum/nanite_extra_setting/text/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value - )) diff --git a/code/modules/research/nanites/extra_settings/type.dm b/code/modules/research/nanites/extra_settings/type.dm deleted file mode 100644 index 2085ba510c..0000000000 --- a/code/modules/research/nanites/extra_settings/type.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/nanite_extra_setting/type - setting_type = NESTYPE_TYPE - var/list/types - -/datum/nanite_extra_setting/type/New(initial, types) - value = initial - src.types = types - -/datum/nanite_extra_setting/type/get_copy() - return new /datum/nanite_extra_setting/type(value, types) - -/datum/nanite_extra_setting/type/get_frontend_list(name) - return list(list( - "name" = name, - "type" = setting_type, - "value" = value, - "types" = types - )) diff --git a/code/modules/research/nanites/nanite_chamber.dm b/code/modules/research/nanites/nanite_chamber.dm deleted file mode 100644 index c35f470500..0000000000 --- a/code/modules/research/nanites/nanite_chamber.dm +++ /dev/null @@ -1,213 +0,0 @@ -/obj/machinery/nanite_chamber - name = "nanite chamber" - desc = "A device that can scan, reprogram, and inject nanites." - circuit = /obj/item/circuitboard/machine/nanite_chamber - icon = 'icons/obj/machines/nanite_chamber.dmi' - icon_state = "nanite_chamber" - base_icon_state = "nanite_chamber" - layer = ABOVE_WINDOW_LAYER - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - obj_flags = NO_BUILD // Becomes undense when the door is open - idle_power_usage = 50 - active_power_usage = 300 - - var/locked = FALSE - var/breakout_time = 1200 - var/scan_level - var/busy = FALSE - var/busy_icon_state - var/busy_message - var/message_cooldown = 0 - -/obj/machinery/nanite_chamber/Initialize() - . = ..() - occupant_typecache = GLOB.typecache_living - -/obj/machinery/nanite_chamber/RefreshParts() - scan_level = 0 - for(var/obj/item/stock_parts/scanning_module/P in component_parts) - scan_level += P.rating - -/obj/machinery/nanite_chamber/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Scanning module has been upgraded to level [scan_level].") - -/obj/machinery/nanite_chamber/proc/set_busy(status, message, working_icon) - busy = status - busy_message = message - busy_icon_state = working_icon - update_appearance() - -/obj/machinery/nanite_chamber/proc/set_safety(threshold) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_SAFETY, threshold) - -/obj/machinery/nanite_chamber/proc/set_cloud(cloud_id) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_CLOUD, cloud_id) - -/obj/machinery/nanite_chamber/proc/inject_nanites() - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "Initializing injection protocol...", "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Priming nanites...", "[initial(icon_state)]_active"),40) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Injecting...", "[initial(icon_state)]_active"),70) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Activating nanites...", "[initial(icon_state)]_falling"),110) - addtimer(CALLBACK(src, .proc/complete_injection, locked_state),130) - -/obj/machinery/nanite_chamber/proc/complete_injection(locked_state) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - occupant.AddComponent(/datum/component/nanites, 100) - -/obj/machinery/nanite_chamber/proc/remove_nanites(datum/nanite_program/NP) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "Initializing cleanup protocol...", "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Analyzing host bio-structure...", "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Pinging nanites...", "[initial(icon_state)]_active"),40) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Initiating graceful self-destruct sequence...", "[initial(icon_state)]_active"),70) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "Removing debris...", "[initial(icon_state)]_falling"),110) - addtimer(CALLBACK(src, .proc/complete_removal, locked_state),130) - -/obj/machinery/nanite_chamber/proc/complete_removal(locked_state) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - SEND_SIGNAL(occupant, COMSIG_NANITE_DELETE) - -/obj/machinery/nanite_chamber/update_icon_state() - //running and someone in there - if(occupant) - icon_state = busy ? busy_icon_state : "[base_icon_state]_occupied" - return ..() - //running - icon_state = "[base_icon_state][state_open ? "_open" : null]" - return ..() - -/obj/machinery/nanite_chamber/update_overlays() - . = ..() - - if((machine_stat & MAINT) || panel_open) - . += "maint" - return - - if(machine_stat & (NOPOWER|BROKEN)) - return - - if(busy || locked) - . += "red" - if(locked) - . += "bolted" - return - - . += "green" - -/obj/machinery/nanite_chamber/proc/toggle_open(mob/user) - if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) - return - - if(state_open) - close_machine() - return - - else if(locked) - to_chat(user, span_notice("The bolts are locked down, securing the door shut.")) - return - - open_machine() - -/obj/machinery/nanite_chamber/container_resist_act(mob/living/user) - if(!locked) - open_machine() - return - if(busy) - return - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \ - span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("You hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked || busy) - return - locked = FALSE - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("You successfully break out of [src]!")) - open_machine() - -/obj/machinery/nanite_chamber/close_machine(mob/living/carbon/user) - if(!state_open) - return FALSE - - ..(user) - return TRUE - -/obj/machinery/nanite_chamber/open_machine() - if(state_open) - return FALSE - - ..() - - return TRUE - -/obj/machinery/nanite_chamber/relaymove(mob/living/user, direction) - if(user.stat || locked) - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - return - open_machine() - -/obj/machinery/nanite_chamber/attackby(obj/item/I, mob/user, params) - if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... - update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - return ..() - -/obj/machinery/nanite_chamber/interact(mob/user) - toggle_open(user) - -/obj/machinery/nanite_chamber/MouseDrop_T(mob/target, mob/user) - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || !Adjacent(target) || !user.Adjacent(target) || !iscarbon(target)) - return - if(close_machine(target)) - log_combat(user, target, "inserted", null, "into [src].") - add_fingerprint(user) diff --git a/code/modules/research/nanites/nanite_chamber_computer.dm b/code/modules/research/nanites/nanite_chamber_computer.dm deleted file mode 100644 index c18364de1a..0000000000 --- a/code/modules/research/nanites/nanite_chamber_computer.dm +++ /dev/null @@ -1,108 +0,0 @@ -/obj/machinery/computer/nanite_chamber_control - name = "nanite chamber control console" - desc = "Controls a connected nanite chamber. Can inoculate nanites, load programs, and analyze existing nanite swarms." - var/obj/machinery/nanite_chamber/chamber - icon_screen = "nanite_chamber_control" - circuit = /obj/item/circuitboard/computer/nanite_chamber_control - -/obj/machinery/computer/nanite_chamber_control/Initialize() - . = ..() - find_chamber() - -/obj/machinery/computer/nanite_chamber_control/proc/find_chamber() - for(var/direction in GLOB.cardinals) - var/C = locate(/obj/machinery/nanite_chamber, get_step(src, direction)) - if(C) - var/obj/machinery/nanite_chamber/NC = C - set_connected_chamber(NC) - -/obj/machinery/computer/nanite_chamber_control/interact() - if(!chamber) - find_chamber() - ..() - -/obj/machinery/computer/nanite_chamber_control/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteChamberControl", name) - ui.open() - -/obj/machinery/computer/nanite_chamber_control/ui_data() - var/list/data = list() - - if(!chamber) - data["status_msg"] = "No chamber detected." - return data - - if(!chamber.occupant) - data["status_msg"] = "No occupant detected." - return data - - var/mob/living/L = chamber.occupant - - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - data["status_msg"] = "Occupant not compatible with nanites." - return data - - if(chamber.busy) - data["status_msg"] = chamber.busy_message - return data - - data["status_msg"] = null - data["scan_level"] = chamber.scan_level - data["locked"] = chamber.locked - data["occupant_name"] = chamber.occupant.name - - SEND_SIGNAL(L, COMSIG_NANITE_UI_DATA, data, chamber.scan_level) - - return data - -/obj/machinery/computer/nanite_chamber_control/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("toggle_lock") - chamber.locked = !chamber.locked - chamber.update_appearance() - . = TRUE - if("set_safety") - var/threshold = text2num(params["value"]) - if(!isnull(threshold)) - chamber.set_safety(clamp(round(threshold, 1),0,500)) - playsound(src, "terminal_type", 25, FALSE) - chamber.occupant.investigate_log("'s nanites' safety threshold was set to [threshold] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("set_cloud") - var/cloud_id = text2num(params["value"]) - if(!isnull(cloud_id)) - chamber.set_cloud(clamp(round(cloud_id, 1),0,100)) - playsound(src, "terminal_type", 25, FALSE) - chamber.occupant.investigate_log("'s nanites' cloud id was set to [cloud_id] by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("connect_chamber") - find_chamber() - . = TRUE - if("remove_nanites") - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - chamber.remove_nanites() - log_combat(usr, chamber.occupant, "cleared nanites from", null, "via [src]") - chamber.occupant.investigate_log("'s nanites were cleared by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - if("nanite_injection") - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - chamber.inject_nanites() - log_combat(usr, chamber.occupant, "injected", null, "with nanites via [src]") - chamber.occupant.investigate_log("was injected with nanites by [key_name(usr)] via [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - . = TRUE - -/obj/machinery/computer/nanite_chamber_control/proc/set_connected_chamber(new_chamber) - if(chamber) - UnregisterSignal(chamber, COMSIG_PARENT_QDELETING) - chamber = new_chamber - if(chamber) - RegisterSignal(chamber, COMSIG_PARENT_QDELETING, .proc/react_to_chamber_del) - -/obj/machinery/computer/nanite_chamber_control/proc/react_to_chamber_del(datum/source) - SIGNAL_HANDLER - set_connected_chamber(null) diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm deleted file mode 100644 index fcfe181c60..0000000000 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ /dev/null @@ -1,261 +0,0 @@ -/obj/machinery/computer/nanite_cloud_controller - name = "nanite cloud controller" - desc = "Stores and controls nanite cloud backups." - icon = 'icons/obj/machines/research.dmi' - icon_state = "nanite_cloud_controller" - circuit = /obj/item/circuitboard/computer/nanite_cloud_controller - icon_screen = "nanite_cloud_controller_screen" - icon_keyboard = null - - var/obj/item/disk/nanite_program/disk - var/list/datum/nanite_cloud_backup/cloud_backups = list() - var/current_view = 0 //0 is the main menu, any other number is the page of the backup with that ID - var/new_backup_id = 1 - -/obj/machinery/computer/nanite_cloud_controller/Destroy() - QDEL_LIST(cloud_backups) //rip backups - eject() - return ..() - -/obj/machinery/computer/nanite_cloud_controller/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if (user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - else - ..() - -/obj/machinery/computer/nanite_cloud_controller/AltClick(mob/user) - if(disk && user.canUseTopic(src, !issilicon(user))) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/computer/nanite_cloud_controller/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) ||!user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - -/obj/machinery/computer/nanite_cloud_controller/proc/get_backup(cloud_id) - for(var/I in cloud_backups) - var/datum/nanite_cloud_backup/backup = I - if(backup.cloud_id == cloud_id) - return backup - -/obj/machinery/computer/nanite_cloud_controller/proc/generate_backup(cloud_id, mob/user) - if(SSnanites.get_cloud_backup(cloud_id, TRUE)) - to_chat(user, span_warning("Cloud ID already registered.")) - return - - var/datum/nanite_cloud_backup/backup = new(src) - var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites) - backup.cloud_id = cloud_id - backup.nanites = cloud_copy - investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) - -/obj/machinery/computer/nanite_cloud_controller/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteCloudControl", name) - ui.open() - -/obj/machinery/computer/nanite_cloud_controller/ui_data() - var/list/data = list() - - if(disk) - data["has_disk"] = TRUE - var/list/disk_data = list() - var/datum/nanite_program/P = disk.program - if(P) - data["has_program"] = TRUE - disk_data["name"] = P.name - disk_data["desc"] = P.desc - disk_data["use_rate"] = P.use_rate - disk_data["can_trigger"] = P.can_trigger - disk_data["trigger_cost"] = P.trigger_cost - disk_data["trigger_cooldown"] = P.trigger_cooldown / 10 - - disk_data["activated"] = P.activated - disk_data["activation_code"] = P.activation_code - disk_data["deactivation_code"] = P.deactivation_code - disk_data["kill_code"] = P.kill_code - disk_data["trigger_code"] = P.trigger_code - disk_data["timer_restart"] = P.timer_restart / 10 - disk_data["timer_shutdown"] = P.timer_shutdown / 10 - disk_data["timer_trigger"] = P.timer_trigger / 10 - disk_data["timer_trigger_delay"] = P.timer_trigger_delay / 10 - - var/list/extra_settings = P.get_extra_settings_frontend() - disk_data["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - disk_data["has_extra_settings"] = TRUE - if(istype(P, /datum/nanite_program/sensor)) - var/datum/nanite_program/sensor/sensor = P - if(sensor.can_rule) - disk_data["can_rule"] = TRUE - data["disk"] = disk_data - else - data["has_disk"] = FALSE - - data["new_backup_id"] = new_backup_id - - data["current_view"] = current_view - if(current_view) - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - var/datum/component/nanites/nanites = backup.nanites - data["cloud_backup"] = TRUE - var/list/cloud_programs = list() - var/id = 1 - for(var/datum/nanite_program/P in nanites.programs) - var/list/cloud_program = list() - cloud_program["name"] = P.name - cloud_program["desc"] = P.desc - cloud_program["id"] = id - cloud_program["use_rate"] = P.use_rate - cloud_program["can_trigger"] = P.can_trigger - cloud_program["trigger_cost"] = P.trigger_cost - cloud_program["trigger_cooldown"] = P.trigger_cooldown / 10 - cloud_program["activated"] = P.activated - cloud_program["timer_restart"] = P.timer_restart / 10 - cloud_program["timer_shutdown"] = P.timer_shutdown / 10 - cloud_program["timer_trigger"] = P.timer_trigger / 10 - cloud_program["timer_trigger_delay"] = P.timer_trigger_delay / 10 - - cloud_program["activation_code"] = P.activation_code - cloud_program["deactivation_code"] = P.deactivation_code - cloud_program["kill_code"] = P.kill_code - cloud_program["trigger_code"] = P.trigger_code - var/list/rules = list() - var/rule_id = 1 - for(var/X in P.rules) - var/datum/nanite_rule/nanite_rule = X - var/list/rule = list() - rule["display"] = nanite_rule.display() - rule["program_id"] = id - rule["id"] = rule_id - rules += list(rule) - rule_id++ - cloud_program["rules"] = rules - if(LAZYLEN(rules)) - cloud_program["has_rules"] = TRUE - cloud_program["all_rules_required"] = P.all_rules_required - - var/list/extra_settings = P.get_extra_settings_frontend() - cloud_program["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - cloud_program["has_extra_settings"] = TRUE - id++ - cloud_programs += list(cloud_program) - data["cloud_programs"] = cloud_programs - else - var/list/backup_list = list() - for(var/X in cloud_backups) - var/datum/nanite_cloud_backup/backup = X - var/list/cloud_backup = list() - cloud_backup["cloud_id"] = backup.cloud_id - backup_list += list(cloud_backup) - data["cloud_backups"] = backup_list - return data - -/obj/machinery/computer/nanite_cloud_controller/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("set_view") - current_view = text2num(params["view"]) - . = TRUE - if("update_new_backup_value") - var/backup_value = text2num(params["value"]) - new_backup_id = backup_value - if("create_backup") - var/cloud_id = new_backup_id - if(!isnull(cloud_id)) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - cloud_id = clamp(round(cloud_id, 1),1,100) - generate_backup(cloud_id, usr) - . = TRUE - if("delete_backup") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - qdel(backup) - investigate_log("[key_name(usr)] deleted the nanite cloud backup #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("upload_program") - if(disk?.program) - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - nanites.add_program(null, disk.program.copy()) - investigate_log("[key_name(usr)] uploaded program [disk.program.name] to cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("remove_program") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - investigate_log("[key_name(usr)] deleted program [P.name] from cloud #[current_view]", INVESTIGATE_NANITES) - qdel(P) - . = TRUE - if("add_rule") - if(disk && disk.program && istype(disk.program, /datum/nanite_program/sensor)) - var/datum/nanite_program/sensor/rule_template = disk.program - if(!rule_template.can_rule) - return - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - var/datum/nanite_rule/rule = rule_template.make_rule(P) - - investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("remove_rule") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, 0) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])] - rule.remove() - - investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - if("toggle_rule_logic") - var/datum/nanite_cloud_backup/backup = get_backup(current_view) - if(backup) - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - var/datum/component/nanites/nanites = backup.nanites - var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] - P.all_rules_required = !P.all_rules_required - investigate_log("[key_name(usr)] edited rule logic for program [P.name] into [P.all_rules_required ? "All" : "Any"] in cloud #[current_view]", INVESTIGATE_NANITES) - . = TRUE - -/datum/nanite_cloud_backup - var/cloud_id = 0 - var/datum/component/nanites/nanites - var/obj/machinery/computer/nanite_cloud_controller/storage - -/datum/nanite_cloud_backup/New(obj/machinery/computer/nanite_cloud_controller/_storage) - storage = _storage - storage.cloud_backups += src - SSnanites.cloud_backups += src - -/datum/nanite_cloud_backup/Destroy() - storage.cloud_backups -= src - SSnanites.cloud_backups -= src - return ..() diff --git a/code/modules/research/nanites/nanite_hijacker.dm b/code/modules/research/nanites/nanite_hijacker.dm deleted file mode 100644 index 8b13789179..0000000000 --- a/code/modules/research/nanites/nanite_hijacker.dm +++ /dev/null @@ -1 +0,0 @@ - diff --git a/code/modules/research/nanites/nanite_misc_items.dm b/code/modules/research/nanites/nanite_misc_items.dm deleted file mode 100644 index 6837543d11..0000000000 --- a/code/modules/research/nanites/nanite_misc_items.dm +++ /dev/null @@ -1,9 +0,0 @@ -/obj/item/nanite_injector - name = "nanite injector (FOR TESTING)" - desc = "Injects nanites into the user." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/device.dmi' - icon_state = "nanite_remote" - -/obj/item/nanite_injector/attack_self(mob/user) - user.AddComponent(/datum/component/nanites, 150) diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm deleted file mode 100644 index 3039dea970..0000000000 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ /dev/null @@ -1,149 +0,0 @@ -/obj/machinery/nanite_program_hub - name = "nanite program hub" - desc = "Compiles nanite programs from the techweb servers and downloads them into disks." - icon = 'icons/obj/machines/research.dmi' - icon_state = "nanite_program_hub" - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - circuit = /obj/item/circuitboard/machine/nanite_program_hub - - var/obj/item/disk/nanite_program/disk - var/datum/techweb/linked_techweb - var/current_category = "Main" - var/detail_view = TRUE - var/categories = list( - list(name = "Utility Nanites"), - list(name = "Medical Nanites"), - list(name = "Sensor Nanites"), - list(name = "Augmentation Nanites"), - list(name = "Suppression Nanites"), - list(name = "Weaponized Nanites"), - list(name = "Protocols"), - ) - -/obj/machinery/nanite_program_hub/Initialize() - . = ..() - linked_techweb = SSresearch.science_tech - -/obj/machinery/nanite_program_hub/update_overlays() - . = ..() - if((machine_stat & (NOPOWER|MAINT|BROKEN)) || panel_open) - return - . += mutable_appearance(icon, "nanite_program_hub_on") - . += emissive_appearance(icon, "nanite_program_hub_on") - -/obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if(user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - else - ..() - -/obj/machinery/nanite_program_hub/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_screwdriver(user, "nanite_program_hub_t", "nanite_program_hub", I) - -/obj/machinery/nanite_program_hub/crowbar_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_crowbar(I) - -/obj/machinery/nanite_program_hub/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - -/obj/machinery/nanite_program_hub/AltClick(mob/user) - if(disk && user.canUseTopic(src, !issilicon(user))) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/nanite_program_hub/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteProgramHub", name) - ui.open() - -/obj/machinery/nanite_program_hub/ui_data() - var/list/data = list() - if(disk) - data["has_disk"] = TRUE - var/list/disk_data = list() - var/datum/nanite_program/P = disk.program - if(P) - data["has_program"] = TRUE - disk_data["name"] = P.name - disk_data["desc"] = P.desc - data["disk"] = disk_data - else - data["has_disk"] = FALSE - - data["detail_view"] = detail_view - - return data - -/obj/machinery/nanite_program_hub/ui_static_data(mob/user) - var/list/data = list() - data["programs"] = list() - for(var/i in linked_techweb.researched_designs) - var/datum/design/nanites/D = SSresearch.techweb_design_by_id(i) - if(!istype(D)) - continue - var/cat_name = D.category[1] //just put them in the first category fuck it - if(isnull(data["programs"][cat_name])) - data["programs"][cat_name] = list() - var/list/program_design = list() - program_design["id"] = D.id - program_design["name"] = D.name - program_design["desc"] = D.desc - data["programs"][cat_name] += list(program_design) - - if(!length(data["programs"])) - data["programs"] = null - - return data - -/obj/machinery/nanite_program_hub/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("download") - if(!disk) - return - var/datum/design/nanites/downloaded = linked_techweb.isDesignResearchedID(params["program_id"]) //check if it's a valid design - if(!istype(downloaded)) - return - if(disk.program) - qdel(disk.program) - disk.program = new downloaded.program_type - disk.name = "[initial(disk.name)] \[[disk.program.name]\]" - playsound(src, 'sound/machines/terminal_prompt.ogg', 25, FALSE) - . = TRUE - if("refresh") - update_static_data(usr) - . = TRUE - if("toggle_details") - detail_view = !detail_view - . = TRUE - if("clear") - if(disk?.program) - qdel(disk.program) - disk.program = null - disk.name = initial(disk.name) - . = TRUE diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm deleted file mode 100644 index f06c21aa79..0000000000 --- a/code/modules/research/nanites/nanite_programmer.dm +++ /dev/null @@ -1,175 +0,0 @@ -/obj/machinery/nanite_programmer - name = "nanite programmer" - desc = "A device that can edit nanite program disks to adjust their functionality." - var/obj/item/disk/nanite_program/disk - var/datum/nanite_program/program - icon = 'icons/obj/machines/research.dmi' - icon_state = "nanite_programmer" - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - circuit = /obj/item/circuitboard/machine/nanite_programmer - -/obj/machinery/nanite_programmer/Initialize() - . = ..() - become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) - -/obj/machinery/nanite_programmer/update_overlays() - . = ..() - if((machine_stat & (NOPOWER|MAINT|BROKEN)) || panel_open) - return - . += mutable_appearance(icon, "nanite_programmer_on") - . += emissive_appearance(icon, "nanite_programmer_on") - -/obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/nanite_program)) - var/obj/item/disk/nanite_program/N = I - if(user.transferItemToLoc(N, src)) - to_chat(user, span_notice("You insert [N] into [src]")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if(disk) - eject(user) - disk = N - program = N.program - else - ..() - -/obj/machinery/nanite_programmer/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_screwdriver(user, "nanite_programmer_t", "nanite_programmer", I) - -/obj/machinery/nanite_programmer/crowbar_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - - return default_deconstruction_crowbar(I) - -/obj/machinery/nanite_programmer/proc/eject(mob/living/user) - if(!disk) - return - if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(disk)) - disk.forceMove(drop_location()) - disk = null - program = null - -/obj/machinery/nanite_programmer/AltClick(mob/user) - if(disk && user.canUseTopic(src, !issilicon(user))) - to_chat(user, span_notice("You take out [disk] from [src].")) - eject(user) - return - -/obj/machinery/nanite_programmer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteProgrammer", name) - ui.open() - -/obj/machinery/nanite_programmer/ui_data() - var/list/data = list() - data["has_disk"] = istype(disk) - data["has_program"] = istype(program) - if(program) - data["name"] = program.name - data["desc"] = program.desc - data["use_rate"] = program.use_rate - data["can_trigger"] = program.can_trigger - data["trigger_cost"] = program.trigger_cost - data["trigger_cooldown"] = program.trigger_cooldown / 10 - - data["activated"] = program.activated - data["activation_code"] = program.activation_code - data["deactivation_code"] = program.deactivation_code - data["kill_code"] = program.kill_code - data["trigger_code"] = program.trigger_code - data["timer_restart"] = program.timer_restart / 10 - data["timer_shutdown"] = program.timer_shutdown / 10 - data["timer_trigger"] = program.timer_trigger / 10 - data["timer_trigger_delay"] = program.timer_trigger_delay / 10 - - var/list/extra_settings = program.get_extra_settings_frontend() - data["extra_settings"] = extra_settings - if(LAZYLEN(extra_settings)) - data["has_extra_settings"] = TRUE - - return data - -/obj/machinery/nanite_programmer/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject") - eject(usr) - . = TRUE - if("toggle_active") - playsound(src, "terminal_type", 25, FALSE) - program.activated = !program.activated //we don't use the activation procs since we aren't in a mob - investigate_log("[key_name(usr)] edited [program.name]'s initial activation status into [program.activated ? "Activated" : "Deactivated"]", INVESTIGATE_NANITES) - . = TRUE - if("set_code") - var/new_code = text2num(params["code"]) - playsound(src, "terminal_type", 25, FALSE) - var/target_code = params["target_code"] - switch(target_code) - if("activation") - program.activation_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s activation code into [program.activation_code]", INVESTIGATE_NANITES) - if("deactivation") - program.deactivation_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s deactivation code into [program.deactivation_code]", INVESTIGATE_NANITES) - if("kill") - program.kill_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s kill code into [program.kill_code]", INVESTIGATE_NANITES) - if("trigger") - program.trigger_code = clamp(round(new_code, 1),0,9999) - investigate_log("[key_name(usr)] edited [program.name]'s trigger code into [program.trigger_code]", INVESTIGATE_NANITES) - . = TRUE - if("set_extra_setting") - program.set_extra_setting(params["target_setting"], params["value"]) - investigate_log("[key_name(usr)] edited [program.name]'s extra setting '[params["target_setting"]]' into [params["value"]]", INVESTIGATE_NANITES) - playsound(src, "terminal_type", 25, FALSE) - . = TRUE - if("set_restart_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_restart = timer - investigate_log("[key_name(usr)] edited [program.name]'s restart timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_shutdown_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_shutdown = timer - investigate_log("[key_name(usr)] edited [program.name]'s shutdown timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_trigger_timer") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_trigger = timer - investigate_log("[key_name(usr)] edited [program.name]'s trigger timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - if("set_timer_trigger_delay") - var/timer = text2num(params["delay"]) - if(!isnull(timer)) - playsound(src, "terminal_type", 25, FALSE) - timer = clamp(round(timer, 1), 0, 3600) - timer *= 10 //convert to deciseconds - program.timer_trigger_delay = timer - investigate_log("[key_name(usr)] edited [program.name]'s trigger delay timer into [timer/10] s", INVESTIGATE_NANITES) - . = TRUE - -/obj/machinery/nanite_programmer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) - . = ..() - var/static/regex/when = regex("(?:^\\W*when|when\\W*$)", "i") //starts or ends with when - if(findtext(raw_message, when) && !istype(speaker, /obj/machinery/nanite_programmer)) - say("When you code it!!") diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm deleted file mode 100644 index 0b26b4e79f..0000000000 --- a/code/modules/research/nanites/nanite_programs.dm +++ /dev/null @@ -1,335 +0,0 @@ -/datum/nanite_program - var/name = "Generic Nanite Program" - var/desc = "Warn a coder if you can read this." - - var/datum/component/nanites/nanites - var/mob/living/host_mob - - var/use_rate = 0 //Amount of nanites used while active - var/unique = TRUE //If there can be more than one copy in the same nanites - var/can_trigger = FALSE //If the nanites have a trigger function (used for the programming UI) - var/trigger_cost = 0 //Amount of nanites required to trigger - var/trigger_cooldown = 50 //Deciseconds required between each trigger activation - var/next_trigger = 0 //World time required for the next trigger activation - - var/program_flags = NONE - var/passive_enabled = FALSE //If the nanites have an on/off-style effect, it's tracked by this var - - var/list/rogue_types = list(/datum/nanite_program/glitch) //What this can turn into if it glitches. - //As a rule of thumb, these should be: - //A: simpler - //B: negative - //C: affecting the same parts of the body, roughly - //B is mostly a consequence of A: it's always going to be simpler to cause damage than to repair it, so a software bug will not randomly make the flesh eating - //nanites learn how to repair cells. - //Given enough glitch-swapping you'll end up with stuff like necrotic or toxic nanites, which are very simple as they just try to eat what's in front of them - //or just lie around polluting the blood - - - //The following vars are customizable - var/activated = TRUE //If FALSE, the program won't process, disables passive effects, can't trigger and doesn't consume nanites - - var/timer_restart = 0 //When deactivated, the program will wait X deciseconds before self-reactivating. Also works if the program begins deactivated. - var/timer_shutdown = 0 //When activated, the program will wait X deciseconds before self-deactivating. Also works if the program begins activated. - var/timer_trigger = 0 //[Trigger only] While active, the program will attempt to trigger once every x deciseconds. - var/timer_trigger_delay = 0 //[Trigger only] While active, the program will delay trigger signals by X deciseconds. - - //Indicates the next world.time tick where these timers will act - var/timer_restart_next = 0 - var/timer_shutdown_next = 0 - var/timer_trigger_next = 0 - var/timer_trigger_delay_next = 0 - - //Signal codes, these handle remote input to the nanites. If set to 0 they'll ignore signals. - var/activation_code = 0 //Code that activates the program [1-9999] - var/deactivation_code = 0 //Code that deactivates the program [1-9999] - var/kill_code = 0 //Code that permanently removes the program [1-9999] - var/trigger_code = 0 //Code that triggers the program (if available) [1-9999] - - //Extra settings - ///Don't ever override this or I will come to your house and stand menacingly behind a bush - VAR_FINAL/list/extra_settings = list() - - //Rules - //Rules that automatically manage if the program's active without requiring separate sensor programs - var/list/datum/nanite_rule/rules = list() - var/all_rules_required = TRUE //Whether all rules are required for positive condition or any of specified - -/datum/nanite_program/New() - . = ..() - register_extra_settings() - -/datum/nanite_program/Destroy() - extra_settings = null - if(host_mob) - if(activated) - deactivate() - if(passive_enabled) - disable_passive_effect() - on_mob_remove() - if(nanites) - nanites.programs -= src - for(var/datum/nanite_rule/rule as anything in rules) - rule.remove() - rules.Cut() - return ..() - -/datum/nanite_program/proc/copy() - var/datum/nanite_program/new_program = new type() - copy_programming(new_program, TRUE) - - return new_program - -/datum/nanite_program/proc/copy_programming(datum/nanite_program/target, copy_activated = TRUE) - if(copy_activated) - target.activated = activated - target.timer_restart = timer_restart - target.timer_shutdown = timer_shutdown - target.timer_trigger = timer_trigger - target.timer_trigger_delay = timer_trigger_delay - target.activation_code = activation_code - target.deactivation_code = deactivation_code - target.kill_code = kill_code - target.trigger_code = trigger_code - - target.rules = list() - for(var/R in rules) - var/datum/nanite_rule/rule = R - rule.copy_to(target) - target.all_rules_required = all_rules_required - - if(istype(target,src)) - copy_extra_settings_to(target) - -/// Register extra settings by overriding this. -/// -/// `extra_settings[name] = new typepath()` for each extra setting. -/datum/nanite_program/proc/register_extra_settings() - return - -///You can override this if you need to have special behavior after setting certain settings. -/datum/nanite_program/proc/set_extra_setting(setting, value) - var/datum/nanite_extra_setting/ES = extra_settings[setting] - return ES.set_value(value) - -///You probably shouldn't be overriding this one, but I'm not a cop. -/datum/nanite_program/proc/get_extra_setting_value(setting) - var/datum/nanite_extra_setting/ES = extra_settings[setting] - return ES.get_value() - -///Used for getting information about the extra settings to the frontend -/datum/nanite_program/proc/get_extra_settings_frontend() - var/list/out = list() - for(var/name in extra_settings) - var/datum/nanite_extra_setting/ES = extra_settings[name] - out += ES.get_frontend_list(name) - return out - -///Copy of the list instead of direct reference for obvious reasons -/datum/nanite_program/proc/copy_extra_settings_to(datum/nanite_program/target) - var/list/copy_list = list() - for(var/ns_name in extra_settings) - var/datum/nanite_extra_setting/extra_setting = extra_settings[ns_name] - copy_list[ns_name] = extra_setting.get_copy() - target.extra_settings = copy_list - -/datum/nanite_program/proc/on_add(datum/component/nanites/_nanites) - nanites = _nanites - if(nanites.host_mob) - on_mob_add() - -/datum/nanite_program/proc/on_mob_add() - host_mob = nanites.host_mob - if(activated) //apply activation effects depending on initial status; starts the restart and shutdown timers - activate() - else - deactivate() - -/datum/nanite_program/proc/on_mob_remove() - return - -/datum/nanite_program/proc/toggle() - if(!activated) - activate() - else - deactivate() - -/datum/nanite_program/proc/activate() - activated = TRUE - if(timer_shutdown) - timer_shutdown_next = world.time + timer_shutdown - -/datum/nanite_program/proc/deactivate() - if(passive_enabled) - disable_passive_effect() - activated = FALSE - if(timer_restart) - timer_restart_next = world.time + timer_restart - -/datum/nanite_program/proc/on_process() - if(!activated) - if(timer_restart_next && world.time > timer_restart_next) - activate() - timer_restart_next = 0 - return - - if(timer_shutdown_next && world.time > timer_shutdown_next) - deactivate() - timer_shutdown_next = 0 - return - - if(timer_trigger && world.time > timer_trigger_next) - trigger() - timer_trigger_next = world.time + timer_trigger - return - - if(timer_trigger_delay_next && world.time > timer_trigger_delay_next) - trigger(delayed = TRUE) - timer_trigger_delay_next = 0 - return - - if(check_conditions() && consume_nanites(use_rate)) - if(!passive_enabled) - enable_passive_effect() - active_effect() - else - if(passive_enabled) - disable_passive_effect() - -//If false, disables active, passive effects, and triggers without consuming nanites -//Can be used to avoid consuming nanites for nothing -/datum/nanite_program/proc/check_conditions() - if (!LAZYLEN(rules)) - return TRUE - for(var/R in rules) - var/datum/nanite_rule/rule = R - if(!all_rules_required && rule.check_rule()) - return TRUE - if(all_rules_required && !rule.check_rule()) - return FALSE - return all_rules_required ? TRUE : FALSE - -//Constantly procs as long as the program is active -/datum/nanite_program/proc/active_effect() - return - -//Procs once when the program activates -/datum/nanite_program/proc/enable_passive_effect() - passive_enabled = TRUE - -//Procs once when the program deactivates -/datum/nanite_program/proc/disable_passive_effect() - passive_enabled = FALSE - -//Checks conditions then fires the nanite trigger effect -/datum/nanite_program/proc/trigger(delayed = FALSE, comm_message) - if(!can_trigger) - return - if(!activated) - return - if(timer_trigger_delay && !delayed) - timer_trigger_delay_next = world.time + timer_trigger_delay - return - if(world.time < next_trigger) - return - if(!check_conditions()) - return - if(!consume_nanites(trigger_cost)) - return - next_trigger = world.time + trigger_cooldown - on_trigger(comm_message) - -//Nanite trigger effect, requires can_trigger to be used -/datum/nanite_program/proc/on_trigger(comm_message) - return - -/datum/nanite_program/proc/consume_nanites(amount, force = FALSE) - return nanites.consume_nanites(amount, force) - -/datum/nanite_program/proc/on_emp(severity) - if(program_flags & NANITE_EMP_IMMUNE) - return - if(prob(80 / severity)) - host_mob.investigate_log("[src] nanite program received a software error due to emp.", INVESTIGATE_NANITES) - software_error() - -/datum/nanite_program/proc/on_shock(shock_damage) - if(!(program_flags & NANITE_SHOCK_IMMUNE)) - if(prob(10)) - host_mob.investigate_log("[src] nanite program received a software error due to shock.", INVESTIGATE_NANITES) - software_error() - else if(prob(33)) - host_mob.investigate_log("[src] nanite program was deleted due to shock.", INVESTIGATE_NANITES) - qdel(src) - -/datum/nanite_program/proc/on_minor_shock() - if(!(program_flags & NANITE_SHOCK_IMMUNE)) - if(prob(10)) - host_mob.investigate_log("[src] nanite program received a software error due to minor shock.", INVESTIGATE_NANITES) - software_error() - -/datum/nanite_program/proc/on_death() - return - -/datum/nanite_program/proc/software_error(type) - if(!type) - type = rand(1,5) - switch(type) - if(1) - host_mob.investigate_log("[src] nanite program was deleted by software error.", INVESTIGATE_NANITES) - qdel(src) //kill switch - return - if(2) //deprogram codes - host_mob.investigate_log("[src] nanite program was de-programmed by software error.", INVESTIGATE_NANITES) - activation_code = 0 - deactivation_code = 0 - kill_code = 0 - trigger_code = 0 - if(3) - host_mob.investigate_log("[src] nanite program was toggled by software error.", INVESTIGATE_NANITES) - toggle() //enable/disable - if(4) - if(can_trigger) - host_mob.investigate_log("[src] nanite program was triggered by software error.", INVESTIGATE_NANITES) - trigger() - if(5) //Program is scrambled and does something different - var/rogue_type = pick(rogue_types) - var/datum/nanite_program/rogue = new rogue_type - host_mob.investigate_log("[src] nanite program was converted into [rogue.name] by software error.", INVESTIGATE_NANITES) - nanites.add_program(null, rogue, src) - qdel(src) - -/datum/nanite_program/proc/receive_signal(code, source) - if(activation_code && code == activation_code && !activated) - activate() - host_mob.investigate_log("'s [name] nanite program was activated by [source] with code [code].", INVESTIGATE_NANITES) - else if(deactivation_code && code == deactivation_code && activated) - deactivate() - host_mob.investigate_log("'s [name] nanite program was deactivated by [source] with code [code].", INVESTIGATE_NANITES) - if(can_trigger && trigger_code && code == trigger_code) - trigger() - host_mob.investigate_log("'s [name] nanite program was triggered by [source] with code [code].", INVESTIGATE_NANITES) - if(kill_code && code == kill_code) - host_mob.investigate_log("'s [name] nanite program was deleted by [source] with code [code].", INVESTIGATE_NANITES) - qdel(src) - -///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once. -/datum/nanite_program/protocol - name = "Nanite Protocol" - var/protocol_class = NONE - -/datum/nanite_program/protocol/check_conditions() - . = ..() - for(var/protocol in nanites.protocols) - var/datum/nanite_program/protocol/P = protocol - if(P != src && P.activated && P.protocol_class == protocol_class) - return FALSE - -/datum/nanite_program/protocol/on_add(datum/component/nanites/_nanites) - ..() - nanites.protocols += src - -/datum/nanite_program/protocol/Destroy() - if(nanites) - nanites.protocols -= src - return ..() diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm deleted file mode 100644 index 5987105a08..0000000000 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ /dev/null @@ -1,111 +0,0 @@ -//Programs that buff the host in generally passive ways. - -/datum/nanite_program/nervous - name = "Nerve Support" - desc = "The nanites act as a secondary nervous system, reducing the amount of time the host is stunned." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/nervous/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.stun_mod *= 0.5 - -/datum/nanite_program/nervous/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.stun_mod *= 2 - -/datum/nanite_program/hardening - name = "Dermal Hardening" - desc = "The nanites form a mesh under the host's skin, protecting them from melee and bullet impacts." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/skin_decay) - -//TODO on_hit effect that turns skin grey for a moment - -/datum/nanite_program/hardening/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.armor.melee += 25 - H.physiology.armor.bullet += 20 - -/datum/nanite_program/hardening/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.armor.melee -= 25 - H.physiology.armor.bullet -= 20 - -/datum/nanite_program/refractive - name = "Dermal Refractive Surface" - desc = "The nanites form a membrane above the host's skin, reducing the effect of laser and energy impacts." - use_rate = 0.50 - rogue_types = list(/datum/nanite_program/skin_decay) - -/datum/nanite_program/refractive/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.armor.laser += 25 - H.physiology.armor.energy += 20 - -/datum/nanite_program/refractive/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.armor.laser -= 25 - H.physiology.armor.energy -= 20 - -/datum/nanite_program/coagulating - name = "Vein Repressurization" - desc = "The nanites re-route circulating blood away from open wounds, dramatically reducing bleeding rate." - use_rate = 0.20 - rogue_types = list(/datum/nanite_program/suffocating) - -/datum/nanite_program/coagulating/enable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.bleed_mod *= 0.5 - -/datum/nanite_program/coagulating/disable_passive_effect() - . = ..() - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - H.physiology.bleed_mod *= 2 - -/datum/nanite_program/conductive - name = "Electric Conduction" - desc = "The nanites act as a grounding rod for electric shocks, protecting the host. Shocks can still damage the nanites themselves." - use_rate = 0.20 - program_flags = NANITE_SHOCK_IMMUNE - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/conductive/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_SHOCKIMMUNE, NANITES_TRAIT) - -/datum/nanite_program/conductive/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_SHOCKIMMUNE, NANITES_TRAIT) - -/datum/nanite_program/mindshield - name = "Mental Barrier" - desc = "The nanites form a protective membrane around the host's brain, shielding them from abnormal influences while they're active." - use_rate = 0.40 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/mindshield/enable_passive_effect() - . = ..() - if(!host_mob.mind.has_antag_datum(/datum/antagonist/rev, TRUE)) //won't work if on a rev, to avoid having implanted revs. - ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, NANITES_TRAIT) - host_mob.sec_hud_set_implants() - -/datum/nanite_program/mindshield/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_MINDSHIELD, NANITES_TRAIT) - host_mob.sec_hud_set_implants() diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm deleted file mode 100644 index 6356026121..0000000000 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ /dev/null @@ -1,230 +0,0 @@ -//Programs that heal the host in some way. - -/datum/nanite_program/regenerative - name = "Accelerated Regeneration" - desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Will not consume nanites while the host is unharmed." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/regenerative/check_conditions() - if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) - return FALSE - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = BODYPART_ORGANIC) - if(!parts.len) - return FALSE - return ..() - -/datum/nanite_program/regenerative/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = BODYPART_ORGANIC) - if(!parts.len) - return - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(0.5/parts.len, 0.5/parts.len, null, BODYPART_ORGANIC)) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-0.5, TRUE) - host_mob.adjustFireLoss(-0.5, TRUE) - -/datum/nanite_program/temperature - name = "Temperature Adjustment" - desc = "The nanites adjust the host's internal temperature to an ideal level. Will not consume nanites while the host is at a normal body temperature." - use_rate = 3.5 - rogue_types = list(/datum/nanite_program/skin_decay) - -/datum/nanite_program/temperature/check_conditions() - if(host_mob.bodytemperature > (host_mob.get_body_temp_normal(apply_change=FALSE) - 30) && host_mob.bodytemperature < (host_mob.get_body_temp_normal(apply_change=FALSE) + 30)) - return FALSE - return ..() - -/datum/nanite_program/temperature/active_effect() - var/target_temp = host_mob.get_body_temp_normal(apply_change=FALSE) - if(host_mob.bodytemperature > target_temp) - host_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, target_temp) - else if(host_mob.bodytemperature < (target_temp + 1)) - host_mob.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, target_temp) - -/datum/nanite_program/purging - name = "Blood Purification" - desc = "The nanites purge toxins and chemicals from the host's bloodstream. Consumes nanites even if it has no effect." - use_rate = 1 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/purging/check_conditions() - . = ..() - if(!. || !host_mob.reagents) - return FALSE // No trying to purge simple mobs - -/datum/nanite_program/purging/active_effect() - host_mob.adjustToxLoss(-1) - for(var/datum/reagent/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.type,1) - -/datum/nanite_program/brain_heal - name = "Neural Regeneration" - desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas. Will not consume nanites while it would not have an effect." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/brain_heal/check_conditions() - if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) - return ..() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - if ( C.has_trauma_type( resilience = TRAUMA_RESILIENCE_BASIC) ) - return ..() - return FALSE - -/datum/nanite_program/brain_heal/active_effect() - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) - if(iscarbon(host_mob) && prob(10)) - var/mob/living/carbon/C = host_mob - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - -/datum/nanite_program/blood_restoring - name = "Blood Regeneration" - desc = "The nanites stimulate and boost blood cell production in the host. Will not consume nanites while the host has a safe blood level." - use_rate = 1 - rogue_types = list(/datum/nanite_program/suffocating) - -/datum/nanite_program/blood_restoring/check_conditions() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - if(C.blood_volume >= BLOOD_VOLUME_SAFE) - return FALSE - else - return FALSE - return ..() - -/datum/nanite_program/blood_restoring/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.blood_volume += 2 - -/datum/nanite_program/repairing - name = "Mechanical Repair" - desc = "The nanites fix damage in the host's mechanical limbs. Will not consume nanites while the host's mechanical limbs are undamaged, or while the host has no mechanical limbs." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/repairing/check_conditions() - if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) - return FALSE - - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, status = BODYPART_ROBOTIC) - if(!parts.len) - return FALSE - else - if(!(host_mob.mob_biotypes & MOB_ROBOTIC)) - return FALSE - return ..() - -/datum/nanite_program/repairing/active_effect(mob/living/M) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, status = BODYPART_ROBOTIC) - if(!parts.len) - return - var/update = FALSE - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(1/parts.len, 1/parts.len, null, BODYPART_ROBOTIC)) //much faster than organic healing - update = TRUE - if(update) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-1, TRUE) - host_mob.adjustFireLoss(-1, TRUE) - -/datum/nanite_program/purging_advanced - name = "Selective Blood Purification" - desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \ - The added processing power required to analyze the chemicals severely increases the nanite consumption rate. Consumes nanites even if it has no effect." - use_rate = 2 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/purging_advanced/check_conditions() - . = ..() - if(!. || !host_mob.reagents) - return FALSE - -/datum/nanite_program/purging_advanced/active_effect() - host_mob.adjustToxLoss(-1) - for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list) - host_mob.reagents.remove_reagent(R.type,1) - -/datum/nanite_program/regenerative_advanced - name = "Bio-Reconstruction" - desc = "The nanites manually repair and replace organic cells, acting much faster than normal regeneration. \ - However, this program cannot detect the difference between harmed and unharmed, causing it to consume nanites even if it has no effect." - use_rate = 5.5 - rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) - -/datum/nanite_program/regenerative_advanced/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = BODYPART_ORGANIC) - if(!parts.len) - return - var/update = FALSE - for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(2/parts.len, 2/parts.len, null, BODYPART_ORGANIC)) - update = TRUE - if(update) - host_mob.update_damage_overlays() - else - host_mob.adjustBruteLoss(-2, TRUE) - host_mob.adjustFireLoss(-2, TRUE) - -/datum/nanite_program/brain_heal_advanced - name = "Neural Reimaging" - desc = "The nanites are able to backup and restore the host's neural connections, potentially replacing entire chunks of missing or damaged brain matter. Consumes nanites even if it has no effect." - use_rate = 3 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/brain_heal_advanced/active_effect() - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2) - if(iscarbon(host_mob) && prob(10)) - var/mob/living/carbon/C = host_mob - C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_LOBOTOMY) - -/datum/nanite_program/defib - name = "Defibrillation" - desc = "The nanites shock the host's heart when triggered, bringing them back to life if the body can sustain it." - can_trigger = TRUE - trigger_cost = 25 - trigger_cooldown = 120 - rogue_types = list(/datum/nanite_program/shocking) - -/datum/nanite_program/defib/on_trigger(comm_message) - host_mob.notify_ghost_cloning("Your heart is being defibrillated by nanites. Re-enter your corpse if you want to be revived!") - addtimer(CALLBACK(src, .proc/zap), 50) - -/datum/nanite_program/defib/proc/check_revivable() - if(!iscarbon(host_mob)) //nonstandard biology - return FALSE - var/mob/living/carbon/C = host_mob - if(C.get_ghost()) - return FALSE - return C.can_defib() == DEFIB_POSSIBLE - -/datum/nanite_program/defib/proc/zap() - var/mob/living/carbon/C = host_mob - playsound(C, 'sound/machines/defib_charge.ogg', 50, FALSE) - sleep(30) - playsound(C, 'sound/machines/defib_zap.ogg', 50, FALSE) - if(check_revivable()) - playsound(C, 'sound/machines/defib_success.ogg', 50, FALSE) - C.set_heartattack(FALSE) - C.revive(full_heal = FALSE, admin_revive = FALSE) - C.emote("gasp") - C.Jitter(100) - SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) - log_game("[C] has been successfully defibrillated by nanites.") - else - playsound(C, 'sound/machines/defib_failed.ogg', 50, FALSE) - diff --git a/code/modules/research/nanites/nanite_programs/protocols.dm b/code/modules/research/nanites/nanite_programs/protocols.dm deleted file mode 100644 index c0198f67a7..0000000000 --- a/code/modules/research/nanites/nanite_programs/protocols.dm +++ /dev/null @@ -1,277 +0,0 @@ -//Replication Protocols -/datum/nanite_program/protocol/kickstart - name = "Kickstart Protocol" - desc = "Replication Protocol: the nanites focus on early growth, heavily boosting replication rate for a few minutes after the initial implantation, \ - resulting in an additional 420 nanite volume being produced during the first two minutes." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost_duration = 1200 - -/datum/nanite_program/protocol/kickstart/check_conditions() - if(!(world.time < nanites.start_time + boost_duration)) - return FALSE - return ..() - -/datum/nanite_program/protocol/kickstart/active_effect() - nanites.adjust_nanites(null, 3.5) - -/datum/nanite_program/protocol/factory - name = "Factory Protocol" - desc = "Replication Protocol: the nanites build a factory matrix within the host, gradually increasing replication speed over time, \ - granting a maximum of 2 additional nanite production after roughly 17 minutes. \ - The factory decays if the protocol is not active, or if the nanites are disrupted by shocks or EMPs." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/factory_efficiency = 0 - var/max_efficiency = 1000 //Goes up to 2 bonus regen per tick after 16 minutes and 40 seconds - -/datum/nanite_program/protocol/factory/on_process() - if(!activated || !check_conditions()) - factory_efficiency = max(0, factory_efficiency - 5) - ..() - -/datum/nanite_program/protocol/factory/on_emp(severity) - ..() - factory_efficiency = max(0, factory_efficiency - 300) - -/datum/nanite_program/protocol/factory/on_shock(shock_damage) - ..() - factory_efficiency = max(0, factory_efficiency - 200) - -/datum/nanite_program/protocol/factory/on_minor_shock() - ..() - factory_efficiency = max(0, factory_efficiency - 100) - -/datum/nanite_program/protocol/factory/active_effect() - factory_efficiency = min(factory_efficiency + 1, max_efficiency) - nanites.adjust_nanites(null, round(0.002 * factory_efficiency, 0.1)) - -/datum/nanite_program/protocol/pyramid - name = "Pyramid Protocol" - desc = "Replication Protocol: the nanites implement an alternate cooperative replication protocol that is active as long as the nanite saturation level is above 80%, \ - resulting in an additional volume production of 1.2 per second." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost = 1.2 - -/datum/nanite_program/protocol/pyramid/check_conditions() - if((nanites.nanite_volume / nanites.max_nanites) < 0.8) - return FALSE - - return ..() - -/datum/nanite_program/protocol/pyramid/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/offline - name = "Eclipse Protocol" - desc = "Replication Protocol: while the host is asleep or otherwise unconcious, the nanites exploit the reduced interference to replicate more quickly." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_REPLICATION - var/boost = 3 - - -/datum/nanite_program/protocol/offline/check_conditions() - if(nanites.host_mob.stat == CONSCIOUS) - return FALSE - return ..() - - -/datum/nanite_program/protocol/offline/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/hive - name = "Hive Protocol" - desc = "Storage Protocol: the nanites use a more efficient grid arrangment for volume storage, increasing maximum volume to 750." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 250 - -/datum/nanite_program/protocol/hive/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/hive/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/zip - name = "Zip Protocol" - desc = "Storage Protocol: the nanites are disassembled and compacted when unused, increasing the maximum volume to 1000. However, the process slows down their replication rate slightly." - use_rate = 0.2 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 500 - -/datum/nanite_program/protocol/zip/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/zip/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/free_range - name = "Free-range Protocol" - desc = "Storage Protocol: the nanites discard their default storage protocols in favour of a cheaper and more organic approach. Reduces maximum volume to 250, but increases the replication rate by 0.5." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/boost = 0.5 - var/extra_volume = -250 - -/datum/nanite_program/protocol/free_range/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/free_range/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/free_range/active_effect() - nanites.adjust_nanites(null, boost) - -/datum/nanite_program/protocol/unsafe_storage - name = "S.L.O. Protocol" - desc = "Storage Protocol: 'S.L.O.P.', or Storage Level Override Protocol, completely disables the safety measures normally present in nanites, \ - allowing them to reach a whopping maximum volume level of 2000, but at the risk of causing damage to the host at nanite concentrations above the standard limit of 500." - use_rate = 0 - rogue_types = list(/datum/nanite_program/necrotic) - protocol_class = NANITE_PROTOCOL_STORAGE - var/extra_volume = 1500 - var/next_warning = 0 - var/min_warning_cooldown = 120 - var/max_warning_cooldown = 350 - var/volume_warnings_stage_1 = list("You feel a dull pain in your abdomen.", - "You feel a tickling sensation in your abdomen.") - var/volume_warnings_stage_2 = list("You feel a dull pain in your stomach.", - "You feel a dull pain when breathing.", - "Your stomach grumbles.", - "You feel a tickling sensation in your throat.", - "You feel a tickling sensation in your lungs.", - "You feel a tickling sensation in your stomach.", - "Your lungs feel stiff.") - var/volume_warnings_stage_3 = list("You feel a dull pain in your chest.", - "You hear a faint buzzing coming from nowhere.", - "You hear a faint buzzing inside your head.", - "Your head aches.") - var/volume_warnings_stage_4 = list("You feel a dull pain in your ears.", - "You feel a dull pain behind your eyes.", - "You hear a loud, echoing buzz inside your ears.", - "You feel dizzy.", - "You feel an itch coming from behind your eyes.", - "Your eardrums itch.", - "You see tiny grey motes drifting in your field of view.") - var/volume_warnings_stage_5 = list("You feel sick.", - "You feel a dull pain from every part of your body.", - "You feel nauseous.") - var/volume_warnings_stage_6 = list("Your skin itches and burns.", - "Your muscles ache.", - "You feel tired.", - "You feel something skittering under your skin.",) - -/datum/nanite_program/protocol/unsafe_storage/enable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites + extra_volume) - -/datum/nanite_program/protocol/unsafe_storage/disable_passive_effect() - . = ..() - nanites.set_max_volume(null, nanites.max_nanites - extra_volume) - -/datum/nanite_program/protocol/unsafe_storage/active_effect() - if(!iscarbon(host_mob)) - if(prob(10)) - host_mob.adjustBruteLoss(((max(nanites.nanite_volume - 450, 0) / 450) ** 2 ) * 0.5) // 0.5 -> 2 -> 4.5 -> 8 damage per successful tick - return - - var/mob/living/carbon/C = host_mob - - if(nanites.nanite_volume < 500) - return - - var/current_stage = 0 - if(nanites.nanite_volume > 500) //Liver is the main hub of nanite replication and the first to be threatened by excess volume - if(prob(10)) - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) - if(liver) - liver.applyOrganDamage(0.6) - current_stage++ - if(nanites.nanite_volume > 750) //Extra volume spills out in other central organs - if(prob(10)) - var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) - if(stomach) - stomach.applyOrganDamage(0.75) - if(prob(10)) - var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS) - if(lungs) - lungs.applyOrganDamage(0.75) - current_stage++ - if(nanites.nanite_volume > 1000) //Extra volume spills out in more critical organs - if(prob(10)) - var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART) - if(heart) - heart.applyOrganDamage(0.75) - if(prob(10)) - var/obj/item/organ/brain/brain = C.getorganslot(ORGAN_SLOT_BRAIN) - if(brain) - brain.applyOrganDamage(0.75) - current_stage++ - if(nanites.nanite_volume > 1250) //Excess nanites start invading smaller organs for more space, including sensory organs - if(prob(13)) - var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - eyes.applyOrganDamage(0.75) - if(prob(13)) - var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) - if(ears) - ears.applyOrganDamage(0.75) - current_stage++ - if(nanites.nanite_volume > 1500) //Nanites start spilling into the bloodstream, causing toxicity - if(prob(15)) - C.adjustToxLoss(0.5, TRUE, forced = TRUE) //Not healthy for slimepeople either - current_stage++ - if(nanites.nanite_volume > 1750) //Nanites have almost reached their physical limit, and the pressure itself starts causing tissue damage - if(prob(15)) - C.adjustBruteLoss(0.75, TRUE) - current_stage++ - - volume_warning(current_stage) - -/datum/nanite_program/protocol/unsafe_storage/proc/volume_warning(tier) - if(world.time < next_warning) - return - - var/list/main_warnings - var/list/extra_warnings - - switch(tier) - if(1) - main_warnings = volume_warnings_stage_1 - extra_warnings = null - if(2) - main_warnings = volume_warnings_stage_2 - extra_warnings = volume_warnings_stage_1 - if(3) - main_warnings = volume_warnings_stage_3 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 - if(4) - main_warnings = volume_warnings_stage_4 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 - if(5) - main_warnings = volume_warnings_stage_5 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4 - if(6) - main_warnings = volume_warnings_stage_6 - extra_warnings = volume_warnings_stage_1 + volume_warnings_stage_2 + volume_warnings_stage_3 + volume_warnings_stage_4 + volume_warnings_stage_5 - - if(prob(35)) - to_chat(host_mob, span_warning("[pick(main_warnings)]")) - next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown) - else if(islist(extra_warnings)) - to_chat(host_mob, span_warning("[pick(extra_warnings)]")) - next_warning = world.time + rand(min_warning_cooldown, max_warning_cooldown) diff --git a/code/modules/research/nanites/nanite_programs/rogue.dm b/code/modules/research/nanites/nanite_programs/rogue.dm deleted file mode 100644 index c9e5efa941..0000000000 --- a/code/modules/research/nanites/nanite_programs/rogue.dm +++ /dev/null @@ -1,119 +0,0 @@ -//Programs generated through degradation of other complex programs. -//They generally cause minor damage or annoyance. - -//Last stop of the error train -/datum/nanite_program/glitch - name = "Glitch" - desc = "A heavy software corruption that causes nanites to gradually break down." - use_rate = 1.5 - unique = FALSE - rogue_types = list() - -//Generic body-affecting programs will decay into this -/datum/nanite_program/necrotic - name = "Necrosis" - desc = "The nanites attack internal tissues indiscriminately, causing widespread damage." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/necrotic/active_effect() - host_mob.adjustBruteLoss(0.75, TRUE) - if(prob(1)) - to_chat(host_mob, span_warning("You feel a mild ache from somewhere inside you.")) - -//Programs that don't directly interact with the body will decay into this -/datum/nanite_program/toxic - name = "Toxin Buildup" - desc = "The nanites cause a slow but constant toxin buildup inside the host." - use_rate = 0.25 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/toxic/active_effect() - host_mob.adjustToxLoss(0.5) - if(prob(1)) - to_chat(host_mob, span_warning("You feel a bit sick.")) - -//Generic blood-affecting programs will decay into this -/datum/nanite_program/suffocating - name = "Hypoxemia" - desc = "The nanites prevent the host's blood from absorbing oxygen efficiently." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/suffocating/active_effect() - host_mob.adjustOxyLoss(3, 0) - if(prob(1)) - to_chat(host_mob, span_warning("You feel short of breath.")) - -//Generic brain-affecting programs will decay into this -/datum/nanite_program/brain_decay - name = "Neuro-Necrosis" - desc = "The nanites seek and attack brain cells, causing extensive neural damage to the host." - use_rate = 0.75 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/brain_decay/active_effect() - if(prob(4)) - host_mob.hallucination = min(15, host_mob.hallucination) - host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1) - -//Generic brain-affecting programs can also decay into this -/datum/nanite_program/brain_misfire - name = "Brain Misfire" - desc = "The nanites interfere with neural pathways, causing minor psychological disturbances." - use_rate = 0.50 - unique = FALSE - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/brain_misfire/active_effect() - if(prob(10)) - switch(rand(1,4)) - if(1) - host_mob.hallucination += 15 - if(2) - host_mob.add_confusion(10) - if(3) - host_mob.drowsyness += 10 - if(4) - host_mob.slurring += 10 - -//Generic skin-affecting programs will decay into this -/datum/nanite_program/skin_decay - name = "Dermalysis" - desc = "The nanites attack skin cells, causing irritation, rashes, and minor damage." - use_rate = 0.25 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/skin_decay/active_effect() - host_mob.adjustBruteLoss(0.25) - if(prob(5)) //itching - var/picked_bodypart = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - var/obj/item/bodypart/bodypart = host_mob.get_bodypart(picked_bodypart) - var/can_scratch = !host_mob.incapacitated() && get_location_accessible(host_mob, picked_bodypart) - - host_mob.visible_message("[can_scratch ? span_warning("[host_mob] scratches [host_mob.p_their()] [bodypart.name].") : ""]",\ - span_warning("Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]")) - -//Generic nerve-affecting programs will decay into this -/datum/nanite_program/nerve_decay - name = "Nerve Decay" - desc = "The nanites attack the host's nerves, causing lack of coordination and short bursts of paralysis." - use_rate = 1 - unique = FALSE - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/nerve_decay/active_effect() - if(prob(5)) - to_chat(host_mob, span_warning("You feel unbalanced!")) - host_mob.add_confusion(10) - else if(prob(4)) - to_chat(host_mob, span_warning("You can't feel your hands!")) - host_mob.drop_all_held_items() - else if(prob(4)) - to_chat(host_mob, span_warning("You can't feel your legs!")) - host_mob.Paralyze(30) diff --git a/code/modules/research/nanites/nanite_programs/sensor.dm b/code/modules/research/nanites/nanite_programs/sensor.dm deleted file mode 100644 index 458c32b00b..0000000000 --- a/code/modules/research/nanites/nanite_programs/sensor.dm +++ /dev/null @@ -1,314 +0,0 @@ -/datum/nanite_program/sensor - name = "Sensor Nanites" - desc = "These nanites send a signal code when a certain condition is met." - unique = FALSE - var/can_rule = FALSE - -/datum/nanite_program/sensor/register_extra_settings() - extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(0, 1, 9999) - -/datum/nanite_program/sensor/proc/check_event() - return FALSE - -/datum/nanite_program/sensor/proc/send_code() - if(activated) - var/datum/nanite_extra_setting/ES = extra_settings[NES_SENT_CODE] - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, ES.value, "a [name] program") - -/datum/nanite_program/sensor/active_effect() - if(check_event()) - send_code() - -/datum/nanite_program/sensor/proc/make_rule(datum/nanite_program/target) - return - -/datum/nanite_program/sensor/repeat - name = "Signal Repeater" - desc = "When triggered, sends another signal to the nanites, optionally with a delay." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 10 - var/spent = FALSE - -/datum/nanite_program/sensor/repeat/register_extra_settings() - . = ..() - extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s") - -/datum/nanite_program/sensor/repeat/on_trigger(comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY] - addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10) - -/datum/nanite_program/sensor/relay_repeat - name = "Relay Signal Repeater" - desc = "When triggered, sends another signal to a relay channel, optionally with a delay." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 10 - var/spent = FALSE - -/datum/nanite_program/sensor/relay_repeat/register_extra_settings() - . = ..() - extra_settings[NES_RELAY_CHANNEL] = new /datum/nanite_extra_setting/number(1, 1, 9999) - extra_settings[NES_DELAY] = new /datum/nanite_extra_setting/number(0, 0, 3600, "s") - -/datum/nanite_program/sensor/relay_repeat/on_trigger(comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DELAY] - addtimer(CALLBACK(src, .proc/send_code), ES.get_value() * 10) - -/datum/nanite_program/sensor/relay_repeat/send_code() - var/datum/nanite_extra_setting/relay = extra_settings[NES_RELAY_CHANNEL] - if(activated && relay.get_value()) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - var/datum/nanite_extra_setting/code = extra_settings[NES_SENT_CODE] - N.relay_signal(code.get_value(), relay.get_value(), "a [name] program") - -/datum/nanite_program/sensor/health - name = "Health Sensor" - desc = "The nanites receive a signal when the host's health is above/below a target percentage." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/health/register_extra_settings() - . = ..() - extra_settings[NES_HEALTH_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%") - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/health/check_event() - var/health_percent = host_mob.health / host_mob.maxHealth * 100 - var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/detected = FALSE - if(direction.get_value()) - if(health_percent >= percent.get_value()) - detected = TRUE - else - if(health_percent < percent.get_value()) - detected = TRUE - - if(detected) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/health/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/health/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/percent = extra_settings[NES_HEALTH_PERCENT] - rule.above = direction.get_value() - rule.threshold = percent.get_value() - return rule - -/datum/nanite_program/sensor/crit - name = "Critical Health Sensor" - desc = "The nanites receive a signal when the host first reaches critical health." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/crit/check_event() - if(HAS_TRAIT(host_mob, TRAIT_CRITICAL_CONDITION)) - if(spent) - return FALSE - spent = TRUE - return TRUE - spent = FALSE - return FALSE - - -/datum/nanite_program/sensor/crit/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/crit/rule = new(target) - return rule - -/datum/nanite_program/sensor/death - name = "Death Sensor" - desc = "The nanites receive a signal when they detect the host is dead." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/death/on_death() - send_code() - -/datum/nanite_program/sensor/death/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/death/rule = new(target) - return rule - -/datum/nanite_program/sensor/nanite_volume - name = "Nanite Volume Sensor" - desc = "The nanites receive a signal when the nanite supply is above/below a certain percentage." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/nanite_volume/register_extra_settings() - . = ..() - extra_settings[NES_NANITE_PERCENT] = new /datum/nanite_extra_setting/number(50, -99, 100, "%") - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/nanite_volume/check_event() - var/nanite_percent = (nanites.nanite_volume - nanites.safety_threshold)/(nanites.max_nanites - nanites.safety_threshold)*100 - var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/detected = FALSE - if(direction.get_value()) - if(nanite_percent >= percent.get_value()) - detected = TRUE - else - if(nanite_percent < percent.get_value()) - detected = TRUE - - if(detected) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/nanite_volume/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/nanites/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/percent = extra_settings[NES_NANITE_PERCENT] - rule.above = direction.get_value() - rule.threshold = percent.get_value() - return rule - -/datum/nanite_program/sensor/damage - name = "Damage Sensor" - desc = "The nanites receive a signal when a host's specific damage type is above/below a target value." - can_rule = TRUE - var/spent = FALSE - -/datum/nanite_program/sensor/damage/register_extra_settings() - . = ..() - extra_settings[NES_DAMAGE_TYPE] = new /datum/nanite_extra_setting/type(BRUTE, list(BRUTE, BURN, TOX, OXY, CLONE)) - extra_settings[NES_DAMAGE] = new /datum/nanite_extra_setting/number(50, 0, 500) - extra_settings[NES_DIRECTION] = new /datum/nanite_extra_setting/boolean(TRUE, "Above", "Below") - -/datum/nanite_program/sensor/damage/check_event() - var/reached_threshold = FALSE - var/datum/nanite_extra_setting/type = extra_settings[NES_DAMAGE_TYPE] - var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE] - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/check_above = direction.get_value() - var/damage_amt = 0 - switch(type.get_value()) - if(BRUTE) - damage_amt = host_mob.getBruteLoss() - if(BURN) - damage_amt = host_mob.getFireLoss() - if(TOX) - damage_amt = host_mob.getToxLoss() - if(OXY) - damage_amt = host_mob.getOxyLoss() - if(CLONE) - damage_amt = host_mob.getCloneLoss() - - if(check_above) - if(damage_amt >= damage.get_value()) - reached_threshold = TRUE - else - if(damage_amt < damage.get_value()) - reached_threshold = TRUE - - if(reached_threshold) - if(!spent) - spent = TRUE - return TRUE - return FALSE - else - spent = FALSE - return FALSE - -/datum/nanite_program/sensor/damage/make_rule(datum/nanite_program/target) - var/datum/nanite_rule/damage/rule = new(target) - var/datum/nanite_extra_setting/direction = extra_settings[NES_DIRECTION] - var/datum/nanite_extra_setting/damage_type = extra_settings[NES_DAMAGE_TYPE] - var/datum/nanite_extra_setting/damage = extra_settings[NES_DAMAGE] - rule.above = direction.get_value() - rule.threshold = damage.get_value() - rule.damage_type = damage_type.get_value() - return rule - -/datum/nanite_program/sensor/voice - name = "Voice Sensor" - desc = "The nanites receive a signal when they detect a specific, preprogrammed word or phrase being said." - -/datum/nanite_program/sensor/voice/register_extra_settings() - . = ..() - extra_settings[NES_SENTENCE] = new /datum/nanite_extra_setting/text("") - extra_settings[NES_INCLUSIVE_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Inclusive", "Exclusive") - -/datum/nanite_program/sensor/voice/on_mob_add() - . = ..() - RegisterSignal(host_mob, COMSIG_MOVABLE_HEAR, .proc/on_hear) - -/datum/nanite_program/sensor/voice/on_mob_remove() - UnregisterSignal(host_mob, COMSIG_MOVABLE_HEAR) - -/datum/nanite_program/sensor/voice/proc/on_hear(datum/source, list/hearing_args) - SIGNAL_HANDLER - var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE] - var/datum/nanite_extra_setting/inclusive = extra_settings[NES_INCLUSIVE_MODE] - if(!sentence.get_value()) - return - if(inclusive.get_value()) - if(findtext(hearing_args[HEARING_RAW_MESSAGE], sentence.get_value())) - send_code() - else - if(lowertext(hearing_args[HEARING_RAW_MESSAGE]) == lowertext(sentence.get_value())) - send_code() - -/datum/nanite_program/sensor/species - name = "Species Sensor" - desc = "When triggered, the nanites scan the host to determine their species and receive a signal depending on the conditions set in the settings." - can_trigger = TRUE - trigger_cost = 0 - trigger_cooldown = 5 - - var/list/static/allowed_species = list( - "Human" = /datum/species/human, - "Lizard" = /datum/species/lizard, - "Moth" = /datum/species/moth, - "Ethereal" = /datum/species/ethereal, - "Pod" = /datum/species/pod, - "Fly" = /datum/species/fly, - "Felinid" = /datum/species/human/felinid, - "Jelly" = /datum/species/jelly, - ) - -/datum/nanite_program/sensor/species/register_extra_settings() - . = ..() - var/list/species_types = list() - for(var/name in allowed_species) - species_types += name - species_types += "Other" - extra_settings[NES_RACE] = new /datum/nanite_extra_setting/type("Human", species_types) - extra_settings[NES_MODE] = new /datum/nanite_extra_setting/boolean(TRUE, "Is", "Is Not") - -/datum/nanite_program/sensor/species/on_trigger(comm_message) - var/datum/nanite_extra_setting/species_type = extra_settings[NES_RACE] - var/species = allowed_species[species_type.get_value()] - var/species_match = FALSE - - if(species) - if(is_species(host_mob, species)) - species_match = TRUE - else //this is the check for the "Other" option - species_match = TRUE - for(var/name in allowed_species) - var/species_other = allowed_species[name] - if(is_species(host_mob, species_other)) - species_match = FALSE - break - - var/datum/nanite_extra_setting/mode = extra_settings[NES_MODE] - if(mode.get_value()) - if(species_match) - send_code() - else - if(!species_match) - send_code() diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm deleted file mode 100644 index aa8643eafd..0000000000 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ /dev/null @@ -1,309 +0,0 @@ -//Programs that are generally useful for population control and non-harmful suppression. - -/datum/nanite_program/sleepy - name = "Sleep Induction" - desc = "The nanites induce rapid narcolepsy when triggered." - can_trigger = TRUE - trigger_cost = 15 - trigger_cooldown = 1200 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/sleepy/on_trigger(comm_message) - to_chat(host_mob, span_warning("You start to feel very sleepy...")) - host_mob.drowsyness += 20 - addtimer(CALLBACK(host_mob, /mob/living.proc/Sleeping, 200), rand(60,200)) - -/datum/nanite_program/paralyzing - name = "Paralysis" - desc = "The nanites force muscle contraction, effectively paralyzing the host." - use_rate = 3 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/paralyzing/active_effect() - host_mob.Stun(40) - -/datum/nanite_program/paralyzing/enable_passive_effect() - . = ..() - to_chat(host_mob, span_warning("Your muscles seize! You can't move!")) - -/datum/nanite_program/paralyzing/disable_passive_effect() - . = ..() - to_chat(host_mob, span_notice("Your muscles relax, and you can move again.")) - -/datum/nanite_program/shocking - name = "Electric Shock" - desc = "The nanites shock the host when triggered. Destroys a large amount of nanites!" - can_trigger = TRUE - trigger_cost = 10 - trigger_cooldown = 300 - program_flags = NANITE_SHOCK_IMMUNE - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/shocking/on_trigger(comm_message) - host_mob.electrocute_act(rand(5,10), "shock nanites", 1, SHOCK_NOGLOVES) - -/datum/nanite_program/stun - name = "Neural Shock" - desc = "The nanites pulse the host's nerves when triggered, inapacitating them for a short period." - can_trigger = TRUE - trigger_cost = 4 - trigger_cooldown = 300 - rogue_types = list(/datum/nanite_program/shocking, /datum/nanite_program/nerve_decay) - -/datum/nanite_program/stun/on_trigger(comm_message) - playsound(host_mob, "sparks", 75, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE) - host_mob.Paralyze(80) - -/datum/nanite_program/pacifying - name = "Pacification" - desc = "The nanites suppress the aggression center of the brain, preventing the host from causing direct harm to others." - use_rate = 1 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/pacifying/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_PACIFISM, NANITES_TRAIT) - -/datum/nanite_program/pacifying/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_PACIFISM, NANITES_TRAIT) - -/datum/nanite_program/blinding - name = "Blindness" - desc = "The nanites suppress the host's ocular nerves, blinding them while they're active." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/blinding/enable_passive_effect() - . = ..() - host_mob.become_blind(NANITES_TRAIT) - -/datum/nanite_program/blinding/disable_passive_effect() - . = ..() - host_mob.cure_blind(NANITES_TRAIT) - -/datum/nanite_program/mute - name = "Mute" - desc = "The nanites suppress the host's speech, making them mute while they're active." - use_rate = 0.75 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/mute/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_MUTE, NANITES_TRAIT) - -/datum/nanite_program/mute/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_MUTE, NANITES_TRAIT) - -/datum/nanite_program/fake_death - name = "Death Simulation" - desc = "The nanites induce a death-like coma into the host, able to fool most medical scans." - use_rate = 3.5 - rogue_types = list(/datum/nanite_program/nerve_decay, /datum/nanite_program/necrotic, /datum/nanite_program/brain_decay) - -/datum/nanite_program/fake_death/enable_passive_effect() - . = ..() - host_mob.emote("deathgasp") - host_mob.fakedeath("nanites") - -/datum/nanite_program/fake_death/disable_passive_effect() - . = ..() - host_mob.cure_fakedeath("nanites") - -//Can receive transmissions from a nanite communication remote for customized messages -/datum/nanite_program/comm - can_trigger = TRUE - var/comm_message = "" - -/datum/nanite_program/comm/register_extra_settings() - extra_settings[NES_COMM_CODE] = new /datum/nanite_extra_setting/number(0, 0, 9999) - -/datum/nanite_program/comm/proc/receive_comm_signal(signal_comm_code, comm_message, comm_source) - var/datum/nanite_extra_setting/comm_code = extra_settings[NES_COMM_CODE] - if(!activated || !comm_code.get_value()) - return - if(signal_comm_code == comm_code.get_value()) - host_mob.investigate_log("'s [name] nanite program was messaged by [comm_source] with comm code [signal_comm_code] and message '[comm_message]'.", INVESTIGATE_NANITES) - trigger(FALSE, comm_message) - -/datum/nanite_program/comm/speech - name = "Forced Speech" - desc = "The nanites force the host to say a pre-programmed sentence when triggered." - unique = FALSE - trigger_cost = 3 - trigger_cooldown = 20 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - var/static/list/blacklist = list( - "*surrender", - "*collapse", - "*faint", - ) - -/datum/nanite_program/comm/speech/register_extra_settings() - . = ..() - extra_settings[NES_SENTENCE] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/speech/on_trigger(comm_message) - var/sent_message = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/sentence = extra_settings[NES_SENTENCE] - sent_message = sentence.get_value() - if(sent_message in blacklist) - return - if(host_mob.stat == DEAD) - return - to_chat(host_mob, span_warning("You feel compelled to speak...")) - host_mob.say(sent_message, forced = "nanite speech") - -/datum/nanite_program/comm/voice - name = "Skull Echo" - desc = "The nanites echo a synthesized message inside the host's skull." - unique = FALSE - trigger_cost = 1 - trigger_cooldown = 20 - rogue_types = list(/datum/nanite_program/brain_misfire, /datum/nanite_program/brain_decay) - -/datum/nanite_program/comm/voice/register_extra_settings() - . = ..() - extra_settings[NES_MESSAGE] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/voice/on_trigger(comm_message) - var/sent_message = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/message_setting = extra_settings[NES_MESSAGE] - sent_message = message_setting.get_value() - if(host_mob.stat == DEAD) - return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[span_robot("[html_encode(sent_message)]")]\"") - -/datum/nanite_program/comm/hallucination - name = "Hallucination" - desc = "The nanites make the host hallucinate something when triggered." - trigger_cost = 4 - trigger_cooldown = 80 - unique = FALSE - rogue_types = list(/datum/nanite_program/brain_misfire) - -/datum/nanite_program/comm/hallucination/register_extra_settings() - . = ..() - var/list/options = list( - "Message", - "Battle", - "Sound", - "Weird Sound", - "Station Message", - "Health", - "Alert", - "Fire", - "Shock", - "Plasma Flood", - "Random" - ) - extra_settings[NES_HALLUCINATION_TYPE] = new /datum/nanite_extra_setting/type("Message", options) - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/text("") - -/datum/nanite_program/comm/hallucination/on_trigger(comm_message) - var/datum/nanite_extra_setting/hal_setting = extra_settings[NES_HALLUCINATION_TYPE] - var/hal_type = hal_setting.get_value() - var/datum/nanite_extra_setting/hal_detail_setting = extra_settings[NES_HALLUCINATION_DETAIL] - var/hal_details = hal_detail_setting.get_value() - if(comm_message && (hal_type != "Message")) //Triggered via comm remote, but not set to a message hallucination - return - var/sent_message = comm_message //Comm remotes can send custom hallucination messages for the chat hallucination - if(!sent_message) - sent_message = hal_details - - if(!iscarbon(host_mob)) - return - var/mob/living/carbon/C = host_mob - if(hal_details == "random") - hal_details = null - if(hal_type == "Random") - C.hallucination += 15 - else - switch(hal_type) - if("Message") - new /datum/hallucination/chat(C, TRUE, null, sent_message) - if("Battle") - new /datum/hallucination/battle(C, TRUE, hal_details) - if("Sound") - new /datum/hallucination/sounds(C, TRUE, hal_details) - if("Weird Sound") - new /datum/hallucination/weird_sounds(C, TRUE, hal_details) - if("Station Message") - new /datum/hallucination/stationmessage(C, TRUE, hal_details) - if("Health") - switch(hal_details) - if("critical") - hal_details = SCREWYHUD_CRIT - if("dead") - hal_details = SCREWYHUD_DEAD - if("healthy") - hal_details = SCREWYHUD_HEALTHY - new /datum/hallucination/hudscrew(C, TRUE, hal_details) - if("Alert") - new /datum/hallucination/fake_alert(C, TRUE, hal_details) - if("Fire") - new /datum/hallucination/fire(C, TRUE) - if("Shock") - new /datum/hallucination/shock(C, TRUE) - if("Plasma Flood") - new /datum/hallucination/fake_flood(C, TRUE) - -/datum/nanite_program/comm/hallucination/set_extra_setting(setting, value) - . = ..() - if(setting == NES_HALLUCINATION_TYPE) - switch(value) - if("Message") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/text("") - if("Battle") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","laser","disabler","esword","gun","stunprod","harmbaton","bomb")) - if("Sound") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","airlock","airlock pry","console","explosion","far explosion","mech","glass","alarm","beepsky","mech","wall decon","door hack")) - if("Weird Sound") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","phone","hallelujah","highlander","laughter","hyperspace","game over","creepy","tesla")) - if("Station Message") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","ratvar","shuttle dock","blob alert","malf ai","meteors","supermatter")) - if("Health") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","critical","dead","healthy")) - if("Alert") - extra_settings[NES_HALLUCINATION_DETAIL] = new /datum/nanite_extra_setting/type("random", list("random","not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","gravity","fire","locked","hacked","temphot","tempcold","pressure")) - else - extra_settings.Remove(NES_HALLUCINATION_DETAIL) - -/datum/nanite_program/good_mood - name = "Happiness Enhancer" - desc = "The nanites synthesize serotonin inside the host's brain, creating an artificial sense of happiness." - use_rate = 0.1 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/good_mood/register_extra_settings() - . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS ENHANCEMENT") - -/datum/nanite_program/good_mood/enable_passive_effect() - . = ..() - SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_happy", /datum/mood_event/nanite_happiness, get_extra_setting_value(NES_MOOD_MESSAGE)) - -/datum/nanite_program/good_mood/disable_passive_effect() - . = ..() - SEND_SIGNAL(host_mob, COMSIG_CLEAR_MOOD_EVENT, "nanite_happy") - -/datum/nanite_program/bad_mood - name = "Happiness Suppressor" - desc = "The nanites suppress the production of serotonin inside the host's brain, creating an artificial state of depression." - use_rate = 0.1 - rogue_types = list(/datum/nanite_program/brain_decay) - -/datum/nanite_program/bad_mood/register_extra_settings() - . = ..() - extra_settings[NES_MOOD_MESSAGE] = new /datum/nanite_extra_setting/text("HAPPINESS SUPPRESSION") - -/datum/nanite_program/bad_mood/enable_passive_effect() - . = ..() - SEND_SIGNAL(host_mob, COMSIG_ADD_MOOD_EVENT, "nanite_sadness", /datum/mood_event/nanite_sadness, get_extra_setting_value(NES_MOOD_MESSAGE)) - -/datum/nanite_program/bad_mood/disable_passive_effect() - . = ..() - SEND_SIGNAL(host_mob, COMSIG_CLEAR_MOOD_EVENT, "nanite_sadness") diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm deleted file mode 100644 index 19ef4c9cce..0000000000 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ /dev/null @@ -1,311 +0,0 @@ -//Programs that interact with other programs or nanites directly, or have other special purposes. -/datum/nanite_program/viral - name = "Viral Replica" - desc = "The nanites constantly send encrypted signals attempting to forcefully copy their own programming into other nanite clusters, also overriding or disabling their cloud sync." - use_rate = 0.5 - rogue_types = list(/datum/nanite_program/toxic) - var/pulse_cooldown = 0 - -/datum/nanite_program/viral/register_extra_settings() - extra_settings[NES_PROGRAM_OVERWRITE] = new /datum/nanite_extra_setting/type("Add To", list("Overwrite", "Add To", "Ignore")) - extra_settings[NES_CLOUD_OVERWRITE] = new /datum/nanite_extra_setting/number(0, 0, 100) - -/datum/nanite_program/viral/active_effect() - if(world.time < pulse_cooldown) - return - var/datum/nanite_extra_setting/program = extra_settings[NES_PROGRAM_OVERWRITE] - var/datum/nanite_extra_setting/cloud = extra_settings[NES_CLOUD_OVERWRITE] - for(var/mob/M in orange(host_mob, 5)) - if(SEND_SIGNAL(M, COMSIG_NANITE_IS_STEALTHY)) - continue - switch(program.get_value()) - if("Overwrite") - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, TRUE) - if("Add To") - SEND_SIGNAL(M, COMSIG_NANITE_SYNC, nanites, FALSE) - SEND_SIGNAL(M, COMSIG_NANITE_SET_CLOUD, cloud.get_value()) - pulse_cooldown = world.time + 75 - -/datum/nanite_program/monitoring - name = "Monitoring" - desc = "The nanites monitor the host's vitals and location, sending them to the suit sensor network." - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/monitoring/enable_passive_effect() - . = ..() - ADD_TRAIT(host_mob, TRAIT_NANITE_MONITORING, NANITES_TRAIT) //Shows up in diagnostic and medical HUDs as a small blinking icon - if(ishuman(host_mob)) - GLOB.nanite_sensors_list |= host_mob - host_mob.hud_set_nanite_indicator() - -/datum/nanite_program/monitoring/disable_passive_effect() - . = ..() - REMOVE_TRAIT(host_mob, TRAIT_NANITE_MONITORING, "nanites") - if(ishuman(host_mob)) - GLOB.nanite_sensors_list -= host_mob - - host_mob.hud_set_nanite_indicator() - -/datum/nanite_program/self_scan - name = "Host Scan" - desc = "The nanites display a detailed readout of a body scan to the host." - unique = FALSE - can_trigger = TRUE - trigger_cost = 3 - trigger_cooldown = 50 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/self_scan/register_extra_settings() - extra_settings[NES_SCAN_TYPE] = new /datum/nanite_extra_setting/type("Medical", list("Medical", "Chemical", "Wound", "Nanite")) - -/datum/nanite_program/self_scan/on_trigger(comm_message) - if(host_mob.stat == DEAD) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_SCAN_TYPE] - switch(NS.get_value()) - if("Medical") - healthscan(host_mob, host_mob) - if("Chemical") - chemscan(host_mob, host_mob) - if("Wound") - woundscan(host_mob, host_mob) - if("Nanite") - SEND_SIGNAL(host_mob, COMSIG_NANITE_SCAN, host_mob, TRUE) - -/datum/nanite_program/stealth - name = "Stealth" - desc = "The nanites mask their activity from superficial scans, becoming undetectable by HUDs and non-specialized scanners." - rogue_types = list(/datum/nanite_program/toxic) - use_rate = 0.2 - -/datum/nanite_program/stealth/enable_passive_effect() - . = ..() - nanites.stealth = TRUE - -/datum/nanite_program/stealth/disable_passive_effect() - . = ..() - nanites.stealth = FALSE - -/datum/nanite_program/nanite_debugging - name = "Nanite Debugging" - desc = "Enables various high-cost diagnostics in the nanites, making them able to communicate their program list to portable scanners. \ - Doing so uses some power, slightly decreasing their replication speed." - rogue_types = list(/datum/nanite_program/toxic) - use_rate = 0.1 - -/datum/nanite_program/nanite_debugging/enable_passive_effect() - . = ..() - nanites.diagnostics = TRUE - -/datum/nanite_program/nanite_debugging/disable_passive_effect() - . = ..() - nanites.diagnostics = FALSE - -/datum/nanite_program/relay - name = "Relay" - desc = "The nanites receive and relay long-range nanite signals." - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/relay/register_extra_settings() - extra_settings[NES_RELAY_CHANNEL] = new /datum/nanite_extra_setting/number(1, 1, 9999) - -/datum/nanite_program/relay/enable_passive_effect() - . = ..() - SSnanites.nanite_relays |= src - -/datum/nanite_program/relay/disable_passive_effect() - . = ..() - SSnanites.nanite_relays -= src - -/datum/nanite_program/relay/proc/relay_signal(code, relay_code, source) - if(!activated) - return - if(!host_mob) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_RELAY_CHANNEL] - if(relay_code != NS.get_value()) - return - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, code, source) - -/datum/nanite_program/relay/proc/relay_comm_signal(comm_code, relay_code, comm_message) - if(!activated) - return - if(!host_mob) - return - var/datum/nanite_extra_setting/NS = extra_settings[NES_RELAY_CHANNEL] - if(relay_code != NS.get_value()) - return - SEND_SIGNAL(host_mob, COMSIG_NANITE_COMM_SIGNAL, comm_code, comm_message) - -/datum/nanite_program/metabolic_synthesis - name = "Metabolic Synthesis" - desc = "The nanites use the metabolic cycle of the host to speed up their replication rate, using their extra nutrition as fuel." - use_rate = -0.5 //generates nanites - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/metabolic_synthesis/check_conditions() - if(!iscarbon(host_mob)) - return FALSE - var/mob/living/carbon/C = host_mob - if(C.nutrition <= NUTRITION_LEVEL_WELL_FED) - return FALSE - return ..() - -/datum/nanite_program/metabolic_synthesis/active_effect() - host_mob.adjust_nutrition(-0.5) - -/datum/nanite_program/access - name = "Subdermal ID" - desc = "The nanites store the host's ID access rights in a subdermal magnetic strip. Updates when triggered, copying the host's current access." - can_trigger = TRUE - trigger_cost = 3 - trigger_cooldown = 30 - rogue_types = list(/datum/nanite_program/skin_decay) - var/access = list() - -//Syncs the nanites with the cumulative current mob's access level. Can potentially wipe existing access. -/datum/nanite_program/access/on_trigger(comm_message) - var/list/potential_items = list() - - potential_items += host_mob.get_active_held_item() - potential_items += host_mob.get_inactive_held_item() - potential_items += host_mob.pulling - - if(ishuman(host_mob)) - var/mob/living/carbon/human/H = host_mob - potential_items += H.wear_id - else if(isanimal(host_mob)) - var/mob/living/simple_animal/A = host_mob - potential_items += A.access_card - - var/list/new_access = list() - for(var/obj/item/I in potential_items) - new_access += I.GetAccess() - - access = new_access - -/datum/nanite_program/spreading - name = "Infective Exo-Locomotion" - desc = "The nanites gain the ability to survive for brief periods outside of the human body, as well as the ability to start new colonies without an integration process; \ - resulting in an extremely infective strain of nanites." - use_rate = 1.50 - rogue_types = list(/datum/nanite_program/aggressive_replication, /datum/nanite_program/necrotic) - var/spread_cooldown = 0 - -/datum/nanite_program/spreading/active_effect() - if(world.time < spread_cooldown) - return - spread_cooldown = world.time + 50 - var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(5, host_mob)) - if(!prob(25)) - continue - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD))) - continue - target_hosts += L - if(!target_hosts.len) - return - var/mob/living/infectee = pick(target_hosts) - if(prob(100 - (infectee.get_permeability_protection() * 100))) - //this will potentially take over existing nanites! - infectee.AddComponent(/datum/component/nanites, 10) - SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) - SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id) - infectee.investigate_log("was infected by spreading nanites with cloud ID [nanites.cloud_id] by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) - -/datum/nanite_program/nanite_sting - name = "Nanite Sting" - desc = "When triggered, projects a nearly invisible spike of nanites that attempts to infect a nearby non-host with a copy of the host's nanites cluster." - can_trigger = TRUE - trigger_cost = 5 - trigger_cooldown = 100 - rogue_types = list(/datum/nanite_program/glitch, /datum/nanite_program/toxic) - -/datum/nanite_program/nanite_sting/on_trigger(comm_message) - var/list/mob/living/target_hosts = list() - for(var/mob/living/L in oview(1, host_mob)) - if(!(L.mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)) || SEND_SIGNAL(L, COMSIG_HAS_NANITES) || !L.Adjacent(host_mob)) - continue - target_hosts += L - if(!target_hosts.len) - consume_nanites(-5) - return - var/mob/living/infectee = pick(target_hosts) - if(prob(100 - (infectee.get_permeability_protection() * 100))) - //unlike with Infective Exo-Locomotion, this can't take over existing nanites, because Nanite Sting only targets non-hosts. - infectee.AddComponent(/datum/component/nanites, 5) - SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites) - SEND_SIGNAL(infectee, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id) - infectee.investigate_log("was infected by a nanite cluster with cloud ID [nanites.cloud_id] by [key_name(host_mob)] at [AREACOORD(infectee)].", INVESTIGATE_NANITES) - to_chat(infectee, span_warning("You feel a tiny prick.")) - -/datum/nanite_program/mitosis - name = "Mitosis" - desc = "The nanites gain the ability to self-replicate, using bluespace to power the process. Becomes more effective the more nanites are already in the host; \ - For every 50 nanite volume in the host, the production rate is increased by 0.5. The replication has also a chance to corrupt the nanite programming \ - due to copy faults - constant cloud sync is highly recommended." - use_rate = 0 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/mitosis/active_effect() - var/rep_rate = round(nanites.nanite_volume / 50, 1) //0.5 per 50 nanite volume - rep_rate *= 0.5 - nanites.adjust_nanites(null, rep_rate) - if(prob(rep_rate)) - var/datum/nanite_program/fault = pick(nanites.programs) - if(fault == src) - return - fault.software_error() - host_mob.investigate_log("[fault] nanite program received a software error due to Mitosis program.", INVESTIGATE_NANITES) - -/datum/nanite_program/dermal_button - name = "Dermal Button" - desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." - unique = FALSE - var/datum/action/innate/nanite_button/button - -/datum/nanite_program/dermal_button/register_extra_settings() - extra_settings[NES_SENT_CODE] = new /datum/nanite_extra_setting/number(1, 1, 9999) - extra_settings[NES_BUTTON_NAME] = new /datum/nanite_extra_setting/text("Button") - extra_settings[NES_ICON] = new /datum/nanite_extra_setting/type("power", list("blank","one","two","three","four","five","plus","minus","exclamation","question","cross","info","heart","skull","brain","brain_damage","injection","blood","shield","reaction","network","power","radioactive","electricity","magnetism","scan","repair","id","wireless","say","sleep","bomb")) - -/datum/nanite_program/dermal_button/enable_passive_effect() - . = ..() - var/datum/nanite_extra_setting/bn_name = extra_settings[NES_BUTTON_NAME] - var/datum/nanite_extra_setting/bn_icon = extra_settings[NES_ICON] - if(!button) - button = new(src, bn_name.get_value(), bn_icon.get_value()) - button.target = host_mob - button.Grant(host_mob) - -/datum/nanite_program/dermal_button/disable_passive_effect() - . = ..() - if(button) - button.Remove(host_mob) - -/datum/nanite_program/dermal_button/on_mob_remove() - . = ..() - QDEL_NULL(button) - -/datum/nanite_program/dermal_button/proc/press() - if(activated) - host_mob.visible_message(span_notice("[host_mob] presses a button on [host_mob.p_their()] forearm."), - span_notice("You press the nanite button on your forearm."), null, 2) - var/datum/nanite_extra_setting/sent_code = extra_settings[NES_SENT_CODE] - SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, sent_code.get_value(), "a [name] program") - -/datum/action/innate/nanite_button - name = "Button" - icon_icon = 'icons/mob/actions/actions_items.dmi' - check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS - button_icon_state = "nanite_power" - var/datum/nanite_program/dermal_button/program - -/datum/action/innate/nanite_button/New(datum/nanite_program/dermal_button/_program, _name, _icon) - ..() - program = _program - name = _name - button_icon_state = "nanite_[_icon]" - -/datum/action/innate/nanite_button/Activate() - program.press() diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm deleted file mode 100644 index 84b70a65f0..0000000000 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ /dev/null @@ -1,186 +0,0 @@ -//Programs specifically engineered to cause harm to either the user or its surroundings (as opposed to ones that only do it due to broken programming) -//Very dangerous! - -/datum/nanite_program/flesh_eating - name = "Cellular Breakdown" - desc = "The nanites destroy cellular structures in the host's body, causing brute damage." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/flesh_eating/active_effect() - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.take_bodypart_damage(1, 0, 0) - else - host_mob.adjustBruteLoss(1, TRUE) - if(prob(3)) - to_chat(host_mob, span_warning("You feel a stab of pain from somewhere inside you.")) - -/datum/nanite_program/poison - name = "Poisoning" - desc = "The nanites deliver poisonous chemicals to the host's internal organs, causing toxin damage and vomiting." - use_rate = 1.5 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/poison/active_effect() - host_mob.adjustToxLoss(1) - if(prob(2)) - to_chat(host_mob, span_warning("You feel nauseous.")) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - C.vomit(20) - -/datum/nanite_program/memory_leak - name = "Memory Leak" - desc = "This program invades the memory space used by other programs, causing frequent corruptions and errors." - use_rate = 0 - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/memory_leak/active_effect() - if(prob(6)) - var/datum/nanite_program/target = pick(nanites.programs) - if(target == src) - return - target.software_error() - host_mob.investigate_log("[target] nanite program received a software error due to Memory Leak program.", INVESTIGATE_NANITES) - -/datum/nanite_program/aggressive_replication - name = "Aggressive Replication" - desc = "Nanites will consume organic matter to improve their replication rate, damaging the host. The efficiency increases with the volume of nanites, requiring 200 to break even, \ - and scaling linearly for a net positive of 0.1 production rate per 20 nanite volume beyond that." - use_rate = 1 - rogue_types = list(/datum/nanite_program/necrotic) - -/datum/nanite_program/aggressive_replication/active_effect() - var/extra_regen = round(nanites.nanite_volume / 200, 0.1) - nanites.adjust_nanites(null, extra_regen) - host_mob.adjustBruteLoss(extra_regen / 2, TRUE) - -/datum/nanite_program/meltdown - name = "Meltdown" - desc = "Causes an internal meltdown inside the nanites, causing internal burns inside the host as well as rapidly destroying the nanite population.\ - Sets the nanites' safety threshold to 0 when activated." - use_rate = 10 - rogue_types = list(/datum/nanite_program/glitch) - -/datum/nanite_program/meltdown/active_effect() - host_mob.adjustFireLoss(3.5) - -/datum/nanite_program/meltdown/enable_passive_effect() - . = ..() - to_chat(host_mob, span_userdanger("Your blood is burning!")) - nanites.safety_threshold = 0 - -/datum/nanite_program/meltdown/disable_passive_effect() - . = ..() - to_chat(host_mob, span_warning("Your blood cools down, and the pain gradually fades.")) - -/datum/nanite_program/explosive - name = "Chain Detonation" - desc = "Detonates all the nanites inside the host in a chain reaction when triggered." - can_trigger = TRUE - trigger_cost = 25 //plus every idle nanite left afterwards - trigger_cooldown = 100 //Just to avoid double-triggering - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/explosive/on_trigger(comm_message) - host_mob.visible_message(span_warning("[host_mob] starts emitting a high-pitched buzzing, and [host_mob.p_their()] skin begins to glow..."),\ - span_userdanger("You start emitting a high-pitched buzzing, and your skin begins to glow...")) - addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150)) - -/datum/nanite_program/explosive/proc/boom() - dyn_explosion(host_mob, nanites.nanite_volume / 50) - qdel(nanites) - -//TODO make it defuse if triggered again - -/datum/nanite_program/heart_stop - name = "Heart-Stopper" - desc = "Stops the host's heart when triggered; restarts it if triggered again." - can_trigger = TRUE - trigger_cost = 12 - trigger_cooldown = 10 - rogue_types = list(/datum/nanite_program/nerve_decay) - -/datum/nanite_program/heart_stop/on_trigger(comm_message) - if(iscarbon(host_mob)) - var/mob/living/carbon/C = host_mob - var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART) - if(heart) - if(heart.beating) - heart.Stop() - else - heart.Restart() - -/datum/nanite_program/emp - name = "Electromagnetic Resonance" - desc = "The nanites cause an electromagnetic pulse around the host when triggered. Will corrupt other nanite programs!" - can_trigger = TRUE - trigger_cost = 10 - trigger_cooldown = 50 - program_flags = NANITE_EMP_IMMUNE - rogue_types = list(/datum/nanite_program/toxic) - -/datum/nanite_program/emp/on_trigger(comm_message) - empulse(host_mob, 1, 2) - -/datum/nanite_program/pyro - name = "Sub-Dermal Combustion" - desc = "The nanites cause buildup of flammable fluids under the host's skin, then ignites them." - use_rate = 4 - rogue_types = list(/datum/nanite_program/skin_decay, /datum/nanite_program/cryo) - -/datum/nanite_program/pyro/check_conditions() - if(host_mob.fire_stacks >= 10 && host_mob.on_fire) - return FALSE - return ..() - -/datum/nanite_program/pyro/active_effect() - host_mob.adjust_fire_stacks(1) - host_mob.IgniteMob() - -/datum/nanite_program/cryo - name = "Cryogenic Treatment" - desc = "The nanites rapidly sink heat through the host's skin, lowering their temperature." - use_rate = 1 - rogue_types = list(/datum/nanite_program/skin_decay, /datum/nanite_program/pyro) - -/datum/nanite_program/cryo/check_conditions() - if(host_mob.bodytemperature <= 70) - return FALSE - return ..() - -/datum/nanite_program/cryo/active_effect() - host_mob.adjust_bodytemperature(-rand(15,25), 50) - -/datum/nanite_program/comm/mind_control - name = "Mind Control" - desc = "The nanites imprint an absolute directive onto the host's brain for one minute when triggered." - trigger_cost = 30 - trigger_cooldown = 1800 - rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) - -/datum/nanite_program/comm/mind_control/register_extra_settings() - . = ..() - extra_settings[NES_DIRECTIVE] = new /datum/nanite_extra_setting/text("...") - -/datum/nanite_program/comm/mind_control/on_trigger(comm_message) - if(host_mob.stat == DEAD) - return - var/sent_directive = comm_message - if(!comm_message) - var/datum/nanite_extra_setting/ES = extra_settings[NES_DIRECTIVE] - sent_directive = ES.get_value() - brainwash(host_mob, sent_directive) - log_game("A mind control nanite program brainwashed [key_name(host_mob)] with the objective '[sent_directive]'.") - host_mob.log_message("has been brainwashed with the objective '[sent_directive]' triggered by a mind control nanite program.", LOG_ATTACK) - addtimer(CALLBACK(src, .proc/end_brainwashing), 600) - -/datum/nanite_program/comm/mind_control/proc/end_brainwashing() - if(host_mob.mind && host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed)) - host_mob.mind.remove_antag_datum(/datum/antagonist/brainwashed) - log_game("[key_name(host_mob)] is no longer brainwashed by nanites.") - -/datum/nanite_program/comm/mind_control/disable_passive_effect() - . = ..() - end_brainwashing() diff --git a/code/modules/research/nanites/nanite_remote.dm b/code/modules/research/nanites/nanite_remote.dm deleted file mode 100644 index cc7389520f..0000000000 --- a/code/modules/research/nanites/nanite_remote.dm +++ /dev/null @@ -1,236 +0,0 @@ -#define REMOTE_MODE_OFF "Off" -#define REMOTE_MODE_SELF "Local" -#define REMOTE_MODE_TARGET "Targeted" -#define REMOTE_MODE_AOE "Area" -#define REMOTE_MODE_RELAY "Relay" - -/obj/item/nanite_remote - name = "nanite remote control" - desc = "A device that can remotely control active nanites through wireless signals." - w_class = WEIGHT_CLASS_SMALL - req_access = list(ACCESS_ROBOTICS) - icon = 'icons/obj/device.dmi' - icon_state = "nanite_remote" - item_flags = NOBLUDGEON - var/locked = FALSE //Can be locked, so it can be given to users with a set code and mode - var/mode = REMOTE_MODE_OFF - var/list/saved_settings = list() - var/last_id = 0 - var/code = 0 - var/relay_code = 0 - var/current_program_name = "Program" - -/obj/item/nanite_remote/examine(mob/user) - . = ..() - if(locked) - . += span_notice("Alt-click to unlock.") - -/obj/item/nanite_remote/AltClick(mob/user) - . = ..() - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(locked) - if(allowed(user)) - to_chat(user, span_notice("You unlock [src].")) - locked = FALSE - update_appearance() - else - to_chat(user, span_warning("Access denied.")) - -/obj/item/nanite_remote/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - to_chat(user, span_warning("You override [src]'s ID lock.")) - obj_flags |= EMAGGED - if(locked) - locked = FALSE - update_appearance() - -/obj/item/nanite_remote/update_overlays() - . = ..() - if(obj_flags & EMAGGED) - . += "nanite_remote_emagged" - if(locked) - . += "nanite_remote_locked" - -/obj/item/nanite_remote/afterattack(atom/target, mob/user, etc) - switch(mode) - if(REMOTE_MODE_OFF) - return - if(REMOTE_MODE_SELF) - to_chat(user, span_notice("You activate [src], signaling the nanites in your bloodstream.")) - signal_mob(user, code, key_name(user)) - if(REMOTE_MODE_TARGET) - if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, span_notice("You activate [src], signaling the nanites inside [target].")) - signal_mob(target, code, key_name(user)) - if(REMOTE_MODE_AOE) - to_chat(user, span_notice("You activate [src], signaling the nanites inside every host around you.")) - for(var/mob/living/L in view(user, 7)) - signal_mob(L, code, key_name(user)) - if(REMOTE_MODE_RELAY) - to_chat(user, span_notice("You activate [src], signaling all connected relay nanites.")) - signal_relay(code, relay_code, key_name(user)) - -/obj/item/nanite_remote/proc/signal_mob(mob/living/M, code, source) - SEND_SIGNAL(M, COMSIG_NANITE_SIGNAL, code, source) - -/obj/item/nanite_remote/proc/signal_relay(code, relay_code, source) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - N.relay_signal(code, relay_code, source) - -/obj/item/nanite_remote/ui_state(mob/user) - return GLOB.hands_state - -/obj/item/nanite_remote/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NaniteRemote", name) - ui.open() - -/obj/item/nanite_remote/ui_data() - var/list/data = list() - data["code"] = code - data["relay_code"] = relay_code - data["mode"] = mode - data["locked"] = locked - data["saved_settings"] = saved_settings - data["program_name"] = current_program_name - return data - -/obj/item/nanite_remote/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("set_code") - if(locked) - return - var/new_code = text2num(params["code"]) - if(!isnull(new_code)) - new_code = clamp(round(new_code, 1),0,9999) - code = new_code - . = TRUE - if("set_relay_code") - if(locked) - return - var/new_code = text2num(params["code"]) - if(!isnull(new_code)) - new_code = clamp(round(new_code, 1),0,9999) - relay_code = new_code - . = TRUE - if("update_name") - current_program_name = params["name"] - . = TRUE - if("save") - if(locked) - return - var/new_save = list() - new_save["id"] = last_id + 1 - last_id++ - new_save["name"] = current_program_name - new_save["code"] = code - new_save["mode"] = mode - new_save["relay_code"] = relay_code - - saved_settings += list(new_save) - . = TRUE - if("load") - var/code_id = params["save_id"] - var/list/setting - for(var/list/X in saved_settings) - if(X["id"] == text2num(code_id)) - setting = X - break - if(setting) - code = setting["code"] - mode = setting["mode"] - relay_code = setting["relay_code"] - . = TRUE - if("remove_save") - if(locked) - return - var/code_id = params["save_id"] - for(var/list/setting in saved_settings) - if(setting["id"] == text2num(code_id)) - saved_settings -= list(setting) - break - . = TRUE - if("select_mode") - if(locked) - return - mode = params["mode"] - . = TRUE - if("lock") - if(!(obj_flags & EMAGGED)) - locked = TRUE - update_appearance() - . = TRUE - - -/obj/item/nanite_remote/comm - name = "nanite communication remote" - desc = "A device that can send text messages to specific programs." - icon_state = "nanite_comm_remote" - var/comm_message = "" - -/obj/item/nanite_remote/comm/afterattack(atom/target, mob/user, etc) - switch(mode) - if(REMOTE_MODE_OFF) - return - if(REMOTE_MODE_SELF) - to_chat(user, span_notice("You activate [src], signaling the nanites in your bloodstream.")) - signal_mob(user, code, key_name(user)) - if(REMOTE_MODE_TARGET) - if(isliving(target) && (get_dist(target, get_turf(src)) <= 7)) - to_chat(user, span_notice("You activate [src], signaling the nanites inside [target].")) - signal_mob(target, code, key_name(user)) - if(REMOTE_MODE_AOE) - to_chat(user, span_notice("You activate [src], signaling the nanites inside every host around you.")) - for(var/mob/living/L in view(user, 7)) - signal_mob(L, code, key_name(user)) - if(REMOTE_MODE_RELAY) - to_chat(user, span_notice("You activate [src], signaling all connected relay nanites.")) - signal_relay(code, relay_code, key_name(user)) - -/obj/item/nanite_remote/comm/signal_mob(mob/living/M, code, source) - SEND_SIGNAL(M, COMSIG_NANITE_COMM_SIGNAL, code, comm_message, source) - -/obj/item/nanite_remote/comm/signal_relay(code, relay_code, source) - for(var/X in SSnanites.nanite_relays) - var/datum/nanite_program/relay/N = X - N.relay_comm_signal(code, relay_code, comm_message) - -/obj/item/nanite_remote/comm/ui_data() - var/list/data = list() - data["comms"] = TRUE - data["code"] = code - data["relay_code"] = relay_code - data["message"] = comm_message - data["mode"] = mode - data["locked"] = locked - data["saved_settings"] = saved_settings - data["program_name"] = current_program_name - - return data - -/obj/item/nanite_remote/comm/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("set_message") - if(locked) - return - var/new_message = html_encode(params["value"]) - if(!new_message) - return - comm_message = new_message - . = TRUE - -#undef REMOTE_MODE_OFF -#undef REMOTE_MODE_SELF -#undef REMOTE_MODE_TARGET -#undef REMOTE_MODE_AOE -#undef REMOTE_MODE_RELAY diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm deleted file mode 100644 index 02f6d7cc28..0000000000 --- a/code/modules/research/nanites/program_disks.dm +++ /dev/null @@ -1,133 +0,0 @@ -//Names are intentionally all the same - track your nanites, or use a hand labeler -//This also means that you can give flesh melting nanites to your victims if you feel like it - -/obj/item/disk/nanite_program - name = "nanite program disk" - desc = "A disk capable of storing nanite programs. Can be customized using a Nanite Programming Console." - var/program_type - var/datum/nanite_program/program - -/obj/item/disk/nanite_program/Initialize() - . = ..() - if(program_type) - program = new program_type - -/obj/item/disk/nanite_program/aggressive_replication - program_type = /datum/nanite_program/aggressive_replication - -/obj/item/disk/nanite_program/metabolic_synthesis - program_type = /datum/nanite_program/metabolic_synthesis - -/obj/item/disk/nanite_program/viral - program_type = /datum/nanite_program/viral - -/obj/item/disk/nanite_program/meltdown - program_type = /datum/nanite_program/meltdown - -/obj/item/disk/nanite_program/monitoring - program_type = /datum/nanite_program/monitoring - -/obj/item/disk/nanite_program/relay - program_type = /datum/nanite_program/relay - -/obj/item/disk/nanite_program/emp - program_type = /datum/nanite_program/emp - -/obj/item/disk/nanite_program/spreading - program_type = /datum/nanite_program/spreading - -/obj/item/disk/nanite_program/regenerative - program_type = /datum/nanite_program/regenerative - -/obj/item/disk/nanite_program/regenerative_advanced - program_type = /datum/nanite_program/regenerative_advanced - -/obj/item/disk/nanite_program/temperature - program_type = /datum/nanite_program/temperature - -/obj/item/disk/nanite_program/purging - program_type = /datum/nanite_program/purging - -/obj/item/disk/nanite_program/purging_advanced - program_type = /datum/nanite_program/purging_advanced - -/obj/item/disk/nanite_program/brain_heal - program_type = /datum/nanite_program/brain_heal - -/obj/item/disk/nanite_program/brain_heal_advanced - program_type = /datum/nanite_program/brain_heal_advanced - -/obj/item/disk/nanite_program/blood_restoring - program_type = /datum/nanite_program/blood_restoring - -/obj/item/disk/nanite_program/repairing - program_type = /datum/nanite_program/repairing - -/obj/item/disk/nanite_program/nervous - program_type = /datum/nanite_program/nervous - -/obj/item/disk/nanite_program/hardening - program_type = /datum/nanite_program/hardening - -/obj/item/disk/nanite_program/coagulating - program_type = /datum/nanite_program/coagulating - -/obj/item/disk/nanite_program/necrotic - program_type = /datum/nanite_program/necrotic - -/obj/item/disk/nanite_program/brain_decay - program_type = /datum/nanite_program/brain_decay - -/obj/item/disk/nanite_program/pyro - program_type = /datum/nanite_program/pyro - -/obj/item/disk/nanite_program/cryo - program_type = /datum/nanite_program/cryo - -/obj/item/disk/nanite_program/toxic - program_type = /datum/nanite_program/toxic - -/obj/item/disk/nanite_program/suffocating - program_type = /datum/nanite_program/suffocating - -/obj/item/disk/nanite_program/heart_stop - program_type = /datum/nanite_program/heart_stop - -/obj/item/disk/nanite_program/explosive - program_type = /datum/nanite_program/explosive - -/obj/item/disk/nanite_program/shock - program_type = /datum/nanite_program/shocking - -/obj/item/disk/nanite_program/sleepy - program_type = /datum/nanite_program/sleepy - -/obj/item/disk/nanite_program/paralyzing - program_type = /datum/nanite_program/paralyzing - -/obj/item/disk/nanite_program/fake_death - program_type = /datum/nanite_program/fake_death - -/obj/item/disk/nanite_program/pacifying - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/glitch - program_type = /datum/nanite_program/glitch - -/obj/item/disk/nanite_program/brain_misfire - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/skin_decay - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/nerve_decay - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/refractive - program_type = /datum/nanite_program/refractive - -/obj/item/disk/nanite_program/conductive - program_type = /datum/nanite_program/pacifying - -/obj/item/disk/nanite_program/stun - program_type = /datum/nanite_program/stun diff --git a/code/modules/research/nanites/public_chamber.dm b/code/modules/research/nanites/public_chamber.dm deleted file mode 100644 index 6194f4fa33..0000000000 --- a/code/modules/research/nanites/public_chamber.dm +++ /dev/null @@ -1,206 +0,0 @@ -/obj/machinery/public_nanite_chamber - name = "public nanite chamber" - desc = "A device that can rapidly implant cloud-synced nanites without an external operator." - circuit = /obj/item/circuitboard/machine/public_nanite_chamber - icon = 'icons/obj/machines/nanite_chamber.dmi' - icon_state = "nanite_chamber" - base_icon_state = "nanite_chamber" - layer = ABOVE_WINDOW_LAYER - use_power = IDLE_POWER_USE - anchored = TRUE - density = TRUE - obj_flags = NO_BUILD // Becomes undense when the door is open - idle_power_usage = 50 - active_power_usage = 300 - - var/cloud_id = 1 - var/locked = FALSE - var/breakout_time = 1200 - var/busy = FALSE - var/busy_icon_state - var/message_cooldown = 0 - -/obj/machinery/public_nanite_chamber/Initialize() - . = ..() - occupant_typecache = GLOB.typecache_living - -/obj/machinery/public_nanite_chamber/RefreshParts() - var/obj/item/circuitboard/machine/public_nanite_chamber/board = circuit - if(board) - cloud_id = board.cloud_id - -/obj/machinery/public_nanite_chamber/proc/set_busy(status, working_icon) - busy = status - busy_icon_state = working_icon - update_appearance() - -/obj/machinery/public_nanite_chamber/proc/inject_nanites(mob/living/attacker) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - //TODO OMINOUS MACHINE SOUNDS - set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"),60) - addtimer(CALLBACK(src, .proc/complete_injection, locked_state, attacker),80) - -/obj/machinery/public_nanite_chamber/proc/complete_injection(locked_state, mob/living/attacker) - //TODO MACHINE DING - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - if(attacker) - occupant.investigate_log("was injected with nanites with cloud ID [cloud_id] by [key_name(attacker)] using [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - log_combat(attacker, occupant, "injected", null, "with nanites via [src]") - occupant.AddComponent(/datum/component/nanites, 75, cloud_id) - -/obj/machinery/public_nanite_chamber/proc/change_cloud(mob/living/attacker) - if(machine_stat & (NOPOWER|BROKEN)) - return - if((machine_stat & MAINT) || panel_open) - return - if(!occupant || busy) - return - - var/locked_state = locked - locked = TRUE - - set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"),20) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"),40) - addtimer(CALLBACK(src, .proc/complete_cloud_change, locked_state, attacker),60) - -/obj/machinery/public_nanite_chamber/proc/complete_cloud_change(locked_state, mob/living/attacker) - locked = locked_state - set_busy(FALSE) - if(!occupant) - return - if(attacker) - occupant.investigate_log("had their nanite cloud ID changed into [cloud_id] by [key_name(attacker)] using [src] at [AREACOORD(src)].", INVESTIGATE_NANITES) - SEND_SIGNAL(occupant, COMSIG_NANITE_SET_CLOUD, cloud_id) - -/obj/machinery/public_nanite_chamber/update_icon_state() - //running and someone in there - if(occupant) - icon_state = busy ? busy_icon_state : "[base_icon_state]_occupied" - return ..() - //running - icon_state = "[base_icon_state][state_open ? "_open" : null]" - return ..() - -/obj/machinery/public_nanite_chamber/update_overlays() - . = ..() - if((machine_stat & MAINT) || panel_open) - . += "maint" - return - if(machine_stat & (NOPOWER|BROKEN)) - return - - if(busy || locked) - . += "red" - if(locked) - . += "bolted" - return - . += "green" - -/obj/machinery/public_nanite_chamber/proc/toggle_open(mob/user) - if(panel_open) - to_chat(user, span_notice("Close the maintenance panel first.")) - return - - if(state_open) - close_machine(null, user) - return - - else if(locked) - to_chat(user, span_notice("The bolts are locked down, securing the door shut.")) - return - - open_machine() - -/obj/machinery/public_nanite_chamber/container_resist_act(mob/living/user) - if(!locked) - open_machine() - return - if(busy) - return - user.changeNext_move(CLICK_CD_BREAKOUT) - user.last_special = world.time + CLICK_CD_BREAKOUT - user.visible_message(span_notice("You see [user] kicking against the door of [src]!"), \ - span_notice("You lean on the back of [src] and start pushing the door open... (this will take about [DisplayTimeText(breakout_time)].)"), \ - span_hear("You hear a metallic creaking from [src].")) - if(do_after(user,(breakout_time), target = src)) - if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked || busy) - return - locked = FALSE - user.visible_message(span_warning("[user] successfully broke out of [src]!"), \ - span_notice("You successfully break out of [src]!")) - open_machine() - -/obj/machinery/public_nanite_chamber/close_machine(mob/living/carbon/user, mob/living/attacker) - if(!state_open) - return FALSE - - ..() - - . = TRUE - - addtimer(CALLBACK(src, .proc/try_inject_nanites, attacker), 30) //If someone is shoved in give them a chance to get out before the injection starts - -/obj/machinery/public_nanite_chamber/proc/try_inject_nanites(mob/living/attacker) - if(occupant) - var/mob/living/L = occupant - if(SEND_SIGNAL(L, COMSIG_HAS_NANITES)) - var/datum/component/nanites/nanites = L.GetComponent(/datum/component/nanites) - if(nanites && nanites.cloud_id != cloud_id) - change_cloud(attacker) - return - if(L.mob_biotypes & (MOB_ORGANIC | MOB_UNDEAD)) - inject_nanites(attacker) - -/obj/machinery/public_nanite_chamber/open_machine() - if(state_open) - return FALSE - - ..() - - return TRUE - -/obj/machinery/public_nanite_chamber/relaymove(mob/living/user, direction) - if(user.stat || locked) - if(message_cooldown <= world.time) - message_cooldown = world.time + 50 - to_chat(user, span_warning("[src]'s door won't budge!")) - return - open_machine() - -/obj/machinery/public_nanite_chamber/attackby(obj/item/I, mob/user, params) - if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, I))//sent icon_state is irrelevant... - update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - return ..() - -/obj/machinery/public_nanite_chamber/interact(mob/user) - toggle_open(user) - -/obj/machinery/public_nanite_chamber/MouseDrop_T(mob/target, mob/user) - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || !Adjacent(target) || !user.Adjacent(target) || !iscarbon(target)) - return - if(close_machine(target, user)) - log_combat(user, target, "inserted", null, "into [src].") - add_fingerprint(user) diff --git a/code/modules/research/nanites/rules.dm b/code/modules/research/nanites/rules.dm deleted file mode 100644 index 7eb793cd83..0000000000 --- a/code/modules/research/nanites/rules.dm +++ /dev/null @@ -1,150 +0,0 @@ -/datum/nanite_rule - var/name = "Generic Condition" - var/desc = "When triggered, the program is active" - var/datum/nanite_program/program - -/datum/nanite_rule/New(datum/nanite_program/new_program) - program = new_program - if(LAZYLEN(new_program.rules) <= 5) //Avoid infinite stacking rules - new_program.rules += src - else - qdel(src) - -/datum/nanite_rule/proc/remove() - program.rules -= src - program = null - qdel(src) - -/datum/nanite_rule/proc/check_rule() - return TRUE - -/datum/nanite_rule/proc/display() - return name - -/datum/nanite_rule/proc/copy_to(datum/nanite_program/new_program) - new type(new_program) - -/datum/nanite_rule/health - name = "Health" - desc = "Checks the host's health status." - - var/threshold = 50 - var/above = TRUE - -/datum/nanite_rule/health/check_rule() - var/health_percent = program.host_mob.health / program.host_mob.maxHealth * 100 - if(above) - if(health_percent >= threshold) - return TRUE - else - if(health_percent < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/health/display() - return "[name] [above ? ">" : "<"] [threshold]%" - -/datum/nanite_rule/health/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/health/rule = new(new_program) - rule.above = above - rule.threshold = threshold - -//TODO allow inversion -/datum/nanite_rule/crit - name = "Crit" - desc = "Checks if the host is in critical condition." - -/datum/nanite_rule/crit/check_rule() - return HAS_TRAIT(program.host_mob, TRAIT_CRITICAL_CONDITION) - - -/datum/nanite_rule/death - name = "Death" - desc = "Checks if the host is dead." - -/datum/nanite_rule/death/check_rule() - if(program.host_mob.stat == DEAD || HAS_TRAIT(program.host_mob, TRAIT_FAKEDEATH)) - return TRUE - return FALSE - -/datum/nanite_rule/cloud_sync - name = "Cloud Sync" - desc = "Checks if the nanites have cloud sync enabled or disabled." - var/check_type = "Enabled" - -/datum/nanite_rule/cloud_sync/check_rule() - if(check_type == "Enabled") - return program.nanites.cloud_active - else - return !program.nanites.cloud_active - -/datum/nanite_rule/cloud_sync/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/cloud_sync/rule = new(new_program) - rule.check_type = check_type - -/datum/nanite_rule/cloud_sync/display() - return "[name]:[check_type]" - -/datum/nanite_rule/nanites - name = "Nanite Volume" - desc = "Checks the host's nanite volume." - - var/threshold = 50 - var/above = TRUE - -/datum/nanite_rule/nanites/check_rule() - var/nanite_percent = (program.nanites.nanite_volume - program.nanites.safety_threshold)/(program.nanites.max_nanites - program.nanites.safety_threshold)*100 - if(above) - if(nanite_percent >= threshold) - return TRUE - else - if(nanite_percent < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/nanites/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/nanites/rule = new(new_program) - rule.above = above - rule.threshold = threshold - -/datum/nanite_rule/nanites/display() - return "[name] [above ? ">" : "<"] [threshold]%" - -/datum/nanite_rule/damage - name = "Damage" - desc = "Checks the host's damage." - - var/threshold = 50 - var/above = TRUE - var/damage_type = BRUTE - -/datum/nanite_rule/damage/check_rule() - var/damage_amt = 0 - switch(damage_type) - if(BRUTE) - damage_amt = program.host_mob.getBruteLoss() - if(BURN) - damage_amt = program.host_mob.getFireLoss() - if(TOX) - damage_amt = program.host_mob.getToxLoss() - if(OXY) - damage_amt = program.host_mob.getOxyLoss() - if(CLONE) - damage_amt = program.host_mob.getCloneLoss() - - if(above) - if(damage_amt >= threshold) - return TRUE - else - if(damage_amt < threshold) - return TRUE - return FALSE - -/datum/nanite_rule/damage/copy_to(datum/nanite_program/new_program) - var/datum/nanite_rule/damage/rule = new(new_program) - rule.above = above - rule.threshold = threshold - rule.damage_type = damage_type - -/datum/nanite_rule/damage/display() - return "[damage_type] [above ? ">" : "<"] [threshold]" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 6f60925ee4..7c833cdbe9 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -237,6 +237,7 @@ "compact_remote_shell", "component_printer", "integrated_circuit", + "module_duplicator", "usb_cable", ) @@ -1687,188 +1688,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) -/////////////////////////Nanites///////////////////////// -/datum/techweb_node/nanite_base - id = "nanite_base" - display_name = "Basic Nanite Programming" - description = "The basics of nanite construction and programming." - prereq_ids = list("datatheory") - design_ids = list( - "access_nanites", - "debugging_nanites", - "monitoring_nanites", - "nanite_chamber", - "nanite_chamber_control", - "nanite_cloud_control", - "nanite_comm_remote", - "nanite_disk", - "nanite_program_hub", - "nanite_programmer", - "nanite_remote", - "nanite_scanner", - "public_nanite_chamber", - "relay_nanites", - "relay_repeater_nanites", - "repairing_nanites", - "repeater_nanites", - "sensor_nanite_volume", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) - -/datum/techweb_node/nanite_smart - id = "nanite_smart" - display_name = "Smart Nanite Programming" - description = "Nanite programs that require nanites to perform complex actions, act independently, roam or seek targets." - prereq_ids = list("nanite_base","robotics") - design_ids = list( - "memleak_nanites", - "metabolic_nanites", - "purging_nanites", - "sensor_voice_nanites", - "stealth_nanites", - "voice_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_mesh - id = "nanite_mesh" - display_name = "Mesh Nanite Programming" - description = "Nanite programs that require static structures and membranes." - prereq_ids = list("nanite_base","engineering") - design_ids = list( - "conductive_nanites", - "cryo_nanites", - "dermal_button_nanites", - "emp_nanites", - "hardening_nanites", - "refractive_nanites", - "shock_nanites", - "temperature_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_bio - id = "nanite_bio" - display_name = "Biological Nanite Programming" - description = "Nanite programs that require complex biological interaction." - prereq_ids = list("nanite_base","biotech") - design_ids = list( - "bloodheal_nanites", - "coagulating_nanites", - "flesheating_nanites", - "poison_nanites", - "regenerative_nanites", - "sensor_crit_nanites", - "sensor_damage_nanites", - "sensor_death_nanites", - "sensor_health_nanites", - "sensor_species_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 500, TECHWEB_POINT_TYPE_NANITES = 500) - -/datum/techweb_node/nanite_neural - id = "nanite_neural" - display_name = "Neural Nanite Programming" - description = "Nanite programs affecting nerves and brain matter." - prereq_ids = list("nanite_bio") - design_ids = list( - "bad_mood_nanites", - "brainheal_nanites", - "good_mood_nanites", - "nervous_nanites", - "paralyzing_nanites", - "selfscan_nanites", - "stun_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 1000) - -/datum/techweb_node/nanite_synaptic - id = "nanite_synaptic" - display_name = "Synaptic Nanite Programming" - description = "Nanite programs affecting mind and thoughts." - prereq_ids = list("nanite_neural","neural_programming") - design_ids = list( - "blinding_nanites", - "hallucination_nanites", - "mindshield_nanites", - "mute_nanites", - "pacifying_nanites", - "sleep_nanites", - "speech_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 1000) - -/datum/techweb_node/nanite_harmonic - id = "nanite_harmonic" - display_name = "Harmonic Nanite Programming" - description = "Nanite programs that require seamless integration between nanites and biology. Passively increases nanite regeneration rate for all clouds upon researching." - prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh") - design_ids = list( - "aggressive_nanites", - "brainheal_plus_nanites", - "defib_nanites", - "fakedeath_nanites", - "purging_plus_nanites", - "regenerative_plus_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 3000) - -/datum/techweb_node/nanite_combat - id = "nanite_military" - display_name = "Military Nanite Programming" - description = "Nanite programs that perform military-grade functions." - prereq_ids = list("nanite_harmonic", "syndicate_basic") - design_ids = list( - "explosive_nanites", - "meltdown_nanites", - "nanite_sting_nanites", - "pyro_nanites", - "viral_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500, TECHWEB_POINT_TYPE_NANITES = 2500) - -/datum/techweb_node/nanite_hazard - id = "nanite_hazard" - display_name = "Hazard Nanite Programs" - description = "Extremely advanced Nanite programs with the potential of being extremely dangerous." - prereq_ids = list("nanite_harmonic", "alientech") - design_ids = list( - "mindcontrol_nanites", - "mitosis_nanites", - "spreading_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000, TECHWEB_POINT_TYPE_NANITES = 4000) - -/datum/techweb_node/nanite_replication_protocols - id = "nanite_replication_protocols" - display_name = "Nanite Replication Protocols" - description = "Protocols that overwrite the default nanite replication routine to achieve more efficiency in certain circumstances." - prereq_ids = list("nanite_smart") - design_ids = list( - "factory_nanites", - "kickstart_nanites", - "offline_nanites", - "pyramid_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 2500) - hidden = TRUE - experimental = TRUE - -/datum/techweb_node/nanite_storage_protocols - id = "nanite_storage_protocols" - display_name = "Nanite Storage Protocols" - description = "Protocols that overwrite the default nanite storage routine to achieve more efficiency or greater capacity." - prereq_ids = list("nanite_smart") - design_ids = list( - "free_range_nanites", - "hive_nanites", - "unsafe_storage_nanites", - "zip_nanites", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 2500) - hidden = TRUE - experimental = TRUE - ////////////////////////Alien technology//////////////////////// /datum/techweb_node/alientech //AYYYYYYYYLMAOO tech id = "alientech" diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index e373cf29da..887feca67b 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -1,3 +1,7 @@ + +///BSA unlocked by head ID swipes +GLOBAL_VAR_INIT(bsa_unlock, FALSE) + // Crew has to build a bluespace cannon // Cargo orders part for high price // Requires high amount of power diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui/tgui_alert.dm index d144588ad9..83a26c2963 100644 --- a/code/modules/tgui/tgui_alert.dm +++ b/code/modules/tgui/tgui_alert.dm @@ -8,8 +8,9 @@ * * title - The of the alert modal, shown on the top of the TGUI window. * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI. * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Set to zero for no timeout. + * * autofocus - The bool that controls if this alert should grab window focus. */ -/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0) +/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0, autofocus = TRUE) if (!user) user = usr if (!istype(user)) @@ -18,7 +19,7 @@ user = client.mob else return - var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout) + var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout, autofocus) alert.ui_interact(user) alert.wait() if (alert) @@ -36,8 +37,9 @@ * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI. * * callback - The callback to be invoked when a choice is made. * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Disabled by default, can be set to seconds otherwise. + * * autofocus - The bool that controls if this alert should grab window focus. */ -/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0) +/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0, autofocus = TRUE) if (!user) user = usr if (!istype(user)) @@ -46,7 +48,7 @@ user = client.mob else return - var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout) + var/datum/tgui_modal/async/alert = new(user, message, title, buttons, callback, timeout, autofocus) alert.ui_interact(user) /** @@ -68,13 +70,16 @@ var/start_time /// The lifespan of the tgui_modal, after which the window will close and delete itself. var/timeout + /// The bool that controls if this modal should grab window focus + var/autofocus /// Boolean field describing if the tgui_modal was closed by the user. var/closed -/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout) +/datum/tgui_modal/New(mob/user, message, title, list/buttons, timeout, autofocus) src.title = title src.message = message src.buttons = buttons.Copy() + src.autofocus = autofocus if (timeout) src.timeout = timeout start_time = world.time @@ -110,7 +115,8 @@ . = list( "title" = title, "message" = message, - "buttons" = buttons + "buttons" = buttons, + "autofocus" = autofocus ) if(timeout) @@ -140,8 +146,8 @@ /// The callback to be invoked by the tgui_modal upon having a choice made. var/datum/callback/callback -/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout) - ..(user, message, title, buttons, timeout) +/datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout, autofocus) + ..(user, message, title, buttons, timeout, autofocus) src.callback = callback /datum/tgui_modal/async/Destroy(force, ...) diff --git a/code/modules/unit_tests/designs.dm b/code/modules/unit_tests/designs.dm index 7ef6658959..2867eeee36 100644 --- a/code/modules/unit_tests/designs.dm +++ b/code/modules/unit_tests/designs.dm @@ -3,11 +3,10 @@ /datum/unit_test/designs/Run() //Can't use allocate because of bug with certain datums var/datum/design/default_design = new /datum/design() - var/datum/design/nanites/default_design_nanites = new /datum/design/nanites() var/datum/design/surgery/default_design_surgery = new /datum/design/surgery() for(var/path in subtypesof(/datum/design)) - if (ispath(path, /datum/design/nanites) || ispath(path, /datum/design/surgery)) //We are checking nanites and surgery design separatly later since they work differently + if (ispath(path, /datum/design/surgery)) //We are checking surgery design separatly later since they work differently continue var/datum/design/current_design = new path //Create an instance of each design if (current_design.id == DESIGN_ID_IGNORE) //Don't check designs with ignore ID @@ -20,11 +19,6 @@ else if (!isnull(current_design.build_path) || !isnull(current_design.build_path)) // //Design requires no materials but creates stuff Fail("Design [current_design.type] requires NO materials but has build_path or make_reagents set") - for(var/path in subtypesof(/datum/design/nanites)) - var/datum/design/nanites/current_design = new path //Create an instance of each design - if (isnull(current_design.program_type) || current_design.program_type == default_design_nanites.program_type) //Check if the Nanite design provides a program - Fail("Nanite Design [current_design.type] does not have have any program_type set") - for(var/path in subtypesof(/datum/design/surgery)) var/datum/design/surgery/current_design = new path //Create an instance of each design if (isnull(current_design.id) || current_design.id == default_design_surgery.id) //Check if ID was not set diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index b2bb9f1861..7f331bb1fc 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -84,13 +84,14 @@ /obj/vehicle/ridden/scooter/skateboard/Bump(atom/A) . = ..() - if(!A.density || !has_buckled_mobs()) + if(!A.density || !has_buckled_mobs() || world.time < next_crash) return + next_crash = world.time + 10 var/mob/living/rider = buckled_mobs[1] rider.adjustStaminaLoss(instability*6) playsound(src, 'sound/effects/bang.ogg', 40, TRUE) - if(!iscarbon(rider) || rider.getStaminaLoss() >= 100 || grinding || world.time < next_crash) + if(!iscarbon(rider) || rider.getStaminaLoss() >= 100 || grinding) var/atom/throw_target = get_edge_target_turf(rider, pick(GLOB.cardinals)) unbuckle_mob(rider) rider.throw_at(throw_target, 3, 2) @@ -104,7 +105,6 @@ var/backdir = turn(dir, 180) step(src, backdir) rider.spin(4, 1) - next_crash = world.time + 10 ///Moves the vehicle forward and if it lands on a table, repeats /obj/vehicle/ridden/scooter/skateboard/proc/grind() diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index ed2aa566eb..f6018e2d95 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -12,8 +12,6 @@ products = list() contraband = list() premium = list() - -IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY CANISTER CHARGES in vending_items.dm */ #define MAX_VENDING_INPUT_AMOUNT 30 @@ -1280,5 +1278,3 @@ GLOBAL_LIST_EMPTY(vending_products) slogan_list = list("[GLOB.deity] says: It's your divine right to buy!") add_filter("vending_outline", 9, list("type" = "outline", "color" = COLOR_VERY_SOFT_YELLOW)) add_filter("vending_rays", 10, list("type" = "rays", "size" = 35, "color" = COLOR_VIVID_YELLOW)) - - diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index b0180457bf..50e399707d 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -112,6 +112,8 @@ /obj/item/clothing/head/cueball = 1, /obj/item/clothing/under/suit/white_on_white = 1, /obj/item/clothing/under/costume/sailor = 1, + /obj/item/clothing/under/costume/referee = 1, + /obj/item/clothing/mask/whistle = 1, /obj/item/clothing/head/delinquent = 1, /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/head/shrine_wig = 1, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 4fc15564dc..c1fcac9f2f 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -1,4 +1,3 @@ -//DON'T FORGET TO CHANGE THE REFILL SIZE IF YOU CHANGE THE MACHINE'S CONTENTS! /obj/machinery/vending/clothing name = "ClothesMate" //renamed to make the slogan rhyme desc = "A vending machine for clothing." diff --git a/code/modules/wiremod/component_printer.dm b/code/modules/wiremod/component_printer.dm index b04d5c7059..e170dcd83b 100644 --- a/code/modules/wiremod/component_printer.dm +++ b/code/modules/wiremod/component_printer.dm @@ -132,3 +132,179 @@ /obj/item/stock_parts/manipulator = 2, /obj/item/reagent_containers/glass/beaker = 2, ) + +/// Module duplicator, allows you to save and recreate module components. +/obj/machinery/module_duplicator + name = "module duplicator" + desc = "Allows you to duplicate module components so that you don't have to recreate them. Scan a module component over this machine to add it as an entry." + icon = 'icons/obj/wiremod_fab.dmi' + icon_state = "module-fab-idle" + circuit = /obj/item/circuitboard/machine/module_duplicator + + /// The internal material bus + var/datum/component/remote_materials/materials + + density = TRUE + + var/list/scanned_designs = list() + + var/cost_per_component = 1000 + +/obj/machinery/module_duplicator/Initialize(mapload) + . = ..() + + materials = AddComponent( \ + /datum/component/remote_materials, \ + "module_duplicator", \ + mapload, \ + mat_container_flags = BREAKDOWN_FLAGS_LATHE, \ + ) + +/obj/machinery/module_duplicator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ComponentPrinter", name) + ui.open() + +/obj/machinery/module_duplicator/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/sheetmaterials) + ) + +/obj/machinery/module_duplicator/ui_act(action, list/params) + . = ..() + if (.) + return + + switch (action) + if ("print") + var/design_id = text2num(params["designId"]) + + if (design_id < 1 || design_id > length(scanned_designs)) + return TRUE + + var/list/design = scanned_designs[design_id] + + if (materials.on_hold()) + say("Mineral access is on hold, please contact the quartermaster.") + return TRUE + + if (!materials.mat_container?.has_materials(design["materials"])) + say("Not enough materials.") + return TRUE + + balloon_alert_to_viewers("printed [design["name"]]") + materials.mat_container?.use_materials(design["materials"]) + materials.silo_log(src, "printed", -1, design["name"], design["materials"]) + var/atom/printed_design = print_module(design) + printed_design.pixel_x = printed_design.base_pixel_x + rand(-5, 5) + printed_design.pixel_y = printed_design.base_pixel_y + rand(-5, 5) + if ("remove_mat") + var/datum/material/material = locate(params["ref"]) + var/amount = text2num(params["amount"]) + + if (!amount) + return TRUE + + // SAFETY: eject_sheets checks for valid mats + materials.eject_sheets(material, amount) + + return TRUE + +/obj/machinery/module_duplicator/proc/print_module(list/design) + var/obj/item/circuit_component/module/module = new(drop_location()) + module.load_data_from_list(design["dupe_data"]) + return module + +/obj/machinery/module_duplicator/attackby(obj/item/weapon, mob/user, params) + if(!istype(weapon, /obj/item/circuit_component/module)) + return ..() + + var/obj/item/circuit_component/module/module = weapon + if(module.circuit_flags & CIRCUIT_FLAG_UNDUPEABLE) + balloon_alert(user, "module cannot be saved!") + return ..() + + if(module.display_name == initial(module.display_name)) + balloon_alert(user, "module needs a name!") + return ..() + + for(var/list/component_data as anything in scanned_designs) + if(component_data["name"] == module.display_name) + balloon_alert(user, "module name already exists!") + return ..() + + var/total_cost = 0 + for(var/obj/item/circuit_component/component as anything in module.internal_circuit.attached_components) + if(component.circuit_flags & CIRCUIT_FLAG_UNDUPEABLE) + balloon_alert(user, "module contains prohibited components!") + return ..() + + total_cost += cost_per_component + + var/list/data = list() + + data["dupe_data"] = list() + module.save_data_to_list(data["dupe_data"]) + + data["name"] = module.display_name + data["desc"] = "A module that has been loaded in by [user]." + data["materials"] = list(/datum/material/glass = total_cost) + + scanned_designs += list(data) + + balloon_alert(user, "module has been saved.") + playsound(src, 'sound/machines/ping.ogg', 50) + + +/obj/machinery/module_duplicator/ui_data(mob/user) + var/list/data = list() + data["materials"] = materials.mat_container.ui_data() + return data + +/obj/machinery/module_duplicator/ui_static_data(mob/user) + var/list/data = list() + + var/list/designs = list() + + var/index = 1 + for (var/list/design as anything in scanned_designs) + designs["[index]"] = list( + "name" = design["name"], + "description" = design["desc"], + "materials" = get_material_cost_data(design["materials"]), + "categories" = list("Circuitry"), + ) + index++ + + data["designs"] = designs + + return data + +/obj/machinery/module_duplicator/crowbar_act(mob/living/user, obj/item/tool) + if(..()) + return TRUE + return default_deconstruction_crowbar(tool) + +/obj/machinery/module_duplicator/screwdriver_act(mob/living/user, obj/item/tool) + if(..()) + return TRUE + return default_deconstruction_screwdriver(user, "module-fab-o", "module-fab-idle", tool) + +/obj/machinery/module_duplicator/proc/get_material_cost_data(list/materials) + var/list/data = list() + + for (var/datum/material/material_type as anything in materials) + data[initial(material_type.name)] = materials[material_type] + + return data + +/obj/item/circuitboard/machine/module_duplicator + name = "\improper Module Duplicator (Machine Board)" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/module_duplicator + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/manipulator = 2, + /obj/item/reagent_containers/glass/beaker = 2, + ) diff --git a/code/modules/wiremod/components/abstract/compare.dm b/code/modules/wiremod/components/abstract/compare.dm index c5fff8aa6a..6d10ac7b56 100644 --- a/code/modules/wiremod/components/abstract/compare.dm +++ b/code/modules/wiremod/components/abstract/compare.dm @@ -38,13 +38,6 @@ /obj/item/circuit_component/compare/proc/load_custom_ports() return -/obj/item/circuit_component/compare/Destroy() - true = null - false = null - result = null - compare = null - return ..() - /obj/item/circuit_component/compare/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/abstract/module.dm b/code/modules/wiremod/components/abstract/module.dm index c0475fc832..303f638735 100644 --- a/code/modules/wiremod/components/abstract/module.dm +++ b/code/modules/wiremod/components/abstract/module.dm @@ -18,7 +18,7 @@ var/port_limit = 10 /obj/item/integrated_circuit/module - var/obj/item/circuit_component/attached_module + var/obj/item/circuit_component/module/attached_module /obj/item/integrated_circuit/module/ui_host(mob/user) . = ..() @@ -29,6 +29,18 @@ . = ..() attached_module.display_name = new_name +/obj/item/integrated_circuit/module/load_component(type) + if(!attached_module) + return ..() + + if(ispath(type, /obj/item/circuit_component/module_input)) + return attached_module.input_component + + if(ispath(type, /obj/item/circuit_component/module_output)) + return attached_module.output_component + + return ..() + /obj/item/integrated_circuit/module/Destroy() attached_module = null return ..() @@ -88,7 +100,7 @@ input_component = new(internal_circuit) input_component.attached_module = src internal_circuit.add_component(input_component) - input_component.rel_x = 400 + input_component.rel_x = 0 input_component.rel_y = 200 output_component = new(internal_circuit) @@ -97,6 +109,49 @@ output_component.rel_x = 400 output_component.rel_y = 200 +/obj/item/circuit_component/module/save_data_to_list(list/component_data) + . = ..() + component_data["integrated_circuit"] = internal_circuit.convert_to_json() + + var/list/input_data = list() + for(var/datum/port/input/input_port as anything in input_ports) + input_data += list(list( + "name" = input_port.name, + "type" = input_port.datatype, + )) + + var/list/output_data = list() + for(var/datum/port/output/output_port as anything in output_ports) + output_data += list(list( + "name" = output_port.name, + "type" = output_port.datatype, + )) + + component_data["input_ports"] = input_data + component_data["output_ports"] = output_data + +/obj/item/circuit_component/module/load_data_from_list(list/component_data) + . = ..() + + var/list/input_ports = component_data["input_ports"] + for(var/list/port_data as anything in input_ports) + add_and_link_input_port(port_data["name"], port_data["type"]) + + var/list/output_ports = component_data["output_ports"] + for(var/list/port_data as anything in output_ports) + add_and_link_output_port(port_data["name"], port_data["type"]) + + if(component_data["integrated_circuit"]) + internal_circuit.load_circuit_data(component_data["integrated_circuit"]) + +/obj/item/circuit_component/module/proc/add_and_link_input_port(name, type) + var/datum/port/new_port = add_input_port(name, type) + linked_ports[new_port] = input_component.add_output_port(name, type) + +/obj/item/circuit_component/module/proc/add_and_link_output_port(name, type) + var/datum/port/new_port = output_component.add_input_port(name, type) + linked_ports[new_port] = add_output_port(name, type) + /obj/item/circuit_component/module/add_to(obj/item/integrated_circuit/added_to) . = ..() RegisterSignal(added_to, COMSIG_CIRCUIT_SET_CELL, .proc/handle_set_cell) @@ -177,8 +232,7 @@ if("add_input_port") if(length(input_ports) > port_limit) return - var/datum/port/new_port = add_input_port("Input Port", PORT_TYPE_ANY) - linked_ports[new_port] = input_component.add_output_port("Input Port", PORT_TYPE_ANY) + add_and_link_input_port("Input Port", PORT_TYPE_ANY) . = TRUE if("remove_input_port") var/port_id = text2num(params["port_id"]) @@ -192,8 +246,7 @@ if("add_output_port") if(length(output_ports) > port_limit) return - var/datum/port/new_port = output_component.add_input_port("Output Port", PORT_TYPE_ANY) - linked_ports[new_port] = add_output_port("Output Port", PORT_TYPE_ANY) + add_and_link_output_port("Output Port", PORT_TYPE_ANY) . = TRUE if("remove_output_port") var/port_id = text2num(params["port_id"]) diff --git a/code/modules/wiremod/components/action/light.dm b/code/modules/wiremod/components/action/light.dm index 2dda63e279..0716e227a7 100644 --- a/code/modules/wiremod/components/action/light.dm +++ b/code/modules/wiremod/components/action/light.dm @@ -35,15 +35,6 @@ on = add_input_port("On", PORT_TYPE_NUMBER) - -/obj/item/circuit_component/light/Destroy() - red = null - green = null - blue = null - brightness = null - on = null - return ..() - /obj/item/circuit_component/light/register_shell(atom/movable/shell) . = ..() TRIGGER_CIRCUIT_COMPONENT(src, null) diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm index fd785b8de4..036ae113c2 100644 --- a/code/modules/wiremod/components/action/mmi.dm +++ b/code/modules/wiremod/components/action/mmi.dm @@ -53,16 +53,6 @@ /obj/item/circuit_component/mmi/Destroy() remove_current_brain() - message = null - send = null - eject = null - north = null - east = null - south = null - west = null - attack = null - secondary_attack = null - clicked_atom = null return ..() /obj/item/circuit_component/mmi/input_received(datum/port/input/port) diff --git a/code/modules/wiremod/components/action/pathfind.dm b/code/modules/wiremod/components/action/pathfind.dm index 8cc902caa5..7081aea6ae 100644 --- a/code/modules/wiremod/components/action/pathfind.dm +++ b/code/modules/wiremod/components/action/pathfind.dm @@ -44,21 +44,6 @@ failed = add_output_port("Failed", PORT_TYPE_SIGNAL) reason_failed = add_output_port("Fail reason", PORT_TYPE_STRING) -/obj/item/circuit_component/pathfind/Destroy() - input_X = null - input_Y = null - id_card = null - - output = null - finished = null - failed = null - reason_failed = null - - path = null - old_dest = null - next_turf = null - return ..() - /obj/item/circuit_component/pathfind/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/action/pull.dm b/code/modules/wiremod/components/action/pull.dm index 1f5923ad05..3c8e75eff5 100644 --- a/code/modules/wiremod/components/action/pull.dm +++ b/code/modules/wiremod/components/action/pull.dm @@ -15,10 +15,6 @@ . = ..() target = add_input_port("Target", PORT_TYPE_ATOM) -/obj/item/circuit_component/pull/Destroy() - target = null - return ..() - /obj/item/circuit_component/pull/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/action/radio.dm b/code/modules/wiremod/components/action/radio.dm index 393630c462..c704fef837 100644 --- a/code/modules/wiremod/components/action/radio.dm +++ b/code/modules/wiremod/components/action/radio.dm @@ -34,10 +34,7 @@ trigger_output = add_output_port("Received", PORT_TYPE_SIGNAL) /obj/item/circuit_component/radio/Destroy() - freq = null - code = null SSradio.remove_object(src, current_freq) - radio_connection = null return ..() /obj/item/circuit_component/radio/input_received(datum/port/input/port) diff --git a/code/modules/wiremod/components/action/soundemitter.dm b/code/modules/wiremod/components/action/soundemitter.dm index 79ba7d80ea..355b0c3271 100644 --- a/code/modules/wiremod/components/action/soundemitter.dm +++ b/code/modules/wiremod/components/action/soundemitter.dm @@ -29,11 +29,6 @@ volume = add_input_port("Volume", PORT_TYPE_NUMBER, default = 35) frequency = add_input_port("Frequency", PORT_TYPE_NUMBER, default = 0) -/obj/item/circuit_component/soundemitter/Destroy() - frequency = null - volume = null - return ..() - /obj/item/circuit_component/soundemitter/populate_options() var/static/component_options = list( COMP_SOUND_BUZZ, diff --git a/code/modules/wiremod/components/action/speech.dm b/code/modules/wiremod/components/action/speech.dm index 06c8af28a2..d94929e4f7 100644 --- a/code/modules/wiremod/components/action/speech.dm +++ b/code/modules/wiremod/components/action/speech.dm @@ -22,11 +22,6 @@ . = ..() message = add_input_port("Message", PORT_TYPE_STRING, FALSE) - -/obj/item/circuit_component/speech/Destroy() - message = null - return ..() - /obj/item/circuit_component/speech/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/atom/direction.dm b/code/modules/wiremod/components/atom/direction.dm index 5b42625245..660ebe2945 100644 --- a/code/modules/wiremod/components/atom/direction.dm +++ b/code/modules/wiremod/components/atom/direction.dm @@ -39,11 +39,6 @@ south = add_output_port("South", PORT_TYPE_SIGNAL) west = add_output_port("West", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/direction/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/direction/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/atom/gps.dm b/code/modules/wiremod/components/atom/gps.dm index 3c0b70b418..2729d65c5b 100644 --- a/code/modules/wiremod/components/atom/gps.dm +++ b/code/modules/wiremod/components/atom/gps.dm @@ -21,12 +21,6 @@ y_pos = add_output_port("Y", PORT_TYPE_NUMBER) z_pos = add_output_port("Z", PORT_TYPE_NUMBER) -/obj/item/circuit_component/gps/Destroy() - x_pos = null - y_pos = null - z_pos = null - return ..() - /obj/item/circuit_component/gps/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/atom/health.dm b/code/modules/wiremod/components/atom/health.dm index dd436ba84a..69e555beac 100644 --- a/code/modules/wiremod/components/atom/health.dm +++ b/code/modules/wiremod/components/atom/health.dm @@ -39,15 +39,6 @@ oxy = add_output_port("Suffocation Damage", PORT_TYPE_NUMBER) health = add_output_port("Health", PORT_TYPE_NUMBER) -/obj/item/circuit_component/health/Destroy() - input_port = null - brute = null - burn = null - toxin = null - oxy = null - health = null - return ..() - /obj/item/circuit_component/health/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index a8e3d91704..f7d49846fc 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -24,15 +24,6 @@ trigger_port = add_output_port("Triggered", PORT_TYPE_SIGNAL) become_hearing_sensitive(ROUNDSTART_TRAIT) - - -/obj/item/circuit_component/hear/Destroy() - message_port = null - language_port = null - speaker_port = null - trigger_port = null - return ..() - /obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods) if(speaker == parent?.shell) return diff --git a/code/modules/wiremod/components/atom/self.dm b/code/modules/wiremod/components/atom/self.dm index 364d51cd6d..2739d8f9a0 100644 --- a/code/modules/wiremod/components/atom/self.dm +++ b/code/modules/wiremod/components/atom/self.dm @@ -14,10 +14,6 @@ . = ..() output = add_output_port("Self", PORT_TYPE_ATOM) -/obj/item/circuit_component/self/Destroy() - output = null - return ..() - /obj/item/circuit_component/self/register_shell(atom/movable/shell) output.set_output(shell) diff --git a/code/modules/wiremod/components/atom/species.dm b/code/modules/wiremod/components/atom/species.dm index a24d469f03..9bab5c8ee0 100644 --- a/code/modules/wiremod/components/atom/species.dm +++ b/code/modules/wiremod/components/atom/species.dm @@ -21,11 +21,6 @@ output = add_output_port("Species", PORT_TYPE_STRING) -/obj/item/circuit_component/species/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/species/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/list/concat.dm b/code/modules/wiremod/components/list/concat.dm index 71cbd0ab05..f3fbd7dc30 100644 --- a/code/modules/wiremod/components/list/concat.dm +++ b/code/modules/wiremod/components/list/concat.dm @@ -24,12 +24,6 @@ output = add_output_port("Output", PORT_TYPE_STRING) -/obj/item/circuit_component/concat_list/Destroy() - list_port = null - separator = null - output = null - return ..() - /obj/item/circuit_component/concat_list/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/list/get_column.dm b/code/modules/wiremod/components/list/get_column.dm index 24a9f5363e..d843d82a72 100644 --- a/code/modules/wiremod/components/list/get_column.dm +++ b/code/modules/wiremod/components/list/get_column.dm @@ -23,12 +23,6 @@ column_name = add_input_port("Column Name", PORT_TYPE_STRING) output_list = add_output_port("Output", PORT_TYPE_LIST) -/obj/item/circuit_component/get_column/Destroy() - received_table = null - column_name = null - output_list = null - return ..() - /obj/item/circuit_component/get_column/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/list/index.dm b/code/modules/wiremod/components/list/index.dm index 1e75e53bbe..69a06cbb7f 100644 --- a/code/modules/wiremod/components/list/index.dm +++ b/code/modules/wiremod/components/list/index.dm @@ -22,12 +22,6 @@ output = add_output_port("Value", PORT_TYPE_ANY) -/obj/item/circuit_component/index/Destroy() - list_port = null - index_port = null - output = null - return ..() - /obj/item/circuit_component/index/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/list/index_table.dm b/code/modules/wiremod/components/list/index_table.dm index 75759f373e..b0e4398d10 100644 --- a/code/modules/wiremod/components/list/index_table.dm +++ b/code/modules/wiremod/components/list/index_table.dm @@ -24,12 +24,6 @@ output_list = add_output_port("Output", PORT_TYPE_LIST) -/obj/item/circuit_component/index_table/Destroy() - received_table = null - target_index = null - output_list = null - return ..() - /obj/item/circuit_component/index_table/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/list/select.dm b/code/modules/wiremod/components/list/select.dm index 8790740e9d..bd46c291fe 100644 --- a/code/modules/wiremod/components/list/select.dm +++ b/code/modules/wiremod/components/list/select.dm @@ -41,13 +41,6 @@ filtered_table = add_output_port("Output", PORT_TYPE_TABLE) -/obj/item/circuit_component/select/Destroy() - received_table = null - column_name = null - comparison_input = null - filtered_table = null - return ..() - /obj/item/circuit_component/select/input_received(datum/port/input/port) . = ..() switch(current_option) diff --git a/code/modules/wiremod/components/list/split.dm b/code/modules/wiremod/components/list/split.dm index dce297e25b..6c8e7d25fd 100644 --- a/code/modules/wiremod/components/list/split.dm +++ b/code/modules/wiremod/components/list/split.dm @@ -24,12 +24,6 @@ separator = add_input_port("Seperator", PORT_TYPE_STRING) output = add_output_port("Output", PORT_TYPE_LIST) -/obj/item/circuit_component/split/Destroy() - input_port = null - separator = null - output = null - return ..() - /obj/item/circuit_component/split/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/math/arithmetic.dm b/code/modules/wiremod/components/math/arithmetic.dm index dffa3e89a2..5cb89feadf 100644 --- a/code/modules/wiremod/components/math/arithmetic.dm +++ b/code/modules/wiremod/components/math/arithmetic.dm @@ -35,10 +35,6 @@ output = add_output_port("Output", PORT_TYPE_NUMBER) -/obj/item/circuit_component/arithmetic/Destroy() - output = null - return ..() - /obj/item/circuit_component/arithmetic/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/math/length.dm b/code/modules/wiremod/components/math/length.dm index 4edb438818..7632436709 100644 --- a/code/modules/wiremod/components/math/length.dm +++ b/code/modules/wiremod/components/math/length.dm @@ -20,11 +20,6 @@ output = add_output_port("Length", PORT_TYPE_NUMBER) -/obj/item/circuit_component/length/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/length/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/math/not.dm b/code/modules/wiremod/components/math/not.dm index ac656c8d66..3402fa8480 100644 --- a/code/modules/wiremod/components/math/not.dm +++ b/code/modules/wiremod/components/math/not.dm @@ -20,11 +20,6 @@ result = add_output_port("Result", PORT_TYPE_NUMBER) -/obj/item/circuit_component/not/Destroy() - input_port = null - result = null - return ..() - /obj/item/circuit_component/not/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/math/random.dm b/code/modules/wiremod/components/math/random.dm index 1b600ca357..d2504310a9 100644 --- a/code/modules/wiremod/components/math/random.dm +++ b/code/modules/wiremod/components/math/random.dm @@ -24,12 +24,6 @@ output = add_output_port("Output", PORT_TYPE_NUMBER) -/obj/item/circuit_component/random/Destroy() - minimum = null - maximum = null - output = null - return ..() - /obj/item/circuit_component/random/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/sensors/pressuresensor.dm b/code/modules/wiremod/components/sensors/pressuresensor.dm index 2faf6ae972..633fec3603 100644 --- a/code/modules/wiremod/components/sensors/pressuresensor.dm +++ b/code/modules/wiremod/components/sensors/pressuresensor.dm @@ -16,10 +16,6 @@ . = ..() result = add_output_port("Result", PORT_TYPE_NUMBER) -/obj/item/circuit_component/tempsensor/Destroy() - result = null - return ..() - /obj/item/circuit_component/pressuresensor/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/sensors/tempsensor.dm b/code/modules/wiremod/components/sensors/tempsensor.dm index 6c40c1dc76..7c1dbfde93 100644 --- a/code/modules/wiremod/components/sensors/tempsensor.dm +++ b/code/modules/wiremod/components/sensors/tempsensor.dm @@ -16,10 +16,6 @@ . = ..() result = add_output_port("Result", PORT_TYPE_NUMBER) -/obj/item/circuit_component/tempsensor/Destroy() - result = null - return ..() - /obj/item/circuit_component/tempsensor/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/string/concat.dm b/code/modules/wiremod/components/string/concat.dm index c983c3e219..6f76c94ba5 100644 --- a/code/modules/wiremod/components/string/concat.dm +++ b/code/modules/wiremod/components/string/concat.dm @@ -22,10 +22,6 @@ output = add_output_port("Output", PORT_TYPE_STRING) -/obj/item/circuit_component/concat/Destroy() - output = null - return ..() - /obj/item/circuit_component/concat/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/string/textcase.dm b/code/modules/wiremod/components/string/textcase.dm index 92bbf7ae0d..60108e3fbe 100644 --- a/code/modules/wiremod/components/string/textcase.dm +++ b/code/modules/wiremod/components/string/textcase.dm @@ -27,11 +27,6 @@ input_port = add_input_port("Input", PORT_TYPE_STRING) output = add_output_port("Output", PORT_TYPE_STRING) -/obj/item/circuit_component/textcase/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/textcase/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/string/tonumber.dm b/code/modules/wiremod/components/string/tonumber.dm index 734da06beb..258a4d960f 100644 --- a/code/modules/wiremod/components/string/tonumber.dm +++ b/code/modules/wiremod/components/string/tonumber.dm @@ -21,11 +21,6 @@ output = add_output_port("Output", PORT_TYPE_NUMBER) -/obj/item/circuit_component/tonumber/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/tonumber/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/string/tostring.dm b/code/modules/wiremod/components/string/tostring.dm index ece3747da2..76a71cc33d 100644 --- a/code/modules/wiremod/components/string/tostring.dm +++ b/code/modules/wiremod/components/string/tostring.dm @@ -23,11 +23,6 @@ output = add_output_port("Output", PORT_TYPE_STRING) -/obj/item/circuit_component/tostring/Destroy() - input_port = null - output = null - return ..() - /obj/item/circuit_component/tostring/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/utility/clock.dm b/code/modules/wiremod/components/utility/clock.dm index 17487dd96c..712c42dedd 100644 --- a/code/modules/wiremod/components/utility/clock.dm +++ b/code/modules/wiremod/components/utility/clock.dm @@ -34,8 +34,6 @@ stop_process() /obj/item/circuit_component/clock/Destroy() - on = null - signal = null stop_process() return ..() diff --git a/code/modules/wiremod/components/utility/combiner.dm b/code/modules/wiremod/components/utility/combiner.dm new file mode 100644 index 0000000000..af2bfc0748 --- /dev/null +++ b/code/modules/wiremod/components/utility/combiner.dm @@ -0,0 +1,46 @@ +/** + * # Combiner Component + * + * Combines multiple inputs into 1 output port. + */ +/obj/item/circuit_component/combiner + display_name = "Combiner" + display_desc = "A component that combines multiple inputs to provide 1 output." + + /// The amount of input ports to have + var/input_port_amount = 4 + + var/datum/port/output/output_port + + var/current_type + +/obj/item/circuit_component/combiner/populate_options() + var/static/component_options = list( + PORT_TYPE_ANY, + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + PORT_TYPE_SIGNAL, + ) + options = component_options + +/obj/item/circuit_component/combiner/Initialize() + . = ..() + current_type = current_option + for(var/port_id in 1 to input_port_amount) + var/letter = ascii2text(text2ascii("A") + (port_id-1)) + add_input_port(letter, current_option) + output_port = add_output_port("Output", current_option) + +/obj/item/circuit_component/combiner/input_received(datum/port/input/port) + . = ..() + if(current_type != current_option) + current_type = current_option + for(var/datum/port/input/input_port as anything in input_ports) + input_port.set_datatype(current_type) + output_port.set_datatype(current_type) + + if(. || !port) + return TRUE + output_port.set_output(port.input_value) diff --git a/code/modules/wiremod/components/utility/delay.dm b/code/modules/wiremod/components/utility/delay.dm index 4225c6d408..4978187ff2 100644 --- a/code/modules/wiremod/components/utility/delay.dm +++ b/code/modules/wiremod/components/utility/delay.dm @@ -22,12 +22,6 @@ output = add_output_port("Result", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/delay/Destroy() - output = null - trigger = null - delay_amount = null - return ..() - /obj/item/circuit_component/delay/input_received(datum/port/input/port) . = ..() if(.) diff --git a/code/modules/wiremod/components/utility/multiplexer.dm b/code/modules/wiremod/components/utility/multiplexer.dm index 03ab8bc70c..80e9ce9952 100644 --- a/code/modules/wiremod/components/utility/multiplexer.dm +++ b/code/modules/wiremod/components/utility/multiplexer.dm @@ -41,13 +41,6 @@ multiplexer_inputs += add_input_port("Port [port_id]", current_type) output_port = add_output_port("Output", current_type) -/obj/item/circuit_component/multiplexer/Destroy() - output_port = null - multiplexer_inputs.Cut() - multiplexer_inputs = null - return ..() - - /obj/item/circuit_component/multiplexer/input_received(datum/port/input/port) . = ..() if(current_type != current_option) diff --git a/code/modules/wiremod/duplicator.dm b/code/modules/wiremod/duplicator.dm new file mode 100644 index 0000000000..d754683320 --- /dev/null +++ b/code/modules/wiremod/duplicator.dm @@ -0,0 +1,194 @@ +#define LOG_ERROR(list, error) if(list) { list.Add(error) } + +// Determines if a port can have a predefined input value if it is of this type. +GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( + PORT_TYPE_NUMBER, + PORT_TYPE_STRING, + PORT_TYPE_ANY, +)) + +/// Loads a circuit based on json data at a location. Can also load usb connections, such as arrest consoles. +/obj/item/integrated_circuit/proc/load_circuit_data(json_data, list/errors) + var/list/general_data = json_decode(json_data) + + if(!general_data) + LOG_ERROR(errors, "Invalid json format!") + return + + if(general_data["display_name"]) + set_display_name(general_data["display_name"]) + + var/list/circuit_data = general_data["components"] + var/list/identifiers_to_circuit = list() + for(var/identifier in circuit_data) + var/list/component_data = circuit_data[identifier] + var/type = text2path(component_data["type"]) + if(!ispath(type, /obj/item/circuit_component)) + LOG_ERROR(errors, "Invalid path for circuit component, expected [/obj/item/circuit_component], got [type]") + continue + var/obj/item/circuit_component/component = load_component(type) + identifiers_to_circuit[identifier] = component + component.load_data_from_list(component_data) + + var/list/external_objects = general_data["external_objects"] + for(var/identifier in external_objects) + var/list/object_data = external_objects[identifier] + var/type = text2path(object_data["type"]) + if(!ispath(type)) + LOG_ERROR(errors, "Invalid path for external object, expected a path, got [type]") + continue + var/atom/movable/object = new type(drop_location()) + var/list/connected_components = list() + for(var/component_id in object_data["connected_components"]) + var/obj/item/circuit_component/component = identifiers_to_circuit[component_id] + if(!component) + continue + connected_components += component + SEND_SIGNAL(object, COMSIG_MOVABLE_CIRCUIT_LOADED, src, connected_components) + + for(var/identifier in identifiers_to_circuit) + var/obj/item/circuit_component/component = identifiers_to_circuit[identifier] + var/list/component_data = circuit_data[identifier] + + var/list/connections = component_data["connections"] + for(var/port_name in connections) + var/datum/port/input/port + var/list/connection_data = connections[port_name] + for(var/datum/port/input/port_to_check as anything in component.input_ports) + if(port_to_check.name == port_name) + port = port_to_check + break + + if(!port) + LOG_ERROR(errors, "Port [port_name] not found for [component.type].") + continue + + if(connection_data["stored_data"]) + if(!(port.datatype in GLOB.circuit_dupe_whitelisted_types)) + continue + port.set_input(connection_data["stored_data"]) + continue + + var/obj/item/circuit_component/connected_component = identifiers_to_circuit[connection_data["component_id"]] + if(!connected_component) + LOG_ERROR(errors, "No connected component found for [component.type] for port [connection_data["port_name"]]. (connected component identifier: [connection_data["component_id"]])") + continue + + var/datum/port/output/output_port + var/output_port_name = connection_data["port_name"] + for(var/datum/port/output/port_to_check as anything in connected_component.output_ports) + if(port_to_check.name == output_port_name) + output_port = port_to_check + break + + if(!output_port) + LOG_ERROR(errors, "No output port found for [component.type] for port [output_port_name] on component [connected_component.type]") + continue + + port.register_output_port(output_port) + +#undef LOG_ERROR + +/// Converts a circuit into json. +/obj/item/integrated_circuit/proc/convert_to_json() + var/list/circuit_to_identifiers = list() + var/list/identifiers = list() + var/list/external_objects = list() // Objects that are connected to a component. These objects will be linked to the components. + for(var/obj/item/circuit_component/component as anything in attached_components) + var/identifier = "[component.type][length(identifiers)]" + identifiers += identifier + circuit_to_identifiers[component] = identifier + var/list/objects = list() + SEND_SIGNAL(component, COMSIG_CIRCUIT_COMPONENT_SAVE, objects) + + for(var/atom/movable/object as anything in objects) + if(object in external_objects) + external_objects[object] += identifier + continue + external_objects[object] = list(identifier) + + var/list/circuit_data = list() + for(var/obj/item/circuit_component/component as anything in circuit_to_identifiers) + var/identifier = circuit_to_identifiers[component] + var/list/component_data = list() + + component_data["type"] = component.type + + var/list/connections = list() + for(var/datum/port/input/port as anything in component.input_ports) + var/list/connection_data = list() + var/datum/port/output/output_port = port.connected_port + if(!output_port) + if(isnull(port.input_value) || !(port.datatype in GLOB.circuit_dupe_whitelisted_types)) + continue + connection_data["stored_data"] = port.input_value + connections[port.name] = connection_data + continue + connection_data["component_id"] = circuit_to_identifiers[output_port.connected_component] + connection_data["port_name"] = output_port.name + connections[port.name] = connection_data + component_data["connections"] = connections + + component.save_data_to_list(component_data) + circuit_data[identifier] = component_data + + var/external_objects_key = list() + for(var/atom/movable/object as anything in external_objects) + var/list/new_data = list() + new_data["type"] = object.type + new_data["connected_components"] = external_objects[object] + external_objects_key["[object.type][length(external_objects_key)]"] = new_data + + var/list/general_data = list() + general_data["components"] = circuit_data + general_data["external_objects"] = external_objects_key + general_data["display_name"] = display_name + + return json_encode(general_data) + +/obj/item/integrated_circuit/proc/load_component(type) + var/obj/item/circuit_component/component = new type(src) + add_component(component) + return component + +/// Saves data to a list. Shouldn't be used unless you are quite literally saving the data of a component to a list. Input value is the list to save the data to +/obj/item/circuit_component/proc/save_data_to_list(list/component_data) + component_data["rel_x"] = rel_x + component_data["rel_y"] = rel_y + + component_data["option"] = current_option + +/// Loads data from a list +/obj/item/circuit_component/proc/load_data_from_list(list/component_data) + rel_x = component_data["rel_x"] + rel_y = component_data["rel_y"] + + set_option(component_data["option"]) + +/client/proc/load_circuit() + set name = "Load Circuit" + set category = "Admin.Fun" + + if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) + return + + var/list/errors = list() + + var/option = alert(usr, "Load by file or direct input?", "Load by file or string", "File", "Direct Input") + var/txt + switch(option) + if("File") + txt = file2text(input(usr, "Input File") as file|null) + if("Direct Input") + txt = input(usr, "Input JSON", "Input JSON") as text|null + + if(!txt) + return + + var/obj/item/integrated_circuit/loaded/circuit = new(mob.drop_location()) + circuit.load_circuit_data(txt, errors) + + if(length(errors)) + to_chat(src, span_warning("The following errors were found whilst compiling the circuit data:")) + for(var/error in errors) + to_chat(src, span_warning(error)) diff --git a/code/modules/wiremod/integrated_circuit.dm b/code/modules/wiremod/integrated_circuit.dm index 315f33b760..d60f9996fe 100644 --- a/code/modules/wiremod/integrated_circuit.dm +++ b/code/modules/wiremod/integrated_circuit.dm @@ -274,6 +274,8 @@ .["examined_rel_x"] = examined_rel_x .["examined_rel_y"] = examined_rel_y + .["is_admin"] = check_rights_for(user.client, R_ADMIN) + /obj/item/integrated_circuit/ui_host(mob/user) if(shell) return shell @@ -458,6 +460,15 @@ if("remove_examined_component") examined_component = null . = TRUE + if("save_circuit") + var/client/saver = usr.client + if(!check_rights_for(saver, R_ADMIN)) + return + var/temp_file = file("data/CircuitDownloadTempFile") + fdel(temp_file) + WRITE_FILE(temp_file, convert_to_json()) + DIRECT_OUTPUT(saver, ftp(temp_file, "[display_name || "circuit"].json")) + . = TRUE /obj/item/integrated_circuit/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/usb_cable, mob/user) SIGNAL_HANDLER diff --git a/code/modules/wiremod/port.dm b/code/modules/wiremod/port.dm index eb5c0ad730..7c25c53da3 100644 --- a/code/modules/wiremod/port.dm +++ b/code/modules/wiremod/port.dm @@ -76,6 +76,7 @@ RegisterSignal(value, COMSIG_PARENT_QDELETING, .proc/on_value_qdeleting) src.value = value +<<<<<<< HEAD /** * Updates the value of the input * @@ -87,6 +88,19 @@ set_value(value) if(trigger) TRIGGER_CIRCUIT_COMPONENT(connected_component, src) +======= + switch(datatype) + if(PORT_TYPE_STRING) + // So that they can't easily get the name like this. + if(isatom(value_to_convert)) + return PORT_TYPE_ATOM + else + return copytext("[value_to_convert]", 1, PORT_MAX_STRING_LENGTH) + if(PORT_TYPE_NUMBER) + if(!istext(value_to_convert) && !isnum(value_to_convert)) + return null + return text2num(value_to_convert) +>>>>>>> ec9ee7eb00 /datum/port/output/proc/set_output(value) set_value(value) diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm index 4f988ebd63..b31611187f 100644 --- a/code/modules/wiremod/shell/airlock.dm +++ b/code/modules/wiremod/shell/airlock.dm @@ -80,20 +80,6 @@ bolted = add_output_port("Bolted", PORT_TYPE_SIGNAL) unbolted = add_output_port("Unbolted", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/airlock/Destroy() - bolt = null - unbolt = null - open = null - close = null - is_open = null - is_bolted = null - opened = null - closed = null - bolted = null - unbolted = null - attached_airlock = null - return ..() - /obj/item/circuit_component/airlock/register_shell(atom/movable/shell) . = ..() if(istype(shell, /obj/machinery/door/airlock)) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 5c3a392395..8dcd179eef 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -61,11 +61,7 @@ signal = add_output_port("Signal", PORT_TYPE_SIGNAL) /obj/item/circuit_component/bci_action/Destroy() - button_name = null - signal = null - QDEL_NULL(bci_action) - return ..() /obj/item/circuit_component/bci_action/populate_options() @@ -132,14 +128,19 @@ update_action() /obj/item/circuit_component/bci_action/proc/update_action() +<<<<<<< HEAD bci_action.name = button_name.value bci_action.button_icon_state = "nanite_[replacetextEx(lowertext(current_option), " ", "_")]" +======= + bci_action.name = button_name.input_value + bci_action.button_icon_state = "bci_[replacetextEx(lowertext(current_option), " ", "_")]" +>>>>>>> ec9ee7eb00 /datum/action/innate/bci_action name = "Action" icon_icon = 'icons/mob/actions/actions_items.dmi' check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "nanite_power" + button_icon_state = "bci_power" var/obj/item/circuit_component/bci_action/circuit_component @@ -181,14 +182,6 @@ /obj/item/circuit_component/bci_core/Destroy() QDEL_NULL(charge_action) - - message = null - send_message_signal = null - - user_port = null - - user = null - return ..() /obj/item/circuit_component/bci_core/register_shell(atom/movable/shell) @@ -317,9 +310,9 @@ name = "brain-computer interface manipulation chamber" desc = "A machine that, when given a brain-computer interface, will implant it into an occupant. Otherwise, will remove any brain-computer interfaces they already have." circuit = /obj/item/circuitboard/machine/bci_implanter - icon = 'icons/obj/machines/nanite_chamber.dmi' - icon_state = "nanite_chamber" - base_icon_state = "nanite_chamber" + icon = 'icons/obj/machines/bci_implanter.dmi' + icon_state = "bci_implanter" + base_icon_state = "bci_implanter" layer = ABOVE_WINDOW_LAYER use_power = IDLE_POWER_USE anchored = TRUE diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index d1877771e4..169e8e1193 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -31,10 +31,6 @@ . = ..() signal = add_output_port("Signal", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/compact_remote/Destroy() - signal = null - return ..() - /obj/item/circuit_component/compact_remote/register_shell(atom/movable/shell) RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index c70493b7fd..6b9084bd33 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -36,12 +36,6 @@ alt = add_output_port("Alternate Signal", PORT_TYPE_SIGNAL) right = add_output_port("Extra Signal", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/controller/Destroy() - signal = null - alt = null - right = null - return ..() - /obj/item/circuit_component/controller/register_shell(atom/movable/shell) RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger) RegisterSignal(shell, COMSIG_CLICK_ALT, .proc/send_alternate_signal) diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 38a2c82a15..1bc7412263 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -79,11 +79,6 @@ attached_bot.add_money(-to_dispense) new /obj/item/holochip(drop_location(), to_dispense) -/obj/item/circuit_component/money_dispenser/Destroy() - dispense_amount = null - attached_bot = null - return ..() - /obj/item/circuit_component/money_bot display_name = "Money Bot" var/obj/structure/money_bot/attached_bot @@ -119,13 +114,6 @@ attached_bot = null return ..() -/obj/item/circuit_component/money_bot/Destroy() - attached_bot = null - total_money = null - money_input = null - money_trigger = null - return ..() - /obj/item/circuit_component/money_bot/proc/handle_money_insert(atom/source, obj/item/item, mob/living/attacker) SIGNAL_HANDLER if(!attached_bot || !iscash(item)) diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index a8217f62a2..470ba23865 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -41,12 +41,6 @@ attacking = add_output_port("Scanned Entity", PORT_TYPE_ATOM) signal = add_output_port("Scanned", PORT_TYPE_SIGNAL) -/obj/item/circuit_component/wiremod_scanner/Destroy() - attacker = null - attacking = null - signal = null - return ..() - /obj/item/circuit_component/wiremod_scanner/register_shell(atom/movable/shell) RegisterSignal(shell, COMSIG_ITEM_AFTERATTACK, .proc/handle_afterattack) diff --git a/html/changelogs/AutoChangeLog-pr-60095.yml b/html/changelogs/AutoChangeLog-pr-60095.yml deleted file mode 100644 index d0c1021cb9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60095.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSmallBlue" -delete-after: True -changes: - - expansion: "Adds the pathfinding component." diff --git a/html/changelogs/AutoChangeLog-pr-60139.yml b/html/changelogs/AutoChangeLog-pr-60139.yml deleted file mode 100644 index f0c7b35bb7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60139.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Sentient monkeys are no longer subsceptible to being knocked over by mobs in their way." diff --git a/html/changelogs/AutoChangeLog-pr-60157.yml b/html/changelogs/AutoChangeLog-pr-60157.yml new file mode 100644 index 0000000000..66fc0470d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60157.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - expansion: "Monkeys can now retaliate against xenomorph and animal attacks." diff --git a/html/changelogs/AutoChangeLog-pr-60314.yml b/html/changelogs/AutoChangeLog-pr-60314.yml new file mode 100644 index 0000000000..0cdf2e86d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60314.yml @@ -0,0 +1,5 @@ +author: "LemonInTheDark" +delete-after: True +changes: + - rscadd: "Getting hit point blank by an explosion will shake your screen a good bit more then before" + - qol: "\"Shakes\" from explosions or hitting things really hard will look a bit smoother now" diff --git a/html/changelogs/AutoChangeLog-pr-60338.yml b/html/changelogs/AutoChangeLog-pr-60338.yml deleted file mode 100644 index 3a0ed00b32..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60338.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mothblocks" -delete-after: True -changes: - - rscadd: "Added brain-computer interface circuit shells." diff --git a/html/changelogs/AutoChangeLog-pr-60392.yml b/html/changelogs/AutoChangeLog-pr-60392.yml deleted file mode 100644 index 48c131d510..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60392.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Wallem" -delete-after: True -changes: - - bugfix: "Only foods which are created at mapload require player interaction in order to decompose." diff --git a/html/changelogs/AutoChangeLog-pr-60395.yml b/html/changelogs/AutoChangeLog-pr-60395.yml deleted file mode 100644 index ddc9e3464e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60395.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Domitius" -delete-after: True -changes: - - bugfix: "One spraycan can no longer colour every light on the station." diff --git a/html/changelogs/AutoChangeLog-pr-60398.yml b/html/changelogs/AutoChangeLog-pr-60398.yml deleted file mode 100644 index 24cccea7f1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60398.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Nari Harimoto" -delete-after: True -changes: - - bugfix: "AI can now no longer be pushed even when anchored, only when dead or unanchored can it be pushed (grab a dead core to swap places)" - - bugfix: "borgs can now no longer be pushed when in combat mode and alive, you will always swap places with dead borg corpses." diff --git a/html/changelogs/AutoChangeLog-pr-60408.yml b/html/changelogs/AutoChangeLog-pr-60408.yml deleted file mode 100644 index 7318e551c8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60408.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothymtorres" -delete-after: True -changes: - - expansion: "Added xeno plasma statue" diff --git a/html/changelogs/AutoChangeLog-pr-60414.yml b/html/changelogs/AutoChangeLog-pr-60414.yml deleted file mode 100644 index e8de37c196..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60414.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "PositiveEntropy, tf-4" -delete-after: True -changes: - - imageadd: "Thanks to a collaboration between the frontier sector and the core sector, the parade jackets now boast new and varied apperances for all to enjoy, with a new parade jacket releasing for the Head of Security!" - - imageadd: "In no short effort than the finest of tailors, the captain's hat, the centcom hat, the captain's jumpsuit and the captain's carapace now have finer gold trims and the finest quality leather available, making them more vibrant for all!" - - expansion: "To utilize the new variants, simply alt-click a parade jacket, or a centcom commander coat. You can also obtain a Head of Security parade jacket by simply accessing the Head of Security's closet!" diff --git a/html/changelogs/AutoChangeLog-pr-60419.yml b/html/changelogs/AutoChangeLog-pr-60419.yml deleted file mode 100644 index 4dd78b494c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60419.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "dragomagol" -delete-after: True -changes: - - bugfix: "lavaland syndie base and seed vault no longer explode into green tiles" diff --git a/html/changelogs/AutoChangeLog-pr-60420.yml b/html/changelogs/AutoChangeLog-pr-60420.yml deleted file mode 100644 index 28a9ac8622..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60420.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - code_imp: "bless aware hud is no longer hardcoded for chaplains" diff --git a/html/changelogs/AutoChangeLog-pr-60425.yml b/html/changelogs/AutoChangeLog-pr-60425.yml deleted file mode 100644 index 66a26bd051..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60425.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tralezab" -delete-after: True -changes: - - spellcheck: "Tiger Cooperative Traitors now have a slightly better uplink information flavor text" diff --git a/html/changelogs/AutoChangeLog-pr-60428.yml b/html/changelogs/AutoChangeLog-pr-60428.yml deleted file mode 100644 index 7f5a5416c3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60428.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Wayland-Smithy" -delete-after: True -changes: - - bugfix: "Fixed Chat Highlighting working on your own Binary messages." diff --git a/html/changelogs/AutoChangeLog-pr-60429.yml b/html/changelogs/AutoChangeLog-pr-60429.yml deleted file mode 100644 index 4f3ac6bc06..0000000000 --- a/html/changelogs/AutoChangeLog-pr-60429.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Wayland-Smithy" -delete-after: True -changes: - - spellcheck: "Made the Doppler Array explosive sale message less wordy." diff --git a/html/changelogs/AutoChangeLog-pr-60433.yml b/html/changelogs/AutoChangeLog-pr-60433.yml new file mode 100644 index 0000000000..5b1c9a65a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60433.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - bugfix: "Fixed gas meters showing error icons before round starts and right before they are created" diff --git a/html/changelogs/AutoChangeLog-pr-60476.yml b/html/changelogs/AutoChangeLog-pr-60476.yml new file mode 100644 index 0000000000..e18e6faa6b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60476.yml @@ -0,0 +1,4 @@ +author: "tralezab code, paxilmaniac sprites" +delete-after: True +changes: + - expansion: "Added Trash Cannons. Find the recipe in maint!" diff --git a/html/changelogs/AutoChangeLog-pr-60483.yml b/html/changelogs/AutoChangeLog-pr-60483.yml new file mode 100644 index 0000000000..919bd133e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60483.yml @@ -0,0 +1,4 @@ +author: "Thunder12345" +delete-after: True +changes: + - code_imp: "Removes the misc ID trims file." diff --git a/html/changelogs/AutoChangeLog-pr-60492.yml b/html/changelogs/AutoChangeLog-pr-60492.yml new file mode 100644 index 0000000000..0384cd106b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60492.yml @@ -0,0 +1,4 @@ +author: "Watermelon914" +delete-after: True +changes: + - code_imp: "Removes some unnecessary code bloat from the circuit component files." diff --git a/html/changelogs/AutoChangeLog-pr-60498.yml b/html/changelogs/AutoChangeLog-pr-60498.yml new file mode 100644 index 0000000000..9ae603d2e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60498.yml @@ -0,0 +1,4 @@ +author: "timothymtorres" +delete-after: True +changes: + - bugfix: "Fixed pAI loudness booster to work when not in holoform" diff --git a/html/changelogs/AutoChangeLog-pr-60501.yml b/html/changelogs/AutoChangeLog-pr-60501.yml new file mode 100644 index 0000000000..238e2a8be1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-60501.yml @@ -0,0 +1,4 @@ +author: "AlinaStarkova" +delete-after: True +changes: + - bugfix: "Deltastations chapel disposals chute no longer chucks trash into departures" diff --git a/html/changelogs/archive/2021-07.yml b/html/changelogs/archive/2021-07.yml index 479c583dcd..bfdb40c9e7 100644 --- a/html/changelogs/archive/2021-07.yml +++ b/html/changelogs/archive/2021-07.yml @@ -793,3 +793,140 @@ timothymtorres: - bugfix: High Volume Vent Pump Layer 3 icon state to be correct - balance: Add musical instruments to maint loot list +2021-07-27: + Domitius: + - bugfix: One spraycan can no longer colour every light on the station. + Fikou: + - code_imp: bless aware hud is no longer hardcoded for chaplains + Ghommie: + - bugfix: Sentient monkeys are no longer subsceptible to being knocked over by mobs + in their way. + JohnFulpWillard: + - bugfix: Zombies no longer get permanently hungry. + Mothblocks: + - rscadd: Added brain-computer interface circuit shells. + Nari Harimoto: + - bugfix: AI can now no longer be pushed even when anchored, only when dead or unanchored + can it be pushed (grab a dead core to swap places) + - bugfix: borgs can now no longer be pushed when in combat mode and alive, you will + always swap places with dead borg corpses. + PositiveEntropy, tf-4: + - imageadd: Thanks to a collaboration between the frontier sector and the core sector, + the parade jackets now boast new and varied apperances for all to enjoy, with + a new parade jacket releasing for the Head of Security! + - imageadd: In no short effort than the finest of tailors, the captain's hat, the + centcom hat, the captain's jumpsuit and the captain's carapace now have finer + gold trims and the finest quality leather available, making them more vibrant + for all! + - expansion: To utilize the new variants, simply alt-click a parade jacket, or a + centcom commander coat. You can also obtain a Head of Security parade jacket + by simply accessing the Head of Security's closet! + TheSmallBlue: + - expansion: Adds the pathfinding component. + Thunder12345: + - code_imp: Killed the miscellaneous items file! + Wallem: + - bugfix: Only foods which are created at mapload require player interaction in + order to decompose. + Wayland-Smithy: + - spellcheck: Made the Doppler Array explosive sale message less wordy. + - bugfix: Fixed Chat Highlighting working on your own Binary messages. + dragomagol: + - bugfix: lavaland syndie base and seed vault no longer explode into green tiles + timothymtorres: + - expansion: Added xeno plasma statue + tralezab: + - spellcheck: Tiger Cooperative Traitors now have a slightly better uplink information + flavor text + - code_imp: killed the global vars misc file! +2021-07-28: + Cyberboss: + - bugfix: Fixed APC's using extreme amounts of power instantly + EuSouAFazer: + - expansion: Kilostation Medbay's solar now starts with a Space Carp that cannot + destroy stuff. + - expansion: Kilostation Security's solar now doesn't have a solar computer, instead + having an empty computer frame and the circuitboard nearby. There is also 2 + glass nearby as well. + - expansion: Kilostation Engineering's solar now starts partially built, with a + box with assembly and glass nearby. + Fikou: + - bugfix: the elite syndie suit now has the proper icons on its first equip + Guestify: + - bugfix: Replaces security newscasters with non security ones in non security rooms + on Tramstation + Kylerace: + - balance: tram is now twice as fast, pray it doesnt get faster + Wayland-Smithy: + - qol: Poll Candidates alerts no longer steal window focus, like ghost role rolls + and cult leadership votes. + - code_imp: Added an autofocus argument to tgui_alert, defaults on, that can be + used to prevent accidental inputs from surprise alerts when used. + ZephyrTFA: + - bugfix: Rust Heretics can once again benefit from rust + aaaa1023: + - bugfix: Removes stray coldroom area tile in cryogenics, medbay central tiles under + medical and snaking chapel office line on chapel walls on Metastation. + timothymtorres: + - bugfix: Fixed wallets not granting access for ID cards inside them. + timothymtorres, SomeoneYouProbablyKnow: + - expansion: Added a referee costume to autodrope and costume spawners + - imageadd: Added referee costume +2021-07-29: + EuSouAFazer: + - bugfix: Removed the duplicate QM stamp on Icebox + Fikou: + - admin: default instakill rifle doesnt delete itself + Ghilker: + - bugfix: HFR now properly take damage when overfilled with fuel + Ghommie: + - bugfix: Fixes ridden skateboards crashing back-to-back when bumping a dense atom + while another is behind them. + Greniza: + - bugfix: prisoner transport bags can now be cinched properly + - bugfix: syndicate prisoner transport bags now expel the expected amount of gas + due to an occupant's exhale + - spellcheck: makes cinching a PTB have proper pronouns according to an onlooker + Improvedname: + - balance: Construction bags fit once more in your pockets + Itseasytosee: + - qol: ghosts will no longer get fake virus alerts + Melbert: + - bugfix: Some things that wouldn't dispense themselves from smartfridges now will + properly give themselves up. Some examples include Roses, Nettles / Deathnettles, + and Salad of Edens. + - bugfix: The mapped sprite for GAGS Lizard Plushes works, now. Mappers rejoice. + - admin: Tray planted kudzu will now log in investigate -> botany instead of its + own file. + Mey-Ha-Zah, Fikou: + - imageadd: new sprites for the ash walker egg + Mothblocks: + - rscdel: Nanites have been removed. + Shroopy: + - bugfix: robots now work properly + Thunder12345: + - code_imp: Removes all misc files/folders from the projectiles module + Wallem: + - bugfix: Flowers now have a Natrual Insecticide gene which protects them from decomposition + upon harvest. + Watermelon914: + - expansion: Adds the module duplicator that allows people to duplicate their module + components so that they don't have to recreate the entire code again. + - admin: Added the ability to save/load integrated circuits. + - bugfix: Fixed carps being given orders without a friend via radial menu. + - bugfix: Fixed sentient carps being unridable because of the ai datum. + - bugfix: Fixed the launchpad usb connection not working with null x/y offset inputs. + itseasytosee: + - soundadd: There are now sounds for adjusting the pressure on a pneumatic cannon. + - qol: attacking disembodied brains now has animations and sounds. + - bugfix: constructs examine text color matches the rest of their theme. + - qol: Your gun will now actually spin around in your hand while gun-spinning + - bugfix: Certain non-magic ranged weapons will no longer "appear to have a magic + crystal installed" + - qol: Adds some on examine instructions for constructing a turret + tf-4: + - qol: dash items like the ninja katana now give a balloon alert instead of a chat + message + - bugfix: Meta medbay now has all its areas set correctly + timothymtorres: + - bugfix: Fixed spectral instruments spawn probability diff --git a/icons/effects/rust_overlay.dmi b/icons/effects/rust_overlay.dmi new file mode 100644 index 0000000000..02f745d07f Binary files /dev/null and b/icons/effects/rust_overlay.dmi differ diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index 9242e1f02a..5e947b4c8a 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi index 612100da7a..e761b19d0e 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 08c63adc04..366d8ae2a3 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi index 30750b216d..e721bb9748 100644 Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ diff --git a/icons/obj/atmospherics/pipes/meter.dmi b/icons/obj/atmospherics/pipes/meter.dmi index 2816d22f43..2aed35e065 100644 Binary files a/icons/obj/atmospherics/pipes/meter.dmi and b/icons/obj/atmospherics/pipes/meter.dmi differ diff --git a/icons/obj/cannons.dmi b/icons/obj/cannons.dmi new file mode 100644 index 0000000000..f0e37c5310 Binary files /dev/null and b/icons/obj/cannons.dmi differ diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi index 91a83560e8..1449c24dab 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi index b25bb95c1c..effab4e60a 100644 Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 535232587d..c3c2c6a702 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 303035439b..191b6ca5cc 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/guns/projectiles.dmi b/icons/obj/guns/projectiles.dmi index bb3c2ad2d9..28546c5576 100644 Binary files a/icons/obj/guns/projectiles.dmi and b/icons/obj/guns/projectiles.dmi differ diff --git a/icons/obj/machines/nanite_chamber.dmi b/icons/obj/machines/bci_implanter.dmi similarity index 96% rename from icons/obj/machines/nanite_chamber.dmi rename to icons/obj/machines/bci_implanter.dmi index f42dcd4848..2b76bfb508 100644 Binary files a/icons/obj/machines/nanite_chamber.dmi and b/icons/obj/machines/bci_implanter.dmi differ diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi index d7ba433ce3..dc7f0c24e7 100644 Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 1878898028..e739ad63c7 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index b3443c0119..9d62d4cc58 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/wiremod_fab.dmi b/icons/obj/wiremod_fab.dmi index d41ec99ce5..e0b1254025 100644 Binary files a/icons/obj/wiremod_fab.dmi and b/icons/obj/wiremod_fab.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index 69f2539109..5349d33e72 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/icons/turf/walls/wall.dmi b/icons/turf/walls/wall.dmi index 4e7efd1e23..651227fe8d 100644 Binary files a/icons/turf/walls/wall.dmi and b/icons/turf/walls/wall.dmi differ diff --git a/strings/locations.json b/strings/locations.json index 27bba0ba6c..0696718e19 100644 --- a/strings/locations.json +++ b/strings/locations.json @@ -58,7 +58,6 @@ "Mining Office", "Morgue", "Morgue Maintenance", - "Nanite Lab", "Primary Tool Storage", "Prison Wing", "Prisoner Education Chamber", diff --git a/tgstation.dme b/tgstation.dme index ecee08afae..80e0960de5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -54,6 +54,7 @@ #include "code\__DEFINES\diseases.dm" #include "code\__DEFINES\DNA.dm" #include "code\__DEFINES\do_afters.dm" +#include "code\__DEFINES\drone.dm" #include "code\__DEFINES\dye_keys.dm" #include "code\__DEFINES\dynamic.dm" #include "code\__DEFINES\economy.dm" @@ -100,13 +101,13 @@ #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" -#include "code\__DEFINES\nanites.dm" #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\nitrile.dm" #include "code\__DEFINES\obj_flags.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" #include "code\__DEFINES\plumbing.dm" +#include "code\__DEFINES\polls.dm" #include "code\__DEFINES\power.dm" #include "code\__DEFINES\preferences.dm" #include "code\__DEFINES\processing.dm" @@ -217,18 +218,18 @@ #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" #include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_globalvars\admin.dm" #include "code\_globalvars\bitfields.dm" #include "code\_globalvars\configuration.dm" #include "code\_globalvars\game_modes.dm" #include "code\_globalvars\genetics.dm" #include "code\_globalvars\logging.dm" -#include "code\_globalvars\misc.dm" #include "code\_globalvars\regexes.dm" #include "code\_globalvars\religion.dm" #include "code\_globalvars\tgui.dm" +#include "code\_globalvars\time_vars.dm" #include "code\_globalvars\traits.dm" #include "code\_globalvars\lists\achievements.dm" -#include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\ambience.dm" #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\color.dm" @@ -306,6 +307,7 @@ #include "code\controllers\subsystem\achievements.dm" #include "code\controllers\subsystem\addiction.dm" #include "code\controllers\subsystem\adjacent_air.dm" +#include "code\controllers\subsystem\ai_controllers.dm" #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\assets.dm" @@ -377,14 +379,13 @@ #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\acid.dm" -#include "code\controllers\subsystem\processing\ai_controllers.dm" +#include "code\controllers\subsystem\processing\ai_behaviors.dm" #include "code\controllers\subsystem\processing\ai_movement.dm" #include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" #include "code\controllers\subsystem\processing\fields.dm" #include "code\controllers\subsystem\processing\fluids.dm" #include "code\controllers\subsystem\processing\instruments.dm" -#include "code\controllers\subsystem\processing\nanites.dm" #include "code\controllers\subsystem\processing\networks.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\processing.dm" @@ -451,19 +452,25 @@ #include "code\datums\actions\beam_rifle.dm" #include "code\datums\ai\_ai_behavior.dm" #include "code\datums\ai\_ai_controller.dm" +#include "code\datums\ai\_ai_planning_subtree.dm" #include "code\datums\ai\_item_behaviors.dm" #include "code\datums\ai\generic_actions.dm" #include "code\datums\ai\telegraph_effects.dm" #include "code\datums\ai\bane\bane_behaviors.dm" #include "code\datums\ai\bane\bane_controller.dm" +#include "code\datums\ai\bane\bane_subtrees.dm" #include "code\datums\ai\cursed\cursed_behaviors.dm" #include "code\datums\ai\cursed\cursed_controller.dm" +#include "code\datums\ai\cursed\cursed_subtrees.dm" #include "code\datums\ai\dog\dog_behaviors.dm" #include "code\datums\ai\dog\dog_controller.dm" +#include "code\datums\ai\dog\dog_subtrees.dm" #include "code\datums\ai\hauntium\haunted_controller.dm" +#include "code\datums\ai\hauntium\hauntium_subtrees.dm" #include "code\datums\ai\hostile\hostile_controller.dm" #include "code\datums\ai\monkey\monkey_behaviors.dm" #include "code\datums\ai\monkey\monkey_controller.dm" +#include "code\datums\ai\monkey\monkey_subtrees.dm" #include "code\datums\ai\movement\_ai_movement.dm" #include "code\datums\ai\movement\ai_movement_basic_avoidance.dm" #include "code\datums\ai\movement\ai_movement_dumb.dm" @@ -472,6 +479,7 @@ #include "code\datums\ai\objects\vending_machines\vending_machine_controller.dm" #include "code\datums\ai\robot_customer\robot_customer_behaviors.dm" #include "code\datums\ai\robot_customer\robot_customer_controller.dm" +#include "code\datums\ai\robot_customer\robot_customer_subtrees.dm" #include "code\datums\announcers\_announcer.dm" #include "code\datums\announcers\default_announcer.dm" #include "code\datums\announcers\intern_announcer.dm" @@ -515,7 +523,6 @@ #include "code\datums\components\electrified_buckle.dm" #include "code\datums\components\embedded.dm" #include "code\datums\components\explodable.dm" -#include "code\datums\components\footstep.dm" #include "code\datums\components\forensics.dm" #include "code\datums\components\fullauto.dm" #include "code\datums\components\gas_leaker.dm" @@ -530,7 +537,6 @@ #include "code\datums\components\infective.dm" #include "code\datums\components\itempicky.dm" #include "code\datums\components\jousting.dm" -#include "code\datums\components\kneecapping.dm" #include "code\datums\components\knockback.dm" #include "code\datums\components\knockoff.dm" #include "code\datums\components\label.dm" @@ -543,7 +549,6 @@ #include "code\datums\components\mirage_border.dm" #include "code\datums\components\mirv.dm" #include "code\datums\components\mood.dm" -#include "code\datums\components\nanites.dm" #include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\omen.dm" #include "code\datums\components\orbiter.dm" @@ -573,7 +578,6 @@ #include "code\datums\components\spawner.dm" #include "code\datums\components\spill.dm" #include "code\datums\components\spinny.dm" -#include "code\datums\components\spooky.dm" #include "code\datums\components\squeak.dm" #include "code\datums\components\stationloving.dm" #include "code\datums\components\stationstuck.dm" @@ -674,7 +678,6 @@ #include "code\datums\diseases\advance\symptoms\headache.dm" #include "code\datums\diseases\advance\symptoms\heal.dm" #include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\nanites.dm" #include "code\datums\diseases\advance\symptoms\narcolepsy.dm" #include "code\datums\diseases\advance\symptoms\oxygen.dm" #include "code\datums\diseases\advance\symptoms\sensory.dm" @@ -716,9 +719,11 @@ #include "code\datums\elements\empprotection.dm" #include "code\datums\elements\eyestab.dm" #include "code\datums\elements\firestacker.dm" +#include "code\datums\elements\footstep.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\haunted.dm" #include "code\datums\elements\item_scaling.dm" +#include "code\datums\elements\kneecapping.dm" #include "code\datums\elements\kneejerk.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\light_eaten.dm" @@ -736,6 +741,7 @@ #include "code\datums\elements\simple_flying.dm" #include "code\datums\elements\skittish.dm" #include "code\datums\elements\snail_crawl.dm" +#include "code\datums\elements\spooky.dm" #include "code\datums\elements\squashable.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\strippable.dm" @@ -767,10 +773,11 @@ #include "code\datums\helper_datums\stack_end_detector.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\id_trim\_id_trim.dm" +#include "code\datums\id_trim\admin.dm" #include "code\datums\id_trim\centcom.dm" #include "code\datums\id_trim\families.dm" #include "code\datums\id_trim\jobs.dm" -#include "code\datums\id_trim\misc.dm" +#include "code\datums\id_trim\outfits.dm" #include "code\datums\id_trim\ruins.dm" #include "code\datums\id_trim\syndicate.dm" #include "code\datums\keybinding\_defines.dm" @@ -1144,12 +1151,14 @@ #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\body_egg.dm" #include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\bouquets.dm" #include "code\game\objects\items\broom.dm" #include "code\game\objects\items\candle.dm" #include "code\game\objects\items\cardboard_cutouts.dm" #include "code\game\objects\items\cards_ids.dm" #include "code\game\objects\items\chainsaw.dm" #include "code\game\objects\items\charter.dm" +#include "code\game\objects\items\choice_beacon.dm" #include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\chrono_eraser.dm" #include "code\game\objects\items\cigs_lighters.dm" @@ -1176,6 +1185,7 @@ #include "code\game\objects\items\flamethrower.dm" #include "code\game\objects\items\gift.dm" #include "code\game\objects\items\granters.dm" +#include "code\game\objects\items\gun_maintenance.dm" #include "code\game\objects\items\hand_items.dm" #include "code\game\objects\items\handcuffs.dm" #include "code\game\objects\items\his_grace.dm" @@ -1189,7 +1199,6 @@ #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\mail.dm" #include "code\game\objects\items\manuals.dm" -#include "code\game\objects\items\miscellaneous.dm" #include "code\game\objects\items\mop.dm" #include "code\game\objects\items\paint.dm" #include "code\game\objects\items\paiwire.dm" @@ -1213,6 +1222,7 @@ #include "code\game\objects\items\shrapnel.dm" #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\singularityhammer.dm" +#include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" #include "code\game\objects\items\stunbaton.dm" #include "code\game\objects\items\tail_pin.dm" @@ -1224,6 +1234,7 @@ #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\vending_items.dm" +#include "code\game\objects\items\virgin_mary.dm" #include "code\game\objects\items\wayfinding.dm" #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" @@ -1332,7 +1343,6 @@ #include "code\game\objects\items\robot\robot_upgrades.dm" #include "code\game\objects\items\stacks\ammonia_crystals.dm" #include "code\game\objects\items\stacks\bscrystal.dm" -#include "code\game\objects\items\stacks\cannonballs.dm" #include "code\game\objects\items\stacks\cash.dm" #include "code\game\objects\items\stacks\license_plates.dm" #include "code\game\objects\items\stacks\medical.dm" @@ -1387,7 +1397,6 @@ #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsigns.dm" #include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\cannon.dm" #include "code\game\objects\structures\chess.dm" #include "code\game\objects\structures\destructible_structures.dm" #include "code\game\objects\structures\displaycase.dm" @@ -1453,6 +1462,9 @@ #include "code\game\objects\structures\beds_chairs\chair.dm" #include "code\game\objects\structures\beds_chairs\pew.dm" #include "code\game\objects\structures\beds_chairs\sofa.dm" +#include "code\game\objects\structures\cannons\cannon.dm" +#include "code\game\objects\structures\cannons\cannon_instructions.dm" +#include "code\game\objects\structures\cannons\cannonballs.dm" #include "code\game\objects\structures\construction_console\construction_actions.dm" #include "code\game\objects\structures\construction_console\construction_console.dm" #include "code\game\objects\structures\construction_console\construction_console_aux.dm" @@ -3082,8 +3094,9 @@ #include "code\modules\projectiles\ammunition\ballistic\smg.dm" #include "code\modules\projectiles\ammunition\ballistic\sniper.dm" #include "code\modules\projectiles\ammunition\caseless\_caseless.dm" +#include "code\modules\projectiles\ammunition\caseless\energy.dm" #include "code\modules\projectiles\ammunition\caseless\foam.dm" -#include "code\modules\projectiles\ammunition\caseless\misc.dm" +#include "code\modules\projectiles\ammunition\caseless\harpoon.dm" #include "code\modules\projectiles\ammunition\caseless\rocket.dm" #include "code\modules\projectiles\ammunition\energy\_energy.dm" #include "code\modules\projectiles\ammunition\energy\ebow.dm" @@ -3110,7 +3123,7 @@ #include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" #include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" #include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" +#include "code\modules\projectiles\boxes_magazines\internal\meathook.dm" #include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" #include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" #include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" @@ -3119,12 +3132,14 @@ #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\ballistic\automatic.dm" +#include "code\modules\projectiles\guns\ballistic\bow.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" #include "code\modules\projectiles\guns\ballistic\pistol.dm" #include "code\modules\projectiles\guns\ballistic\revolver.dm" #include "code\modules\projectiles\guns\ballistic\rifle.dm" #include "code\modules\projectiles\guns\ballistic\shotgun.dm" #include "code\modules\projectiles\guns\ballistic\toy.dm" +#include "code\modules\projectiles\guns\energy\beam_rifle.dm" #include "code\modules\projectiles\guns\energy\dueling.dm" #include "code\modules\projectiles\guns\energy\energy_gun.dm" #include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" @@ -3136,18 +3151,16 @@ #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\magic\staff.dm" #include "code\modules\projectiles\guns\magic\wand.dm" -#include "code\modules\projectiles\guns\misc\beam_rifle.dm" -#include "code\modules\projectiles\guns\misc\blastcannon.dm" -#include "code\modules\projectiles\guns\misc\bow.dm" -#include "code\modules\projectiles\guns\misc\chem_gun.dm" -#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" -#include "code\modules\projectiles\guns\misc\medbeam.dm" -#include "code\modules\projectiles\guns\misc\syringe_gun.dm" +#include "code\modules\projectiles\guns\special\blastcannon.dm" +#include "code\modules\projectiles\guns\special\chem_gun.dm" +#include "code\modules\projectiles\guns\special\grenade_launcher.dm" +#include "code\modules\projectiles\guns\special\medbeam.dm" +#include "code\modules\projectiles\guns\special\syringe_gun.dm" #include "code\modules\projectiles\projectile\beams.dm" #include "code\modules\projectiles\projectile\bullets.dm" #include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\bullets\_incendiary.dm" -#include "code\modules\projectiles\projectile\bullets\cannon.dm" +#include "code\modules\projectiles\projectile\bullets\cannonball.dm" #include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" #include "code\modules\projectiles\projectile\bullets\grenade.dm" @@ -3160,9 +3173,10 @@ #include "code\modules\projectiles\projectile\bullets\sniper.dm" #include "code\modules\projectiles\projectile\bullets\special.dm" #include "code\modules\projectiles\projectile\energy\_energy.dm" +#include "code\modules\projectiles\projectile\energy\decloner.dm" #include "code\modules\projectiles\projectile\energy\ebow.dm" -#include "code\modules\projectiles\projectile\energy\misc.dm" #include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\ninja.dm" #include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" #include "code\modules\projectiles\projectile\energy\stun.dm" #include "code\modules\projectiles\projectile\energy\tesla.dm" @@ -3280,7 +3294,6 @@ #include "code\modules\research\designs\medical_designs.dm" #include "code\modules\research\designs\mining_designs.dm" #include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\nanite_designs.dm" #include "code\modules\research\designs\power_designs.dm" #include "code\modules\research\designs\smelting_designs.dm" #include "code\modules\research\designs\stock_parts_designs.dm" @@ -3295,30 +3308,6 @@ #include "code\modules\research\machinery\departmental_techfab.dm" #include "code\modules\research\machinery\protolathe.dm" #include "code\modules\research\machinery\techfab.dm" -#include "code\modules\research\nanites\nanite_chamber.dm" -#include "code\modules\research\nanites\nanite_chamber_computer.dm" -#include "code\modules\research\nanites\nanite_cloud_controller.dm" -#include "code\modules\research\nanites\nanite_misc_items.dm" -#include "code\modules\research\nanites\nanite_program_hub.dm" -#include "code\modules\research\nanites\nanite_programmer.dm" -#include "code\modules\research\nanites\nanite_programs.dm" -#include "code\modules\research\nanites\nanite_remote.dm" -#include "code\modules\research\nanites\program_disks.dm" -#include "code\modules\research\nanites\public_chamber.dm" -#include "code\modules\research\nanites\rules.dm" -#include "code\modules\research\nanites\extra_settings\_extra_setting.dm" -#include "code\modules\research\nanites\extra_settings\boolean.dm" -#include "code\modules\research\nanites\extra_settings\number.dm" -#include "code\modules\research\nanites\extra_settings\text.dm" -#include "code\modules\research\nanites\extra_settings\type.dm" -#include "code\modules\research\nanites\nanite_programs\buffing.dm" -#include "code\modules\research\nanites\nanite_programs\healing.dm" -#include "code\modules\research\nanites\nanite_programs\protocols.dm" -#include "code\modules\research\nanites\nanite_programs\rogue.dm" -#include "code\modules\research\nanites\nanite_programs\sensor.dm" -#include "code\modules\research\nanites\nanite_programs\suppression.dm" -#include "code\modules\research\nanites\nanite_programs\utility.dm" -#include "code\modules\research\nanites\nanite_programs\weapon.dm" #include "code\modules\research\techweb\__techweb_helpers.dm" #include "code\modules\research\techweb\_techweb.dm" #include "code\modules\research\techweb\_techweb_node.dm" @@ -3645,6 +3634,7 @@ #include "code\modules\vending\youtool.dm" #include "code\modules\wiremod\component.dm" #include "code\modules\wiremod\component_printer.dm" +#include "code\modules\wiremod\duplicator.dm" #include "code\modules\wiremod\integrated_circuit.dm" #include "code\modules\wiremod\marker.dm" #include "code\modules\wiremod\port.dm" diff --git a/tgui/packages/tgui/interfaces/AlertModal.js b/tgui/packages/tgui/interfaces/AlertModal.js index e09991a1b9..21ede6acf9 100644 --- a/tgui/packages/tgui/interfaces/AlertModal.js +++ b/tgui/packages/tgui/interfaces/AlertModal.js @@ -27,7 +27,7 @@ export class AlertModal extends Component { componentDidMount() { const { data } = useBackend(this.context); - const { buttons } = data; + const { buttons, autofocus } = data; const { current } = this.state; const button = this.buttonRefs[current].current; @@ -36,7 +36,9 @@ export class AlertModal extends Component { this.buttonRefs.push(createRef()); } - setTimeout(() => button.focus(), 1); + if (autofocus) { + setTimeout(() => button.focus(), 1); + } } setCurrent(current, isArrowKey) { diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js index 0e2414956d..b8043202cc 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js @@ -1,5 +1,15 @@ import { useBackend, useLocalState } from '../../backend'; -import { Box, Stack, Icon, Button, Input, Flex, NumberInput, Dropdown, InfinitePlane } from '../../components'; +import { + Box, + Stack, + Icon, + Button, + Input, + Flex, + NumberInput, + Dropdown, + InfinitePlane, +} from '../../components'; import { Component, createRef } from 'inferno'; import { Window } from '../../layouts'; import { CSS_COLORS } from '../../constants'; @@ -7,51 +17,44 @@ import { classes, shallowDiffers } from '../../../common/react'; import { resolveAsset } from '../../assets'; import { CircuitInfo } from './CircuitInfo'; +<<<<<<< HEAD +======= +const NULL_REF = '[0x0]'; +>>>>>>> ec9ee7eb00 const ABSOLUTE_Y_OFFSET = -32; const SVG_CURVE_INTENSITY = 64; const BasicInput = (props, context) => { - const { - children, - name, - setValue, - defaultValue, - value, - } = props; - return (value !== null) && ( - e.stopPropagation()}> - - - ) || port.name} + )) + || (isOutput && ( + + )) + || port.name} - {port.type || "any"} + textAlign={isOutput ? 'right' : 'left'}> + {port.type || 'any'} diff --git a/tgui/packages/tgui/interfaces/NaniteChamberControl.js b/tgui/packages/tgui/interfaces/NaniteChamberControl.js deleted file mode 100644 index 28e62f15d5..0000000000 --- a/tgui/packages/tgui/interfaces/NaniteChamberControl.js +++ /dev/null @@ -1,277 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, Collapsible, Grid, LabeledList, NoticeBox, NumberInput, Section } from '../components'; -import { Window } from '../layouts'; - -export const NaniteChamberControl = (props, context) => { - return ( - - - - - - ); -}; - -export const NaniteChamberControlContent = (props, context) => { - const { act, data } = useBackend(context); - const { - status_msg, - locked, - occupant_name, - has_nanites, - nanite_volume, - regen_rate, - safety_threshold, - cloud_id, - scan_level, - } = data; - - if (status_msg) { - return ( - - {status_msg} - - ); - } - - const mob_programs = data.mob_programs || []; - - return ( -
act('toggle_lock')} /> - )}> - {!has_nanites ? ( - <> - - No Nanites Detected - -
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NaniteCloudControl.js b/tgui/packages/tgui/interfaces/NaniteCloudControl.js deleted file mode 100644 index e679c36e40..0000000000 --- a/tgui/packages/tgui/interfaces/NaniteCloudControl.js +++ /dev/null @@ -1,333 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, Collapsible, Grid, LabeledList, NoticeBox, NumberInput, Section } from '../components'; -import { Window } from '../layouts'; - -export const NaniteDiskBox = (props, context) => { - const { data } = useBackend(context); - const { - has_disk, - has_program, - disk, - } = data; - if (!has_disk) { - return ( - - No disk inserted - - ); - } - if (!has_program) { - return ( - - Inserted disk has no program - - ); - } - return ( - - ); -}; - -export const NaniteInfoBox = (props, context) => { - const { program } = props; - const { - name, - desc, - activated, - use_rate, - can_trigger, - trigger_cost, - trigger_cooldown, - activation_code, - deactivation_code, - kill_code, - trigger_code, - timer_restart, - timer_shutdown, - timer_trigger, - timer_trigger_delay, - } = program; - const extra_settings = program.extra_settings || []; - return ( -
- {activated ? 'Activated' : 'Deactivated'} - - )}> - - - {desc} - - - - - {use_rate} - - {!!can_trigger && ( - <> - - {trigger_cost} - - - {trigger_cooldown} - - - )} - - - - - -
- - - {activation_code} - - - {deactivation_code} - - - {kill_code} - - {!!can_trigger && ( - - {trigger_code} - - )} - -
-
- -
- - - {timer_restart} s - - - {timer_shutdown} s - - {!!can_trigger && ( - <> - - {timer_trigger} s - - - {timer_trigger_delay} s - - - )} - -
-
-
-
- - {extra_settings.map(setting => { - const naniteTypesDisplayMap = { - number: <>{setting.value}{setting.unit}, - text: setting.value, - type: setting.value, - boolean: (setting.value - ? setting.true_text - : setting.false_text), - }; - return ( - - {naniteTypesDisplayMap[setting.type]} - - ); - })} - -
-
- ); -}; - -export const NaniteCloudBackupList = (props, context) => { - const { act, data } = useBackend(context); - const cloud_backups = data.cloud_backups || []; - return cloud_backups.map(backup => ( -