Revert "Revert "PLASE""

This reverts commit 00601a0c87.
This commit is contained in:
Fermi
2019-11-24 03:04:52 +00:00
parent 25fe5ec14b
commit aeb8606ce0
2145 changed files with 5258 additions and 1387322 deletions
-88
View File
@@ -1,88 +0,0 @@
/***************************************************************
** Design Datums **
** All the data for building stuff. **
***************************************************************/
/*
For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent,
you use one of the material IDs below. These are NOT ids in the usual sense (they aren't defined in the object or part of a datum),
they are simply references used as part of a "has materials?" type proc. They all start with a $ to denote that they aren't reagents.
The currently supporting non-reagent materials. All material amounts are set as the define MINERAL_MATERIAL_AMOUNT, which defaults to 2000
- MAT_METAL (/obj/item/stack/metal).
- MAT_GLASS (/obj/item/stack/glass).
- MAT_PLASMA (/obj/item/stack/plasma).
- MAT_SILVER (/obj/item/stack/silver).
- MAT_GOLD (/obj/item/stack/gold).
- MAT_URANIUM (/obj/item/stack/uranium).
- MAT_DIAMOND (/obj/item/stack/diamond).
- MAT_BANANIUM (/obj/item/stack/bananium).
(Insert new ones here)
Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials.
Design Guidelines
- When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed.
- A single sheet of anything is 2000 units of material. Materials besides metal/glass require help from other jobs (mining for
other types of metals and chemistry for reagents).
- Add the AUTOLATHE tag to
*/
//DESIGNS ARE GLOBAL. DO NOT CREATE OR DESTROY THEM AT RUNTIME OUTSIDE OF INIT, JUST REFERENCE THEM TO WHATEVER YOU'RE DOING! //why are you yelling?
//DO NOT REFERENCE OUTSIDE OF SSRESEARCH. USE THE PROCS IN SSRESEARCH TO OBTAIN A REFERENCE.
/datum/design //Datum for object designs, used in construction
var/name = "Name" //Name of the created object.
var/desc = "Desc" //Description of the created object.
var/id = DESIGN_ID_IGNORE //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols
var/build_type = null //Flag as to what kind machine the design is built in. See defines.
var/list/materials = list() //List of materials. Format: "id" = amount.
var/construction_time //Amount of time required for building the object
var/build_path = null //The file path of the object that gets created
var/list/make_reagents = list() //Reagents produced. Format: "id" = amount. Currently only supported by the biogenerator.
var/list/category = null //Primarily used for Mech Fabricators, but can be used for anything
var/list/reagents_list = list() //List of reagents. Format: "id" = amount.
var/maxstack = 1
var/lathe_time_factor = 1 //How many times faster than normal is this to build on the protolathe
var/dangerous_construction = FALSE //notify and log for admin investigations if this is printed.
var/departmental_flags = ALL //bitflags for deplathes.
var/list/datum/techweb_node/unlocked_by = list()
var/research_icon //Replaces the item icon in the research console
var/research_icon_state
var/icon_cache
/datum/design/error_design
name = "ERROR"
desc = "This usually means something in the database has corrupted. If this doesn't go away automatically, inform Central Command so their techs can fix this ASAP(tm)"
/datum/design/Destroy()
SSresearch.techweb_designs -= id
return ..()
/datum/design/proc/icon_html(client/user)
var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/research_designs)
sheet.send(user)
return sheet.icon_tag(id)
////////////////////////////////////////
//Disks for transporting design datums//
////////////////////////////////////////
/obj/item/disk/design_disk
name = "Component Design Disk"
desc = "A disk for storing device design data for construction in lathes."
icon_state = "datadisk1"
materials = list(MAT_METAL=300, MAT_GLASS=100)
var/list/blueprints = list()
var/max_blueprints = 1
/obj/item/disk/design_disk/Initialize()
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
for(var/i in 1 to max_blueprints)
blueprints += null
/obj/item/disk/design_disk/adv
name = "Advanced Component Design Disk"
desc = "A disk for storing device design data for construction in lathes. This one has extra storage space."
materials = list(MAT_METAL=300, MAT_GLASS=100, MAT_SILVER = 50)
max_blueprints = 5
@@ -1,160 +0,0 @@
///////////////////////////////////
/////Non-Board Computer Stuff//////
///////////////////////////////////
/datum/design/intellicard
name = "Intellicard AI Transportation System"
desc = "Allows for the construction of an intellicard."
id = "intellicard"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 1000, MAT_GOLD = 200)
build_path = /obj/item/aicard
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/paicard
name = "Personal Artificial Intelligence Card"
desc = "Allows for the construction of a pAI Card."
id = "paicard"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_METAL = 500)
build_path = /obj/item/paicard
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_ALL
///////////////////////////////////
//////////Nanite Devices///////////
///////////////////////////////////
/datum/design/nanite_remote
name = "Nanite Remote"
desc = "Allows for the construction of a nanite remote."
id = "nanite_remote"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_METAL = 500)
build_path = /obj/item/nanite_remote
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
materials = list(MAT_GLASS = 500, MAT_METAL = 500)
build_path = /obj/item/nanite_scanner
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
////////////////////////////////////////
//////////Disk Construction Disks///////
////////////////////////////////////////
/datum/design/design_disk
name = "Design Storage Disk"
desc = "Produce additional disks for storing device designs."
id = "design_disk"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/disk/design_disk
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/design_disk_adv
name = "Advanced Design Storage Disk"
desc = "Produce additional disks for storing device designs."
id = "design_disk_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100, MAT_SILVER=50)
build_path = /obj/item/disk/design_disk/adv
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/tech_disk
name = "Technology Data Storage Disk"
desc = "Produce additional disks for storing technology data."
id = "tech_disk"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
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
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
build_path = /obj/item/disk/nanite_program
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/integrated_printer
name = "Integrated circuit printer"
desc = "This machine provides all necessary things for circuitry."
id = "icprinter"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 5000, MAT_METAL = 10000)
build_path = /obj/item/integrated_circuit_printer
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/IC_printer_upgrade_advanced
name = "Integrated circuit printer upgrade: Advanced Designs"
desc = "This disk allows for integrated circuit printers to print advanced circuitry designs."
id = "icupgadv"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 10000, MAT_METAL = 10000)
build_path = /obj/item/disk/integrated_circuit/upgrade/advanced
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/IC_printer_upgrade_clone
name = "Integrated circuit printer upgrade: Instant Cloning"
desc = "This disk allows for integrated circuit printers to clone designs instantaneously."
id = "icupgclo"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 10000, MAT_METAL = 10000)
build_path = /obj/item/disk/integrated_circuit/upgrade/clone
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
//CIT ADDITIONS
/datum/design/drone_shell
name = "Drone Shell"
desc = "A shell of a maintenance drone, an expendable robot built to perform station repairs."
id = "drone_shell"
build_type = MECHFAB | PROTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 350)
construction_time = 150
build_path = /obj/item/drone_shell
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/xenobio_upgrade
name = "owo"
desc = "someone's bussin"
build_type = PROTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100)
category = list("Electronics")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/xenobio_upgrade/xenobiomonkeys
name = "Xenobiology console monkey upgrade disk"
desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
id = "xenobio_monkeys"
build_path = /obj/item/disk/xenobio_console_upgrade/monkey
/datum/design/xenobio_upgrade/xenobioslimebasic
name = "Xenobiology console basic slime upgrade disk"
desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
id = "xenobio_slimebasic"
build_path = /obj/item/disk/xenobio_console_upgrade/slimebasic
/datum/design/xenobio_upgrade/xenobioslimeadv
name = "Xenobiology console advanced slime upgrade disk"
desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
id = "xenobio_slimeadv"
build_path = /obj/item/disk/xenobio_console_upgrade/slimeadv
@@ -1,108 +0,0 @@
////////////////////////////////////////
//////////////MISC Boards///////////////
////////////////////////////////////////
/datum/design/board/recycler
name = "Machine Design (Recycler Board)"
desc = "The circuit board for a recycler."
id = "recycler"
build_path = /obj/item/circuitboard/machine/recycler
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/holopad
name = "Machine Design (AI Holopad Board)"
desc = "The circuit board for a holopad."
id = "holopad"
build_path = /obj/item/circuitboard/machine/holopad
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/autolathe
name = "Machine Design (Autolathe Board)"
desc = "The circuit board for an autolathe."
id = "autolathe"
build_path = /obj/item/circuitboard/machine/autolathe
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/recharger
name = "Machine Design (Weapon Recharger Board)"
desc = "The circuit board for a Weapon Recharger."
id = "recharger"
materials = list(MAT_GLASS = 1000, MAT_GOLD = 2000)
build_path = /obj/item/circuitboard/machine/recharger
category = list("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/vendor
name = "Machine Design (Vendor Board)"
desc = "The circuit board for a Vendor."
id = "vendor"
build_path = /obj/item/circuitboard/machine/vendor
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/donksofttoyvendor
name = "Machine Design (Donksoft Toy Vendor Board)"
desc = "The circuit board for a Donksoft Toy Vendor."
id = "donksofttoyvendor"
build_path = /obj/item/circuitboard/machine/vending/donksofttoyvendor
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/space_heater
name = "Machine Design (Space Heater Board)"
desc = "The circuit board for a space heater."
id = "space_heater"
build_path = /obj/item/circuitboard/machine/space_heater
category = list ("Engineering Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/reagentgrinder
name = "Machine Design (All-In-One Grinder)"
desc = "The circuit board for an All-In-One Grinder."
id = "reagentgrinder"
build_path = /obj/item/circuitboard/machine/reagentgrinder
category = list ("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/microwave
name = "Machine Design (Microwave Board)"
desc = "The circuit board for a microwave."
id = "microwave"
build_path = /obj/item/circuitboard/machine/microwave
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/smartfridge
name = "Machine Design (Smartfridge Board)"
desc = "The circuit board for a smartfridge."
id = "smartfridge"
build_path = /obj/item/circuitboard/machine/smartfridge
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/cell_charger
name = "Machine Design (Cell Charger Board)"
desc = "The circuit board for a cell charger."
id = "cell_charger"
build_path = /obj/item/circuitboard/machine/cell_charger
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/board/vr_sleeper
name = "Machine Design (VR Sleeper Board)"
desc = "The circuit board for a VR sleeper."
id = "vr_sleeper"
build_path = /obj/item/circuitboard/machine/vr_sleeper
departmental_flags = DEPARTMENTAL_FLAG_ALL
category = list ("Medical Machinery")
/datum/design/board/autoylathe
name = "Machine Design (Autoylathe)"
desc = "The circuit board for an autoylathe."
id = "autoylathe"
build_path = /obj/item/circuitboard/machine/autoylathe
departmental_flags = DEPARTMENTAL_FLAG_ALL
category = list("Misc. Machinery")
@@ -1,99 +0,0 @@
///////////////////
///MEDICAL Boards//
///////////////////
/datum/design/board/limbgrower
name = "Machine Design (Limb Grower Board)"
desc = "The circuit board for a limb grower."
id = "limbgrower"
build_path = /obj/item/circuitboard/machine/limbgrower
category = list("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/board/harvester
name = "Machine Design (Organ Harvester Board)"
desc = "The circuit board for an organ harvester."
id = "harvester"
build_path = /obj/item/circuitboard/machine/harvester
category = list("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/board/sleeper
name = "Machine Design (Sleeper Board)"
desc = "The circuit board for a sleeper."
id = "sleeper"
build_path = /obj/item/circuitboard/machine/sleeper
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
category = list ("Medical Machinery")
/datum/design/board/cryotube
name = "Machine Design (Cryotube Board)"
desc = "The circuit board for a cryotube."
id = "cryotube"
build_path = /obj/item/circuitboard/machine/cryo_tube
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
category = list ("Medical Machinery")
/datum/design/board/chem_dispenser
name = "Machine Design (Portable Chem Dispenser Board)"
desc = "The circuit board for a portable chem dispenser."
id = "chem_dispenser"
build_path = /obj/item/circuitboard/machine/chem_dispenser
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
category = list ("Medical Machinery")
/datum/design/board/chem_master
name = "Machine Design (Chem Master Board)"
desc = "The circuit board for a Chem Master 3000."
id = "chem_master"
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/chem_master
category = list ("Medical Machinery")
/datum/design/board/chem_heater
name = "Machine Design (Chemical Heater Board)"
desc = "The circuit board for a chemical heater."
id = "chem_heater"
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/chem_heater
category = list ("Medical Machinery")
/datum/design/board/smoke_machine
name = "Machine Design (Smoke Machine)"
desc = "The circuit board for a smoke machine."
id = "smoke_machine"
build_path = /obj/item/circuitboard/machine/smoke_machine
category = list ("Medical Machinery")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/board/clonecontrol
name = "Computer Design (Cloning Machine Console)"
desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console."
id = "clonecontrol"
build_path = /obj/item/circuitboard/computer/cloning
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
category = list("Medical Machinery")
/datum/design/board/clonepod
name = "Machine Design (Clone Pod)"
desc = "Allows for the construction of circuit boards used to build a Cloning Pod."
id = "clonepod"
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/clonepod
category = list("Medical Machinery")
/datum/design/board/clonescanner
name = "Machine Design (Cloning Scanner)"
desc = "Allows for the construction of circuit boards used to build a Cloning Scanner."
id = "clonescanner"
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_ENGINEERING
build_path = /obj/item/circuitboard/machine/clonescanner
category = list("Medical Machinery")
/datum/design/board/bloodbankgen
name = "Machine Design (Blood Bank Generator Board)"
desc = "The circuit board for a blood bank generator."
id = "bloodbankgen"
build_path = /obj/item/circuitboard/machine/bloodbankgen
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
category = list ("Medical Machinery")
@@ -41,6 +41,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/board/ayyplantgenes
name = "Machine Design (Alien Plant DNA Manipulator Board)"
desc = "The circuit board for an advanced plant DNA manipulator, utilizing alien technologies."
id = "ayyplantgenes"
build_path = /obj/item/circuitboard/machine/plantgenes/vault
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
/datum/design/board/deepfryer
name = "Machine Design (Deep Fryer)"
desc = "The circuit board for a Deep Fryer."
@@ -1,974 +0,0 @@
/////////////////////////////////////////
////////////Medical Tools////////////////
/////////////////////////////////////////
/datum/design/mmi
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
id = "mmi"
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1000, MAT_GLASS = 500)
construction_time = 75
build_path = /obj/item/mmi
category = list("Misc","Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/posibrain
name = "Positronic Brain"
desc = "The latest in Artificial Intelligences."
id = "mmi_posi"
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG.
construction_time = 75
build_path = /obj/item/mmi/posibrain
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/bluespacebeaker
name = "Bluespace Beaker"
desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
id = "bluespacebeaker"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 250, MAT_BLUESPACE = 250)
build_path = /obj/item/reagent_containers/glass/beaker/bluespace
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/noreactbeaker
name = "Cryostasis Beaker"
desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
id = "splitbeaker"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
build_path = /obj/item/reagent_containers/glass/beaker/noreact
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/xlarge_beaker
name = "X-large Beaker"
id = "xlarge_beaker"
build_type = PROTOLATHE
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
materials = list(MAT_GLASS = 2500, MAT_PLASTIC = 3000)
build_path = /obj/item/reagent_containers/glass/beaker/plastic
category = list("Medical Designs")
/datum/design/meta_beaker
name = "Metamaterial Beaker"
id = "meta_beaker"
build_type = PROTOLATHE
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
materials = list(MAT_GLASS = 2500, MAT_PLASTIC = 3000, MAT_GOLD = 1000, MAT_TITANIUM = 1000)
build_path = /obj/item/reagent_containers/glass/beaker/meta
category = list("Medical Designs")
/datum/design/bluespacesyringe
name = "Bluespace Syringe"
desc = "An advanced syringe that can hold 60 units of chemicals"
id = "bluespacesyringe"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 2000, MAT_PLASMA = 1000, MAT_DIAMOND = 1000, MAT_BLUESPACE = 500)
build_path = /obj/item/reagent_containers/syringe/bluespace
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/noreactsyringe
name = "Cryo Syringe"
desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
id = "noreactsyringe"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 2000, MAT_GOLD = 1000)
build_path = /obj/item/reagent_containers/syringe/noreact
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/piercesyringe
name = "Piercing Syringe"
desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
id = "piercesyringe"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 2000, MAT_DIAMOND = 1000)
build_path = /obj/item/reagent_containers/syringe/piercing
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/medicinalsmartdart
name = "Medicinal Smartdart"
desc = "A non-harmful dart that can administer medication from a range. Once it hits a patient using it's smart nanofilter technology only medicines contained within the dart are administered to the patient. Additonally, due to capillary action, injection of chemicals past the overdose limit is prevented."
id = "medicinalsmartdart"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 100, MAT_PLASTIC = 100, MAT_METAL = 100)
build_path = /obj/item/reagent_containers/syringe/dart
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/bluespacesmartdart
name = "bluespace smartdart"
desc = "A non-harmful dart that can administer medication from a range. Once it hits a patient using it's smart nanofilter technology only medicines contained within the dart are administered to the patient. Additonally, due to capillary action, injection of chemicals past the overdose limit is prevented. Has an extended volume capacity thanks to bluespace foam."
id = "bluespacesmartdart"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 250, MAT_PLASTIC = 250, MAT_METAL = 250, MAT_BLUESPACE = 250)
build_path = /obj/item/reagent_containers/syringe/dart/bluespace
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/smartdartgun
name = "dart gun"
desc = "A compressed air gun, designed to fit medicinal darts for application of medicine for those patients just out of reach."
id = "smartdartgun"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_PLASTIC = 1000, MAT_METAL = 500)
build_path = /obj/item/gun/syringe/dart
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/bluespacebodybag
name = "Bluespace Body Bag"
desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures."
id = "bluespacebodybag"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_PLASMA = 2000, MAT_DIAMOND = 500, MAT_BLUESPACE = 500)
build_path = /obj/item/bodybag/bluespace
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/plasmarefiller
name = "Plasma-Man Jumpsuit Refill"
desc = "A refill pack for the auto-extinguisher on Plasma-man suits."
id = "plasmarefiller" //Why did this have no plasmatech
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_PLASMA = 1000)
build_path = /obj/item/extinguisher_refill
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_ALL
/datum/design/crewpinpointer
name = "Crew Pinpointer"
desc = "Allows tracking of someone's location if their suit sensors are turned to tracking beacon."
id = "crewpinpointer"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 1500, MAT_GOLD = 200)
build_path = /obj/item/pinpointer/crew
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/holobarrier_med
name = "PENLITE holobarrier projector"
desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases."
build_type = PROTOLATHE
build_path = /obj/item/holosign_creator/medical
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease)
id = "holobarrier_med"
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/healthanalyzer_advanced
name = "Advanced Health Analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
id = "healthanalyzer_advanced"
build_path = /obj/item/healthanalyzer/advanced
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500, MAT_SILVER = 2000, MAT_GOLD = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/medicalkit
name = "Empty Medkit"
desc = "A plastic medical kit for storging medical items."
id = "medicalkit"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 5000)
build_path = /obj/item/storage/firstaid //So we dont spawn medical items in it
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/blood_bag
name = "Empty Blood Bag"
desc = "A small sterilized plastic bag for blood."
id = "blood_bag"
build_path = /obj/item/reagent_containers/blood
build_type = PROTOLATHE
materials = list(MAT_GLASS = 1500, MAT_PLASTIC = 3500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/bsblood_bag
name = "Blue Space Empty Blood Bag"
desc = "A large sterilized plastic bag for blood."
id = "bsblood_bag"
build_path = /obj/item/reagent_containers/blood/bluespace
build_type = PROTOLATHE
materials = list(MAT_GLASS = 2500, MAT_PLASTIC = 4500, MAT_BLUESPACE = 250)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cloning_disk
name = "Cloning Data Disk"
desc = "Produce additional disks for storing genetic data."
id = "cloning_disk"
build_type = PROTOLATHE
materials = list(MAT_METAL = 300, MAT_GLASS = 100, MAT_SILVER=50)
build_path = /obj/item/disk/data
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/organbox
name = "Empty Organ Box"
desc = "A large cool box that can hold large amouts of medical tools or organs."
id = "organbox"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 1000, MAT_SILVER= 3500, MAT_GOLD = 3500, MAT_PLASTIC = 5000)
build_path = /obj/item/storage/belt/organbox
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
////////////////////////////////////////
//////////Defibrillator Tech////////////
////////////////////////////////////////
/datum/design/defibrillator
name = "Defibrillator"
id = "defibrillator"
build_type = PROTOLATHE
build_path = /obj/item/defibrillator
materials = list(MAT_METAL = 8000, MAT_GLASS = 4000, MAT_SILVER = 3000, MAT_GOLD = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defibrillator_mount
name = "Defibrillator Wall Mount"
desc = "An all-in-one mounted frame for holding defibrillators, complete with ID-locked clamps and recharging cables."
id = "defibmount"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
build_path = /obj/item/wallframe/defib_mount
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_heal
name = "Defibrillator Healing disk"
desc = "An upgrade which increases the healing power of the defibrillator"
id = "defib_heal"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
build_path = /obj/item/disk/medical/defib_heal
construction_time = 10
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_shock
name = "Defibrillator Anti-Shock Disk"
desc = "A safety upgrade that guarantees only the patient will get shocked"
id = "defib_shock"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 6000, MAT_SILVER = 6000)
build_path = /obj/item/disk/medical/defib_shock
construction_time = 10
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_decay
name = "Defibrillator Body-Decay Extender Disk"
desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
id = "defib_decay"
build_type = PROTOLATHE
materials = list(MAT_METAL=16000, MAT_GLASS = 18000, MAT_GOLD = 16000, MAT_SILVER = 6000, MAT_TITANIUM = 2000)
build_path = /obj/item/disk/medical/defib_decay
construction_time = 10
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/defib_speed
name = "Defibrillator Fast Charge Disk"
desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
id = "defib_speed"
build_type = PROTOLATHE
build_path = /obj/item/disk/medical/defib_speed
materials = list(MAT_METAL=16000, MAT_GLASS = 8000, MAT_GOLD = 26000, MAT_SILVER = 26000)
construction_time = 10
category = list("Misc")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/////////////////////////////////////////
//////////Cybernetic Implants////////////
/////////////////////////////////////////
/datum/design/cyberimp_welding
name = "Welding Shield Eyes"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
id = "ci-welding"
build_type = PROTOLATHE | MECHFAB
construction_time = 40
materials = list(MAT_METAL = 600, MAT_GLASS = 400)
build_path = /obj/item/organ/eyes/robotic/shield
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_gloweyes
name = "Luminescent Eyes"
desc = "A pair of cybernetic eyes that can emit multicolored light"
id = "ci-gloweyes"
build_type = PROTOLATHE | MECHFAB
construction_time = 40
materials = list(MAT_METAL = 600, MAT_GLASS = 1000)
build_path = /obj/item/organ/eyes/robotic/glow
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_breather
name = "Breathing Tube Implant"
desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked."
id = "ci-breather"
build_type = PROTOLATHE | MECHFAB
construction_time = 35
materials = list(MAT_METAL = 600, MAT_GLASS = 250)
build_path = /obj/item/organ/cyberimp/mouth/breathing_tube
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_surgical
name = "Surgical Arm Implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
id = "ci-surgery"
build_type = PROTOLATHE | MECHFAB
materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/cyberimp/arm/surgery
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_toolset
name = "Toolset Arm Implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
id = "ci-toolset"
build_type = PROTOLATHE | MECHFAB
materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/cyberimp/arm/toolset
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_medical_hud
name = "Medical HUD Implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
id = "ci-medhud"
build_type = PROTOLATHE | MECHFAB
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/cyberimp/eyes/hud/medical
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_security_hud
name = "Security HUD Implant"
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
id = "ci-sechud"
build_type = PROTOLATHE | MECHFAB
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 750, MAT_GOLD = 750)
build_path = /obj/item/organ/cyberimp/eyes/hud/security
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_xray
name = "X-ray Eyes"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
id = "ci-xray"
build_type = PROTOLATHE | MECHFAB
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 1000, MAT_BLUESPACE = 1000)
build_path = /obj/item/organ/eyes/robotic/xray
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_thermals
name = "Thermal Eyes"
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
id = "ci-thermals"
build_type = PROTOLATHE | MECHFAB
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
build_path = /obj/item/organ/eyes/robotic/thermals
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_antidrop
name = "Anti-Drop Implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
id = "ci-antidrop"
build_type = PROTOLATHE | MECHFAB
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 400, MAT_GOLD = 400)
build_path = /obj/item/organ/cyberimp/brain/anti_drop
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_antistun
name = "CNS Rebooter Implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
id = "ci-antistun"
build_type = PROTOLATHE | MECHFAB
construction_time = 60
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 1000)
build_path = /obj/item/organ/cyberimp/brain/anti_stun
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_nutriment
name = "Nutriment Pump Implant"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
id = "ci-nutriment"
build_type = PROTOLATHE | MECHFAB
construction_time = 40
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_GOLD = 500)
build_path = /obj/item/organ/cyberimp/chest/nutriment
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_nutriment_plus
name = "Nutriment Pump Implant PLUS"
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
id = "ci-nutrimentplus"
build_type = PROTOLATHE | MECHFAB
construction_time = 50
materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_GOLD = 500, MAT_URANIUM = 750)
build_path = /obj/item/organ/cyberimp/chest/nutriment/plus
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_reviver
name = "Reviver Implant"
desc = "This implant will attempt to revive you if you lose consciousness. For the faint of heart!"
id = "ci-reviver"
build_type = PROTOLATHE | MECHFAB
construction_time = 60
materials = list(MAT_METAL = 800, MAT_GLASS = 800, MAT_GOLD = 300, MAT_URANIUM = 500)
build_path = /obj/item/organ/cyberimp/chest/reviver
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cyberimp_thrusters
name = "Thrusters Set Implant"
desc = "This implant will allow you to use gas from environment or your internals for propulsion in zero-gravity areas."
id = "ci-thrusters"
build_type = PROTOLATHE | MECHFAB
construction_time = 80
materials = list(MAT_METAL = 4000, MAT_GLASS = 2000, MAT_SILVER = 1000, MAT_DIAMOND = 1000)
build_path = /obj/item/organ/cyberimp/chest/thrusters
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/////////////////////////////////////////
////////////Regular Implants/////////////
/////////////////////////////////////////
/datum/design/implanter
name = "Implanter"
desc = "A sterile automatic implant injector."
id = "implanter"
build_type = PROTOLATHE
materials = list(MAT_METAL = 600, MAT_GLASS = 200)
build_path = /obj/item/implanter
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
/datum/design/implantcase
name = "Implant Case"
desc = "A glass case for containing an implant."
id = "implantcase"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500)
build_path = /obj/item/implantcase
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
/datum/design/implant_sadtrombone
name = "Sad Trombone Implant Case"
desc = "Makes death amusing."
id = "implant_trombone"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 500, MAT_BANANIUM = 500)
build_path = /obj/item/implantcase/sad_trombone
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_ALL //if you get bananium you get the sad trombones.
/datum/design/implant_chem
name = "Chemical Implant Case"
desc = "A glass case containing an implant."
id = "implant_chem"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 700)
build_path = /obj/item/implantcase/chem
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
/datum/design/implant_tracking
name = "Tracking Implant Case"
desc = "A glass case containing an implant."
id = "implant_tracking"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/implantcase/track
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL
//Cybernetic organs
/datum/design/cybernetic_liver
name = "Cybernetic Liver"
desc = "A cybernetic liver"
id = "cybernetic_liver"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/organ/liver/cybernetic
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_heart
name = "Cybernetic Heart"
desc = "A cybernetic heart"
id = "cybernetic_heart"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/organ/heart/cybernetic
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_heart_u
name = "Upgraded Cybernetic Heart"
desc = "An upgraded cybernetic heart"
id = "cybernetic_heart_u"
build_type = PROTOLATHE | MECHFAB
construction_time = 50
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/heart/cybernetic/upgraded
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_liver_u
name = "Upgraded Cybernetic Liver"
desc = "An upgraded cybernetic liver"
id = "cybernetic_liver_u"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/organ/liver/cybernetic/upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_lungs
name = "Cybernetic Lungs"
desc = "A pair of cybernetic lungs."
id = "cybernetic_lungs"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/organ/lungs/cybernetic
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_lungs_u
name = "Upgraded Cybernetic Lungs"
desc = "A pair of upgraded cybernetic lungs."
id = "cybernetic_lungs_u"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/lungs/cybernetic/upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_tongue
name = "Cybernetic tongue"
desc = "A fancy cybernetic tongue."
id = "cybernetic_tongue"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/organ/tongue/cybernetic
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/////////////////////
//Adv Surgery Tools//
/////////////////////
/datum/design/drapes
name = "Plastic Drapes"
desc = "A large surgery drape made of plastic."
id = "drapes"
build_type = PROTOLATHE
materials = list(MAT_PLASTIC = 2500)
build_path = /obj/item/surgical_drapes
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/retractor_adv
name = "Advanced Retractor"
desc = "An almagation of rods and gears, able to function as both a surgical clamp and retractor. "
id = "retractor_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_GOLD = 1000)
build_path = /obj/item/retractor/advanced
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/surgicaldrill_adv
name = "Surgical Laser Drill"
desc = "It projects a high power laser used for medical applications."
id = "surgicaldrill_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2500, MAT_GLASS = 2500, MAT_SILVER = 6000, MAT_GOLD = 5500, MAT_DIAMOND = 3500)
build_path = /obj/item/surgicaldrill/advanced
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/scalpel_adv
name = "Laser Scalpel"
desc = "An advanced scalpel which uses laser technology to cut."
id = "scalpel_adv"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1500, MAT_GLASS = 1500, MAT_SILVER = 4000, MAT_GOLD = 2500)
build_path = /obj/item/scalpel/advanced
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/////////////////////////////////////////
//////////Alien Surgery Tools////////////
/////////////////////////////////////////
/datum/design/alienscalpel
name = "Alien Scalpel"
desc = "An advanced scalpel obtained through Abductor technology."
id = "alien_scalpel"
build_path = /obj/item/scalpel/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/alienhemostat
name = "Alien Hemostat"
desc = "An advanced hemostat obtained through Abductor technology."
id = "alien_hemostat"
build_path = /obj/item/hemostat/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/alienretractor
name = "Alien Retractor"
desc = "An advanced retractor obtained through Abductor technology."
id = "alien_retractor"
build_path = /obj/item/retractor/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/aliensaw
name = "Alien Circular Saw"
desc = "An advanced surgical saw obtained through Abductor technology."
id = "alien_saw"
build_path = /obj/item/circular_saw/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/aliendrill
name = "Alien Drill"
desc = "An advanced drill obtained through Abductor technology."
id = "alien_drill"
build_path = /obj/item/surgicaldrill/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/aliencautery
name = "Alien Cautery"
desc = "An advanced cautery obtained through Abductor technology."
id = "alien_cautery"
build_path = /obj/item/cautery/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_ears
name = "Cybernetic Ears"
desc = "A pair of cybernetic ears."
id = "cybernetic_ears"
build_type = PROTOLATHE | MECHFAB
construction_time = 30
materials = list(MAT_METAL = 250, MAT_GLASS = 400)
build_path = /obj/item/organ/ears/cybernetic
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/cybernetic_ears_u
name = "Upgraded Cybernetic Ears"
desc = "A pair of upgraded cybernetic ears."
id = "cybernetic_ears_u"
build_type = PROTOLATHE | MECHFAB
construction_time = 40
materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
build_path = /obj/item/organ/ears/cybernetic/upgraded
category = list("Misc", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/////////////////////
///Surgery Designs///
/////////////////////
/datum/design/surgery
name = "Surgery Design"
desc = "what"
id = "surgery_parent"
research_icon = 'icons/obj/surgery.dmi'
research_icon_state = "surgery_any"
var/surgery
/datum/design/surgery/experimental_dissection
name = "Advanced Dissection"
desc = "A surgical procedure which analyzes the biology of a corpse, and automatically adds new findings to the research database."
id = "surgery_adv_dissection"
surgery = /datum/surgery/advanced/experimental_dissection/adv
research_icon_state = "surgery_chest"
/datum/design/surgery/experimental_dissection/exp
name = "Experimental Dissection"
id = "surgery_exp_dissection"
surgery = /datum/surgery/advanced/experimental_dissection/exp
/datum/design/surgery/experimental_dissection/ext
name = "Extraterrestrial Dissection"
id = "surgery_ext_dissection"
surgery = /datum/surgery/advanced/experimental_dissection/alien
/datum/design/surgery/lobotomy
name = "Lobotomy"
desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return."
id = "surgery_lobotomy"
surgery = /datum/surgery/advanced/lobotomy
research_icon_state = "surgery_head"
/datum/design/surgery/pacify
name = "Pacification"
desc = "A surgical procedure which permanently inhibits the aggression center of the brain, making the patient unwilling to cause direct harm."
id = "surgery_pacify"
surgery = /datum/surgery/advanced/pacify
research_icon_state = "surgery_head"
/datum/design/surgery/viral_bonding
name = "Viral Bonding"
desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. The patient must be dosed with spaceacillin, virus food, and formaldehyde."
id = "surgery_viral_bond"
surgery = /datum/surgery/advanced/viral_bonding
research_icon_state = "surgery_chest"
/datum/design/surgery/healing
name = "Tend Wounds"
desc = "An upgraded version of the original surgery."
id = "surgery_healing_base" //holder because travis cries otherwise. Not used in techweb unlocks.
research_icon_state = "surgery_chest"
/datum/design/surgery/healing/brute_upgrade
name = "Tend Wounds (Brute) Upgrade"
surgery = /datum/surgery/healing/brute/upgraded
id = "surgery_heal_brute_upgrade"
/datum/design/surgery/healing/brute_upgrade_2
name = "Tend Wounds (Brute) Upgrade"
surgery = /datum/surgery/healing/brute/upgraded/femto
id = "surgery_heal_brute_upgrade_femto"
/datum/design/surgery/healing/burn_upgrade
name = "Tend Wounds (Burn) Upgrade"
surgery = /datum/surgery/healing/burn/upgraded
id = "surgery_heal_burn_upgrade"
/datum/design/surgery/healing/burn_upgrade_2
name = "Tend Wounds (Burn) Upgrade"
surgery = /datum/surgery/healing/brute/upgraded/femto
id = "surgery_heal_burn_upgrade_femto"
/datum/design/surgery/healing/combo
name = "Tend Wounds (Mixture)"
desc = "A surgical procedure that repairs both bruises and burns. Repair efficiency is not as high as the individual surgeries but it is faster."
surgery = /datum/surgery/healing/combo
id = "surgery_heal_combo"
/datum/design/surgery/healing/combo_upgrade
name = "Tend Wounds (Mixture) Upgrade"
surgery = /datum/surgery/healing/combo/upgraded
id = "surgery_heal_combo_upgrade"
/datum/design/surgery/healing/combo_upgrade_2
name = "Tend Wounds (Mixture) Upgrade"
desc = "A surgical procedure that repairs both bruises and burns faster than their individual counterparts. It is more effective than both the individual surgeries."
surgery = /datum/surgery/healing/combo/upgraded/femto
id = "surgery_heal_combo_upgrade_femto"
/datum/design/surgery/surgery_toxinhealing
name = "Body Rejuvenation"
desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals."
id = "surgery_toxinhealing"
surgery = /datum/surgery/advanced/toxichealing
research_icon_state = "surgery_chest"
/datum/design/surgery/revival
name = "Revival"
desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life."
id = "surgery_revival"
surgery = /datum/surgery/advanced/revival
research_icon_state = "surgery_head"
/datum/design/surgery/brainwashing
name = "Brainwashing"
desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant."
id = "surgery_brainwashing"
surgery = /datum/surgery/advanced/brainwashing
research_icon_state = "surgery_head"
/datum/design/surgery/nerve_splicing
name = "Nerve Splicing"
desc = "A surgical procedure which splices the patient's nerves, making them more resistant to stuns."
id = "surgery_nerve_splice"
surgery = /datum/surgery/advanced/bioware/nerve_splicing
research_icon_state = "surgery_chest"
/datum/design/surgery/nerve_grounding
name = "Nerve Grounding"
desc = "A surgical procedure which makes the patient's nerves act as grounding rods, protecting them from electrical shocks."
id = "surgery_nerve_ground"
surgery = /datum/surgery/advanced/bioware/nerve_grounding
research_icon_state = "surgery_chest"
/datum/design/surgery/vein_threading
name = "Vein Threading"
desc = "A surgical procedure which severely reduces the amount of blood lost in case of injury."
id = "surgery_vein_thread"
surgery = /datum/surgery/advanced/bioware/vein_threading
research_icon_state = "surgery_chest"
/datum/design/surgery/muscled_veins
name = "Vein Muscle Membrane"
desc = "A surgical procedure which adds a muscled membrane to blood vessels, allowing them to pump blood without a heart."
id = "surgery_muscled_veins"
surgery = /datum/surgery/advanced/bioware/muscled_veins
research_icon_state = "surgery_chest"
/datum/design/surgery/ligament_hook
name = "Ligament Hook"
desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \
However this weakens the connection, making them easier to detach as well."
id = "surgery_ligament_hook"
surgery = /datum/surgery/advanced/bioware/ligament_hook
research_icon_state = "surgery_chest"
/datum/design/surgery/ligament_reinforcement
name = "Ligament Reinforcement"
desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \
However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage."
id = "surgery_ligament_reinforcement"
surgery = /datum/surgery/advanced/bioware/ligament_reinforcement
research_icon_state = "surgery_chest"
/datum/design/surgery/necrotic_revival
name = "Necrotic Revival"
desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone."
id = "surgery_zombie"
surgery = /datum/surgery/advanced/necrotic_revival
research_icon_state = "surgery_head"
/////////////////////////////////////////
////////////Medical Prosthetics//////////
/////////////////////////////////////////
/datum/design/basic_l_arm
name = "Surplus prosthetic left arm"
desc = "Basic outdated and fragile prosthetic left arm."
id = "basic_l_arm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
construction_time = 20
build_path = /obj/item/bodypart/l_arm/robot/surplus
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/basic_r_arm
name = "Surplus prosthetic right arm"
desc = "Basic outdated and fragile prosthetic left arm."
id = "basic_r_arm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
construction_time = 20
build_path = /obj/item/bodypart/r_arm/robot/surplus
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/basic_l_leg
name = "Surplus prosthetic left leg"
desc = "Basic outdated and fragile prosthetic left leg."
id = "basic_l_leg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
construction_time = 20
build_path = /obj/item/bodypart/l_leg/robot/surplus
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/basic_r_leg
name = "Surplus prosthetic right leg"
desc = "Basic outdated and fragile prosthetic right leg."
id = "basic_r_leg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 2500)
construction_time = 20
build_path = /obj/item/bodypart/r_leg/robot/surplus
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/adv_r_leg
name = "Advanced prosthetic right leg"
desc = "A renforced prosthetic right leg."
id = "adv_r_leg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3500, MAT_GOLD = 500, MAT_TITANIUM = 800)
construction_time = 40
build_path = /obj/item/bodypart/r_leg/robot/surplus_upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/adv_l_leg
name = "Advanced prosthetic left leg"
desc = "A renforced prosthetic left leg."
id = "adv_l_leg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3500, MAT_GOLD = 500, MAT_TITANIUM = 800)
construction_time = 40
build_path = /obj/item/bodypart/l_leg/robot/surplus_upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/adv_l_arm
name = "Advanced prosthetic left arm"
desc = "A renforced prosthetic left arm."
id = "adv_l_arm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3500, MAT_GOLD = 500, MAT_TITANIUM = 800)
construction_time = 40
build_path = /obj/item/bodypart/l_arm/robot/surplus_upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/adv_r_arm
name = "Advanced prosthetic right arm"
desc = "A renforced prosthetic right arm."
id = "adv_r_arm"
build_type = PROTOLATHE
materials = list(MAT_METAL = 6000, MAT_GLASS = 3500, MAT_GOLD = 500, MAT_TITANIUM = 800)
construction_time = 40
build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded
category = list("Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
@@ -504,7 +504,7 @@
desc = "A a electrode attached to a small circuit box that will tell you the pH of a solution."
id = "pHmeter"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_PLASTIC = 100)
materials = list(MAT_METAL = 1000, MAT_SILVER = 100, MAT_DIAMOND = 100)
build_path = /obj/item/fermichem/pHmeter
category = list("Equipment")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
@@ -1,318 +0,0 @@
////////////////////////////////////////
/////////////Stock Parts////////////////
////////////////////////////////////////
/datum/design/RPED
name = "Rapid Part Exchange Device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
id = "rped"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000) //hardcore
build_path = /obj/item/storage/part_replacer
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/BS_RPED
name = "Bluespace RPED"
desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first."
id = "bs_rped"
build_type = PROTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 5000, MAT_SILVER = 2500) //hardcore
build_path = /obj/item/storage/part_replacer/bluespace
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
//Capacitors
/datum/design/basic_capacitor
name = "Basic Capacitor"
desc = "A stock part used in the construction of various devices."
id = "basic_capacitor"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
build_path = /obj/item/stock_parts/capacitor
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_capacitor
name = "Advanced Capacitor"
desc = "A stock part used in the construction of various devices."
id = "adv_capacitor"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
build_path = /obj/item/stock_parts/capacitor/adv
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/super_capacitor
name = "Super Capacitor"
desc = "A stock part used in the construction of various devices."
id = "super_capacitor"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 100)
build_path = /obj/item/stock_parts/capacitor/super
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/quadratic_capacitor
name = "Quadratic Capacitor"
desc = "A stock part used in the construction of various devices."
id = "quadratic_capacitor"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_GOLD = 100, MAT_DIAMOND = 100)
build_path = /obj/item/stock_parts/capacitor/quadratic
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
//Scanning modules
/datum/design/basic_scanning
name = "Basic Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "basic_scanning"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 50)
build_path = /obj/item/stock_parts/scanning_module
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_scanning
name = "Advanced Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "adv_scanning"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/stock_parts/scanning_module/adv
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/phasic_scanning
name = "Phasic Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "phasic_scanning"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_SILVER = 60)
build_path = /obj/item/stock_parts/scanning_module/phasic
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/triphasic_scanning
name = "Triphasic Scanning Module"
desc = "A stock part used in the construction of various devices."
id = "triphasic_scanning"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_DIAMOND = 30, MAT_BLUESPACE = 30)
build_path = /obj/item/stock_parts/scanning_module/triphasic
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
//Maipulators
/datum/design/micro_mani
name = "Micro Manipulator"
desc = "A stock part used in the construction of various devices."
id = "micro_mani"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 100)
build_path = /obj/item/stock_parts/manipulator
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/nano_mani
name = "Nano Manipulator"
desc = "A stock part used in the construction of various devices."
id = "nano_mani"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/stock_parts/manipulator/nano
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/pico_mani
name = "Pico Manipulator"
desc = "A stock part used in the construction of various devices."
id = "pico_mani"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200)
build_path = /obj/item/stock_parts/manipulator/pico
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/femto_mani
name = "Femto Manipulator"
desc = "A stock part used in the construction of various devices."
id = "femto_mani"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_DIAMOND = 30, MAT_TITANIUM = 30)
build_path = /obj/item/stock_parts/manipulator/femto
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
//Micro-lasers
/datum/design/basic_micro_laser
name = "Basic Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "basic_micro_laser"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 100, MAT_GLASS = 50)
build_path = /obj/item/stock_parts/micro_laser
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/high_micro_laser
name = "High-Power Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "high_micro_laser"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/stock_parts/micro_laser/high
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/ultra_micro_laser
name = "Ultra-High-Power Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "ultra_micro_laser"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 150, MAT_URANIUM = 60)
build_path = /obj/item/stock_parts/micro_laser/ultra
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/quadultra_micro_laser
name = "Quad-Ultra Micro-Laser"
desc = "A stock part used in the construction of various devices."
id = "quadultra_micro_laser"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 100, MAT_DIAMOND = 60)
build_path = /obj/item/stock_parts/micro_laser/quadultra
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/basic_matter_bin
name = "Basic Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "basic_matter_bin"
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 100)
build_path = /obj/item/stock_parts/matter_bin
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_matter_bin
name = "Advanced Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "adv_matter_bin"
build_type = PROTOLATHE
materials = list(MAT_METAL = 150)
build_path = /obj/item/stock_parts/matter_bin/adv
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/super_matter_bin
name = "Super Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "super_matter_bin"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200)
build_path = /obj/item/stock_parts/matter_bin/super
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/bluespace_matter_bin
name = "Bluespace Matter Bin"
desc = "A stock part used in the construction of various devices."
id = "bluespace_matter_bin"
build_type = PROTOLATHE
materials = list(MAT_METAL = 250, MAT_DIAMOND = 100, MAT_BLUESPACE = 100)
build_path = /obj/item/stock_parts/matter_bin/bluespace
category = list("Stock Parts")
lathe_time_factor = 0.2
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
//T-Comms devices
/datum/design/subspace_ansible
name = "Subspace Ansible"
desc = "A compact module capable of sensing extradimensional activity."
id = "s-ansible"
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_SILVER = 100)
build_path = /obj/item/stock_parts/subspace/ansible
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/hyperwave_filter
name = "Hyperwave Filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
id = "s-filter"
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_SILVER = 100)
build_path = /obj/item/stock_parts/subspace/filter
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_amplifier
name = "Subspace Amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
id = "s-amplifier"
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_GOLD = 100, MAT_URANIUM = 100)
build_path = /obj/item/stock_parts/subspace/amplifier
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_treatment
name = "Subspace Treatment Disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
id = "s-treatment"
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_SILVER = 200)
build_path = /obj/item/stock_parts/subspace/treatment
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_analyzer
name = "Subspace Wavelength Analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
id = "s-analyzer"
build_type = PROTOLATHE
materials = list(MAT_METAL = 100, MAT_GOLD = 100)
build_path = /obj/item/stock_parts/subspace/analyzer
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_crystal
name = "Ansible Crystal"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
id = "s-crystal"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 800, MAT_SILVER = 100, MAT_GOLD = 100)
build_path = /obj/item/stock_parts/subspace/crystal
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/subspace_transmitter
name = "Subspace Transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
id = "s-transmitter"
build_type = PROTOLATHE
materials = list(MAT_GLASS = 100, MAT_SILVER = 100, MAT_URANIUM = 100)
build_path = /obj/item/stock_parts/subspace/transmitter
category = list("Stock Parts")
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
@@ -1,392 +0,0 @@
///////////////////////////////
///////Weapons & Ammo//////////
///////////////////////////////
//////////////
//Ammo Boxes//
//////////////
/datum/design/c38/sec
id = "sec_38"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/c38/sec/lethal
name = "Speed Loader (.38)"
id = "sec_38lethal"
build_path = /obj/item/ammo_box/c38/lethal
/datum/design/c38_trac
name = "Speed Loader (.38 TRAC)"
desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body."
id = "c38_trac"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_SILVER = 5000, MAT_GOLD = 1000)
build_path = /obj/item/ammo_box/c38/trac
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/c38_hotshot
name = "Speed Loader (.38 Hot Shot)"
desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload."
id = "c38_hotshot"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000)
build_path = /obj/item/ammo_box/c38/hotshot
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/c38_iceblox
name = "Speed Loader (.38 Iceblox)"
desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload."
id = "c38_iceblox"
build_type = PROTOLATHE
materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000)
build_path = /obj/item/ammo_box/c38/iceblox
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
//////////////
//WT550 Mags//
//////////////
/datum/design/mag_oldsmg
name = "WT-550 Semi-Auto SMG Magazine (4.6x30mm)"
desc = "A 20 round magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg"
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_box/magazine/wt550m9
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/ap_mag
name = "WT-550 Semi-Auto SMG Armour Piercing Magazine (4.6x30mm AP)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg_ap"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/ic_mag
name = "WT-550 Semi-Auto SMG Incendiary Magazine (4.6x30mm IC)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg_ic"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/tx_mag
name = "WT-550 Semi-Auto SMG Uranium Magazine (4.6x30mm TX)"
desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Semi-Auto SMG."
id = "mag_oldsmg_tx"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/mag_oldsmg/rubber_mag
name = "WT-550 Semi-Auto SMG rubberbullets Magazine (4.6x30mm rubber)"
desc = "A 20 round rubber shots magazine for the out of date security WT-550 Semi-Auto SMG"
id = "mag_oldsmg_rubber"
materials = list(MAT_METAL = 6000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtrubber
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
//////////////
//Ammo Shells/
//////////////
/datum/design/beanbag_slug/sec
id = "sec_beanbag"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/rubbershot/sec
id = "sec_rshot"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/shotgun_slug/sec
id = "sec_slug"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/buckshot_shell/sec
id = "sec_bshot"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/shotgun_dart/sec
id = "sec_dart"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/incendiary_slug/sec
id = "sec_Islug"
build_type = PROTOLATHE
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/stunshell
name = "Stun Shell"
desc = "A stunning shell for a shotgun."
id = "stunshell"
build_type = PROTOLATHE
materials = list(MAT_METAL = 200)
build_path = /obj/item/ammo_casing/shotgun/stunslug
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/techshell
name = "Unloaded Technological Shotshell"
desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
id = "techshotshell"
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 200)
build_path = /obj/item/ammo_casing/shotgun/techshell
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cryostatis_shotgun_dart
name = "Cryostasis Shotgun Dart"
desc = "A shotgun dart designed with similar internals to that of a cryostatis beaker, allowing reagents to not react when inside."
id = "shotgundartcryostatis"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3500)
build_path = /obj/item/ammo_casing/shotgun/dart/noreact
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
//////////////
//Firing Pins/
//////////////
/datum/design/pin_testing
name = "Test-Range Firing Pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
id = "pin_testing"
build_type = PROTOLATHE
materials = list(MAT_METAL = 500, MAT_GLASS = 300)
build_path = /obj/item/firing_pin/test_range
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/pin_mindshield
name = "Mindshield Firing Pin"
desc = "This is a security firing pin which only authorizes users who are mindshield-implanted."
id = "pin_loyalty"
build_type = PROTOLATHE
materials = list(MAT_SILVER = 600, MAT_DIAMOND = 600, MAT_URANIUM = 200)
build_path = /obj/item/firing_pin/implant/mindshield
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
//////////////
//Guns////////
//////////////
/datum/design/lasercarbine
name = "Laser Carbine"
desc = "Beefed up version of a standard laser gun."
id = "lasercarbine"
build_type = PROTOLATHE
materials = list(MAT_METAL = 15000, MAT_GLASS = 10000, MAT_GOLD = 2500, MAT_SILVER = 2500)
build_path = /obj/item/gun/energy/laser/carbine/nopin
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/stunrevolver
name = "Tesla Revolver"
desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers."
id = "stunrevolver"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
build_path = /obj/item/gun/energy/tesla_revolver
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/nuclear_gun
name = "Advanced Energy Gun"
desc = "An energy gun with an experimental miniaturized reactor."
id = "nuclear_gun"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 3000, MAT_TITANIUM = 1000)
build_path = /obj/item/gun/energy/e_gun/nuclear
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/beamrifle
name = "Beam Marksman Rifle"
desc = "A powerful long ranged anti-material rifle that fires charged particle beams to obliterate targets."
id = "beamrifle"
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 5000, MAT_DIAMOND = 5000, MAT_URANIUM = 8000, MAT_SILVER = 4500, MAT_GOLD = 5000)
build_path = /obj/item/gun/energy/beam_rifle
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/decloner
name = "Decloner"
desc = "Your opponent will bubble into a messy pile of goop."
id = "decloner"
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000)
reagents_list = list("mutagen" = 40)
build_path = /obj/item/gun/energy/decloner
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/rapidsyringe
name = "Rapid Syringe Gun"
desc = "A gun that fires many syringes."
id = "rapidsyringe"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1000)
build_path = /obj/item/gun/syringe/rapidsyringe
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
/datum/design/temp_gun
name = "Temperature Gun"
desc = "A gun that shoots temperature beam like projectiles to change temperature."
id = "temp_gun"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000)
build_path = /obj/item/gun/energy/temperature
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/flora_gun
name = "Floral Somatoray"
desc = "A tool that discharges controlled radiation which induces mutation in plant cells. Harmless to other organic life."
id = "flora_gun"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 500)
reagents_list = list("radium" = 20)
build_path = /obj/item/gun/energy/floragun
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/xray
name = "X-ray Laser Gun"
desc = "Not quite as menacing as it sounds"
id = "xray_laser"
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000, MAT_URANIUM = 4000, MAT_METAL = 5000, MAT_TITANIUM = 2000, MAT_BLUESPACE = 2000)
build_path = /obj/item/gun/energy/xray
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/ioncarbine
name = "Ion Carbine"
desc = "How to dismantle a cyborg : The gun."
id = "ioncarbine"
build_type = PROTOLATHE
materials = list(MAT_SILVER = 6000, MAT_METAL = 8000, MAT_URANIUM = 2000)
build_path = /obj/item/gun/energy/ionrifle/carbine
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/wormhole_projector
name = "Bluespace Wormhole Projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
id = "wormholeprojector"
build_type = PROTOLATHE
materials = list(MAT_SILVER = 2000, MAT_METAL = 5000, MAT_DIAMOND = 2000, MAT_BLUESPACE = 3000)
build_path = /obj/item/gun/energy/wormhole_projector
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/gravitygun
name = "One-point Bluespace-gravitational Manipulator"
desc = "A multi-mode device that blasts one-point bluespace-gravitational bolts that locally distort gravity."
id = "gravitygun"
build_type = PROTOLATHE
materials = list(MAT_SILVER = 8000, MAT_URANIUM = 8000, MAT_GLASS = 12000, MAT_METAL = 12000, MAT_DIAMOND = 3000, MAT_BLUESPACE = 3000)
build_path = /obj/item/gun/energy/gravity_gun
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
/datum/design/largecrossbow
name = "Energy Crossbow"
desc = "A reverse-engineered energy crossbow favored by syndicate infiltration teams and carp hunters."
id = "largecrossbow"
build_type = PROTOLATHE
materials = list(MAT_METAL = 5000, MAT_GLASS = 1500, MAT_URANIUM = 1500, MAT_SILVER = 1500)
build_path = /obj/item/gun/energy/kinetic_accelerator/crossbow/large
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
///////////
//Grenades/
///////////
/datum/design/large_grenade
name = "Large Grenade"
desc = "A grenade that affects a larger area and use larger containers."
id = "large_Grenade"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000)
build_path = /obj/item/grenade/chem_grenade/large
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/pyro_grenade
name = "Pyro Grenade"
desc = "An advanced grenade that is able to self ignite its mixture."
id = "pyro_Grenade"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_PLASMA = 500)
build_path = /obj/item/grenade/chem_grenade/pyro
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/cryo_grenade
name = "Cryo Grenade"
desc = "An advanced grenade that rapidly cools its contents upon detonation."
id = "cryo_Grenade"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
build_path = /obj/item/grenade/chem_grenade/cryo
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/adv_grenade
name = "Advanced Release Grenade"
desc = "An advanced grenade that can be detonated several times, best used with a repeating igniter."
id = "adv_Grenade"
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 500)
build_path = /obj/item/grenade/chem_grenade/adv_release
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
//////////
//MISC////
//////////
/datum/design/tele_shield
name = "Telescopic Riot Shield"
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
id = "tele_shield"
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200)
build_path = /obj/item/shield/riot/tele
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
/datum/design/suppressor
name = "Suppressor"
desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels."
id = "suppressor"
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 500)
build_path = /obj/item/suppressor
category = list("Weapons")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -1,154 +0,0 @@
/*
Destructive Analyzer
It is used to destroy hand-held objects and advance technological research. Controls are in the linked R&D console.
Note: Must be placed within 3 tiles of the R&D Console
*/
/obj/machinery/rnd/destructive_analyzer
name = "destructive analyzer"
desc = "Learn science by destroying things!"
icon_state = "d_analyzer"
circuit = /obj/item/circuitboard/machine/destructive_analyzer
var/decon_mod = 0
/obj/machinery/rnd/destructive_analyzer/RefreshParts()
var/T = 0
for(var/obj/item/stock_parts/S in component_parts)
T += S.rating
decon_mod = T
/obj/machinery/rnd/destructive_analyzer/proc/ConvertReqString2List(list/source_list)
var/list/temp_list = params2list(source_list)
for(var/O in temp_list)
temp_list[O] = text2num(temp_list[O])
return temp_list
/obj/machinery/rnd/destructive_analyzer/disconnect_console()
linked_console.linked_destroy = null
..()
/obj/machinery/rnd/destructive_analyzer/Insert_Item(obj/item/O, mob/user)
if(user.a_intent != INTENT_HARM)
. = 1
if(!is_insertion_ready(user))
return
if(!user.transferItemToLoc(O, src))
to_chat(user, "<span class='warning'>\The [O] is stuck to your hand, you cannot put it in the [src.name]!</span>")
return
busy = TRUE
loaded_item = O
to_chat(user, "<span class='notice'>You add the [O.name] to the [src.name]!</span>")
flick("d_analyzer_la", src)
addtimer(CALLBACK(src, .proc/finish_loading), 10)
if (linked_console)
linked_console.updateUsrDialog()
/obj/machinery/rnd/destructive_analyzer/proc/finish_loading()
update_icon()
reset_busy()
/obj/machinery/rnd/destructive_analyzer/update_icon()
if(loaded_item)
icon_state = "d_analyzer_l"
else
icon_state = initial(icon_state)
/obj/machinery/rnd/destructive_analyzer/proc/reclaim_materials_from(obj/item/thing)
. = 0
var/datum/component/material_container/storage = linked_console?.linked_lathe?.materials.mat_container
if(storage) //Also sends salvaged materials to a linked protolathe, if any.
for(var/material in thing.materials)
var/can_insert = min((storage.max_amount - storage.total_amount), (max(thing.materials[material]*(decon_mod/10), thing.materials[material])))
storage.insert_amount(can_insert, material)
. += can_insert
if (.)
linked_console.linked_lathe.materials.silo_log(src, "reclaimed", 1, "[thing.name]", thing.materials)
/obj/machinery/rnd/destructive_analyzer/proc/destroy_item(obj/item/thing, innermode = FALSE)
if(QDELETED(thing) || QDELETED(src) || QDELETED(linked_console))
return FALSE
if(!innermode)
flick("d_analyzer_process", src)
busy = TRUE
addtimer(CALLBACK(src, .proc/reset_busy), 24)
use_power(250)
if(thing == loaded_item)
loaded_item = null
var/list/food = thing.GetDeconstructableContents()
for(var/obj/item/innerthing in food)
destroy_item(innerthing, TRUE)
reclaim_materials_from(thing)
for(var/mob/M in thing)
M.death()
if(istype(thing, /obj/item/stack/sheet))
var/obj/item/stack/sheet/S = thing
if(S.amount > 1 && !innermode)
S.amount--
loaded_item = S
else
qdel(S)
else
qdel(thing)
if (!innermode)
update_icon()
return TRUE
/obj/machinery/rnd/destructive_analyzer/proc/user_try_decon_id(id, mob/user)
if(!istype(loaded_item) || !istype(linked_console))
return FALSE
if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID)
var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id)
if(!istype(TN))
return FALSE
var/dpath = loaded_item.type
var/list/worths = TN.boost_item_paths[dpath]
var/list/differences = list()
var/list/already_boosted = linked_console.stored_research.boosted_nodes[TN.id]
for(var/i in worths)
var/used = already_boosted? already_boosted[i] : 0
var/value = min(worths[i], TN.research_costs[i]) - used
if(value > 0)
differences[i] = value
if(length(worths) && !length(differences))
return FALSE
var/choice = input("Are you sure you want to destroy [loaded_item] to [!length(worths) ? "reveal [TN.display_name]" : "boost [TN.display_name] by [json_encode(differences)] point\s"]?") in list("Proceed", "Cancel")
if(choice == "Cancel")
return FALSE
if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src))
return FALSE
SSblackbox.record_feedback("nested tally", "item_deconstructed", 1, list("[TN.id]", "[loaded_item.type]"))
if(destroy_item(loaded_item))
linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(TN.id), dpath)
else
var/list/point_value = techweb_item_point_check(loaded_item)
if(linked_console.stored_research.deconstructed_items[loaded_item.type])
point_value = list()
var/user_mode_string = ""
if(length(point_value))
user_mode_string = " for [json_encode(point_value)] points"
else if(loaded_item.materials.len)
user_mode_string = " for material reclamation"
var/choice = input("Are you sure you want to destroy [loaded_item][user_mode_string]?") in list("Proceed", "Cancel")
if(choice == "Cancel")
return FALSE
if(QDELETED(loaded_item) || QDELETED(linked_console) || !user.Adjacent(linked_console) || QDELETED(src))
return FALSE
var/loaded_type = loaded_item.type
if(destroy_item(loaded_item))
linked_console.stored_research.add_point_list(point_value)
linked_console.stored_research.deconstructed_items[loaded_type] = point_value
return TRUE
/obj/machinery/rnd/destructive_analyzer/proc/unload_item()
if(!loaded_item)
return FALSE
loaded_item.forceMove(get_turf(src))
loaded_item = null
update_icon()
return TRUE
-665
View File
@@ -1,665 +0,0 @@
//this is designed to replace the destructive analyzer
//NEEDS MAJOR CODE CLEANUP
#define SCANTYPE_POKE 1
#define SCANTYPE_IRRADIATE 2
#define SCANTYPE_GAS 3
#define SCANTYPE_HEAT 4
#define SCANTYPE_COLD 5
#define SCANTYPE_OBLITERATE 6
#define SCANTYPE_DISCOVER 7
#define EFFECT_PROB_VERYLOW 20
#define EFFECT_PROB_LOW 35
#define EFFECT_PROB_MEDIUM 50
#define EFFECT_PROB_HIGH 75
#define EFFECT_PROB_VERYHIGH 95
#define FAIL 8
/obj/machinery/rnd/experimentor
name = "\improper E.X.P.E.R.I-MENTOR"
desc = "A \"replacement\" for the destructive analyzer with a slight tendency to catastrophically fail."
icon = 'icons/obj/machines/heavy_lathe.dmi'
icon_state = "h_lathe"
density = TRUE
use_power = IDLE_POWER_USE
circuit = /obj/item/circuitboard/machine/experimentor
var/recentlyExperimented = 0
var/mob/trackedIan
var/mob/trackedRuntime
var/badThingCoeff = 0
var/resetTime = 15
var/cloneMode = FALSE
var/list/item_reactions = list()
var/list/valid_items = list() //valid items for special reactions like transforming
var/list/critical_items = list() //items that can cause critical reactions
/obj/machinery/rnd/experimentor/proc/ConvertReqString2List(list/source_list)
var/list/temp_list = params2list(source_list)
for(var/O in temp_list)
temp_list[O] = text2num(temp_list[O])
return temp_list
/obj/machinery/rnd/experimentor/proc/SetTypeReactions()
for(var/I in typesof(/obj/item))
if(ispath(I, /obj/item/relic))
item_reactions["[I]"] = SCANTYPE_DISCOVER
else
item_reactions["[I]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE)
if(ispath(I, /obj/item/stock_parts) || ispath(I, /obj/item/grenade/chem_grenade) || ispath(I, /obj/item/kitchen))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way
if(ispath(I, /obj/item/grenade/chem_grenade/tuberculosis))
continue
valid_items["[I]"] += 15
if(ispath(I, /obj/item/reagent_containers/food))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way
valid_items["[I]"] += rand(1,4)
if(ispath(I, /obj/item/construction/rcd) || ispath(I, /obj/item/grenade) || ispath(I, /obj/item/aicard) || ispath(I, /obj/item/storage/backpack/holding) || ispath(I, /obj/item/slime_extract) || ispath(I, /obj/item/onetankbomb) || ispath(I, /obj/item/transfer_valve))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null)
critical_items += I
/obj/machinery/rnd/experimentor/Initialize()
. = ..()
trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_living_list
trackedRuntime = locate(/mob/living/simple_animal/pet/cat/Runtime) in GLOB.mob_living_list
SetTypeReactions()
/obj/machinery/rnd/experimentor/RefreshParts()
for(var/obj/item/stock_parts/manipulator/M in component_parts)
if(resetTime > 0 && (resetTime - M.rating) >= 1)
resetTime -= M.rating
for(var/obj/item/stock_parts/scanning_module/M in component_parts)
badThingCoeff += M.rating*2
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
badThingCoeff += M.rating
/obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O)
//snowflake check to only take "made" bombs
if(istype(O, /obj/item/transfer_valve))
var/obj/item/transfer_valve/T = O
if(!T.tank_one || !T.tank_two || !T.attached_device)
return FALSE
return TRUE
/obj/machinery/rnd/experimentor/Insert_Item(obj/item/O, mob/user)
if(user.a_intent != INTENT_HARM)
. = 1
if(!is_insertion_ready(user))
return
if(!user.transferItemToLoc(O, src))
return
loaded_item = O
to_chat(user, "<span class='notice'>You add [O] to the machine.</span>")
flick("h_lathe_load", src)
/obj/machinery/rnd/experimentor/default_deconstruction_crowbar(obj/item/O)
ejectItem()
. = ..(O)
/obj/machinery/rnd/experimentor/ui_interact(mob/user)
var/list/dat = list("<center>")
if(!linked_console)
dat += "<b><a href='byond://?src=[REF(src)];function=search'>Scan for R&D Console</A></b>"
if(loaded_item)
dat += "<b>Loaded Item:</b> [loaded_item]"
dat += "<div>Available tests:"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_POKE]'>Poke</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_IRRADIATE];'>Irradiate</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_GAS]'>Gas</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_HEAT]'>Burn</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_COLD]'>Freeze</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_OBLITERATE]'>Destroy</A></b></div>"
if(istype(loaded_item,/obj/item/relic))
dat += "<b><a href='byond://?src=[REF(src)];item=[REF(loaded_item)];function=[SCANTYPE_DISCOVER]'>Discover</A></b>"
dat += "<b><a href='byond://?src=[REF(src)];function=eject'>Eject</A>"
var/list/listin = techweb_item_boost_check(src)
if(listin)
var/list/output = list("<b><font color='purple'>Research Boost Data:</font></b>")
var/list/res = list("<b><font color='blue'>Already researched:</font></b>")
var/list/boosted = list("<b><font color='red'>Already boosted:</font></b>")
for(var/node_id in listin)
var/datum/techweb_node/N = SSresearch.techweb_node_by_id(node_id)
var/str = "<b>[N.display_name]</b>: [listin[N]] points.</b>"
if(SSresearch.science_tech.researched_nodes[N.id])
res += str
else if(SSresearch.science_tech.boosted_nodes[N.id])
boosted += str
if(SSresearch.science_tech.visible_nodes[N.id]) //JOY OF DISCOVERY!
output += str
output += boosted + res
dat += output
else
dat += "<b>Nothing loaded.</b>"
dat += "<a href='byond://?src=[REF(src)];function=refresh'>Refresh</A>"
dat += "<a href='byond://?src=[REF(src)];close=1'>Close</A></center>"
var/datum/browser/popup = new(user, "experimentor","Experimentor", 700, 400, src)
popup.set_content(dat.Join("<br>"))
popup.open()
onclose(user, "experimentor")
/obj/machinery/rnd/experimentor/Topic(href, href_list)
if(..())
return
usr.set_machine(src)
var/scantype = href_list["function"]
var/obj/item/process = locate(href_list["item"]) in src
if(href_list["close"])
usr << browse(null, "window=experimentor")
return
if(scantype == "search")
var/obj/machinery/computer/rdconsole/D = locate(/obj/machinery/computer/rdconsole) in oview(3,src)
if(D)
linked_console = D
else if(scantype == "eject")
ejectItem()
else if(scantype == "refresh")
updateUsrDialog()
else
if(recentlyExperimented)
to_chat(usr, "<span class='warning'>[src] has been used too recently!</span>")
else if(!loaded_item)
to_chat(usr, "<span class='warning'>[src] is not currently loaded!</span>")
else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item)
to_chat(usr, "<span class='danger'>Interface failure detected in [src]. Please try again.</span>")
else
var/dotype
if(text2num(scantype) == SCANTYPE_DISCOVER)
dotype = SCANTYPE_DISCOVER
else
dotype = matchReaction(process,scantype)
experiment(dotype,process)
use_power(750)
if(dotype != FAIL)
var/list/nodes = techweb_item_boost_check(process)
var/picked = pickweight(nodes) //This should work.
if(linked_console)
linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(picked), process.type)
updateUsrDialog()
/obj/machinery/rnd/experimentor/proc/matchReaction(matching,reaction)
var/obj/item/D = matching
if(D)
if(item_reactions.Find("[D.type]"))
var/tor = item_reactions["[D.type]"]
if(tor == text2num(reaction))
return tor
else
return FAIL
else
return FAIL
else
return FAIL
/obj/machinery/rnd/experimentor/proc/ejectItem(delete=FALSE)
if(loaded_item)
if(cloneMode)
visible_message("<span class='notice'>A duplicate [loaded_item] pops out!</span>")
var/type_to_make = loaded_item.type
new type_to_make(get_turf(pick(oview(1,src))))
cloneMode = FALSE
return
var/turf/dropturf = get_turf(pick(view(1,src)))
if(!dropturf) //Failsafe to prevent the object being lost in the void forever.
dropturf = drop_location()
loaded_item.forceMove(dropturf)
if(delete)
qdel(loaded_item)
loaded_item = null
/obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where)
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(0, where)
smoke.start()
/obj/machinery/rnd/experimentor/proc/experiment(exp,obj/item/exp_on)
recentlyExperimented = 1
icon_state = "h_lathe_wloop"
var/chosenchem
var/criticalReaction = (exp_on.type in critical_items) ? TRUE : FALSE
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_POKE)
visible_message("[src] prods at [exp_on] with mechanical arms.")
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("[exp_on] is gripped in just the right way, enhancing its focus.")
badThingCoeff++
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!</span>")
for(var/mob/living/m in oview(1, src))
m.apply_damage(15, BRUTE, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
investigate_log("Experimentor dealt minor brute to [m].", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions!</span>")
exp = SCANTYPE_OBLITERATE
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions, throwing the [exp_on]!</span>")
var/mob/living/target = locate(/mob/living) in oview(7,src)
if(target)
var/obj/item/throwing = loaded_item
investigate_log("Experimentor has thrown [loaded_item] at [key_name(target)]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
if(throwing)
throwing.throw_at(target, 10, 1)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_IRRADIATE)
visible_message("<span class='danger'>[src] reflects radioactive rays at [exp_on]!</span>")
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("[exp_on] has activated an unknown subroutine!")
cloneMode = TRUE
investigate_log("Experimentor has made a clone of [exp_on]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions, melting [exp_on] and leaking radiation!</span>")
radiation_pulse(src, 500)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, spewing toxic waste!</span>")
for(var/turf/T in oview(1, src))
if(!T.density)
if(prob(EFFECT_PROB_VERYHIGH) && !(locate(/obj/effect/decal/cleanable/greenglow) in T))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
reagentdecal.reagents.add_reagent("radium", 7)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
var/savedName = "[exp_on]"
ejectItem(TRUE)
var/newPath = text2path(pickweight(valid_items))
loaded_item = new newPath(src)
visible_message("<span class='warning'>[src] malfunctions, transforming [savedName] into [loaded_item]!</span>")
investigate_log("Experimentor has transformed [savedName] into [loaded_item]", INVESTIGATE_EXPERIMENTOR)
if(istype(loaded_item, /obj/item/grenade/chem_grenade))
var/obj/item/grenade/chem_grenade/CG = loaded_item
CG.prime()
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_GAS)
visible_message("<span class='warning'>[src] fills its chamber with gas, [exp_on] included.</span>")
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("[exp_on] achieves the perfect mix!")
new /obj/item/stack/sheet/mineral/plasma(get_turf(pick(oview(1,src))))
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src] destroys [exp_on], leaking dangerous gas!</span>")
chosenchem = pick("carbon","radium","toxin","condensedcapsaicin","mushroomhallucinogen","space_drugs","ethanol","beepskysmash")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent(chosenchem , 50)
investigate_log("Experimentor has released [chosenchem] smoke.", INVESTIGATE_EXPERIMENTOR)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 0, src, silent = TRUE)
playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
qdel(R)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src]'s chemical chamber has sprung a leak!</span>")
chosenchem = pick("mutationtoxin","nanomachines","sacid")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent(chosenchem , 50)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 0, src, silent = TRUE)
playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
qdel(R)
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
investigate_log("Experimentor has released <font color='red'>[chosenchem]</font> smoke!", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, spewing harmless gas.")
throwSmoke(loc)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("<span class='warning'>[src] melts [exp_on], ionizing the air around it!</span>")
empulse(loc, 4, 6)
investigate_log("Experimentor has generated an Electromagnetic Pulse.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_HEAT)
visible_message("[src] raises [exp_on]'s temperature.")
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("<span class='warning'>[src]'s emergency coolant system gives off a small ding!</span>")
playsound(src, 'sound/machines/ding.ogg', 50, 1)
var/obj/item/reagent_containers/food/drinks/coffee/C = new /obj/item/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src))))
chosenchem = pick("plasma","capsaicin","ethanol")
C.reagents.remove_any(25)
C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
var/turf/start = get_turf(src)
var/mob/M = locate(/mob/living) in view(src, 3)
var/turf/MT = get_turf(M)
if(MT)
visible_message("<span class='danger'>[src] dangerously overheats, launching a flaming fuel orb!</span>")
investigate_log("Experimentor has launched a <font color='red'>fireball</font> at [M]!", INVESTIGATE_EXPERIMENTOR)
var/obj/item/projectile/magic/aoe/fireball/FB = new /obj/item/projectile/magic/aoe/fireball(start)
FB.preparePixelProjectile(MT, start)
FB.fire()
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions, melting [exp_on] and releasing a burst of flame!</span>")
explosion(loc, -1, 0, 0, 0, 0, flame_range = 2)
investigate_log("Experimentor started a fire.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, melting [exp_on] and leaking hot air!</span>")
var/datum/gas_mixture/env = loc.return_air()
var/transfer_moles = 0.25 * env.total_moles()
var/datum/gas_mixture/removed = env.remove(transfer_moles)
if(removed)
var/heat_capacity = removed.heat_capacity()
if(heat_capacity == 0 || heat_capacity == null)
heat_capacity = 1
removed.temperature = min((removed.temperature*heat_capacity + 100000)/heat_capacity, 1000)
env.merge(removed)
air_update_turf()
investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, activating its emergency coolant systems!</span>")
throwSmoke(loc)
for(var/mob/living/m in oview(1, src))
m.apply_damage(5, BURN, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_COLD)
visible_message("[src] lowers [exp_on]'s temperature.")
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("<span class='warning'>[src]'s emergency coolant system gives off a small ding!</span>")
var/obj/item/reagent_containers/food/drinks/coffee/C = new /obj/item/reagent_containers/food/drinks/coffee(get_turf(pick(oview(1,src))))
playsound(src, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready!
chosenchem = pick("uranium","frostoil","ephedrine")
C.reagents.remove_any(25)
C.reagents.add_reagent(chosenchem , 50)
C.name = "Cup of Suspicious Liquid"
C.desc = "It has a large hazard symbol printed on the side in fading ink."
investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR)
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!</span>")
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent("frostoil" , 50)
investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR)
var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 0, src, silent = TRUE)
playsound(src, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
qdel(R)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, shattering [exp_on] and leaking cold air!</span>")
var/datum/gas_mixture/env = loc.return_air()
var/transfer_moles = 0.25 * env.total_moles()
var/datum/gas_mixture/removed = env.remove(transfer_moles)
if(removed)
var/heat_capacity = removed.heat_capacity()
if(heat_capacity == 0 || heat_capacity == null)
heat_capacity = 1
removed.temperature = (removed.temperature*heat_capacity - 75000)/heat_capacity
env.merge(removed)
air_update_turf()
investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("<span class='warning'>[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!</span>")
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(0, loc)
smoke.start()
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == SCANTYPE_OBLITERATE)
visible_message("<span class='warning'>[exp_on] activates the crushing mechanism, [exp_on] is destroyed!</span>")
if(linked_console.linked_lathe)
var/datum/component/material_container/linked_materials = linked_console.linked_lathe.GetComponent(/datum/component/material_container)
for(var/material in exp_on.materials)
linked_materials.insert_amount( min((linked_materials.max_amount - linked_materials.total_amount), (exp_on.materials[material])), material)
if(prob(EFFECT_PROB_LOW) && criticalReaction)
visible_message("<span class='warning'>[src]'s crushing mechanism slowly and smoothly descends, flattening the [exp_on]!</span>")
new /obj/item/stack/sheet/plasteel(get_turf(pick(oview(1,src))))
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("<span class='danger'>[src]'s crusher goes way too many levels too high, crushing right through space-time!</span>")
playsound(src, 'sound/effects/supermatter.ogg', 50, 1, -3)
investigate_log("Experimentor has triggered the 'throw things' reaction.", INVESTIGATE_EXPERIMENTOR)
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
AM.throw_at(src,10,1)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("<span class='danger'>[src]'s crusher goes one level too high, crushing right into space-time!</span>")
playsound(src, 'sound/effects/supermatter.ogg', 50, 1, -3)
investigate_log("Experimentor has triggered the 'minor throw things' reaction.", INVESTIGATE_EXPERIMENTOR)
var/list/throwAt = list()
for(var/atom/movable/AM in oview(7,src))
if(!AM.anchored)
throwAt.Add(AM)
for(var/counter = 1, counter < throwAt.len, ++counter)
var/atom/movable/cast = throwAt[counter]
cast.throw_at(pick(throwAt),10,1)
ejectItem(TRUE)
////////////////////////////////////////////////////////////////////////////////////////////////
if(exp == FAIL)
var/a = pick("rumbles","shakes","vibrates","shudders")
var/b = pick("crushes","spins","viscerates","smashes","insults")
visible_message("<span class='warning'>[exp_on] [a], and [b], the experiment was a failure.</span>")
if(exp == SCANTYPE_DISCOVER)
visible_message("[src] scans the [exp_on], revealing its true nature!")
playsound(src, 'sound/effects/supermatter.ogg', 50, 3, -1)
var/obj/item/relic/R = loaded_item
R.reveal()
investigate_log("Experimentor has revealed a relic with <span class='danger'>[R.realProc]</span> effect.", INVESTIGATE_EXPERIMENTOR)
ejectItem()
//Global reactions
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff) && loaded_item)
var/globalMalf = rand(1,100)
if(globalMalf < 15)
visible_message("<span class='warning'>[src]'s onboard detection system has malfunctioned!</span>")
item_reactions["[exp_on.type]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE)
ejectItem()
if(globalMalf > 16 && globalMalf < 35)
visible_message("<span class='warning'>[src] melts [exp_on], ian-izing the air around it!</span>")
throwSmoke(loc)
if(trackedIan)
throwSmoke(trackedIan.loc)
trackedIan.forceMove(loc)
investigate_log("Experimentor has stolen Ian!", INVESTIGATE_EXPERIMENTOR) //...if anyone ever fixes it...
else
new /mob/living/simple_animal/pet/dog/corgi(loc)
investigate_log("Experimentor has spawned a new corgi.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
visible_message("<span class='warning'>Experimentor draws the life essence of those nearby!</span>")
for(var/mob/living/m in view(4,src))
to_chat(m, "<span class='danger'>You feel your flesh being torn from you, mists of blood drifting to [src]!</span>")
m.apply_damage(50, BRUTE, BODY_ZONE_CHEST)
investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", INVESTIGATE_EXPERIMENTOR)
if(globalMalf > 51 && globalMalf < 75)
visible_message("<span class='warning'>[src] encounters a run-time error!</span>")
throwSmoke(loc)
if(trackedRuntime)
throwSmoke(trackedRuntime.loc)
trackedRuntime.forceMove(drop_location())
investigate_log("Experimentor has stolen Runtime!", INVESTIGATE_EXPERIMENTOR)
else
new /mob/living/simple_animal/pet/cat(loc)
investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
if(globalMalf > 76)
visible_message("<span class='warning'>[src] begins to smoke and hiss, shaking violently!</span>")
use_power(500000)
investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR)
addtimer(CALLBACK(src, .proc/reset_exp), resetTime)
/obj/machinery/rnd/experimentor/proc/reset_exp()
update_icon()
recentlyExperimented = FALSE
/obj/machinery/rnd/experimentor/update_icon()
icon_state = "h_lathe"
/obj/machinery/rnd/experimentor/proc/warn_admins(user, ReactionName)
var/turf/T = get_turf(user)
message_admins("Experimentor reaction: [ReactionName] generated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(T)]")
log_game("Experimentor reaction: [ReactionName] generated by [key_name(user)] in [AREACOORD(T)]")
#undef SCANTYPE_POKE
#undef SCANTYPE_IRRADIATE
#undef SCANTYPE_GAS
#undef SCANTYPE_HEAT
#undef SCANTYPE_COLD
#undef SCANTYPE_OBLITERATE
#undef SCANTYPE_DISCOVER
#undef EFFECT_PROB_VERYLOW
#undef EFFECT_PROB_LOW
#undef EFFECT_PROB_MEDIUM
#undef EFFECT_PROB_HIGH
#undef EFFECT_PROB_VERYHIGH
#undef FAIL
//////////////////////////////////SPECIAL ITEMS////////////////////////////////////////
/obj/item/relic
name = "strange object"
desc = "What mysteries could this hold?"
icon = 'icons/obj/assemblies.dmi'
var/realName = "defined object"
var/revealed = FALSE
var/realProc
var/cooldownMax = 60
var/cooldown
/obj/item/relic/Initialize()
. = ..()
icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank")
realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]"
/obj/item/relic/proc/reveal()
if(revealed) //Re-rolling your relics seems a bit overpowered, yes?
return
revealed = TRUE
name = realName
cooldownMax = rand(60,300)
realProc = pick("teleport","explode","rapidDupe","petSpray","flash","clean","corgicannon")
/obj/item/relic/attack_self(mob/user)
if(revealed)
if(cooldown)
to_chat(user, "<span class='warning'>[src] does not react!</span>")
return
else if(loc == user)
cooldown = TRUE
call(src,realProc)(user)
addtimer(CALLBACK(src, .proc/cd), cooldownMax)
else
to_chat(user, "<span class='notice'>You aren't quite sure what to do with this yet.</span>")
/obj/item/relic/proc/cd()
cooldown = FALSE
//////////////// RELIC PROCS /////////////////////////////
/obj/item/relic/proc/throwSmoke(turf/where)
var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(0, get_turf(where))
smoke.start()
/obj/item/relic/proc/corgicannon(mob/user)
playsound(src, "sparks", rand(25,50), 1)
var/mob/living/simple_animal/pet/dog/corgi/C = new/mob/living/simple_animal/pet/dog/corgi(get_turf(user))
C.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, .proc/throwSmoke, C))
warn_admins(user, "Corgi Cannon", 0)
/obj/item/relic/proc/clean(mob/user)
playsound(src, "sparks", rand(25,50), 1)
var/obj/item/grenade/chem_grenade/cleaner/CL = new/obj/item/grenade/chem_grenade/cleaner(get_turf(user))
CL.prime()
warn_admins(user, "Smoke", 0)
/obj/item/relic/proc/flash(mob/user)
playsound(src, "sparks", rand(25,50), 1)
var/obj/item/grenade/flashbang/CB = new/obj/item/grenade/flashbang(user.loc)
CB.prime()
warn_admins(user, "Flash")
/obj/item/relic/proc/petSpray(mob/user)
var/message = "<span class='danger'>[src] begins to shake, and in the distance the sound of rampaging animals arises!</span>"
visible_message(message)
to_chat(user, message)
var/animals = rand(1,25)
var/counter
var/list/valid_animals = list(/mob/living/simple_animal/parrot, /mob/living/simple_animal/butterfly, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/crab, /mob/living/simple_animal/pet/fox, /mob/living/simple_animal/hostile/lizard, /mob/living/simple_animal/mouse, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/poison/bees, /mob/living/simple_animal/hostile/carp)
for(counter = 1; counter < animals; counter++)
var/mobType = pick(valid_animals)
new mobType(get_turf(src))
warn_admins(user, "Mass Mob Spawn")
if(prob(60))
to_chat(user, "<span class='warning'>[src] falls apart!</span>")
qdel(src)
/obj/item/relic/proc/rapidDupe(mob/user)
audible_message("[src] emits a loud pop!")
var/list/dupes = list()
var/counter
var/max = rand(5,10)
for(counter = 1; counter < max; counter++)
var/obj/item/relic/R = new type(get_turf(src))
R.name = name
R.desc = desc
R.realName = realName
R.realProc = realProc
R.revealed = TRUE
dupes |= R
R.throw_at(pick(oview(7,get_turf(src))),10,1)
counter = 0
QDEL_LIST_IN(dupes, rand(10, 100))
warn_admins(user, "Rapid duplicator", 0)
/obj/item/relic/proc/explode(mob/user)
to_chat(user, "<span class='danger'>[src] begins to heat up!</span>")
addtimer(CALLBACK(src, .proc/do_explode, user), rand(35, 100))
/obj/item/relic/proc/do_explode(mob/user)
if(loc == user)
visible_message("<span class='notice'>\The [src]'s top opens, releasing a powerful blast!</span>")
explosion(user.loc, 0, rand(1,5), rand(1,5), rand(1,5), rand(1,5), flame_range = 2)
warn_admins(user, "Explosion")
qdel(src) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!!
/obj/item/relic/proc/teleport(mob/user)
to_chat(user, "<span class='notice'>[src] begins to vibrate!</span>")
addtimer(CALLBACK(src, .proc/do_the_teleport, user), rand(10, 30))
/obj/item/relic/proc/do_the_teleport(mob/user)
var/turf/userturf = get_turf(user)
if(loc == user && !is_centcom_level(userturf.z)) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
visible_message("<span class='notice'>[src] twists and bends, relocating itself!</span>")
throwSmoke(userturf)
do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE)
throwSmoke(get_turf(user))
warn_admins(user, "Teleport", 0)
//Admin Warning proc for relics
/obj/item/relic/proc/warn_admins(mob/user, RelicType, priority = 1)
var/turf/T = get_turf(src)
var/log_msg = "[RelicType] relic used by [key_name(user)] in [AREACOORD(T)]"
if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK!
message_admins("[RelicType] relic activated by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]")
log_game(log_msg)
investigate_log(log_msg, "experimentor")
@@ -1,364 +0,0 @@
/obj/machinery/rnd/production
name = "technology fabricator"
desc = "Makes researched and prototype items with materials and energy."
layer = BELOW_OBJ_LAYER
var/consoleless_interface = FALSE //Whether it can be used without a console.
var/efficiency_coeff = 1 //Materials needed / coeff = actual.
var/list/categories = list()
var/datum/component/remote_materials/materials
var/allowed_department_flags = ALL
var/production_animation //What's flick()'d on print.
var/allowed_buildtypes = NONE
var/list/datum/design/cached_designs
var/list/datum/design/matching_designs
var/department_tag = "Unidentified" //used for material distribution among other things.
var/datum/techweb/stored_research
var/datum/techweb/host_research
var/screen = RESEARCH_FABRICATOR_SCREEN_MAIN
var/selected_category
/obj/machinery/rnd/production/Initialize(mapload)
. = ..()
create_reagents(0, OPENCONTAINER)
matching_designs = list()
cached_designs = list()
stored_research = new
host_research = SSresearch.science_tech
update_research()
materials = AddComponent(/datum/component/remote_materials, "lathe", mapload)
RefreshParts()
/obj/machinery/rnd/production/proc/update_research()
host_research.copy_research_to(stored_research, TRUE)
update_designs()
/obj/machinery/rnd/production/proc/update_designs()
cached_designs.Cut()
for(var/i in stored_research.researched_designs)
var/datum/design/d = SSresearch.techweb_design_by_id(i)
if((isnull(allowed_department_flags) || (d.departmental_flags & allowed_department_flags)) && (d.build_type & allowed_buildtypes))
cached_designs |= d
/obj/machinery/rnd/production/RefreshParts()
calculate_efficiency()
/obj/machinery/rnd/production/ui_interact(mob/user)
if(!consoleless_interface)
return ..()
user.set_machine(src)
var/datum/browser/popup = new(user, "rndconsole", name, 460, 550)
popup.set_content(generate_ui())
popup.open()
/obj/machinery/rnd/production/Destroy()
QDEL_NULL(stored_research)
return ..()
/obj/machinery/rnd/production/proc/calculate_efficiency()
efficiency_coeff = 1
if(reagents) //If reagents/materials aren't initialized, don't bother, we'll be doing this again after reagents init anyways.
reagents.maximum_volume = 0
for(var/obj/item/reagent_containers/glass/G in component_parts)
reagents.maximum_volume += G.volume
G.reagents.trans_to(src, G.reagents.total_volume)
if(materials)
var/total_storage = 0
for(var/obj/item/stock_parts/matter_bin/M in component_parts)
total_storage += M.rating * 75000
materials.set_local_size(total_storage)
var/total_rating = 0
for(var/obj/item/stock_parts/manipulator/M in component_parts)
total_rating += M.rating
total_rating = max(1, total_rating)
efficiency_coeff = total_rating
//we eject the materials upon deconstruction.
/obj/machinery/rnd/production/on_deconstruction()
for(var/obj/item/reagent_containers/glass/G in component_parts)
reagents.trans_to(G, G.reagents.maximum_volume)
return ..()
/obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins, mob/user)
if(notify_admins)
investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).")
for(var/i in 1 to amount)
var/obj/item/I = new path(get_turf(src))
if(efficient_with(I.type))
I.materials = matlist.Copy()
SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
/obj/machinery/rnd/production/proc/check_mat(datum/design/being_built, M) // now returns how many times the item can be built with the material
if (!materials.mat_container) // no connected silo
return 0
var/list/all_materials = being_built.reagents_list + being_built.materials
var/A = materials.mat_container.amount(M)
if(!A)
A = reagents.get_reagent_amount(M)
// these types don't have their .materials set in do_print, so don't allow
// them to be constructed efficiently
var/ef = efficient_with(being_built.build_path) ? efficiency_coeff : 1
return round(A / max(1, all_materials[M] / ef))
/obj/machinery/rnd/production/proc/efficient_with(path)
return !ispath(path, /obj/item/stack/sheet) && !ispath(path, /obj/item/stack/ore/bluespace_crystal)
/obj/machinery/rnd/production/proc/user_try_print_id(id, amount)
if((!istype(linked_console) && requires_console) || !id)
return FALSE
if(istext(amount))
amount = text2num(amount)
if(isnull(amount))
amount = 1
var/datum/design/D = (linked_console || requires_console)? (linked_console.stored_research.researched_designs[id]? SSresearch.techweb_design_by_id(id) : null) : SSresearch.techweb_design_by_id(id)
if(!istype(D))
return FALSE
if(!(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags)))
say("Warning: Printing failed: This fabricator does not have the necessary keys to decrypt design schematics. Please update the research data with the on-screen button and contact Nanotrasen Support!")
return FALSE
if(D.build_type && !(D.build_type & allowed_buildtypes))
say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!")
return FALSE
if(!materials.mat_container)
say("No connection to material storage, please contact the quartermaster.")
return FALSE
if(materials.on_hold())
say("Mineral access is on hold, please contact the quartermaster.")
return FALSE
var/power = 1000
amount = CLAMP(amount, 1, 50)
for(var/M in D.materials)
power += round(D.materials[M] * amount / 35)
power = min(3000, power)
use_power(power)
var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1
var/list/efficient_mats = list()
for(var/MAT in D.materials)
efficient_mats[MAT] = D.materials[MAT]/coeff
if(!materials.mat_container.has_materials(efficient_mats, amount))
say("Not enough materials to complete prototype[amount > 1? "s" : ""].")
return FALSE
for(var/R in D.reagents_list)
if(!reagents.has_reagent(R, D.reagents_list[R]*amount/coeff))
say("Not enough reagents to complete prototype[amount > 1? "s" : ""].")
return FALSE
materials.mat_container.use_amount(efficient_mats, amount)
materials.silo_log(src, "built", -amount, "[D.name]", efficient_mats)
for(var/R in D.reagents_list)
reagents.remove_reagent(R, D.reagents_list[R]*amount/coeff)
busy = TRUE
if(production_animation)
flick(production_animation, src)
var/timecoeff = D.lathe_time_factor / efficiency_coeff
addtimer(CALLBACK(src, .proc/reset_busy), (30 * timecoeff * amount) ** 0.5)
addtimer(CALLBACK(src, .proc/do_print, D.build_path, amount, efficient_mats, D.dangerous_construction, usr), (32 * timecoeff * amount) ** 0.8)
return TRUE
/obj/machinery/rnd/production/proc/search(string)
matching_designs.Cut()
for(var/v in stored_research.researched_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(v)
if(!(D.build_type & allowed_buildtypes) || !(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags)))
continue
if(findtext(D.name,string))
matching_designs.Add(D)
/obj/machinery/rnd/production/proc/generate_ui()
var/list/ui = list()
ui += ui_header()
switch(screen)
if(RESEARCH_FABRICATOR_SCREEN_MATERIALS)
ui += ui_screen_materials()
if(RESEARCH_FABRICATOR_SCREEN_CHEMICALS)
ui += ui_screen_chemicals()
if(RESEARCH_FABRICATOR_SCREEN_SEARCH)
ui += ui_screen_search()
if(RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW)
ui += ui_screen_category_view()
else
ui += ui_screen_main()
for(var/i in 1 to length(ui))
if(!findtextEx(ui[i], RDSCREEN_NOBREAK))
ui[i] += "<br>"
ui[i] = replacetextEx(ui[i], RDSCREEN_NOBREAK, "")
return ui.Join("")
/obj/machinery/rnd/production/proc/ui_header()
var/list/l = list()
l += "<div class='statusDisplay'><b>[host_research.organization] [department_tag] Department Lathe</b>"
l += "Security protocols: [(obj_flags & EMAGGED)? "<font color='red'>Disabled</font>" : "<font color='green'>Enabled</font>"]"
if (materials.mat_container)
l += "<A href='?src=[REF(src)];switch_screen=[RESEARCH_FABRICATOR_SCREEN_MATERIALS]'><B>Material Amount:</B> [materials.format_amount()]</A>"
else
l += "<font color='red'>No material storage connected, please contact the quartermaster.</font>"
l += "<A href='?src=[REF(src)];switch_screen=[RESEARCH_FABRICATOR_SCREEN_CHEMICALS]'><B>Chemical volume:</B> [reagents.total_volume] / [reagents.maximum_volume]</A>"
l += "<a href='?src=[REF(src)];sync_research=1'>Synchronize Research</a>"
l += "<a href='?src=[REF(src)];switch_screen=[RESEARCH_FABRICATOR_SCREEN_MAIN]'>Main Screen</a></div>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/rnd/production/proc/ui_screen_materials()
if (!materials.mat_container)
screen = RESEARCH_FABRICATOR_SCREEN_MAIN
return ui_screen_main()
var/list/l = list()
l += "<div class='statusDisplay'><h3>Material Storage:</h3>"
for(var/mat_id in materials.mat_container.materials)
var/datum/material/M = materials.mat_container.materials[mat_id]
l += "* [M.amount] of [M.name]: "
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=1'>Eject</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT*5) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=5'>5x</A> [RDSCREEN_NOBREAK]"
if(M.amount >= MINERAL_MATERIAL_AMOUNT) l += "<A href='?src=[REF(src)];ejectsheet=[M.id];eject_amt=50'>All</A>[RDSCREEN_NOBREAK]"
l += ""
l += "</div>[RDSCREEN_NOBREAK]"
return l
/obj/machinery/rnd/production/proc/ui_screen_chemicals()
var/list/l = list()
l += "<div class='statusDisplay'><A href='?src=[REF(src)];disposeall=1'>Disposal All Chemicals in Storage</A>"
l += "<h3>Chemical Storage:</h3>"
for(var/datum/reagent/R in reagents.reagent_list)
l += "[R.name]: [R.volume]"
l += "<A href='?src=[REF(src)];dispose=[R.id]'>Purge</A>"
l += "</div>"
return l
/obj/machinery/rnd/production/proc/ui_screen_search()
var/list/l = list()
var/coeff = efficiency_coeff
l += "<h2>Search Results:</h2>"
l += "<form name='search' action='?src=[REF(src)]'>\
<input type='hidden' name='src' value='[REF(src)]'>\
<input type='hidden' name='search' value='to_search'>\
<input type='text' name='to_search'>\
<input type='submit' value='Search'>\
</form><HR>"
for(var/datum/design/D in matching_designs)
l += design_menu_entry(D, coeff)
l += "</div>"
return l
/obj/machinery/rnd/production/proc/design_menu_entry(datum/design/D, coeff)
if(!istype(D))
return
if(!coeff)
coeff = efficiency_coeff
if(!efficient_with(D.build_path))
coeff = 1
var/list/l = list()
var/temp_material
var/c = 50
var/t
var/all_materials = D.materials + D.reagents_list
for(var/M in all_materials)
t = check_mat(D, M)
temp_material += " | "
if (t < 1)
temp_material += "<span class='bad'>[all_materials[M]/coeff] [CallMaterialName(M)]</span>"
else
temp_material += " [all_materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
if (c >= 1)
l += "<A href='?src=[REF(src)];build=[D.id];amount=1'>[D.name]</A>[RDSCREEN_NOBREAK]"
if(c >= 5)
l += "<A href='?src=[REF(src)];build=[D.id];amount=5'>x5</A>[RDSCREEN_NOBREAK]"
if(c >= 10)
l += "<A href='?src=[REF(src)];build=[D.id];amount=10'>x10</A>[RDSCREEN_NOBREAK]"
l += "[temp_material][RDSCREEN_NOBREAK]"
else
l += "<span class='linkOff'>[D.name]</span>[temp_material][RDSCREEN_NOBREAK]"
l += ""
return l
/obj/machinery/rnd/production/Topic(raw, ls)
if(..())
return
add_fingerprint(usr)
usr.set_machine(src)
if(ls["switch_screen"])
screen = text2num(ls["switch_screen"])
if(ls["build"]) //Causes the Protolathe to build something.
if(busy)
say("Warning: Fabricators busy!")
else
user_try_print_id(ls["build"], ls["amount"])
if(ls["search"]) //Search for designs with name matching pattern
search(ls["to_search"])
screen = RESEARCH_FABRICATOR_SCREEN_SEARCH
if(ls["sync_research"])
update_research()
say("Synchronizing research with host technology database.")
if(ls["category"])
selected_category = ls["category"]
if(ls["dispose"]) //Causes the protolathe to dispose of a single reagent (all of it)
reagents.del_reagent(ls["dispose"])
if(ls["disposeall"]) //Causes the protolathe to dispose of all it's reagents.
reagents.clear_reagents()
if(ls["ejectsheet"]) //Causes the protolathe to eject a sheet of material
eject_sheets(ls["ejectsheet"], ls["eject_amt"])
updateUsrDialog()
/obj/machinery/rnd/production/proc/eject_sheets(eject_sheet, eject_amt)
var/datum/component/material_container/mat_container = materials.mat_container
if (!mat_container)
say("No access to material storage, please contact the quartermaster.")
return 0
if (materials.on_hold())
say("Mineral access is on hold, please contact the quartermaster.")
return 0
var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location())
var/list/matlist = list()
matlist[eject_sheet] = MINERAL_MATERIAL_AMOUNT
materials.silo_log(src, "ejected", -count, "sheets", matlist)
return count
/obj/machinery/rnd/production/proc/ui_screen_main()
var/list/l = list()
l += "<form name='search' action='?src=[REF(src)]'>\
<input type='hidden' name='src' value='[REF(src)]'>\
<input type='hidden' name='search' value='to_search'>\
<input type='hidden' name='type' value='proto'>\
<input type='text' name='to_search'>\
<input type='submit' value='Search'>\
</form><HR>"
l += list_categories(categories, RESEARCH_FABRICATOR_SCREEN_CATEGORYVIEW)
return l
/obj/machinery/rnd/production/proc/ui_screen_category_view()
if(!selected_category)
return ui_screen_main()
var/list/l = list()
l += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3>"
var/coeff = efficiency_coeff
for(var/v in stored_research.researched_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(v)
if(!(selected_category in D.category)|| !(D.build_type & allowed_buildtypes))
continue
if(!(isnull(allowed_department_flags) || (D.departmental_flags & allowed_department_flags)))
continue
l += design_menu_entry(D, coeff)
l += "</div>"
return l
/obj/machinery/rnd/production/proc/list_categories(list/categories, menu_num)
if(!categories)
return
var/line_length = 1
var/list/l = "<table style='width:100%' align='center'><tr>"
for(var/C in categories)
if(line_length > 2)
l += "</tr><tr>"
line_length = 1
l += "<td><A href='?src=[REF(src)];category=[C];switch_screen=[menu_num]'>[C]</A></td>"
line_length++
l += "</tr></table></div>"
return l
@@ -1,124 +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"
circuit = /obj/item/circuitboard/machine/nanite_program_hub
use_power = IDLE_POWER_USE
anchored = TRUE
density = TRUE
var/obj/item/disk/nanite_program/disk
var/datum/techweb/linked_techweb
var/current_category = "Main"
var/detail_view = FALSE
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")
)
/obj/machinery/nanite_program_hub/Initialize()
. = ..()
linked_techweb = SSresearch.science_tech
/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(disk)
eject(user)
if(user.transferItemToLoc(N, src))
to_chat(user, "<span class='notice'>You insert [N] into [src]</span>")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0)
disk = N
else
..()
/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/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "nanite_program_hub", name, 500, 700, master_ui, state)
ui.set_autoupdate(FALSE) //to avoid making the whole program list every second
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
data["detail_view"] = detail_view
data["category"] = current_category
if(current_category != "Main")
var/list/program_list = list()
for(var/i in linked_techweb.researched_designs)
var/datum/design/nanites/D = SSresearch.techweb_design_by_id(i)
if(!istype(D))
continue
if(current_category in D.category)
var/list/program_design = list()
program_design["id"] = D.id
program_design["name"] = D.name
program_design["desc"] = D.desc
program_list += list(program_design)
data["program_list"] = program_list
else
data["categories"] = categories
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, 0)
. = TRUE
if("set_category")
var/new_category = params["category"]
current_category = new_category
. = TRUE
if("toggle_details")
detail_view = !detail_view
. = TRUE
if("clear")
if(disk && disk.program)
qdel(disk.program)
disk.program = null
disk.name = initial(disk.name)
. = TRUE
/obj/machinery/nanite_program_hub/admin/Initialize()
. = ..()
linked_techweb = SSresearch.admin_tech
@@ -61,9 +61,6 @@
/datum/nanite_program/purging/active_effect()
host_mob.adjustToxLoss(-1)
for(var/datum/reagent/R in host_mob.reagents.reagent_list)
if(R.id == "nanite_b_gone")
host_mob.adjustToxLoss(4)
continue
host_mob.reagents.remove_reagent(R.id,1)
/datum/nanite_program/brain_heal
File diff suppressed because it is too large Load Diff
-40
View File
@@ -1,40 +0,0 @@
/obj/item/disk/tech_disk
name = "technology disk"
desc = "A disk for storing technology data for further research."
icon_state = "datadisk0"
materials = list(MAT_METAL=300, MAT_GLASS=100)
var/datum/techweb/stored_research
/obj/item/disk/tech_disk/Initialize()
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
stored_research = new /datum/techweb
/obj/item/disk/tech_disk/debug
name = "\improper CentCom technology disk"
desc = "A debug item for research"
materials = list()
/obj/item/disk/tech_disk/debug/Initialize()
. = ..()
stored_research = new /datum/techweb/admin
/obj/item/disk/tech_disk/illegal
name = "Illegal technology disk"
desc = "A technology disk containing schematics for syndicate inspired equipment."
materials = list()
/obj/item/disk/tech_disk/illegal/Initialize()
. = ..()
stored_research = new /datum/techweb/syndicate
/obj/item/disk/tech_disk/abductor
name = "Gray technology disk"
desc = "You feel like it's not Gray because of its color."
materials = list()
/obj/item/disk/tech_disk/abductor/Initialize()
. = ..()
stored_research = new /datum/techweb/abductor
-270
View File
@@ -1,270 +0,0 @@
/*Power cells are in code\modules\power\cell.dm
If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fit with the clamp to not confuse the user or cause possible exploits.*/
/obj/item/storage/part_replacer
name = "rapid part exchange device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
item_state = "RPED"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_HUGE
component_type = /datum/component/storage/concrete/rped
var/works_from_distance = FALSE
var/pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/rped.ogg'
var/alt_sound = null
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //cutting down on exploits
/obj/item/storage/part_replacer/pre_attack(obj/machinery/T, mob/living/user, params)
if(!istype(T) || !T.component_parts)
return ..()
if(user.Adjacent(T)) // no TK upgrading.
if(works_from_distance)
user.Beam(T, icon_state = "rped_upgrade", time = 5)
T.exchange_parts(user, src)
return FALSE
return ..()
/obj/item/storage/part_replacer/afterattack(obj/machinery/T, mob/living/user, adjacent, params)
if(adjacent || !istype(T) || !T.component_parts)
return ..()
if(works_from_distance)
user.Beam(T, icon_state = "rped_upgrade", time = 5)
T.exchange_parts(user, src)
return
return ..()
/obj/item/storage/part_replacer/proc/play_rped_sound()
//Plays the sound for RPED exhanging or installing parts.
if(alt_sound && prob(1))
playsound(src, alt_sound, 40, 1)
else
playsound(src, pshoom_or_beepboopblorpzingshadashwoosh, 40, 1)
/obj/item/storage/part_replacer/bluespace
name = "bluespace rapid part exchange device"
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange."
icon_state = "BS_RPED"
w_class = WEIGHT_CLASS_NORMAL
works_from_distance = TRUE
pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/pshoom.ogg'
alt_sound = 'sound/items/pshoom_2.ogg'
component_type = /datum/component/storage/concrete/bluespace/rped
/obj/item/storage/part_replacer/cyborg
icon_state = "borgrped"
/obj/item/storage/part_replacer/bluespace/cyborg
icon_state = "borg_BS_RPED"
/proc/cmp_rped_sort(obj/item/A, obj/item/B)
return B.get_part_rating() - A.get_part_rating()
/obj/item/stock_parts
name = "stock part"
desc = "What?"
icon = 'icons/obj/stock_parts.dmi'
w_class = WEIGHT_CLASS_SMALL
var/rating = 1
rad_flags = RAD_NO_CONTAMINATE
/obj/item/stock_parts/Initialize()
. = ..()
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/stock_parts/get_part_rating()
return rating
//Rating 1
/obj/item/stock_parts/capacitor
name = "capacitor"
desc = "A basic capacitor used in the construction of a variety of devices."
icon_state = "capacitor"
materials = list(MAT_METAL=50, MAT_GLASS=50)
/obj/item/stock_parts/scanning_module
name = "scanning module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
icon_state = "scan_module"
materials = list(MAT_METAL=50, MAT_GLASS=20)
/obj/item/stock_parts/manipulator
name = "micro-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "micro_mani"
materials = list(MAT_METAL=30)
/obj/item/stock_parts/micro_laser
name = "micro-laser"
desc = "A tiny laser used in certain devices."
icon_state = "micro_laser"
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/stock_parts/matter_bin
name = "matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "matter_bin"
materials = list(MAT_METAL=80)
//Rating 2
/obj/item/stock_parts/capacitor/adv
name = "advanced capacitor"
desc = "An advanced capacitor used in the construction of a variety of devices."
icon_state = "adv_capacitor"
rating = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
/obj/item/stock_parts/scanning_module/adv
name = "advanced scanning module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
icon_state = "adv_scan_module"
rating = 2
materials = list(MAT_METAL=50, MAT_GLASS=20)
/obj/item/stock_parts/manipulator/nano
name = "nano-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "nano_mani"
rating = 2
materials = list(MAT_METAL=30)
/obj/item/stock_parts/micro_laser/high
name = "high-power micro-laser"
desc = "A tiny laser used in certain devices."
icon_state = "high_micro_laser"
rating = 2
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/stock_parts/matter_bin/adv
name = "advanced matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "advanced_matter_bin"
rating = 2
materials = list(MAT_METAL=80)
//Rating 3
/obj/item/stock_parts/capacitor/super
name = "super capacitor"
desc = "A super-high capacity capacitor used in the construction of a variety of devices."
icon_state = "super_capacitor"
rating = 3
materials = list(MAT_METAL=50, MAT_GLASS=50)
/obj/item/stock_parts/scanning_module/phasic
name = "phasic scanning module"
desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
icon_state = "super_scan_module"
rating = 3
materials = list(MAT_METAL=50, MAT_GLASS=20)
/obj/item/stock_parts/manipulator/pico
name = "pico-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "pico_mani"
rating = 3
materials = list(MAT_METAL=30)
/obj/item/stock_parts/micro_laser/ultra
name = "ultra-high-power micro-laser"
icon_state = "ultra_high_micro_laser"
desc = "A tiny laser used in certain devices."
rating = 3
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/stock_parts/matter_bin/super
name = "super matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "super_matter_bin"
rating = 3
materials = list(MAT_METAL=80)
//Rating 4
/obj/item/stock_parts/capacitor/quadratic
name = "quadratic capacitor"
desc = "An capacity capacitor used in the construction of a variety of devices."
icon_state = "quadratic_capacitor"
rating = 4
materials = list(MAT_METAL=50, MAT_GLASS=50)
/obj/item/stock_parts/scanning_module/triphasic
name = "triphasic scanning module"
desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices."
icon_state = "triphasic_scan_module"
rating = 4
materials = list(MAT_METAL=50, MAT_GLASS=20)
/obj/item/stock_parts/manipulator/femto
name = "femto-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "femto_mani"
rating = 4
materials = list(MAT_METAL=30)
/obj/item/stock_parts/micro_laser/quadultra
name = "quad-ultra micro-laser"
icon_state = "quadultra_micro_laser"
desc = "A tiny laser used in certain devices."
rating = 4
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/stock_parts/matter_bin/bluespace
name = "bluespace matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
icon_state = "bluespace_matter_bin"
rating = 4
materials = list(MAT_METAL=80)
// Subspace stock parts
/obj/item/stock_parts/subspace/ansible
name = "subspace ansible"
icon_state = "subspace_ansible"
desc = "A compact module capable of sensing extradimensional activity."
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/amplifier
name = "subspace amplifier"
icon_state = "subspace_amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/treatment
name = "subspace treatment disk"
icon_state = "treatment_disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/analyzer
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
materials = list(MAT_METAL=30, MAT_GLASS=10)
/obj/item/stock_parts/subspace/crystal
name = "ansible crystal"
icon_state = "ansible_crystal"
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
materials = list(MAT_GLASS=50)
/obj/item/stock_parts/subspace/transmitter
name = "subspace transmitter"
icon_state = "subspace_transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
materials = list(MAT_METAL=50)
/obj/item/research//Makes testing much less of a pain -Sieve
name = "research"
icon = 'icons/obj/stock_parts.dmi'
icon_state = "capacitor"
desc = "A debug item for research."
@@ -1,34 +0,0 @@
/proc/count_unique_techweb_nodes()
var/static/list/L = typesof(/datum/techweb_node)
return L.len
/proc/count_unique_techweb_designs()
var/static/list/L = typesof(/datum/design)
return L.len
/proc/node_boost_error(id, message)
WARNING("Invalid boost information for node \[[id]\]: [message]")
SSresearch.invalid_node_boost[id] = message
/proc/techweb_item_boost_check(obj/item/I) //Returns an associative list of techweb node datums with values of the boost it gives. var/list/returned = list()
if(SSresearch.techweb_boost_items[I.type])
return SSresearch.techweb_boost_items[I.type] //It should already be formatted in node datum = list(point type = value)
/proc/techweb_item_point_check(obj/item/I)
if(SSresearch.techweb_point_items[I.type])
return SSresearch.techweb_point_items[I.type]
/proc/techweb_point_display_generic(pointlist)
var/list/ret = list()
for(var/i in pointlist)
if(SSresearch.point_types[i])
ret += "[SSresearch.point_types[i]]: [pointlist[i]]"
else
ret += "ERRORED POINT TYPE: [pointlist[i]]"
return ret.Join("<BR>")
/proc/techweb_point_display_rdconsole(pointlist, last_pointlist)
var/list/ret = list()
for(var/i in pointlist)
ret += "[SSresearch.point_types[i] || "ERRORED POINT TYPE"]: [pointlist[i]] (+[(last_pointlist[i]) * ((SSresearch.flags & SS_TICKER)? (600 / (world.tick_lag * SSresearch.wait)) : (600 / SSresearch.wait))]/ minute)"
return ret.Join("<BR>")
-389
View File
@@ -1,389 +0,0 @@
//Used \n[\s]*origin_tech[\s]*=[\s]*"[\S]+" to delete all origin techs.
//Or \n[\s]*origin_tech[\s]*=[\s]list\([A-Z_\s=0-9,]*\)
//Used \n[\s]*req_tech[\s]*=[\s]*list\(["a-z\s=0-9,]*\) to delete all req_techs.
//Techweb datums are meant to store unlocked research, being able to be stored on research consoles, servers, and disks. They are NOT global.
/datum/techweb
var/list/researched_nodes = list() //Already unlocked and all designs are now available. Assoc list, id = TRUE
var/list/visible_nodes = list() //Visible nodes, doesn't mean it can be researched. Assoc list, id = TRUE
var/list/available_nodes = list() //Nodes that can immediately be researched, all reqs met. assoc list, id = TRUE
var/list/researched_designs = list() //Designs that are available for use. Assoc list, id = TRUE
var/list/custom_designs = list() //Custom inserted designs like from disks that should survive recalculation.
var/list/boosted_nodes = list() //Already boosted nodes that can't be boosted again. node id = path of boost object.
var/list/hidden_nodes = list() //Hidden nodes. id = TRUE. Used for unhiding nodes when requirements are met by removing the entry of the node.
var/list/deconstructed_items = list() //items already deconstructed for a generic point boost. path = list(point_type = points)
var/list/research_points = list() //Available research points. type = number
var/list/obj/machinery/computer/rdconsole/consoles_accessing = list()
var/id = "generic"
var/list/research_logs = list() //IC logs.
var/largest_bomb_value = 0
var/organization = "Third-Party" //Organization name, used for display.
var/list/last_bitcoins = list() //Current per-second production, used for display only.
var/list/tiers = list() //Assoc list, id = number, 1 is available, 2 is all reqs are 1, so on
/datum/techweb/New()
for(var/i in SSresearch.techweb_nodes_starting)
var/datum/techweb_node/DN = SSresearch.techweb_node_by_id(i)
research_node(DN, TRUE, FALSE)
hidden_nodes = SSresearch.techweb_nodes_hidden.Copy()
return ..()
/datum/techweb/admin
id = "ADMIN"
organization = "CentCom"
/datum/techweb/admin/New() //All unlocked.
. = ..()
for(var/i in SSresearch.techweb_nodes)
var/datum/techweb_node/TN = SSresearch.techweb_nodes[i]
research_node(TN, TRUE)
for(var/i in SSresearch.point_types)
research_points[i] = INFINITY
hidden_nodes = list()
/datum/techweb/syndicate
id = "SYNDICATE"
organization = "Syndicate"
/datum/techweb/syndicate/New()
var/datum/techweb_node/syndicate_basic/Node = new()
research_node(Node, TRUE)
/datum/techweb/abductor
id = "ABDUCTOR"
organization = "Aliens"
/datum/techweb/abductor/New()
var/datum/techweb_node/alientech/Node = new()
research_node(Node, TRUE)
/datum/techweb/science //Global science techweb for RND consoles.
id = "SCIENCE"
organization = "Nanotrasen"
/datum/techweb/Destroy()
researched_nodes = null
researched_designs = null
available_nodes = null
visible_nodes = null
custom_designs = null
SSresearch.techwebs -= src
return ..()
/datum/techweb/proc/recalculate_nodes(recalculate_designs = FALSE, wipe_custom_designs = FALSE)
var/list/datum/techweb_node/processing = list()
for(var/id in researched_nodes)
processing[id] = TRUE
for(var/id in visible_nodes)
processing[id] = TRUE
for(var/id in available_nodes)
processing[id] = TRUE
if(recalculate_designs)
researched_designs = custom_designs.Copy()
if(wipe_custom_designs)
custom_designs = list()
for(var/id in processing)
update_node_status(SSresearch.techweb_node_by_id(id), FALSE)
CHECK_TICK
for(var/v in consoles_accessing)
var/obj/machinery/computer/rdconsole/V = v
V.rescan_views()
V.updateUsrDialog()
/datum/techweb/proc/add_point_list(list/pointlist)
for(var/i in pointlist)
if(SSresearch.point_types[i] && pointlist[i] > 0)
research_points[i] += pointlist[i]
/datum/techweb/proc/add_points_all(amount)
var/list/l = SSresearch.point_types.Copy()
for(var/i in l)
l[i] = amount
add_point_list(l)
/datum/techweb/proc/remove_point_list(list/pointlist)
for(var/i in pointlist)
if(SSresearch.point_types[i] && pointlist[i] > 0)
research_points[i] = max(0, research_points[i] - pointlist[i])
/datum/techweb/proc/remove_points_all(amount)
var/list/l = SSresearch.point_types.Copy()
for(var/i in l)
l[i] = amount
remove_point_list(l)
/datum/techweb/proc/modify_point_list(list/pointlist)
for(var/i in pointlist)
if(SSresearch.point_types[i] && pointlist[i] != 0)
research_points[i] = max(0, research_points[i] + pointlist[i])
/datum/techweb/proc/modify_points_all(amount)
var/list/l = SSresearch.point_types.Copy()
for(var/i in l)
l[i] = amount
modify_point_list(l)
/datum/techweb/proc/copy_research_to(datum/techweb/receiver, unlock_hidden = TRUE) //Adds any missing research to theirs.
for(var/i in researched_nodes)
CHECK_TICK
receiver.research_node_id(i, TRUE, FALSE)
for(var/i in researched_designs)
CHECK_TICK
receiver.add_design_by_id(i)
if(unlock_hidden)
for(var/i in receiver.hidden_nodes)
CHECK_TICK
if(!hidden_nodes[i])
receiver.hidden_nodes -= i //We can see it so let them see it too.
receiver.recalculate_nodes()
/datum/techweb/proc/copy()
var/datum/techweb/returned = new()
returned.researched_nodes = researched_nodes.Copy()
returned.visible_nodes = visible_nodes.Copy()
returned.available_nodes = available_nodes.Copy()
returned.researched_designs = researched_designs.Copy()
returned.hidden_nodes = hidden_nodes.Copy()
return returned
/datum/techweb/proc/get_visible_nodes() //The way this is set up is shit but whatever.
return visible_nodes - hidden_nodes
/datum/techweb/proc/get_available_nodes()
return available_nodes - hidden_nodes
/datum/techweb/proc/get_researched_nodes()
return researched_nodes - hidden_nodes
/datum/techweb/proc/add_point_type(type, amount)
if(!SSresearch.point_types[type] || (amount <= 0))
return FALSE
research_points[type] += amount
return TRUE
/datum/techweb/proc/modify_point_type(type, amount)
if(!SSresearch.point_types[type])
return FALSE
research_points[type] = max(0, research_points[type] + amount)
return TRUE
/datum/techweb/proc/remove_point_type(type, amount)
if(!SSresearch.point_types[type] || (amount <= 0))
return FALSE
research_points[type] = max(0, research_points[type] - amount)
return TRUE
/datum/techweb/proc/add_design_by_id(id, custom = FALSE)
return add_design(SSresearch.techweb_design_by_id(id), custom)
/datum/techweb/proc/add_design(datum/design/design, custom = FALSE)
if(!istype(design))
return FALSE
researched_designs[design.id] = design
researched_designs[design.id] = TRUE
if(custom)
custom_designs[design.id] = TRUE
return TRUE
/datum/techweb/proc/remove_design_by_id(id, custom = FALSE)
return remove_design(SSresearch.techweb_design_by_id(id), custom)
/datum/techweb/proc/remove_design(datum/design/design, custom = FALSE)
if(!istype(design))
return FALSE
if(custom_designs[design.id] && !custom)
return FALSE
custom_designs -= design.id
researched_designs -= design.id
return TRUE
/datum/techweb/proc/can_afford(list/pointlist)
for(var/i in pointlist)
if(research_points[i] < pointlist[i])
return FALSE
return TRUE
/datum/techweb/proc/printout_points()
return techweb_point_display_generic(research_points)
/datum/techweb/proc/research_node_id(id, force, auto_update_points)
return research_node(SSresearch.techweb_node_by_id(id), force, auto_update_points)
/datum/techweb/proc/research_node(datum/techweb_node/node, force = FALSE, auto_adjust_cost = TRUE)
if(!istype(node))
return FALSE
update_node_status(node)
if(!force)
if(!available_nodes[node.id] || (auto_adjust_cost && (!can_afford(node.get_price(src)))))
return FALSE
if(auto_adjust_cost)
remove_point_list(node.get_price(src))
researched_nodes[node.id] = TRUE //Add to our researched list
for(var/id in node.unlock_ids)
visible_nodes[id] = TRUE
update_node_status(SSresearch.techweb_node_by_id(id))
for(var/id in node.design_ids)
add_design_by_id(id)
update_node_status(node)
return TRUE
/datum/techweb/proc/unresearch_node_id(id)
return unresearch_node(SSresearch.techweb_node_by_id(id))
/datum/techweb/proc/unresearch_node(datum/techweb_node/node)
if(!istype(node))
return FALSE
researched_nodes -= node.id
recalculate_nodes(TRUE) //Fully rebuild the tree.
/datum/techweb/proc/boost_with_path(datum/techweb_node/N, itempath)
if(!istype(N) || !ispath(itempath))
return FALSE
LAZYINITLIST(boosted_nodes[N.id])
for(var/i in N.boost_item_paths[itempath])
boosted_nodes[N.id][i] = max(boosted_nodes[N.id][i], N.boost_item_paths[itempath][i])
if(N.autounlock_by_boost)
hidden_nodes -= N.id
update_node_status(N)
return TRUE
/datum/techweb/proc/update_tiers(datum/techweb_node/base)
var/list/current = list(base)
while (current.len)
var/list/next = list()
for (var/node_ in current)
var/datum/techweb_node/node = node_
var/tier = 0
if (!researched_nodes[node.id]) // researched is tier 0
for (var/id in node.prereq_ids)
var/prereq_tier = tiers[id]
tier = max(tier, prereq_tier + 1)
if (tier != tiers[node.id])
tiers[node.id] = tier
for (var/id in node.unlock_ids)
next += SSresearch.techweb_node_by_id(id)
current = next
/datum/techweb/proc/update_node_status(datum/techweb_node/node, autoupdate_consoles = TRUE)
var/researched = FALSE
var/available = FALSE
var/visible = FALSE
if(researched_nodes[node.id])
researched = TRUE
var/needed = node.prereq_ids.len
for(var/id in node.prereq_ids)
if(researched_nodes[id])
visible = TRUE
needed--
if(!needed)
available = TRUE
researched_nodes -= node.id
available_nodes -= node.id
visible_nodes -= node.id
if(hidden_nodes[node.id]) //Hidden.
return
if(researched)
researched_nodes[node.id] = TRUE
for(var/id in node.design_ids)
add_design(SSresearch.techweb_design_by_id(id))
else
if(available)
available_nodes[node.id] = TRUE
else
if(visible)
visible_nodes[node.id] = TRUE
update_tiers(node)
if(autoupdate_consoles)
for(var/v in consoles_accessing)
var/obj/machinery/computer/rdconsole/V = v
V.rescan_views()
V.updateUsrDialog()
//Laggy procs to do specific checks, just in case. Don't use them if you can just use the vars that already store all this!
/datum/techweb/proc/designHasReqs(datum/design/D)
for(var/i in researched_nodes)
var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i)
if(N.design_ids[D.id])
return TRUE
return FALSE
/datum/techweb/proc/isDesignResearched(datum/design/D)
return isDesignResearchedID(D.id)
/datum/techweb/proc/isDesignResearchedID(id)
return researched_designs[id]? SSresearch.techweb_design_by_id(id) : FALSE
/datum/techweb/proc/isNodeResearched(datum/techweb_node/N)
return isNodeResearchedID(N.id)
/datum/techweb/proc/isNodeResearchedID(id)
return researched_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE
/datum/techweb/proc/isNodeVisible(datum/techweb_node/N)
return isNodeResearchedID(N.id)
/datum/techweb/proc/isNodeVisibleID(id)
return visible_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE
/datum/techweb/proc/isNodeAvailable(datum/techweb_node/N)
return isNodeAvailableID(N.id)
/datum/techweb/proc/isNodeAvailableID(id)
return available_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE
/datum/techweb/specialized
var/allowed_buildtypes = ALL
/datum/techweb/specialized/add_design(datum/design/D)
if(!(D.build_type & allowed_buildtypes))
return FALSE
return ..()
/datum/techweb/specialized/autounlocking
var/design_autounlock_buildtypes = NONE
var/design_autounlock_categories = list("initial") //if a design has a buildtype that matches the abovea and either has a category in this or this is null, unlock it.
var/node_autounlock_ids = list() //autounlock nodes of this type.
/datum/techweb/specialized/autounlocking/New()
..()
autounlock()
/datum/techweb/specialized/autounlocking/proc/autounlock()
for(var/id in node_autounlock_ids)
research_node_id(id, TRUE, FALSE)
for(var/id in SSresearch.techweb_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(id)
if(D.build_type & design_autounlock_buildtypes)
for(var/i in D.category)
if(i in design_autounlock_categories)
add_design_by_id(D.id)
break
/datum/techweb/specialized/autounlocking/autolathe
design_autounlock_buildtypes = AUTOLATHE
allowed_buildtypes = AUTOLATHE
/datum/techweb/specialized/autounlocking/limbgrower
design_autounlock_buildtypes = LIMBGROWER
allowed_buildtypes = LIMBGROWER
/datum/techweb/specialized/autounlocking/biogenerator
design_autounlock_buildtypes = BIOGENERATOR
allowed_buildtypes = BIOGENERATOR
/datum/techweb/specialized/autounlocking/smelter
design_autounlock_buildtypes = SMELTER
allowed_buildtypes = SMELTER
/datum/techweb/specialized/autounlocking/exofab
allowed_buildtypes = MECHFAB
/datum/techweb/specialized/autounlocking/autoylathe
design_autounlock_buildtypes = AUTOYLATHE
allowed_buildtypes = AUTOYLATHE
/datum/techweb/specialized/autounlocking/autobottler
design_autounlock_buildtypes = AUTOBOTTLER
allowed_buildtypes = AUTOBOTTLER
@@ -1,97 +0,0 @@
//Techweb nodes are GLOBAL, there should only be one instance of them in the game. Persistant changes should never be made to them in-game.
//USE SSRESEARCH PROCS TO OBTAIN REFERENCES. DO NOT REFERENCE OUTSIDE OF SSRESEARCH OR YOU WILL FUCK UP GC.
/datum/techweb_node
var/id
var/display_name = "Errored Node"
var/description = "Why are you seeing this?"
var/hidden = FALSE //Whether it starts off hidden.
var/starting_node = FALSE //Whether it's available without any research.
var/list/prereq_ids = list()
var/list/design_ids = list()
var/list/unlock_ids = list() //CALCULATED FROM OTHER NODE'S PREREQUISITES. Assoc list id = TRUE.
var/list/boost_item_paths = list() //Associative list, path = list(point type = point_value).
var/autounlock_by_boost = TRUE //boosting this will autounlock this node.
var/export_price = 0 //Cargo export price.
var/list/research_costs = list() //Point cost to research. type = amount
var/category = "Misc" //Category
/datum/techweb_node/error_node
id = "ERROR"
display_name = "ERROR"
description = "This usually means something in the database has corrupted. If it doesn't go away automatically, inform Central Command for their techs to fix it ASAP(tm)"
/datum/techweb_node/proc/Initialize()
//Make lists associative for lookup
for(var/id in prereq_ids)
prereq_ids[id] = TRUE
for(var/id in design_ids)
design_ids[id] = TRUE
for(var/id in unlock_ids)
unlock_ids[id] = TRUE
/datum/techweb_node/Destroy()
SSresearch.techweb_nodes -= id
return ..()
/datum/techweb_node/serialize_list(list/options)
. = list()
VARSET_TO_LIST(., id)
VARSET_TO_LIST(., display_name)
VARSET_TO_LIST(., hidden)
VARSET_TO_LIST(., starting_node)
VARSET_TO_LIST(., assoc_list_strip_value(prereq_ids))
VARSET_TO_LIST(., assoc_list_strip_value(design_ids))
VARSET_TO_LIST(., assoc_list_strip_value(unlock_ids))
VARSET_TO_LIST(., boost_item_paths)
VARSET_TO_LIST(., autounlock_by_boost)
VARSET_TO_LIST(., export_price)
VARSET_TO_LIST(., research_costs)
VARSET_TO_LIST(., category)
/datum/techweb_node/deserialize_list(list/input, list/options)
if(!input["id"])
return
VARSET_FROM_LIST(input, id)
VARSET_FROM_LIST(input, display_name)
VARSET_FROM_LIST(input, hidden)
VARSET_FROM_LIST(input, starting_node)
VARSET_FROM_LIST(input, prereq_ids)
VARSET_FROM_LIST(input, design_ids)
VARSET_FROM_LIST(input, unlock_ids)
VARSET_FROM_LIST(input, boost_item_paths)
VARSET_FROM_LIST(input, autounlock_by_boost)
VARSET_FROM_LIST(input, export_price)
VARSET_FROM_LIST(input, research_costs)
VARSET_FROM_LIST(input, category)
Initialize()
return src
/datum/techweb_node/proc/on_design_deletion(datum/design/D)
prune_design_id(D.id)
/datum/techweb_node/proc/on_node_deletion(datum/techweb_node/TN)
prune_node_id(TN.id)
/datum/techweb_node/proc/prune_design_id(design_id)
design_ids -= design_id
/datum/techweb_node/proc/prune_node_id(node_id)
prereq_ids -= node_id
unlock_ids -= node_id
/datum/techweb_node/proc/get_price(datum/techweb/host)
if(host)
var/list/actual_costs = research_costs
if(host.boosted_nodes[id])
var/list/L = host.boosted_nodes[id]
for(var/i in L)
if(actual_costs[i])
actual_costs[i] -= L[i]
return actual_costs
else
return research_costs
/datum/techweb_node/proc/price_display(datum/techweb/TN)
return techweb_point_display_generic(get_price(TN))
File diff suppressed because it is too large Load Diff
@@ -1,133 +0,0 @@
//Barrier cube - Chilling Grey
/obj/item/barriercube
name = "barrier cube"
desc = "A compressed cube of slime. When squeezed, it grows to massive size!"
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "barriercube"
w_class = WEIGHT_CLASS_TINY
/obj/item/barriercube/attack_self(mob/user)
if(locate(/obj/structure/barricade/slime) in get_turf(loc))
to_chat(user, "<span class='warning'>You can't fit more than one barrier in the same space!</span>")
return
to_chat(user, "<span class='notice'>You squeeze [src].</span>")
var/obj/B = new /obj/structure/barricade/slime(get_turf(loc))
B.visible_message("<span class='warning'>[src] suddenly grows into a large, gelatinous barrier!</span>")
qdel(src)
//Slime barricade - Chilling Grey
/obj/structure/barricade/slime
name = "gelatinous barrier"
desc = "A huge chunk of grey slime. Bullets might get stuck in it."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "slimebarrier"
proj_pass_rate = 40
max_integrity = 60
//Melting Gel Wall - Chilling Metal
/obj/effect/forcefield/slimewall
name = "solidified gel"
desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!"
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "slimebarrier_thick"
CanAtmosPass = ATMOS_PASS_NO
opacity = TRUE
timeleft = 100
//Rainbow barrier - Chilling Rainbow
/obj/effect/forcefield/slimewall/rainbow
name = "rainbow barrier"
desc = "Despite others' urgings, you probably shouldn't taste this."
icon_state = "rainbowbarrier"
//Ration pack - Chilling Silver
/obj/item/reagent_containers/food/snacks/rationpack
name = "ration pack"
desc = "A square bar that sadly <i>looks</i> like chocolate, packaged in a nondescript grey wrapper. Has saved soldiers' lives before - usually by stopping bullets."
icon_state = "rationpack"
bitesize = 3
junkiness = 15
filling_color = "#964B00"
tastes = list("cardboard" = 3, "sadness" = 3)
foodtype = null //Don't ask what went into them. You're better off not knowing.
list_reagents = list("stabilizednutriment" = 10, "nutriment" = 2) //Won't make you fat. Will make you question your sanity.
/obj/item/reagent_containers/food/snacks/rationpack/checkLiked(fraction, mob/M) //Nobody likes rationpacks. Nobody.
if(last_check_time + 50 < world.time)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.mind && !HAS_TRAIT(H, TRAIT_AGEUSIA))
to_chat(H,"<span class='notice'>That didn't taste very good...</span>") //No disgust, though. It's just not good tasting.
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
last_check_time = world.time
return
..()
//Ice stasis block - Chilling Dark Blue
/obj/structure/ice_stasis
name = "ice block"
desc = "A massive block of ice. You can see something vaguely humanoid inside."
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "frozen"
density = TRUE
max_integrity = 100
armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30)
/obj/structure/ice_stasis/Initialize()
. = ..()
playsound(src, 'sound/magic/ethereal_exit.ogg', 50, 1)
/obj/structure/ice_stasis/Destroy()
for(var/atom/movable/M in contents)
M.forceMove(loc)
playsound(src, 'sound/effects/glassbr3.ogg', 50, 1)
return ..()
//Gold capture device - Chilling Gold
/obj/item/capturedevice
name = "gold capture device"
desc = "Bluespace technology packed into a roughly egg-shaped device, used to store nonhuman creatures. Can't catch them all, though - it only fits one."
w_class = WEIGHT_CLASS_SMALL
icon = 'icons/obj/slimecrossing.dmi'
icon_state = "capturedevice"
/obj/item/capturedevice/attack(mob/living/M, mob/user)
if(length(contents))
to_chat(user, "<span class='warning'>The device already has something inside.</span>")
return
if(!isanimal(M))
to_chat(user, "<span class='warning'>The capture device only works on simple creatures.</span>")
return
if(M.mind)
to_chat(user, "<span class='notice'>You offer the device to [M].</span>")
if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") == "Yes")
if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE))
to_chat(user, "<span class='notice'>You store [M] in the capture device.</span>")
to_chat(M, "<span class='notice'>The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.</span>")
store(M, user)
else
to_chat(user, "<span class='warning'>You were too far away from [M].</span>")
to_chat(M, "<span class='warning'>You were too far away from [user].</span>")
else
to_chat(user, "<span class='warning'>[M] refused to enter the device.</span>")
return
else
if(istype(M, /mob/living/simple_animal/hostile) && !("neutral" in M.faction))
to_chat(user, "<span class='warning'>This creature is too aggressive to capture.</span>")
return
to_chat(user, "<span class='notice'>You store [M] in the capture device.</span>")
store(M)
/obj/item/capturedevice/attack_self(mob/user)
if(contents.len)
to_chat(user, "<span class='notice'>You open the capture device!</span>")
release()
else
to_chat(user, "<span class='warning'>The device is empty...</span>")
/obj/item/capturedevice/proc/store(var/mob/living/M)
M.forceMove(src)
/obj/item/capturedevice/proc/release()
for(var/atom/movable/M in contents)
M.forceMove(get_turf(loc))
@@ -1,974 +0,0 @@
/obj/screen/alert/status_effect/rainbow_protection
name = "Rainbow Protection"
desc = "You are defended from harm, but so are those you might seek to injure!"
icon_state = "slime_rainbowshield"
/datum/status_effect/rainbow_protection
id = "rainbow_protection"
duration = 100
alert_type = /obj/screen/alert/status_effect/rainbow_protection
var/originalcolor
/datum/status_effect/rainbow_protection/on_apply()
owner.status_flags |= GODMODE
ADD_TRAIT(owner, TRAIT_PACIFISM, "slimestatus")
owner.visible_message("<span class='warning'>[owner] shines with a brilliant rainbow light.</span>",
"<span class='notice'>You feel protected by an unknown force!</span>")
originalcolor = owner.color
return ..()
/datum/status_effect/rainbow_protection/tick()
owner.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return ..()
/datum/status_effect/rainbow_protection/on_remove()
owner.status_flags &= ~GODMODE
owner.color = originalcolor
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "slimestatus")
owner.visible_message("<span class='notice'>[owner] stops glowing, the rainbow light fading away.</span>",
"<span class='warning'>You no longer feel protected...</span>")
/obj/screen/alert/status_effect/slimeskin
name = "Adamantine Slimeskin"
desc = "You are covered in a thick, non-neutonian gel."
icon_state = "slime_stoneskin"
/datum/status_effect/slimeskin
id = "slimeskin"
duration = 300
alert_type = /obj/screen/alert/status_effect/slimeskin
var/originalcolor
/datum/status_effect/slimeskin/on_apply()
originalcolor = owner.color
owner.color = "#3070CC"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance += 10
owner.visible_message("<span class='warning'>[owner] is suddenly covered in a strange, blue-ish gel!</span>",
"<span class='notice'>You are covered in a thick, rubbery gel.</span>")
return ..()
/datum/status_effect/slimeskin/on_remove()
owner.color = originalcolor
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance -= 10
owner.visible_message("<span class='warning'>[owner]'s gel coating liquefies and dissolves away.</span>",
"<span class='notice'>Your gel second-skin dissolves!</span>")
/datum/status_effect/slimerecall
id = "slime_recall"
duration = -1 //Will be removed by the extract.
alert_type = null
var/interrupted = FALSE
var/mob/target
var/icon/bluespace
/datum/status_effect/slimerecall/on_apply()
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/resistField)
to_chat(owner, "<span class='danger'>You feel a sudden tug from an unknown force, and feel a pull to bluespace!</span>")
to_chat(owner, "<span class='notice'>Resist if you wish avoid the force!</span>")
bluespace = icon('icons/effects/effects.dmi',"chronofield")
owner.add_overlay(bluespace)
return ..()
/datum/status_effect/slimerecall/proc/resistField()
interrupted = TRUE
owner.remove_status_effect(src)
/datum/status_effect/slimerecall/on_remove()
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
owner.cut_overlay(bluespace)
if(interrupted || !ismob(target))
to_chat(owner, "<span class='warning'>The bluespace tug fades away, and you feel that the force has passed you by.</span>")
return
owner.visible_message("<span class='warning'>[owner] disappears in a flurry of sparks!</span>",
"<span class='warning'>The unknown force snatches briefly you from reality, and deposits you next to [target]!</span>")
do_sparks(3, TRUE, owner)
owner.forceMove(target.loc)
/obj/screen/alert/status_effect/freon/stasis
desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out."
/datum/status_effect/frozenstasis
id = "slime_frozen"
status_type = STATUS_EFFECT_UNIQUE
duration = -1 //Will remove self when block breaks.
alert_type = /obj/screen/alert/status_effect/freon/stasis
var/obj/structure/ice_stasis/cube
/datum/status_effect/frozenstasis/on_apply()
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/breakCube)
cube = new /obj/structure/ice_stasis(get_turf(owner))
owner.forceMove(cube)
owner.status_flags |= GODMODE
return ..()
/datum/status_effect/frozenstasis/tick()
if(!cube || owner.loc != cube)
owner.remove_status_effect(src)
/datum/status_effect/frozenstasis/proc/breakCube()
owner.remove_status_effect(src)
/datum/status_effect/frozenstasis/on_remove()
if(cube)
qdel(cube)
owner.status_flags &= ~GODMODE
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
/datum/status_effect/slime_clone
id = "slime_cloned"
status_type = STATUS_EFFECT_UNIQUE
duration = -1
alert_type = null
var/mob/living/clone
var/datum/mind/originalmind //For when the clone gibs.
/datum/status_effect/slime_clone/on_apply()
var/typepath = owner.type
clone = new typepath(owner.loc)
var/mob/living/carbon/O = owner
var/mob/living/carbon/C = clone
if(istype(C) && istype(O))
C.real_name = O.real_name
O.dna.transfer_identity(C)
C.updateappearance(mutcolor_update=1)
if(owner.mind)
originalmind = owner.mind
owner.mind.transfer_to(clone)
clone.apply_status_effect(/datum/status_effect/slime_clone_decay)
return ..()
/datum/status_effect/slime_clone/tick()
if(!istype(clone) || clone.stat != CONSCIOUS)
owner.remove_status_effect(src)
/datum/status_effect/slime_clone/on_remove()
if(clone && clone.mind && owner)
clone.mind.transfer_to(owner)
else
if(owner && originalmind)
originalmind.transfer_to(owner)
if(originalmind.key)
owner.ckey = originalmind.key
if(clone)
clone.unequip_everything()
qdel(clone)
/obj/screen/alert/status_effect/clone_decay
name = "Clone Decay"
desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall."
icon_state = "slime_clonedecay"
/datum/status_effect/slime_clone_decay
id = "slime_clonedecay"
status_type = STATUS_EFFECT_UNIQUE
duration = -1
alert_type = /obj/screen/alert/status_effect/clone_decay
/datum/status_effect/slime_clone_decay/tick()
owner.adjustToxLoss(1, 0)
owner.adjustOxyLoss(1, 0)
owner.adjustBruteLoss(1, 0)
owner.adjustFireLoss(1, 0)
owner.color = "#007BA7"
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/bloodchill
id = "bloodchill"
duration = 100
alert_type = /obj/screen/alert/status_effect/bloodchill
/datum/status_effect/bloodchill/on_apply()
owner.add_movespeed_modifier("bloodchilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
return ..()
/datum/status_effect/bloodchill/tick()
if(prob(50))
owner.adjustFireLoss(2)
/datum/status_effect/bloodchill/on_remove()
owner.remove_movespeed_modifier("bloodchilled")
/obj/screen/alert/status_effect/bloodchill
name = "Bloodchilled"
desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/bonechill
id = "bonechill"
duration = 80
alert_type = /obj/screen/alert/status_effect/bonechill
/datum/status_effect/bonechill/on_apply()
owner.add_movespeed_modifier("bonechilled", TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = 3)
return ..()
/datum/status_effect/bonechill/tick()
if(prob(50))
owner.adjustFireLoss(1)
owner.Jitter(3)
owner.adjust_bodytemperature(-10)
/datum/status_effect/bonechill/on_remove()
owner.remove_movespeed_modifier("bonechilled")
/obj/screen/alert/status_effect/bonechill
name = "Bonechilled"
desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!"
icon_state = "bloodchill"
/datum/status_effect/rebreathing
id = "rebreathing"
duration = -1
alert_type = null
datum/status_effect/rebreathing/tick()
owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing.
///////////////////////////////////////////////////////
//////////////////CONSUMING EXTRACTS///////////////////
///////////////////////////////////////////////////////
/datum/status_effect/firecookie
id = "firecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/firecookie/on_apply()
ADD_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie")
owner.adjust_bodytemperature(110)
return ..()
/datum/status_effect/firecookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie")
/datum/status_effect/watercookie
id = "watercookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/watercookie/on_apply()
ADD_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie")
return ..()
/datum/status_effect/watercookie/tick()
for(var/turf/open/T in range(get_turf(owner),1))
T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5)
/datum/status_effect/watercookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie")
/datum/status_effect/metalcookie
id = "metalcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/metalcookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod *= 0.9
return ..()
/datum/status_effect/metalcookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.brute_mod /= 0.9
/datum/status_effect/sparkcookie
id = "sparkcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
var/original_coeff
/datum/status_effect/sparkcookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
original_coeff = H.physiology.siemens_coeff
H.physiology.siemens_coeff = 0
return ..()
/datum/status_effect/sparkcookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.siemens_coeff = original_coeff
/datum/status_effect/toxincookie
id = "toxincookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 600
/datum/status_effect/toxincookie/on_apply()
ADD_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie")
return ..()
/datum/status_effect/toxincookie/on_remove()
REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie")
/datum/status_effect/timecookie
id = "timecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 600
/datum/status_effect/timecookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed *= 0.95
return ..()
/datum/status_effect/timecookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H
H.physiology.do_after_speed /= 0.95
/datum/status_effect/lovecookie
id = "lovecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
/datum/status_effect/lovecookie/tick()
if(owner.stat != CONSCIOUS)
return
if(iscarbon(owner))
var/mob/living/carbon/C = owner
if(C.handcuffed)
return
var/list/huggables = list()
for(var/mob/living/carbon/L in range(get_turf(owner),1))
if(L != owner)
huggables += L
if(length(huggables))
var/mob/living/carbon/hugged = pick(huggables)
owner.visible_message("<span class='notice'>[owner] hugs [hugged]!</span>", "<span class='notice'>You hug [hugged]!</span>")
/datum/status_effect/tarcookie
id = "tarcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/tarcookie/tick()
for(var/mob/living/carbon/human/L in range(get_turf(owner),1))
if(L != owner)
L.apply_status_effect(/datum/status_effect/tarfoot)
/datum/status_effect/tarfoot
id = "tarfoot"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 30
/datum/status_effect/tarfoot/on_apply()
owner.add_movespeed_modifier(MOVESPEED_ID_TARFOOT, update=TRUE, priority=100, multiplicative_slowdown=0.5, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/tarfoot/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
/datum/status_effect/spookcookie
id = "spookcookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 300
/datum/status_effect/spookcookie/on_apply()
var/image/I = image(icon = 'icons/mob/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner)
I.override = 1
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I)
return ..()
/datum/status_effect/spookcookie/on_remove()
owner.remove_alt_appearance("spookyscary")
/datum/status_effect/peacecookie
id = "peacecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/peacecookie/tick()
for(var/mob/living/L in range(get_turf(owner),1))
L.apply_status_effect(/datum/status_effect/plur)
/datum/status_effect/plur
id = "plur"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 30
/datum/status_effect/plur/on_apply()
ADD_TRAIT(owner, TRAIT_PACIFISM, "peacecookie")
return ..()
/datum/status_effect/plur/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie")
/datum/status_effect/adamantinecookie
id = "adamantinecookie"
status_type = STATUS_EFFECT_REPLACE
alert_type = null
duration = 100
/datum/status_effect/adamantinecookie/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod *= 0.9
return ..()
/datum/status_effect/adamantinecookie/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.burn_mod /= 0.9
///////////////////////////////////////////////////////
//////////////////STABILIZED EXTRACTS//////////////////
///////////////////////////////////////////////////////
/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its' own.
id = "stabilizedbase"
duration = -1
alert_type = null
var/obj/item/slimecross/stabilized/linked_extract
var/colour = "null"
/datum/status_effect/stabilized/tick()
if(!linked_extract || !linked_extract.loc) //Sanity checking
qdel(src)
return
if(linked_extract && linked_extract.loc != owner && linked_extract.loc.loc != owner)
linked_extract.linked_effect = null
if(!QDELETED(linked_extract))
linked_extract.owner = null
START_PROCESSING(SSobj,linked_extract)
qdel(src)
return ..()
/datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case.
id = "stabilizednull"
//Stabilized effects start below.
/datum/status_effect/stabilized/grey
id = "stabilizedgrey"
colour = "grey"
/datum/status_effect/stabilized/grey/tick()
for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner)))
if(!(owner in S.Friends))
to_chat(owner, "<span class='notice'>[linked_extract] pulses gently as it communicates with [S]</span>")
S.Friends[owner] = 1
return ..()
/datum/status_effect/stabilized/orange
id = "stabilizedorange"
colour = "orange"
/datum/status_effect/stabilized/orange/tick()
var/body_temperature_difference = BODYTEMP_NORMAL - owner.bodytemperature
owner.adjust_bodytemperature(min(5,body_temperature_difference))
return ..()
/datum/status_effect/stabilized/purple
id = "stabilizedpurple"
colour = "purple"
/datum/status_effect/stabilized/purple/tick()
var/is_healing = FALSE
if(owner.getBruteLoss() > 0)
owner.adjustBruteLoss(-0.2)
is_healing = TRUE
if(owner.getFireLoss() > 0)
owner.adjustFireLoss(-0.2)
is_healing = TRUE
if(owner.getToxLoss() > 0)
owner.adjustToxLoss(-0.2, forced = TRUE) //Slimepeople should also get healed.
is_healing = TRUE
if(is_healing)
examine_text = "<span class='warning'>SUBJECTPRONOUN is regenerating slowly, purplish goo filling in small injuries!</span>"
new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000")
else
examine_text = null
..()
/datum/status_effect/stabilized/blue
id = "stabilizedblue"
colour = "blue"
/datum/status_effect/stabilized/blue/on_apply()
ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
return ..()
datum/status_effect/stabilized/blue/on_remove()
REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus")
/datum/status_effect/stabilized/metal
id = "stabilizedmetal"
colour = "metal"
var/cooldown = 30
var/max_cooldown = 30
/datum/status_effect/stabilized/metal/tick()
if(cooldown > 0)
cooldown--
else
cooldown = max_cooldown
var/list/sheets = list()
for(var/obj/item/stack/sheet/S in owner.GetAllContents())
if(S.amount < S.max_amount)
sheets += S
if(sheets.len > 0)
var/obj/item/stack/sheet/S = pick(sheets)
S.amount++
to_chat(owner, "<span class='notice'>[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!</span>")
return ..()
/datum/status_effect/stabilized/yellow
id = "stabilizedyellow"
colour = "yellow"
var/cooldown = 10
var/max_cooldown = 10
examine_text = "<span class='warning'>Nearby electronics seem just a little more charged wherever SUBJECTPRONOUN goes.</span>"
/datum/status_effect/stabilized/yellow/tick()
if(cooldown > 0)
cooldown--
return ..()
cooldown = max_cooldown
var/list/batteries = list()
for(var/obj/item/stock_parts/cell/C in owner.GetAllContents())
if(C.charge < C.maxcharge)
batteries += C
if(batteries.len)
var/obj/item/stock_parts/cell/ToCharge = pick(batteries)
ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum.
to_chat(owner, "<span class='notice'>[linked_extract] discharges some energy into a device you have.</span>")
return ..()
/obj/item/hothands
name = "burning fingertips"
desc = "You shouldn't see this."
/obj/item/hothands/get_temperature()
return 290 //Below what's required to ignite plasma.
/datum/status_effect/stabilized/darkpurple
id = "stabilizeddarkpurple"
colour = "dark purple"
var/obj/item/hothands/fire
examine_text = "<span class='notice'>Their fingertips burn brightly!</span>"
/datum/status_effect/stabilized/darkpurple/on_apply()
ADD_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus")
fire = new(owner)
return ..()
/datum/status_effect/stabilized/darkpurple/tick()
var/obj/item/I = owner.get_active_held_item()
var/obj/item/reagent_containers/food/snacks/F = I
if(istype(F))
if(F.cooked_type)
to_chat(owner, "<span class='warning'>[linked_extract] flares up brightly, and your hands alone are enough cook [F]!</span>")
F.microwave_act()
else
I.attackby(fire, owner)
return ..()
/datum/status_effect/stabilized/darkpurple/on_remove()
REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus")
qdel(fire)
/datum/status_effect/stabilized/darkblue
id = "stabilizeddarkblue"
colour = "dark blue"
/datum/status_effect/stabilized/darkblue/tick()
if(owner.fire_stacks > 0 && prob(80))
owner.fire_stacks--
if(owner.fire_stacks <= 0)
to_chat(owner, "<span class='notice'>[linked_extract] coats you in a watery goo, extinguishing the flames.</span>")
var/obj/O = owner.get_active_held_item()
if(O)
O.extinguish() //All shamelessly copied from water's reaction_obj, since I didn't seem to be able to get it here for some reason.
O.acid_level = 0
// Monkey cube
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It makes [O] expand!</span>")
var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
cube.Expand()
// Dehydrated carp
else if(istype(O, /obj/item/toy/plush/carpplushie/dehy_carp))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It makes [O] expand!</span>")
var/obj/item/toy/plush/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
else if(istype(O, /obj/item/stack/sheet/hairlesshide))
to_chat(owner, "<span class='warning'>[linked_extract] kept your hands wet! It wets [O]!</span>")
var/obj/item/stack/sheet/hairlesshide/HH = O
new /obj/item/stack/sheet/wetleather(get_turf(HH), HH.amount)
qdel(HH)
..()
/datum/status_effect/stabilized/silver
id = "stabilizedsilver"
colour = "silver"
/datum/status_effect/stabilized/silver/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod *= 0.8 //20% buff
return ..()
/datum/status_effect/stabilized/silver/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.hunger_mod /= 0.8
//Bluespace has an icon because it's kinda active.
/obj/screen/alert/status_effect/bluespaceslime
name = "Stabilized Bluespace Extract"
desc = "You shouldn't see this, since we set it to change automatically!"
icon_state = "slime_bluespace_on"
/datum/status_effect/bluespacestabilization
id = "stabilizedbluespacecooldown"
duration = 1200
alert_type = null
/datum/status_effect/stabilized/bluespace
id = "stabilizedbluespace"
colour = "bluespace"
alert_type = /obj/screen/alert/status_effect/bluespaceslime
var/healthcheck
/datum/status_effect/stabilized/bluespace/tick()
if(owner.has_status_effect(/datum/status_effect/bluespacestabilization))
linked_alert.desc = "The stabilized bluespace extract is still aligning you with the bluespace axis."
linked_alert.icon_state = "slime_bluespace_off"
return ..()
else
linked_alert.desc = "The stabilized bluespace extract will try to redirect you from harm!"
linked_alert.icon_state = "slime_bluespace_on"
if(healthcheck && (healthcheck - owner.health) > 5)
owner.visible_message("<span class='warning'>[linked_extract] notices the sudden change in [owner]'s physical health, and activates!</span>")
do_sparks(5,FALSE,owner)
var/F = find_safe_turf(zlevels = owner.z, extended_safety_checks = TRUE)
var/range = 0
if(!F)
F = get_turf(owner)
range = 50
if(do_teleport(owner, F, range, channel = TELEPORT_CHANNEL_BLUESPACE))
to_chat(owner, "<span class='notice'>[linked_extract] will take some time to re-align you on the bluespace axis.</span>")
do_sparks(5,FALSE,owner)
owner.apply_status_effect(/datum/status_effect/bluespacestabilization)
healthcheck = owner.health
return ..()
/datum/status_effect/stabilized/sepia
id = "stabilizedsepia"
colour = "sepia"
var/mod = 0
/datum/status_effect/stabilized/sepia/tick()
if(prob(50) && mod > -1)
mod--
owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
else if(mod < 1)
mod++
// yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly
owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=0, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/stabilized/sepia/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
/datum/status_effect/stabilized/cerulean
id = "stabilizedcerulean"
colour = "cerulean"
var/mob/living/clone
/datum/status_effect/stabilized/cerulean/on_apply()
var/typepath = owner.type
clone = new typepath(owner.loc)
var/mob/living/carbon/O = owner
var/mob/living/carbon/C = clone
if(istype(C) && istype(O))
C.real_name = O.real_name
O.dna.transfer_identity(C)
C.updateappearance(mutcolor_update=1)
return ..()
/datum/status_effect/stabilized/cerulean/tick()
if(owner.stat == DEAD)
if(clone && clone.stat != DEAD)
owner.visible_message("<span class='warning'>[owner] blazes with brilliant light, [linked_extract] whisking [owner.p_their()] soul away.</span>",
"<span class='notice'>You feel a warm glow from [linked_extract], and you open your eyes... elsewhere.</span>")
if(owner.mind)
owner.mind.transfer_to(clone)
clone = null
qdel(linked_extract)
if(!clone || clone.stat == DEAD)
to_chat(owner, "<span class='notice'>[linked_extract] desperately tries to move your soul to a living body, but can't find one!</span>")
qdel(linked_extract)
..()
/datum/status_effect/stabilized/cerulean/on_remove()
if(clone)
clone.visible_message("<span class='warning'>[clone] dissolves into a puddle of goo!</span>")
clone.unequip_everything()
qdel(clone)
/datum/status_effect/stabilized/pyrite
id = "stabilizedpyrite"
colour = "pyrite"
var/originalcolor
/datum/status_effect/stabilized/pyrite/on_apply()
originalcolor = owner.color
return ..()
/datum/status_effect/stabilized/pyrite/tick()
owner.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return ..()
/datum/status_effect/stabilized/pyrite/on_remove()
owner.color = originalcolor
/datum/status_effect/stabilized/red
id = "stabilizedred"
colour = "red"
/datum/status_effect/stabilized/red/on_apply()
owner.ignore_slowdown("slimestatus")
return ..()
/datum/status_effect/stabilized/red/on_remove()
owner.unignore_slowdown("slimestatus")
/datum/status_effect/stabilized/green
id = "stabilizedgreen"
colour = "green"
var/datum/dna/originalDNA
var/originalname
/datum/status_effect/stabilized/green/on_apply()
to_chat(owner, "<span class='warning'>You feel different...</span>")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
originalDNA = new H.dna.type
originalname = H.real_name
H.dna.copy_dna(originalDNA)
randomize_human(H)
return ..()
/datum/status_effect/stabilized/green/tick() //Only occasionally give examiners a warning.
if(prob(50))
examine_text = "<span class='warning'>SUBJECTPRONOUN looks a bit green and gooey...</span>"
else
examine_text = null
return ..()
/datum/status_effect/stabilized/green/on_remove()
to_chat(owner, "<span class='notice'>You feel more like yourself.</span>")
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
originalDNA.transfer_identity(H)
H.real_name = originalname
H.updateappearance(mutcolor_update=1)
/datum/status_effect/brokenpeace
id = "brokenpeace"
duration = 1200
alert_type = null
/datum/status_effect/pinkdamagetracker
id = "pinkdamagetracker"
duration = -1
alert_type = null
var/damage = 0
var/lasthealth
/datum/status_effect/pinkdamagetracker/tick()
if((lasthealth - owner.health) > 0)
damage += (lasthealth - owner.health)
lasthealth = owner.health
/datum/status_effect/stabilized/pink
id = "stabilizedpink"
colour = "pink"
var/list/mobs = list()
var/faction_name
/datum/status_effect/stabilized/pink/on_apply()
faction_name = owner.real_name
return ..()
/datum/status_effect/stabilized/pink/tick()
for(var/mob/living/simple_animal/M in view(7,get_turf(owner)))
if(!(M in mobs))
mobs += M
M.apply_status_effect(/datum/status_effect/pinkdamagetracker)
M.faction |= faction_name
for(var/mob/living/simple_animal/M in mobs)
if(!(M in view(7,get_turf(owner))))
M.faction -= faction_name
M.remove_status_effect(/datum/status_effect/pinkdamagetracker)
mobs -= M
var/datum/status_effect/pinkdamagetracker/C = M.has_status_effect(/datum/status_effect/pinkdamagetracker)
if(istype(C) && C.damage > 0)
C.damage = 0
owner.apply_status_effect(/datum/status_effect/brokenpeace)
var/HasFaction = FALSE
for(var/i in owner.faction)
if(i == faction_name)
HasFaction = TRUE
if(HasFaction && owner.has_status_effect(/datum/status_effect/brokenpeace))
owner.faction -= faction_name
to_chat(owner, "<span class='userdanger'>The peace has been broken! Hostile creatures will now react to you!</span>")
if(!HasFaction && !owner.has_status_effect(/datum/status_effect/brokenpeace))
to_chat(owner, "<span class='notice'>[linked_extract] pulses, generating a fragile aura of peace.</span>")
owner.faction |= faction_name
return ..()
/datum/status_effect/stabilized/pink/on_remove()
for(var/mob/living/simple_animal/M in mobs)
M.faction -= faction_name
M.remove_status_effect(/datum/status_effect/pinkdamagetracker)
for(var/i in owner.faction)
if(i == faction_name)
owner.faction -= faction_name
/datum/status_effect/stabilized/oil
id = "stabilizedoil"
colour = "oil"
examine_text = "<span class='warning'>SUBJECTPRONOUN smells of sulfer and oil!</span>"
/datum/status_effect/stabilized/oil/tick()
if(owner.stat == DEAD)
explosion(get_turf(owner),1,2,4,flame_range = 5)
return ..()
/datum/status_effect/stabilized/black
id = "stabilizedblack"
colour = "black"
var/messagedelivered = FALSE
var/heal_amount = 1
/datum/status_effect/stabilized/black/tick()
if(owner.pulling && isliving(owner.pulling) && owner.grab_state == GRAB_KILL)
var/mob/living/M = owner.pulling
if(M.stat == DEAD)
return
if(!messagedelivered)
to_chat(owner,"<span class='notice'>You feel your hands melt around [M]'s neck and start to drain [M.p_them()] of life.</span>")
to_chat(owner.pulling, "<span class='userdanger'>[owner]'s hands melt around your neck, and you can feel your life starting to drain away!</span>")
messagedelivered = TRUE
examine_text = "<span class='warning'>SUBJECTPRONOUN is draining health from [owner.pulling]!</span>"
var/list/healing_types = list()
if(owner.getBruteLoss() > 0)
healing_types += BRUTE
if(owner.getFireLoss() > 0)
healing_types += BURN
if(owner.getToxLoss() > 0)
healing_types += TOX
if(owner.getCloneLoss() > 0)
healing_types += CLONE
owner.apply_damage_type(-heal_amount, damagetype=pick(healing_types))
owner.nutrition += 3
M.adjustCloneLoss(heal_amount * 1.2) //This way, two people can't just convert each other's damage away.
else
messagedelivered = FALSE
examine_text = null
return ..()
/datum/status_effect/stabilized/lightpink
id = "stabilizedlightpink"
colour = "light pink"
/datum/status_effect/stabilized/lightpink/on_apply()
owner.add_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
return ..()
/datum/status_effect/stabilized/lightpink/tick()
for(var/mob/living/carbon/human/H in range(1, get_turf(owner)))
if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent("epinephrine"))
to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.")
H.reagents.add_reagent("epinephrine",5)
return ..()
/datum/status_effect/stabilized/lightpink/on_remove()
owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS)
/datum/status_effect/stabilized/adamantine
id = "stabilizedadamantine"
colour = "adamantine"
examine_text = "<span class='warning'>SUBJECTPRONOUN has a strange metallic coating on their skin.</span>"
/datum/status_effect/stabilized/gold
id = "stabilizedgold"
colour = "gold"
var/mob/living/simple_animal/familiar
/datum/status_effect/stabilized/gold/tick()
var/obj/item/slimecross/stabilized/gold/linked = linked_extract
if(QDELETED(familiar))
familiar = new linked.mob_type(get_turf(owner.loc))
familiar.name = linked.mob_name
familiar.del_on_death = TRUE
familiar.copy_known_languages_from(owner, FALSE)
if(linked.saved_mind)
linked.saved_mind.transfer_to(familiar)
familiar.ckey = linked.saved_mind.key
else
if(familiar.mind)
linked.saved_mind = familiar.mind
return ..()
/datum/status_effect/stabilized/gold/on_remove()
if(familiar)
qdel(familiar)
/datum/status_effect/stabilized/adamantine/on_apply()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance += 5
return ..()
/datum/status_effect/stabilized/adamantine/on_remove()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.physiology.damage_resistance -= 5
/datum/status_effect/stabilized/rainbow
id = "stabilizedrainbow"
colour = "rainbow"
/datum/status_effect/stabilized/rainbow/tick()
if(owner.health <= 0)
var/obj/item/slimecross/stabilized/rainbow/X = linked_extract
if(istype(X))
if(X.regencore)
X.regencore.afterattack(owner,owner,TRUE)
X.regencore = null
owner.visible_message("<span class='warning'>[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!</span>")
qdel(src)
qdel(linked_extract)
return ..()
@@ -1,140 +0,0 @@
/*
Self-sustaining extracts:
Produces 4 extracts that do not need reagents.
*/
/obj/item/slimecross/selfsustaining
name = "self-sustaining extract"
effect = "self-sustaining"
icon_state = "selfsustaining"
var/extract_type = /obj/item/slime_extract
/obj/item/autoslime
name = "autoslime"
desc = "It resembles a normal slime extract, but seems filled with a strange, multi-colored fluid."
var/obj/item/slime_extract/extract
//Just divides into the actual item.
/obj/item/slimecross/selfsustaining/Initialize()
..()
visible_message("<span class='warning'>The [src] shudders, and splits into four smaller extracts.</span>")
for(var/i = 0, i < 4, i++)
var/obj/item/autoslime/A = new /obj/item/autoslime(src.loc)
var/obj/item/slime_extract/X = new extract_type(A)
A.extract = X
A.icon = icon
A.icon_state = icon_state
A.color = color
A.name = "self-sustaining " + colour + " extract"
return INITIALIZE_HINT_QDEL
/obj/item/autoslime/attack_self(mob/user)
var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in extract.activate_reagents
var/amount = 5
var/secondary
if ((user.get_active_held_item() != src || user.stat || user.restrained()))
return
if(!reagentselect)
return
if(reagentselect == "lesser plasma")
amount = 4
reagentselect = "plasma"
if(reagentselect == "holy water and uranium")
reagentselect = "holywater"
secondary = "uranium"
extract.forceMove(user.drop_location())
qdel(src)
user.put_in_active_hand(extract)
extract.reagents.add_reagent(reagentselect,amount)
if(secondary)
extract.reagents.add_reagent(secondary,amount)
//Different types.
/obj/item/slimecross/selfsustaining/grey
extract_type = /obj/item/slime_extract/grey
colour = "grey"
/obj/item/slimecross/selfsustaining/orange
extract_type = /obj/item/slime_extract/orange
colour = "orange"
/obj/item/slimecross/selfsustaining/purple
extract_type = /obj/item/slime_extract/purple
colour = "purple"
/obj/item/slimecross/selfsustaining/blue
extract_type = /obj/item/slime_extract/blue
colour = "blue"
/obj/item/slimecross/selfsustaining/metal
extract_type = /obj/item/slime_extract/metal
colour = "metal"
/obj/item/slimecross/selfsustaining/yellow
extract_type = /obj/item/slime_extract/yellow
colour = "yellow"
/obj/item/slimecross/selfsustaining/darkpurple
extract_type = /obj/item/slime_extract/darkpurple
colour = "dark purple"
/obj/item/slimecross/selfsustaining/darkblue
extract_type = /obj/item/slime_extract/darkblue
colour = "dark blue"
/obj/item/slimecross/selfsustaining/silver
extract_type = /obj/item/slime_extract/silver
colour = "silver"
/obj/item/slimecross/selfsustaining/bluespace
extract_type = /obj/item/slime_extract/bluespace
colour = "bluespace"
/obj/item/slimecross/selfsustaining/sepia
extract_type = /obj/item/slime_extract/sepia
colour = "sepia"
/obj/item/slimecross/selfsustaining/cerulean
extract_type = /obj/item/slime_extract/cerulean
colour = "cerulean"
/obj/item/slimecross/selfsustaining/pyrite
extract_type = /obj/item/slime_extract/pyrite
colour = "pyrite"
/obj/item/slimecross/selfsustaining/red
extract_type = /obj/item/slime_extract/red
colour = "red"
/obj/item/slimecross/selfsustaining/green
extract_type = /obj/item/slime_extract/green
colour = "green"
/obj/item/slimecross/selfsustaining/pink
extract_type = /obj/item/slime_extract/pink
colour = "pink"
/obj/item/slimecross/selfsustaining/gold
extract_type = /obj/item/slime_extract/gold
colour = "gold"
/obj/item/slimecross/selfsustaining/oil
extract_type = /obj/item/slime_extract/oil
colour = "oil"
/obj/item/slimecross/selfsustaining/black
extract_type = /obj/item/slime_extract/black
colour = "black"
/obj/item/slimecross/selfsustaining/lightpink
extract_type = /obj/item/slime_extract/lightpink
colour = "light pink"
/obj/item/slimecross/selfsustaining/adamantine
extract_type = /obj/item/slime_extract/adamantine
colour = "adamantine"
/obj/item/slimecross/selfsustaining/rainbow
extract_type = /obj/item/slime_extract/rainbow
colour = "rainbow"
@@ -1,309 +0,0 @@
//Xenobio control console
/mob/camera/aiEye/remote/xenobio
visible_icon = TRUE
icon = 'icons/mob/cameramob.dmi'
icon_state = "generic_camera"
var/allowed_area = null
/mob/camera/aiEye/remote/xenobio/Initialize()
var/area/A = get_area(loc)
allowed_area = A.name
. = ..()
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
var/area/new_area = get_area(t)
if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
return ..()
else
return
/obj/machinery/computer/camera_advanced/xenobio
name = "Slime management console"
desc = "A computer used for remotely handling slimes."
networks = list("ss13")
circuit = /obj/item/circuitboard/computer/xenobiology
var/datum/action/innate/slime_place/slime_place_action
var/datum/action/innate/slime_pick_up/slime_up_action
var/datum/action/innate/feed_slime/feed_slime_action
var/datum/action/innate/monkey_recycle/monkey_recycle_action
var/datum/action/innate/slime_scan/scan_action
var/datum/action/innate/feed_potion/potion_action
var/list/stored_slimes
var/obj/item/slimepotion/slime/current_potion
var/max_slimes = 1
var/monkeys = 0
var/upgradetier = 0
icon_screen = "slime_comp"
icon_keyboard = "rd_key"
light_color = LIGHT_COLOR_PINK
/obj/machinery/computer/camera_advanced/xenobio/Initialize()
. = ..()
slime_place_action = new
slime_up_action = new
feed_slime_action = new
monkey_recycle_action = new
scan_action = new
potion_action = new
stored_slimes = list()
RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
stored_slimes = null
QDEL_NULL(current_potion)
for(var/i in contents)
var/mob/living/simple_animal/slime/S = i
if(istype(S))
S.forceMove(drop_location())
return ..()
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
eyeobj.origin = src
eyeobj.visible_icon = TRUE
eyeobj.icon = 'icons/mob/cameramob.dmi'
eyeobj.icon_state = "generic_camera"
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user)
..()
if(slime_up_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
slime_up_action.target = src
slime_up_action.Grant(user)
actions += slime_up_action
if(slime_place_action && (upgradetier & XENOBIO_UPGRADE_SLIMEBASIC)) //CIT CHANGE - makes slime-related actions require XENOBIO_UPGRADE_SLIMEBASIC
slime_place_action.target = src
slime_place_action.Grant(user)
actions += slime_place_action
if(feed_slime_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
feed_slime_action.target = src
feed_slime_action.Grant(user)
actions += feed_slime_action
if(monkey_recycle_action && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
monkey_recycle_action.target = src
monkey_recycle_action.Grant(user)
actions += monkey_recycle_action
if(scan_action)
scan_action.target = src
scan_action.Grant(user)
actions += scan_action
if(potion_action && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
potion_action.target = src
potion_action.Grant(user)
actions += potion_action
/obj/machinery/computer/camera_advanced/xenobio/proc/on_contents_del(atom/deleted)
if(current_potion == deleted)
current_potion = null
if(deleted in stored_slimes)
stored_slimes -= deleted
/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/disk/xenobio_console_upgrade))
var/obj/item/disk/xenobio_console_upgrade/diskthing = O
var/successfulupgrade = FALSE
for(var/I in diskthing.upgradetypes)
if(upgradetier & I)
continue
else
upgradetier |= I
successfulupgrade = TRUE
if(I == XENOBIO_UPGRADE_SLIMEADV)
max_slimes = 10
if(successfulupgrade)
to_chat(user, "<span class='notice'>You have successfully upgraded [src] with [O].</span>")
else
to_chat(user, "<span class='warning'>[src] already has the contents of [O] installed!</span>")
return
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
monkeys++
to_chat(user, "<span class='notice'>You feed [O] to [src]. It now has [monkeys] monkey cubes stored.</span>")
qdel(O)
return
else if(istype(O, /obj/item/storage/bag) && (upgradetier & XENOBIO_UPGRADE_MONKEYS)) //CIT CHANGE - makes monkey-related actions require XENOBIO_UPGRADE_MONKEYS
var/obj/item/storage/P = O
var/loaded = FALSE
for(var/obj/G in P.contents)
if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube))
loaded = TRUE
monkeys++
qdel(G)
if(loaded)
to_chat(user, "<span class='notice'>You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.</span>")
return
else if(istype(O, /obj/item/slimepotion/slime) && (upgradetier & XENOBIO_UPGRADE_SLIMEADV)) // CIT CHANGE - makes giving slimes potions via console require XENOBIO_UPGRADE_SLIMEADV
var/replaced = FALSE
if(user && !user.transferItemToLoc(O, src))
return
if(!QDELETED(current_potion))
current_potion.forceMove(drop_location())
replaced = TRUE
current_potion = O
to_chat(user, "<span class='notice'>You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].</span>")
return
..()
/datum/action/innate/slime_place
name = "Place Slimes"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_down"
/datum/action/innate/slime_place/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in X.stored_slimes)
S.forceMove(remote_eye.loc)
S.visible_message("[S] warps in!")
X.stored_slimes -= S
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/slime_pick_up
name = "Pick up Slime"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_up"
/datum/action/innate/slime_pick_up/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
if(X.stored_slimes.len >= X.max_slimes)
break
if(!S.ckey)
if(S.buckled)
S.Feedstop(silent = TRUE)
S.visible_message("[S] vanishes in a flash of light!")
S.forceMove(X)
X.stored_slimes += S
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/feed_slime
name = "Feed Slimes"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_down"
/datum/action/innate/feed_slime/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
if(X.monkeys >= 1)
var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner)
if (!QDELETED(food))
food.LAssailant = C
X.monkeys --
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "monkey_up"
/datum/action/innate/monkey_recycle/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/carbon/monkey/M in remote_eye.loc)
if(M.stat)
M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/slime_scan
name = "Scan Slime"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_scan"
/datum/action/innate/slime_scan/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
slime_scan(S, C)
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/datum/action/innate/feed_potion
name = "Apply Potion"
icon_icon = 'icons/mob/actions/actions_silicon.dmi'
button_icon_state = "slime_potion"
/datum/action/innate/feed_potion/Activate()
if(!target || !isliving(owner))
return
var/mob/living/C = owner
var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
var/obj/machinery/computer/camera_advanced/xenobio/X = target
if(QDELETED(X.current_potion))
to_chat(owner, "<span class='notice'>No potion loaded.</span>")
return
if(GLOB.cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/simple_animal/slime/S in remote_eye.loc)
X.current_potion.attack(S, C)
break
else
to_chat(owner, "<span class='notice'>Target is not near a camera. Cannot proceed.</span>")
/obj/item/disk/xenobio_console_upgrade
name = "Xenobiology console upgrade disk"
desc = "Allan please add detail."
icon_state = "datadisk5"
var/list/upgradetypes = list()
/obj/item/disk/xenobio_console_upgrade/admin
name = "Xenobio all access thing"
desc = "'the consoles are literally useless!!!!!!!!!!!!!!!'"
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV, XENOBIO_UPGRADE_MONKEYS)
/obj/item/disk/xenobio_console_upgrade/monkey
name = "Xenobiology console monkey upgrade disk"
desc = "This disk will add the ability to remotely recycle monkeys via the Xenobiology console."
upgradetypes = list(XENOBIO_UPGRADE_MONKEYS)
/obj/item/disk/xenobio_console_upgrade/slimebasic
name = "Xenobiology console basic slime upgrade disk"
desc = "This disk will add the ability to remotely manipulate slimes via the Xenobiology console."
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC)
/obj/item/disk/xenobio_console_upgrade/slimeadv
name = "Xenobiology console advanced slime upgrade disk"
desc = "This disk will add the ability to remotely feed slimes potions via the Xenobiology console, and lift the restrictions on the number of slimes that can be stored inside the Xenobiology console. This includes the contents of the basic slime upgrade disk."
upgradetypes = list(XENOBIO_UPGRADE_SLIMEBASIC, XENOBIO_UPGRADE_SLIMEADV)