Experisci Expansion part 0.5 (#18631)

* telescience experiments

* use defines

* fixed up telesci stuff

* non-working bluespace crystal experiment

* allow sec to print basic cells

* allow anyone to make basic power cells

* fix

* medical basic tools

* bad paths

* pathfix

* fixed DA experiments, and clarified proc name

* circuitboards use copper

* changed it back

* lint

* moved signal

* slime deconstructing

* circuits don't give steel

* corrected defines

* correcting designs

* autolathe is not synced yet

* lets just mirror original behavior

* keep procs

* engies get signaler

* no dupe

* destructive borg belly

* unify point generate proc
This commit is contained in:
Will
2026-02-18 00:33:32 -05:00
committed by GitHub
parent 58190b6763
commit 11250fa9d3
29 changed files with 414 additions and 84 deletions
@@ -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
@@ -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)
@@ -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
)
@@ -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"
@@ -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
@@ -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
@@ -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"
@@ -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))
@@ -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
@@ -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."
@@ -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)
@@ -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
@@ -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
@@ -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()
@@ -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.
@@ -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)
@@ -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)
@@ -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)
@@ -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",
@@ -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
+5
View File
@@ -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"