diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 8ab0778b87a..1a4bb1fb1b5 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -470,23 +470,50 @@
for(var/obj/item/integrated_circuit/input/S in assembly_components)
S.attackby_react(I,user,user.a_intent)
return ..()
- var/obj/item/stock_parts/cell = I
- user.transferItemToLoc(I, loc)
- cell.forceMove(src)
- battery = cell
+ I.forceMove(src)
+ battery = I
diag_hud_set_circuitstat() //update diagnostic hud
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- to_chat(user, "You slot \the [cell] inside \the [src]'s power supplier.")
+ to_chat(user, "You slot the [I] inside \the [src]'s power supplier.")
return TRUE
else if(istype(I, /obj/item/integrated_electronics/detailer))
var/obj/item/integrated_electronics/detailer/D = I
detail_color = D.detail_color
update_icon()
else
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user,user.a_intent)
if(user.a_intent != INTENT_HELP)
return ..()
+ var/list/input_selection = list()
+ //Check all the components asking for an input
+ for(var/obj/item/integrated_circuit/input in assembly_components)
+ if((input.demands_object_input && opened) || (input.demands_object_input && input.can_input_object_when_closed))
+ var/i = 0
+ //Check if there is another component with the same name and append a number for identification
+ for(var/s in input_selection)
+ var/obj/item/integrated_circuit/s_circuit = input_selection[s]
+ if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input)
+ i++
+ var/disp_name= "[input.displayed_name] \[[input]\]"
+ if(i)
+ disp_name += " ([i+1])"
+ //Associative lists prevent me from needing another list and using a Find proc
+ input_selection[disp_name] = input
+
+ var/obj/item/integrated_circuit/choice
+ if(input_selection)
+ if(input_selection.len == 1)
+ choice = input_selection[input_selection[1]]
+ else
+ var/selection = input(user, "Where do you want to insert that item?", "Interaction") as null|anything in input_selection
+ if(!check_interactivity(user))
+ return ..()
+ if(selection)
+ choice = input_selection[selection]
+ if(choice)
+ choice.additem(I, user)
+ for(var/obj/item/integrated_circuit/input/S in assembly_components)
+ S.attackby_react(I,user,user.a_intent)
+ return ..()
/obj/item/electronic_assembly/attack_self(mob/user)
@@ -496,30 +523,33 @@
interact(user)
var/list/input_selection = list()
- var/list/available_inputs = list()
+ //Check all the components asking for an input
for(var/obj/item/integrated_circuit/input/input in assembly_components)
if(input.can_be_asked_input)
- available_inputs.Add(input)
var/i = 0
- for(var/obj/item/integrated_circuit/s in available_inputs)
- if(s.name == input.name && s.displayed_name == input.displayed_name && s != input)
+ //Check if there is another component with the same name and append a number for identification
+ for(var/s in input_selection)
+ var/obj/item/integrated_circuit/s_circuit = input_selection[s]
+ if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input)
i++
var/disp_name= "[input.displayed_name] \[[input]\]"
if(i)
disp_name += " ([i+1])"
- input_selection.Add(disp_name)
+ //Associative lists prevent me from needing another list and using a Find proc
+ input_selection[disp_name] = input
var/obj/item/integrated_circuit/input/choice
- if(available_inputs)
- if(available_inputs.len ==1)
- choice = available_inputs[1]
+
+
+ if(input_selection)
+ if(input_selection.len ==1)
+ choice = input_selection[input_selection[1]]
else
var/selection = input(user, "What do you want to interact with?", "Interaction") as null|anything in input_selection
if(!check_interactivity(user))
return
if(selection)
- var/index = input_selection.Find(selection)
- choice = available_inputs[index]
+ choice = input_selection[selection]
if(choice)
choice.ask_for_input(user)
diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm
index 57ad917246f..60b2d0486ea 100644
--- a/code/modules/integrated_electronics/core/integrated_circuit.dm
+++ b/code/modules/integrated_electronics/core/integrated_circuit.dm
@@ -24,6 +24,9 @@
var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places.
var/removable = TRUE // Determines if a circuit is removable from the assembly.
var/displayed_name = ""
+ var/demands_object_input = FALSE
+ var/can_input_object_when_closed = FALSE
+
/*
Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows
@@ -35,6 +38,10 @@ a creative player the means to solve many problems. Circuits are held inside an
external_examine(user)
. = ..()
+// Can be called via electronic_assembly/attackby()
+/obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user)
+ attackby(I, user)
+
// This should be used when someone is examining while the case is opened.
/obj/item/integrated_circuit/proc/internal_examine(mob/user)
to_chat(user, "This board has [inputs.len] input pin\s, [outputs.len] output pin\s and [activators.len] activation pin\s.")
diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm
index a62b2bc8d01..1c76c7648c4 100644
--- a/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -34,6 +34,8 @@
var/lethal_projectile = null //lethal mode projectile type
var/lethal_projectile_sound
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
+
/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
@@ -185,6 +187,7 @@
action_flags = IC_ACTION_COMBAT
var/obj/item/grenade/attached_grenade
var/pre_attached_grenade_type
+ demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
/obj/item/integrated_circuit/manipulation/grenade/Initialize()
. = ..()