From d4df0f5ee2617d4fb121ea4064cd3a1c6c320598 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 3 Jul 2021 23:24:30 +0200 Subject: [PATCH] [MIRROR] RAM now has an option to select between types. Refactored the any type to be more friendly with circuit code. (#6681) * RAM now has an option to select between types. Refactored the any type to be more friendly with circuit code. (#59953) RAM now has an option to select between types and an output signal. Refactored the any type to be more friendly with user displays. Code that includes changing type is no longer hard to read because of snowflake code for the "any" type. RAM can now more easily act as a constant value component. RAM also has an output signal because it should and the fact that it doesn't was an oversight when converting everything to use input and output signals. * RAM now has an option to select between types. Refactored the any type to be more friendly with circuit code. Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> --- code/__DEFINES/wiremod.dm | 4 +-- code/modules/wiremod/component.dm | 20 -------------- .../wiremod/components/utility/combiner.dm | 13 ++++----- .../wiremod/components/utility/multiplexer.dm | 15 +++++------ .../modules/wiremod/components/utility/ram.dm | 27 ++++++++++++++++--- code/modules/wiremod/integrated_circuit.dm | 2 +- code/modules/wiremod/port.dm | 2 +- 7 files changed, 37 insertions(+), 46 deletions(-) diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index 1c8dad6379f..784dcaa3e3c 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -7,7 +7,7 @@ // Port types. Determines what the port can connect to /// Can accept any datatype. Only works for inputs, output types will runtime. -#define PORT_TYPE_ANY null +#define PORT_TYPE_ANY "any" // Fundamental datatypes /// String datatype @@ -26,8 +26,6 @@ // Other datatypes /// Atom datatype #define PORT_TYPE_ATOM "entity" -/// Any datatype (USED ONLY FOR DISPLAY, DO NOT USE) -#define COMP_TYPE_ANY "any" /// The maximum range between a port and an atom diff --git a/code/modules/wiremod/component.dm b/code/modules/wiremod/component.dm index 9ed55616bb6..82edd1c9876 100644 --- a/code/modules/wiremod/component.dm +++ b/code/modules/wiremod/component.dm @@ -131,26 +131,6 @@ current_option = option TRIGGER_CIRCUIT_COMPONENT(src, null) -/** - * Matches the output port's datatype with the input port's current connected port. - * - * Returns true if datatype was changed, otherwise returns false. - * Arguments: - * * input_port - The input port to check the connected port from. - * * output_port - The output port to convert. Warning, this does change the output port. - */ -/obj/item/circuit_component/proc/match_port_datatype(datum/port/input/input_port, datum/port/output/output_port) - if(input_port.connected_port) - var/datum/port/connected_port = input_port.connected_port - if(connected_port.datatype != output_port.datatype) - output_port.set_datatype(connected_port.datatype) - return TRUE - else - output_port.set_datatype(output_port.default_datatype) - return TRUE - return FALSE - - /** * Adds an input port and returns it * diff --git a/code/modules/wiremod/components/utility/combiner.dm b/code/modules/wiremod/components/utility/combiner.dm index 7857f0f260a..67f314faeb4 100644 --- a/code/modules/wiremod/components/utility/combiner.dm +++ b/code/modules/wiremod/components/utility/combiner.dm @@ -16,7 +16,7 @@ /obj/item/circuit_component/combiner/populate_options() var/static/component_options = list( - COMP_TYPE_ANY, + PORT_TYPE_ANY, PORT_TYPE_STRING, PORT_TYPE_NUMBER, PORT_TYPE_LIST, @@ -27,12 +27,11 @@ /obj/item/circuit_component/combiner/Initialize() . = ..() - current_option = COMP_TYPE_ANY - current_type = COMP_TYPE_ANY + current_type = current_option for(var/port_id in 1 to input_port_amount) var/letter = ascii2text(text2ascii("A") + (port_id-1)) - add_input_port(letter, PORT_TYPE_ANY) - output_port = add_output_port("Output", PORT_TYPE_ANY) + add_input_port(letter, current_option) + output_port = add_output_port("Output", current_option) /obj/item/circuit_component/combiner/Destroy() output_port = null @@ -40,10 +39,8 @@ /obj/item/circuit_component/combiner/input_received(datum/port/input/port) . = ..() - if(current_type != current_option && (current_option != COMP_TYPE_ANY || current_type != PORT_TYPE_ANY)) + if(current_type != current_option) current_type = current_option - if(current_type == COMP_TYPE_ANY) - current_type = PORT_TYPE_ANY for(var/datum/port/input/input_port as anything in input_ports) input_port.set_datatype(current_type) output_port.set_datatype(current_type) diff --git a/code/modules/wiremod/components/utility/multiplexer.dm b/code/modules/wiremod/components/utility/multiplexer.dm index 9ea48e70a0d..756d9ee92f7 100644 --- a/code/modules/wiremod/components/utility/multiplexer.dm +++ b/code/modules/wiremod/components/utility/multiplexer.dm @@ -24,7 +24,7 @@ /obj/item/circuit_component/multiplexer/populate_options() var/static/component_options = list( - COMP_TYPE_ANY, + PORT_TYPE_ANY, PORT_TYPE_STRING, PORT_TYPE_NUMBER, PORT_TYPE_LIST, @@ -34,13 +34,12 @@ /obj/item/circuit_component/multiplexer/Initialize() . = ..() - current_option = COMP_TYPE_ANY - current_type = COMP_TYPE_ANY + current_type = current_option input_port = add_input_port("Selector", PORT_TYPE_NUMBER, default = 1) multiplexer_inputs = list() for(var/port_id in 1 to input_port_amount) - multiplexer_inputs += add_input_port("Port [port_id]", PORT_TYPE_ANY) - output_port = add_output_port("Output", PORT_TYPE_ANY) + multiplexer_inputs += add_input_port("Port [port_id]", current_type) + output_port = add_output_port("Output", current_type) /obj/item/circuit_component/multiplexer/Destroy() output_port = null @@ -51,16 +50,14 @@ /obj/item/circuit_component/multiplexer/input_received(datum/port/input/port) . = ..() - if(current_type != current_option && (current_option != COMP_TYPE_ANY || current_type != PORT_TYPE_ANY)) + if(current_type != current_option) current_type = current_option - if(current_type == COMP_TYPE_ANY) - current_type = PORT_TYPE_ANY for(var/datum/port/input/input_port as anything in multiplexer_inputs) input_port.set_datatype(current_type) output_port.set_datatype(current_type) input_port.set_input(clamp(input_port.input_value || 1, 1, input_port_amount), FALSE) if(.) - return TRUE + return output_port.set_output(multiplexer_inputs[input_port.input_value].input_value) diff --git a/code/modules/wiremod/components/utility/ram.dm b/code/modules/wiremod/components/utility/ram.dm index 9c8e120cd81..abceb5ead11 100644 --- a/code/modules/wiremod/components/utility/ram.dm +++ b/code/modules/wiremod/components/utility/ram.dm @@ -8,6 +8,7 @@ /obj/item/circuit_component/ram display_name = "RAM" display_desc = "A component that retains a variable." + circuit_flags = CIRCUIT_FLAG_OUTPUT_SIGNAL /// The input to store var/datum/port/input/input_port @@ -19,13 +20,27 @@ /// The current set value var/datum/port/output/output + var/current_type + +/obj/item/circuit_component/ram/populate_options() + var/static/component_options = list( + PORT_TYPE_ANY, + PORT_TYPE_STRING, + PORT_TYPE_NUMBER, + PORT_TYPE_LIST, + PORT_TYPE_ATOM, + PORT_TYPE_SIGNAL, + ) + options = component_options + /obj/item/circuit_component/ram/Initialize() . = ..() - input_port = add_input_port("Input", PORT_TYPE_ANY) + current_type = current_option + input_port = add_input_port("Input", current_type) trigger = add_input_port("Store", PORT_TYPE_SIGNAL) clear = add_input_port("Clear", PORT_TYPE_SIGNAL) - output = add_output_port("Stored Value", PORT_TYPE_ANY) + output = add_output_port("Stored Value", current_type) /obj/item/circuit_component/ram/Destroy() input_port = null @@ -36,7 +51,11 @@ /obj/item/circuit_component/ram/input_received(datum/port/input/port) . = ..() - match_port_datatype(input_port, output) + if(current_type != current_option) + current_type = current_option + input_port.set_datatype(current_type) + output.set_datatype(current_type) + if(.) return @@ -45,7 +64,7 @@ return if(!COMPONENT_TRIGGERED_BY(trigger, port)) - return + return TRUE var/input_val = input_port.input_value diff --git a/code/modules/wiremod/integrated_circuit.dm b/code/modules/wiremod/integrated_circuit.dm index afa84c431c2..fe9011559ee 100644 --- a/code/modules/wiremod/integrated_circuit.dm +++ b/code/modules/wiremod/integrated_circuit.dm @@ -297,7 +297,7 @@ var/datum/port/input/input_port = input_component.input_ports[input_port_id] var/datum/port/output/output_port = output_component.output_ports[output_port_id] - if(input_port.datatype && !output_port.compatible_datatype(input_port.datatype)) + if(input_port.datatype != PORT_TYPE_ANY && !output_port.compatible_datatype(input_port.datatype)) return input_port.register_output_port(output_port) diff --git a/code/modules/wiremod/port.dm b/code/modules/wiremod/port.dm index 51c6eab8afa..212610ce8e9 100644 --- a/code/modules/wiremod/port.dm +++ b/code/modules/wiremod/port.dm @@ -155,7 +155,7 @@ set_output(null) /** - * Determines if a datatype is compatible with this port. + * Determines if a datatype is compatible with another port of a different type. * * Arguments: * * other_datatype - The datatype to check