From 0be326633da5317205e3f1bce7fc84431b2dcfbd Mon Sep 17 00:00:00 2001 From: ACCount Date: Sun, 26 Nov 2017 13:56:47 +0300 Subject: [PATCH] More integrated circuit fixes and code improvements --- code/__DEFINES/integrated_electronics.dm | 2 + code/game/objects/items/devices/multitool.dm | 10 +- .../integrated_electronics/core/analyzer.dm | 2 +- .../integrated_electronics/core/assemblies.dm | 155 +++++++++--- .../integrated_electronics/core/debugger.dm | 6 +- .../integrated_electronics/core/helpers.dm | 26 +- .../core/integrated_circuit.dm | 167 ++++--------- .../integrated_electronics/core/pins.dm | 64 +++-- .../integrated_electronics/core/printer.dm | 24 +- .../core/saved_circuits.dm | 33 ++- .../core/special_pins/char_pin.dm | 2 +- .../core/special_pins/index_pin.dm | 21 ++ .../core/special_pins/list_pin.dm | 4 + .../core/special_pins/string_pin.dm | 2 +- .../integrated_electronics/core/wirer.dm | 8 +- .../subtypes/converters.dm | 6 +- .../subtypes/data_transfer.dm | 58 +++-- .../integrated_electronics/subtypes/input.dm | 20 +- .../integrated_electronics/subtypes/lists.dm | 232 ++++++++++++++---- .../subtypes/manipulation.dm | 59 +++-- .../integrated_electronics/subtypes/memory.dm | 4 +- .../integrated_electronics/subtypes/output.dm | 87 +++---- .../obj/assemblies/electronic_components.dmi | Bin 0 -> 21210 bytes icons/obj/assemblies/electronic_misc.dmi | Bin 0 -> 2623 bytes icons/obj/assemblies/electronic_setups.dmi | Bin 0 -> 3757 bytes icons/obj/assemblies/electronic_tools.dmi | Bin 0 -> 2179 bytes icons/obj/electronic_assemblies.dmi | Bin 41014 -> 0 bytes icons/obj/electronic_assemblies2.dmi | Bin 30302 -> 0 bytes tgstation.dme | 1 + 29 files changed, 590 insertions(+), 403 deletions(-) create mode 100644 code/modules/integrated_electronics/core/special_pins/index_pin.dm create mode 100644 icons/obj/assemblies/electronic_components.dmi create mode 100644 icons/obj/assemblies/electronic_misc.dmi create mode 100644 icons/obj/assemblies/electronic_setups.dmi create mode 100644 icons/obj/assemblies/electronic_tools.dmi delete mode 100644 icons/obj/electronic_assemblies.dmi delete mode 100644 icons/obj/electronic_assemblies2.dmi diff --git a/code/__DEFINES/integrated_electronics.dm b/code/__DEFINES/integrated_electronics.dm index 8e9e1b7cea..77ee69892e 100644 --- a/code/__DEFINES/integrated_electronics.dm +++ b/code/__DEFINES/integrated_electronics.dm @@ -20,6 +20,7 @@ #define IC_FORMAT_BOOLEAN "\" #define IC_FORMAT_REF "\" #define IC_FORMAT_LIST "\" +#define IC_FORMAT_INDEX "\" #define IC_FORMAT_PULSE "\" @@ -33,6 +34,7 @@ #define IC_PINTYPE_BOOLEAN /datum/integrated_io/boolean #define IC_PINTYPE_REF /datum/integrated_io/ref #define IC_PINTYPE_LIST /datum/integrated_io/lists +#define IC_PINTYPE_INDEX /datum/integrated_io/index #define IC_PINTYPE_PULSE_IN /datum/integrated_io/activate #define IC_PINTYPE_PULSE_OUT /datum/integrated_io/activate/out diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 40963c3b08..b38e872ba3 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -59,8 +59,7 @@ if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") return - selected_io.linked |= io - io.linked |= selected_io + io.connect_pin(selected_io) to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].") selected_io.holder.interact(user) // This is to update the UI. @@ -82,8 +81,7 @@ to_chat(user, "These data pins aren't connected!") return else - io1.linked.Remove(io2) - io2.linked.Remove(io1) + io1.disconnect_pin(io2) to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \ [io1.name] and the [io2.holder.displayed_name]'s [io2.name].") io1.holder.interact(user) // This is to update the UI. @@ -162,5 +160,9 @@ desc = "An omni-technological interface." icon = 'icons/obj/abductor.dmi' icon_state = "multitool" +<<<<<<< HEAD toolspeed = 0.1 origin_tech = "magnets=5;engineering=5;abductor=3" +======= + toolspeed = 0.1 +>>>>>>> 0d2955e... More integrated circuit fixes and code improvements (#33034) diff --git a/code/modules/integrated_electronics/core/analyzer.dm b/code/modules/integrated_electronics/core/analyzer.dm index 02b8c88acc..0166f9bce7 100644 --- a/code/modules/integrated_electronics/core/analyzer.dm +++ b/code/modules/integrated_electronics/core/analyzer.dm @@ -1,7 +1,7 @@ /obj/item/device/integrated_electronics/analyzer name = "circuit analyzer" desc = "This tool can scan an assembly and generate code necessary to recreate it in a circuit printer." - icon = 'icons/obj/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "analyzer" flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 6f552e1df4..5d457dfeed 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -5,10 +5,11 @@ name = "electronic assembly" desc = "It's a case, for building small electronics with." w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_setups.dmi' icon_state = "setup_small" flags_1 = NOBLUDGEON_1 materials = list() // To be filled later + var/list/assembly_components = list() var/max_components = IC_MAX_SIZE_BASE var/max_complexity = IC_COMPLEXITY_BASE var/opened = FALSE @@ -40,11 +41,12 @@ /obj/item/device/electronic_assembly/proc/handle_idle_power() // First we generate power. - for(var/obj/item/integrated_circuit/passive/power/P in contents) + for(var/obj/item/integrated_circuit/passive/power/P in assembly_components) P.make_energy() // Now spend it. - for(var/obj/item/integrated_circuit/IC in contents) + for(var/I in assembly_components) + var/obj/item/integrated_circuit/IC = I if(IC.power_draw_idle) if(!draw_power(IC.power_draw_idle)) IC.power_fail() @@ -59,8 +61,8 @@ var/HTML = "" HTML += "[name]" - HTML += "
\[Refresh\] | " - HTML += "\[Rename\]
" + + HTML += "\[Refresh\] | \[Rename\]
" HTML += "[total_part_size]/[max_components] ([round((total_part_size / max_components) * 100, 0.1)]%) space taken up in the assembly.
" HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity.
" if(battery) @@ -73,16 +75,14 @@ HTML += "Components:" - var/list/components = return_all_components() var/builtin_components = "" - for(var/c in components) + for(var/c in assembly_components) var/obj/item/integrated_circuit/circuit = c if(!circuit.removable) - builtin_components += "[circuit.displayed_name] | " - builtin_components += "\[Rename\] | " - builtin_components += "\[Scan with Debugger\] | " - builtin_components += "\[Move to Bottom\]" + builtin_components += "[circuit.displayed_name] | " + builtin_components += "\[Rename\] | " + builtin_components += "\[Scan with Debugger\]" builtin_components += "
" // Put removable circuits (if any) in separate categories from non-removable @@ -95,14 +95,17 @@ HTML += "
" - for(var/c in components) + for(var/c in assembly_components) var/obj/item/integrated_circuit/circuit = c if(circuit.removable) - HTML += "[circuit.displayed_name] | " - HTML += "\[Rename\] | " - HTML += "\[Scan with Debugger\] | " - HTML += "\[Remove\] | " - HTML += "\[Move to Bottom\]" + HTML += "[circuit.displayed_name] | " + HTML += "\[Rename\] | " + HTML += "\[Scan with Debugger\] | " + HTML += "\[Remove\] | " + HTML += " " + HTML += " " + HTML += " " + HTML += "" HTML += "
" HTML += "" @@ -125,6 +128,46 @@ to_chat(usr, "You pull \the [battery] out of \the [src]'s power supplier.") battery = null + if(href_list["component"]) + var/obj/item/integrated_circuit/component = locate(href_list["component"]) in assembly_components + if(component) + // Builtin components are not supposed to be removed or rearranged + if(!component.removable) + return + + var/current_pos = assembly_components.Find(component) + + // Find the position of a first removable component + var/first_removable_pos + for(var/i in 1 to assembly_components.len) + var/obj/item/integrated_circuit/temp_component = assembly_components[i] + if(temp_component.removable) + first_removable_pos = i + break + + if(href_list["remove"]) + try_remove_component(component, usr) + + else + // Adjust the position + if(href_list["up"]) + current_pos-- + else if(href_list["down"]) + current_pos++ + else if(href_list["top"]) + current_pos = first_removable_pos + else if(href_list["bottom"]) + current_pos = assembly_components.len + + // Wrap around nicely + if(current_pos < first_removable_pos) + current_pos = assembly_components.len + else if(current_pos > assembly_components.len) + current_pos = first_removable_pos + + assembly_components.Remove(component) + assembly_components.Insert(current_pos, component) + interact(usr) // To refresh the UI. /obj/item/device/electronic_assembly/proc/rename() @@ -142,9 +185,6 @@ /obj/item/device/electronic_assembly/proc/can_move() return FALSE -/obj/item/device/electronic_assembly/drone/can_move() - return TRUE - /obj/item/device/electronic_assembly/update_icon() if(opened) icon_state = initial(icon_state) + "-open" @@ -153,9 +193,10 @@ /obj/item/device/electronic_assembly/examine(mob/user) ..() - for(var/obj/item/integrated_circuit/IC in contents) + for(var/I in assembly_components) + var/obj/item/integrated_circuit/IC = I IC.external_examine(user) - if(istype(IC,/obj/item/integrated_circuit/output/screen)) + if(istype(IC, /obj/item/integrated_circuit/output/screen)) var/obj/item/integrated_circuit/output/screen/S if(S.stuff_to_display) to_chat(user, "There's a little screen labeled '[S]', which displays '[S.stuff_to_display]'.") @@ -164,21 +205,20 @@ /obj/item/device/electronic_assembly/proc/return_total_complexity() . = 0 - for(var/obj/item/integrated_circuit/part in contents) + var/obj/item/integrated_circuit/part + for(var/p in assembly_components) + part = p . += part.complexity /obj/item/device/electronic_assembly/proc/return_total_size() . = 0 - for(var/obj/item/integrated_circuit/part in contents) + var/obj/item/integrated_circuit/part + for(var/p in assembly_components) + part = p . += part.size -/obj/item/device/electronic_assembly/proc/return_all_components() - . = list() - for(var/obj/item/integrated_circuit/part in contents) - . += part - // Returns true if the circuit made it inside. -/obj/item/device/electronic_assembly/proc/add_circuit(var/obj/item/integrated_circuit/IC, var/mob/user) +/obj/item/device/electronic_assembly/proc/try_add_component(obj/item/integrated_circuit/IC, mob/user) if(!opened) to_chat(user, "\The [src]'s hatch is closed, you can't put anything inside.") return FALSE @@ -200,12 +240,45 @@ if(!user.transferItemToLoc(IC, src)) return FALSE - IC.assembly = src + to_chat(user, "You slide [IC] inside [src].") + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) + add_component(IC) return TRUE + +// Actually puts the circuit inside, doesn't perform any checks. +/obj/item/device/electronic_assembly/proc/add_component(obj/item/integrated_circuit/component) + component.forceMove(get_object()) + component.assembly = src + assembly_components |= component + + +/obj/item/device/electronic_assembly/proc/try_remove_component(obj/item/integrated_circuit/IC, mob/user) + if(!opened) + to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.") + return FALSE + + if(!IC.removable) + to_chat(user, "[src] is permanently attached to the case.") + return FALSE + + to_chat(user, "You pop \the [src] out of the case, and slide it out.") + playsound(src, 'sound/items/Crowbar.ogg', 50, 1) + + remove_component(IC) + return TRUE + +// Actually removes the component, doesn't perform any checks. +/obj/item/device/electronic_assembly/proc/remove_component(obj/item/integrated_circuit/component) + component.disconnect_all() + component.forceMove(drop_location()) + component.assembly = null + assembly_components.Remove(component) + + /obj/item/device/electronic_assembly/afterattack(atom/target, mob/user, proximity) - for(var/obj/item/integrated_circuit/input/sensor/S in contents) + for(var/obj/item/integrated_circuit/input/sensor/S in assembly_components) if(!proximity) if(istype(S,/obj/item/integrated_circuit/input/sensor/ranged)||(!user)) if(user.client) @@ -234,12 +307,10 @@ if(istype(I, /obj/item/integrated_circuit)) if(!user.canUnEquip(I)) return FALSE - if(add_circuit(I, user)) - to_chat(user, "You slide [I] inside [src].") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + if(try_add_component(I, user)) interact(user) return TRUE - else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger)) + else if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger)) if(opened) interact(user) else @@ -270,7 +341,7 @@ var/list/input_selection = list() var/list/available_inputs = list() - for(var/obj/item/integrated_circuit/input/input in contents) + for(var/obj/item/integrated_circuit/input/input in assembly_components) if(input.can_be_asked_input) available_inputs.Add(input) var/i = 0 @@ -316,9 +387,14 @@ return FALSE /obj/item/device/electronic_assembly/Moved(oldLoc, dir) - for(var/obj/item/integrated_circuit/IC in contents) + for(var/I in assembly_components) + var/obj/item/integrated_circuit/IC = I IC.ext_moved(oldLoc, dir) +// Returns the object that is supposed to be used in attack messages, location checks, etc. +// Override in children for special behavior. +/obj/item/device/electronic_assembly/proc/get_object() + return src @@ -363,3 +439,6 @@ w_class = WEIGHT_CLASS_SMALL max_components = IC_MAX_SIZE_BASE * 3 max_complexity = IC_COMPLEXITY_BASE * 3 + +/obj/item/device/electronic_assembly/drone/can_move() + return TRUE diff --git a/code/modules/integrated_electronics/core/debugger.dm b/code/modules/integrated_electronics/core/debugger.dm index 7dc89178d2..ac6f5c1a1e 100644 --- a/code/modules/integrated_electronics/core/debugger.dm +++ b/code/modules/integrated_electronics/core/debugger.dm @@ -1,10 +1,8 @@ - - /obj/item/device/integrated_electronics/debugger 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/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "debugger" flags_1 = CONDUCT_1 | NOBLUDGEON_1 w_class = WEIGHT_CLASS_SMALL @@ -20,7 +18,7 @@ switch(type_to_use) if("string") accepting_refs = FALSE - new_data = stripped_input(user, "Now type in a string.","[src] string writing") + new_data = stripped_input(user, "Now type in a string.","[src] string writing", no_trim = TRUE) if(istext(new_data) && user.IsAdvancedToolUser()) data_to_write = new_data to_chat(user, "You set \the [src]'s memory to \"[new_data]\".") diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm index 04137a4d05..e84823f201 100644 --- a/code/modules/integrated_electronics/core/helpers.dm +++ b/code/modules/integrated_electronics/core/helpers.dm @@ -54,21 +54,6 @@ return activators[pin_number] return -/obj/item/integrated_circuit/proc/handle_wire(var/datum/integrated_io/pin, var/obj/item/device/integrated_electronics/tool) - if(istype(tool, /obj/item/device/integrated_electronics/wirer)) - var/obj/item/device/integrated_electronics/wirer/wirer = tool - if(pin) - wirer.wire(pin, usr) - return TRUE - - else if(istype(tool, /obj/item/device/integrated_electronics/debugger)) - var/obj/item/device/integrated_electronics/debugger/debugger = tool - if(pin) - debugger.write_data(pin, usr) - return TRUE - return FALSE - - /datum/integrated_io/proc/get_data() if(isweakref(data)) return data.resolve() @@ -76,7 +61,7 @@ // Returns a list of parameters necessary to locate a pin in the assembly: component number, pin type and pin number -// Components list can be supplied from the outside, for use in savefiles or for extra performance if you are calling this multiple times +// Components list can be supplied from the outside, for use in savefiles /datum/integrated_io/proc/get_pin_parameters(list/components) if(!holder) return @@ -84,7 +69,7 @@ if(!components) if(!holder.assembly) return - components = holder.assembly.return_all_components() + components = holder.assembly.assembly_components var/component_number = components.Find(holder) @@ -105,10 +90,10 @@ // Locates a pin in the assembly when given component number, pin type and pin number -// Components list can be supplied from the outside, for use in savefiles or for extra performance if you are calling this multiple times +// Components list can be supplied from the outside, for use in savefiles /obj/item/device/electronic_assembly/proc/get_pin_ref(component_number, pin_type, pin_number, list/components) if(!components) - components = return_all_components() + components = assembly_components if(component_number > components.len) return @@ -120,6 +105,9 @@ // Same as get_pin_ref, but takes in a list of 3 parameters (same format as get_pin_parameters) // and performs extra sanity checks on parameters list and index numbers /obj/item/device/electronic_assembly/proc/get_pin_ref_list(list/parameters, list/components) + if(!components) + components = assembly_components + if(!islist(parameters) || parameters.len != 3) return diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 042e93a2aa..748acfa5e4 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -1,7 +1,7 @@ /obj/item/integrated_circuit name = "integrated circuit" desc = "It's a tiny chip! This one doesn't seem to do much, however." - icon = 'icons/obj/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_components.dmi' icon_state = "template" w_class = WEIGHT_CLASS_TINY materials = list() // To be filled later @@ -22,8 +22,6 @@ 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/allow_multitool = TRUE // Allows additional multitool functionality - // Used as a global var, (Do not set manually in children). /* Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows @@ -104,9 +102,11 @@ a creative player the means to solve many problems. Circuits are held inside an if(!check_interactivity(M)) return - var/input = reject_bad_name(stripped_input(M, "What do you want to name this?", "Rename", src.name),1) - if(src && input && check_interactivity(M)) - to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") + var/input = reject_bad_name(stripped_input(M, "What do you want to name this?", "Rename", name), TRUE) + if(check_interactivity(M)) + if(!input) + input = name + to_chat(M, "The circuit '[name]' is now labeled '[input]'.") displayed_name = input /obj/item/integrated_circuit/interact(mob/user) @@ -124,13 +124,15 @@ a creative player the means to solve many problems. Circuits are held inside an HTML += "
" HTML += "" - HTML += "
\[Return to Assembly\]" + if(assembly) + HTML += "\[Return to Assembly\]
" - HTML += "
\[Refresh\] | " + HTML += "\[Refresh\] | " HTML += "\[Rename\] | " - HTML += "\[Scan with Device\] | " - if(removable) - HTML += "\[Remove\]
" + HTML += "\[Scan with Device\]" + if(assembly && removable) + HTML += " | \[Remove\]" + HTML += "
" HTML += "" HTML += "" @@ -151,12 +153,13 @@ a creative player the means to solve many problems. Circuits are held inside an if(1) io = get_pin_ref(IC_INPUT, i) if(io) - words += "[io.display_pin_type()] [io.name] [io.display_data(io.data)]
" + words += "[io.display_pin_type()] [io.name] \ + [io.display_data(io.data)]
" if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
" + words += "[linked] \ + @ [linked.holder.displayed_name]
" if(outputs.len > inputs.len) height = 1 @@ -169,12 +172,13 @@ a creative player the means to solve many problems. Circuits are held inside an if(3) io = get_pin_ref(IC_OUTPUT, i) if(io) - words += "[io.display_pin_type()] [io.name] [io.display_data(io.data)]
" + words += "[io.display_pin_type()] [io.name] \ + [io.display_data(io.data)]
" if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
" + words += "[linked] \ + @ [linked.holder.displayed_name]
" if(inputs.len > outputs.len) height = 1 @@ -185,12 +189,13 @@ a creative player the means to solve many problems. Circuits are held inside an var/datum/integrated_io/io = activator var/words = list() - words += "[io] [io.data?"\":"\"]
" + words += "[io] " + words += "[io.data?"\":"\"]
" if(io.linked.len) for(var/k in 1 to io.linked.len) var/datum/integrated_io/linked = io.linked[k] - words += "[linked] \ - @ [linked.holder.displayed_name]
" + words += "[linked] \ + @ [linked.holder.displayed_name]
" HTML += "" HTML += "" @@ -221,80 +226,24 @@ a creative player the means to solve many problems. Circuits are held inside an return TRUE var/update = TRUE - var/obj/item/device/electronic_assembly/A = src.assembly var/update_to_assembly = FALSE - var/datum/integrated_io/pin = locate(href_list["pin"]) in inputs + outputs + activators - var/datum/integrated_io/linked = null - if(href_list["link"]) - linked = locate(href_list["link"]) in pin.linked var/obj/held_item = usr.get_active_held_item() if(href_list["rename"]) rename_component(usr) - if(href_list["from_assembly"]) - update = FALSE - var/obj/item/device/electronic_assembly/ea = loc - if(istype(ea)) - ea.interact(usr) - if(href_list["pin_name"]) - if (!istype(held_item, /obj/item/device/multitool) || !allow_multitool) - href_list["wire"] = TRUE - else - var/obj/item/device/multitool/M = held_item - M.wire(pin,usr) + if(href_list["pin"]) + var/datum/integrated_io/pin = locate(href_list["pin"]) in inputs + outputs + activators + if(pin) + var/datum/integrated_io/linked + if(href_list["link"]) + linked = locate(href_list["link"]) in pin.linked - - - if(href_list["pin_data"]) - if (!istype(held_item, /obj/item/device/multitool) || !allow_multitool) - href_list["wire"] = TRUE - - else - var/datum/integrated_io/io = pin - io.ask_for_pin_data(usr) // The pins themselves will determine how to ask for data, and will validate the data. - - if(href_list["pin_unwire"]) - if (!istype(held_item, /obj/item/device/multitool) || !allow_multitool) - href_list["wire"] = TRUE - else - var/obj/item/device/multitool/M = held_item - M.unwire(pin, linked, usr) - - if(href_list["wire"]) - if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) - var/obj/item/device/integrated_electronics/wirer/wirer = held_item - if(linked) - wirer.wire(linked, usr) - else if(pin) - wirer.wire(pin, usr) - - else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) - var/obj/item/device/integrated_electronics/debugger/debugger = held_item - if(pin) - debugger.write_data(pin, usr) - else - to_chat(usr, "You can't do a whole lot without the proper tools.") - - if(href_list["examine"]) - var/obj/item/integrated_circuit/examined - if(href_list["examined"]) - examined = href_list["examined"] - else - examined = src - examined.interact(usr) - update = FALSE - - if(href_list["bottom"]) - var/obj/item/integrated_circuit/circuit = locate(href_list["bottom"]) in src.assembly.contents - var/assy = circuit.assembly - if(!circuit) - return - circuit.loc = null - circuit.loc = assy - . = TRUE - update_to_assembly = TRUE + if(istype(held_item, /obj/item/device/integrated_electronics) || istype(held_item, /obj/item/device/multitool)) + pin.handle_wire(linked, held_item, href_list["act"], usr) + else + to_chat(usr, "You can't do a whole lot without the proper tools.") if(href_list["scan"]) if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) @@ -304,39 +253,15 @@ a creative player the means to solve many problems. Circuits are held inside an else to_chat(usr, "The debugger's 'ref scanner' needs to be on.") else - to_chat(usr, "You need a multitool/debugger set to 'ref' mode to do that.") + to_chat(usr, "You need a debugger set to 'ref' mode to do that.") if(href_list["return"]) - if(A) - update_to_assembly = TRUE - usr << browse(null, "window=circuit-[REF(src)];border=1;can_resize=1;can_close=1;can_minimize=1") - else - to_chat(usr, "This circuit is not in an assembly!") + update_to_assembly = TRUE - if(href_list["remove"]) - if(!A) - to_chat(usr, "This circuit is not in an assembly!") - return - if(!removable) - to_chat(usr, "\The [src] seems to be permanently attached to the case.") - return - var/obj/item/device/electronic_assembly/ea = loc - disconnect_all() - var/turf/T = get_turf(src) - forceMove(T) - assembly = null - playsound(T, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(usr, "You pop \the [src] out of the case, and slide it out.") - - if(istype(ea)) - ea.interact(usr) - update = FALSE - return - if(update) - if(A && istype(A) && update_to_assembly) - A.interact(usr) + if(assembly && update_to_assembly) + assembly.interact(usr) else interact(usr) // To refresh the UI. @@ -384,18 +309,24 @@ a creative player the means to solve many problems. Circuits are held inside an for(var/i in inputs) I = i - I.disconnect() + I.disconnect_all() for(var/i in outputs) I = i - I.disconnect() + I.disconnect_all() for(var/i in activators) I = i - I.disconnect() + I.disconnect_all() /obj/item/integrated_circuit/proc/ext_moved(oldLoc, dir) return - +// Returns the object that is supposed to be used in attack messages, location checks, etc. +/obj/item/integrated_circuit/proc/get_object() + // If the component is located in an assembly, let assembly determine it. + if(assembly) + return assembly.get_object() + else + return src // If not, the component is acting on its own. diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm index 25ef3b80b8..bff96b713c 100644 --- a/code/modules/integrated_electronics/core/pins.dm +++ b/code/modules/integrated_electronics/core/pins.dm @@ -40,7 +40,7 @@ D [1]/ || message_admins("ERROR: An integrated_io ([name]) spawned without a valid holder! This is a bug.") /datum/integrated_io/Destroy() - disconnect() + disconnect_all() data = null holder = null return ..() @@ -102,7 +102,36 @@ D [1]/ || /datum/integrated_io/activate/scramble() push_data() -/datum/integrated_io/proc/write_data_to_pin(var/new_data) +/datum/integrated_io/proc/handle_wire(datum/integrated_io/linked_pin, obj/item/tool, action, mob/living/user) + if(istype(tool, /obj/item/device/multitool)) + var/obj/item/device/multitool/multitool = tool + switch(action) + if("wire") + multitool.wire(src, user) + return TRUE + if("unwire") + if(linked_pin) + multitool.unwire(src, linked_pin, user) + return TRUE + if("data") + ask_for_pin_data(user) + return TRUE + + else if(istype(tool, /obj/item/device/integrated_electronics/wirer)) + var/obj/item/device/integrated_electronics/wirer/wirer = tool + if(linked_pin) + wirer.wire(linked_pin, user) + else + wirer.wire(src, user) + + else if(istype(tool, /obj/item/device/integrated_electronics/debugger)) + var/obj/item/device/integrated_electronics/debugger/debugger = tool + debugger.write_data(src, user) + return TRUE + + return FALSE + +/datum/integrated_io/proc/write_data_to_pin(new_data) if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) data = new_data holder.on_data_written() @@ -131,21 +160,20 @@ D [1]/ || return "the [english_list(linked)]" return "nothing" -/datum/integrated_io/proc/disconnect() - //First we iterate over everything we are linked to. - if(linked && linked.len) - for(var/i in 1 to linked.len) - var/datum/integrated_io/their_io = linked[i] - //While doing that, we iterate them as well, and disconnect ourselves from them. - if(their_io.linked.len && their_io.linked) - for(var/j in 1 to their_io.linked.len) - var/datum/integrated_io/their_linked_io = their_io.linked[j] - if(their_linked_io == src) - their_io.linked.Remove(src) - else - continue - //Now that we're removed from them, we gotta remove them from us. - linked.Remove(their_io) + +/datum/integrated_io/proc/connect_pin(datum/integrated_io/pin) + pin.linked |= src + linked |= pin + +// Iterates over every linked pin and disconnects them. +/datum/integrated_io/proc/disconnect_all() + for(var/pin in linked) + disconnect_pin(pin) + +/datum/integrated_io/proc/disconnect_pin(datum/integrated_io/pin) + pin.linked.Remove(src) + linked.Remove(pin) + /datum/integrated_io/proc/ask_for_data_type(mob/user, var/default, var/list/allowed_data_types = list("string","number","null")) var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in allowed_data_types @@ -155,7 +183,7 @@ D [1]/ || var/new_data = null switch(type_to_use) if("string") - new_data = stripped_input(user, "Now type in a string.","[src] string writing", istext(default) ? default : null) + new_data = stripped_input(user, "Now type in a string.","[src] string writing", istext(default) ? default : null, no_trim = TRUE) if(istext(new_data) && holder.check_interactivity(user) ) to_chat(user, "You input "+new_data+" into the pin.") return new_data diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 89a0e2b213..6951d1dd09 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -1,7 +1,7 @@ /obj/item/device/integrated_circuit_printer name = "integrated circuit printer" desc = "A portable(ish) machine made to print tiny modular circuitry out of metal." - icon = 'icons/obj/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "circuit_printer" w_class = WEIGHT_CLASS_BULKY var/upgraded = TRUE // When hit with an upgrade disk, will turn true, allowing it to print the higher tier circuits. @@ -108,16 +108,13 @@ if(!build_type || !ispath(build_type)) return TRUE - var/cost = 1 + var/cost = 400 if(ispath(build_type, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/E = build_type - cost = round( (initial(E.max_complexity) + initial(E.max_components) ) / 4) + var/obj/item/device/electronic_assembly/E = SScircuit.cached_assemblies[build_type] + cost = E.materials[MAT_METAL] else if(ispath(build_type, /obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = build_type - cost = initial(IC.w_class) - - - cost *= SScircuit.cost_multiplier + var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type] + cost = IC.materials[MAT_METAL] var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) @@ -125,7 +122,12 @@ to_chat(usr, "You need [cost] metal to build that!") return TRUE - new build_type(get_turf(loc)) + var/obj/item/built = new build_type(drop_location()) + + if(istype(built, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/E = built + E.opened = TRUE + E.update_icon() if(href_list["print"]) if(!CONFIG_GET(flag/ic_printing)) @@ -179,7 +181,7 @@ /obj/item/disk/integrated_circuit/upgrade name = "integrated circuit printer upgrade disk" desc = "Install this into your integrated circuit printer to enhance it." - icon = 'icons/obj/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "upgrade_disk" item_state = "card-id" w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/integrated_electronics/core/saved_circuits.dm b/code/modules/integrated_electronics/core/saved_circuits.dm index cbbe58f16d..34abff9a1f 100644 --- a/code/modules/integrated_electronics/core/saved_circuits.dm +++ b/code/modules/integrated_electronics/core/saved_circuits.dm @@ -23,6 +23,8 @@ // Don't waste space saving the default values if(input.data == inputs_default["[index]"]) continue + if(input.data == initial(input.data)) + continue var/list/input_value = list(index, FALSE, input.data) // Index, Type, Value @@ -91,15 +93,13 @@ //var/input_type = input[2] var/input_value = input[3] - var/datum/integrated_io/IO = inputs[index] - IO.write_data_to_pin(input_value) - // write_data_to_pin includes all the value sanity checks you'll ever need + var/datum/integrated_io/pin = inputs[index] + // The pins themselves validate the data. + pin.write_data_to_pin(input_value) // TODO: support for special input types, such as internal refs and maybe typepaths - - // Saves type and modified name (if any) to a list // The list is converted to JSON down the line. /obj/item/device/electronic_assembly/proc/save() @@ -144,10 +144,8 @@ // Attempts to save an assembly into a save file format. // Returns null if assembly is not complete enough to be saved. /datum/controller/subsystem/processing/circuit/proc/save_electronic_assembly(obj/item/device/electronic_assembly/assembly) - var/list/assembly_components = assembly.return_all_components() - // No components? Don't even try to save it. - if(!length(assembly_components)) + if(!length(assembly.assembly_components)) return @@ -160,7 +158,7 @@ // Block 2. Components. var/list/components = list() - for(var/c in assembly_components) + for(var/c in assembly.assembly_components) var/obj/item/integrated_circuit/component = c components.Add(list(component.save())) blocks["components"] = components @@ -170,18 +168,18 @@ var/list/wires = list() var/list/saved_wires = list() - for(var/c in assembly_components) + for(var/c in assembly.assembly_components) var/obj/item/integrated_circuit/component = c var/list/all_pins = component.inputs + component.outputs + component.activators for(var/p in all_pins) var/datum/integrated_io/pin = p - var/list/params = pin.get_pin_parameters(assembly_components) + var/list/params = pin.get_pin_parameters() var/text_params = params.Join() for(var/p2 in pin.linked) var/datum/integrated_io/pin2 = p2 - var/list/params2 = pin2.get_pin_parameters(assembly_components) + var/list/params2 = pin2.get_pin_parameters() var/text_params2 = params2.Join() // Check if we already saved an opposite version of this wire @@ -318,23 +316,20 @@ // Block 2. Components. - var/list/assembly_components = list() for(var/component_params in blocks["components"]) var/obj/item/integrated_circuit/component_path = all_components[component_params["type"]] var/obj/item/integrated_circuit/component = new component_path(assembly) - component.assembly = assembly + assembly.add_component(component) component.load(component_params) - assembly_components.Add(component) // Block 3. Wires. if(blocks["wires"]) for(var/w in blocks["wires"]) var/list/wire = w - var/datum/integrated_io/IO = assembly.get_pin_ref_list(wire[1], assembly_components) - var/datum/integrated_io/IO2 = assembly.get_pin_ref_list(wire[2], assembly_components) - IO.linked |= IO2 - IO2.linked |= IO + var/datum/integrated_io/IO = assembly.get_pin_ref_list(wire[1]) + var/datum/integrated_io/IO2 = assembly.get_pin_ref_list(wire[2]) + IO.connect_pin(IO2) assembly.forceMove(loc) return assembly diff --git a/code/modules/integrated_electronics/core/special_pins/char_pin.dm b/code/modules/integrated_electronics/core/special_pins/char_pin.dm index 1d859f86b5..3e466891eb 100644 --- a/code/modules/integrated_electronics/core/special_pins/char_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/char_pin.dm @@ -3,7 +3,7 @@ name = "char pin" /datum/integrated_io/char/ask_for_pin_data(mob/user) - var/new_data = stripped_input(user, "Please type in one character.","[src] char writing") + var/new_data = stripped_input(user, "Please type in one character.","[src] char writing", no_trim = TRUE) if(holder.check_interactivity(user) ) to_chat(user, "You input [new_data ? "new_data" : "NULL"] into the pin.") write_data_to_pin(new_data) diff --git a/code/modules/integrated_electronics/core/special_pins/index_pin.dm b/code/modules/integrated_electronics/core/special_pins/index_pin.dm new file mode 100644 index 0000000000..802a2612d3 --- /dev/null +++ b/code/modules/integrated_electronics/core/special_pins/index_pin.dm @@ -0,0 +1,21 @@ +// These pins can only contain integer numbers between 1 and IC_MAX_LIST_LENGTH. Null is not allowed. +/datum/integrated_io/index + name = "index pin" + data = 1 + +/datum/integrated_io/index/ask_for_pin_data(mob/user) + var/new_data = input("Please type in an index.","[src] index writing") as num + if(isnum(new_data) && holder.check_interactivity(user)) + to_chat(user, "You input [new_data] into the pin.") + write_data_to_pin(new_data) + +/datum/integrated_io/index/write_data_to_pin(new_data) + if(isnull(new_data)) + new_data = 1 + + if(isnum(new_data)) + data = Clamp(round(new_data), 1, IC_MAX_LIST_LENGTH) + holder.on_data_written() + +/datum/integrated_io/index/display_pin_type() + return IC_FORMAT_INDEX diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm index ddf3a48362..8a6f80ea63 100644 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/list_pin.dm @@ -112,6 +112,10 @@ var/list/new_list = new_data data = new_list.Copy(max(1,new_list.len - IC_MAX_LIST_LENGTH+1),0) holder.on_data_written() + else if(isnull(new_data)) // Clear the list + var/list/my_list = data + my_list.Cut() + holder.on_data_written() /datum/integrated_io/lists/display_pin_type() return IC_FORMAT_LIST diff --git a/code/modules/integrated_electronics/core/special_pins/string_pin.dm b/code/modules/integrated_electronics/core/special_pins/string_pin.dm index a619e7450f..49d6aa9554 100644 --- a/code/modules/integrated_electronics/core/special_pins/string_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/string_pin.dm @@ -3,7 +3,7 @@ name = "string pin" /datum/integrated_io/string/ask_for_pin_data(mob/user) - var/new_data = stripped_input(user, "Please type in a string.","[src] string writing") + var/new_data = stripped_input(user, "Please type in a string.","[src] string writing", no_trim = TRUE) if(holder.check_interactivity(user) ) to_chat(user, "You input [new_data ? "[new_data]" : "NULL"] into the pin.") write_data_to_pin(new_data) diff --git a/code/modules/integrated_electronics/core/wirer.dm b/code/modules/integrated_electronics/core/wirer.dm index c1caba00cd..bfbbfa4864 100644 --- a/code/modules/integrated_electronics/core/wirer.dm +++ b/code/modules/integrated_electronics/core/wirer.dm @@ -8,7 +8,7 @@ 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/electronic_assemblies.dmi' + icon = 'icons/obj/assemblies/electronic_tools.dmi' icon_state = "wirer-wire" flags_1 = CONDUCT_1 w_class = WEIGHT_CLASS_SMALL @@ -38,8 +38,7 @@ if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") return - selected_io.linked |= io - io.linked |= selected_io + selected_io.connect_pin(io) to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].") mode = WIRE @@ -64,8 +63,7 @@ the same pin is rather moot.") return if(selected_io in io.linked) - io.linked.Remove(selected_io) - selected_io.linked.Remove(io) + selected_io.disconnect_pin(io) to_chat(user, "You disconnect \the [selected_io.holder]'s [selected_io.name] from \ \the [io.holder]'s [io.name].") selected_io.holder.interact(user) // This is to update the UI. diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 373a059f45..272dbef071 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -175,6 +175,7 @@ extended_desc = "This circuits splits a given string into two, based on the string, and the index value. \ The index splits the string after the given index, including spaces. So 'a person' with an index of '3' \ will split into 'a p' and 'erson'." + icon_state = "split" complexity = 4 inputs = list( "string to split" = IC_PINTYPE_STRING, @@ -232,6 +233,7 @@ 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')." + icon_state = "split" complexity = 4 inputs = list( "string to split" = IC_PINTYPE_STRING, @@ -245,8 +247,8 @@ /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 )) + var/delimiter = get_pin_data(IC_INPUT, 2) + set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) push_data() activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm index d28bb72e33..20b80926c8 100644 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -14,15 +14,15 @@ activators = list("select" = IC_PINTYPE_PULSE_IN, "on select" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 4 - var/number_of_inputs = 2 + var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/multiplexer/New() - for(var/i = 1 to number_of_inputs) +/obj/item/integrated_circuit/transfer/multiplexer/Initialize() + for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. - complexity = number_of_inputs - ..() - desc += " It has [number_of_inputs] input pins." + complexity = number_of_pins + . = ..() + desc += " It has [number_of_pins] input pins." extended_desc += " This multiplexer has a range from 1 to [inputs.len - 1]." /obj/item/integrated_circuit/transfer/multiplexer/do_work() @@ -35,20 +35,20 @@ /obj/item/integrated_circuit/transfer/multiplexer/medium name = "four multiplexer" - number_of_inputs = 4 icon_state = "mux4" + number_of_pins = 4 /obj/item/integrated_circuit/transfer/multiplexer/large name = "eight multiplexer" - number_of_inputs = 8 w_class = WEIGHT_CLASS_SMALL icon_state = "mux8" + number_of_pins = 8 /obj/item/integrated_circuit/transfer/multiplexer/huge name = "sixteen multiplexer" icon_state = "mux16" w_class = WEIGHT_CLASS_SMALL - number_of_inputs = 16 + number_of_pins = 16 /obj/item/integrated_circuit/transfer/demultiplexer name = "two demultiplexer" @@ -62,16 +62,15 @@ activators = list("select" = IC_PINTYPE_PULSE_IN, "on select" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 4 - var/number_of_outputs = 2 + var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/demultiplexer/New() - for(var/i = 1 to number_of_outputs) - // outputs += "output [i]" +/obj/item/integrated_circuit/transfer/demultiplexer/Initialize() + for(var/i = 1 to number_of_pins) outputs["output [i]"] = IC_PINTYPE_ANY - complexity = number_of_outputs + complexity = number_of_pins - ..() - desc += " It has [number_of_outputs] output pins." + . = ..() + desc += " It has [number_of_pins] output pins." extended_desc += " This demultiplexer has a range from 1 to [outputs.len]." /obj/item/integrated_circuit/transfer/demultiplexer/do_work() @@ -84,19 +83,19 @@ /obj/item/integrated_circuit/transfer/demultiplexer/medium name = "four demultiplexer" icon_state = "dmux4" - number_of_outputs = 4 + number_of_pins = 4 /obj/item/integrated_circuit/transfer/demultiplexer/large name = "eight demultiplexer" icon_state = "dmux8" w_class = WEIGHT_CLASS_SMALL - number_of_outputs = 8 + number_of_pins = 8 /obj/item/integrated_circuit/transfer/demultiplexer/huge name = "sixteen demultiplexer" icon_state = "dmux16" w_class = WEIGHT_CLASS_SMALL - number_of_outputs = 16 + number_of_pins = 16 /obj/item/integrated_circuit/transfer/pulsedemultiplexer name = "two pulse demultiplexer" @@ -110,37 +109,36 @@ activators = list("select" = IC_PINTYPE_PULSE_IN) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 4 - var/number_of_outputs = 2 + var/number_of_pins = 2 -/obj/item/integrated_circuit/transfer/pulsedemultiplexer/New() - for(var/i = 1 to number_of_outputs) - // outputs += "output [i]" +/obj/item/integrated_circuit/transfer/pulsedemultiplexer/Initialize() + for(var/i = 1 to number_of_pins) activators["output [i]"] = IC_PINTYPE_PULSE_OUT - complexity = number_of_outputs + complexity = number_of_pins - ..() - desc += " It has [number_of_outputs] output pins." + . = ..() + desc += " It has [number_of_pins] output pins." extended_desc += " This pulse demultiplexer has a range from 1 to [activators.len - 1]." /obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work() var/output_index = get_pin_data(IC_INPUT, 1) - if(output_index == Clamp(output_index, 1, number_of_outputs)) + if(output_index == Clamp(output_index, 1, number_of_pins)) activate_pin(round(output_index + 1 ,1)) /obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium name = "four pulse demultiplexer" icon_state = "dmux4" - number_of_outputs = 4 + number_of_pins = 4 /obj/item/integrated_circuit/transfer/pulsedemultiplexer/large name = "eight pulse demultiplexer" icon_state = "dmux8" w_class = WEIGHT_CLASS_SMALL - number_of_outputs = 8 + number_of_pins = 8 /obj/item/integrated_circuit/transfer/pulsedemultiplexer/huge name = "sixteen pulse demultiplexer" icon_state = "dmux16" w_class = WEIGHT_CLASS_SMALL - number_of_outputs = 16 \ No newline at end of file + number_of_pins = 16 \ No newline at end of file diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b579901a2d..aa486f8f98 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -248,10 +248,12 @@ /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." + relative coordinates, total amount of reagents, maximum amount of reagents, density and opacity of the referenced object." icon_state = "video_camera" complexity = 6 - inputs = list("\ target" = IC_PINTYPE_REF) + inputs = list( + "target" = IC_PINTYPE_REF + ) outputs = list( "name" = IC_PINTYPE_STRING, "description" = IC_PINTYPE_STRING, @@ -260,8 +262,14 @@ "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) + "density" = IC_PINTYPE_BOOLEAN, + "opacity" = IC_PINTYPE_BOOLEAN, + ) + 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 @@ -273,8 +281,6 @@ 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) @@ -287,6 +293,8 @@ tr = H.reagents.total_volume set_pin_data(IC_OUTPUT, 6, mr) set_pin_data(IC_OUTPUT, 7, tr) + set_pin_data(IC_OUTPUT, 8, H.density) + set_pin_data(IC_OUTPUT, 9, H.opacity) push_data() activate_pin(2) else diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm index 0d622f58e2..aa373c9940 100644 --- a/code/modules/integrated_electronics/subtypes/lists.dm +++ b/code/modules/integrated_electronics/subtypes/lists.dm @@ -2,29 +2,41 @@ /obj/item/integrated_circuit/lists complexity = 1 inputs = list( - "input" = IC_PINTYPE_LIST - ) - outputs = list("result" = IC_PINTYPE_STRING) - activators = list("compute" = IC_PINTYPE_PULSE_IN, "on computed" = IC_PINTYPE_PULSE_OUT) + "input" = IC_PINTYPE_LIST + ) + outputs = list( + "result" = IC_PINTYPE_STRING + ) + activators = list( + "compute" = IC_PINTYPE_PULSE_IN, + "on computed" = IC_PINTYPE_PULSE_OUT + ) category_text = "Lists" power_draw_per_use = 20 /obj/item/integrated_circuit/lists/pick name = "pick circuit" desc = "This circuit will pick a random element from the input list, and output said element." - extended_desc = "Will output null if the list is empty. Input list is unmodified." + extended_desc = "Input list is unmodified." icon_state = "addition" + outputs = list( + "result" = IC_PINTYPE_ANY + ) + activators = list( + "compute" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT, + ) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/lists/pick/do_work() - var/result = null var/list/input_list = get_pin_data(IC_INPUT, 1) // List pins guarantee that there is a list inside, even if just an empty one. if(input_list.len) - result = pick(input_list) - - set_pin_data(IC_OUTPUT, 1, result) - push_data() - activate_pin(2) + set_pin_data(IC_OUTPUT, 1, pick(input_list)) + push_data() + activate_pin(2) + else + activate_pin(3) /obj/item/integrated_circuit/lists/append @@ -34,10 +46,10 @@ inputs = list( "list to append" = IC_PINTYPE_LIST, "input" = IC_PINTYPE_ANY - ) + ) outputs = list( "appended list" = IC_PINTYPE_LIST - ) + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH @@ -52,6 +64,7 @@ push_data() activate_pin(2) + /obj/item/integrated_circuit/lists/search name = "search circuit" desc = "This circuit will get the index location of the desired element in a list." @@ -59,19 +72,30 @@ inputs = list( "list" = IC_PINTYPE_LIST, "item" = IC_PINTYPE_ANY - ) + ) outputs = list( "index" = IC_PINTYPE_NUMBER - ) + ) + activators = list( + "compute" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT, + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/lists/search/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) - var/item = get_pin_data(IC_INPUT, 2) - set_pin_data(IC_OUTPUT, 1, input_list.Find(item)) + var/output = input_list.Find(get_pin_data(IC_INPUT, 2)) + + set_pin_data(IC_OUTPUT, 1, output) push_data() - activate_pin(2) + + if(output) + activate_pin(2) + else + activate_pin(3) + /obj/item/integrated_circuit/lists/at name = "at circuit" @@ -79,31 +103,46 @@ extended_desc = "If there is no element with such index, result will be null." inputs = list( "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_NUMBER - ) - outputs = list("item" = IC_PINTYPE_ANY) + "index" = IC_PINTYPE_INDEX + ) + outputs = list( + "item" = IC_PINTYPE_ANY + ) + activators = list( + "compute" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT, + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/lists/at/do_work() var/list/input_list = get_pin_data(IC_INPUT, 1) var/index = get_pin_data(IC_INPUT, 2) - var/item = input_list[index] - set_pin_data(IC_OUTPUT, 1, item) + + // Check if index is valid + if(index > input_list.len) + set_pin_data(IC_OUTPUT, 1, null) + push_data() + activate_pin(3) + return + + set_pin_data(IC_OUTPUT, 1, input_list[index]) push_data() activate_pin(2) + /obj/item/integrated_circuit/lists/delete name = "delete circuit" desc = "This circuit will remove an element from a list by the index." extended_desc = "If there is no element with such index, result list will be unchanged." inputs = list( "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_NUMBER - ) + "index" = IC_PINTYPE_INDEX + ) outputs = list( "item" = IC_PINTYPE_LIST - ) + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH @@ -111,26 +150,34 @@ var/list/input_list = get_pin_data(IC_INPUT, 1) var/list/red_list = list() var/index = get_pin_data(IC_INPUT, 2) - for(var/j in 1 to input_list.len) - var/I = input_list[j] - if(j != index) - red_list.Add(I) + + if(length(input_list)) + for(var/j in 1 to input_list.len) + var/I = input_list[j] + if(j != index) + red_list.Add(I) set_pin_data(IC_OUTPUT, 1, red_list) push_data() activate_pin(2) + /obj/item/integrated_circuit/lists/write name = "write circuit" desc = "This circuit will write an element to a list at the given index location." - extended_desc = "If there is no element with such index, it will give the same list, as before." + extended_desc = "If there is no element with such index, it will give the same list as before." inputs = list( "list" = IC_PINTYPE_LIST, - "index" = IC_PINTYPE_NUMBER, + "index" = IC_PINTYPE_INDEX, "item" = IC_PINTYPE_ANY - ) + ) outputs = list( "redacted list" = IC_PINTYPE_LIST - ) + ) + activators = list( + "compute" = IC_PINTYPE_PULSE_IN, + "on success" = IC_PINTYPE_PULSE_OUT, + "on failure" = IC_PINTYPE_PULSE_OUT, + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH @@ -138,7 +185,15 @@ var/list/input_list = get_pin_data(IC_INPUT, 1) var/index = get_pin_data(IC_INPUT, 2) var/item = get_pin_data(IC_INPUT, 3) - if(!islist(item)) + + // Check if index is valid + if(index > input_list.len) + set_pin_data(IC_OUTPUT, 1, input_list) + push_data() + activate_pin(3) + return + + if(!islist(item)) var/list/red_list = input_list.Copy() //crash proof red_list[index] = item set_pin_data(IC_OUTPUT, 1, red_list) @@ -146,7 +201,7 @@ activate_pin(2) -obj/item/integrated_circuit/lists/len +/obj/item/integrated_circuit/lists/len name = "len circuit" desc = "This circuit will return the length of the list." inputs = list( @@ -154,7 +209,7 @@ obj/item/integrated_circuit/lists/len ) outputs = list( "item" = IC_PINTYPE_NUMBER - ) + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH @@ -169,20 +224,20 @@ obj/item/integrated_circuit/lists/len name = "join text circuit" desc = "This circuit will combine two lists into one and output it as a string." extended_desc = "Default settings will encode the entire list into a string." + icon_state = "join" inputs = list( "list to join" = IC_PINTYPE_LIST,// - "delimiter" = IC_PINTYPE_CHAR, - "start" = IC_PINTYPE_NUMBER, + "delimiter" = IC_PINTYPE_STRING, + "start" = IC_PINTYPE_INDEX, "end" = IC_PINTYPE_NUMBER - ) + ) inputs_default = list( - "2" = ",", - "3" = 1, + "2" = ", ", "4" = 0 - ) + ) outputs = list( "joined text" = IC_PINTYPE_STRING - ) + ) icon_state = "addition" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH @@ -200,3 +255,92 @@ obj/item/integrated_circuit/lists/len set_pin_data(IC_OUTPUT, 1, result) push_data() activate_pin(2) + + +/obj/item/integrated_circuit/lists/constructor + name = "large list constructor" + desc = "This circuit will build a list out of sixteen input values." + icon_state = "constr8" + inputs = list() + outputs = list( + "result" = IC_PINTYPE_LIST + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/number_of_pins = 16 + +/obj/item/integrated_circuit/lists/constructor/Initialize() + for(var/i = 1 to number_of_pins) + inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. + complexity = number_of_pins / 2 + . = ..() + +/obj/item/integrated_circuit/lists/constructor/do_work() + var/list/output_list = list() + for(var/i = 1 to number_of_pins) + var/data = get_pin_data(IC_INPUT, i) + + // No nested lists + if(!islist(data)) + output_list += data + else + output_list += null + + set_pin_data(IC_OUTPUT, 1, output_list) + push_data() + activate_pin(2) + +/obj/item/integrated_circuit/lists/constructor/small + name = "list constructor" + desc = "This circuit will build a list out of four input values." + icon_state = "constr" + number_of_pins = 4 + +/obj/item/integrated_circuit/lists/constructor/medium + name = "medium list constructor" + desc = "This circuit will build a list out of eight input values." + icon_state = "constr8" + number_of_pins = 8 + + +/obj/item/integrated_circuit/lists/deconstructor + name = "large list deconstructor" + desc = "This circuit will write first sixteen entries of input list, starting with index, into the output values." + icon_state = "deconstr8" + inputs = list( + "input" = IC_PINTYPE_LIST, + "index" = IC_PINTYPE_INDEX + ) + outputs = list() + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/number_of_pins = 4 + +/obj/item/integrated_circuit/lists/deconstructor/Initialize() + for(var/i = 1 to number_of_pins) + outputs["output [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. + complexity = number_of_pins / 2 + . = ..() + +/obj/item/integrated_circuit/lists/deconstructor/do_work() + var/list/input_list = get_pin_data(IC_INPUT, 1) + var/start_index = get_pin_data(IC_INPUT, 2) + + for(var/i = 1 to number_of_pins) + var/list_index = i + start_index - 1 + if(list_index > input_list.len) + set_pin_data(IC_OUTPUT, i, null) + else + set_pin_data(IC_OUTPUT, i, input_list[list_index]) + + push_data() + activate_pin(2) + +/obj/item/integrated_circuit/lists/deconstructor/small + name = "list deconstructor" + desc = "This circuit will write first four entries of input list, starting with index, into the output values." + icon_state = "deconstr" + number_of_pins = 4 + +/obj/item/integrated_circuit/lists/deconstructor/medium + name = "medium list deconstructor" + desc = "This circuit will write first eight entries of input list, starting with index, into the output values." + number_of_pins = 8 diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index fb78915f11..bc22204a2d 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -346,9 +346,9 @@ /obj/item/integrated_circuit/manipulation/thrower name = "thrower" - desc = "A compact launcher to throw things from inside or nearby tiles" - extended_desc = "The first and second inputs need to be numbers. They are coordinates to throw thing at, relative to the machine itself. \ - The 'fire' activator will cause the mechanism to attempt to throw thing at the coordinates, if possible. Note that the \ + desc = "A compact launcher to throw things from inside or nearby tiles." + extended_desc = "The first and second inputs need to be numbers. They are coordinates to throw thing at, relative to the machine itself. \ + The 'fire' activator will cause the mechanism to attempt to throw thing at the coordinates, if possible. Note that the \ projectile need to be inside the machine, or to be on an adjacent tile, and to be up to medium size." complexity = 15 w_class = WEIGHT_CLASS_SMALL @@ -365,26 +365,39 @@ spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_COMBAT = 4) power_draw_per_use = 50 + var/max_w_class = WEIGHT_CLASS_NORMAL /obj/item/integrated_circuit/manipulation/thrower/do_work() - var/datum/integrated_io/target_x = inputs[1] - var/datum/integrated_io/target_y = inputs[2] - var/datum/integrated_io/projectile = inputs[3] - if(!isweakref(projectile.data)) - return - var/obj/item/A = projectile.data.resolve() - if(A.anchored || (A.w_class > WEIGHT_CLASS_NORMAL)) - return - var/turf/T = get_turf(assembly) - if(!(A.Adjacent(T) || (A in assembly.GetAllContents()))) - return - if(assembly) - if(isnum(target_x.data)) - target_x.data = round(target_x.data, 1) - if(isnum(target_y.data)) - target_y.data = round(target_y.data, 1) - var/_x = Clamp(T.x + target_x.data, 0, world.maxx) - var/_y = Clamp(T.y + target_y.data, 0, world.maxy) + var/target_x_rel = round(get_pin_data(IC_INPUT, 1)) + var/target_y_rel = round(get_pin_data(IC_INPUT, 2)) + var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item) - A.forceMove(drop_location()) - A.throw_at(locate(_x, _y, T.z), round(Clamp(sqrt(target_x.data*target_x.data+target_y.data*target_y.data),0,8),1), 3) + if(!A || A.anchored || (A.w_class > max_w_class)) + return + + var/atom/movable/acting_object = get_object() + if(!A.Adjacent(acting_object) && !(A in acting_object.GetAllContents())) + return + + var/turf/T = get_turf(acting_object) + if(!T) + return + + // No ejecting assembly components or power cells + if(assembly) + if((A in assembly.assembly_components) || A == assembly.battery) + return + + // If the item is in mob's inventory, try to remove it from there. + if(ismob(A.loc)) + var/mob/living/M = A.loc + if(!M.temporarilyRemoveItemFromInventory(A)) + return + + + var/x_abs = Clamp(T.x + target_x_rel, 0, world.maxx) + var/y_abs = Clamp(T.y + target_y_rel, 0, world.maxy) + var/range = round(Clamp(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1) + + A.forceMove(drop_location()) + A.throw_at(locate(x_abs, y_abs, T.z), range, 3) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index 548ea3fa1d..c7fed41847 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -11,12 +11,12 @@ power_draw_per_use = 1 var/number_of_pins = 1 -/obj/item/integrated_circuit/memory/New() +/obj/item/integrated_circuit/memory/Initialize() for(var/i = 1 to number_of_pins) inputs["input [i]"] = IC_PINTYPE_ANY // This is just a string since pins don't get built until ..() is called. outputs["output [i]"] = IC_PINTYPE_ANY complexity = number_of_pins - ..() + . = ..() /obj/item/integrated_circuit/memory/examine(mob/user) ..() diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 16839cc509..7cb2479ec9 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -126,24 +126,6 @@ power_draw_per_use = 10 var/list/sounds = list() -/obj/item/integrated_circuit/output/text_to_speech - name = "text-to-speech circuit" - desc = "Takes any string as an input and will make the device say the string when pulsed." - extended_desc = "This unit is more advanced than the plain speaker circuit, able to transpose any valid text to speech." - icon_state = "speaker" - complexity = 12 - inputs = list("text" = IC_PINTYPE_STRING) - outputs = list() - activators = list("to speech" = IC_PINTYPE_PULSE_IN) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - power_draw_per_use = 60 - -/obj/item/integrated_circuit/output/text_to_speech/do_work() - text = get_pin_data(IC_INPUT, 1) - if(!isnull(text)) - var/obj/O = assembly ? loc : assembly - O.say(sanitize(text)) - /obj/item/integrated_circuit/output/sound/Initialize() .= ..() extended_desc = list() @@ -221,6 +203,26 @@ spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 1) + +/obj/item/integrated_circuit/output/text_to_speech + name = "text-to-speech circuit" + desc = "Takes any string as an input and will make the device say the string when pulsed." + extended_desc = "This unit is more advanced than the plain speaker circuit, able to transpose any valid text to speech." + icon_state = "speaker" + complexity = 12 + inputs = list("text" = IC_PINTYPE_STRING) + outputs = list() + activators = list("to speech" = IC_PINTYPE_PULSE_IN) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 60 + +/obj/item/integrated_circuit/output/text_to_speech/do_work() + text = get_pin_data(IC_INPUT, 1) + if(!isnull(text)) + var/atom/movable/A = get_object() + A.say(sanitize(text)) + + /obj/item/integrated_circuit/output/video_camera name = "video camera circuit" desc = "Takes a string as a name and a boolean to determine whether it is on, and uses this to be a camera linked to the research network." @@ -291,19 +293,26 @@ /obj/item/integrated_circuit/output/led name = "light-emitting diode" - desc = "Takes a boolean value in, and if the boolean value is 'true-equivalent', the LED will be marked as lit on examine." + desc = "RGB LED. Takes a boolean value in, and if the boolean value is 'true-equivalent', the LED will be marked as lit on examine." extended_desc = "TRUE-equivalent values are: Non-empty strings, non-zero numbers, and valid refs." complexity = 0.1 icon_state = "led" - inputs = list("lit" = IC_PINTYPE_BOOLEAN) + inputs = list( + "lit" = IC_PINTYPE_BOOLEAN, + "color" = IC_PINTYPE_COLOR + ) outputs = list() activators = list() + inputs_default = list( + "2" = "#FF0000" + ) power_draw_idle = 0 // Raises to 1 when lit. spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - var/led_color + var/led_color = "#FF0000" /obj/item/integrated_circuit/output/led/on_data_written() power_draw_idle = get_pin_data(IC_INPUT, 1) ? 1 : 0 + led_color = get_pin_data(IC_INPUT, 2) /obj/item/integrated_circuit/output/led/power_fail() set_pin_data(IC_INPUT, 1, FALSE) @@ -317,39 +326,3 @@ text_output += "\an ["\improper[name]"] labeled '[displayed_name]'" text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit *" : "unlit"]." to_chat(user, text_output) - -/obj/item/integrated_circuit/output/led/red - name = "red LED" - led_color = "#FF0000" - -/obj/item/integrated_circuit/output/led/orange - name = "orange LED" - led_color = "#FF9900" - -/obj/item/integrated_circuit/output/led/yellow - name = "yellow LED" - led_color = "#FFFF00" - -/obj/item/integrated_circuit/output/led/green - name = "green LED" - led_color = "#008000" - -/obj/item/integrated_circuit/output/led/blue - name = "blue LED" - led_color = "#0000FF" - -/obj/item/integrated_circuit/output/led/purple - name = "purple LED" - led_color = "#800080" - -/obj/item/integrated_circuit/output/led/cyan - name = "cyan LED" - led_color = "#00FFFF" - -/obj/item/integrated_circuit/output/led/white - name = "white LED" - led_color = "#FFFFFF" - -/obj/item/integrated_circuit/output/led/pink - name = "pink LED" - led_color = "#FF00FF" diff --git a/icons/obj/assemblies/electronic_components.dmi b/icons/obj/assemblies/electronic_components.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cdfa386233450202f7bf61db8c8c29cfbf80bb14 GIT binary patch literal 21210 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 N*jhPQ)>z<^{sZq2DeV9N literal 0 HcmV?d00001 diff --git a/icons/obj/assemblies/electronic_misc.dmi b/icons/obj/assemblies/electronic_misc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..226b82e4999a004506b3a3385e22666fe41d1ba5 GIT binary patch literal 2623 zcmY+G3pkW%8^>Q}YpgH{i^6EvS7ei8V=`+9MUqiYl^i06gkf@KhG>Kwc4Y~Z=~|H$ zvsz(R#`%!bOXL_+4Q7zT7=|&JZ}e^Zecy9E&-MPU|8?Kb_1^FEzn|+(##}ltDSlWS z002oVOY_SBAfhTLw;8&V~vre*lJthP7BA;-Dqq z4rDq5DJd!C<>f6cEt$f2ZveOe%+~Iapa-a|tR#_0+S=NUVq#=68OR0P-Q6Q1A}|;X zAOL_KK)ADT%Y_SIn`b;&RXTVUJB@lGx(eP8a=8qO%$4Z0-ToVD-}PZo<9 z9lA6A^8VfaMj16sPH~r%l4t7HzP+@iT^UXJgwU#vK0#>5mFo~0XKLP99Gph%cX z0b;ShExluHgpyRo9_VWi>>7{L4Zjh7CiI42b@lBH8`(vPBA?CG zneM{E3g#4pGdtSGp0o9fxKu*3Cb&vwhU~w&FGkW>H;Bl{JT$gqup4_gk1g?sW@nSg zHlX4YBqx7$x+5a=+Ezs##ewp}P&qPAn|NBEeH4L zfi)DJ*toOX#6u;lRSxCDA?kZqI5!~1{BdftXZ??CMlhR=OoiB^64=>_M9j8UzSddM zP5V>g&_(yS@&9Oyyp9ZT5L;4M*hD4`tUY)hdzhzxw~IA!v`4A zoJcaNCFVfMc>eG3KZ#}yEUAf_7<_$Qw{4#Ty7-B8ibt$+O~b^e0=@rvHI&?~U4`9IqL{c%B5(fm%7qNqcYAib)_0wZ9^joIBIjZD zU_8N#P}7F=Q6PGJosl$WdN3Q`(LUZ#$_=mXoB0O0j?<^@NQ5mhpT}?%Z!gmAS9^V) zzam`eMj(1#?BrjgtxFhe1fAdw>ka)U>B&>8AnD%1HzZgl{kJvdSZ2^qW?ASgd4;-3 zP;u4Z5EnL{9)wN+cY7A`ePjJ6RwIe`giT|nUQP(pX^m^DCR)G2)+G?K*5sa{!LXQl z?d)R1d6QT7JW{L(Zrc8+MJjX$nRVB*2=o+RFU(7 zmA!GQ>Ld&MEcngqQ4!6w4^@y`#>yti`A57t4li0kr^=f;z%e%;AFhej8Zn_q3+R_Ri%C|*+U5)a1Sr;;fcr@;QZA7_}h3kh@U1}K9}(XDQ- za*@dair#sAziZdY*TaGEE$d7lzR1RibT37^4W8GB*(cx0SaAqIZ}@7i8sO9Hd5B;E z7Fv2uOO&dMtlp##kaBEs8UIeX#y2=UJXzPraO+JH{LA7R5OVe8l{g$FL4JXlT8q$8&+s zT1dLuG1@Sf_cZBm`m1=EAG@tl(dSh#2HH826EsKPt#~=D)lwe>c%#qB5=vO0FFtLa z&YE<(^BYfRvZ&C#;+>h`*ed?>1kKmU`8>z-C0>+jd2m#4ehg2q4ph($ literal 0 HcmV?d00001 diff --git a/icons/obj/assemblies/electronic_setups.dmi b/icons/obj/assemblies/electronic_setups.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7074d08328cc106e8c66d0e3e70187f9433dd21f GIT binary patch literal 3757 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 NN8G$!nFm9&{ssDjXCwds literal 0 HcmV?d00001 diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi deleted file mode 100644 index 8faa77ad02105b5787ce3b64b0e7143f9429b4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41014 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 VVZp8!;CEx8^Jg#V7wFnP_&?y&aX

[jointext(words, null)]