From 801a162ba7f3e5bdeef5526bfe7e4151ce30f3e7 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sat, 24 Sep 2016 18:06:11 -0400 Subject: [PATCH] Ports the Port of Circuits Ports PsiOmegaDelta's port of integrated circuits, which has several improvements in code quality. Ports a few small things like the weakref datum and some macros. --- code/_macros.dm | 4 + code/datums/weakref.dm | 31 ++ .../objects/items/weapons/storage/storage.dm | 11 + code/game/sound.dm | 4 +- .../integrated_electronics/_defines.dm | 323 +++++++--------- .../integrated_electronics/arithmetic.dm | 170 ++++---- .../integrated_electronics/assemblies.dm | 114 +++--- .../integrated_electronics/converters.dm | 144 +++---- .../integrated_electronics/coordinate.dm | 65 +--- .../integrated_electronics/data_transfer.dm | 88 ++--- .../integrated_electronics/input_output.dm | 365 +++++++----------- code/modules/integrated_electronics/logic.dm | 200 ++++------ .../integrated_electronics/manipulation.dm | 71 ++-- code/modules/integrated_electronics/memory.dm | 126 ++++-- code/modules/integrated_electronics/time.dm | 114 +++--- code/modules/integrated_electronics/tools.dm | 102 +++-- .../integrated_electronics/~defines.dm | 6 + code/modules/research/designs.dm | 32 +- polaris.dme | 2 + 19 files changed, 884 insertions(+), 1088 deletions(-) create mode 100644 code/datums/weakref.dm create mode 100644 code/modules/integrated_electronics/~defines.dm diff --git a/code/_macros.dm b/code/_macros.dm index 5b94c872cb..1038b6a2e4 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -42,6 +42,10 @@ #define isxeno(A) istype(A, /mob/living/simple_animal/xeno) +#define isweakref(A) istype(A, /weakref) + #define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") #define to_chat(target, message) target << message + +#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE) diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm new file mode 100644 index 0000000000..1a7d844ca8 --- /dev/null +++ b/code/datums/weakref.dm @@ -0,0 +1,31 @@ +/datum + var/weakref/weakref + +/datum/Destroy() + weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. + . = ..() + +//obtain a weak reference to a datum +/proc/weakref(datum/D) + if(D.gcDestroyed) + return + if(!D.weakref) + D.weakref = new/weakref(D) + return D.weakref + +/weakref + var/ref + +/weakref/New(datum/D) + ref = "\ref[D]" + +/weakref/Destroy() + // A weakref datum should not be manually destroyed as it is a shared resource, + // rather it should be automatically collected by the BYOND GC when all references are gone. + return 0 + +/weakref/proc/resolve() + var/datum/D = locate(ref) + if(D && D.weakref == src) + return D + return null \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index cddb84ca18..e691ed2795 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -630,3 +630,14 @@ return ITEMSIZE_COST_HUGE else return ITEMSIZE_COST_NO_CONTAINER + +/obj/item/weapon/storage/proc/make_exact_fit() + storage_slots = contents.len + + can_hold.Cut() + max_w_class = 0 + max_storage_space = 0 + for(var/obj/item/I in src) + can_hold[I.type]++ + max_w_class = max(I.w_class, max_w_class) + max_storage_space += I.get_storage_cost() diff --git a/code/game/sound.dm b/code/game/sound.dm index fea1bdcb38..8c3abb7a0a 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -47,7 +47,7 @@ var/list/hiss_sound = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','soun var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg') //var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg') -/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global) +/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/frequency) soundin = get_sfx(soundin) // same sound for everyone @@ -55,7 +55,7 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur error("[source] is an area and is trying to make the sound: [soundin]") return - var/frequency = get_rand_frequency() // Same frequency for everybody + frequency = isnull(frequency) ? get_rand_frequency() : frequency // Same frequency for everybody var/turf/turf_source = get_turf(source) // Looping through the player list has the added bonus of working for mobs inside containers diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index 702ae47fc0..a0b381f3a6 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -1,3 +1,7 @@ +#define IC_INPUT "input" +#define IC_OUTPUT "output" +#define IC_ACTIVATOR "activator" + #define DATA_CHANNEL "data channel" #define PULSE_CHANNEL "pulse channel" @@ -11,66 +15,37 @@ var/list/inputs = list() var/list/outputs = list() var/list/activators = list() - var/number_of_inputs = 0 //This is how many input pins are created - var/number_of_outputs = 0 //Likewise for output - var/number_of_activators = 0 //Guess - var/list/input_names = list() - var/list/output_names = list() - var/list/activator_names = list() - var/last_used = 0 //Uses world.time + var/next_use = 0 //Uses world.time var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. - var/cooldown_per_use = 2 SECONDS + var/cooldown_per_use = 1 SECOND + var/category = /obj/item/integrated_circuit // Used by the toolsets to filter out category types /obj/item/integrated_circuit/examine(mob/user) ..() - user << "This board has [inputs.len] input [inputs.len != 1 ? "pins" : "pin"] and \ - [outputs.len] output [outputs.len != 1 ? "pins" : "pin"]." + to_chat(user, "This board has [inputs.len] input pin\s and [outputs.len] output pin\s.") for(var/datum/integrated_io/input/I in inputs) if(I.linked.len) - user << "\The [I.name] is connected to [I.get_linked_to_desc()]." + to_chat(user, "The [I] is connected to [I.get_linked_to_desc()].") for(var/datum/integrated_io/output/O in outputs) if(O.linked.len) - user << "\The [O.name] is connected to [O.get_linked_to_desc()]." + to_chat(user, "The [O] is connected to [O.get_linked_to_desc()].") for(var/datum/integrated_io/activate/A in activators) if(A.linked.len) - user << "\The [A.name] is connected to [A.get_linked_to_desc()]." + to_chat(user, "The [A] is connected to [A.get_linked_to_desc()].") interact(user) /obj/item/integrated_circuit/New() + setup_io(inputs, /datum/integrated_io/input) + setup_io(outputs, /datum/integrated_io/output) + setup_io(activators, /datum/integrated_io/activate) ..() - var/i = 0 - if(number_of_inputs) - for(i = number_of_inputs, i > 0, i--) - inputs.Add(new /datum/integrated_io/input(src)) - if(number_of_outputs) - for(i = number_of_outputs, i > 0, i--) - outputs.Add(new /datum/integrated_io/output(src)) - - if(number_of_activators) - for(i = number_of_activators, i > 0, i--) - activators.Add(new /datum/integrated_io/activate(src)) - - apply_names_to_io() - -/obj/item/integrated_circuit/proc/apply_names_to_io() - var/i = 1 - if(input_names.len) - for(var/datum/integrated_io/input/I in inputs) - I.name = "[input_names[i]]" - i++ - i = 1 - if(output_names.len) - for(var/datum/integrated_io/output/O in outputs) - O.name = "[output_names[i]]" - i++ - - i = 1 - if(activator_names.len) - for(var/datum/integrated_io/activate/A in activators) - A.name = "[activator_names[i]]" - i++ +/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) + var/list/names = io_list.Copy() + io_list.Cut() + for(var/name in names) + io_list.Add(new io_type(src, name)) /obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. return @@ -82,7 +57,12 @@ qdel(O) for(var/datum/integrated_io/A in activators) qdel(A) - ..() + . = ..() + +/obj/item/integrated_circuit/nano_host() + if(istype(src.loc, /obj/item/device/electronic_assembly)) + return loc + return ..() /obj/item/integrated_circuit/emp_act(severity) for(var/datum/integrated_io/io in inputs + outputs + activators) @@ -94,42 +74,42 @@ set desc = "Rename your circuit, useful to stay organized." var/mob/M = usr - - if(!M.canmove || M.stat || M.restrained()) + if(!CanInteract(M, physical_state)) return - 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]'." + var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") name = input /obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) switch(pin_type) - if("input") + if(IC_INPUT) if(pin_number > inputs.len) return null return inputs[pin_number] - if("output") + if(IC_OUTPUT) if(pin_number > outputs.len) return null return outputs[pin_number] - if("activator") + if(IC_ACTIVATOR) if(pin_number > activators.len) return null return activators[pin_number] return null /obj/item/integrated_circuit/interact(mob/user) - if(get_dist(get_turf(src), user) > 1) - user.unset_machine(src) + if(!CanInteract(user, physical_state)) return - var/HTML = "[src.name]" + + var/HTML = list() + HTML += "[src.name]" HTML += "
" HTML += "" - HTML += "
\[Refresh\] | " - HTML += "\[Rename\]
" + HTML += "
\[Refresh\] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]
" HTML += "" HTML += "" @@ -139,80 +119,69 @@ var/column_width = 3 var/row_height = max(inputs.len, outputs.len, 1) - var/i - var/j - for(i = 1, i < row_height+1, i++) + + for(var/i = 1 to row_height) HTML += "" - for(j = 1, j < column_width+1, j++) + for(var/j = 1 to column_width) var/datum/integrated_io/io = null - var/words = null + var/words = list() var/height = 1 switch(j) if(1) - io = get_pin_ref("input",i) + io = get_pin_ref(IC_INPUT, i) if(io) if(io.linked.len) - words = "[io.name] [io.display_data()]
" + words += "[io.name] [io.display_data()]
" for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
" - else // "Click here!" - words = "[io.name] [io.display_data()]
" + words += "\[[linked.name]\] \ + @ [linked.holder]
" + else + words += "[io.name] [io.display_data()]
" for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
" + words += "\[[linked.name]\] \ + @ [linked.holder]
" if(outputs.len > inputs.len) - // height = Floor(outputs.len / inputs.len) - height = 1 // Because of bugs, if there's more outputs than inputs, it causes the output side to be hidden. - //world << "I wrote [words] at ([i],[j]). Height = [height]." + height = 1 if(2) if(i == 1) - words = "[src.name]

[src.desc]" + words += "[src.name]

