diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm
index c7092c6fc3..97acfd2c98 100644
--- a/code/modules/integrated_electronics/_defines.dm
+++ b/code/modules/integrated_electronics/_defines.dm
@@ -98,7 +98,7 @@
if(!M.canmove || M.stat || M.restrained())
return
- var/input = sanitizeSafe(input("What do you want to name the circuit?", ,""), MAX_NAME_LEN)
+ var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name), MAX_NAME_LEN)
if(src && input)
M << "The circuit '[src.name]' is now labeled '[input]'."
@@ -372,7 +372,7 @@
for(var/datum/integrated_io/input/I in inputs)
I.push_data()
-/obj/item/integrated_circuit/proc/work()
+/obj/item/integrated_circuit/proc/work(var/datum/integrated_io/io)
if(last_used + cooldown_per_use > world.time) // All intergrated circuits have an internal cooldown, to protect from spam.
return 0
last_used = world.time
diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/arithmetic.dm
index 5f5a4f1d2e..3fc60c64f9 100644
--- a/code/modules/integrated_electronics/arithmetic.dm
+++ b/code/modules/integrated_electronics/arithmetic.dm
@@ -154,4 +154,30 @@
if(..())
var/datum/integrated_io/output/O = outputs[1]
O.data = 3.14159
- O.push_data()
\ No newline at end of file
+ O.push_data()
+
+// Random //
+/obj/item/integrated_circuit/arithmetic/random
+ name = "random number generator circuit"
+ desc = "This gives a random (integer) number between values A and B inclusive."
+ icon_state = "random"
+ number_of_inputs = 2
+ number_of_outputs = 1
+ number_of_activators = 1
+ input_names = list(
+ "L",
+ "H"
+ )
+
+/obj/item/integrated_circuit/arithmetic/random/work()
+ if(..())
+ var/result = 0
+ var/datum/integrated_io/L = inputs[1]
+ var/datum/integrated_io/H = inputs[2]
+
+ if(isnum(L.data) && isnum(H.data))
+ result = rand(L.data, H.data)
+
+ for(var/datum/integrated_io/output/O in outputs)
+ O.data = result
+ O.push_data()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/converters.dm
index c9797fee45..7a837abbfa 100644
--- a/code/modules/integrated_electronics/converters.dm
+++ b/code/modules/integrated_electronics/converters.dm
@@ -92,5 +92,42 @@
if(incoming.data && istext(incoming.data))
result = uppertext(incoming.data)
+ outgoing.data = result
+ outgoing.push_data()
+
+/obj/item/integrated_circuit/converter/concatenatior
+ name = "concatenatior"
+ desc = "This joins many strings together to get one big string."
+ complexity = 4
+ number_of_inputs = 8
+ number_of_outputs = 1
+ number_of_activators = 1
+ input_names = list(
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H"
+ )
+ output_names = list(
+ "result"
+ )
+ activator_names = list(
+ "concatenate"
+ )
+
+
+/obj/item/integrated_circuit/converter/concatenatior/work()
+ if(..())
+ var/result = null
+ for(var/datum/integrated_io/input/I in inputs)
+ I.pull_data()
+ if(istext(I.data))
+ result = result + I.data
+
+ var/datum/integrated_io/outgoing = outputs[1]
outgoing.data = result
outgoing.push_data()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm
index 18e75f0a5d..6a3ef7a065 100644
--- a/code/modules/integrated_electronics/input_output.dm
+++ b/code/modules/integrated_electronics/input_output.dm
@@ -307,4 +307,65 @@
/obj/item/integrated_circuit/output/screen/work()
var/datum/integrated_io/I = inputs[1]
- stuff_to_display = I.data
\ No newline at end of file
+ stuff_to_display = I.data
+
+/obj/item/integrated_circuit/output/light
+ name = "light"
+ desc = "This light can turn on and off on command."
+ icon_state = "light_adv"
+// icon_state = "light"
+ complexity = 4
+ number_of_inputs = 0
+ number_of_outputs = 0
+ number_of_activators = 1
+ activator_names = list(
+ "toggle light"
+ )
+ var/light_toggled = 0
+ var/light_brightness = 3
+ var/light_rgb = "#FFFFFF"
+
+/obj/item/integrated_circuit/output/light/work()
+ if(..())
+ light_toggled = !light_toggled
+ update_lighting()
+
+/obj/item/integrated_circuit/output/light/proc/update_lighting()
+ if(light_toggled)
+ set_light(l_range = light_brightness, l_power = light_brightness, l_color = light_rgb)
+ else
+ set_light(0)
+
+/obj/item/integrated_circuit/output/light/advanced/update_lighting()
+ var/datum/integrated_io/R = inputs[1]
+ var/datum/integrated_io/G = inputs[2]
+ var/datum/integrated_io/B = inputs[3]
+ var/datum/integrated_io/brightness = inputs[4]
+
+ if(isnum(R.data) && isnum(G.data) && isnum(B.data) && isnum(brightness.data))
+ R.data = Clamp(R.data, 0, 255)
+ G.data = Clamp(G.data, 0, 255)
+ B.data = Clamp(B.data, 0, 255)
+ brightness.data = Clamp(brightness.data, 0, 6)
+ light_rgb = rgb(R.data, G.data, B.data)
+ light_brightness = brightness.data
+
+ ..()
+
+/obj/item/integrated_circuit/output/light/advanced
+ name = "advanced light"
+ desc = "This light can turn on and off on command, in any color, and in various brightness levels."
+ icon_state = "light_adv"
+ complexity = 8
+ number_of_inputs = 4
+ number_of_outputs = 0
+ number_of_activators = 1
+ input_names = list(
+ "R",
+ "G",
+ "B",
+ "Brightness"
+ )
+
+/obj/item/integrated_circuit/output/light/advanced/on_data_written()
+ update_lighting()
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/tools.dm
index 4ef220c373..915fe0f17b 100644
--- a/code/modules/integrated_electronics/tools.dm
+++ b/code/modules/integrated_electronics/tools.dm
@@ -9,8 +9,8 @@
desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \
The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \
used for power or data transmission."
- icon = 'icons/obj/hacktool.dmi'
- icon_state = "hacktool-g"
+ icon = 'icons/obj/electronic_assemblies.dmi'
+ icon_state = "wirer-wire"
flags = CONDUCT
w_class = 2
var/datum/integrated_io/selected_io = null
@@ -19,11 +19,15 @@
/obj/item/device/integrated_electronics/wirer/New()
..()
+/obj/item/device/integrated_electronics/wirer/update_icon()
+ icon_state = "wirer-[mode]"
+
/obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user)
if(mode == WIRE)
selected_io = io
user << "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel."
mode = WIRING
+ update_icon()
else if(mode == WIRING)
if(io == selected_io)
user << "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless."
@@ -37,6 +41,7 @@
user << "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name]."
mode = WIRE
+ update_icon()
//io.updateDialog()
//selected_io.updateDialog()
selected_io.holder.interact(user) // This is to update the UI.
@@ -50,6 +55,7 @@
return
user << "You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel."
mode = UNWIRING
+ update_icon()
return
else if(mode == UNWIRING)
@@ -67,6 +73,7 @@
selected_io.holder.interact(user) // This is to update the UI.
selected_io = null
mode = UNWIRE
+ update_icon()
else
user << "\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \
[io.name] are not connected."
@@ -89,6 +96,7 @@
user << "You decide not to disconnect the data channel."
selected_io = null
mode = UNWIRE
+ update_icon()
user << "You set \the [src] to [mode]."
#undef WIRE
@@ -100,8 +108,8 @@
name = "circuit debugger"
desc = "This small tool allows one working with custom machinery to directly set data to a specific pin, useful for writing \
settings to specific circuits, or for debugging purposes. It can also pulse activation pins."
- icon = 'icons/obj/hacktool.dmi'
- icon_state = "hacktool"
+ icon = 'icons/obj/electronic_assemblies.dmi'
+ icon_state = "debugger"
flags = CONDUCT
w_class = 2
var/data_to_write = null
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index ddbdfb2cdd..b99543514a 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1581,6 +1581,11 @@ CIRCUITS BELOW
build_path = /obj/item/integrated_circuit/arithmetic/pi
sort_string = "WAAAG"
+/datum/design/circuit/integrated_circuit/arithmetic/random
+ id = "cc-random"
+ build_path = /obj/item/integrated_circuit/arithmetic/random
+ sort_string = "WAAAH"
+
/datum/design/circuit/integrated_circuit/converter/AssembleDesignName()
@@ -1612,6 +1617,11 @@ CIRCUITS BELOW
build_path = /obj/item/integrated_circuit/converter/uppercase
sort_string = "WAABD"
+/datum/design/circuit/integrated_circuit/converter/concatenatior
+ id = "cc-concatenatior"
+ build_path = /obj/item/integrated_circuit/converter/concatenatior
+ sort_string = "WAABC"
+
/datum/design/circuit/integrated_circuit/coordinate/AssembleDesignName()
@@ -1712,6 +1722,15 @@ CIRCUITS BELOW
build_path = /obj/item/integrated_circuit/input/signaler
sort_string = "WAAEJ"
+/datum/design/circuit/integrated_circuit/input_output/light
+ id = "cc-light"
+ build_path = /obj/item/integrated_circuit/output/light
+ sort_string = "WAAEH"
+
+/datum/design/circuit/integrated_circuit/input_output/adv_light
+ id = "cc-adv_light"
+ build_path = /obj/item/integrated_circuit/output/light/advanced
+ sort_string = "WAAEI"
/datum/design/circuit/integrated_circuit/logic/AssembleDesignName()
@@ -1776,7 +1795,7 @@ CIRCUITS BELOW
id = "cc-smoke"
build_path = /obj/item/integrated_circuit/manipulation/smoke
sort_string = "WAAGB"
- req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIOMED = 4)
+ req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 4)
/datum/design/circuit/integrated_circuit/manipulation/locomotion
name = "locomotion"
diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi
index c37e2e7863..c7bf1845a0 100644
Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ
diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm
index 025e54a9f4..fd5da3e50f 100644
--- a/maps/polaris-1.dmm
+++ b/maps/polaris-1.dmm
@@ -6100,7 +6100,7 @@
"cnp" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/tiled/dark,/area/storage/tech)
"cnq" = (/turf/simulated/floor/tiled/dark,/area/storage/tech)
"cnr" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/storage/tech)
-"cns" = (/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech)
+"cns" = (/obj/structure/table/steel,/obj/item/device/integrated_electronics/debugger{pixel_x = -5; pixel_y = 0},/obj/item/device/integrated_electronics/wirer{pixel_x = 5; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech)
"cnt" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_engineering{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
"cnu" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech)
"cnv" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/arcade,/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
@@ -6150,7 +6150,7 @@
"con" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/cargo)
"coo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/delivery)
"cop" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech)
-"coq" = (/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech)
+"coq" = (/obj/structure/table/steel,/obj/item/weapon/storage/bag/circuits/basic,/turf/simulated/floor/plating,/area/storage/tech)
"cor" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech)
"cos" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plating,/area/storage/tech)
"cot" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/sign/directions/engineering{dir = 2; pixel_x = -32; pixel_z = -8},/obj/structure/sign/directions/medical{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sign/directions/cargo{dir = 2; pixel_x = -32; pixel_z = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_four)
@@ -6198,7 +6198,7 @@
"cpj" = (/turf/simulated/wall,/area/hallway/primary/port)
"cpk" = (/obj/machinery/atmospherics/tvalve/mirrored/digital{name = "Waste to Space"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpl" = (/obj/machinery/cell_charger{pixel_y = 5},/obj/item/device/multitool,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech)
-"cpm" = (/obj/machinery/light/small,/turf/simulated/floor,/area/storage/tech)
+"cpm" = (/obj/machinery/light/small,/obj/structure/table/steel,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor,/area/storage/tech)
"cpn" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/storage/tech)
"cpo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech)
"cpp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/storage/tech)