mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 07:38:05 +01:00
Adds associative list manipulation to circuits, updates a few list circuit components. (#77803)
This commit is contained in:
@@ -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
|
||||
+11
-6
@@ -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)
|
||||
Reference in New Issue
Block a user