[src.desc]" height = row_height - //world << "I wrote the center piece because i was equal to 1, at ([i],[j]). Height = [height]." else continue if(3) - io = get_pin_ref("output",i) + io = get_pin_ref(IC_OUTPUT, i) if(io) if(io.linked.len) - words = "[io.name] [io.display_data()]
" + words += "[io.name] [io.display_data()]
" for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ + words += "\[[linked.name]\] \ @ [linked.holder]
" else - words = "[io.name] [io.display_data()]
" + words += "[io.name] [io.display_data()]
" for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
" + words += "\[[linked.name]\] \ + @ [linked.holder]
" if(inputs.len > outputs.len) - // height = Floor(inputs.len / outputs.len) - height = 1 // See above. - //world << "I wrote [words] at ([i],[j]). Height = [height]." - HTML += "" - //HTML += "" - //world << "Writing to ([i],[j])." + height = 1 + HTML += "" HTML += "" - if(activators.len) - for(i = 1, i < activators.len+1, i++) - var/datum/integrated_io/io = null - var/words = null - io = get_pin_ref("activator",i) - if(io) - if(io.linked.len) - words = "[io.name]
" - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
" - else // "Click here!" - words = "[io.name]
" - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
" - HTML += "" - HTML += "" - HTML += "" + for(var/activator in activators) + var/datum/integrated_io/io = activator + var/words = list() + if(io.linked.len) + words += "[io.name]
" + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
" + else + words += "[io.name]
" + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
" + HTML += "" + HTML += "" + HTML += "" HTML += "
[words][words][jointext(words, null)]
[words]
[jointext(words, null)]
" HTML += "
" @@ -221,56 +190,50 @@ HTML += "
[extended_desc]" HTML += "" - user << browse(HTML, "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") + user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") - //user << sanitize(HTML, "window=debug;size=400x400;border=1;can_resize=1;can_close=1;can_minimize=1") - //world << sanitize(HTML) - - user.set_machine(src) onclose(user, "circuit-\ref[src]") -/obj/item/integrated_circuit/Topic(href, href_list[]) - var/mob/living/user = locate(href_list["user"]) in mob_list +/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) + if(..()) + return 1 var/pin = locate(href_list["pin"]) in inputs + outputs + activators - if(!user || !user.Adjacent(get_turf(src)) ) - return 1 - - if(!user.canmove || user.stat || user.restrained()) - return - + var/obj/held_item = usr.get_active_hand() if(href_list["wire"]) - if(ishuman(user) && Adjacent(user)) - var/mob/living/carbon/human/H = user - var/obj/held_item = H.get_active_hand() + if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) + var/obj/item/device/integrated_electronics/wirer/wirer = held_item + if(pin) + wirer.wire(pin, usr) - if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) - var/obj/item/device/integrated_electronics/wirer/wirer = held_item - if(pin) - wirer.wire(pin, user) - - 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, user) - - // if(istype(H.r_hand, /obj/item/device/integrated_electronics/wirer)) - // wirer = H.r_hand - // else if(istype(H.l_hand, /obj/item/device/integrated_electronics/wirer)) - // wirer = H.l_hand - - // if(wirer && pin) - // wirer.wire(pin, user) - else - user << "You can't do a whole lot without tools." + 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"]) - examine(user) + examine(usr) if(href_list["rename"]) - rename_component(user) + rename_component(usr) - interact(user) // To refresh the UI. + if(href_list["remove"]) + if(istype(held_item, /obj/item/weapon/screwdriver)) + disconnect_all() + var/turf/T = get_turf(src) + forceMove(T) + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pop \the [src] out of the case, and slide it out.") + else + to_chat(usr, "You need a screwdriver to remove components.") + var/obj/item/device/electronic_assembly/ea = loc + if(istype(ea)) + ea.interact(usr) + return + + interact(usr) // To refresh the UI. /datum/integrated_io var/name = "input/output" @@ -287,8 +250,20 @@ /datum/integrated_io/Destroy() disconnect() + data = null holder = null - ..() + . = ..() + +/datum/integrated_io/nano_host() + return holder + + +/datum/integrated_io/proc/data_as_type(var/as_type) + if(!isweakref(data)) + return + var/weakref/w = data + var/output = w.resolve() + return istype(output, as_type) ? output : null /datum/integrated_io/proc/display_data() if(isnull(data)) @@ -316,43 +291,38 @@ push_data() /datum/integrated_io/proc/write_data_to_pin(var/new_data) - if(isnull(new_data) || isnum(new_data) || istext(new_data) || istype(new_data, /atom/) ) // Anything else is a type we don't want. + if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. data = new_data holder.on_data_written() /datum/integrated_io/proc/push_data() - if(linked.len) - for(var/datum/integrated_io/io in linked) - io.write_data_to_pin(data) + for(var/datum/integrated_io/io in linked) + io.write_data_to_pin(data) /datum/integrated_io/activate/push_data() - if(linked.len) - for(var/datum/integrated_io/io in linked) - io.holder.work() + for(var/datum/integrated_io/io in linked) + io.holder.check_then_do_work() /datum/integrated_io/proc/pull_data() - if(linked.len) - for(var/datum/integrated_io/io in linked) - write_data_to_pin(io.data) + for(var/datum/integrated_io/io in linked) + write_data_to_pin(io.data) /datum/integrated_io/proc/get_linked_to_desc() if(linked.len) - var/result = english_list(linked) - return "the [result]" + return "the [english_list(linked)]" return "nothing" /datum/integrated_io/proc/disconnect() - if(linked.len) - //First we iterate over everything we are linked to. - for(var/datum/integrated_io/their_io in linked) - //While doing that, we iterate them as well, and disconnect ourselves from them. - for(var/datum/integrated_io/their_linked_io in their_io.linked) - 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. - src.linked.Remove(their_io) + //First we iterate over everything we are linked to. + for(var/datum/integrated_io/their_io in linked) + //While doing that, we iterate them as well, and disconnect ourselves from them. + for(var/datum/integrated_io/their_linked_io in their_io.linked) + 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. + src.linked.Remove(their_io) /datum/integrated_io/input name = "input pin" @@ -372,11 +342,14 @@ for(var/datum/integrated_io/input/I in inputs) I.push_data() -/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 - return 1 +/obj/item/integrated_circuit/proc/check_then_do_work() + if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. + return + next_use = world.time + cooldown_per_use + do_work() + +/obj/item/integrated_circuit/proc/do_work() + return /obj/item/integrated_circuit/proc/disconnect_all() for(var/datum/integrated_io/input/I in inputs) diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/arithmetic.dm index 3fc60c64f9..31265e297e 100644 --- a/code/modules/integrated_electronics/arithmetic.dm +++ b/code/modules/integrated_electronics/arithmetic.dm @@ -1,25 +1,10 @@ //These circuits do simple math. /obj/item/integrated_circuit/arithmetic complexity = 1 - 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( - "compute" - ) + inputs = list("A","B","C","D","E","F","G","H") + outputs = list("result") + activators = list("compute") + category = /obj/item/integrated_circuit/arithmetic // +Adding+ // @@ -28,17 +13,16 @@ desc = "This circuit can add numbers together." icon_state = "addition" -/obj/item/integrated_circuit/arithmetic/addition/work() - if(..()) - var/result = 0 - for(var/datum/integrated_io/input/I in inputs) - I.pull_data() - if(isnum(I.data)) - result = result + I.data +/obj/item/integrated_circuit/arithmetic/addition/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + result = result + I.data - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() // -Subtracting- // @@ -47,7 +31,7 @@ desc = "This circuit can subtract numbers." icon_state = "subtraction" -/obj/item/integrated_circuit/arithmetic/subtraction/work() +/obj/item/integrated_circuit/arithmetic/subtraction/do_work() if(..()) var/result = 0 for(var/datum/integrated_io/input/I in inputs) @@ -66,17 +50,16 @@ desc = "This circuit can multiply numbers." icon_state = "multiplication" -/obj/item/integrated_circuit/arithmetic/subtraction/work() - if(..()) - var/result = 0 - for(var/datum/integrated_io/input/I in inputs) - I.pull_data() - if(isnum(I.data)) - result = result * I.data +/obj/item/integrated_circuit/arithmetic/subtraction/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + result = result * I.data - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() // /Division/ // @@ -85,17 +68,16 @@ desc = "This circuit can divide numbers, just don't think about trying to divide by zero!" icon_state = "division" -/obj/item/integrated_circuit/arithmetic/division/work() - if(..()) - var/result = 0 - for(var/datum/integrated_io/input/I in inputs) - I.pull_data() - if(isnum(I.data) && I.data != 0) //No runtimes here. - result = result / I.data +/obj/item/integrated_circuit/arithmetic/division/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data) && I.data != 0) //No runtimes here. + result = result / I.data - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() // Absolute // @@ -103,20 +85,18 @@ name = "absolute circuit" desc = "This outputs a non-negative version of the number you put in. This may also be thought of as its distance from zero." icon_state = "absolute" - number_of_inputs = 1 - number_of_outputs = 1 + inputs = list("A") -/obj/item/integrated_circuit/arithmetic/absolute/work() - if(..()) - var/result = 0 - for(var/datum/integrated_io/input/I in inputs) - I.pull_data() - if(isnum(I.data) && I.data != 0) - result = abs(result) +/obj/item/integrated_circuit/arithmetic/absolute/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data) && I.data != 0) + result = abs(result) - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() // Averaging // @@ -125,59 +105,49 @@ desc = "This circuit is of average quality, however it will compute the average for numbers you give it." icon_state = "average" -/obj/item/integrated_circuit/arithmetic/average/work() - if(..()) - var/result = 0 - var/inputs_used = 0 - for(var/datum/integrated_io/input/I in inputs) - I.pull_data() - if(isnum(I.data)) - inputs_used++ - result = result + I.data +/obj/item/integrated_circuit/arithmetic/average/do_work() + var/result = 0 + var/inputs_used = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + inputs_used++ + result = result + I.data - if(inputs_used) - result = result / inputs_used + if(inputs_used) + result = result / inputs_used - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() // Pi, because why the hell not? // /obj/item/integrated_circuit/arithmetic/pi name = "pi constant circuit" desc = "Not recommended for cooking. Outputs '3.14159' when it receives a pulse." icon_state = "pi" - number_of_inputs = 0 - number_of_outputs = 1 + inputs = list() -/obj/item/integrated_circuit/arithmetic/pi/work() - if(..()) - var/datum/integrated_io/output/O = outputs[1] - O.data = 3.14159 - O.push_data() +/obj/item/integrated_circuit/arithmetic/pi/do_work() + var/datum/integrated_io/output/O = outputs[1] + O.data = 3.14159 + 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" - ) + inputs = 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] +/obj/item/integrated_circuit/arithmetic/random/do_work() + 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) + 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 + 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/assemblies.dm b/code/modules/integrated_electronics/assemblies.dm index 5efbca4003..3b9e7aab06 100644 --- a/code/modules/integrated_electronics/assemblies.dm +++ b/code/modules/integrated_electronics/assemblies.dm @@ -1,7 +1,7 @@ /obj/item/device/electronic_assembly name = "electronic assembly" desc = "It's a case, for building electronics with." - w_class = ITEMSIZE_SMALL + w_class = 2 icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "setup_small" var/max_components = 10 @@ -11,62 +11,59 @@ /obj/item/device/electronic_assembly/medium name = "electronic mechanism" icon_state = "setup_medium" - w_class = ITEMSIZE_NORMAL + w_class = 3 max_components = 20 max_complexity = 80 /obj/item/device/electronic_assembly/large name = "electronic machine" icon_state = "setup_large" - w_class = ITEMSIZE_LARGE + w_class = 4 max_components = 30 max_complexity = 120 /obj/item/device/electronic_assembly/drone name = "electronic drone" icon_state = "setup_drone" - w_class = ITEMSIZE_NORMAL + w_class = 3 max_components = 25 max_complexity = 100 /obj/item/device/electronic_assembly/interact(mob/user) - if(get_dist(get_turf(src), user) > 1) - user.unset_machine(src) + if(!CanInteract(user, physical_state)) return + var/total_parts = 0 var/total_complexity = 0 for(var/obj/item/integrated_circuit/part in contents) total_parts++ total_complexity = total_complexity + part.complexity - var/HTML = "[src.name]" + var/HTML = list() - HTML += "
\[Refresh\] | " - HTML += "\[Rename\]
" + HTML += "[src.name]" + HTML += "
\[Refresh\] | " + HTML += "\[Rename\]
" HTML += "[total_parts]/[max_components] ([round((total_parts / 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." HTML += "

" HTML += "Components;
" for(var/obj/item/integrated_circuit/circuit in contents) - HTML += "[circuit.name] | " - HTML += "\[Rename\]" + HTML += "[circuit.name] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]" HTML += "
" HTML += "" - user << browse(HTML, "window=assembly-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") + user << browse(jointext(HTML,null), "window=assembly-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") /obj/item/device/electronic_assembly/Topic(href, href_list[]) - var/mob/living/user = locate(href_list["user"]) in mob_list - if(..()) return 1 - if(!user.canmove || user.stat || user.restrained()) - return - if(href_list["rename"]) - rename(user) + rename(usr) - interact(user) // To refresh the UI. + interact(usr) // To refresh the UI. /obj/item/device/electronic_assembly/verb/rename() set name = "Rename Circuit" @@ -74,14 +71,12 @@ set desc = "Rename your circuit, useful to stay organized." var/mob/M = usr - - if(!M.canmove || M.stat || M.restrained()) + if(!CanInteract(M, physical_state)) return - var/input = sanitizeSafe(input("What do you want to name this?", "Rename", src.name), MAX_NAME_LEN) - - if(src && input) - M << "The machine now has a label reading '[input]'." + var/input = sanitizeSafe(input("What do you want to name this?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The machine now has a label reading '[input]'.") name = input /obj/item/device/electronic_assembly/update_icon() @@ -91,22 +86,18 @@ icon_state = initial(icon_state) /obj/item/device/electronic_assembly/examine(mob/user) - ..() - if(user.Adjacent(src)) - if(!opened) - for(var/obj/item/integrated_circuit/output/screen/S in contents) - if(S.stuff_to_display) - user << "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'." - else + . = ..(user, 1) + if(.) + for(var/obj/item/integrated_circuit/output/screen/S in contents) + if(S.stuff_to_display) + to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") + if(opened) interact(user) - // var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents - // if(IC) - // IC.examine(user) /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/integrated_circuit)) if(!opened) - user << "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar." + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") return 0 var/obj/item/integrated_circuit/IC = I var/total_parts = 0 @@ -115,54 +106,45 @@ total_parts++ total_complexity = total_complexity + part.complexity - if( (total_parts + 1) >= max_components) - user << "You can't seem to add this [IC.name], since there's no more room." + if( (total_parts + 1) > max_components) + to_chat(user, "You can't seem to add this [IC.name], since there's no more room.") return 0 - if( (total_complexity + IC.complexity) >= max_complexity) - user << "You can't seem to add this [IC.name], since this setup's too complicated for the case." + if( (total_complexity + IC.complexity) > max_complexity) + to_chat(user, "You can't seem to add this [IC.name], since this setup's too complicated for the case.") return 0 - user << "You slide \the [IC] inside \the [src]." + to_chat(user, "You slide \the [IC] inside \the [src].") user.drop_item() IC.forceMove(src) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(istype(I, /obj/item/weapon/screwdriver)) - if(!opened) - user << "\The [src] isn't opened, so you can't remove anything inside. Try using a crowbar." - return 0 - if(!contents.len) - user << "There's nothing inside this to remove!" - return 0 - var/obj/item/integrated_circuit/option = input("What do you want to remove?", "Component Removal") as null|anything in contents - if(option) - option.disconnect_all() - option.forceMove(get_turf(src)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) - user << "You pop \the [option] out of the case, and slide it out." - if(istype(I, /obj/item/weapon/crowbar)) - playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + interact(user) + else if(istype(I, /obj/item/weapon/crowbar)) + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) opened = !opened - user << "You [opened ? "opened" : "closed"] \the [src]." + to_chat(user, "You [opened ? "opened" : "closed"] \the [src].") update_icon() - if(istype(I, /obj/item/device/integrated_electronics/wirer)) + else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || istype(I, /obj/item/weapon/screwdriver)) if(opened) - var/obj/item/integrated_circuit/IC = input(user, "Which circuit do you want to examine?", "Examination") as null|anything in contents - if(IC) - IC.examine(user) + interact(user) else - user << "\The [src] isn't opened, so you can't fiddle with the internal components. \ - Try using a crowbar." + to_chat(user, "\The [src] isn't opened, so you can't fiddle with the internal components. \ + Try using a crowbar.") + else + return ..() /obj/item/device/electronic_assembly/attack_self(mob/user) + if(opened) + interact(user) + var/list/available_inputs = list() for(var/obj/item/integrated_circuit/input/input in contents) if(input.can_be_asked_input) available_inputs.Add(input) var/obj/item/integrated_circuit/input/choice = input(user, "What do you want to interact with?", "Interaction") as null|anything in available_inputs - if(choice) + if(choice && CanInteract(user, physical_state)) choice.ask_for_input(user) /obj/item/device/electronic_assembly/emp_act(severity) ..() for(var/atom/movable/AM in contents) - AM.emp_act(severity) + AM.emp_act(severity) \ No newline at end of file diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/converters.dm index 7a837abbfa..ad5f282356 100644 --- a/code/modules/integrated_electronics/converters.dm +++ b/code/modules/integrated_electronics/converters.dm @@ -1,133 +1,101 @@ //These circuits convert one variable to another. /obj/item/integrated_circuit/converter complexity = 2 - number_of_inputs = 1 - number_of_outputs = 1 - number_of_activators = 1 - input_names = list( - "input", - ) - output_names = list( - "result" - ) - activator_names = list( - "convert" - ) + inputs = list("input") + outputs = list("output") + activators = list("convert") + category = /obj/item/integrated_circuit/converter /obj/item/integrated_circuit/converter/num2text name = "number to string" desc = "This circuit can convert a number variable into a string." icon_state = "num-string" -/obj/item/integrated_circuit/converter/num2text/work() - if(..()) - var/result = null - var/datum/integrated_io/incoming = inputs[1] - var/datum/integrated_io/outgoing = outputs[1] - if(incoming.data && isnum(incoming.data)) - result = num2text(incoming.data) +/obj/item/integrated_circuit/converter/num2text/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && isnum(incoming.data)) + result = num2text(incoming.data) - outgoing.data = result - outgoing.push_data() + outgoing.data = result + outgoing.push_data() /obj/item/integrated_circuit/converter/text2num name = "string to number" desc = "This circuit can convert a string variable into a number." icon_state = "string-num" -/obj/item/integrated_circuit/converter/text2num/work() - if(..()) - var/result = null - var/datum/integrated_io/incoming = inputs[1] - var/datum/integrated_io/outgoing = outputs[1] - if(incoming.data && istext(incoming.data)) - result = text2num(incoming.data) +/obj/item/integrated_circuit/converter/text2num/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = text2num(incoming.data) - outgoing.data = result - outgoing.push_data() + outgoing.data = result + outgoing.push_data() /obj/item/integrated_circuit/converter/ref2text name = "reference to string" desc = "This circuit can convert a reference to something else to a string, specifically the name of that reference." icon_state = "ref-string" -/obj/item/integrated_circuit/converter/ref2text/work() - if(..()) - var/result = null - var/datum/integrated_io/incoming = inputs[1] - var/datum/integrated_io/outgoing = outputs[1] - if(incoming.data && istype(incoming.data, /atom/)) - var/atom/A = incoming.data - result = A.name +/obj/item/integrated_circuit/converter/ref2text/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + var/atom/A = incoming.data_as_type(/atom) + result = A && A.name - outgoing.data = result - outgoing.push_data() + outgoing.data = result + outgoing.push_data() /obj/item/integrated_circuit/converter/lowercase name = "lowercase string converter" desc = "this will cause a string to come out in all lowercase." icon_state = "lowercase" -/obj/item/integrated_circuit/converter/lowercase/work() - if(..()) - var/result = null - var/datum/integrated_io/incoming = inputs[1] - var/datum/integrated_io/outgoing = outputs[1] - if(incoming.data && istext(incoming.data)) - result = lowertext(incoming.data) +/obj/item/integrated_circuit/converter/lowercase/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = lowertext(incoming.data) - outgoing.data = result - outgoing.push_data() + outgoing.data = result + outgoing.push_data() /obj/item/integrated_circuit/converter/uppercase name = "uppercase string converter" desc = "THIS WILL CAUSE A STRING TO COME OUT IN ALL UPPERCASE." icon_state = "uppercase" -/obj/item/integrated_circuit/converter/uppercase/work() - if(..()) - var/result = null - var/datum/integrated_io/incoming = inputs[1] - var/datum/integrated_io/outgoing = outputs[1] - if(incoming.data && istext(incoming.data)) - result = uppertext(incoming.data) +/obj/item/integrated_circuit/converter/uppercase/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = uppertext(incoming.data) - outgoing.data = result - outgoing.push_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" - ) + inputs = list("A","B","C","D","E","F","G","H") + outputs = list("result") + activators = list("concatenate") +/obj/item/integrated_circuit/converter/concatenatior/do_work() + var/result = null + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(istext(I.data)) + result = result + I.data -/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 + 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/coordinate.dm b/code/modules/integrated_electronics/coordinate.dm index 78b7ebcb4f..b97a1c1546 100644 --- a/code/modules/integrated_electronics/coordinate.dm +++ b/code/modules/integrated_electronics/coordinate.dm @@ -4,58 +4,35 @@ desc = "This allows you to easily know the position of a machine containing this device." icon_state = "gps" complexity = 4 - number_of_inputs = 0 - number_of_outputs = 2 - number_of_activators = 1 - input_names = list( - ) - output_names = list( - "X (abs)", - "Y (abs)" - ) - activator_names = list( - "get coordinates" - ) + inputs = list() + outputs = list("X (abs)", "Y (abs)") + activators = list("get coordinates") -/obj/item/integrated_circuit/gps/work() - if(..()) - var/turf/T = get_turf(src) - var/datum/integrated_io/result_x = outputs[1] - var/datum/integrated_io/result_y = outputs[2] +/obj/item/integrated_circuit/gps/do_work() + var/turf/T = get_turf(src) + var/datum/integrated_io/result_x = outputs[1] + var/datum/integrated_io/result_y = outputs[2] - result_x.data = null - result_y.data = null - if(!T) - return + result_x.data = null + result_y.data = null + if(!T) + return - result_x.data = T.x - result_y.data = T.y + result_x.data = T.x + result_y.data = T.y - for(var/datum/integrated_io/output/O in outputs) - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() /obj/item/integrated_circuit/abs_to_rel_coords name = "abs to rel coordinate converter" desc = "Easily convert absolute coordinates to relative coordinates with this." complexity = 4 - number_of_inputs = 4 - number_of_outputs = 2 - number_of_activators = 1 - input_names = list( - "X1 (abs)", - "Y1 (abs)", - "X2 (abs)", - "Y2 (abs)" - ) - output_names = list( - "X (rel)", - "Y (rel)" - ) - activator_names = list( - "compute rel coordinates" - ) + inputs = list("X1 (abs)", "Y1 (abs)", "X2 (abs)", "Y2 (abs)") + outputs = list("X (rel)", "Y (rel)") + activators = list("compute rel coordinates") -/obj/item/integrated_circuit/abs_to_rel_coords/work() +/obj/item/integrated_circuit/abs_to_rel_coords/do_work() var/datum/integrated_io/x1 = inputs[1] var/datum/integrated_io/y1 = inputs[2] @@ -69,7 +46,5 @@ result_x.data = x1.data - x2.data result_y.data = y1.data - y2.data - for(var/datum/integrated_io/output/O in outputs) - O.push_data() - ..() + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/data_transfer.dm b/code/modules/integrated_electronics/data_transfer.dm index 12380e9cca..23ce3e5aea 100644 --- a/code/modules/integrated_electronics/data_transfer.dm +++ b/code/modules/integrated_electronics/data_transfer.dm @@ -3,49 +3,62 @@ desc = "Splits incoming data into all of the output pins." icon_state = "splitter" complexity = 3 - number_of_inputs = 1 - number_of_outputs = 2 - input_names = list( - "data to split" - ) - output_names = list( - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H" - ) + inputs = list("data to split") + outputs = list("A","B") /obj/item/integrated_circuit/transfer/splitter/medium name = "four splitter" icon_state = "splitter4" complexity = 5 - number_of_inputs = 1 - number_of_outputs = 4 + outputs = list("A","B","C","D") /obj/item/integrated_circuit/transfer/splitter/large name = "eight splitter" icon_state = "splitter8" complexity = 9 - number_of_inputs = 1 - number_of_outputs = 8 + outputs = list("A","B","C","D","E","F","G","H") -/obj/item/integrated_circuit/transfer/splitter/work() - if(..()) - var/datum/integrated_io/I = inputs[1] - for(var/datum/integrated_io/output/O in outputs) - O.data = I.data +/obj/item/integrated_circuit/transfer/splitter/do_work() + var/datum/integrated_io/I = inputs[1] + for(var/datum/integrated_io/output/O in outputs) + O.data = I.data /obj/item/integrated_circuit/transfer/activator_splitter name = "activator splitter" desc = "Splits incoming activation pulses into all of the output pins." icon_state = "splitter" complexity = 3 - number_of_activators = 3 - activator_names = list( + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B" + ) + +/obj/item/integrated_circuit/transfer/activator_splitter/do_work() + for(var/datum/integrated_io/activate/A in outputs) + if(A == activators[1]) + continue + if(A.linked.len) + for(var/datum/integrated_io/activate/target in A.linked) + target.holder.check_then_do_work() + +/obj/item/integrated_circuit/transfer/activator_splitter/medium + name = "four activator splitter" + icon_state = "splitter4" + complexity = 5 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D" + ) + +/obj/item/integrated_circuit/transfer/activator_splitter/large + name = "eight activator splitter" + icon_state = "splitter4" + complexity = 9 + activators = list( "incoming pulse", "outgoing pulse A", "outgoing pulse B", @@ -55,25 +68,4 @@ "outgoing pulse F", "outgoing pulse G", "outgoing pulse H" - ) - -/obj/item/integrated_circuit/transfer/activator_splitter/work() - if(..()) - for(var/datum/integrated_io/activate/A in outputs) - if(A == activators[1]) - continue - if(A.linked.len) - for(var/datum/integrated_io/activate/target in A.linked) - target.holder.work() - -/obj/item/integrated_circuit/transfer/activator_splitter/medium - name = "four activator splitter" - icon_state = "splitter4" - complexity = 5 - number_of_activators = 5 - -/obj/item/integrated_circuit/transfer/activator_splitter/large - name = "eight activator splitter" - icon_state = "splitter4" - complexity = 9 - number_of_activators = 9 + ) \ 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 42da340654..d94bfa32da 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/input_output.dm @@ -8,41 +8,32 @@ name = "button" desc = "This tiny button must do something, right?" icon_state = "button" - number_of_inputs = 0 - number_of_outputs = 0 - number_of_activators = 1 complexity = 1 can_be_asked_input = 1 - activator_names = list( - "on pressed" - ) + inputs = list() + outputs = list() + activators = list("on pressed") /obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use. var/datum/integrated_io/A = activators[1] if(A.linked.len) for(var/datum/integrated_io/activate/target in A.linked) - target.holder.work() - user << "You press the button labeled '[src.name]'." + target.holder.check_then_do_work() + to_chat(user, "You press the button labeled '[src.name]'.") /obj/item/integrated_circuit/input/numberpad name = "number pad" desc = "This small number pad allows someone to input a number into the system." icon_state = "numberpad" - number_of_inputs = 0 - number_of_outputs = 1 - number_of_activators = 1 complexity = 2 can_be_asked_input = 1 - output_names = list( - "number entered" - ) - activator_names = list( - "on entered" - ) + inputs = list() + outputs = list("number entered") + activators = list("on entered") /obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) var/new_input = input(user, "Enter a number, please.","Number pad") as null|num - if(isnum(new_input)) + if(isnum(new_input) && CanInteract(user, physical_state)) var/datum/integrated_io/O = outputs[1] O.data = new_input O.push_data() @@ -53,21 +44,15 @@ name = "text pad" desc = "This small text pad allows someone to input a string into the system." icon_state = "textpad" - number_of_inputs = 0 - number_of_outputs = 1 - number_of_activators = 1 complexity = 2 can_be_asked_input = 1 - output_names = list( - "string entered" - ) - activator_names = list( - "on entered" - ) + inputs = list() + outputs = list("string entered") + activators = list("on entered") /obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) var/new_input = input(user, "Enter some words, please.","Number pad") as null|text - if(new_input && istext(new_input)) + if(istext(new_input) && CanInteract(user, physical_state)) var/datum/integrated_io/O = outputs[1] O.data = new_input O.push_data() @@ -78,53 +63,37 @@ name = "integrated medical analyser" desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is." icon_state = "medscan" - number_of_inputs = 1 - number_of_outputs = 2 - number_of_activators = 1 complexity = 4 - input_names = list( - "target ref" - ) - output_names = list( - "total health %", - "total missing health" - ) - activator_names = list( - "scan" - ) + inputs = list("target ref") + outputs = list("total health %", "total missing health") + activators = list("scan") -/obj/item/integrated_circuit/input/med_scanner/work() - if(..()) - var/datum/integrated_io/I = inputs[1] - if(!I.data || !ishuman(I.data)) //Invalid input - return - var/mob/living/carbon/human/H = I.data - if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. - var/total_health = round(H.health/H.maxHealth, 0.1)*100 - var/missing_health = H.maxHealth - H.health +/obj/item/integrated_circuit/input/med_scanner/do_work() + var/datum/integrated_io/I = inputs[1] + var/mob/living/carbon/human/H = I.data_as_type(/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. + var/total_health = round(H.health/H.maxHealth, 0.1)*100 + var/missing_health = H.maxHealth - H.health - var/datum/integrated_io/total = outputs[1] - var/datum/integrated_io/missing = outputs[2] + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] - total.data = total_health - missing.data = missing_health + total.data = total_health + missing.data = missing_health - for(var/datum/integrated_io/output/O in outputs) - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() /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. \ This type is much more precise, allowing the machine to know much more about the target than a normal analyzer." icon_state = "medscan_adv" - number_of_inputs = 1 - number_of_outputs = 7 - number_of_activators = 1 complexity = 12 - input_names = list( - "target ref" - ) - output_names = list( + inputs = list("target ref") + outputs = list( "total health %", "total missing health", "brute damage", @@ -133,68 +102,53 @@ "oxy damage", "clone damage" ) - activator_names = list( - "scan" - ) + activators = list("scan") -/obj/item/integrated_circuit/input/adv_med_scanner/work() - if(..()) - var/datum/integrated_io/I = inputs[1] - if(!I.data || !ishuman(I.data)) //Invalid input - return - var/mob/living/carbon/human/H = I.data - if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. - var/total_health = round(H.health/H.maxHealth, 0.1)*100 - var/missing_health = H.maxHealth - H.health +/obj/item/integrated_circuit/input/adv_med_scanner/do_work() + var/datum/integrated_io/I = inputs[1] + var/mob/living/carbon/human/H = I.data_as_type(/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. + var/total_health = round(H.health/H.maxHealth, 0.1)*100 + var/missing_health = H.maxHealth - H.health - var/datum/integrated_io/total = outputs[1] - var/datum/integrated_io/missing = outputs[2] - var/datum/integrated_io/brute = outputs[3] - var/datum/integrated_io/burn = outputs[4] - var/datum/integrated_io/tox = outputs[5] - var/datum/integrated_io/oxy = outputs[6] - var/datum/integrated_io/clone = outputs[7] + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] + var/datum/integrated_io/brute = outputs[3] + var/datum/integrated_io/burn = outputs[4] + var/datum/integrated_io/tox = outputs[5] + var/datum/integrated_io/oxy = outputs[6] + var/datum/integrated_io/clone = outputs[7] - total.data = total_health - missing.data = missing_health - brute.data = H.getBruteLoss() - burn.data = H.getFireLoss() - tox.data = H.getToxLoss() - oxy.data = H.getOxyLoss() - clone.data = H.getCloneLoss() + total.data = total_health + missing.data = missing_health + brute.data = H.getBruteLoss() + burn.data = H.getFireLoss() + tox.data = H.getToxLoss() + oxy.data = H.getOxyLoss() + clone.data = H.getCloneLoss() - for(var/datum/integrated_io/output/O in outputs) - O.push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() /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 \ that is holding the machine containing it." - number_of_inputs = 0 - number_of_outputs = 1 - number_of_activators = 1 - complexity = 4 - output_names = list( - "located ref" - ) - activator_names = list( - "locate" - ) + inputs = list() + outputs = list("located ref") + activators = list("locate") -/obj/item/integrated_circuit/input/local_locator/work() - if(..()) - var/mob/living/L = null - var/datum/integrated_io/O = outputs[1] - O.data = null - if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. - var/obj/item/device/electronic_assembly/assembly = src.loc - if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. - L = assembly.loc +/obj/item/integrated_circuit/input/local_locator/do_work() + var/datum/integrated_io/O = outputs[1] + O.data = null + if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. + var/obj/item/device/electronic_assembly/assembly = src.loc + if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. + O.data = weakref(assembly.loc) - if(L) - O.data = L - - O.push_data() + O.push_data() /obj/item/integrated_circuit/input/signaler name = "integrated signaler" @@ -203,37 +157,29 @@ The two input pins are to configure the integrated signaler's settings. Note that the frequency should not have a decimal in it. \ Meaning the default frequency is expressed as 1457, not 145.7. To send a signal, pulse the 'send signal' activator pin." icon_state = "signal" - number_of_inputs = 2 - number_of_outputs = 0 - number_of_activators = 2 complexity = 4 - input_names = list( - "frequency", - "code" - ) - activator_names = list( - "send signal", - "on signal received" - ) + inputs = list("frequency","code") + outputs = list() + activators = list("send signal","on signal received") + var/frequency = 1457 var/code = 30 var/datum/radio_frequency/radio_connection -/obj/item/integrated_circuit/input/signaler/New() +/obj/item/integrated_circuit/input/signaler/initialize() ..() - spawn(4 SECONDS) - set_frequency(frequency) - var/datum/integrated_io/new_freq = inputs[1] - var/datum/integrated_io/new_code = inputs[2] - // Set the pins so when someone sees them, they won't show as null - new_freq.data = frequency - new_code.data = code + set_frequency(frequency) + var/datum/integrated_io/new_freq = inputs[1] + var/datum/integrated_io/new_code = inputs[2] + // Set the pins so when someone sees them, they won't show as null + new_freq.data = frequency + new_code.data = code /obj/item/integrated_circuit/input/signaler/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) frequency = 0 - ..() + . = ..() /obj/item/integrated_circuit/input/signaler/on_data_written() var/datum/integrated_io/new_freq = inputs[1] @@ -244,16 +190,15 @@ code = new_code.data -/obj/item/integrated_circuit/input/signaler/work() // Sends a signal. - if(..()) - if(!radio_connection) - return +/obj/item/integrated_circuit/input/signaler/do_work() // Sends a signal. + if(!radio_connection) + return - var/datum/signal/signal = new() - signal.source = src - signal.encryption = code - signal.data["message"] = "ACTIVATE" - radio_connection.post_signal(src, signal) + var/datum/signal/signal = new() + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" + radio_connection.post_signal(src, signal) /obj/item/integrated_circuit/input/signaler/proc/set_frequency(new_frequency) if(!frequency) @@ -282,10 +227,9 @@ var/datum/integrated_io/A = activators[2] A.push_data() - for(var/mob/O in hearers(1, src.loc)) + for(var/mob/O in hearers(1, get_turf(src))) O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) - /obj/item/integrated_circuit/input/EPv2 name = "\improper EPv2 circuit" desc = "Enables the sending and receiving of messages on the Exonet with the EPv2 protocol." @@ -293,31 +237,17 @@ second pin on each side, with additonal data reserved for the third pin. When a message is received, the second activaiton pin \ will pulse whatever's connected to it. Pulsing the first activation pin will send a message." icon_state = "signal" - number_of_inputs = 3 - number_of_outputs = 3 - number_of_activators = 2 complexity = 4 - input_names = list( - "target EPv2 address", - "data to send", - "secondary text" - ) - output_names = list( - "address received", - "data received", - "secondary text received" - ) - activator_names = list( - "send data", - "on data received" - ) + inputs = list("target EPv2 address", "data to send", "secondary text") + outputs = list("address received", "data received", "secondary text received") + activators = list("send data", "on data received") var/datum/exonet_protocol/exonet = null /obj/item/integrated_circuit/input/EPv2/New() ..() exonet = new(src) exonet.make_address("EPv2_circuit-\ref[src]") - desc += "This circuit's EPv2 address is: [exonet.address]." + desc += "
This circuit's EPv2 address is: [exonet.address]." /obj/item/integrated_circuit/input/EPv2/Destroy() if(exonet) @@ -325,13 +255,12 @@ qdel(exonet) ..() -/obj/item/integrated_circuit/input/EPv2/work() - if(..()) - var/datum/integrated_io/target_address = inputs[1] - var/datum/integrated_io/message = inputs[2] - var/datum/integrated_io/text = inputs[3] - if(istext(target_address.data)) - exonet.send_message(target_address.data, message.data, text.data) +/obj/item/integrated_circuit/input/EPv2/do_work() + var/datum/integrated_io/target_address = inputs[1] + var/datum/integrated_io/message = inputs[2] + var/datum/integrated_io/text = inputs[3] + if(istext(target_address.data)) + exonet.send_message(target_address.data, message.data, text.data) /obj/item/integrated_circuit/input/receive_exonet_message(var/atom/origin_atom, var/origin_address, var/message, var/text) var/datum/integrated_io/message_received = outputs[1] @@ -349,42 +278,35 @@ name = "screen" desc = "This small screen can display a single piece of data, when the machine is examined closely." icon_state = "screen" - complexity = 4 - number_of_inputs = 1 - number_of_outputs = 0 - number_of_activators = 1 - input_names = list( - "displayed data" - ) - activator_names = list( - "load data" - ) + inputs = list("displayed data") + outputs = list() + activators = list("load data") var/stuff_to_display = null -/obj/item/integrated_circuit/output/screen/work() +/obj/item/integrated_circuit/output/screen/do_work() var/datum/integrated_io/I = inputs[1] - stuff_to_display = I.data + if(isweakref(I.data)) + var/datum/d = I.data_as_type(/datum) + if(d) + stuff_to_display = "[d]" + else + 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" - ) + inputs = list() + outputs = list() + activators = 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/do_work() + light_toggled = !light_toggled + update_lighting() /obj/item/integrated_circuit/output/light/proc/update_lighting() if(light_toggled) @@ -413,15 +335,13 @@ 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( + inputs = list( "R", "G", "B", "Brightness" ) + outputs = list() /obj/item/integrated_circuit/output/light/advanced/on_data_written() update_lighting() @@ -432,38 +352,43 @@ icon_state = "speaker" complexity = 8 cooldown_per_use = 4 SECONDS - number_of_inputs = 3 - number_of_outputs = 0 - number_of_activators = 1 - input_names = list( + inputs = list( "sound ID", "volume", "frequency" ) - activator_names = list( - "play sound" - ) + outputs = list() + activators = list("play sound") var/list/sounds = list() + category = /obj/item/integrated_circuit/output/sound -/obj/item/integrated_circuit/output/sound/work() - if(..()) - var/datum/integrated_io/ID = inputs[1] - var/datum/integrated_io/vol = inputs[2] - var/datum/integrated_io/frequency = inputs[3] - if(istext(ID.data) && isnum(vol.data) && isnum(frequency.data)) - var/selected_sound = sounds[ID.data] - vol.data = Clamp(vol.data, 0, 1) - frequency.data = Clamp(frequency.data, 0, 100) - playsound(get_turf(src), selected_sound, vol.data, frequency.data, -1) +/obj/item/integrated_circuit/output/sound/New() + ..() + extended_desc = list() + extended_desc += "The first input pin determines which sound is used. The choices are; " + extended_desc += jointext(sounds, ", ") + extended_desc += ". The second pin determines the volume of sound that is played" + extended_desc += ", and the third determines if the frequency of the sound will vary with each activation." + extended_desc = jointext(extended_desc, null) + +/obj/item/integrated_circuit/output/sound/do_work() + var/datum/integrated_io/ID = inputs[1] + var/datum/integrated_io/vol = inputs[2] + var/datum/integrated_io/frequency = inputs[3] + if(istext(ID.data) && isnum(vol.data) && isnum(frequency.data)) + var/selected_sound = sounds[ID.data] + if(!selected_sound) + world << "No sound" + return + vol.data = Clamp(vol.data, 0, 100) + frequency.data = round(Clamp(frequency.data, 0, 1)) + playsound(get_turf(src), selected_sound, vol.data, frequency.data, -1) /obj/item/integrated_circuit/output/sound/beeper name = "beeper circuit" desc = "A miniature speaker is attached to this component. This is often used in the construction of motherboards, which use \ the speaker to tell the user if something goes very wrong when booting up. It can also do other similar synthetic sounds such \ as buzzing, pinging, chiming, and more." - extended_desc = "The first input pin determines what sound is used. The choices are; beep, chime, buzz sigh, buzz twice, ping, \ - synth yes, synth no, warning buzz. The second pin determines the volume of sound that is played, and the third determines if \ - the frequency of the sound will vary with each activation." sounds = list( "beep" = 'sound/machines/twobeep.ogg', "chime" = 'sound/machines/chime.ogg', @@ -478,9 +403,6 @@ /obj/item/integrated_circuit/output/sound/beepsky name = "securitron sound circuit" desc = "A miniature speaker is attached to this component. Considered by some to be the essential component for a securitron." - extended_desc = "The first input pin determines what sound is used. The choices are; creep, criminal, freeze, god, \ - i am the law, insult, radio, secure day. The second pin determines the volume of sound that is played, and the \ - third determines if the frequency of the sound will vary with each activation." sounds = list( "creep" = 'sound/voice/bcreep.ogg', "criminal" = 'sound/voice/bcriminal.ogg', @@ -490,5 +412,4 @@ "insult" = 'sound/voice/binsult.ogg', "radio" = 'sound/voice/bradio.ogg', "secure day" = 'sound/voice/bsecureday.ogg', - ) - + ) \ No newline at end of file diff --git a/code/modules/integrated_electronics/logic.dm b/code/modules/integrated_electronics/logic.dm index 4d123c61d0..cb4fc55f35 100644 --- a/code/modules/integrated_electronics/logic.dm +++ b/code/modules/integrated_electronics/logic.dm @@ -1,172 +1,106 @@ /obj/item/integrated_circuit/logic name = "logic gate" desc = "This tiny chip will decide for you!" + extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." complexity = 3 - number_of_inputs = 2 - number_of_outputs = 1 - number_of_activators = 2 - input_names = list( - "A", - "B" - ) - output_names = list( - "result" - ) - activator_names = list( - "compare", - "on true result" - ) + outputs = list("result") + activators = list("compare", "on true result") + category = /obj/item/integrated_circuit/logic -/obj/item/integrated_circuit/logic/equals +/obj/item/integrated_circuit/logic/do_work() + var/datum/integrated_io/O = outputs[1] + var/datum/integrated_io/P = activators[2] + O.push_data() + if(O.data) + P.push_data() + +/obj/item/integrated_circuit/logic/binary + inputs = list("A","B") + category = /obj/item/integrated_circuit/logic/binary + +/obj/item/integrated_circuit/logic/binary/do_work() + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/B = inputs[2] + var/datum/integrated_io/O = outputs[1] + O.data = do_compare(A, B) ? TRUE : FALSE + ..() + +/obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return FALSE + +/obj/item/integrated_circuit/logic/unary + inputs = list("A") + category = /obj/item/integrated_circuit/logic/unary + +/obj/item/integrated_circuit/logic/unary/do_work() + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/O = outputs[1] + O.data = do_check(A) ? TRUE : FALSE + ..() + +/obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A) + return FALSE + +/obj/item/integrated_circuit/logic/binary/equals name = "equal gate" desc = "This gate compares two values, and outputs the number one if both are the same." icon_state = "equal" -/obj/item/integrated_circuit/logic/equals/work() - if(..()) - 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/P = activators[2] - if(A.data == B.data) - O.data = 1 - O.push_data() - P.push_data() - else - O.data = 0 +/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/not - name = "not gate" - desc = "This gate inverts what's fed into it." - icon_state = "not" - number_of_inputs = 1 - number_of_outputs = 1 - number_of_activators = 1 - output_names = list( - "invert" - ) - - -/obj/item/integrated_circuit/logic/not/work() - if(..()) - var/datum/integrated_io/A = inputs[1] - var/datum/integrated_io/O = outputs[1] - if(A.data) - O.data = !A.data - O.push_data() - else - O.data = 0 - -/obj/item/integrated_circuit/logic/and +/obj/item/integrated_circuit/logic/binary/and name = "and gate" desc = "This gate will output 'one' if both inputs evaluate to true." icon_state = "and" -/obj/item/integrated_circuit/logic/and/work() - if(..()) - 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/P = activators[2] - if(A.data && B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 +/obj/item/integrated_circuit/logic/binary/and/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data && B.data -/obj/item/integrated_circuit/logic/or +/obj/item/integrated_circuit/logic/binary/or name = "or gate" desc = "This gate will output 'one' if one of the inputs evaluate to true." icon_state = "or" -/obj/item/integrated_circuit/logic/or/work() - if(..()) - 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/P = activators[2] - if(A.data || B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 +/obj/item/integrated_circuit/logic/binary/or/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data || B.data -/obj/item/integrated_circuit/logic/less_than +/obj/item/integrated_circuit/logic/binary/less_than name = "less than gate" desc = "This will output 'one' if the first input is less than the second input." icon_state = "less_than" -/obj/item/integrated_circuit/logic/less_than/work() - if(..()) - 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/P = activators[2] - if(A.data < B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 +/obj/item/integrated_circuit/logic/binary/less_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data < B.data -/obj/item/integrated_circuit/logic/less_than_or_equal +/obj/item/integrated_circuit/logic/binary/less_than_or_equal name = "less than or equal gate" desc = "This will output 'one' if the first input is less than, or equal to the second input." icon_state = "less_than_or_equal" -/obj/item/integrated_circuit/logic/less_than_or_equal/work() - if(..()) - 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/P = activators[2] - if(A.data <= B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 +/obj/item/integrated_circuit/logic/binary/less_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data <= B.data -/obj/item/integrated_circuit/logic/greater_than +/obj/item/integrated_circuit/logic/binary/greater_than name = "greater than gate" desc = "This will output 'one' if the first input is greater than the second input." icon_state = "greater_than" -/obj/item/integrated_circuit/logic/greater_than/work() - if(..()) - 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/P = activators[2] - if(A.data > B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 +/obj/item/integrated_circuit/logic/binary/greater_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data > B.data -/obj/item/integrated_circuit/logic/greater_than_or_equal +/obj/item/integrated_circuit/logic/binary/greater_than_or_equal name = "greater_than or equal gate" desc = "This will output 'one' if the first input is greater than, or equal to the second input." icon_state = "greater_than_or_equal" -/obj/item/integrated_circuit/logic/greater_than_or_equal/work() - if(..()) - 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/P = activators[2] - if(A.data >= B.data) - O.data = 1 - O.push_data() - A.push_data() - P.push_data() - else - O.data = 0 \ No newline at end of file +/obj/item/integrated_circuit/logic/binary/greater_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data >= B.data + +/obj/item/integrated_circuit/logic/unary/not + name = "not gate" + desc = "This gate inverts what's fed into it." + icon_state = "not" + +/obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) + return !A.data \ No newline at end of file diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/manipulation.dm index 256d7b6b7a..c9b10f4647 100644 --- a/code/modules/integrated_electronics/manipulation.dm +++ b/code/modules/integrated_electronics/manipulation.dm @@ -6,14 +6,12 @@ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \ normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism." complexity = 20 - number_of_inputs = 2 - number_of_outputs = 0 - number_of_activators = 1 - input_names = list( + inputs = list( "target X rel", "target Y rel" ) - activator_names = list( + outputs = list() + activators = list( "fire" ) var/obj/item/weapon/gun/installed_gun = null @@ -45,7 +43,7 @@ else user << "There's no weapon to remove from the mechanism." -/obj/item/integrated_circuit/manipulation/weapon_firing/work() +/obj/item/integrated_circuit/manipulation/weapon_firing/do_work() if(..()) if(!installed_gun) return @@ -95,28 +93,23 @@ into the smoke clouds when activated." flags = OPENCONTAINER complexity = 20 - number_of_inputs = 0 - number_of_outputs = 0 - number_of_activators = 1 cooldown_per_use = 30 SECONDS - input_names = list() - activator_names = list( - "create smoke" - ) + inputs = list() + outputs = list() + activators = list("create smoke") /obj/item/integrated_circuit/manipulation/smoke/New() ..() create_reagents(100) -/obj/item/integrated_circuit/manipulation/smoke/work() - if(..()) - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new() - smoke_system.set_up(reagents, 10, 0, get_turf(src)) - spawn(0) - for(var/i = 1 to 8) - smoke_system.start() - reagents.clear_reagents() +/obj/item/integrated_circuit/manipulation/smoke/do_work() + playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new() + smoke_system.set_up(reagents, 10, 0, get_turf(src)) + spawn(0) + for(var/i = 1 to 8) + smoke_system.start() + reagents.clear_reagents() /obj/item/integrated_circuit/manipulation/locomotion name = "locomotion circuit" @@ -135,24 +128,18 @@ Pulsing the 'step towards dir' activator pin will cause the machine to move a meter in that direction, assuming it is not \ being held, or anchored in some way." complexity = 20 - number_of_inputs = 1 - number_of_outputs = 0 - number_of_activators = 1 - input_names = list( - "dir num" - ) - activator_names = list( - "step towards dir" - ) + inputs = list("dir num") + outputs = list() + activators = list("step towards dir") -/obj/item/integrated_circuit/manipulation/locomotion/work() - if(..()) - var/turf/T = get_turf(src) - if(istype(loc, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/machine = loc - if(machine.anchored || machine.w_class >= 4) - return - if(machine.loc && machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. - var/datum/integrated_io/wanted_dir = inputs[1] - if(isnum(wanted_dir.data)) - step(machine, wanted_dir.data) \ No newline at end of file +/obj/item/integrated_circuit/manipulation/locomotion/do_work() + ..() + var/turf/T = get_turf(src) + if(istype(loc, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/machine = loc + if(machine.anchored || machine.w_class >= 4) + return + if(machine.loc && machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. + var/datum/integrated_io/wanted_dir = inputs[1] + if(isnum(wanted_dir.data)) + step(machine, wanted_dir.data) \ No newline at end of file diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/memory.dm index 8599cc2aed..aa62843209 100644 --- a/code/modules/integrated_electronics/memory.dm +++ b/code/modules/integrated_electronics/memory.dm @@ -3,99 +3,151 @@ desc = "This tiny chip can store one piece of data." icon_state = "memory" complexity = 1 - number_of_inputs = 1 - number_of_outputs = 1 - number_of_activators = 1 - activator_names = list( - "set" - ) + inputs = list("input pin 1") + outputs = list("output pin 1") + activators = list("set") + category = /obj/item/integrated_circuit/memory /obj/item/integrated_circuit/memory/examine(mob/user) ..() var/i for(i = 1, i <= outputs.len, i++) var/datum/integrated_io/O = outputs[i] - user << "\The [src] has [O.data ? "'O.data'" : "nothing"] saved to address [i]." + var/data = "nothing" + if(isweakref(O.data)) + var/datum/d = O.data_as_type(/datum) + if(d) + data = "[d]" + else if(!isnull(O.data)) + data = O.data + to_chat(user, "\The [src] has [data] saved to address [i].") -/obj/item/integrated_circuit/memory/work() - if(..()) - var/i - for(i = 1, i <= inputs.len, i++) - var/datum/integrated_io/I = inputs[i] - var/datum/integrated_io/O = outputs[i] - O.data = I.data +/obj/item/integrated_circuit/memory/do_work() + for(var/i = 1 to inputs.len) + var/datum/integrated_io/I = inputs[i] + var/datum/integrated_io/O = outputs[i] + O.data = I.data /obj/item/integrated_circuit/memory/medium name = "memory circuit" desc = "This circuit can store four pieces of data." icon_state = "memory4" complexity = 4 - number_of_inputs = 4 - number_of_outputs = 4 + inputs = list("input pin 1","input pin 2","input pin 3","input pin 4") + outputs = list("output pin 1","output pin 2","output pin 3","output pin 4") /obj/item/integrated_circuit/memory/large name = "large memory circuit" desc = "This big circuit can hold eight pieces of data." icon_state = "memory8" complexity = 8 - number_of_inputs = 8 - number_of_outputs = 8 + inputs = list( + "input pin 1", + "input pin 2", + "input pin 3", + "input pin 4", + "input pin 5", + "input pin 6", + "input pin 7", + "input pin 8") + outputs = list( + "output pin 1", + "output pin 2", + "output pin 3", + "output pin 4", + "output pin 5", + "output pin 6", + "output pin 7", + "output pin 8") /obj/item/integrated_circuit/memory/huge name = "large memory stick" desc = "This stick of memory can hold up up to sixteen pieces of data." icon_state = "memory16" complexity = 16 - number_of_inputs = 16 - number_of_outputs = 16 + inputs = list( + "input pin 1", + "input pin 2", + "input pin 3", + "input pin 4", + "input pin 5", + "input pin 6", + "input pin 7", + "input pin 8", + "input pin 9", + "input pin 10", + "input pin 11", + "input pin 12", + "input pin 13", + "input pin 14", + "input pin 15", + "input pin 16" + ) + outputs = list( + "output pin 1", + "output pin 2", + "output pin 3", + "output pin 4", + "output pin 5", + "output pin 6", + "output pin 7", + "output pin 8", + "output pin 9", + "output pin 10", + "output pin 11", + "output pin 12", + "output pin 13", + "output pin 14", + "output pin 15", + "output pin 16") /obj/item/integrated_circuit/memory/constant name = "constant chip" desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly." icon_state = "memory" complexity = 1 - number_of_inputs = 0 - number_of_outputs = 1 - number_of_activators = 1 - activator_names = list( - "push data" - ) + inputs = list() + outputs = list("output pin") + activators = list("push data") var/accepting_refs = 0 -/obj/item/integrated_circuit/memory/constant/work() +/obj/item/integrated_circuit/memory/constant/do_work() var/datum/integrated_io/O = outputs[1] O.push_data() /obj/item/integrated_circuit/memory/constant/attack_self(mob/user) var/datum/integrated_io/O = outputs[1] var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") + if(!CanInteract(user, physical_state)) + return + var/new_data = null switch(type_to_use) if("string") accepting_refs = 0 new_data = input("Now type in a string.","[src] string writing") as null|text - if(istext(new_data)) + if(istext(new_data) && CanInteract(user, physical_state)) O.data = new_data - user << "You set \the [src]'s memory to [O.display_data()]." + to_chat(user, "You set \the [src]'s memory to [O.display_data()].") if("number") accepting_refs = 0 new_data = input("Now type in a number.","[src] number writing") as null|num - if(isnum(new_data)) + if(isnum(new_data) && CanInteract(user, physical_state)) O.data = new_data - user << "You set \the [src]'s memory to [O.display_data()]." + to_chat(user, "You set \the [src]'s memory to [O.display_data()].") if("ref") accepting_refs = 1 - user << "You turn \the [src]'s ref scanner on. Slide it across \ - an object for a ref of that object to save it in memory." + to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ + an object for a ref of that object to save it in memory.") if("null") O.data = null - user << "You set \the [src]'s memory to absolutely nothing." + to_chat(user, "You set \the [src]'s memory to absolutely nothing.") /obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity) if(accepting_refs && proximity) var/datum/integrated_io/O = outputs[1] - O.data = target + O.data = weakref(target) visible_message("[user] slides \a [src]'s over \the [target].") - user << "You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \ - now off." + to_chat(user, "You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \ + now off.") accepting_refs = 0 \ No newline at end of file diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/time.dm index 95b8e02c46..f351f86590 100644 --- a/code/modules/integrated_electronics/time.dm +++ b/code/modules/integrated_electronics/time.dm @@ -2,40 +2,38 @@ name = "time circuit" desc = "Now you can build your own clock!" complexity = 2 - number_of_inputs = 0 - number_of_outputs = 0 + inputs = list() + outputs = list() + category = /obj/item/integrated_circuit/time /obj/item/integrated_circuit/time/delay name = "two-sec delay circuit" desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ This circuit is set to send a pulse after a delay of two seconds." icon_state = "delay-20" - number_of_activators = 2 - var/delay = 20 - activator_names = list( - "incoming pulse", - "outgoing pulse" - ) + var/delay = 2 SECONDS + activators = list("incoming pulse","outgoing pulse") -/obj/item/integrated_circuit/time/delay/work() - if(..()) - var/datum/integrated_io/out_pulse = activators[2] - sleep(delay) - out_pulse.push_data() +/obj/item/integrated_circuit/time/delay/do_work() + set waitfor = 0 // Don't sleep in a proc that is called by a processor. It'll delay the entire thing + + var/datum/integrated_io/out_pulse = activators[2] + sleep(delay) + out_pulse.push_data() /obj/item/integrated_circuit/time/delay/five_sec name = "five-sec delay circuit" desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ This circuit is set to send a pulse after a delay of five seconds." icon_state = "delay-50" - delay = 50 + delay = 5 SECONDS /obj/item/integrated_circuit/time/delay/one_sec name = "one-sec delay circuit" desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ This circuit is set to send a pulse after a delay of one second." icon_state = "delay-10" - delay = 10 + delay = 1 SECOND /obj/item/integrated_circuit/time/delay/half_sec name = "half-sec delay circuit" @@ -56,12 +54,9 @@ desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ This circuit's delay can be customized, between 1/10th of a second to one hour. The delay is updated upon receiving a pulse." icon_state = "delay" - number_of_inputs = 1 - input_names = list( - "delay time", - ) + inputs = list("delay time") -/obj/item/integrated_circuit/time/delay/custom/work() +/obj/item/integrated_circuit/time/delay/custom/do_work() var/datum/integrated_io/delay_input = inputs[1] if(delay_input.data && isnum(delay_input.data) ) var/new_delay = min(delay_input.data, 1) @@ -75,27 +70,35 @@ desc = "This circuit sends an automatic pulse every four seconds." icon_state = "tick-m" complexity = 8 - number_of_inputs = 1 - number_of_activators = 1 - var/ticks_to_pulse = 2 + var/ticks_to_pulse = 4 var/ticks_completed = 0 - input_names = list( - "toggle ticking" - ) - activator_names = list( - "outgoing pulse" - ) - -/obj/item/integrated_circuit/time/ticker/New() - ..() - processing_objects |= src + var/is_running = FALSE + inputs = list("enable ticking") + activators = list("outgoing pulse") /obj/item/integrated_circuit/time/ticker/Destroy() - processing_objects -= src + if(is_running) + processing_objects -= src + . = ..() + +/obj/item/integrated_circuit/time/ticker/on_data_written() + var/datum/integrated_io/do_tick = inputs[1] + if(do_tick.data && !is_running) + is_running = TRUE + processing_objects |= src + else if(is_running) + is_running = FALSE + processing_objects -= src + ticks_completed = 0 /obj/item/integrated_circuit/time/ticker/process() - ticks_completed++ - if( (ticks_completed % ticks_to_pulse) == 0) + var/process_ticks = process_schedule_interval("obj") + ticks_completed += process_ticks + if(ticks_completed >= ticks_to_pulse) + if(ticks_to_pulse >= process_ticks) + ticks_completed -= ticks_to_pulse + else + ticks_completed = 0 var/datum/integrated_io/pulser = activators[1] pulser.push_data() @@ -104,41 +107,32 @@ desc = "This advanced circuit sends an automatic pulse every two seconds." icon_state = "tick-f" complexity = 12 - ticks_to_pulse = 1 + ticks_to_pulse = 2 /obj/item/integrated_circuit/time/ticker/slow name = "slow ticker" desc = "This simple circuit sends an automatic pulse every six seconds." icon_state = "tick-s" complexity = 4 - ticks_to_pulse = 3 - + ticks_to_pulse = 6 /obj/item/integrated_circuit/time/clock name = "integrated clock" desc = "Tells you what the local time is, specific to your station or planet." icon_state = "clock" - number_of_inputs = 0 - number_of_outputs = 4 - number_of_activators = 1 - output_names = list( - "time (string)", - "hours (number)", - "minutes (number)", - "seconds (number)" - ) + inputs = list() + outputs = list("time (string)", "hours (number)", "minutes (number)", "seconds (number)") -/obj/item/integrated_circuit/time/clock/work() - if(..()) - var/datum/integrated_io/time = outputs[1] - var/datum/integrated_io/hour = outputs[2] - var/datum/integrated_io/min = outputs[3] - var/datum/integrated_io/sec = outputs[4] +/obj/item/integrated_circuit/time/clock/do_work() + var/datum/integrated_io/time = outputs[1] + var/datum/integrated_io/hour = outputs[2] + var/datum/integrated_io/min = outputs[3] + var/datum/integrated_io/sec = outputs[4] - time.data = time2text(station_time_in_ticks, "hh:mm:ss") - hour.data = text2num(time2text(station_time_in_ticks, "hh")) - min.data = text2num(time2text(station_time_in_ticks, "mm")) - sec.data = text2num(time2text(station_time_in_ticks, "ss")) + time.data = time2text(station_time_in_ticks, "hh:mm:ss") + hour.data = text2num(time2text(station_time_in_ticks, "hh")) + min.data = text2num(time2text(station_time_in_ticks, "mm")) + sec.data = text2num(time2text(station_time_in_ticks, "ss")) - for(var/datum/integrated_io/output/O in outputs) - O.push_data() \ No newline at end of file + for(var/datum/integrated_io/output/O in outputs) + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/tools.dm index 5826068b9e..b0bc22cddc 100644 --- a/code/modules/integrated_electronics/tools.dm +++ b/code/modules/integrated_electronics/tools.dm @@ -12,71 +12,64 @@ icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "wirer-wire" flags = CONDUCT - w_class = ITEMSIZE_SMALL + w_class = 2 var/datum/integrated_io/selected_io = null var/mode = WIRE -/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." + to_chat(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." + to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.") return if(io.io_type != selected_io.io_type) - user << "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ - while the second is a [io.io_type]." + to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ + while the second is a [io.io_type].") return selected_io.linked |= io io.linked |= selected_io - user << "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name]." + to_chat(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. selected_io = null else if(mode == UNWIRE) selected_io = io if(!io.linked.len) - user << "There is nothing connected to \the [selected_io] data channel." + to_chat(user, "There is nothing connected to \the [selected_io] data channel.") selected_io = null return - user << "You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel." + to_chat(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) if(io == selected_io) - user << "You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \ - the same pin is rather moot." + to_chat(user, "You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \ + the same pin is rather moot.") return if(selected_io in io.linked) io.linked.Remove(selected_io) selected_io.linked.Remove(io) - user << "You disconnect \the [selected_io.holder]'s [selected_io.name] from \ - \the [io.holder]'s [io.name]." - //io.updateDialog() - //selected_io.updateDialog() + 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. 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." + to_chat(user, "\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \ + [io.name] are not connected.") return return @@ -86,18 +79,18 @@ mode = UNWIRE if(WIRING) if(selected_io) - user << "You decide not to wire the data channel." + to_chat(user, "You decide not to wire the data channel.") selected_io = null - mode = UNWIRE + mode = WIRE if(UNWIRE) mode = WIRE if(UNWIRING) if(selected_io) - user << "You decide not to disconnect the data channel." + to_chat(user, "You decide not to disconnect the data channel.") selected_io = null mode = UNWIRE update_icon() - user << "You set \the [src] to [mode]." + to_chat(user, "You set \the [src] to [mode].") #undef WIRE #undef WIRING @@ -111,49 +104,52 @@ icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "debugger" flags = CONDUCT - w_class = ITEMSIZE_SMALL + w_class = 2 var/data_to_write = null var/accepting_refs = 0 /obj/item/device/integrated_electronics/debugger/attack_self(mob/user) var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") + if(!CanInteract(user, physical_state)) + return + var/new_data = null switch(type_to_use) if("string") accepting_refs = 0 new_data = input("Now type in a string.","[src] string writing") as null|text - if(istext(new_data)) + if(istext(new_data) && CanInteract(user, physical_state)) data_to_write = new_data - user << "You set \the [src]'s memory to \"[new_data]\"." + to_chat(user, "You set \the [src]'s memory to \"[new_data]\".") if("number") accepting_refs = 0 new_data = input("Now type in a number.","[src] number writing") as null|num - if(isnum(new_data)) + if(isnum(new_data) && CanInteract(user, physical_state)) data_to_write = new_data - user << "You set \the [src]'s memory to [new_data]." + to_chat(user, "You set \the [src]'s memory to [new_data].") if("ref") accepting_refs = 1 - user << "You turn \the [src]'s ref scanner on. Slide it across \ - an object for a ref of that object to save it in memory." + to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ + an object for a ref of that object to save it in memory.") if("null") data_to_write = null - user << "You set \the [src]'s memory to absolutely nothing." + to_chat(user, "You set \the [src]'s memory to absolutely nothing.") /obj/item/device/integrated_electronics/debugger/afterattack(atom/target, mob/living/user, proximity) if(accepting_refs && proximity) data_to_write = target visible_message("[user] slides \a [src]'s over \the [target].") - user << "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ - now off." + to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ + now off.") accepting_refs = 0 /obj/item/device/integrated_electronics/debugger/proc/write_data(var/datum/integrated_io/io, mob/user) if(io.io_type == DATA_CHANNEL) io.write_data_to_pin(data_to_write) - user << "You write [data_to_write] to \the [io.holder]'s [io]." + to_chat(user, "You write '[data_to_write ? data_to_write : "NULL"]' to the '[io]' pin of \the [io.holder].") else if(io.io_type == PULSE_CHANNEL) - io.holder.work() - user << "You pulse \the [io.holder]'s [io]." + io.holder.check_then_do_work() + to_chat(user, "You pulse \the [io.holder]'s [io].") io.holder.interact(user) // This is to update the UI. @@ -162,13 +158,8 @@ desc = "This kit's essential for any circuitry projects." icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "circuit_kit" - w_class = ITEMSIZE_NORMAL - storage_slots = 200 - max_storage_space = ITEMSIZE_COST_NORMAL * 100 - max_w_class = ITEMSIZE_NORMAL + w_class = 3 display_contents_with_number = 1 - can_hold = list(/obj/item/integrated_circuit, /obj/item/device/integrated_electronics, /obj/item/device/electronic_assembly, - /obj/item/weapon/screwdriver, /obj/item/weapon/crowbar) /obj/item/weapon/storage/bag/circuits/basic/New() ..() @@ -199,29 +190,32 @@ ) for(var/thing in types_to_spawn) - var/i = 3 - while(i) + var/obj/item/integrated_circuit/ic = thing + if(initial(ic.category) == thing) + continue + + for(var/i = 1 to 4) new thing(src) - i-- new /obj/item/device/electronic_assembly(src) new /obj/item/device/integrated_electronics/wirer(src) new /obj/item/device/integrated_electronics/debugger(src) new /obj/item/weapon/crowbar(src) new /obj/item/weapon/screwdriver(src) + make_exact_fit() /obj/item/weapon/storage/bag/circuits/all/New() ..() - var/list/types_to_spawn = typesof(/obj/item/integrated_circuit) - - for(var/thing in types_to_spawn) - var/i = 10 - while(i) + for(var/thing in subtypesof(/obj/item/integrated_circuit)) + var/obj/item/integrated_circuit/ic = thing + if(initial(ic.category) == thing) + continue + for(var/i = 1 to 10) new thing(src) - i-- new /obj/item/device/electronic_assembly(src) new /obj/item/device/integrated_electronics/wirer(src) new /obj/item/device/integrated_electronics/debugger(src) new /obj/item/weapon/crowbar(src) - new /obj/item/weapon/screwdriver(src) \ No newline at end of file + new /obj/item/weapon/screwdriver(src) + make_exact_fit() \ No newline at end of file diff --git a/code/modules/integrated_electronics/~defines.dm b/code/modules/integrated_electronics/~defines.dm new file mode 100644 index 0000000000..7aea6dabbb --- /dev/null +++ b/code/modules/integrated_electronics/~defines.dm @@ -0,0 +1,6 @@ +#undef IC_INPUT +#undef IC_OUTPUT +#undef IC_ACTIVATOR + +#undef DATA_CHANNEL +#undef PULSE_CHANNEL \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 78715938c3..6f08e674bc 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1754,44 +1754,44 @@ CIRCUITS BELOW ..() name = "Custom circuitry \[Logic\] ([item_name])" -/datum/design/circuit/integrated_circuit/logic/equals +/datum/design/circuit/integrated_circuit/logic/binary/equals id = "cc-equals" - build_path = /obj/item/integrated_circuit/logic/equals + build_path = /obj/item/integrated_circuit/logic/binary/equals sort_string = "WAAFA" -/datum/design/circuit/integrated_circuit/logic/not +/datum/design/circuit/integrated_circuit/logic/unary/not id = "cc-not" - build_path = /obj/item/integrated_circuit/logic/not + build_path = /obj/item/integrated_circuit/logic/unary/not sort_string = "WAAFB" -/datum/design/circuit/integrated_circuit/logic/and +/datum/design/circuit/integrated_circuit/logic/binary/and id = "cc-and" - build_path = /obj/item/integrated_circuit/logic/and + build_path = /obj/item/integrated_circuit/logic/binary/and sort_string = "WAAFC" -/datum/design/circuit/integrated_circuit/logic/or +/datum/design/circuit/integrated_circuit/logic/binary/or id = "cc-or" - build_path = /obj/item/integrated_circuit/logic/or + build_path = /obj/item/integrated_circuit/logic/binary/or sort_string = "WAAFD" -/datum/design/circuit/integrated_circuit/logic/less_than +/datum/design/circuit/integrated_circuit/logic/binary/less_than id = "cc-less_than" - build_path = /obj/item/integrated_circuit/logic/less_than + build_path = /obj/item/integrated_circuit/logic/binary/less_than sort_string = "WAAFE" -/datum/design/circuit/integrated_circuit/logic/less_than_or_equal +/datum/design/circuit/integrated_circuit/logic/binary/less_than_or_equal id = "cc-less_than_or_equal" - build_path = /obj/item/integrated_circuit/logic/less_than_or_equal + build_path = /obj/item/integrated_circuit/logic/binary/less_than_or_equal sort_string = "WAAFF" -/datum/design/circuit/integrated_circuit/logic/greater_than +/datum/design/circuit/integrated_circuit/logic/binary/greater_than id = "cc-greater_than" - build_path = /obj/item/integrated_circuit/logic/greater_than + build_path = /obj/item/integrated_circuit/logic/binary/greater_than sort_string = "WAAFG" -/datum/design/circuit/integrated_circuit/logic/greater_than_or_equal +/datum/design/circuit/integrated_circuit/logic/binary/greater_than_or_equal id = "cc-greater_than_or_equal" - build_path = /obj/item/integrated_circuit/logic/greater_than_or_equal + build_path = /obj/item/integrated_circuit/logic/binary/greater_than_or_equal sort_string = "WAAFH" diff --git a/polaris.dme b/polaris.dme index 0c42f4e7a1..16fd036728 100644 --- a/polaris.dme +++ b/polaris.dme @@ -170,6 +170,7 @@ #include "code\datums\progressbar.dm" #include "code\datums\recipe.dm" #include "code\datums\sun.dm" +#include "code\datums\weakref.dm" #include "code\datums\autolathe\arms.dm" #include "code\datums\autolathe\autolathe.dm" #include "code\datums\autolathe\devices.dm" @@ -1378,6 +1379,7 @@ #include "code\modules\integrated_electronics\memory.dm" #include "code\modules\integrated_electronics\time.dm" #include "code\modules\integrated_electronics\tools.dm" +#include "code\modules\integrated_electronics\~defines.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm"