Adds the circuit implant (#95023)

## About The Pull Request

The circuit implant is, as the name suggests, an implant that can
contain an integrated circuit. It's similar in concept to the BCI, but
differs from it in the following ways:
- Has a capacity of 12 components, compared to the BCI's 25
- Can be inserted into basic mobs
- Does not set off Body Purists' disdain for cybernetics
- Cannot use the target interceptor, thought listener, or overlay
components
- Cannot force the user to speak/emote - the speech component simply
makes the implant itself speak like it does in other shells

The circuit implant can be printed from the component printer upon
researching advanced shells. Only one circuit implant can be inserted
into a mob at once.

As a little code standardization bonus, implant case interaction has
been refactored into an `item_interaction`.

## Why It's Good For The Game

Implants seem like an interesting way for circuits to be utilized. Not
only do they provide a body-purist-friendly way to have an internal
circuit, they also give most basic mobs a way to interact with the
circuit ecosystem. Additionally, them being implants implantable with an
implanter provides an easier method for a circuit to be forced upon
someone in a way that isn't as easy to remove as just dropping the item.
This commit is contained in:
Y0SH1M4S73R
2026-02-18 20:04:46 -05:00
committed by GitHub
parent 07cea5d11e
commit 17f597a2e8
11 changed files with 345 additions and 100 deletions
@@ -45,41 +45,16 @@
/obj/item/organ/cyberimp/bci/proc/action_comp_registered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
SIGNAL_HANDLER
LAZYADD(actions, new/datum/action/innate/bci_action(src, action_comp))
LAZYADD(actions, new/datum/action/innate/circuit_equipment_action(src, action_comp))
/obj/item/organ/cyberimp/bci/proc/action_comp_unregistered(datum/source, obj/item/circuit_component/equipment_action/action_comp)
SIGNAL_HANDLER
var/datum/action/innate/bci_action/action = action_comp.granted_to[REF(src)]
var/datum/action/innate/circuit_equipment_action/action = action_comp.granted_to[REF(src)]
if(!istype(action))
return
LAZYREMOVE(actions, action)
QDEL_LIST_ASSOC_VAL(action_comp.granted_to)
/datum/action/innate/bci_action
name = "Action"
button_icon = 'icons/mob/actions/actions_items.dmi'
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "bci_power"
var/obj/item/organ/cyberimp/bci/bci
var/obj/item/circuit_component/equipment_action/circuit_component
/datum/action/innate/bci_action/New(obj/item/organ/cyberimp/bci/_bci, obj/item/circuit_component/equipment_action/circuit_component)
..()
bci = _bci
circuit_component.granted_to[REF(_bci)] = src
src.circuit_component = circuit_component
/datum/action/innate/bci_action/Destroy()
circuit_component.granted_to -= REF(bci)
circuit_component = null
return ..()
/datum/action/innate/bci_action/Activate()
circuit_component.user.set_output(owner)
circuit_component.signal.set_output(COMPONENT_SIGNAL)
/obj/item/circuit_component/bci_core
display_name = "BCI Core"
desc = "Controls the core operations of the BCI."