Replace slime extract experiments, required for biotech, with dissection surgery (#63033)

About The Pull Request

Adds back dissection surgery for the purposes of performing experiments. Replaces the existing slime extract fetch quests with dissection surgery for biotech, and adds xenomorph dissection as an extra discount (though I would like to see a node require it some day).
Why It's Good For The Game

Science has no incentive to actually scan slime extracts for biotech, as the primary consumer is medical.

In practice, this means that the grey slime extract experiment, which can be done round-start, is frequently left unperformed. This lets medical have some level of control over their research, while still leaving the actual act of researching the node into the hands of the science department, or heads of staff.
Changelog

cl
add: Added back dissection surgery, which can be used with an operating computer to perform experiments for research.
add: Biological technology's requirement has been changed from scanning one grey slime extract to performing a dissection surgery.
add: Advanced biotech's requirement has been changed from scanning three slime extracts to performing a dissection surgery on a nonhuman.
add: Xeno-organ biology and Alien Biological Tools' now have additional discounts for performing a dissection surgery on a xenomorph.
/cl
This commit is contained in:
Mothblocks
2021-11-26 11:32:54 +13:00
committed by GitHub
parent b25906f383
commit d9b874197b
11 changed files with 195 additions and 46 deletions
@@ -2,29 +2,6 @@
name = "Base Slime Experiment"
required_points = 1
/datum/experiment/scanning/points/slime/calibration
name = "Slime Sample Test"
description = "Let's see if our scanners can pick up the genetic data from a simple slime extract."
required_atoms = list(/obj/item/slime_extract/grey = 1)
/datum/experiment/scanning/points/slime/easy
name = "Easy Slime Survey"
description = "A wealthy client has requested that we provide samples of data from several basic slime cores."
required_points = 3
required_atoms = list(/obj/item/slime_extract/orange = 1,
/obj/item/slime_extract/purple = 1,
/obj/item/slime_extract/blue = 1,
/obj/item/slime_extract/metal = 1)
/datum/experiment/scanning/points/slime/moderate
name = "Moderate Slime Survey"
description = "Central Command has asked that you collect data from several common slime cores."
required_points = 5
required_atoms = list(/obj/item/slime_extract/yellow = 1,
/obj/item/slime_extract/darkpurple = 1,
/obj/item/slime_extract/darkblue = 1,
/obj/item/slime_extract/silver = 1)
/datum/experiment/scanning/points/slime/hard
name = "Challenging Slime Survey"
description = "Another station has challenged your research team to collect several challenging slime cores, \
@@ -56,6 +56,8 @@
RegisterSignal(parent, COMSIG_DOPPLER_ARRAY_EXPLOSION_DETECTED, .proc/try_run_doppler_experiment)
if(istype(parent, /obj/machinery/destructive_scanner))
RegisterSignal(parent, COMSIG_MACHINERY_DESTRUCTIVE_SCAN, .proc/try_run_destructive_experiment)
if(istype(parent, /obj/machinery/computer/operating))
RegisterSignal(parent, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, .proc/try_run_dissection_experiment)
// Determine UI display mode
switch(config_mode)
@@ -173,6 +175,16 @@
playsound(src, 'sound/machines/buzz-sigh.ogg', 25)
our_array.say("Insufficient explosion to contribute to current experiment.")
/// Hooks on a successful dissection experiment
/datum/component/experiment_handler/proc/try_run_dissection_experiment(obj/source, mob/living/target)
SIGNAL_HANDLER
if (action_experiment(source, target))
playsound(source, 'sound/machines/ping.ogg', 25)
else
playsound(source, 'sound/machines/buzz-sigh.ogg', 25)
source.say("The dissection did not result in anything, either prior dissections have not been complete, or this one has already been researched.")
/**
* Announces a message to all experiment handlers
*
@@ -0,0 +1,39 @@
/datum/experiment/dissection
name = "Dissection Experiment"
description = "An experiment requiring a dissection surgery to progress"
exp_tag = "Dissection"
performance_hint = "Perform a dissection surgery while connected to an operating computer."
/datum/experiment/dissection/is_complete()
return completed
/datum/experiment/dissection/perform_experiment_actions(datum/component/experiment_handler/experiment_handler, mob/target)
if (is_valid_dissection(target))
completed = TRUE
return TRUE
else
return FALSE
/datum/experiment/dissection/proc/is_valid_dissection(mob/target)
return TRUE
/datum/experiment/dissection/human
name = "Human Dissection Experiment"
description = "We don't want to invest in a station that doesn't know their coccyx from their cochlea. Send us back data dissecting a human to receive more funding."
/datum/experiment/dissection/human/is_valid_dissection(mob/target)
return ishumanbasic(target)
/datum/experiment/dissection/nonhuman
name = "Non-human Dissection Experiment"
description = "When we asked for a tail bone, we didn't mean...look, just send us back data from something OTHER than a human. It could be a monkey for all we care, just send us research."
/datum/experiment/dissection/nonhuman/is_valid_dissection(mob/target)
return ishuman(target) && !ishumanbasic(target)
/datum/experiment/dissection/xenomorph
name = "Xenomorph Dissection Experiment"
description = "Our understanding of the xenomorph only scratches the surface. Send us research from dissecting a xenomorph."
/datum/experiment/dissection/xenomorph/is_valid_dissection(mob/target)
return isalien(target)