diff --git a/code/__defines/dcs/signals/signals_object.dm b/code/__defines/dcs/signals/signals_object.dm index fde35542b2..d435b9b082 100644 --- a/code/__defines/dcs/signals/signals_object.dm +++ b/code/__defines/dcs/signals/signals_object.dm @@ -34,6 +34,8 @@ #define COMSIG_MACHINERY_DESTRUCTIVE_SCAN "machinery_destructive_scan" ///from /obj/machinery/computer/arcade/victory_tickets(tickets, sound = TRUE) #define COMSIG_ARCADE_VICTORY "arcade_victory" +///from /obj/machinery/computer/telescience/proc/doteleport(mob/user): (list/atom/movable/teleported_things, turf/target_turf, sending ) +#define COMSIG_TELESCI_TELEPORT "telesci_teleport" ///from /datum/controller/subsystem/air/proc/start_processing_machine: () #define COMSIG_MACHINERY_START_PROCESSING_AIR "start_processing_air" ///from /datum/controller/subsystem/air/proc/stop_processing_machine: () diff --git a/code/__defines/experisci.dm b/code/__defines/experisci.dm index 92b7b716ee..a7d3075ab2 100644 --- a/code/__defines/experisci.dm +++ b/code/__defines/experisci.dm @@ -13,6 +13,10 @@ /// Detail stages, only provide more textual information and have no inherent progress #define EXPERIMENT_DETAIL_STAGE "detail" +#define EXPERIMENT_TAG_BASE "Base" +#define EXPERIMENT_TAG_SCAN "Scan" +#define EXPERIMENT_TAG_PHYSICAL "Physical Experiment" + /// Macro for defining a progress stage #define EXPERIMENT_PROGRESS(type, desc, values...) list(list(type, desc, values)) /// Macro for boolean stages diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 50f00cf018..88bdcd1b8d 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -143,3 +143,7 @@ #define GET_MATERIAL_REF(arguments...) _GetMaterialRef(list(##arguments)) /// Makes sure only integer values are used when consuming, removing & checking for mats #define OPTIMAL_COST(cost)(max(1, round(cost))) + +/// Default circuitboard material list +#define DEFAULT_CIRCUIT_MATERIALS list(MAT_GLASS = 2000) +#define RECYCLE_CIRCUIT_MATERIALS list(MAT_GLASS = 40) diff --git a/code/controllers/subsystems/research.dm b/code/controllers/subsystems/research.dm index 16070edea4..814c6a955a 100644 --- a/code/controllers/subsystems/research.dm +++ b/code/controllers/subsystems/research.dm @@ -52,14 +52,56 @@ SUBSYSTEM_DEF(research) /obj/item/assembly/signaler/anomaly/grav = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS), /obj/item/assembly/signaler/anomaly/hallucination = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS), /obj/item/assembly/signaler/anomaly/pyro = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS), - /obj/item/assembly/signaler/anomaly/weather = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + /obj/item/assembly/signaler/anomaly/weather = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS), + /obj/item/slime_extract/grey = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.1), + /obj/item/slime_extract/purple = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.1), + /obj/item/slime_extract/orange = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.1), + /obj/item/slime_extract/blue = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.1), + /obj/item/slime_extract/metal = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.1), + /obj/item/slime_extract/yellow = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.25), + /obj/item/slime_extract/dark_purple = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.25), + /obj/item/slime_extract/dark_blue = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.25), + /obj/item/slime_extract/silver = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.25), + /obj/item/slime_extract/bluespace = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.5), + /obj/item/slime_extract/ruby = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.5), + /obj/item/slime_extract/amber = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.5), + /obj/item/slime_extract/cerulean = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.5), + /obj/item/slime_extract/red = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.75), + /obj/item/slime_extract/green = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.75), + /obj/item/slime_extract/pink = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.75), + /obj/item/slime_extract/gold = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS*0.75), + /obj/item/slime_extract/oil = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS), + /obj/item/slime_extract/sapphire = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS), + /obj/item/slime_extract/emerald = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS), + /obj/item/slime_extract/rainbow = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) ) ///Allows repeated deconstruction of these items for points. These items MUST be in techweb_point_items as well. var/list/techweb_repeatable_items = list( /obj/item/research_sample/common, /obj/item/research_sample/uncommon, /obj/item/research_sample/rare, - /obj/item/research_sample/bluespace + /obj/item/research_sample/bluespace, + /obj/item/slime_extract/grey, + /obj/item/slime_extract/purple, + /obj/item/slime_extract/orange, + /obj/item/slime_extract/blue, + /obj/item/slime_extract/metal, + /obj/item/slime_extract/yellow, + /obj/item/slime_extract/dark_purple, + /obj/item/slime_extract/dark_blue, + /obj/item/slime_extract/silver, + /obj/item/slime_extract/bluespace, + /obj/item/slime_extract/ruby, + /obj/item/slime_extract/amber, + /obj/item/slime_extract/cerulean, + /obj/item/slime_extract/red, + /obj/item/slime_extract/green, + /obj/item/slime_extract/pink, + /obj/item/slime_extract/gold, + /obj/item/slime_extract/oil, + /obj/item/slime_extract/sapphire, + /obj/item/slime_extract/emerald, + /obj/item/slime_extract/rainbow, ) var/list/errored_datums = list() ///Associated list of all point types that techwebs will have and their respective 'abbreviated' name. diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index e59c2d04d4..fedd757df2 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -10,7 +10,7 @@ throwforce = 5.0 throw_speed = 3 throw_range = 15 - matter = list(MAT_STEEL = 30, MAT_GLASS = 10) + matter = RECYCLE_CIRCUIT_MATERIALS var/build_path = null var/board_type = new /datum/frame/frame_types/computer var/list/req_components = null diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm index 0847fbc2b0..0aaff63eb5 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm @@ -48,6 +48,16 @@ flags = NOBLUDGEON /obj/item/dogborg/sleeper/Initialize(mapload) + if(analyzer) //Destructive analysis + var/static/list/destructive_signals = list( + COMSIG_MACHINERY_DESTRUCTIVE_SCAN = TYPE_PROC_REF(/datum/component/experiment_handler, try_run_destructive_experiment), + ) + AddComponent(/datum/component/experiment_handler, \ + config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ + allowed_experiments = list(/datum/experiment/scanning),\ + config_flags = EXPERIMENT_CONFIG_ALWAYS_ACTIVE|EXPERIMENT_CONFIG_SILENT_FAIL,\ + experiment_signals = destructive_signals, \ + ) . = ..() med_analyzer = new /obj/item/healthanalyzer @@ -280,6 +290,7 @@ "ingested_reagents" = ingested_reagents ) + var/datum/component/experiment_handler/handler = get_experiment_handler() var/list/data = list( "our_patient" = patient_data, "eject_port" = eject_port, @@ -298,6 +309,8 @@ "deliveryslot_2" = deliveryslot_2, "deliveryslot_3" = deliveryslot_3, "items_preserved" = items_preserved, + "has_destructive_analyzer" = analyzer, + "techweb_name" = handler?.linked_web ? "[handler.linked_web.id] / [handler.linked_web.organization]" : "Disconnected", ) return data /obj/item/dogborg/sleeper/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) @@ -581,6 +594,10 @@ plastic.add_charge(total_material) if(material == MAT_WOOD && wood) wood.add_charge(total_material) + var/datum/component/experiment_handler/handler = get_experiment_handler() + if(analyzer && handler) + techweb_item_generate_points(T, handler.linked_web) + SEND_SIGNAL(src, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, T) if(is_trash) hound.adjust_nutrition(digested) else @@ -617,4 +634,12 @@ STOP_PROCESSING(SSobj, src) return +/obj/item/dogborg/sleeper/proc/get_experiment_handler() + PRIVATE_PROC(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + RETURN_TYPE(/datum/component/experiment_handler) + if(!analyzer) + return null + return GetComponent(/datum/component/experiment_handler) + #undef SLEEPER_INJECT_COST diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 52d3c592f0..e0e94f38fd 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -351,6 +351,7 @@ src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/t_scanner(src) src.modules += new /obj/item/analyzer(src) + src.modules += new /obj/item/assembly/signaler(src) // Anomaly handling src.modules += new /obj/item/geiger(src) src.modules += new /obj/item/taperoll/engineering(src) src.modules += new /obj/item/gripper/engineering(src) diff --git a/code/modules/research/tg/designs/boards/misc.dm b/code/modules/research/tg/designs/boards/misc.dm index 16d00b90f4..60fb79dd83 100644 --- a/code/modules/research/tg/designs/boards/misc.dm +++ b/code/modules/research/tg/designs/boards/misc.dm @@ -2,7 +2,7 @@ name = "NULL ENTRY Board" desc = "I promise this doesn't give you syndicate goodies!" build_type = IMPRINTER - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS category = list( RND_CATEGORY_MACHINE ) diff --git a/code/modules/research/tg/designs/mechfab_designs.dm b/code/modules/research/tg/designs/mechfab_designs.dm index df8e358045..773b8d02e6 100644 --- a/code/modules/research/tg/designs/mechfab_designs.dm +++ b/code/modules/research/tg/designs/mechfab_designs.dm @@ -15,13 +15,13 @@ name = "APLU 'Ripley' central control circuit" id = "ripley_main" build_path = /obj/item/circuitboard/mecha/ripley/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/ripley/circuit_peri name = "APLU 'Ripley' peripherals control circuit" id = "ripley_peri" build_path = /obj/item/circuitboard/mecha/ripley/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/ripley/chassis name = "Ripley Chassis" @@ -78,14 +78,14 @@ id = "odysseus_main" // req_tech = list(TECH_DATA = 3,TECH_BIO = 2) build_path = /obj/item/circuitboard/mecha/odysseus/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/odysseus/odysseus_peri name = "'Odysseus' peripherals control circuit" id = "odysseus_peri" // req_tech = list(TECH_DATA = 3,TECH_BIO = 2) build_path = /obj/item/circuitboard/mecha/odysseus/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/odysseus/chassis name = "Odysseus Chassis" @@ -141,28 +141,28 @@ id = "gygax_main" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/gygax/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gygax/gygax_peri name = "'Gygax' peripherals control circuit" id = "gygax_peri" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/gygax/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gygax/gygax_targ name = "'Gygax' weapon control and targeting circuit" id = "gygax_targ" // req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) build_path = /obj/item/circuitboard/mecha/gygax/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gygax/gygax_medical name = "'Serenity' medical control circuit" id = "gygax_medical" // req_tech = list(TECH_DATA = 4, TECH_BIO = 2) build_path = /obj/item/circuitboard/mecha/gygax/medical - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gygax/chassis/serenity name = "Serenity Chassis" @@ -231,7 +231,7 @@ // req_tech = list(TECH_DATA = 4) materials = list(MAT_GLASS = 2000, MAT_GRAPHITE = 1250) build_path = /obj/item/circuitboard/mecha/durand/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/durand/durand_peri name = "'Durand' peripherals control circuit" @@ -239,7 +239,7 @@ // req_tech = list(TECH_DATA = 4) materials = list(MAT_GLASS = 2000, MAT_GRAPHITE = 1250) build_path = /obj/item/circuitboard/mecha/durand/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/durand/durand_targ name = "'Durand' weapon control and targeting circuit" @@ -247,7 +247,7 @@ // req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) materials = list(MAT_GLASS = 2000, MAT_GRAPHITE = 1250) build_path = /obj/item/circuitboard/mecha/durand/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/durand/chassis name = "Durand Chassis" @@ -386,28 +386,28 @@ id = "pinnace_main" // req_tech = list(TECH_DATA = 3, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/pinnace/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/pinnace/pinnace_flight name = "Pinnace flight control board circuit" id = "pinnace_flight" // req_tech = list(TECH_DATA = 3, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/pinnace/flight - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/pinnace/pinnace_targeting name = "Pinnace weapon control and targeting board circuit" id = "pinnace_targeting" // req_tech = list(TECH_DATA = 3, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/pinnace/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/pinnace/pinnace_cockpit_control name = "Pinnace manual flight control instruments circuit" id = "pinnace_cockpit_control" // req_tech = list(TECH_DATA = 3, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/pinnace/cockpitboard - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/pinnace/chassis name = "Pinnace Chassis" @@ -470,28 +470,28 @@ id = "baron_main" // req_tech = list(TECH_DATA = 5, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/baron/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/baron/baron_flight name = "Baron flight control board circuit" id = "baron_flight" // req_tech = list(TECH_DATA = 5, TECH_POWER = 4) build_path = /obj/item/circuitboard/mecha/fighter/baron/flight - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/baron/baron_targeting name = "Baron weapon control and targeting board circuit" id = "baron_targeting" // req_tech = list(TECH_DATA = 5, TECH_POWER = 4, TECH_COMBAT = 3) build_path = /obj/item/circuitboard/mecha/fighter/baron/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/baron/baron_cockpit_control name = "Baron manual flight control instruments circuit" id = "baron_cockpit_control" // req_tech = list(TECH_DATA = 5, TECH_POWER = 4, TECH_COMBAT = 3) build_path = /obj/item/circuitboard/mecha/fighter/baron/cockpitboard - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/baron/chassis name = "Baron Chassis" @@ -749,13 +749,13 @@ name = "'Gopher' central control circuit" id = "gopher_main" build_path = /obj/item/circuitboard/mecha/gopher/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gopher/gopher_peri name = "'Gopher' peripherals control circuit" id = "gopher_peri" build_path = /obj/item/circuitboard/mecha/gopher/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/gopher/chassis name = "Gopher Chassis" @@ -827,21 +827,21 @@ id = "polecat_main" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/polecat/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/polecat/polecat_peri name = "'Polecat' peripherals control circuit" id = "polecat_peri" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/polecat/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/polecat/polecat_targ name = "'Polecat' weapon control and targeting circuit" id = "polecat_targ" // req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) build_path = /obj/item/circuitboard/mecha/polecat/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/polecat/chassis name = "Polecat Chassis" @@ -896,21 +896,21 @@ id = "weasel_main" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/weasel/main - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/weasel/weasel_peri name = "'Weasel' peripherals control circuit" id = "weasel_peri" // req_tech = list(TECH_DATA = 4) build_path = /obj/item/circuitboard/mecha/weasel/peripherals - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/weasel/weasel_targ name = "'Weasel' weapon control and targeting circuit" id = "weasel_targ" // req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) build_path = /obj/item/circuitboard/mecha/weasel/targeting - materials = list(MAT_GLASS = 2000) + materials = DEFAULT_CIRCUIT_MATERIALS /datum/design_techweb/mechfab/weasel/chassis name = "Weasel Chassis" diff --git a/code/modules/research/tg/designs/medical_designs.dm b/code/modules/research/tg/designs/medical_designs.dm new file mode 100644 index 0000000000..3ded86eaa2 --- /dev/null +++ b/code/modules/research/tg/designs/medical_designs.dm @@ -0,0 +1,144 @@ +// Medical Designs +/datum/design_techweb/pillbottle + name = "Pill Bottle" + id = "pillbottle" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_PLASTIC = 100, MAT_GLASS = 100) + build_path = /obj/item/storage/pill_bottle + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/syringe + name = "Syringe" + id = "syringe" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 100, MAT_GLASS = 500) + build_path = /obj/item/reagent_containers/syringe + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/dropper + name = "Dropper" + id = "dropper" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_GLASS = 100, MAT_PLASTIC = 500) + build_path = /obj/item/reagent_containers/dropper + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/scalpel + name = "Scalpel" + id = "scalpel" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/surgical/scalpel + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/circular_saw + name = "Circular Saw" + id = "circular_saw" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000) + build_path = /obj/item/surgical/circular_saw + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/bonesetter + name = "Bonesetter" + id = "bonesetter" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000) + build_path = /obj/item/surgical/bonesetter + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/surgicaldrill + name = "Surgical Drill" + id = "surgicaldrill" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/surgical/surgicaldrill + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/retractor + name = "Retractor" + id = "retractor" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/surgical/retractor + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/cautery + name = "Cautery" + id = "cautery" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/surgical/cautery + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/hemostat + name = "Hemostat" + id = "hemostat" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/surgical/hemostat + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/defibrillator + name = "Defibrillator" + desc = "A portable defibrillator, used for resuscitating recently deceased crew." + id = "defibrillator" + build_type = PROTOLATHE + build_path = /obj/item/defib_kit + materials = list(MAT_STEEL = SHEET_MATERIAL_AMOUNT * 4, MAT_GLASS = SHEET_MATERIAL_AMOUNT * 2, MAT_SILVER =SHEET_MATERIAL_AMOUNT * 1.5, MAT_GOLD = SHEET_MATERIAL_AMOUNT * 0.5) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/penlight + name = "Penlight" + id = "penlight" + build_type = PROTOLATHE + materials = list(MAT_STEEL = 100, MAT_GLASS = 100) + build_path = /obj/item/flashlight/pen + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design_techweb/implanter + name = "Implanter" + id = "implanter" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_STEEL = 500, MAT_GLASS = 500) + build_path = /obj/item/implanter + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL, + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/tg/designs/multi-department_designs.dm b/code/modules/research/tg/designs/multi-department_designs.dm new file mode 100644 index 0000000000..7200b1c785 --- /dev/null +++ b/code/modules/research/tg/designs/multi-department_designs.dm @@ -0,0 +1,32 @@ +/datum/design_techweb/beaker + name = "Beaker" + id = "beaker" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_GLASS = 500) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + build_path = /obj/item/reagent_containers/glass/beaker + departmental_flags = ALL + +/datum/design_techweb/large_beaker + name = "Large Beaker" + id = "large_beaker" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_GLASS = 1000) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + build_path = /obj/item/reagent_containers/glass/beaker/large + departmental_flags = ALL + +/datum/design_techweb/vial + name = "Vial" + id = "vial" + build_type = AUTOLATHE | PROTOLATHE + materials = list(MAT_GLASS = 100) + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_CHEMISTRY, + ) + build_path = /obj/item/reagent_containers/glass/beaker/vial + departmental_flags = ALL diff --git a/code/modules/research/tg/designs/stock_part_designs.dm b/code/modules/research/tg/designs/stock_part_designs.dm index 4590e6cb7b..36a961b265 100644 --- a/code/modules/research/tg/designs/stock_part_designs.dm +++ b/code/modules/research/tg/designs/stock_part_designs.dm @@ -355,7 +355,7 @@ category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_1 ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO + departmental_flags = ALL /datum/design_techweb/high name = "High-Capacity Cell" @@ -404,7 +404,7 @@ category = list( RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_1 ) - departmental_flags = DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO + departmental_flags = ALL /datum/design_techweb/weapon_cell name = "Weapon Cell" diff --git a/code/modules/research/tg/experisci/experiment/handlers/experiment_handler.dm b/code/modules/research/tg/experisci/experiment/handlers/experiment_handler.dm index 74f5253e6e..343970a1d9 100644 --- a/code/modules/research/tg/experisci/experiment/handlers/experiment_handler.dm +++ b/code/modules/research/tg/experisci/experiment/handlers/experiment_handler.dm @@ -136,7 +136,7 @@ /** * Hooks on destructive scans to try and run an experiment (When using a handheld handler) */ -/datum/component/experiment_handler/proc/try_run_destructive_experiment(datum/source, list/scanned_atoms) +/datum/component/experiment_handler/proc/try_run_destructive_experiment(datum/source, atom/scan_target) SIGNAL_HANDLER var/atom/movable/our_scanner = parent if (selected_experiment == null && !(config_flags & EXPERIMENT_CONFIG_ALWAYS_ACTIVE) ) @@ -144,11 +144,7 @@ playsound(our_scanner, 'sound/machines/buzz-sigh.ogg', 25) to_chat(our_scanner, span_notice("No experiment selected!")) return - var/successful_scan - for(var/scan_target in scanned_atoms) - if(action_experiment(source, scan_target)) - successful_scan = TRUE - if(successful_scan) + if(action_experiment(source, scan_target)) playsound(our_scanner, 'sound/machines/ping.ogg', 25) to_chat(our_scanner, span_notice("The scan succeeds.")) else if(!(config_flags & EXPERIMENT_CONFIG_SILENT_FAIL)) diff --git a/code/modules/research/tg/experisci/experiment/instances/destructive.dm b/code/modules/research/tg/experisci/experiment/instances/destructive.dm new file mode 100644 index 0000000000..af08ca9e1b --- /dev/null +++ b/code/modules/research/tg/experisci/experiment/instances/destructive.dm @@ -0,0 +1,30 @@ +#define DESTRUCTIVE_DEVICES list(/obj/machinery/rnd/destructive_analyzer, /obj/item/dogborg/sleeper) + +///Example of a destructive experiment. +/datum/experiment/scanning/random/artifact_destruction + name = "Artifact Analysis" + description = "Destructively analyze several small artifact research samples to assess their exotic molecular properties." + possible_types = list(/obj/item/research_sample/common) + allowed_experimentors = DESTRUCTIVE_DEVICES + total_requirement = 3 + traits = EXPERIMENT_TRAIT_DESTRUCTIVE + exp_tag = EXPERIMENT_TAG_PHYSICAL + +/datum/experiment/scanning/random/artifact_destruction/serialize_progress_stage(atom/target, list/seen_instances) + return EXPERIMENT_PROG_INT("Destroy artifacts.", \ + traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) + +/// Bluespace crystal +/datum/experiment/scanning/bluespace_crystal + name = "Bluespace Crystal Analysis" + description = "Destructively analyze a bluespace crystal to examine it's exotic molecular shape." + required_atoms = list(/obj/item/bluespace_crystal = 1) + allowed_experimentors = DESTRUCTIVE_DEVICES + traits = EXPERIMENT_TRAIT_DESTRUCTIVE + exp_tag = EXPERIMENT_TAG_PHYSICAL + +/datum/experiment/scanning/bluespace_crystal/serialize_progress_stage(atom/target, list/seen_instances) + return EXPERIMENT_PROG_INT("Destroy bluespace crystal.", \ + traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) + +#undef DESTRUCTIVE_DEVICES diff --git a/code/modules/research/tg/experisci/experiment/instances/misc.dm b/code/modules/research/tg/experisci/experiment/instances/misc.dm index 91f1f62961..906105e6c2 100644 --- a/code/modules/research/tg/experisci/experiment/instances/misc.dm +++ b/code/modules/research/tg/experisci/experiment/instances/misc.dm @@ -1,17 +1,4 @@ -///Example of a destructive experiment. -/datum/experiment/scanning/random/artifact_destruction - name = "Artifact Analysis" - description = "Destroy some artifacts" - possible_types = list(/obj/item/research_sample/common) - total_requirement = 3 - traits = EXPERIMENT_TRAIT_DESTRUCTIVE - exp_tag = "Physical Experiment" - -/datum/experiment/scanning/random/artifact_destruction/serialize_progress_stage(atom/target, list/seen_instances) - return EXPERIMENT_PROG_INT("Destroy artifacts.", \ - traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) - /datum/experiment/scanning/random/janitor_trash name = "Station Hygiene Inspection" description = "To learn how to clean, we must first learn what it is to have filth. We need you to scan some filth around the station." diff --git a/code/modules/research/tg/experisci/experiment/instances/teleporting.dm b/code/modules/research/tg/experisci/experiment/instances/teleporting.dm new file mode 100644 index 0000000000..3039cffc02 --- /dev/null +++ b/code/modules/research/tg/experisci/experiment/instances/teleporting.dm @@ -0,0 +1,24 @@ +/datum/experiment/physical/teleporting + name = "Teleportation Basics" + description = "How does bluespace travel affect mundane materials? Teleport an object from another location to the telescience telepad, and record observations." + +/datum/experiment/physical/teleporting/register_events() + if(!istype(currently_scanned_atom, /obj/machinery/computer/telescience) && !istype(currently_scanned_atom, /obj/machinery/telepad)) + linked_experiment_handler.announce_message("Incorrect object for experiment.") + return FALSE + + RegisterSignal(currently_scanned_atom, COMSIG_TELESCI_TELEPORT, PROC_REF(teleported_items)) + linked_experiment_handler.announce_message("Experiment ready to start.") + return TRUE + +/datum/experiment/physical/teleporting/unregister_events() + UnregisterSignal(currently_scanned_atom, COMSIG_TELESCI_TELEPORT) + +/datum/experiment/physical/teleporting/check_progress() + . += EXPERIMENT_PROG_BOOL("Teleport an object to the telescience telepad.", is_complete()) + +/datum/experiment/physical/teleporting/proc/teleported_items(datum/source, list/atom/movable/teleported_things, turf/target_turf, sending) + SIGNAL_HANDLER + // we must GET an object, not just send one. + if(!sending && teleported_things.len) + finish_experiment(linked_experiment_handler) diff --git a/code/modules/research/tg/experisci/experiment/types/experiment.dm b/code/modules/research/tg/experisci/experiment/types/experiment.dm index c411fdc8e9..63474626d6 100644 --- a/code/modules/research/tg/experisci/experiment/types/experiment.dm +++ b/code/modules/research/tg/experisci/experiment/types/experiment.dm @@ -12,7 +12,7 @@ /// A brief description of the experiment to be shown as details var/description = "Base experiment" /// A descriptive tag used on UI elements to denote 'types' of experiments - var/exp_tag = "Base" + var/exp_tag = EXPERIMENT_TAG_BASE /// A list of types that are allowed to experiment with this dastum var/list/allowed_experimentors /// Whether the experiment has been completed diff --git a/code/modules/research/tg/experisci/experiment/types/physical_experiment.dm b/code/modules/research/tg/experisci/experiment/types/physical_experiment.dm index 97f7452085..962278bf0c 100644 --- a/code/modules/research/tg/experisci/experiment/types/physical_experiment.dm +++ b/code/modules/research/tg/experisci/experiment/types/physical_experiment.dm @@ -1,7 +1,7 @@ /datum/experiment/physical name = "Physical Experiment" description = "An experiment requiring a physical reaction to continue" - exp_tag = "Physical Experiment" + exp_tag = EXPERIMENT_TAG_PHYSICAL performance_hint = "To perform physical experiments you must use a hand-held scanner unit to track objects in our world relevant to \ your experiment. Activate the experiment on your scanner, scan the object to track, and then complete the objective." /// The atom that is currently being watched by this experiment diff --git a/code/modules/research/tg/experisci/experiment/types/scanning.dm b/code/modules/research/tg/experisci/experiment/types/scanning.dm index b7cbd5309c..7411413e06 100644 --- a/code/modules/research/tg/experisci/experiment/types/scanning.dm +++ b/code/modules/research/tg/experisci/experiment/types/scanning.dm @@ -9,8 +9,8 @@ /datum/experiment/scanning name = "Scanning Experiment" description = "Base experiment for scanning atoms" - exp_tag = "Scan" - allowed_experimentors = list(/obj/item/experi_scanner, /obj/machinery/rnd/destructive_analyzer) + exp_tag = EXPERIMENT_TAG_SCAN + allowed_experimentors = list(/obj/item/experi_scanner) performance_hint = "Perform scanning experiments using a handheld experi-scanner." /// The typepaths and number of atoms that must be scanned var/list/required_atoms = list() diff --git a/code/modules/research/tg/experisci/experiment/types/scanning_machinery.dm b/code/modules/research/tg/experisci/experiment/types/scanning_machinery.dm index 2fecadba07..99b339a61b 100644 --- a/code/modules/research/tg/experisci/experiment/types/scanning_machinery.dm +++ b/code/modules/research/tg/experisci/experiment/types/scanning_machinery.dm @@ -4,7 +4,7 @@ /datum/experiment/scanning/points/machinery_tiered_scan name = "Upgraded Machinery Scanning Experiment" description = "Base experiment for scanning machinery with upgraded parts" - exp_tag = "Scan" + exp_tag = EXPERIMENT_TAG_SCAN ///What tier of parts is required for the experiment var/required_tier = 1 @@ -29,7 +29,7 @@ /datum/experiment/scanning/points/machinery_pinpoint_scan name = "Machinery Pinpoint Stock Parts Scanning Experiment" description = "Base experiment for scanning machinery with specific parts" - exp_tag = "Scan" + exp_tag = EXPERIMENT_TAG_SCAN ///Which stock part are we looking for in the machine. ///We use obj instead of datum here, as some stock parts aren't datumised, and in datumised ones ///we can just look for the physical_object_reference to match up the requirement. diff --git a/code/modules/research/tg/machinery/destructive_analyzer.dm b/code/modules/research/tg/machinery/destructive_analyzer.dm index ff0fef2156..c8d51f44f2 100644 --- a/code/modules/research/tg/machinery/destructive_analyzer.dm +++ b/code/modules/research/tg/machinery/destructive_analyzer.dm @@ -31,6 +31,7 @@ It is used to destroy hand-held objects and advance technological research. Used ) AddComponent(/datum/component/experiment_handler, \ + config_mode = EXPERIMENT_CONFIG_ALTCLICK, \ allowed_experiments = list(/datum/experiment/scanning),\ config_flags = EXPERIMENT_CONFIG_ALWAYS_ACTIVE|EXPERIMENT_CONFIG_SILENT_FAIL,\ experiment_signals = destructive_signals, \ @@ -246,13 +247,17 @@ It is used to destroy hand-held objects and advance technological research. Used busy = TRUE addtimer(CALLBACK(src, PROC_REF(reset_busy)), 2.4 SECONDS) use_power(active_power_usage) - //Failsafe. + // Destroy items inside + var/list/destructing = list() + destructing += current_item for(var/atom/movable/AM in current_item.contents) AM.forceMove(get_turf(src)) - playsound(src, 'sound/machines/destructive_analyzer.ogg', 50, 1) - SEND_SIGNAL(src, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, current_item) - destroy_item_individual(current_item, gain_research_points) + destructing += AM + for(var/atom/thing_destroying in destructing) // For all contents and itself + destroy_item_individual(thing_destroying, gain_research_points) loaded_item = null + // feedback + playsound(src, 'sound/machines/destructive_analyzer.ogg', 50, 1) update_icon() return TRUE @@ -277,12 +282,10 @@ It is used to destroy hand-held objects and advance technological research. Used visible_message(span_warning("A loud buzz sounds out from \the [src] as it rejects and spits out \the [thing]!")) thing.forceMove(turf_to_dump_to) return - var/list/point_value = techweb_item_point_check(thing) - //If it has a point value and we haven't deconstructed it OR we've deconstructed it but it's a repeatable. - if(point_value && (!stored_research.deconstructed_items[thing.type] || (stored_research.deconstructed_items[thing.type] && (thing.type in SSresearch.techweb_repeatable_items)))) - if(SSresearch.techweb_point_items[thing.type]) //Don't add things that have the deconstructable_research component - stored_research.deconstructed_items[thing.type] = TRUE - stored_research.add_point_list(point_value) + + //Perform experiment + techweb_item_generate_points(thing, stored_research) + SEND_SIGNAL(src, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, thing) //Finally, let's add it to the material silo, if applicable. var/datum/component/material_container/materials = get_silo_material_container_datum(FALSE) diff --git a/code/modules/research/tg/techwebs/__techweb_helpers.dm b/code/modules/research/tg/techwebs/__techweb_helpers.dm index d346b9c0c3..652d75aa71 100644 --- a/code/modules/research/tg/techwebs/__techweb_helpers.dm +++ b/code/modules/research/tg/techwebs/__techweb_helpers.dm @@ -27,6 +27,16 @@ return list(type_pointer["type"] = point_value) return FALSE +/proc/techweb_item_generate_points(obj/item/thing, datum/techweb/target_techweb) + if(!istype(thing)) + return + var/list/point_value = techweb_item_point_check(thing) + //If it has a point value and we haven't deconstructed it OR we've deconstructed it but it's a repeatable. + if(point_value && (!target_techweb.deconstructed_items[thing.type] || (target_techweb.deconstructed_items[thing.type] && (thing.type in SSresearch.techweb_repeatable_items)))) + if(SSresearch.techweb_point_items[thing.type]) //Don't add things that have the deconstructable_research component + target_techweb.deconstructed_items[thing.type] = TRUE + target_techweb.add_point_list(point_value) + /proc/techweb_point_display_generic(pointlist) var/list/ret = list() for(var/i in pointlist) diff --git a/code/modules/research/tg/techwebs/nodes/mech_nodes.dm b/code/modules/research/tg/techwebs/nodes/mech_nodes.dm index be1a263c94..de3c5171ba 100644 --- a/code/modules/research/tg/techwebs/nodes/mech_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/mech_nodes.dm @@ -337,4 +337,5 @@ "titan_armour", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + discount_experiments = list(/datum/experiment/physical/teleporting = TECHWEB_TIER_3_POINTS) announce_channels = list(CHANNEL_SCIENCE) diff --git a/code/modules/research/tg/techwebs/nodes/medbay_nodes.dm b/code/modules/research/tg/techwebs/nodes/medbay_nodes.dm index 39c3ded19d..6b0cb7a109 100644 --- a/code/modules/research/tg/techwebs/nodes/medbay_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/medbay_nodes.dm @@ -8,27 +8,29 @@ "scan_console", // "medicalbed", // "defibmountdefault", - // "defibrillator", + "defibrillator", // "surgical_drapes", - // "scalpel", - // "retractor", - // "hemostat", - // "cautery", - // "circular_saw", - // "surgicaldrill", - // "bonesetter", + "scalpel", + "retractor", + "hemostat", + "cautery", + "circular_saw", + "surgicaldrill", + "bonesetter", + "implanter", // "blood_filter", // "surgical_tape", - // "penlight", + "penlight", // "penlight_paramedic", // "stethoscope", - // "beaker", - // "large_beaker", + "vial", + "beaker", + "large_beaker", // "chem_pack", // "blood_pack", - // "syringe", - // "dropper", - // "pillbottle", + "syringe", + "dropper", + "pillbottle", // "xlarge_beaker", // "organ_jar", // "jerrycan", diff --git a/code/modules/research/tg/techwebs/nodes/research_nodes.dm b/code/modules/research/tg/techwebs/nodes/research_nodes.dm index 97271d12ef..f44bd7bc7b 100644 --- a/code/modules/research/tg/techwebs/nodes/research_nodes.dm +++ b/code/modules/research/tg/techwebs/nodes/research_nodes.dm @@ -73,7 +73,7 @@ // "gigabeacon", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - // discount_experiments = list(/datum/experiment/scanning/points/bluespace_crystal = TECHWEB_TIER_2_POINTS) + discount_experiments = list(/datum/experiment/scanning/bluespace_crystal = TECHWEB_TIER_2_POINTS) announce_channels = list(CHANNEL_SCIENCE, CHANNEL_MEDICAL, CHANNEL_SERVICE, CHANNEL_SUPPLY) /datum/techweb_node/bluespace_travel diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 85fb0c83bd..38060b25c8 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -303,6 +303,7 @@ source = dest dest = target + var/list/sent_atoms = list() flick("pad-beam", telepad) playsound(telepad, 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) for(var/atom/movable/ROI in source) @@ -338,7 +339,11 @@ else log_msg += ")" log_msg += ", " + sent_atoms += ROI do_teleport(ROI, dest) + // Either works for the experiment scan, so fire signals on both + SEND_SIGNAL(src, COMSIG_TELESCI_TELEPORT, sent_atoms, target, sending) + SEND_SIGNAL(telepad, COMSIG_TELESCI_TELEPORT, sent_atoms, target, sending) if (!dd_hassuffix(log_msg, ", ")) log_msg += "nothing" diff --git a/tgui/packages/tgui/interfaces/RobotSleeper/SubElements/SleeperStatusElements/SleeperButtons.tsx b/tgui/packages/tgui/interfaces/RobotSleeper/SubElements/SleeperStatusElements/SleeperButtons.tsx index 7418bf7455..3963e52941 100644 --- a/tgui/packages/tgui/interfaces/RobotSleeper/SubElements/SleeperStatusElements/SleeperButtons.tsx +++ b/tgui/packages/tgui/interfaces/RobotSleeper/SubElements/SleeperStatusElements/SleeperButtons.tsx @@ -5,10 +5,22 @@ import type { Data } from '../../types'; export const SleeperButtons = (props) => { const { act, data } = useBackend(); - const { eject_port, cleaning, medsensor, name } = data; + const { + eject_port, + cleaning, + medsensor, + name, + has_destructive_analyzer, + techweb_name, + } = data; return ( <> + {has_destructive_analyzer && ( + + Tech Web: {techweb_name} + + )} diff --git a/tgui/packages/tgui/interfaces/RobotSleeper/types.ts b/tgui/packages/tgui/interfaces/RobotSleeper/types.ts index 001c674978..737d212b70 100644 --- a/tgui/packages/tgui/interfaces/RobotSleeper/types.ts +++ b/tgui/packages/tgui/interfaces/RobotSleeper/types.ts @@ -22,6 +22,8 @@ export type Data = { deliveryslot_2: string[]; deliveryslot_3: string[]; items_preserved: string[]; + has_destructive_analyzer: BooleanLike; + techweb_name: string; }; export type RobotChem = { id: string; name: string }; diff --git a/vorestation.dme b/vorestation.dme index 87d82e192b..1f954d55c5 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4490,9 +4490,11 @@ #include "code\modules\research\tg\designs\mecha_designs.dm" #include "code\modules\research\tg\designs\mechfab_designs.dm" #include "code\modules\research\tg\designs\mechfab_equipment_designs.dm" +#include "code\modules\research\tg\designs\medical_designs.dm" #include "code\modules\research\tg\designs\misc_designs.dm" #include "code\modules\research\tg\designs\modsuit_designs.dm" #include "code\modules\research\tg\designs\modular_computer_designs.dm" +#include "code\modules\research\tg\designs\multi-department_designs.dm" #include "code\modules\research\tg\designs\prosfab_designs.dm" #include "code\modules\research\tg\designs\stock_part_designs.dm" #include "code\modules\research\tg\designs\tool_designs.dm" @@ -4508,10 +4510,12 @@ #include "code\modules\research\tg\designs\boards\telecomms.dm" #include "code\modules\research\tg\experisci\handheld_scanner.dm" #include "code\modules\research\tg\experisci\experiment\handlers\experiment_handler.dm" +#include "code\modules\research\tg\experisci\experiment\instances\destructive.dm" #include "code\modules\research\tg\experisci\experiment\instances\machines.dm" #include "code\modules\research\tg\experisci\experiment\instances\misc.dm" #include "code\modules\research\tg\experisci\experiment\instances\people.dm" #include "code\modules\research\tg\experisci\experiment\instances\physical.dm" +#include "code\modules\research\tg\experisci\experiment\instances\teleporting.dm" #include "code\modules\research\tg\experisci\experiment\types\experiment.dm" #include "code\modules\research\tg\experisci\experiment\types\physical_experiment.dm" #include "code\modules\research\tg\experisci\experiment\types\random_scanning.dm"