diff --git a/code/__DEFINES/~skyrat_defines/augment.dm b/code/__DEFINES/~skyrat_defines/augment.dm
index b17a66a1cdb..4b335c1488e 100644
--- a/code/__DEFINES/~skyrat_defines/augment.dm
+++ b/code/__DEFINES/~skyrat_defines/augment.dm
@@ -11,6 +11,7 @@
#define AUGMENT_SLOT_R_LEG "Right Leg"
//Organs
#define AUGMENT_CATEGORY_ORGANS "Organs"
+#define AUGMENT_SLOT_BRAIN "Brain"
#define AUGMENT_SLOT_HEART "Heart"
#define AUGMENT_SLOT_LUNGS "Lungs"
#define AUGMENT_SLOT_LIVER "Liver"
diff --git a/code/modules/mob/living/brain/brain_cybernetic.dm b/code/modules/mob/living/brain/brain_cybernetic.dm
index d87b6d90283..bf04079c9ae 100644
--- a/code/modules/mob/living/brain/brain_cybernetic.dm
+++ b/code/modules/mob/living/brain/brain_cybernetic.dm
@@ -4,6 +4,9 @@
icon_state = "brain-c"
organ_flags = ORGAN_ROBOTIC | ORGAN_VITAL
failing_desc = "seems to be broken, and will not work without repairs."
+ var/emp_dmg_mult = 1 //BUBBER EDIT - Variable multiplier for damage from EMPs. Note the base damage is 20.
+ var/emp_dmg_max = 999 ///BUBBER EDIT - Threshold before the organ simply stops taking damage from EMPs. Defaults to kill
+
/obj/item/organ/internal/brain/cybernetic/brain_damage_examine()
if(suicided)
@@ -52,8 +55,15 @@
. = ..()
if(. & EMP_PROTECT_SELF)
return
- switch(severity) // Hard cap on brain damage from EMP
+//BUBBER EDIT BEGIN - can't be emp'd if dead
+ if(owner.stat == DEAD)
+ return
+//BUBBER EDIT END
+ switch(severity)
if (EMP_HEAVY)
- apply_organ_damage(20, BRAIN_DAMAGE_SEVERE)
+ to_chat(owner, span_boldwarning("You feel [pick("like your brain is being fried", "a sharp pain in your head")]!")) //BUBBER EDIT - added alert text for getting EMP'd.
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, (20*emp_dmg_mult), emp_dmg_max) //BUBBER EDIT - cap implemented
if (EMP_LIGHT)
- apply_organ_damage(10, BRAIN_DAMAGE_MILD)
+ to_chat(owner, span_warning("You feel [pick("disoriented", "confused", "dizzy")].")) //BUBBER EDIT - added alert text for getting EMP'd.
+ owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, (10*emp_dmg_mult), emp_dmg_max) //BUBBER EDIT - cap implemented
+
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm b/modular_skyrat/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm
index acb72b7dacf..2d76f9d49cf 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/middleware/limbs_and_markings.dm
@@ -25,12 +25,14 @@
)
var/list/organs_to_process = list(
+ "brain" = "Brain", //BUBBER EDIT
"heart" = "Heart",
"lungs" = "Lungs",
"liver" = "Liver",
"stomach" = "Stomach",
"eyes" = "Eyes",
"tongue" = "Tongue",
+ "Brain implant" = "Brain implant", //BUBBER EDIT
"Mouth implant" = "Mouth implant",
"Left Arm implant" = "Left Arm implant",
"Right Arm implant" = "Right Arm implant",
diff --git a/modular_skyrat/master_files/icons/obj/medical/organs/organs.dmi b/modular_skyrat/master_files/icons/obj/medical/organs/organs.dmi
new file mode 100644
index 00000000000..5f8006f1c2d
Binary files /dev/null and b/modular_skyrat/master_files/icons/obj/medical/organs/organs.dmi differ
diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm
index 2741df87bd7..43f6cd642e1 100644
--- a/modular_skyrat/modules/better_vox/code/vox_species.dm
+++ b/modular_skyrat/modules/better_vox/code/vox_species.dm
@@ -13,7 +13,7 @@
)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID
mutantlungs = /obj/item/organ/internal/lungs/nitrogen/vox
- mutantbrain = /obj/item/organ/internal/brain/vox
+ mutantbrain = /obj/item/organ/internal/brain/cybernetic/cortical/vox //BUBBER EDIT - new brain dropped
breathid = "n2"
mutant_bodyparts = list()
meat = /obj/item/food/meat/slab/chicken/human //item file in teshari module
diff --git a/modular_skyrat/modules/customization/modules/client/augment/organs.dm b/modular_skyrat/modules/customization/modules/client/augment/organs.dm
index 8cfcbb0c50d..ffc4e8b1263 100644
--- a/modular_skyrat/modules/customization/modules/client/augment/organs.dm
+++ b/modular_skyrat/modules/customization/modules/client/augment/organs.dm
@@ -6,9 +6,41 @@
return
var/obj/item/organ/organ_path = path // cast this to an organ so we can get the slot from it using initial()
- var/obj/item/organ/new_organ = new path()
- new_organ.copy_traits_from(human_holder.get_organ_slot(initial(organ_path.slot)))
- new_organ.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED)
+
+ if(slot == AUGMENT_SLOT_BRAIN)
+ var/obj/item/organ/internal/brain/old_brain = human_holder.get_organ_slot(ORGAN_SLOT_BRAIN)
+ var/obj/item/organ/internal/brain/new_brain = new organ_path()
+
+ var/datum/mind/holder_mind = human_holder.mind
+
+ new_brain.modular_persistence = old_brain.modular_persistence
+ old_brain.modular_persistence = null
+
+ new_brain.copy_traits_from(old_brain)
+ new_brain.Insert(human_holder, special = TRUE)
+ old_brain.moveToNullspace() //for some reason it doesn't want to be deleted. So I'm using this hack method until it can be figured out why. But, it works!
+ STOP_PROCESSING(SSobj, old_brain)
+
+ if(!holder_mind)
+ return
+
+ holder_mind.transfer_to(human_holder, TRUE)
+ else
+ var/obj/item/organ/new_organ = new path()
+
+ new_organ.copy_traits_from(human_holder.get_organ_slot(initial(organ_path.slot)))
+ new_organ.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED)
+
+//BUBBER EDIT - New brain
+//BRAINS
+/datum/augment_item/organ/brain
+ slot = AUGMENT_SLOT_BRAIN
+
+/datum/augment_item/organ/brain/cortical
+ name = "Cortically-Augmented Brain"
+ slot = AUGMENT_SLOT_BRAIN
+ path = /obj/item/organ/internal/brain/cybernetic/cortical
+//EDIT END
//HEARTS
/datum/augment_item/organ/heart
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
index 8109b6817fc..9a03dd00b72 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm
@@ -13,7 +13,7 @@
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutanttongue = /obj/item/organ/internal/tongue/vox
mutantlungs = /obj/item/organ/internal/lungs/nitrogen/vox
- mutantbrain = /obj/item/organ/internal/brain/vox
+ mutantbrain = /obj/item/organ/internal/brain/cybernetic/cortical/vox
breathid = "n2"
mutant_bodyparts = list()
payday_modifier = 1.0
diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/vox.dm b/modular_skyrat/modules/customization/modules/surgery/organs/vox.dm
index 5f52c76ccf7..9eb8825d239 100644
--- a/modular_skyrat/modules/customization/modules/surgery/organs/vox.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/organs/vox.dm
@@ -18,26 +18,3 @@
cold_level_3_threshold = 0
organ_flags = ORGAN_ROBOTIC
-/obj/item/organ/internal/brain/vox
- name = "vox brain"
- organ_flags = ORGAN_ROBOTIC
-
-/obj/item/organ/internal/brain/vox/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(owner.stat == DEAD)
- return
- switch(severity)
- if(1)
- to_chat(owner, span_boldwarning("You feel [pick("like your brain is being fried", "a sharp pain in your head")]!"))
- owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 150)
- owner.set_jitter_if_lower(30 SECONDS)
- owner.adjust_stutter(30 SECONDS)
- owner.adjust_confusion(10 SECONDS)
- if(2)
- to_chat(owner, span_warning("You feel [pick("disoriented", "confused", "dizzy")]."))
- owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 150)
- owner.set_jitter_if_lower(30 SECONDS)
- owner.adjust_stutter(30 SECONDS)
- owner.adjust_confusion(3 SECONDS)
diff --git a/modular_skyrat/modules/implants/code/augments_brain.dm b/modular_skyrat/modules/implants/code/augments_brain.dm
new file mode 100644
index 00000000000..fdf55101482
--- /dev/null
+++ b/modular_skyrat/modules/implants/code/augments_brain.dm
@@ -0,0 +1,98 @@
+#define LANGUAGE_IMPLANT "implant"
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor
+ name = "empathic sensor implant"
+ desc = "This won't fix your social issues, but it may help you repress them better." //not final
+ icon_state = "brain_implant_antidrop"
+ var/active = FALSE
+ var/list/stored_items = list()
+ slot = ORGAN_SLOT_BRAIN_CEREBELLUM
+ var/modifies_speech = TRUE
+
+// This should appropriately grant and remove empathy from the implant - important if you are a shadekin for some reason to not remove native languages, and allow the procs to work
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/emp_act(severity)
+ . = ..()
+ if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF)
+ return
+
+ organ_flags |= ORGAN_FAILING
+ UnregisterSignal(owner, COMSIG_MOB_SAY)
+ owner.remove_language(/datum/language/marish/empathy, source = LANGUAGE_IMPLANT)
+ addtimer(CALLBACK(src, PROC_REF(reboot)), 180 / severity)
+ to_chat(owner, span_warning("You feel overwhelmed!"))
+ switch(severity)
+ if (EMP_HEAVY)
+ owner.adjust_stutter(180 SECONDS)
+ owner.adjust_silence(30 SECONDS)
+ if (EMP_LIGHT)
+ owner.adjust_stutter(90 SECONDS)
+ owner.adjust_silence(10 SECONDS)
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/proc/implant_ready()
+ RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+ owner.grant_language(/datum/language/marish/empathy, source = LANGUAGE_IMPLANT)
+ to_chat(owner, span_abductor("Your mind opens to others. You can hear the thoughts of those around you, but only faintly."))
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/on_mob_remove(mob/living/carbon/implant_owner)
+ . = ..()
+ organ_flags &= ~ORGAN_FAILING
+ UnregisterSignal(implant_owner, COMSIG_MOB_SAY)
+ implant_owner.remove_language(/datum/language/marish/empathy, source = LANGUAGE_IMPLANT)
+ if(QDELETED(src))
+ return
+ to_chat(implant_owner, span_abductor("Your mind closes from others. It's quiet, now."))
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/on_mob_insert(mob/living/carbon/receiver)
+ . = ..()
+ to_chat(receiver, span_abductor("You begin to feel an awareness of those around you."))
+ addtimer(CALLBACK(src, PROC_REF(implant_ready)), 90)
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/proc/reboot()
+ organ_flags &= ~ORGAN_FAILING
+ implant_ready()
+
+//code mostly lifted from shadekins
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/proc/modify_speech(datum/source, list/speech_args)
+ ASYNC
+ if(organ_flags & ORGAN_FAILING) //just in case they somehow activate this while the implant is disabled...
+ to_chat(owner, span_abductor("You are unable to project your thoughts."))
+ return
+ actually_modify_speech(source, speech_args)
+ speech_args[SPEECH_MESSAGE] = "" // Makes it not send to chat verbally
+
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/proc/handle_speech(datum/source, list/speech_args)
+ if(speech_args[SPEECH_LANGUAGE] == /datum/language/marish/empathy)
+ return modify_speech(source, speech_args)
+
+//I couldnt get this to work as a TYPE_PROC_REF. So it's copied.
+/obj/item/organ/internal/cyberimp/brain/empathic_sensor/proc/actually_modify_speech(datum/source, list/speech_args)
+ var/message = speech_args[SPEECH_MESSAGE]
+ var/mob/living/carbon/human/user = source
+ var/obj/item/organ/internal/ears/shadekin/user_ears = user.get_organ_slot(ORGAN_SLOT_EARS)
+ var/mode = istype(user_ears)
+ user.balloon_alert_to_viewers("[mode ? "ears vibrate" : "shivers"]", "projecting thoughts...")
+
+ if(!do_after(source, 2 SECONDS, source))
+ message = full_capitalize(rot13(message))
+ var/rendered = span_abductor("[user.real_name]: [message]")
+
+ user.log_talk(message, LOG_SAY, tag="empathic-sensor")
+ for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list)
+ var/obj/item/organ/internal/ears/shadekin/target_ears = living_mob.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/internal/cyberimp/brain/empathic_sensor/target_implant = living_mob.get_organ_slot(ORGAN_SLOT_BRAIN_CEREBELLUM)
+
+ if(!istype(target_implant))
+ continue
+
+ to_chat(living_mob, rendered)
+ if(living_mob != user)
+ mode = istype(target_ears)
+ living_mob.balloon_alert_to_viewers("[mode ? "ears vibrate" : "shivers"]", "transmission heard...")
+
+ if(length(GLOB.dead_mob_list))
+ for(var/mob/dead_mob in GLOB.dead_mob_list)
+ if(dead_mob.client)
+ var/link = FOLLOW_LINK(dead_mob, user)
+ to_chat(dead_mob, "[link] [rendered]")
diff --git a/modular_skyrat/modules/organs/code/brain.dm b/modular_skyrat/modules/organs/code/brain.dm
new file mode 100644
index 00000000000..e2c9349176b
--- /dev/null
+++ b/modular_skyrat/modules/organs/code/brain.dm
@@ -0,0 +1,55 @@
+//Unifying vox brains and android brains, so that when one is updated the other is as well.
+
+//The accessible cybernetic brain
+/obj/item/organ/internal/brain/cybernetic/cortical
+ name = "cortically-augmented brain"
+ desc = "A brain which has been in some part mechanized."
+ icon = 'modular_skyrat/master_files/icons/obj/medical/organs/organs.dmi'
+ icon_state = "brain-c"
+ emp_dmg_mult = 1.5 //Note that the base damage is 20/10
+ emp_dmg_max = 150
+
+//Extra effects
+/obj/item/organ/internal/brain/cybernetic/cortical/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ if(owner.stat == DEAD)
+ return
+ switch(severity)
+ if(1)
+ owner.set_jitter_if_lower(30 SECONDS)
+ owner.adjust_stutter(30 SECONDS)
+ owner.adjust_confusion(10 SECONDS)
+ if(2)
+ owner.set_jitter_if_lower(15 SECONDS)
+ owner.adjust_stutter(15 SECONDS)
+ owner.adjust_confusion(3 SECONDS)
+
+
+// It's still organic
+/obj/item/organ/internal/brain/cybernetic/cortical/brain_damage_examine()
+ if(suicided)
+ return span_info("Its circuitry is smoking slightly. They must not have been able to handle the stress of it all.")
+ if(brainmob && (decoy_override || brainmob.client || brainmob.get_ghost()))
+ if(organ_flags & ORGAN_FAILING)
+ return span_info("It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some mannitol.")
+ else if(damage >= BRAIN_DAMAGE_DEATH*0.5)
+ return span_info("You can feel the small spark of life still left in this one, but it's got some bruises. You may be able to restore it with some mannitol.")
+ else
+ return span_info("You can feel the small spark of life still left in this one.")
+ else
+ return span_info("This one is completely devoid of life.")
+
+//New vox Brain
+/obj/item/organ/internal/brain/cybernetic/cortical/vox
+ name = "vox-augmented brain"
+ desc = "A brain which has been in some part mechanized. The components are seamlessly integrated into the flesh."
+ emp_dmg_mult = 1 //Nobody notices the brain damage anyways wink wink
+
+//surplus; TBI to prosthetic organ quirk
+/obj/item/organ/internal/brain/cybernetic/cortical/surplus
+ name = "surplus augmented brain"
+ desc = "A brain which has been in some part mechanized. It looks a bit cheap."
+ maxHealth = BRAIN_DAMAGE_DEATH*0.5 //200 -> 100, at time of creation
+ emp_dmg_max = 999
diff --git a/modular_zubbers/code/__DEFINES/techweb_nodes.dm b/modular_zubbers/code/__DEFINES/techweb_nodes.dm
index 6ca12e0c34e..72ad7363664 100644
--- a/modular_zubbers/code/__DEFINES/techweb_nodes.dm
+++ b/modular_zubbers/code/__DEFINES/techweb_nodes.dm
@@ -1 +1,2 @@
#define TECHWEB_NODE_INTERDYNE "interdyne_tech"
+#define TECHWEB_NODE_EMPATHY_IMPLANT "empathy_implant"
diff --git a/modular_zubbers/code/modules/experisci/experiment/experiments.dm b/modular_zubbers/code/modules/experisci/experiment/experiments.dm
new file mode 100644
index 00000000000..189e34facd7
--- /dev/null
+++ b/modular_zubbers/code/modules/experisci/experiment/experiments.dm
@@ -0,0 +1,26 @@
+//scan shadekin
+
+/datum/experiment/scanning/people/open_minds
+ name = "Human Field Research: Connected Minds"
+ description = "We need data on the effects of extra-sensory communication in organisms. Scan some samples of humanoid organisms which can think out loud."
+ performance_hint = "Such capabilities can be induced with genetic infusion, or finding the right person."
+ required_traits_desc = "extra-sensory communication"
+ required_count = 2
+
+/datum/experiment/scanning/people/open_minds/is_valid_scan_target(mob/living/carbon/human/check)
+ . = ..()
+ if (!.)
+ return
+
+ //check for genetics telepathy
+ if(check.dna.check_mutation(/datum/mutation/human/telepathy))
+ return TRUE
+
+ //check for shadekin organs
+ var/obj/item/organ/internal/ears/shadekin/ears = check.get_organ_slot(ORGAN_SLOT_EARS)
+ var/obj/item/organ/internal/tongue/shadekin/tongue = check.get_organ_slot(ORGAN_SLOT_TONGUE)
+
+ if(istype(ears) || istype(tongue))
+ return TRUE
+
+ return FALSE
diff --git a/modular_zubbers/code/modules/languages/empathy.dm b/modular_zubbers/code/modules/languages/empathy.dm
index 42d9b17144e..8199f05d0c5 100644
--- a/modular_zubbers/code/modules/languages/empathy.dm
+++ b/modular_zubbers/code/modules/languages/empathy.dm
@@ -46,8 +46,6 @@
if(speech_args[SPEECH_LANGUAGE] in languages_native) // Speaking a native language?
return modify_speech(source, speech_args)
-
-
/obj/item/organ/internal/tongue/shadekin/modify_speech(datum/source, list/speech_args)
ASYNC
actually_modify_speech(source, speech_args)
@@ -56,7 +54,9 @@
/obj/item/organ/internal/tongue/shadekin/proc/actually_modify_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
var/mob/living/carbon/human/user = source
- user.balloon_alert_to_viewers("ears vibrate", "projecting thoughts...")
+ var/obj/item/organ/internal/ears/shadekin/user_ears = user.get_organ_slot(ORGAN_SLOT_EARS)
+ var/mode = istype(user_ears)
+ user.balloon_alert_to_viewers("[mode ? "ears vibrate" : "shivers"]", "projecting thoughts...")
if(!do_after(source, 2 SECONDS, source))
message = full_capitalize(rot13(message))
@@ -64,12 +64,15 @@
user.log_talk(message, LOG_SAY, tag="shadekin")
for(var/mob/living/carbon/human/living_mob in GLOB.alive_mob_list)
- var/obj/item/organ/internal/ears/shadekin/ears = living_mob.get_organ_slot(ORGAN_SLOT_EARS)
- if(!istype(ears))
+ var/obj/item/organ/internal/ears/shadekin/target_ears = living_mob.get_organ_slot(ORGAN_SLOT_EARS)
+
+ if(!istype(target_ears))
continue
+
to_chat(living_mob, rendered)
if(living_mob != user)
- living_mob.balloon_alert_to_viewers("ears vibrate", "transmission heard...")
+ mode = istype(target_ears)
+ living_mob.balloon_alert_to_viewers("[mode ? "ears vibrate" : "shivers"]", "transmission heard...")
if(length(GLOB.dead_mob_list))
for(var/mob/dead_mob in GLOB.dead_mob_list)
diff --git a/modular_zubbers/code/modules/research/designs/medical_designs.dm b/modular_zubbers/code/modules/research/designs/medical_designs.dm
index 5cfe2504a92..4218b0f5ab4 100644
--- a/modular_zubbers/code/modules/research/designs/medical_designs.dm
+++ b/modular_zubbers/code/modules/research/designs/medical_designs.dm
@@ -9,3 +9,20 @@
RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_MEDICAL
)
departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+
+/datum/design/empathic_sensor
+ name = "Empathic sensor implant"
+ desc = "An implant which allows one to intuit the thoughts of some."
+ id = "ci_empathic_sensor"
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(
+ /datum/material/iron = SMALL_MATERIAL_AMOUNT * 6,
+ /datum/material/glass = SMALL_MATERIAL_AMOUNT * 6,
+ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT,
+ /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT,
+ /datum/material/bluespace = SHEET_MATERIAL_AMOUNT,)
+ build_path = /obj/item/organ/internal/cyberimp/brain/empathic_sensor
+ category = list(
+ RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE
diff --git a/modular_zubbers/code/modules/research/techweb/all_nodes.dm b/modular_zubbers/code/modules/research/techweb/all_nodes.dm
index 641e132c642..d3e510449df 100644
--- a/modular_zubbers/code/modules/research/techweb/all_nodes.dm
+++ b/modular_zubbers/code/modules/research/techweb/all_nodes.dm
@@ -1,5 +1,17 @@
// RESEARCH NODES
+/datum/techweb_node/cyber/empathy_implant
+ id = TECHWEB_NODE_EMPATHY_IMPLANT
+ display_name = "Empathic Sensor Implant"
+ description = "The result of assuredly-ethical experiments conducted on those with special minds."
+ prereq_ids = list(TECHWEB_NODE_CYBER_IMPLANTS)
+ design_ids = list(
+ "ci_empathic_sensor",
+ )
+ required_experiments = list(/datum/experiment/scanning/people/open_minds)
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS)
+ announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL)
+
/datum/techweb_node/botanygene
id = TECHWEB_NODE_BOTANY_ADV
display_name = "Experimental Botanical Engineering"
diff --git a/tgstation.dme b/tgstation.dme
index a6ce28c8565..22a4dc32d37 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7792,6 +7792,7 @@
#include "modular_skyrat\modules\icspawning\code\spell.dm"
#include "modular_skyrat\modules\icspawning\code\standard.dm"
#include "modular_skyrat\modules\implants\code\augments_arms.dm"
+#include "modular_skyrat\modules\implants\code\augments_brain.dm"
#include "modular_skyrat\modules\implants\code\augments_chest.dm"
#include "modular_skyrat\modules\implants\code\augments_eyes.dm"
#include "modular_skyrat\modules\implants\code\augments_internal.dm"
@@ -8312,6 +8313,7 @@
#include "modular_skyrat\modules\opposing_force\code\equipment\modsuit.dm"
#include "modular_skyrat\modules\opposing_force\code\equipment\spells.dm"
#include "modular_skyrat\modules\opposing_force\code\equipment\uplink.dm"
+#include "modular_skyrat\modules\organs\code\brain.dm"
#include "modular_skyrat\modules\organs\code\ears.dm"
#include "modular_skyrat\modules\organs\code\heart.dm"
#include "modular_skyrat\modules\organs\code\liver.dm"
@@ -9057,6 +9059,7 @@
#include "modular_zubbers\code\modules\events\scrubber_overflow.dm"
#include "modular_zubbers\code\modules\events\ghost_role\blob.dm"
#include "modular_zubbers\code\modules\experisci\handheld_scanner.dm"
+#include "modular_zubbers\code\modules\experisci\experiment\experiments.dm"
#include "modular_zubbers\code\modules\experisci\experiment\handlers\experiment_handler.dm"
#include "modular_zubbers\code\modules\experisci\experiment\types\scanning_fish.dm"
#include "modular_zubbers\code\modules\fishing\fishing_minigame.dm"