diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/arithmetic.dm index 31265e297e..63925dae5f 100644 --- a/code/modules/integrated_electronics/arithmetic.dm +++ b/code/modules/integrated_electronics/arithmetic.dm @@ -11,6 +11,9 @@ /obj/item/integrated_circuit/arithmetic/addition name = "addition circuit" desc = "This circuit can add numbers together." + extended_desc = "The order that the calculation goes is;
\ + result = ((((A + B) + C) + D) ... ) and so on, until all pins have been added. \ + Null pins are ignored." icon_state = "addition" /obj/item/integrated_circuit/arithmetic/addition/do_work() @@ -29,30 +32,47 @@ /obj/item/integrated_circuit/arithmetic/subtraction name = "subtraction circuit" desc = "This circuit can subtract numbers." + extended_desc = "The order that the calculation goes is;
\ + result = ((((A - B) - C) - D) ... ) and so on, until all pins have been subtracted. \ + Null pins are ignored. Pin A must be a number or the circuit will not function." icon_state = "subtraction" /obj/item/integrated_circuit/arithmetic/subtraction/do_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 + var/datum/integrated_io/A = inputs[1] + if(!isnum(A.data)) + return + var/result = A.data - for(var/datum/integrated_io/output/O in outputs) - O.data = result - O.push_data() + for(var/datum/integrated_io/input/I in inputs) + if(I == A) + continue + 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() // *Multiply* // /obj/item/integrated_circuit/arithmetic/multiplication name = "multiplication circuit" desc = "This circuit can multiply numbers." + extended_desc = "The order that the calculation goes is;
\ + result = ((((A * B) * C) * D) ... ) and so on, until all pins have been multiplied. \ + Null pins are ignored. Pin A must be a number or the circuit will not function." icon_state = "multiplication" -/obj/item/integrated_circuit/arithmetic/subtraction/do_work() - var/result = 0 + +/obj/item/integrated_circuit/arithmetic/multiplication/do_work() + var/datum/integrated_io/A = inputs[1] + if(!isnum(A.data)) + return + var/result = A.data for(var/datum/integrated_io/input/I in inputs) + if(I == A) + continue I.pull_data() if(isnum(I.data)) result = result * I.data @@ -66,11 +86,20 @@ /obj/item/integrated_circuit/arithmetic/division name = "division circuit" desc = "This circuit can divide numbers, just don't think about trying to divide by zero!" + extended_desc = "The order that the calculation goes is;
\ + result = ((((A / B) / C) / D) ... ) and so on, until all pins have been divided. \ + Null pins, and pins containing 0, are ignored. Pin A must be a number or the circuit will not function." icon_state = "division" /obj/item/integrated_circuit/arithmetic/division/do_work() - var/result = 0 + var/datum/integrated_io/A = inputs[1] + if(!isnum(A.data)) + return + var/result = A.data + for(var/datum/integrated_io/input/I in inputs) + if(I == A) + continue I.pull_data() if(isnum(I.data) && I.data != 0) //No runtimes here. result = result / I.data @@ -79,6 +108,73 @@ O.data = result O.push_data() +//^ Exponent ^// + +/obj/item/integrated_circuit/arithmetic/exponent + name = "exponent circuit" + desc = "Outputs A to the power of B." + icon_state = "exponent" + inputs = list("A", "B") + +/obj/item/integrated_circuit/arithmetic/exponent/do_work() + var/result = 0 + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/B = inputs[2] + if(isnum(A.data) && isnum(B.data)) + result = A.data ** B.data + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// +-Sign-+ // + +/obj/item/integrated_circuit/arithmetic/sign + name = "sign circuit" + desc = "This will say if a number is positive, negative, or zero." + extended_desc = "Will output 1, -1, or 0, depending on if A is a postive number, a negative number, or zero, respectively." + icon_state = "sign" + inputs = list("A") + +/obj/item/integrated_circuit/arithmetic/sign/do_work() + var/result = 0 + var/datum/integrated_io/A = inputs[1] + if(isnum(A.data)) + if(A.data > 0) + result = 1 + else if (A.data < 0) + result = -1 + else + result = 0 + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// Round // + +/obj/item/integrated_circuit/arithmetic/round + name = "round circuit" + desc = "Rounds A to the nearest B multiple of A." + extended_desc = "If B is not given a number, it will output the floor of A instead." + icon_state = "round" + inputs = list("A", "B") + +/obj/item/integrated_circuit/arithmetic/round/do_work() + var/result = 0 + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/B = inputs[2] + if(isnum(A.data)) + if(isnum(B.data) && B.data != 0) + result = round(A.data, B.data) + else + result = round(A.data) + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + + // Absolute // /obj/item/integrated_circuit/arithmetic/absolute @@ -103,6 +199,7 @@ /obj/item/integrated_circuit/arithmetic/average name = "average circuit" desc = "This circuit is of average quality, however it will compute the average for numbers you give it." + extended_desc = "Note that null pins are ignored, where as a pin containing 0 is included in the averaging calculation." icon_state = "average" /obj/item/integrated_circuit/arithmetic/average/do_work() @@ -137,6 +234,8 @@ /obj/item/integrated_circuit/arithmetic/random name = "random number generator circuit" desc = "This gives a random (integer) number between values A and B inclusive." + extended_desc = "'Inclusive' means that the upper bound is included in the range of numbers, e.g. L = 1 and H = 3 will allow \ + for outputs of 1, 2, or 3. L being the higher number is not strictly required." icon_state = "random" inputs = list("L","H") diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 38f3022c9c..355ced2d4d 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1629,6 +1629,21 @@ CIRCUITS BELOW build_path = /obj/item/integrated_circuit/arithmetic/random sort_string = "WAAAH" +/datum/design/circuit/integrated_circuit/arithmetic/round + id = "cc-round" + build_path = /obj/item/integrated_circuit/arithmetic/round + sort_string = "WAAAI" + +/datum/design/circuit/integrated_circuit/arithmetic/exponent + id = "cc-exponent" + build_path = /obj/item/integrated_circuit/arithmetic/exponent + sort_string = "WAAAJ" + +/datum/design/circuit/integrated_circuit/arithmetic/sign + id = "cc-sign" + build_path = /obj/item/integrated_circuit/arithmetic/sign + sort_string = "WAAAK" + /datum/design/circuit/integrated_circuit/converter/AssembleDesignName() diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi index c46a47ebbd..bd5263b7f3 100644 Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