@@ -27,6 +27,7 @@ other types of metals and chemistry for reagents).
|
||||
*/
|
||||
|
||||
//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.
|
||||
@@ -48,8 +49,12 @@ other types of metals and chemistry for reagents).
|
||||
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()
|
||||
CRASH("DESIGN DATUMS SHOULD NOT EVER BE DESTROYED AS THEY ARE ONLY MEANT TO BE IN A GLOBAL LIST AND REFERENCED FOR US.")
|
||||
SSresearch.techweb_designs -= id
|
||||
return ..()
|
||||
|
||||
/datum/design/proc/icon_html(client/user)
|
||||
|
||||
@@ -0,0 +1,335 @@
|
||||
///////////////////////////////////
|
||||
//////////AutoBottler Designs//////
|
||||
///////////////////////////////////
|
||||
|
||||
/datum/design/board/autobottler
|
||||
name = "Machine Design (AutoBottler)"
|
||||
desc = "Allows for the construction of circuit boards used to build an Autobottler."
|
||||
id = "autobottler"
|
||||
materials = list(MAT_GLASS = 2000)
|
||||
build_path = /obj/item/circuitboard/machine/autobottler
|
||||
category = list ("Misc. Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE
|
||||
|
||||
/datum/design/bottle
|
||||
materials = list(MAT_GLASS = 1200)
|
||||
build_type = AUTOBOTTLER
|
||||
category = list("Storge")
|
||||
|
||||
/datum/design/bottle/wine
|
||||
name = "Bottle Design (Wine)"
|
||||
desc = "Allows for the blowing of Wine bottles."
|
||||
id = "wine"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/wine/empty
|
||||
|
||||
/datum/design/bottle/rum
|
||||
name = "Bottle Design (Rum)"
|
||||
desc = "Allows for the blowing of Rum bottles."
|
||||
id = "rum"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/rum/empty
|
||||
|
||||
/datum/design/bottle/gin
|
||||
name = "Bottle Design (Gin)"
|
||||
desc = "Allows for the blowing of Gin bottles."
|
||||
id = "gin"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/gin/empty
|
||||
|
||||
/datum/design/bottle/whiskey
|
||||
name = "Bottle Design (Whiskey)"
|
||||
desc = "Allows for the blowing of Whiskey bottles."
|
||||
id = "whiskey"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/whiskey/empty
|
||||
|
||||
/datum/design/bottle/vodka
|
||||
name = "Bottle Design (Vodka)"
|
||||
desc = "Allows for the blowing of Vodka bottles."
|
||||
id = "vodka"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/vodka/empty
|
||||
|
||||
/datum/design/bottle/tequila
|
||||
name = "Bottle Design (Tequila)"
|
||||
desc = "Allows for the blowing of Tequila bottles."
|
||||
id = "tequila"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/tequila/empty
|
||||
|
||||
/datum/design/bottle/patron
|
||||
name = "Bottle Design (Patron)"
|
||||
desc = "Allows for the blowing of Patron bottles."
|
||||
id = "patron"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/patron/empty
|
||||
|
||||
/datum/design/bottle/kahlua
|
||||
name = "Bottle Design (Kahlua)"
|
||||
desc = "Allows for the blowing of Kahlua bottles."
|
||||
id = "kahlua"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/kahlua/empty
|
||||
|
||||
/datum/design/bottle/sake
|
||||
name = "Bottle Design (Sake)"
|
||||
desc = "Allows for the blowing of Sake bottles."
|
||||
id = "sake"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/sake/empty
|
||||
|
||||
/datum/design/bottle/vermouth
|
||||
name = "Bottle Design (Vermouth)"
|
||||
desc = "Allows for the blowing of Vermouth bottles."
|
||||
id = "vermouth"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/vermouth/empty
|
||||
|
||||
/datum/design/bottle/goldschlager
|
||||
name = "Bottle Design (Goldschlager)"
|
||||
desc = "Allows for the blowing of Goldschlager bottles."
|
||||
id = "goldschlager"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty
|
||||
|
||||
/datum/design/bottle/hcider
|
||||
name = "Bottle Design (Cider)"
|
||||
desc = "Allows for the blowing of Cider bottles."
|
||||
id = "hcider"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/hcider/empty
|
||||
|
||||
/datum/design/bottle/cognac
|
||||
name = "Bottle Design (Cognac)"
|
||||
desc = "Allows for the blowing of Cognac bottles."
|
||||
id = "cognac"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/cognac/empty
|
||||
|
||||
/datum/design/bottle/absinthe
|
||||
name = "Bottle Design (Absinthe)"
|
||||
desc = "Allows for the blowing of Absinthe bottles."
|
||||
id = "absinthe"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/absinthe/empty
|
||||
|
||||
/datum/design/bottle/grappa
|
||||
name = "Bottle Design (Grappa)"
|
||||
desc = "Allows for the blowing of Grappa bottles."
|
||||
id = "grappa"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/grappa/empty
|
||||
|
||||
/datum/design/bottle/fernet
|
||||
name = "Bottle Design (Fernet)"
|
||||
desc = "Allows for the blowing of Fernet bottles."
|
||||
id = "fernet"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/fernet/empty
|
||||
|
||||
/datum/design/bottle/applejack
|
||||
name = "Bottle Design (Applejack)"
|
||||
desc = "Allows for the blowing of Applejack bottles."
|
||||
id = "applejack"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/applejack/empty
|
||||
|
||||
/datum/design/bottle/champagne
|
||||
name = "Bottle Design (Champagne)"
|
||||
desc = "Allows for the blowing of Champagne bottles."
|
||||
id = "champagne"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/champagne/empty
|
||||
|
||||
/datum/design/bottle/blazaam
|
||||
name = "Bottle Design (Blazaam)"
|
||||
desc = "Allows for the blowing of Blazaam bottles."
|
||||
id = "blazaam"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/blazaam/empty
|
||||
|
||||
/datum/design/bottle/trappist
|
||||
name = "Bottle Design (Trappist)"
|
||||
desc = "Allows for the blowing of Trappist bottles."
|
||||
id = "trappist"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/trappist/empty
|
||||
|
||||
/datum/design/bottle/grenadine
|
||||
name = "Bottle Design (Grenadine)"
|
||||
desc = "Allows for the blowing of Grenadine bottles."
|
||||
id = "grenadine"
|
||||
build_path = /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty
|
||||
|
||||
/datum/design/bottle/export
|
||||
materials = list(MAT_GLASS = 1200)
|
||||
build_type = AUTOBOTTLER
|
||||
category = list("Brands")
|
||||
|
||||
/datum/design/bottle/export/wine
|
||||
name = "Export Design (Wine)"
|
||||
desc = "Allows for the blowing, and bottling of Wine bottles."
|
||||
id = "wine_export"
|
||||
reagents_list = list("wine" = 100)
|
||||
build_path = /obj/item/export/bottle/wine
|
||||
|
||||
/datum/design/bottle/export/rum
|
||||
name = "Export Design (Rum)"
|
||||
desc = "Allows for the blowing, and bottling of Rum bottles."
|
||||
id = "rum_export"
|
||||
reagents_list = list("rum" = 100)
|
||||
build_path = /obj/item/export/bottle/rum
|
||||
|
||||
/datum/design/bottle/export/gin
|
||||
name = "Export Design (Gin)"
|
||||
desc = "Allows for the blowing, and bottling of Gin bottles."
|
||||
id = "gin_export"
|
||||
reagents_list = list("gin" = 100)
|
||||
build_path = /obj/item/export/bottle/gin
|
||||
|
||||
/datum/design/bottle/export/whiskey
|
||||
name = "Export Design (Whiskey)"
|
||||
desc = "Allows for the blowing, and bottling of Whiskey bottles."
|
||||
id = "whiskey_export"
|
||||
reagents_list = list("whiskey" = 100)
|
||||
build_path = /obj/item/export/bottle/whiskey
|
||||
|
||||
/datum/design/bottle/export/vodka
|
||||
name = "Export Design (Vodka)"
|
||||
desc = "Allows for the blowing, and bottling of 99% Vodka bottles."
|
||||
id = "vodka_export"
|
||||
reagents_list = list("vodka" = 99, "water" = 1)
|
||||
build_path = /obj/item/export/bottle/vodka
|
||||
|
||||
/datum/design/bottle/export/tequila
|
||||
name = "Export Design (Tequila)"
|
||||
desc = "Allows for the blowing, and bottling of Tequila bottles."
|
||||
id = "tequila_export"
|
||||
reagents_list = list("tequila" = 80, "lemon_juice" = 20)
|
||||
build_path = /obj/item/export/bottle/tequila
|
||||
|
||||
/datum/design/bottle/export/patron
|
||||
name = "Export Design (Patron)"
|
||||
desc = "Allows for the blowing, and bottling of Patron bottles."
|
||||
id = "patron_export"
|
||||
reagents_list = list("patron" = 100)
|
||||
build_path = /obj/item/export/bottle/patron
|
||||
|
||||
/datum/design/bottle/export/kahlua
|
||||
name = "Export Design (Kahlua)"
|
||||
desc = "Allows for the blowing, and bottling of Kahlua bottles."
|
||||
id = "kahlua_export"
|
||||
reagents_list = list("kahlua" = 100)
|
||||
build_path = /obj/item/export/bottle/kahlua
|
||||
|
||||
/datum/design/bottle/export/sake
|
||||
name = "Export Design (Sake)"
|
||||
desc = "Allows for the blowing, and bottling of Sake bottles."
|
||||
id = "sake_export"
|
||||
reagents_list = list("sake" = 80, "rice" = 10, "sugar" = 10)
|
||||
build_path = /obj/item/export/bottle/sake
|
||||
|
||||
/datum/design/bottle/export/vermouth
|
||||
name = "Export Design (Vermouth)"
|
||||
desc = "Allows for the blowing, and bottling of Vermouth bottles."
|
||||
id = "vermouth_export"
|
||||
reagents_list = list("vermouth" = 100)
|
||||
build_path = /obj/item/export/bottle/vermouth
|
||||
|
||||
/datum/design/bottle/export/goldschlager
|
||||
name = "Export Design (Goldschlager)"
|
||||
desc = "Allows for the blowing, and bottling of Goldschlager bottles."
|
||||
id = "goldschlager_export"
|
||||
reagents_list = list("goldschlager" = 100)
|
||||
build_path = /obj/item/export/bottle/goldschlager
|
||||
|
||||
/datum/design/bottle/export/hcider
|
||||
name = "Export Design (Cider)"
|
||||
desc = "Allows for the blowing, and bottling of Cider bottles."
|
||||
id = "hcider_export"
|
||||
reagents_list = list("hcider" = 30, "water" = 20)
|
||||
build_path = /obj/item/export/bottle/hcider
|
||||
|
||||
/datum/design/bottle/export/cognac
|
||||
name = "Export Design (Cognac)"
|
||||
desc = "Allows for the blowing, and bottling of Cognac bottles."
|
||||
id = "cognac_export"
|
||||
reagents_list = list("cognac" = 100)
|
||||
build_path = /obj/item/export/bottle/cognac
|
||||
|
||||
/datum/design/bottle/export/absinthe
|
||||
name = "Export Design (Absinthe)"
|
||||
desc = "Allows for the blowing, and bottling of Absinthe bottles."
|
||||
reagents_list = list("absinthe" = 100)
|
||||
id = "absinthe_export"
|
||||
build_path = /obj/item/export/bottle/absinthe
|
||||
|
||||
/datum/design/bottle/export/grappa
|
||||
name = "Export Design (Grappa)"
|
||||
desc = "Allows for the blowing, and bottling of Grappa bottles."
|
||||
id = "grappa_export"
|
||||
reagents_list = list("grappa" = 100)
|
||||
build_path = /obj/item/export/bottle/grappa
|
||||
|
||||
/datum/design/bottle/export/fernet
|
||||
name = "Export Design (Fernet)"
|
||||
desc = "Allows for the blowing, and bottling of Fernet bottles."
|
||||
id = "fernet_export"
|
||||
reagents_list = list("fernet" = 100)
|
||||
build_path = /obj/item/export/bottle/fernet
|
||||
|
||||
/datum/design/bottle/export/applejack
|
||||
name = "Export Design (Applejack)"
|
||||
desc = "Allows for the blowing, and bottling of Applejack bottles."
|
||||
id = "applejack_export"
|
||||
reagents_list = list("applejack" = 50, "gin" = 10)
|
||||
build_path = /obj/item/export/bottle/applejack
|
||||
|
||||
/datum/design/bottle/export/champagne
|
||||
name = "Export Design (Champagne)"
|
||||
desc = "Allows for the blowing, and bottling of Champagne bottles."
|
||||
id = "champagne_export"
|
||||
reagents_list = list("champagne" = 90, "co2" = 10)
|
||||
build_path = /obj/item/export/bottle/champagne
|
||||
|
||||
/datum/design/bottle/export/blazaam
|
||||
name = "Export Design (Blazaam)"
|
||||
desc = "Allows for the blowing, and bottling of Blazaam bottles."
|
||||
id = "blazaam_export"
|
||||
reagents_list = list("blazaam" = 80, "holywater" = 20)
|
||||
build_path = /obj/item/export/bottle/blazaam
|
||||
|
||||
/datum/design/bottle/export/trappist
|
||||
name = "Export Design (Trappist)"
|
||||
desc = "Allows for the blowing, and bottling of Trappist bottles."
|
||||
id = "trappist_export"
|
||||
reagents_list = list("trappist" = 100)
|
||||
build_path = /obj/item/export/bottle/trappist
|
||||
|
||||
/datum/design/bottle/export/grenadine
|
||||
name = "Export Design (Grenadine)"
|
||||
desc = "Allows for the blowing, and bottling of Grenadine bottles."
|
||||
id = "grenadine_export"
|
||||
reagents_list = list("grenadine" = 100)
|
||||
build_path = /obj/item/export/bottle/grenadine
|
||||
|
||||
/datum/design/bottle/export/minikeg
|
||||
name = "Export Design (Minikeg)"
|
||||
desc = "Allows for the fabication, and bottling of Minikeg of craft beer."
|
||||
id = "minikeg"
|
||||
category = list("Beers")
|
||||
reagents_list = list("light_beer" = 100)
|
||||
build_path = /obj/item/export/bottle/minikeg
|
||||
|
||||
/datum/design/bottle/export/blooddrop
|
||||
name = "Export Design (Blooddrop)"
|
||||
desc = "Allows for the blowing, and bottling of Blooddrop bottles."
|
||||
id = "blooddrop"
|
||||
category = list("Wines")
|
||||
reagents_list = list("champagne" = 30, "co2" = 30, "wine" = 10, "grape_juice" = 30)
|
||||
build_path = /obj/item/export/bottle/blooddrop
|
||||
|
||||
/datum/design/bottle/export/slim_gold
|
||||
name = "Export Design (Slim Gold)"
|
||||
desc = "Allows for the blowing, and bottling of Slim Gold bottles."
|
||||
id = "slim_gold"
|
||||
category = list("Beers")
|
||||
reagents_list = list("gold" = 10, "co2" = 10, "rum" = 30, "beer" = 40)
|
||||
build_path = /obj/item/export/bottle/slim_gold
|
||||
|
||||
/datum/design/bottle/export/white_bloodmoon
|
||||
name = "Export Design (White Bloodmoon)"
|
||||
desc = "Allows for the blowing, and bottling of White Bloodmoon bottles."
|
||||
id = "white_bloodmoon"
|
||||
category = list("Wines")
|
||||
reagents_list = list("synthflesh" = 50, "blood" = 50, "gib" = 10)
|
||||
build_path = /obj/item/export/bottle/white_bloodmoon
|
||||
|
||||
/datum/design/bottle/export/greenroad
|
||||
name = "Export Design (Greenroad)"
|
||||
desc = "Allows for the blowing, and bottling of Greenroad bottles."
|
||||
id = "greenroad"
|
||||
reagents_list = list("vitfro" = 50, "rum" = 50, "ash" = 10)
|
||||
category = list("Beers")
|
||||
build_path = /obj/item/export/bottle/greenroad
|
||||
@@ -131,3 +131,30 @@
|
||||
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
|
||||
|
||||
|
||||
|
||||
@@ -98,3 +98,11 @@
|
||||
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")
|
||||
|
||||
@@ -89,3 +89,11 @@
|
||||
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")
|
||||
|
||||
@@ -729,12 +729,22 @@
|
||||
var/surgery
|
||||
|
||||
/datum/design/surgery/experimental_dissection
|
||||
name = "Experimental Dissection"
|
||||
desc = "A surgical procedure which deeply analyzes the biology of a corpse, and automatically adds new findings to the research database."
|
||||
id = "surgery_exp_dissection"
|
||||
surgery = /datum/surgery/advanced/bioware/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."
|
||||
@@ -756,13 +766,49 @@
|
||||
surgery = /datum/surgery/advanced/viral_bonding
|
||||
research_icon_state = "surgery_chest"
|
||||
|
||||
/datum/design/surgery/reconstruction
|
||||
name = "Reconstruction"
|
||||
desc = "A surgical procedure that gradually repairs damage done to a body without the assistance of chemicals. Unlike classic medicine, it is effective on corpses."
|
||||
id = "surgery_reconstruction"
|
||||
surgery = /datum/surgery/advanced/reconstruction
|
||||
/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."
|
||||
@@ -805,6 +851,13 @@
|
||||
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. \
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/subspace_analyzer
|
||||
name = "Subspace Analyzer"
|
||||
name = "Subspace Wavelength Analyzer"
|
||||
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
|
||||
id = "s-analyzer"
|
||||
build_type = PROTOLATHE
|
||||
|
||||
@@ -17,6 +17,36 @@
|
||||
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//
|
||||
//////////////
|
||||
@@ -67,6 +97,12 @@
|
||||
//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
|
||||
@@ -105,7 +141,7 @@
|
||||
materials = list(MAT_METAL = 200)
|
||||
build_path = /obj/item/ammo_casing/shotgun/stunslug
|
||||
category = list("Ammo")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/techshell
|
||||
name = "Unloaded Technological Shotshell"
|
||||
@@ -139,7 +175,7 @@
|
||||
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_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/pin_mindshield
|
||||
name = "Mindshield Firing Pin"
|
||||
@@ -235,7 +271,7 @@
|
||||
reagents_list = list("radium" = 20)
|
||||
build_path = /obj/item/gun/energy/floragun
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/xray
|
||||
name = "X-ray Laser Gun"
|
||||
@@ -309,7 +345,7 @@
|
||||
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_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/cryo_grenade
|
||||
name = "Cryo Grenade"
|
||||
@@ -319,7 +355,7 @@
|
||||
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_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/adv_grenade
|
||||
name = "Advanced Release Grenade"
|
||||
@@ -329,7 +365,7 @@
|
||||
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_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
//////////
|
||||
//MISC////
|
||||
|
||||
@@ -102,7 +102,7 @@ Note: Must be placed within 3 tiles of the R&D Console
|
||||
return FALSE
|
||||
|
||||
if (id && id != RESEARCH_MATERIAL_RECLAMATION_ID)
|
||||
var/datum/techweb_node/TN = get_techweb_node_by_id(id)
|
||||
var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id)
|
||||
if(!istype(TN))
|
||||
return FALSE
|
||||
var/dpath = loaded_item.type
|
||||
@@ -123,7 +123,7 @@ Note: Must be placed within 3 tiles of the R&D Console
|
||||
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_nodes[TN.id], dpath)
|
||||
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)
|
||||
|
||||
@@ -128,13 +128,13 @@
|
||||
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 = get_techweb_node_by_id(node_id)
|
||||
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])
|
||||
if(SSresearch.science_tech.researched_nodes[N.id])
|
||||
res += str
|
||||
else if(SSresearch.science_tech.boosted_nodes[N])
|
||||
else if(SSresearch.science_tech.boosted_nodes[N.id])
|
||||
boosted += str
|
||||
if(SSresearch.science_tech.visible_nodes[N]) //JOY OF DISCOVERY!
|
||||
if(SSresearch.science_tech.visible_nodes[N.id]) //JOY OF DISCOVERY!
|
||||
output += str
|
||||
output += boosted + res
|
||||
dat += output
|
||||
@@ -182,10 +182,10 @@
|
||||
experiment(dotype,process)
|
||||
use_power(750)
|
||||
if(dotype != FAIL)
|
||||
var/list/datum/techweb_node/nodes = techweb_item_boost_check(process)
|
||||
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(picked, process.type)
|
||||
linked_console.stored_research.boost_with_path(SSresearch.techweb_node_by_id(picked), process.type)
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/rnd/experimentor/proc/matchReaction(matching,reaction)
|
||||
@@ -422,7 +422,7 @@
|
||||
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)
|
||||
GET_COMPONENT_FROM(linked_materials, /datum/component/material_container, 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)
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/obj/machinery/rnd/production/proc/update_designs()
|
||||
cached_designs.Cut()
|
||||
for(var/i in stored_research.researched_designs)
|
||||
var/datum/design/d = stored_research.researched_designs[i]
|
||||
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
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
amount = text2num(amount)
|
||||
if(isnull(amount))
|
||||
amount = 1
|
||||
var/datum/design/D = (linked_console || requires_console)? linked_console.stored_research.researched_designs[id] : get_techweb_design_by_id(id)
|
||||
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)))
|
||||
@@ -161,7 +161,7 @@
|
||||
/obj/machinery/rnd/production/proc/search(string)
|
||||
matching_designs.Cut()
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = stored_research.researched_designs[v]
|
||||
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))
|
||||
@@ -337,7 +337,7 @@
|
||||
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 = stored_research.researched_designs[v]
|
||||
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)))
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
if(current_category != "Main")
|
||||
var/list/program_list = list()
|
||||
for(var/i in linked_techweb.researched_designs)
|
||||
var/datum/design/nanites/D = linked_techweb.researched_designs[i]
|
||||
var/datum/design/nanites/D = SSresearch.techweb_design_by_id(i)
|
||||
if(!istype(D))
|
||||
continue
|
||||
if(current_category in D.category)
|
||||
@@ -116,9 +116,9 @@
|
||||
disk.program = null
|
||||
disk.name = initial(disk.name)
|
||||
. = TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/machinery/nanite_program_hub/admin/Initialize()
|
||||
. = ..()
|
||||
linked_techweb = SSresearch.admin_tech
|
||||
|
||||
|
||||
|
||||
@@ -36,10 +36,10 @@ Nothing else in the console has ID requirements.
|
||||
var/locked = FALSE
|
||||
var/tdisk_uple = FALSE
|
||||
var/ddisk_uple = FALSE
|
||||
var/datum/techweb_node/selected_node
|
||||
var/datum/design/selected_design
|
||||
var/datum/selected_node_id
|
||||
var/datum/selected_design_id
|
||||
var/selected_category
|
||||
var/list/datum/design/matching_designs
|
||||
var/list/matching_design_ids
|
||||
var/disk_slot_selected
|
||||
var/searchstring = ""
|
||||
var/searchtype = ""
|
||||
@@ -88,7 +88,7 @@ Nothing else in the console has ID requirements.
|
||||
. = ..()
|
||||
stored_research = SSresearch.science_tech
|
||||
stored_research.consoles_accessing[src] = TRUE
|
||||
matching_designs = list()
|
||||
matching_design_ids = list()
|
||||
SyncRDevices()
|
||||
|
||||
/obj/machinery/computer/rdconsole/Destroy()
|
||||
@@ -109,9 +109,7 @@ Nothing else in the console has ID requirements.
|
||||
if(d_disk)
|
||||
d_disk.forceMove(get_turf(src))
|
||||
d_disk = null
|
||||
matching_designs = null
|
||||
selected_node = null
|
||||
selected_design = null
|
||||
matching_design_ids = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, params)
|
||||
@@ -144,7 +142,7 @@ Nothing else in the console has ID requirements.
|
||||
if(!stored_research.available_nodes[id] || stored_research.researched_nodes[id])
|
||||
say("Node unlock failed: Either already researched or not available!")
|
||||
return FALSE
|
||||
var/datum/techweb_node/TN = SSresearch.techweb_nodes[id]
|
||||
var/datum/techweb_node/TN = SSresearch.techweb_node_by_id(id)
|
||||
if(!istype(TN))
|
||||
say("Node unlock failed: Unknown error.")
|
||||
return FALSE
|
||||
@@ -153,7 +151,7 @@ Nothing else in the console has ID requirements.
|
||||
investigate_log("[key_name(user)] researched [id]([json_encode(price)]) on techweb id [stored_research.id].", INVESTIGATE_RESEARCH)
|
||||
if(stored_research == SSresearch.science_tech)
|
||||
SSblackbox.record_feedback("associative", "science_techweb_unlock", 1, list("id" = "[id]", "name" = TN.display_name, "price" = "[json_encode(price)]", "time" = SQLtime()))
|
||||
if(stored_research.research_node(SSresearch.techweb_nodes[id]))
|
||||
if(stored_research.research_node_id(id))
|
||||
say("Successfully researched [TN.display_name].")
|
||||
var/logname = "Unknown"
|
||||
if(isAI(user))
|
||||
@@ -282,7 +280,7 @@ Nothing else in the console has ID requirements.
|
||||
l += ui_protolathe_header()
|
||||
l += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3>"
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = stored_research.researched_designs[v]
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(!(selected_category in D.category)|| !(D.build_type & PROTOLATHE))
|
||||
continue
|
||||
if(!(isnull(linked_lathe.allowed_department_flags) || (D.departmental_flags & linked_lathe.allowed_department_flags)))
|
||||
@@ -337,7 +335,8 @@ Nothing else in the console has ID requirements.
|
||||
RDSCREEN_UI_LATHE_CHECK
|
||||
var/list/l = list()
|
||||
l += ui_protolathe_header()
|
||||
for(var/datum/design/D in matching_designs)
|
||||
for(var/id in matching_design_ids)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(id)
|
||||
if(!(isnull(linked_lathe.allowed_department_flags) || (D.departmental_flags & linked_lathe.allowed_department_flags)))
|
||||
continue
|
||||
var/temp_material
|
||||
@@ -433,7 +432,7 @@ Nothing else in the console has ID requirements.
|
||||
l += "<div class='statusDisplay'><h3>Browsing [selected_category]:</h3>"
|
||||
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = stored_research.researched_designs[v]
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(!(selected_category in D.category) || !(D.build_type & IMPRINTER))
|
||||
continue
|
||||
if(!(isnull(linked_imprinter.allowed_department_flags) || (D.departmental_flags & linked_imprinter.allowed_department_flags)))
|
||||
@@ -466,7 +465,8 @@ Nothing else in the console has ID requirements.
|
||||
l += ui_circuit_header()
|
||||
l += "<div class='statusDisplay'><h3>Search results:</h3>"
|
||||
|
||||
for(var/datum/design/D in matching_designs)
|
||||
for(var/id in matching_design_ids)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(id)
|
||||
if(!(isnull(linked_imprinter.allowed_department_flags) || (D.departmental_flags & linked_imprinter.allowed_department_flags)))
|
||||
continue
|
||||
var/temp_materials
|
||||
@@ -526,7 +526,7 @@ Nothing else in the console has ID requirements.
|
||||
l += "<A href='?src=[REF(src)];copy_tech=1'>Load Technology to Disk</A></div>"
|
||||
l += "<div class='statusDisplay'><h3>Stored Technology Nodes:</h3>"
|
||||
for(var/i in t_disk.stored_research.researched_nodes)
|
||||
var/datum/techweb_node/N = t_disk.stored_research.researched_nodes[i]
|
||||
var/datum/techweb_node/N = SSresearch.techweb_node_by_id(i)
|
||||
l += "<A href='?src=[REF(src)];view_node=[i];back_screen=[screen]'>[N.display_name]</A>"
|
||||
l += "</div>"
|
||||
return l
|
||||
@@ -552,7 +552,7 @@ Nothing else in the console has ID requirements.
|
||||
l += "<A href='?src=[REF(src)];switch_screen=[RDSCREEN_DESIGNDISK];back_screen=[screen]'>Return to Disk Operations</A><div class='statusDisplay'>"
|
||||
l += "<h3>Load Design to Disk:</h3>"
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = stored_research.researched_designs[v]
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
l += "[D.name] "
|
||||
l += "<A href='?src=[REF(src)];copy_design=[disk_slot_selected];copy_design_ID=[D.id]'>Copy to Disk</A>"
|
||||
l += "</div>"
|
||||
@@ -573,7 +573,7 @@ Nothing else in the console has ID requirements.
|
||||
for(var/id in boostable_nodes)
|
||||
anything = TRUE
|
||||
var/list/worth = boostable_nodes[id]
|
||||
var/datum/techweb_node/N = get_techweb_node_by_id(id)
|
||||
var/datum/techweb_node/N = SSresearch.techweb_node_by_id(id)
|
||||
|
||||
l += "<div class='statusDisplay'>[RDSCREEN_NOBREAK]"
|
||||
if (stored_research.researched_nodes[N.id]) // already researched
|
||||
@@ -637,32 +637,33 @@ Nothing else in the console has ID requirements.
|
||||
var/list/columns = list()
|
||||
var/max_tier = 0
|
||||
for (var/node_ in stored_research.tiers)
|
||||
var/datum/techweb_node/node = node_
|
||||
var/tier = stored_research.tiers[node]
|
||||
var/datum/techweb_node/node = SSresearch.techweb_node_by_id(node_)
|
||||
var/tier = stored_research.tiers[node.id]
|
||||
LAZYINITLIST(columns["[tier]"]) // String hackery to make the numbers associative
|
||||
columns["[tier]"] += ui_techweb_single_node(node, minimal=(tier != 1))
|
||||
max_tier = max(max_tier, tier)
|
||||
|
||||
l += "<table><tr><th align='left'>Researched</th><th align='left'>Available</th><th align='left'>Future</th></tr><tr>[RDSCREEN_NOBREAK]"
|
||||
for(var/tier in 0 to max_tier)
|
||||
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
|
||||
l += columns["[tier]"]
|
||||
l += "</td>[RDSCREEN_NOBREAK]"
|
||||
if(max_tier)
|
||||
for(var/tier in 0 to max_tier)
|
||||
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
|
||||
l += columns["[tier]"]
|
||||
l += "</td>[RDSCREEN_NOBREAK]"
|
||||
l += "</tr></table>[RDSCREEN_NOBREAK]"
|
||||
else
|
||||
var/list/avail = list() //This could probably be optimized a bit later.
|
||||
var/list/unavail = list()
|
||||
var/list/res = list()
|
||||
for(var/v in stored_research.researched_nodes)
|
||||
res += stored_research.researched_nodes[v]
|
||||
res += SSresearch.techweb_node_by_id(v)
|
||||
for(var/v in stored_research.available_nodes)
|
||||
if(stored_research.researched_nodes[v])
|
||||
continue
|
||||
avail += stored_research.available_nodes[v]
|
||||
avail += SSresearch.techweb_node_by_id(v)
|
||||
for(var/v in stored_research.visible_nodes)
|
||||
if(stored_research.available_nodes[v])
|
||||
continue
|
||||
unavail += stored_research.visible_nodes[v]
|
||||
unavail += SSresearch.techweb_node_by_id(v)
|
||||
l += "<h2>Technology Nodes:</h2>[RDSCREEN_NOBREAK]"
|
||||
l += "<div><h3>Available for Research:</h3>"
|
||||
for(var/datum/techweb_node/N in avail)
|
||||
@@ -704,13 +705,14 @@ Nothing else in the console has ID requirements.
|
||||
l += "<BR><span class='linkOff bad'>[node.price_display(stored_research)]</span>" // red - missing prereqs
|
||||
if(ui_mode == RDCONSOLE_UI_MODE_NORMAL)
|
||||
l += "[node.description]"
|
||||
for(var/i in node.designs)
|
||||
var/datum/design/D = node.designs[i]
|
||||
for(var/i in node.design_ids)
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(i)
|
||||
l += "<span data-tooltip='[D.name]' onclick='location=\"?src=[REF(src)];view_design=[i];back_screen=[screen]\"'>[D.icon_html(usr)]</span>[RDSCREEN_NOBREAK]"
|
||||
l += "</div>[RDSCREEN_NOBREAK]"
|
||||
return l
|
||||
|
||||
/obj/machinery/computer/rdconsole/proc/ui_techweb_nodeview()
|
||||
var/datum/techweb_node/selected_node = SSresearch.techweb_node_by_id(selected_node_id)
|
||||
RDSCREEN_UI_SNODE_CHECK
|
||||
var/list/l = list()
|
||||
if(stored_research.hidden_nodes[selected_node.id])
|
||||
@@ -718,65 +720,65 @@ Nothing else in the console has ID requirements.
|
||||
return
|
||||
|
||||
l += "<table><tr>[RDSCREEN_NOBREAK]"
|
||||
if (length(selected_node.prerequisites))
|
||||
if (length(selected_node.prereq_ids))
|
||||
l += "<th align='left'>Requires</th>[RDSCREEN_NOBREAK]"
|
||||
l += "<th align='left'>Current Node</th>[RDSCREEN_NOBREAK]"
|
||||
if (length(selected_node.unlocks))
|
||||
if (length(selected_node.unlock_ids))
|
||||
l += "<th align='left'>Unlocks</th>[RDSCREEN_NOBREAK]"
|
||||
|
||||
l += "</tr><tr>[RDSCREEN_NOBREAK]"
|
||||
if (length(selected_node.prerequisites))
|
||||
if (length(selected_node.prereq_ids))
|
||||
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
|
||||
for (var/i in selected_node.prerequisites)
|
||||
l += ui_techweb_single_node(selected_node.prerequisites[i])
|
||||
for (var/i in selected_node.prereq_ids)
|
||||
l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i))
|
||||
l += "</td>[RDSCREEN_NOBREAK]"
|
||||
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
|
||||
l += ui_techweb_single_node(selected_node, selflink=FALSE)
|
||||
l += "</td>[RDSCREEN_NOBREAK]"
|
||||
if (length(selected_node.unlocks))
|
||||
if (length(selected_node.unlock_ids))
|
||||
l += "<td valign='top'>[RDSCREEN_NOBREAK]"
|
||||
for (var/i in selected_node.unlocks)
|
||||
l += ui_techweb_single_node(selected_node.unlocks[i])
|
||||
for (var/i in selected_node.unlock_ids)
|
||||
l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i))
|
||||
l += "</td>[RDSCREEN_NOBREAK]"
|
||||
|
||||
l += "</tr></table>[RDSCREEN_NOBREAK]"
|
||||
return l
|
||||
|
||||
/obj/machinery/computer/rdconsole/proc/ui_techweb_designview() //Legacy code
|
||||
var/datum/design/selected_design = SSresearch.techweb_design_by_id(selected_design_id)
|
||||
RDSCREEN_UI_SDESIGN_CHECK
|
||||
var/list/l = list()
|
||||
var/datum/design/D = selected_design
|
||||
l += "<div><table><tr><td>[D.icon_html(usr)]</td><td><b>[D.name]</b></td></tr></table>[RDSCREEN_NOBREAK]"
|
||||
if(D.build_type)
|
||||
l += "<div><table><tr><td>[selected_design.icon_html(usr)]</td><td><b>[selected_design.name]</b></td></tr></table>[RDSCREEN_NOBREAK]"
|
||||
if(selected_design.build_type)
|
||||
var/lathes = list()
|
||||
if(D.build_type & IMPRINTER)
|
||||
if(selected_design.build_type & IMPRINTER)
|
||||
lathes += "<span data-tooltip='Circuit Imprinter'>[machine_icon(/obj/machinery/rnd/production/circuit_imprinter)]</span>[RDSCREEN_NOBREAK]"
|
||||
if (linked_imprinter && D.id in stored_research.researched_designs)
|
||||
l += "<A href='?src=[REF(src)];search=1;type=imprint;to_search=[D.name]'>Imprint</A>"
|
||||
if(D.build_type & PROTOLATHE)
|
||||
if (linked_imprinter && stored_research.researched_designs[selected_design.id])
|
||||
l += "<A href='?src=[REF(src)];search=1;type=imprint;to_search=[selected_design.name]'>Imprint</A>"
|
||||
if(selected_design.build_type & PROTOLATHE)
|
||||
lathes += "<span data-tooltip='Protolathe'>[machine_icon(/obj/machinery/rnd/production/protolathe)]</span>[RDSCREEN_NOBREAK]"
|
||||
if (linked_lathe && D.id in stored_research.researched_designs)
|
||||
l += "<A href='?src=[REF(src)];search=1;type=proto;to_search=[D.name]'>Construct</A>"
|
||||
if(D.build_type & AUTOLATHE)
|
||||
if (linked_lathe && stored_research.researched_designs[selected_design.id])
|
||||
l += "<A href='?src=[REF(src)];search=1;type=proto;to_search=[selected_design.name]'>Construct</A>"
|
||||
if(selected_design.build_type & AUTOLATHE)
|
||||
lathes += "<span data-tooltip='Autolathe'>[machine_icon(/obj/machinery/autolathe)]</span>[RDSCREEN_NOBREAK]"
|
||||
if(D.build_type & MECHFAB)
|
||||
if(selected_design.build_type & MECHFAB)
|
||||
lathes += "<span data-tooltip='Exosuit Fabricator'>[machine_icon(/obj/machinery/mecha_part_fabricator)]</span>[RDSCREEN_NOBREAK]"
|
||||
if(D.build_type & BIOGENERATOR)
|
||||
if(selected_design.build_type & BIOGENERATOR)
|
||||
lathes += "<span data-tooltip='Biogenerator'>[machine_icon(/obj/machinery/biogenerator)]</span>[RDSCREEN_NOBREAK]"
|
||||
if(D.build_type & LIMBGROWER)
|
||||
if(selected_design.build_type & LIMBGROWER)
|
||||
lathes += "<span data-tooltip='Limbgrower'>[machine_icon(/obj/machinery/limbgrower)]</span>[RDSCREEN_NOBREAK]"
|
||||
if(D.build_type & SMELTER)
|
||||
if(selected_design.build_type & SMELTER)
|
||||
lathes += "<span data-tooltip='Smelter'>[machine_icon(/obj/machinery/mineral/processing_unit)]</span>[RDSCREEN_NOBREAK]"
|
||||
l += "Construction types:"
|
||||
l += lathes
|
||||
l += ""
|
||||
l += "Required materials:"
|
||||
var/all_mats = D.materials + D.reagents_list
|
||||
var/all_mats = selected_design.materials + selected_design.reagents_list
|
||||
for(var/M in all_mats)
|
||||
l += "* [CallMaterialName(M)] x [all_mats[M]]"
|
||||
l += "Unlocked by:"
|
||||
for (var/node in D.unlocked_by)
|
||||
l += ui_techweb_single_node(node)
|
||||
for (var/i in selected_design.unlocked_by)
|
||||
l += ui_techweb_single_node(SSresearch.techweb_node_by_id(i))
|
||||
l += "[RDSCREEN_NOBREAK]</div>"
|
||||
return l
|
||||
|
||||
@@ -967,7 +969,7 @@ Nothing else in the console has ID requirements.
|
||||
qdel(t_disk.stored_research)
|
||||
t_disk.stored_research = new
|
||||
say("Wiping technology disk.")
|
||||
if(ls["copy_tech"]) //Copy some technology la from the research holder to the disk.
|
||||
if(ls["copy_tech"]) //Copy some technology from the research holder to the disk.
|
||||
if(QDELETED(t_disk))
|
||||
say("No Technology Disk Inserted!")
|
||||
return
|
||||
@@ -1001,12 +1003,12 @@ Nothing else in the console has ID requirements.
|
||||
return
|
||||
say("Uploading technology disk.")
|
||||
t_disk.stored_research.copy_research_to(stored_research)
|
||||
if(ls["copy_design"]) //Copy design la from the research holder to the design disk.
|
||||
if(ls["copy_design"]) //Copy design from the research holder to the design disk.
|
||||
if(QDELETED(d_disk))
|
||||
say("No Design Disk Inserted!")
|
||||
return
|
||||
var/slot = text2num(ls["copy_design"])
|
||||
var/datum/design/D = stored_research.researched_designs[ls["copy_design_ID"]]
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(ls["copy_design_ID"])
|
||||
if(D)
|
||||
var/autolathe_friendly = TRUE
|
||||
if(D.reagents_list.len)
|
||||
@@ -1033,12 +1035,12 @@ Nothing else in the console has ID requirements.
|
||||
linked_destroy.unload_item()
|
||||
screen = RDSCREEN_MENU
|
||||
if(ls["view_node"])
|
||||
selected_node = SSresearch.techweb_nodes[ls["view_node"]]
|
||||
selected_node_id = ls["view_node"]
|
||||
screen = RDSCREEN_TECHWEB_NODEVIEW
|
||||
if(ls["view_design"])
|
||||
selected_design = SSresearch.techweb_designs[ls["view_design"]]
|
||||
selected_design_id = ls["view_design"]
|
||||
screen = RDSCREEN_TECHWEB_DESIGNVIEW
|
||||
if(ls["updt_design"]) //Uples the research holder with design la from the design disk.
|
||||
if(ls["updt_design"]) //Uploads a design from disk to the techweb.
|
||||
if(QDELETED(d_disk))
|
||||
say("No design disk found.")
|
||||
return
|
||||
@@ -1046,9 +1048,9 @@ Nothing else in the console has ID requirements.
|
||||
if(!n)
|
||||
for(var/D in d_disk.blueprints)
|
||||
if(D)
|
||||
stored_research.add_design(D)
|
||||
stored_research.add_design(D, TRUE)
|
||||
else
|
||||
stored_research.add_design(d_disk.blueprints[n])
|
||||
stored_research.add_design(d_disk.blueprints[n], TRUE)
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -1077,17 +1079,17 @@ Nothing else in the console has ID requirements.
|
||||
|
||||
/obj/machinery/computer/rdconsole/proc/rescan_views()
|
||||
var/compare
|
||||
matching_designs.Cut()
|
||||
matching_design_ids.Cut()
|
||||
if(searchtype == "proto")
|
||||
compare = PROTOLATHE
|
||||
else if(searchtype == "imprint")
|
||||
compare = IMPRINTER
|
||||
for(var/v in stored_research.researched_designs)
|
||||
var/datum/design/D = stored_research.researched_designs[v]
|
||||
var/datum/design/D = SSresearch.techweb_design_by_id(v)
|
||||
if(!(D.build_type & compare))
|
||||
continue
|
||||
if(findtext(D.name,searchstring))
|
||||
matching_designs.Add(D)
|
||||
matching_design_ids.Add(D.id)
|
||||
|
||||
/obj/machinery/computer/rdconsole/proc/check_canprint(datum/design/D, buildtype)
|
||||
var/amount = 50
|
||||
|
||||
@@ -29,3 +29,12 @@
|
||||
/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
|
||||
|
||||
@@ -43,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
|
||||
/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."
|
||||
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
|
||||
@@ -52,12 +52,10 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
component_type = /datum/component/storage/concrete/bluespace/rped
|
||||
|
||||
/obj/item/storage/part_replacer/cyborg
|
||||
name = "rapid part exchange device"
|
||||
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
|
||||
icon_state = "borgrped"
|
||||
item_state = "RPED"
|
||||
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
|
||||
/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()
|
||||
|
||||
@@ -1,48 +1,3 @@
|
||||
|
||||
/proc/initialize_all_techweb_nodes(clearall = FALSE)
|
||||
if(islist(SSresearch.techweb_nodes) && clearall)
|
||||
QDEL_LIST(SSresearch.techweb_nodes)
|
||||
if(islist(SSresearch.techweb_nodes_starting && clearall))
|
||||
QDEL_LIST(SSresearch.techweb_nodes_starting)
|
||||
var/list/returned = list()
|
||||
for(var/path in subtypesof(/datum/techweb_node))
|
||||
var/datum/techweb_node/TN = path
|
||||
if(isnull(initial(TN.id)))
|
||||
continue
|
||||
TN = new path
|
||||
if(returned[initial(TN.id)])
|
||||
stack_trace("WARNING: Techweb node ID clash with ID [initial(TN.id)] detected!")
|
||||
SSresearch.errored_datums[TN] = initial(TN.id)
|
||||
continue
|
||||
returned[initial(TN.id)] = TN
|
||||
if(TN.starting_node)
|
||||
SSresearch.techweb_nodes_starting[TN.id] = TN
|
||||
SSresearch.techweb_nodes = returned
|
||||
verify_techweb_nodes() //Verify all nodes have ids and such.
|
||||
calculate_techweb_nodes()
|
||||
calculate_techweb_boost_list()
|
||||
verify_techweb_nodes() //Verify nodes and designs have been crosslinked properly.
|
||||
|
||||
/proc/initialize_all_techweb_designs(clearall = FALSE)
|
||||
if(islist(SSresearch.techweb_designs) && clearall)
|
||||
QDEL_LIST(SSresearch.techweb_designs)
|
||||
var/list/returned = list()
|
||||
for(var/path in subtypesof(/datum/design))
|
||||
var/datum/design/DN = path
|
||||
if(isnull(initial(DN.id)))
|
||||
stack_trace("WARNING: Design with null ID detected. Build path: [initial(DN.build_path)]")
|
||||
continue
|
||||
else if(initial(DN.id) == DESIGN_ID_IGNORE)
|
||||
continue
|
||||
DN = new path
|
||||
if(returned[initial(DN.id)])
|
||||
stack_trace("WARNING: Design ID clash with ID [initial(DN.id)] detected!")
|
||||
SSresearch.errored_datums[DN] = initial(DN.id)
|
||||
continue
|
||||
returned[initial(DN.id)] = DN
|
||||
SSresearch.techweb_designs = returned
|
||||
verify_techweb_designs()
|
||||
|
||||
/proc/count_unique_techweb_nodes()
|
||||
var/static/list/L = typesof(/datum/techweb_node)
|
||||
return L.len
|
||||
@@ -51,135 +6,10 @@
|
||||
var/static/list/L = typesof(/datum/design)
|
||||
return L.len
|
||||
|
||||
/proc/get_techweb_node_by_id(id)
|
||||
if(SSresearch.techweb_nodes[id])
|
||||
return SSresearch.techweb_nodes[id]
|
||||
|
||||
/proc/get_techweb_design_by_id(id)
|
||||
if(SSresearch.techweb_designs[id])
|
||||
return SSresearch.techweb_designs[id]
|
||||
|
||||
/proc/research_node_id_error(id)
|
||||
if(SSresearch.invalid_node_ids[id])
|
||||
SSresearch.invalid_node_ids[id]++
|
||||
else
|
||||
SSresearch.invalid_node_ids[id] = 1
|
||||
|
||||
/proc/design_id_error(id)
|
||||
if(SSresearch.invalid_design_ids[id])
|
||||
SSresearch.invalid_design_ids[id]++
|
||||
else
|
||||
SSresearch.invalid_design_ids[id] = 1
|
||||
|
||||
/proc/node_boost_error(id, message)
|
||||
WARNING("Invalid boost information for node \[[id]\]: [message]")
|
||||
SSresearch.invalid_node_boost[id] = message
|
||||
|
||||
/proc/verify_techweb_nodes()
|
||||
for(var/n in SSresearch.techweb_nodes)
|
||||
var/datum/techweb_node/N = SSresearch.techweb_nodes[n]
|
||||
if(!istype(N))
|
||||
WARNING("Invalid research node with ID [n] detected and removed.")
|
||||
SSresearch.techweb_nodes -= n
|
||||
research_node_id_error(n)
|
||||
for(var/p in N.prereq_ids)
|
||||
var/datum/techweb_node/P = SSresearch.techweb_nodes[p]
|
||||
if(!istype(P))
|
||||
WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.")
|
||||
N.prereq_ids -= p
|
||||
research_node_id_error(p)
|
||||
for(var/d in N.design_ids)
|
||||
var/datum/design/D = SSresearch.techweb_designs[d]
|
||||
if(!istype(D))
|
||||
WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.")
|
||||
N.designs -= d
|
||||
design_id_error(d)
|
||||
for(var/p in N.prerequisites)
|
||||
var/datum/techweb_node/P = N.prerequisites[p]
|
||||
if(!istype(P))
|
||||
WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.")
|
||||
N.prerequisites -= p
|
||||
research_node_id_error(p)
|
||||
for(var/u in N.unlocks)
|
||||
var/datum/techweb_node/U = N.unlocks[u]
|
||||
if(!istype(U))
|
||||
WARNING("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.")
|
||||
N.unlocks -= u
|
||||
research_node_id_error(u)
|
||||
for(var/d in N.designs)
|
||||
var/datum/design/D = N.designs[d]
|
||||
if(!istype(D))
|
||||
WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.")
|
||||
N.designs -= d
|
||||
design_id_error(d)
|
||||
for(var/p in N.boost_item_paths)
|
||||
if(!ispath(p))
|
||||
N.boost_item_paths -= p
|
||||
node_boost_error(N.id, "[p] is not a valid path.")
|
||||
var/list/points = N.boost_item_paths[p]
|
||||
if(islist(points))
|
||||
for(var/i in points)
|
||||
if(!isnum(points[i]))
|
||||
node_boost_error(N.id, "[points[i]] is not a valid number.")
|
||||
else if(!SSresearch.point_types[i])
|
||||
node_boost_error(N.id, "[i] is not a valid point type.")
|
||||
else if(!isnull(points))
|
||||
N.boost_item_paths -= p
|
||||
node_boost_error(N.id, "No valid list.")
|
||||
CHECK_TICK
|
||||
|
||||
/proc/verify_techweb_designs()
|
||||
for(var/d in SSresearch.techweb_designs)
|
||||
var/datum/design/D = SSresearch.techweb_designs[d]
|
||||
if(!istype(D))
|
||||
stack_trace("WARNING: Invalid research design with ID [d] detected and removed.")
|
||||
SSresearch.techweb_designs -= d
|
||||
CHECK_TICK
|
||||
|
||||
/proc/calculate_techweb_nodes()
|
||||
for(var/design_id in SSresearch.techweb_designs)
|
||||
var/datum/design/D = SSresearch.techweb_designs[design_id]
|
||||
D.unlocked_by.Cut()
|
||||
for(var/node_id in SSresearch.techweb_nodes)
|
||||
var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
|
||||
node.prerequisites = list()
|
||||
node.unlocks = list()
|
||||
node.designs = list()
|
||||
for(var/i in node.prereq_ids)
|
||||
node.prerequisites[i] = SSresearch.techweb_nodes[i]
|
||||
for(var/i in node.design_ids)
|
||||
var/datum/design/D = SSresearch.techweb_designs[i]
|
||||
node.designs[i] = D
|
||||
D.unlocked_by += node
|
||||
if(node.hidden)
|
||||
SSresearch.techweb_nodes_hidden[node.id] = node
|
||||
CHECK_TICK
|
||||
generate_techweb_unlock_linking()
|
||||
|
||||
/proc/generate_techweb_unlock_linking()
|
||||
for(var/node_id in SSresearch.techweb_nodes) //Clear all unlock links to avoid duplication.
|
||||
var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
|
||||
node.unlocks = list()
|
||||
for(var/node_id in SSresearch.techweb_nodes)
|
||||
var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
|
||||
for(var/prereq_id in node.prerequisites)
|
||||
var/datum/techweb_node/prereq_node = node.prerequisites[prereq_id]
|
||||
prereq_node.unlocks[node.id] = node
|
||||
|
||||
/proc/calculate_techweb_boost_list(clearall = FALSE)
|
||||
if(clearall)
|
||||
SSresearch.techweb_boost_items = list()
|
||||
for(var/node_id in SSresearch.techweb_nodes)
|
||||
var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
|
||||
for(var/path in node.boost_item_paths)
|
||||
if(!ispath(path))
|
||||
continue
|
||||
if(length(SSresearch.techweb_boost_items[path]))
|
||||
SSresearch.techweb_boost_items[path][node.id] = node.boost_item_paths[path]
|
||||
else
|
||||
SSresearch.techweb_boost_items[path] = list(node.id = node.boost_item_paths[path])
|
||||
CHECK_TICK
|
||||
|
||||
/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)
|
||||
|
||||
@@ -5,12 +5,13 @@
|
||||
|
||||
//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/datum/techweb_node/researched_nodes = list() //Already unlocked and all designs are now available. Assoc list, id = datum
|
||||
var/list/datum/techweb_node/visible_nodes = list() //Visible nodes, doesn't mean it can be researched. Assoc list, id = datum
|
||||
var/list/datum/techweb_node/available_nodes = list() //Nodes that can immediately be researched, all reqs met. assoc list, id = datum
|
||||
var/list/datum/design/researched_designs = list() //Designs that are available for use. Assoc list, id = datum
|
||||
var/list/datum/techweb_node/boosted_nodes = list() //Already boosted nodes that can't be boosted again. node datum = path of boost object.
|
||||
var/list/datum/techweb_node/hidden_nodes = list() //Hidden nodes. id = datum. Used for unhiding nodes when requirements are met by removing the entry of the node.
|
||||
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()
|
||||
@@ -19,13 +20,13 @@
|
||||
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, datum = number, 1 is available, 2 is all reqs are 1, so on
|
||||
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_nodes_starting[i]
|
||||
var/datum/techweb_node/DN = SSresearch.techweb_node_by_id(i)
|
||||
research_node(DN, TRUE, FALSE)
|
||||
hidden_nodes = SSresearch.techweb_nodes_hidden
|
||||
hidden_nodes = SSresearch.techweb_nodes_hidden.Copy()
|
||||
return ..()
|
||||
|
||||
/datum/techweb/admin
|
||||
@@ -49,6 +50,14 @@
|
||||
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"
|
||||
@@ -58,23 +67,24 @@
|
||||
researched_designs = null
|
||||
available_nodes = null
|
||||
visible_nodes = null
|
||||
custom_designs = null
|
||||
SSresearch.techwebs -= src
|
||||
return ..()
|
||||
|
||||
/datum/techweb/proc/recalculate_nodes(recalculate_designs = FALSE)
|
||||
/datum/techweb/proc/recalculate_nodes(recalculate_designs = FALSE, wipe_custom_designs = FALSE)
|
||||
var/list/datum/techweb_node/processing = list()
|
||||
for(var/i in researched_nodes)
|
||||
processing[i] = researched_nodes[i]
|
||||
for(var/i in visible_nodes)
|
||||
processing[i] = visible_nodes[i]
|
||||
for(var/i in available_nodes)
|
||||
processing[i] = available_nodes[i]
|
||||
for(var/i in processing)
|
||||
update_node_status(processing[i])
|
||||
if(recalculate_designs) //Wipes custom added designs like from design disks or anything like that!
|
||||
researched_designs = list()
|
||||
for(var/i in processing)
|
||||
var/datum/techweb_node/TN = processing[i]
|
||||
update_node_status(TN, FALSE)
|
||||
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
|
||||
@@ -164,21 +174,27 @@
|
||||
research_points[type] = max(0, research_points[type] - amount)
|
||||
return TRUE
|
||||
|
||||
/datum/techweb/proc/add_design_by_id(id)
|
||||
return add_design(get_techweb_design_by_id(id))
|
||||
/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)
|
||||
/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)
|
||||
return remove_design(get_techweb_design_by_id(id))
|
||||
/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)
|
||||
/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
|
||||
|
||||
@@ -192,7 +208,7 @@
|
||||
return techweb_point_display_generic(research_points)
|
||||
|
||||
/datum/techweb/proc/research_node_id(id, force, auto_update_points)
|
||||
return research_node(get_techweb_node_by_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))
|
||||
@@ -203,17 +219,17 @@
|
||||
return FALSE
|
||||
if(auto_adjust_cost)
|
||||
remove_point_list(node.get_price(src))
|
||||
researched_nodes[node.id] = node //Add to our researched list
|
||||
for(var/i in node.unlocks)
|
||||
visible_nodes[i] = node.unlocks[i]
|
||||
update_node_status(node.unlocks[i])
|
||||
for(var/i in node.designs)
|
||||
add_design(node.designs[i])
|
||||
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(get_techweb_node_by_id(id))
|
||||
return unresearch_node(SSresearch.techweb_node_by_id(id))
|
||||
|
||||
/datum/techweb/proc/unresearch_node(datum/techweb_node/node)
|
||||
if(!istype(node))
|
||||
@@ -224,9 +240,9 @@
|
||||
/datum/techweb/proc/boost_with_path(datum/techweb_node/N, itempath)
|
||||
if(!istype(N) || !ispath(itempath))
|
||||
return FALSE
|
||||
LAZYINITLIST(boosted_nodes[N])
|
||||
LAZYINITLIST(boosted_nodes[N.id])
|
||||
for(var/i in N.boost_item_paths[itempath])
|
||||
boosted_nodes[N][i] = max(boosted_nodes[N][i], N.boost_item_paths[itempath][i])
|
||||
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)
|
||||
@@ -241,13 +257,13 @@
|
||||
var/tier = 0
|
||||
if (!researched_nodes[node.id]) // researched is tier 0
|
||||
for (var/id in node.prereq_ids)
|
||||
var/prereq_tier = tiers[node.prerequisites[id]]
|
||||
var/prereq_tier = tiers[id]
|
||||
tier = max(tier, prereq_tier + 1)
|
||||
|
||||
if (tier != tiers[node])
|
||||
tiers[node] = tier
|
||||
for (var/id in node.unlocks)
|
||||
next += node.unlocks[id]
|
||||
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)
|
||||
@@ -257,8 +273,8 @@
|
||||
if(researched_nodes[node.id])
|
||||
researched = TRUE
|
||||
var/needed = node.prereq_ids.len
|
||||
for(var/i in node.prereq_ids)
|
||||
if(researched_nodes[i])
|
||||
for(var/id in node.prereq_ids)
|
||||
if(researched_nodes[id])
|
||||
visible = TRUE
|
||||
needed--
|
||||
if(!needed)
|
||||
@@ -269,15 +285,15 @@
|
||||
if(hidden_nodes[node.id]) //Hidden.
|
||||
return
|
||||
if(researched)
|
||||
researched_nodes[node.id] = node
|
||||
for(var/i in node.designs)
|
||||
add_design(node.designs[i])
|
||||
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] = node
|
||||
available_nodes[node.id] = TRUE
|
||||
else
|
||||
if(visible)
|
||||
visible_nodes[node.id] = node
|
||||
visible_nodes[node.id] = TRUE
|
||||
update_tiers(node)
|
||||
if(autoupdate_consoles)
|
||||
for(var/v in consoles_accessing)
|
||||
@@ -288,35 +304,34 @@
|
||||
//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 = researched_nodes[i]
|
||||
for(var/I in N.designs)
|
||||
if(D == N.designs[I])
|
||||
return TRUE
|
||||
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]
|
||||
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]
|
||||
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]
|
||||
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]
|
||||
return available_nodes[id]? SSresearch.techweb_node_by_id(id) : FALSE
|
||||
|
||||
/datum/techweb/specialized
|
||||
var/allowed_buildtypes = ALL
|
||||
@@ -339,11 +354,11 @@
|
||||
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_designs[id]
|
||||
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(D)
|
||||
add_design_by_id(D.id)
|
||||
break
|
||||
|
||||
/datum/techweb/specialized/autounlocking/autolathe
|
||||
@@ -364,3 +379,11 @@
|
||||
|
||||
/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,5 +1,6 @@
|
||||
|
||||
//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
|
||||
@@ -9,20 +10,82 @@
|
||||
var/starting_node = FALSE //Whether it's available without any research.
|
||||
var/list/prereq_ids = list()
|
||||
var/list/design_ids = list()
|
||||
var/list/datum/techweb_node/prerequisites = list() //Assoc list id = datum
|
||||
var/list/datum/techweb_node/unlocks = list() //CALCULATED FROM OTHER NODE'S PREREQUISITES. Assoc list id = datum.
|
||||
var/list/datum/design/designs = list() //Assoc list id = datum
|
||||
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 = 0 //Point cost to research. type = amount
|
||||
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[src])
|
||||
var/list/L = host.boosted_nodes[src]
|
||||
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]
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
// Default research tech, prevents bricking
|
||||
design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani",
|
||||
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab",
|
||||
"space_heater", "xlarge_beaker", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
|
||||
"space_heater", "xlarge_beaker", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_Islug", "sec_dart", "sec_38", "sec_38lethal",
|
||||
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
|
||||
|
||||
/datum/techweb_node/mmi
|
||||
@@ -43,7 +43,6 @@
|
||||
description = "Various tools fit for basic mech units"
|
||||
design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer")
|
||||
|
||||
|
||||
/datum/techweb_node/surplus_lims
|
||||
id = "surplus_lims"
|
||||
display_name = "Basic Prosthetics"
|
||||
@@ -51,8 +50,20 @@
|
||||
starting_node = TRUE
|
||||
prereq_ids = list("biotech")
|
||||
design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg")
|
||||
export_price = 5000
|
||||
|
||||
/datum/techweb_node/blueprinted_bottles
|
||||
id = "blueprinted_bottles"
|
||||
display_name = "License Bottling"
|
||||
description = "Some Branded bottles to print and export."
|
||||
starting_node = TRUE
|
||||
design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler")
|
||||
|
||||
/datum/techweb_node/blueprinted_exports
|
||||
id = "blueprinted_exports"
|
||||
display_name = "License Exports"
|
||||
description = "Some Branded bottles to print and export."
|
||||
starting_node = TRUE
|
||||
design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export")
|
||||
|
||||
/////////////////////////Biotech/////////////////////////
|
||||
/datum/techweb_node/biotech
|
||||
@@ -60,7 +71,7 @@
|
||||
display_name = "Biological Technology"
|
||||
description = "What makes us tick." //the MC, silly!
|
||||
prereq_ids = list("base")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag")
|
||||
design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -82,6 +93,14 @@
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
/datum/techweb_node/bottle_exports
|
||||
id = "bottle_exports"
|
||||
display_name = "Legal Bottling"
|
||||
prereq_ids = list("blueprinted_bottles")
|
||||
description = "New bottles for printing and selling."
|
||||
design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250)
|
||||
|
||||
/datum/techweb_node/advance_lims
|
||||
id = "advance_lims"
|
||||
display_name = "Upgraded Prosthetics"
|
||||
@@ -110,12 +129,21 @@
|
||||
export_price = 5000
|
||||
|
||||
/////////////////////////Advanced Surgery/////////////////////////
|
||||
/datum/techweb_node/imp_wt_surgery
|
||||
id = "imp_wt_surgery"
|
||||
display_name = "Improved Wound-Tending Surgery"
|
||||
description = "Who would have known being more gentle with a hemostat decreases patient pain?"
|
||||
prereq_ids = list("biotech")
|
||||
design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
|
||||
export_price = 1000
|
||||
|
||||
/datum/techweb_node/adv_surgery
|
||||
id = "adv_surgery"
|
||||
display_name = "Advanced Surgery"
|
||||
description = "When simple medicine doesn't cut it."
|
||||
prereq_ids = list("adv_biotech")
|
||||
design_ids = list("surgery_lobotomy", "surgery_reconstruction", "surgery_toxinhealing", "organbox", "surgery_exp_dissection")
|
||||
prereq_ids = list("imp_wt_surgery")
|
||||
design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -124,7 +152,7 @@
|
||||
display_name = "Experimental Surgery"
|
||||
description = "When evolution isn't fast enough."
|
||||
prereq_ids = list("adv_surgery")
|
||||
design_ids = list("surgery_revival","surgery_pacify","surgery_vein_thread","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond")
|
||||
design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
export_price = 5000
|
||||
|
||||
@@ -133,7 +161,7 @@
|
||||
display_name = "Alien Surgery"
|
||||
description = "Abductors did nothing wrong."
|
||||
prereq_ids = list("exp_surgery", "alientech")
|
||||
design_ids = list("surgery_brainwashing","surgery_zombie")
|
||||
design_ids = list("surgery_brainwashing","surgery_zombie", "surgery_ext_dissection", "surgery_heal_combo_upgrade_femto")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000)
|
||||
export_price = 5000
|
||||
|
||||
@@ -508,7 +536,7 @@
|
||||
display_name = "Subdermal Implants"
|
||||
description = "Electronic implants buried beneath the skin."
|
||||
prereq_ids = list("biotech", "datatheory")
|
||||
design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator")
|
||||
design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -685,12 +713,12 @@
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
|
||||
export_price = 5000
|
||||
|
||||
/datum/techweb_node/tech_shell
|
||||
id = "tech_shell"
|
||||
display_name = "Technological Shells"
|
||||
description = "They're more technological than regular shot."
|
||||
/datum/techweb_node/exotic_ammo
|
||||
id = "exotic_ammo"
|
||||
display_name = "Exotic Ammunition"
|
||||
description = "They won't know what hit em."
|
||||
prereq_ids = list("weaponry", "ballistic_weapons")
|
||||
design_ids = list("techshotshell")
|
||||
design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
|
||||
export_price = 5000
|
||||
|
||||
@@ -1018,38 +1046,19 @@
|
||||
id = "alien_bio"
|
||||
display_name = "Alien Biological Tools"
|
||||
description = "Advanced biological tools."
|
||||
<<<<<<< HEAD
|
||||
prereq_ids = list("alientech", "advance_surgerytools")
|
||||
design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
export_price = 10000
|
||||
=======
|
||||
prereq_ids = list("alientech", "adv_biotech")
|
||||
design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery")
|
||||
boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien,
|
||||
/obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
|
||||
/obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 20000
|
||||
hidden = TRUE
|
||||
>>>>>>> parent of b404e18b15... Merge branch 'master' into FERMICHEMCurTweaks
|
||||
|
||||
/datum/techweb_node/alien_engi
|
||||
id = "alien_engi"
|
||||
display_name = "Alien Engineering"
|
||||
<<<<<<< HEAD
|
||||
description = "Alien engineering tools."
|
||||
prereq_ids = list("alientech", "exp_tools")
|
||||
=======
|
||||
description = "Alien engineering tools"
|
||||
prereq_ids = list("alientech", "adv_engi")
|
||||
>>>>>>> parent of b404e18b15... Merge branch 'master' into FERMICHEMCurTweaks
|
||||
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
|
||||
boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, /obj/item/stock_parts/cell/infinite/abductor,
|
||||
/obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor_baton, /obj/item/abductor)
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
export_price = 20000
|
||||
hidden = TRUE
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
export_price = 10000
|
||||
|
||||
/datum/techweb_node/syndicate_basic
|
||||
id = "syndicate_basic"
|
||||
@@ -1109,4 +1118,4 @@
|
||||
for(var/i in processing)
|
||||
var/datum/techweb_node/TN = i
|
||||
TW.add_point_list(TN.research_costs)
|
||||
return TW.printout_points()
|
||||
return TW.printout_points()
|
||||
|
||||
@@ -58,9 +58,7 @@
|
||||
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.
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
|
||||
if(mood)
|
||||
mood.add_event(null,"gross_food", /datum/mood_event/gross_food)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food)
|
||||
last_check_time = world.time
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -64,10 +64,9 @@
|
||||
var/interrupted = FALSE
|
||||
var/mob/target
|
||||
var/icon/bluespace
|
||||
var/datum/weakref/redirect_component
|
||||
|
||||
/datum/status_effect/slimerecall/on_apply()
|
||||
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/resistField))))
|
||||
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")
|
||||
@@ -77,9 +76,9 @@
|
||||
/datum/status_effect/slimerecall/proc/resistField()
|
||||
interrupted = TRUE
|
||||
owner.remove_status_effect(src)
|
||||
|
||||
/datum/status_effect/slimerecall/on_remove()
|
||||
qdel(redirect_component.resolve())
|
||||
redirect_component = null
|
||||
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>")
|
||||
@@ -98,10 +97,9 @@
|
||||
duration = -1 //Will remove self when block breaks.
|
||||
alert_type = /obj/screen/alert/status_effect/freon/stasis
|
||||
var/obj/structure/ice_stasis/cube
|
||||
var/datum/weakref/redirect_component
|
||||
|
||||
/datum/status_effect/frozenstasis/on_apply()
|
||||
redirect_component = WEAKREF(owner.AddComponent(/datum/component/redirect, list(COMSIG_LIVING_RESIST = CALLBACK(src, .proc/breakCube))))
|
||||
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/breakCube)
|
||||
cube = new /obj/structure/ice_stasis(get_turf(owner))
|
||||
owner.forceMove(cube)
|
||||
owner.status_flags |= GODMODE
|
||||
@@ -118,8 +116,7 @@
|
||||
if(cube)
|
||||
qdel(cube)
|
||||
owner.status_flags &= ~GODMODE
|
||||
qdel(redirect_component.resolve())
|
||||
redirect_component = null
|
||||
UnregisterSignal(owner, COMSIG_LIVING_RESIST)
|
||||
|
||||
/datum/status_effect/slime_clone
|
||||
id = "slime_cloned"
|
||||
@@ -375,15 +372,11 @@ datum/status_effect/rebreathing/tick()
|
||||
duration = 30
|
||||
|
||||
/datum/status_effect/tarfoot/on_apply()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(istype(H))
|
||||
H.physiology.speed_mod += 0.5
|
||||
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()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(istype(H))
|
||||
H.physiology.speed_mod -= 0.5
|
||||
owner.remove_movespeed_modifier(MOVESPEED_ID_TARFOOT)
|
||||
|
||||
/datum/status_effect/spookcookie
|
||||
id = "spookcookie"
|
||||
@@ -570,7 +563,7 @@ datum/status_effect/stabilized/blue/on_remove()
|
||||
name = "burning fingertips"
|
||||
desc = "You shouldn't see this."
|
||||
|
||||
/obj/item/hothands/is_hot()
|
||||
/obj/item/hothands/get_temperature()
|
||||
return 290 //Below what's required to ignite plasma.
|
||||
|
||||
/datum/status_effect/stabilized/darkpurple
|
||||
@@ -695,20 +688,15 @@ datum/status_effect/stabilized/blue/on_remove()
|
||||
/datum/status_effect/stabilized/sepia/tick()
|
||||
if(prob(50) && mod > -1)
|
||||
mod--
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(istype(H))
|
||||
H.physiology.speed_mod--
|
||||
owner.add_movespeed_modifier(MOVESPEED_ID_SEPIA, update=TRUE, priority=100, multiplicative_slowdown=-1, blacklisted_movetypes=(FLYING|FLOATING))
|
||||
else if(mod < 1)
|
||||
mod++
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(istype(H))
|
||||
H.physiology.speed_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()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(istype(H))
|
||||
H.physiology.speed_mod += -mod //Reset the changes.
|
||||
owner.remove_movespeed_modifier(MOVESPEED_ID_SEPIA)
|
||||
|
||||
/datum/status_effect/stabilized/cerulean
|
||||
id = "stabilizedcerulean"
|
||||
@@ -916,7 +904,7 @@ datum/status_effect/stabilized/blue/on_remove()
|
||||
colour = "light pink"
|
||||
|
||||
/datum/status_effect/stabilized/lightpink/on_apply()
|
||||
ADD_TRAIT(owner, TRAIT_GOTTAGOFAST,"slimestatus")
|
||||
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()
|
||||
@@ -927,7 +915,7 @@ datum/status_effect/stabilized/blue/on_remove()
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/stabilized/lightpink/on_remove()
|
||||
REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST,"slimestatus")
|
||||
owner.remove_movespeed_modifier(MOVESPEED_ID_SLIME_STATUS)
|
||||
|
||||
/datum/status_effect/stabilized/adamantine
|
||||
id = "stabilizedadamantine"
|
||||
|
||||
@@ -24,12 +24,9 @@ Self-sustaining extracts:
|
||||
A.icon = icon
|
||||
A.icon_state = icon_state
|
||||
A.color = color
|
||||
A.name = "self-sustaining " + colour + " extract"
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/autoslime/Initialize()
|
||||
name = "self-sustaining " + extract.name
|
||||
return ..()
|
||||
|
||||
/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
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//Xenobio control console
|
||||
/mob/camera/aiEye/remote/xenobio
|
||||
visible_icon = 1
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "camera_target"
|
||||
visible_icon = TRUE
|
||||
icon = 'icons/mob/cameramob.dmi'
|
||||
icon_state = "generic_camera"
|
||||
var/allowed_area = null
|
||||
|
||||
/mob/camera/aiEye/remote/xenobio/Initialize()
|
||||
@@ -29,12 +29,11 @@
|
||||
var/datum/action/innate/slime_scan/scan_action
|
||||
var/datum/action/innate/feed_potion/potion_action
|
||||
|
||||
var/datum/component/redirect/listener
|
||||
|
||||
var/list/stored_slimes
|
||||
var/obj/item/slimepotion/slime/current_potion
|
||||
var/max_slimes = 5
|
||||
var/max_slimes = 1
|
||||
var/monkeys = 0
|
||||
var/upgradetier = 0
|
||||
|
||||
icon_screen = "slime_comp"
|
||||
icon_keyboard = "rd_key"
|
||||
@@ -50,7 +49,7 @@
|
||||
scan_action = new
|
||||
potion_action = new
|
||||
stored_slimes = list()
|
||||
listener = AddComponent(/datum/component/redirect, list(COMSIG_ATOM_CONTENTS_DEL = CALLBACK(src, .proc/on_contents_del)))
|
||||
RegisterSignal(src, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
|
||||
|
||||
/obj/machinery/computer/camera_advanced/xenobio/Destroy()
|
||||
stored_slimes = null
|
||||
@@ -64,9 +63,9 @@
|
||||
/obj/machinery/computer/camera_advanced/xenobio/CreateEye()
|
||||
eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src))
|
||||
eyeobj.origin = src
|
||||
eyeobj.visible_icon = 1
|
||||
eyeobj.icon = 'icons/obj/abductor.dmi'
|
||||
eyeobj.icon_state = "camera_target"
|
||||
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)
|
||||
..()
|
||||
@@ -108,6 +107,22 @@
|
||||
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>")
|
||||
@@ -266,3 +281,29 @@
|
||||
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