diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm
index 343890af56..b9f5c912d4 100644
--- a/code/modules/integrated_electronics/subtypes/converters.dm
+++ b/code/modules/integrated_electronics/subtypes/converters.dm
@@ -67,6 +67,40 @@
push_data()
activate_pin(2)
+/obj/item/integrated_circuit/converter/refcode
+ name = "reference encoder"
+ desc = "This circuit can encode a reference into a string, which can then be read by an EPV2 circuit."
+ icon_state = "ref-string"
+ inputs = list("input" = IC_PINTYPE_REF)
+ outputs = list("output" = IC_PINTYPE_STRING)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/converter/refcode/do_work()
+ var/result = null
+ pull_data()
+ var/atom/A = get_pin_data(IC_INPUT, 1)
+ if(A && istype(A))
+ result = "\ref[A]"
+
+ set_pin_data(IC_OUTPUT, 1, result)
+ push_data()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/converter/refdecode
+ name = "reference decoder"
+ desc = "This circuit can convert an encoded reference to actual reference."
+ icon_state = "ref-string"
+ inputs = list("input" = IC_PINTYPE_STRING)
+ outputs = list("output" = IC_PINTYPE_REF)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+
+/obj/item/integrated_circuit/converter/refdecode/do_work()
+ pull_data()
+ set_pin_data(IC_OUTPUT, 1, weakref(locate(get_pin_data(IC_INPUT, 1))))
+ push_data()
+ activate_pin(2)
+
/obj/item/integrated_circuit/converter/lowercase
name = "lowercase string converter"
desc = "this will cause a string to come out in all lowercase."
@@ -168,6 +202,56 @@
activate_pin(2)
+/obj/item/integrated_circuit/converter/findstring
+ name = "find text"
+ desc = "This gives position of sample in the string. Or returns 0."
+ extended_desc = "The first pin is the string to be examined. The second pin is the sample to be found. \
+ For example, 'eat this burger',' ' will give you position 4. This circuit isn't case sensitive."
+ complexity = 4
+ inputs = list(
+ "string" = IC_PINTYPE_STRING,
+ "sample" = IC_PINTYPE_STRING,
+ )
+ outputs = list(
+ "position" = IC_PINTYPE_NUMBER
+ )
+ activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+
+
+/obj/item/integrated_circuit/converter/findstring/do_work()
+
+ set_pin_data(IC_OUTPUT, 1, findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) )
+ push_data()
+
+ activate_pin(2)
+
+/obj/item/integrated_circuit/converter/exploders
+ name = "string exploder"
+ desc = "This splits a single string into a list of strings."
+ extended_desc = "This circuit splits a given string into a list of strings based on the string and given delimiter. \
+ For example, 'eat this burger',' ' will be converted to list('eat','this','burger')."
+ complexity = 4
+ inputs = list(
+ "string to split" = IC_PINTYPE_STRING,
+ "delimiter" = IC_PINTYPE_STRING,
+ )
+ outputs = list(
+ "list" = IC_PINTYPE_LIST
+ )
+ activators = list("separate" = IC_PINTYPE_PULSE_IN, "on separated" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+
+
+/obj/item/integrated_circuit/converter/exploders/do_work()
+ var/strin = get_pin_data(IC_INPUT, 1)
+ var/sample = get_pin_data(IC_INPUT, 2)
+ set_pin_data(IC_OUTPUT, 1, splittext( strin ,sample ))
+ push_data()
+
+ activate_pin(2)
/obj/item/integrated_circuit/converter/radians2degrees
name = "radians to degrees converter"
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 95ed94b813..d752f0d5cd 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -17,6 +17,8 @@
activators = list("on pressed" = IC_PINTYPE_PULSE_IN)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+
/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use.
to_chat(user, "You press the button labeled '[src.name]'.")
activate_pin(1)
@@ -105,9 +107,11 @@
push_data()
activate_pin(2)
+
+
/obj/item/integrated_circuit/input/adv_med_scanner
name = "integrated advanced medical analyser"
- desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is. \
+ desc = "A very small version of the medbot's medical analyser. This allows the machine to know how healthy someone is. \
This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
icon_state = "medscan_adv"
complexity = 12
@@ -130,7 +134,7 @@
var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living/carbon/human)
if(!istype(H)) //Invalid input
return
- if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
+ if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range..
var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100
var/missing_health = H.getMaxHealth() - H.health
@@ -145,6 +149,53 @@
push_data()
activate_pin(2)
+/obj/item/integrated_circuit/input/examiner
+ name = "examiner"
+ desc = "It's a little machine vision system. It can return the name, description, distance,\
+ relative coordinates, total amount of reagents, and maximum amount of reagents of the referenced object."
+ icon_state = "video_camera"
+ complexity = 6
+ inputs = list("\[ target" = IC_PINTYPE_REF)
+ outputs = list(
+ "name" = IC_PINTYPE_STRING,
+ "description" = IC_PINTYPE_STRING,
+ "X" = IC_PINTYPE_NUMBER,
+ "Y" = IC_PINTYPE_NUMBER,
+ "distance" = IC_PINTYPE_NUMBER,
+ "max reagents" = IC_PINTYPE_NUMBER,
+ "amount of reagents" = IC_PINTYPE_NUMBER,
+ )
+ activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT, "not scanned" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 4)
+ power_draw_per_use = 80
+
+/obj/item/integrated_circuit/input/examiner/do_work()
+ var/atom/movable/H = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/turf/T = get_turf(src)
+ if(!istype(H)) //Invalid input
+ return
+
+ if(H in view(T)) // This is a camera. It can't examine thngs,that it can't see.
+
+
+ set_pin_data(IC_OUTPUT, 1, H.name)
+ set_pin_data(IC_OUTPUT, 2, H.desc)
+ set_pin_data(IC_OUTPUT, 3, H.x-T.x)
+ set_pin_data(IC_OUTPUT, 4, H.y-T.y)
+ set_pin_data(IC_OUTPUT, 5, sqrt((H.x-T.x)*(H.x-T.x)+ (H.y-T.y)*(H.y-T.y)))
+ var/mr = 0
+ var/tr = 0
+ if(H.reagents)
+ mr = H.reagents.maximum_volume
+ tr = H.reagents.total_volume
+ set_pin_data(IC_OUTPUT, 6, mr)
+ set_pin_data(IC_OUTPUT, 7, tr)
+ push_data()
+ activate_pin(2)
+ else
+ activate_pin(3)
+
/obj/item/integrated_circuit/input/local_locator
name = "local locator"
desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \
@@ -173,7 +224,8 @@
random."
inputs = list("desired type ref")
outputs = list("located ref")
- activators = list("locate" = IC_PINTYPE_PULSE_IN)
+ activators = list("locate" = IC_PINTYPE_PULSE_IN,"found" = IC_PINTYPE_PULSE_OUT,
+ "not found" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 30
@@ -197,8 +249,64 @@
valid_things.Add(thing)
if(valid_things.len)
O.data = weakref(pick(valid_things))
+ activate_pin(2)
+ else
+ activate_pin(3)
O.push_data()
+/obj/item/integrated_circuit/input/advanced_locator
+ complexity = 6
+ name = "advanced locator"
+ desc = "This is needed for certain devices that demand a reference for a target to act upon. This type locates something \
+ that is standing in given radius of up to 8 meters"
+ extended_desc = "The first pin requires a ref to a kind of object that you want the locator to acquire. This means that it will \
+ give refs to nearby objects that are similar to given sample. If this pin is a string, the locator will search for\
+ item by matching desired text in name + description. If more than one valid object is found nearby, it will choose one of them at \
+ random. The second pin is a radius."
+ inputs = list("desired type" = IC_PINTYPE_ANY, "radius" = IC_PINTYPE_NUMBER)
+ outputs = list("located ref")
+ activators = list("locate" = IC_PINTYPE_PULSE_IN,"found" = IC_PINTYPE_PULSE_OUT,"not found" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ power_draw_per_use = 30
+ var/radius = 1
+
+/obj/item/integrated_circuit/input/advanced_locator/on_data_written()
+ var/rad = get_pin_data(IC_INPUT, 2)
+ if(isnum(rad))
+ rad = Clamp(rad, 0, 8)
+ radius = rad
+
+/obj/item/integrated_circuit/input/advanced_locator/do_work()
+ var/datum/integrated_io/I = inputs[1]
+ var/datum/integrated_io/O = outputs[1]
+ O.data = null
+ var/turf/T = get_turf(src)
+ var/list/nearby_things = range(radius, T) & view(T)
+ var/list/valid_things = list()
+ if(isweakref(I.data))
+ var/atom/A = I.data.resolve()
+ var/desired_type = A.type
+ if(desired_type)
+ for(var/atom/thing in nearby_things)
+ if(thing.type == desired_type)
+ valid_things.Add(thing)
+ else if(istext(I.data))
+ var/DT = I.data
+ for(var/atom/thing in nearby_things)
+ if(findtext(addtext(thing.name," ",thing.desc), DT, 1, 0) )
+ valid_things.Add(thing)
+ if(valid_things.len)
+ O.data = weakref(pick(valid_things))
+ O.push_data()
+ activate_pin(2)
+ else
+ O.push_data()
+ activate_pin(3)
+
+
+
+
+
/obj/item/integrated_circuit/input/signaler
name = "integrated signaler"
desc = "Signals from a signaler can be received with this, allowing for remote control. Additionally, it can send signals as well."
@@ -431,3 +539,83 @@
activate_pin(1)
return TRUE
+/obj/item/integrated_circuit/input/internalbm
+ name = "internal battery monitor"
+ desc = "This monitors the charge level of an internal battery."
+ icon_state = "internalbm"
+ extended_desc = "This circuit will give you values of charge, max charge and percentage of the internal battery on demand."
+ w_class = ITEMSIZE_TINY
+ complexity = 1
+ inputs = list()
+ outputs = list(
+ "cell charge" = IC_PINTYPE_NUMBER,
+ "max charge" = IC_PINTYPE_NUMBER,
+ "percentage" = IC_PINTYPE_NUMBER,
+ "refference to assembly" = IC_PINTYPE_REF
+ )
+ activators = list("read" = IC_PINTYPE_PULSE_IN, "on read" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 4, TECH_MAGNET = 3)
+ power_draw_per_use = 1
+
+/obj/item/integrated_circuit/input/internalbm/do_work()
+ set_pin_data(IC_OUTPUT, 1, null)
+ set_pin_data(IC_OUTPUT, 2, null)
+ set_pin_data(IC_OUTPUT, 3, null)
+ set_pin_data(IC_OUTPUT, 4, weakref(assembly))
+ if(assembly)
+ if(assembly.battery)
+
+ set_pin_data(IC_OUTPUT, 1, assembly.battery.charge)
+ set_pin_data(IC_OUTPUT, 2, assembly.battery.maxcharge)
+ set_pin_data(IC_OUTPUT, 3, 100*assembly.battery.charge/assembly.battery.maxcharge)
+ push_data()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/input/externalbm
+ name = "external battery monitor"
+ desc = "This can help watch the battery level of any device in range."
+ icon_state = "externalbm"
+ extended_desc = "This circuit will give you values of charge, max charge and percentage of any device or battery in view"
+ w_class = ITEMSIZE_TINY
+ complexity = 2
+ inputs = list("target" = IC_PINTYPE_REF)
+ outputs = list(
+ "cell charge" = IC_PINTYPE_NUMBER,
+ "max charge" = IC_PINTYPE_NUMBER,
+ "percentage" = IC_PINTYPE_NUMBER
+ )
+ activators = list("read" = IC_PINTYPE_PULSE_IN, "on read" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 4, TECH_MAGNET = 3)
+ power_draw_per_use = 1
+
+/obj/item/integrated_circuit/input/externalbm/do_work()
+
+ var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ set_pin_data(IC_OUTPUT, 1, null)
+ set_pin_data(IC_OUTPUT, 2, null)
+ set_pin_data(IC_OUTPUT, 3, null)
+ if(AM)
+
+
+ var/obj/item/weapon/cell/cell = null
+ if(istype(AM, /obj/item/weapon/cell)) // Is this already a cell?
+ cell = AM
+ else // If not, maybe there's a cell inside it?
+ for(var/obj/item/weapon/cell/C in AM.contents)
+ if(C) // Find one cell to charge.
+ cell = C
+ break
+ if(cell)
+
+ var/turf/A = get_turf(src)
+ if(AM in view(A))
+ push_data()
+ set_pin_data(IC_OUTPUT, 1, cell.charge)
+ set_pin_data(IC_OUTPUT, 2, cell.maxcharge)
+ set_pin_data(IC_OUTPUT, 3, cell.percent())
+ push_data()
+ activate_pin(2)
+
+
diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm
index 4bbffede35..82667634a1 100644
--- a/code/modules/integrated_electronics/subtypes/logic.dm
+++ b/code/modules/integrated_electronics/subtypes/logic.dm
@@ -55,6 +55,98 @@
/obj/item/integrated_circuit/logic/binary/equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B)
return A.data == B.data
+/obj/item/integrated_circuit/logic/binary/jklatch
+ name = "JK latch"
+ desc = "This gate is a synchronysed JK latch."
+ icon_state = "jklatch"
+ inputs = list("J","K")
+ outputs = list("Q","!Q")
+ activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/lstate=FALSE
+
+/obj/item/integrated_circuit/logic/binary/jklatch/do_work()
+ pull_data()
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/Q = outputs[2]
+ if(A.data)
+ if(B.data)
+ lstate=!lstate
+ else
+ lstate = TRUE
+ else
+ if(B.data)
+ lstate=FALSE
+ O.data = lstate ? TRUE : FALSE
+ Q.data = !lstate ? TRUE : FALSE
+ if(get_pin_data(IC_OUTPUT, 1))
+ activate_pin(2)
+ else
+ activate_pin(3)
+ push_data()
+
+/obj/item/integrated_circuit/logic/binary/rslatch
+ name = "RS latch"
+ desc = "This gate is synchronysed a RS latch. If both R and S are true, the state will not change."
+ icon_state = "sr_nor"
+ inputs = list("S","R")
+ outputs = list("Q","!Q")
+ activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/lstate=FALSE
+
+/obj/item/integrated_circuit/logic/binary/rslatch/do_work()
+ pull_data()
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/Q = outputs[2]
+ if(A.data)
+ if(!B.data)
+ lstate=TRUE
+ else
+ if(B.data)
+ lstate=FALSE
+ O.data = lstate ? TRUE : FALSE
+ Q.data = !lstate ? TRUE : FALSE
+ if(get_pin_data(IC_OUTPUT, 1))
+ activate_pin(2)
+ else
+ activate_pin(3)
+ push_data()
+
+/obj/item/integrated_circuit/logic/binary/gdlatch
+ name = "gated D latch"
+ desc = "This gate is a synchronysed gated D latch."
+ icon_state = "gated_d"
+ inputs = list("D","E")
+ outputs = list("Q","!Q")
+ activators = list("pulse in C" = IC_PINTYPE_PULSE_IN, "pulse out Q" = IC_PINTYPE_PULSE_OUT, "pulse out !Q" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/lstate=FALSE
+
+/obj/item/integrated_circuit/logic/binary/gdlatch/do_work()
+ pull_data()
+ var/datum/integrated_io/A = inputs[1]
+ var/datum/integrated_io/B = inputs[2]
+ var/datum/integrated_io/O = outputs[1]
+ var/datum/integrated_io/Q = outputs[2]
+ if(B.data)
+ if(A.data)
+ lstate=TRUE
+ else
+ lstate=FALSE
+
+ O.data = lstate ? TRUE : FALSE
+ Q.data = !lstate ? TRUE : FALSE
+ if(get_pin_data(IC_OUTPUT, 1))
+ activate_pin(2)
+ else
+ activate_pin(3)
+ push_data()
+
/obj/item/integrated_circuit/logic/binary/not_equals
name = "not equal gate"
desc = "This gate compares two values, and outputs the number one if both are different."
diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm
index 14aa9b6eab..0e16cd4079 100644
--- a/code/modules/integrated_electronics/subtypes/smart.dm
+++ b/code/modules/integrated_electronics/subtypes/smart.dm
@@ -25,8 +25,10 @@
if(!A)
return
if(!(A in view(get_turf(src))))
+ push_data()
return // Can't see the target.
- var/desired_dir = get_dir(get_turf(src), A)
+ var/desired_dir = get_dir(get_turf(src), get_turf(A))
set_pin_data(IC_OUTPUT, 1, desired_dir)
- push_data()
\ No newline at end of file
+ push_data()
+ activate_pin(2)
\ No newline at end of file
diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi
index 6ad2b65b2f..6da1794a54 100644
Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ
]