diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 7d78e9b172..30020a7c9f 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -386,7 +386,7 @@
if(istype(I))
I.melee_attack_chain(usr, component)
else
- component.attack_hand(usr)
+ component.attack_self(usr)
// Adjust the position
if(href_list["change_pos"])
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index bdd9e954db..3b210e020b 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -268,14 +268,14 @@
"volume used" = IC_PINTYPE_NUMBER,
"self reference" = IC_PINTYPE_SELFREF
)
- activators = list("push ref" = IC_PINTYPE_PULSE_OUT)
+ activators = list("push ref" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
/obj/item/integrated_circuit/reagent/storage/Initialize(mapload)
. = ..()
reagents.reagents_holder_flags |= OPENCONTAINER
-/obj/item/integrated_circuit/reagent/storage/do_work()
+/obj/item/integrated_circuit/reagent/storage/do_work(ord)
set_pin_data(IC_OUTPUT, 2, WEAKREF(src))
push_data()
@@ -723,7 +723,7 @@
activators = list(
"on insert" = IC_PINTYPE_PULSE_OUT,
"on remove" = IC_PINTYPE_PULSE_OUT,
- "push ref" = IC_PINTYPE_PULSE_OUT
+ "push ref" = IC_PINTYPE_PULSE_IN
)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
@@ -733,6 +733,11 @@
var/obj/item/reagent_containers/glass/beaker/current_beaker
+/obj/item/integrated_circuit/input/beaker_connector/do_work(ord)
+ switch(ord)
+ if(3)
+ set_pin_data(IC_OUTPUT, 2, WEAKREF(current_beaker))
+ push_data()
/obj/item/integrated_circuit/input/beaker_connector/attackby(var/obj/item/reagent_containers/I, var/mob/living/user)
//Check if it truly is a reagent container
@@ -762,7 +767,6 @@
/obj/item/integrated_circuit/input/beaker_connector/ask_for_input(mob/user)
attack_self(user)
-
/obj/item/integrated_circuit/input/beaker_connector/attack_self(mob/user)
//Check if no beaker attached
if(!current_beaker)
diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm
index 979ccd6e8a..f7d44a1288 100644
--- a/code/modules/integrated_electronics/subtypes/smart.dm
+++ b/code/modules/integrated_electronics/subtypes/smart.dm
@@ -150,45 +150,48 @@
var/obj/item/mmi/installed_brain
-/obj/item/integrated_circuit/input/mmi_tank/attackby(var/obj/item/mmi/O, var/mob/user)
- if(!istype(O,/obj/item/mmi))
- to_chat(user,"You can't put that inside.")
+/obj/item/integrated_circuit/input/mmi_tank/attackby(obj/item/mmi/O, mob/user)
+ if(!istype(O, /obj/item/mmi))
+ to_chat(user, span_warning("You can't put that inside."))
return
if(installed_brain)
- to_chat(user,"There's already a brain inside.")
+ to_chat(user, span_warning("There's already a brain inside."))
return
- user.transferItemToLoc(O,src)
+ user.transferItemToLoc(O, src)
installed_brain = O
can_be_asked_input = FALSE
- to_chat(user, "You gently place \the man-machine interface inside the tank.")
- to_chat(O, "You are slowly being placed inside the man-machine-interface tank.")
- O.brainmob.remote_control=src
+ to_chat(user, span_notice("You gently place \the man-machine interface inside the tank."))
+ to_chat(O, span_notice("You are slowly being placed inside the man-machine-interface tank."))
+ O.brainmob.remote_control = src
set_pin_data(IC_OUTPUT, 1, O)
+ push_data()
-/obj/item/integrated_circuit/input/mmi_tank/attack_self(var/mob/user)
+/obj/item/integrated_circuit/input/mmi_tank/attack_self(mob/user)
if(installed_brain)
RemoveBrain()
- to_chat(user, "You slowly lift [installed_brain] out of the MMI tank.")
+ to_chat(user, span_notice("You slowly lift [installed_brain] out of the MMI tank."))
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- installed_brain = null
- push_data()
else
- to_chat(user, "You don't see any brain swimming in the tank.")
+ to_chat(user, span_notice("You don't see any brain swimming in the tank."))
/obj/item/integrated_circuit/input/mmi_tank/Destroy()
RemoveBrain()
- ..()
+ return ..()
-/obj/item/integrated_circuit/input/mmi_tank/relaymove(var/n,var/dir)
+/obj/item/integrated_circuit/input/mmi_tank/relaymove(n, dir)
set_pin_data(IC_OUTPUT, 2, dir)
do_work(1)
switch(dir)
- if(8) activate_pin(2)
- if(4) activate_pin(3)
- if(1) activate_pin(4)
- if(2) activate_pin(5)
+ if(WEST)
+ activate_pin(2)
+ if(EAST)
+ activate_pin(3)
+ if(NORTH)
+ activate_pin(4)
+ if(SOUTH)
+ activate_pin(5)
-/obj/item/integrated_circuit/input/mmi_tank/do_work(var/n)
+/obj/item/integrated_circuit/input/mmi_tank/do_work(n)
push_data()
activate_pin(n)
@@ -197,9 +200,10 @@
can_be_asked_input = TRUE
installed_brain.forceMove(drop_location())
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
+ push_data()
if(installed_brain.brainmob)
installed_brain.brainmob.remote_control = null
-
+ installed_brain = null
//Brain changes
/mob/living/brain/var/check_bot_self = FALSE
@@ -279,56 +283,60 @@
var/obj/item/paicard/installed_pai
-/obj/item/integrated_circuit/input/pAI_connector/attackby(var/obj/item/paicard/O, var/mob/user)
- if(!istype(O,/obj/item/paicard))
- to_chat(user,"You can't put that inside.")
+/obj/item/integrated_circuit/input/pAI_connector/attackby(obj/item/paicard/O, mob/user)
+ if(!istype(O, /obj/item/paicard))
+ to_chat(user, span_warning("You can't put that inside."))
return
if(installed_pai)
- to_chat(user,"There's already a pAI connected to this.")
+ to_chat(user, span_warning("There's already a pAI connected to this."))
return
- user.transferItemToLoc(O,src)
+ user.transferItemToLoc(O, src)
installed_pai = O
can_be_asked_input = FALSE
- to_chat(user, "You slowly connect the circuit's pins to the [installed_pai].")
- to_chat(O, "You are slowly being connected to the pAI connector.")
- O.pai.remote_control=src
+ to_chat(user, span_notice("You slowly connect the circuit's pins to the [installed_pai]."))
+ to_chat(O, span_notice("You are slowly being connected to the pAI connector."))
+ O.pai.remote_control = src
set_pin_data(IC_OUTPUT, 1, O)
+ push_data()
-/obj/item/integrated_circuit/input/pAI_connector/attack_self(var/mob/user)
+/obj/item/integrated_circuit/input/pAI_connector/attack_self(mob/user)
if(installed_pai)
RemovepAI()
- to_chat(user, "You slowly disconnect the circuit's pins from the [installed_pai].")
+ to_chat(user, span_notice("You slowly disconnect the circuit's pins from the [installed_pai]."))
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- installed_pai = null
- push_data()
else
- to_chat(user, "The connection port is empty.")
-
-/obj/item/integrated_circuit/input/pAI_connector/relaymove(var/n,var/dir)
- set_pin_data(IC_OUTPUT, 2, dir)
- do_work(1)
- switch(dir)
- if(8) activate_pin(2)
- if(4) activate_pin(3)
- if(1) activate_pin(4)
- if(2) activate_pin(5)
-
-/obj/item/integrated_circuit/input/pAI_connector/do_work(var/n)
- push_data()
- activate_pin(n)
-
+ to_chat(user, span_notice("The connection port is empty."))
/obj/item/integrated_circuit/input/pAI_connector/Destroy()
RemovepAI()
- ..()
+ return ..()
+
+/obj/item/integrated_circuit/input/pAI_connector/relaymove(n, dir)
+ set_pin_data(IC_OUTPUT, 2, dir)
+ do_work(1)
+ switch(dir)
+ if(WEST)
+ activate_pin(2)
+ if(EAST)
+ activate_pin(3)
+ if(NORTH)
+ activate_pin(4)
+ if(SOUTH)
+ activate_pin(5)
+
+/obj/item/integrated_circuit/input/pAI_connector/do_work(n)
+ push_data()
+ activate_pin(n)
/obj/item/integrated_circuit/input/pAI_connector/proc/RemovepAI()
if(installed_pai)
can_be_asked_input = TRUE
installed_pai.forceMove(drop_location())
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
- installed_pai.pai.remote_control = null
-
+ push_data()
+ if(installed_pai.pai)
+ installed_pai.pai.remote_control = null
+ installed_pai = null
//pAI changes
/mob/living/silicon/pai/var/check_bot_self = FALSE
diff --git a/modular_sand/code/modules/integrated_electronics/subtypes/input.dm b/modular_sand/code/modules/integrated_electronics/subtypes/input.dm
index 118882922c..4a2566ac2f 100644
--- a/modular_sand/code/modules/integrated_electronics/subtypes/input.dm
+++ b/modular_sand/code/modules/integrated_electronics/subtypes/input.dm
@@ -86,3 +86,99 @@
set_pin_data(IC_INPUT, 1, 0)
set_pin_data(IC_INPUT, 2, 0)
..()
+
+/obj/item/integrated_circuit/input/quick_button
+ name = "quick button"
+ desc = "A button that can be used to quickly activate a pin."
+ extended_desc = "This circuit adds a button to the assembly that can be easily accessed while the machine is being held. \
+
\"grant access to\" can be used to grant access to this button to internal pAIs or MMIs."
+ can_be_asked_input = FALSE // Does not summon an input box.
+ spawn_flags = IC_SPAWN_RESEARCH
+ inputs = list(
+ "grant access to" = IC_PINTYPE_REF,
+ "button name" = IC_PINTYPE_STRING,
+ "button style" = IC_PINTYPE_STRING
+ )
+ activators = list("on pressed" = IC_PINTYPE_PULSE_IN)
+ var/static/list/button_styles = list("blank","one","two","three","four","five","plus","minus","exclamation","question","cross","info","heart","skull","brain","brain_damage","injection","blood","shield","reaction","network","power","radioactive","electricity","magnetism","scan","repair","id","wireless","say","sleep","bomb")
+ var/datum/action/circuit_action/circuit
+
+/obj/item/integrated_circuit/input/quick_button/Initialize(mapload)
+ . = ..()
+ extended_desc += "
Possible button styles: "
+ extended_desc += english_list(button_styles)
+ circuit = new(src)
+ update_button_style()
+ RegisterSignal(circuit, COMSIG_ACTION_TRIGGER, .proc/on_action_trigger)
+
+/obj/item/integrated_circuit/input/quick_button/Destroy()
+ UnregisterSignal(circuit, COMSIG_ACTION_TRIGGER)
+ QDEL_NULL(circuit)
+ . = ..()
+
+/obj/item/integrated_circuit/input/quick_button/Moved(atom/OldLoc, Dir)
+ . = ..()
+ if(istype(loc, /obj/item/electronic_assembly))
+ update_button_owner()
+ else if(circuit.owner)
+ circuit.Remove(circuit.owner)
+
+/obj/item/integrated_circuit/input/quick_button/on_data_written()
+ update_button_style()
+ update_button_owner()
+
+/obj/item/integrated_circuit/input/quick_button/ext_moved(oldLoc, dir)
+ update_button_owner()
+
+/obj/item/integrated_circuit/input/quick_button/proc/update_button_style()
+ var/button_name = get_pin_data(IC_INPUT, 2)
+ var/button_style = get_pin_data(IC_INPUT, 3)
+ circuit.name = button_name ? button_name : "Quick button"
+ circuit.button_icon_state = (button_style in button_styles) ? "nanite_[button_style]" : "nanite_power"
+ circuit.UpdateButtons()
+
+/obj/item/integrated_circuit/input/quick_button/proc/update_button_owner()
+ var/obj/item/user_container = get_pin_data(IC_INPUT, 1)
+ var/mob/user
+ if(istype(user_container, /obj/item/mmi))
+ var/obj/item/mmi/mmi = user_container
+ if(!istype(loc, /obj/item/integrated_circuit/input/mmi_tank)) // Must be inside an MMI tank.
+ return
+
+ var/obj/item/integrated_circuit/input/mmi_tank/mmi_tank = mmi.loc
+ if(!(mmi_tank.assembly != assembly)) // The MMI must be in the same assembly as the button.
+ return
+
+ if(!mmi.brainmob) // How did we get here?
+ return
+
+ user = mmi.brainmob
+ else if (istype(user_container, /obj/item/paicard))
+ var/obj/item/paicard/paicard = user_container
+ if(!istype(loc, /obj/item/integrated_circuit/input/pAI_connector)) // Must be a pAI connector.
+ return
+
+ var/obj/item/integrated_circuit/input/pAI_connector/pai_connector = paicard.loc
+ if(!(pai_connector.assembly != assembly)) // The pAI connector must be in the same assembly as the button.
+ return
+
+ if(!paicard.pai) // Please, don't do this, have a mob.
+ return
+ user = paicard.pai
+ else if(ismob(assembly.loc)) // Last priority, the location, which means you SHOULD be holding it to gain the button.
+ user = assembly.loc
+ else if(circuit.owner) // If you're none of these, we take the button back and give it to nobody.
+ circuit.Remove(circuit.owner)
+ return
+ circuit.Grant(user)
+
+/obj/item/integrated_circuit/input/quick_button/proc/on_action_trigger(datum/action/circuit_action, obj/item/source)
+ var/button_name = get_pin_data(IC_INPUT, 2)
+ to_chat(circuit.owner, span_notice("You press the button labeled '[button_name ? button_name : "Quick button"]'."))
+ assembly.balloon_alert(circuit.owner, "activated!")
+ activate_pin(1)
+
+/datum/action/circuit_action
+ name = "Quick button"
+ icon_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "nanite_power"