Adds associative list manipulation to circuits, updates a few list circuit components. (#77803)

This commit is contained in:
Watermelon914
2023-08-27 11:36:20 -04:00
committed by GitHub
parent 4aaecb92eb
commit 52b9c952b9
16 changed files with 190 additions and 39 deletions
@@ -0,0 +1,5 @@
/obj/item/circuit_component/variable/assoc_list
circuit_size = 1
/obj/item/circuit_component/variable/assoc_list/get_variable_list(obj/item/integrated_circuit/integrated_circuit)
return integrated_circuit.assoc_list_variables
@@ -0,0 +1,25 @@
/**
* # Associative List Remove Component
*
* Removes an element from an assoc list.
*/
/obj/item/circuit_component/variable/assoc_list/list_remove
display_name = "Associative List Remove"
desc = "Removes a key from an associative list variable."
category = "List"
/// Key to remove to the list
var/datum/port/input/to_remove
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
/obj/item/circuit_component/variable/assoc_list/list_remove/populate_ports()
to_remove = add_input_port("To Remove", PORT_TYPE_STRING)
/obj/item/circuit_component/variable/assoc_list/list_remove/input_received(datum/port/input/port, list/return_values)
if(!current_variable)
return
var/list/info = current_variable.value
var/value_to_remove = to_remove.value
info -= value_to_remove
@@ -0,0 +1,54 @@
/**
* # Assoc List Set Component
*
* Sets a string value on an assoc list.
*/
/obj/item/circuit_component/variable/assoc_list/list_set
display_name = "Associative List Set"
desc = "Sets a string key on an associative list to a specific value."
category = "List"
/// Key to set
var/datum/port/input/key
/// Value to set the key to.
var/datum/port/input/value
/// For when the list is too long, a signal is sent here.
var/datum/port/output/failed
var/max_list_size = 500
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL
/obj/item/circuit_component/variable/assoc_list/list_set/get_ui_notices()
. = ..()
. += create_ui_notice("Max List Size: [max_list_size]", "orange", "sitemap")
/obj/item/circuit_component/variable/assoc_list/list_set/populate_ports()
key = add_input_port("Key", PORT_TYPE_STRING)
value = add_input_port("Value", PORT_TYPE_ANY)
failed = add_output_port("Failed", PORT_TYPE_SIGNAL)
/obj/item/circuit_component/variable/assoc_list/list_set/pre_input_received(datum/port/input/port)
. = ..()
if(current_variable)
value.set_datatype(current_variable.datatype_handler.get_datatype(2))
/obj/item/circuit_component/variable/assoc_list/list_set/input_received(datum/port/input/port, list/return_values)
if(!current_variable)
return
var/list/info = current_variable.value
var/key_to_set = key.value
var/value_to_set = value.value
if(!key_to_set)
failed.set_output(COMPONENT_SIGNAL)
return
if(length(info) >= max_list_size)
failed.set_output(COMPONENT_SIGNAL)
return
if(isdatum(value_to_set))
value_to_set = WEAKREF(value_to_set)
info[key_to_set] = value_to_set
@@ -1,11 +1,11 @@
/**
* # List Add Component
* # List Find Component
*
* Adds an element to a list.
* Finds an element in a list and returns the index.
*/
/obj/item/circuit_component/listin
display_name = "Element Find"
desc = "Checks if an element is in a list."
desc = "Checks if an element is in a list and returns the index it is as if it is. Index is set to 0 on failure."
category = "List"
/// The list type we're checking
@@ -22,6 +22,8 @@
var/datum/port/output/not_found
/// Result of the search
var/datum/port/output/result
/// Index of the element if found.
var/datum/port/output/index
circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL
@@ -35,6 +37,7 @@
found = add_output_port("Succeeded", PORT_TYPE_SIGNAL)
not_found = add_output_port("Failed", PORT_TYPE_SIGNAL)
result = add_output_port("Result", PORT_TYPE_NUMBER)
index = add_output_port("Index", PORT_TYPE_NUMBER)
/obj/item/circuit_component/listin/pre_input_received(datum/port/input/port)
. = ..()
@@ -50,9 +53,11 @@
if(isdatum(data_to_check))
data_to_check = WEAKREF(data_to_check)
var/actual_result = (data_to_check in info)
if(actual_result)
var/actual_result = info.Find(data_to_check)
index.set_output(actual_result)
if(actual_result != 0)
result.set_output(TRUE)
found.set_output(COMPONENT_SIGNAL)
else
result.set_output(FALSE)
not_found.set_output(COMPONENT_SIGNAL)
result.set_output(actual_result)