@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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>")
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user