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"