diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index d01fae862f9..43038a63195 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -24,6 +24,8 @@ #define PORT_TYPE_SIGNAL "signal" /// List datatype #define PORT_TYPE_LIST "list" +/// Associative List datatype. Derivative of list. +#define PORT_TYPE_ASSOC_LIST "assoc list" /// Table datatype. Derivative of list, contains other lists with matching columns. #define PORT_TYPE_TABLE "table" /// Options datatype. Derivative of string. diff --git a/code/_globalvars/lists/wiremod.dm b/code/_globalvars/lists/wiremod.dm index 716a4042283..ea1349ee5a4 100644 --- a/code/_globalvars/lists/wiremod.dm +++ b/code/_globalvars/lists/wiremod.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(wiremod_basic_types, list( PORT_TYPE_SIGNAL, PORT_TYPE_LIST, PORT_TYPE_TABLE, + PORT_TYPE_ASSOC_LIST, PORT_TYPE_ATOM, )) @@ -17,4 +18,5 @@ GLOBAL_LIST_INIT(wiremod_fundamental_types, list( PORT_TYPE_DATUM, PORT_TYPE_STRING, PORT_TYPE_LIST, + PORT_TYPE_ASSOC_LIST, )) diff --git a/code/modules/wiremod/components/admin/animate.dm b/code/modules/wiremod/components/admin/animate.dm new file mode 100644 index 00000000000..8166f4f8dd8 --- /dev/null +++ b/code/modules/wiremod/components/admin/animate.dm @@ -0,0 +1,112 @@ +#define COMP_ANIMATE_ATOM "Object" +#define COMP_ANIMATE_FILTER "Filter" + +/obj/item/circuit_component/begin_animation + display_name = "Begin Animation" + desc = "Begins an animation on the target. Create animation steps by chaining \"Animation Step\" components off of the \"Perform Animation\" port." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_INSTANT|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/target + + var/datum/port/input/animation_loops + + var/datum/port/output/animate_event + +/obj/item/circuit_component/begin_animation/populate_ports() + target = add_input_port("Target", PORT_TYPE_ATOM) + animation_loops = add_input_port("Loops", PORT_TYPE_NUMBER) + animate_event = add_output_port("Perform Animation", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/begin_animation/input_received(datum/port/input/port, list/return_values) + if(!target.value) + return + + SScircuit_component.queue_instant_run() + animate_event.set_output(COMPONENT_SIGNAL) + var/list/result = SScircuit_component.execute_instant_run() + + if(!result) + return + + var/atom/target_atom = target.value + var/last_step_used_filter = FALSE + if(result["animation_steps"]) + animate(target_atom, pixel_x = pixel_x, time = 0, loop = animation_loops.value, flags = ANIMATION_PARALLEL) //Just to start the animation + for(var/list/step in result["animation_steps"]) + if(step["filter"]) + var/filter = target_atom.get_filter(step["filter"]) + if(filter) + last_step_used_filter = TRUE + animate(filter, step["vars"], time = step["time"], easing = step["easing"], flags = step["flags"]) + var/list/filter_params = target_atom.filter_data[step["filter"]] + for(var/param in step["vars"]) + if(filter_params.Find(param)) + filter_params[param] = step["vars"][param] + else + if(last_step_used_filter) + last_step_used_filter = FALSE + animate(target_atom, step["vars"], time = step["time"], easing = step["easing"], flags = step["flags"]) + else + animate(time = step["time"], step["vars"], easing = step["easing"], flags = step["flags"]) + +/obj/item/circuit_component/animation_step + display_name = "Animation Step" + desc = "Perform a single animation step. The input of this component should be connected, directly or indirectly, to the \"Perform Animation\" port of a \"Begin Animation\" component." + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/option/atom_or_filter + + var/datum/port/input/animation_variables + + var/datum/port/input/animation_filter + + var/datum/port/input/animation_time + var/datum/port/input/animation_easing + var/datum/port/input/animation_flags + +/obj/item/circuit_component/animation_step/populate_options() + var/static/list/component_options = list( + COMP_ANIMATE_ATOM, + COMP_ANIMATE_FILTER, + ) + + atom_or_filter = add_option_port("Target", component_options) + +/obj/item/circuit_component/animation_step/populate_ports() + animation_variables = add_input_port("Variables", PORT_TYPE_ASSOC_LIST, order = 1.66) + animation_time = add_input_port("Time", PORT_TYPE_NUMBER, order = 1.66) + animation_easing = add_input_port("Easing", PORT_TYPE_NUMBER, order = 1.66) + animation_flags = add_input_port("Flags", PORT_TYPE_NUMBER, order = 1.66) + +/obj/item/circuit_component/animation_step/pre_input_received(datum/port/input/port) + if(port == atom_or_filter) + if((atom_or_filter.value == COMP_ANIMATE_ATOM) && animation_filter) + remove_input_port(animation_filter) + animation_filter = null + else if((atom_or_filter.value == COMP_ANIMATE_FILTER) && !animation_filter) + animation_filter = add_input_port("Filter Name", PORT_TYPE_STRING, order = 1.33) + +/obj/item/circuit_component/animation_step/input_received(datum/port/input/port, list/return_values) + if(!return_values) + return + + if(!return_values["animation_steps"]) + return_values["animation_steps"] = list() + + var/list/variables = animation_variables.value + + var/list/step = list( + "vars" = variables.Copy(), + "time" = animation_time.value, + "easing" = animation_easing.value, + "flags" = animation_flags.value + ) + + if(atom_or_filter.value == COMP_ANIMATE_FILTER) + step["filter"] = animation_filter.value + + return_values["animation_steps"] += list(step) + +#undef COMP_ANIMATE_ATOM +#undef COMP_ANIMATE_FILTER diff --git a/code/modules/wiremod/components/admin/filter.dm b/code/modules/wiremod/components/admin/filter.dm new file mode 100644 index 00000000000..e7a3854a9b0 --- /dev/null +++ b/code/modules/wiremod/components/admin/filter.dm @@ -0,0 +1,313 @@ +GLOBAL_LIST_INIT(wiremod_filter_info, list( + "alpha" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "icon" = PORT_TYPE_STRING, + "render_source" = PORT_TYPE_STRING, + "flags" = PORT_TYPE_NUMBER, + ), + "angular_blur" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + ), + "color" = list( + "color" = PORT_TYPE_LIST, + "space" = PORT_TYPE_NUMBER, + ), + "displace" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + "icon" = PORT_TYPE_STRING, + "render_source" = PORT_TYPE_NUMBER, + ), + "drop_shadow" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + "offset" = PORT_TYPE_NUMBER, + "color" = PORT_TYPE_STRING, + ), + "blur" = list( + "size" = PORT_TYPE_NUMBER, + ), + "layer" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "icon" = PORT_TYPE_STRING, + "render_source" = PORT_TYPE_STRING, + "flags" = PORT_TYPE_NUMBER, + "color" = PORT_TYPE_STRING, + "transform" = PORT_TYPE_LIST, + "blend_mode" = PORT_TYPE_NUMBER, + ), + "motion_blur" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + ), + "outline" = list( + "size" = PORT_TYPE_NUMBER, + "color" = PORT_TYPE_STRING, + "flags" = PORT_TYPE_NUMBER, + ), + "radial_blur" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + ), + "rays" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + "color" = PORT_TYPE_STRING, + "offset" = PORT_TYPE_NUMBER, + "density" = PORT_TYPE_NUMBER, + "threshold" = PORT_TYPE_NUMBER, + "factor" = PORT_TYPE_NUMBER, + "flags" = PORT_TYPE_NUMBER, + ), + "ripple" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + "repeat" = PORT_TYPE_NUMBER, + "radius" = PORT_TYPE_NUMBER, + "falloff" = PORT_TYPE_NUMBER, + "flags" = PORT_TYPE_NUMBER, + ), + "wave" = list( + "x" = PORT_TYPE_NUMBER, + "y" = PORT_TYPE_NUMBER, + "size" = PORT_TYPE_NUMBER, + "offset" = PORT_TYPE_NUMBER, + "flags" = PORT_TYPE_NUMBER, + ), +)) + +GLOBAL_LIST_INIT(wiremod_flag_info, list( + "Animation Easing" = list( + "Easing Type" = list( + "LINEAR_EASING" = LINEAR_EASING, + "SINE_EASING" = SINE_EASING, + "CIRCULAR_EASING" = CIRCULAR_EASING, + "QUAD_EASING" = QUAD_EASING, + "CUBIC_EASING" = CUBIC_EASING, + "BOUNCE_EASING" = BOUNCE_EASING, + "ELASTIC_EASING" = ELASTIC_EASING, + "BACK_EASING" = BACK_EASING, + "JUMP_EASING" = JUMP_EASING, + ), + "EASE_IN" = EASE_IN, + "EASE_OUT" = EASE_OUT, + ), + "Animation Flags" = list( + "ANIMATION_END_NOW" = ANIMATION_END_NOW, + "ANIMATION_LINEAR_TRANSFORM" = ANIMATION_LINEAR_TRANSFORM, + "ANIMATION_PARALLEL" = ANIMATION_PARALLEL, + "ANIMATION_RELATIVE" = ANIMATION_RELATIVE, + ), + "Alpha Filter Flags" = list( + "MASK_INVERSE" = MASK_INVERSE, + "MASK_SWAP" = MASK_SWAP, + ), + "Color Space" = list("_" = list( + "COLORSPACE_RGB" = COLORSPACE_RGB, + "COLORSPACE_HSV" = COLORSPACE_HSV, + "COLORSPACE_HSL" = COLORSPACE_HSL, + "COLORSPACE_HCY" = COLORSPACE_HCY, + )), + "Layering Flags" = list("_" = list( + "FILTER_OVERLAY" = FILTER_OVERLAY, + "FILTER_UNDERLAY" = FILTER_UNDERLAY, + )), + "Layering Blend Mode" = list("_" = list( + "BLEND_OVERLAY" = BLEND_OVERLAY, + "BLEND_ADD" = BLEND_ADD, + "BLEND_SUBTRACT" = BLEND_SUBTRACT, + "BLEND_MULTIPLY" = BLEND_MULTIPLY, + "BLEND_INSET_OVERLAY" = BLEND_INSET_OVERLAY, + )), + "Outline Flags" = list( + "OUTLINE_SHARP" = OUTLINE_SHARP, + "OUTLINE_SQUARE" = OUTLINE_SQUARE, + ), + "Ray Flags" = list( + "FILTER_OVERLAY" = FILTER_OVERLAY, + "FILTER_UNDERLAY" = FILTER_UNDERLAY, + ), + "Ripple Flags" = list( + "WAVE_BOUNDED" = WAVE_BOUNDED, + ), + "Wave Flags" = list( + "WAVE_BOUNDED" = WAVE_BOUNDED, + "WAVE_SIDEWAYS" = WAVE_SIDEWAYS, + ), +)) + +/obj/item/circuit_component/filter_helper + display_name = "Filter Parameter Helper" + desc = "Constructs a list of filter parameters from the inputs." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/option/filter_type_port + var/current_filter_type + + var/list/filter_params = list() + + var/datum/port/output/output_params + +/obj/item/circuit_component/filter_helper/populate_options() + filter_type_port = add_option_port("Filter Type", assoc_to_keys(GLOB.wiremod_filter_info)) + +/obj/item/circuit_component/filter_helper/populate_ports() + current_filter_type = filter_type_port.value + output_params = add_output_port("Parameters", PORT_TYPE_ASSOC_LIST) + handle_filter_type_changed() + +/obj/item/circuit_component/filter_helper/pre_input_received(datum/port/input/port) + if((port == filter_type_port) && filter_type_port.value != current_filter_type) + current_filter_type = filter_type_port.value + handle_filter_type_changed() + +/obj/item/circuit_component/filter_helper/proc/handle_filter_type_changed() + for(var/param_name in filter_params) + remove_input_port(filter_params[param_name]) + filter_params.Cut() + for(var/param_name in GLOB.wiremod_filter_info[current_filter_type]) + filter_params[param_name] = add_input_port(param_name, + GLOB.wiremod_filter_info[current_filter_type][param_name], + default = GLOB.master_filter_info?[current_filter_type]["defaults"][param_name]) + +/obj/item/circuit_component/filter_helper/input_received(datum/port/input/port, list/return_values) + var/list/new_params = list() + for(var/param_name in filter_params) + var/datum/port/input/param_port = filter_params[param_name] + if(!isnull(param_port.value)) + new_params[param_name] = param_port.value + + output_params.set_value(new_params) + +/obj/item/circuit_component/filter_adder + display_name = "Add Filter" + desc = "Adds a filter to the target atom." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/target_port + var/datum/port/input/filter_name + var/datum/port/input/filter_priority + var/datum/port/input/option/filter_type_port + var/current_filter_type + + var/list/filter_params = list() + +/obj/item/circuit_component/filter_adder/populate_options() + filter_type_port = add_option_port("Filter Type", assoc_to_keys(GLOB.wiremod_filter_info)) + +/obj/item/circuit_component/filter_adder/populate_ports() + current_filter_type = filter_type_port.value + target_port = add_input_port("Target", PORT_TYPE_ATOM) + filter_name = add_input_port("Filter Name", PORT_TYPE_STRING) + filter_priority = add_input_port("Priority", PORT_TYPE_NUMBER) + handle_filter_type_changed() + +/obj/item/circuit_component/filter_adder/pre_input_received(datum/port/input/port) + if((port == filter_type_port) && filter_type_port.value != current_filter_type) + current_filter_type = filter_type_port.value + handle_filter_type_changed() + +/obj/item/circuit_component/filter_adder/proc/handle_filter_type_changed() + for(var/param_name in filter_params) + remove_input_port(filter_params[param_name]) + filter_params.Cut() + for(var/param_name in GLOB.wiremod_filter_info[current_filter_type]) + filter_params[param_name] = add_input_port(param_name, + GLOB.wiremod_filter_info[current_filter_type][param_name], + order = 1.5, + default = GLOB.master_filter_info?[current_filter_type]["defaults"][param_name]) + +/obj/item/circuit_component/filter_adder/input_received(datum/port/input/port, list/return_values) + var/atom/target_atom = target_port.value + if(!target_atom) + return + + var/list/new_params = list() + new_params["type"] = current_filter_type + for(var/param_name in filter_params) + var/datum/port/input/param_port = filter_params[param_name] + new_params[param_name] = param_port.value + + target_atom.add_filter(filter_name.value, filter_priority.value, new_params) + +/obj/item/circuit_component/filter_remover + display_name = "Filter Remover" + desc = "Removes the specified filter from the target." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/target_port + var/datum/port/input/filter_name + +/obj/item/circuit_component/filter_remover/populate_ports() + target_port = add_input_port("Target", PORT_TYPE_ATOM) + filter_name = add_input_port("Filter Name", PORT_TYPE_STRING) + +/obj/item/circuit_component/filter_remover/input_received(datum/port/input/port) + var/atom/target_atom = target_port.value + if(!target_atom) + return + + target_atom.remove_filter(filter_name.value) + +/obj/item/circuit_component/bitflag_helper + display_name = "Animation & Filter Bitflag Helper" + desc = "Allows you to construct bitflags for BYOND animation and filter parameters without having to manually search for the corresponding values." + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL|CIRCUIT_FLAG_ADMIN + + var/datum/port/input/option/bitflag_port + var/current_bitflag + + var/list/flag_ports = list() + + var/datum/port/output/output_bitflag + +/obj/item/circuit_component/bitflag_helper/populate_options() + bitflag_port = add_option_port("Bitflag Type", assoc_to_keys(GLOB.wiremod_flag_info)) + +/obj/item/circuit_component/bitflag_helper/populate_ports() + current_bitflag = bitflag_port.value + handle_bitflag_type_changed() + output_bitflag = add_output_port("Output", PORT_TYPE_NUMBER) + +/obj/item/circuit_component/bitflag_helper/pre_input_received(datum/port/input/port) + if(port == bitflag_port && bitflag_port.value != current_bitflag) + current_bitflag = bitflag_port.value + handle_bitflag_type_changed() + +/obj/item/circuit_component/bitflag_helper/proc/handle_bitflag_type_changed() + for(var/flag_name in flag_ports) + remove_input_port(flag_ports[flag_name]) + flag_ports.Cut() + + var/list/flags = GLOB.wiremod_flag_info[current_bitflag] + for(var/flag in flags) + if(islist(flags[flag])) + flag_ports[flag] = add_option_port(flag == "_" ? current_bitflag : flag, flags[flag]) + else + flag_ports[flag] = add_input_port(flag, PORT_TYPE_NUMBER) + +/obj/item/circuit_component/bitflag_helper/input_received(datum/port/input/port) + var/new_output = 0 + var/list/flags = GLOB.wiremod_flag_info[current_bitflag] + for(var/flag in flags) + if(!flag_ports[flag]) + continue + else + var/datum/port/input/flag_port = flag_ports[flag] + if(islist(flags[flag])) + var/list/flag_options = flags[flag] + new_output += flag_options[flag_port.value] + else if(flag_port.value) + new_output += flags[flag] + + output_bitflag.set_output(new_output) diff --git a/code/modules/wiremod/components/list/assoc_literal.dm b/code/modules/wiremod/components/list/assoc_literal.dm new file mode 100644 index 00000000000..2977f362f12 --- /dev/null +++ b/code/modules/wiremod/components/list/assoc_literal.dm @@ -0,0 +1,89 @@ +/** + * # Assoc List Literal Component + * + * Return an associative list literal. + */ +/obj/item/circuit_component/assoc_literal + display_name = "Associative List Literal" + desc = "A component that returns an associative list consisting of the inputs. Attack in hand to increase list size, right click to decrease table size." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + + /// The inputs used to create the list + var/list/datum/port/input/key_ports = list() + var/list/datum/port/input/value_ports = list() + /// The result from the output + var/datum/port/output/list_output + + var/length = 0 + + var/default_list_size = 2 + + var/min_size = 1 + var/max_size = 20 + + ui_buttons = list( + "plus" = "increase", + "minus" = "decrease" + ) + +/obj/item/circuit_component/assoc_literal/save_data_to_list(list/component_data) + . = ..() + component_data["length"] = length + +/obj/item/circuit_component/assoc_literal/load_data_from_list(list/component_data) + set_list_size(component_data["length"]) + + return ..() + +/obj/item/circuit_component/assoc_literal/proc/set_list_size(new_size) + if(new_size <= 0) + for(var/datum/port/input/port as anything in key_ports) + remove_input_port(port) + for(var/datum/port/input/port as anything in value_ports) + remove_input_port(port) + key_ports = list() + value_ports = list() + length = 0 + return + + while(length > new_size) + var/index = length(value_ports) + var/key_port = key_ports[index] + key_ports -= key_port + remove_input_port(key_port) + var/value_port = value_ports[index] + value_ports -= value_port + remove_input_port(value_port) + length-- + + while(length < new_size) + length++ + var/index = length(input_ports) + if(trigger_input) + index -= 1 + key_ports += add_input_port("Key [index+1]", PORT_TYPE_STRING) + value_ports += add_input_port("Index [index+1]", PORT_TYPE_ANY) + +/obj/item/circuit_component/assoc_literal/populate_ports() + set_list_size(default_list_size) + list_output = add_output_port("Value", PORT_TYPE_ASSOC_LIST) + +/obj/item/circuit_component/assoc_literal/Destroy() + list_output = null + return ..() + +/obj/item/circuit_component/assoc_literal/ui_perform_action(mob/user, action) + switch(action) + if("increase") + set_list_size(min(length + 1, max_size)) + if("decrease") + set_list_size(max(length - 1, min_size)) + +/obj/item/circuit_component/assoc_literal/input_received(datum/port/input/port) + + var/list/new_literal = list() + for(var/index in 1 to length) + new_literal += list(key_ports[index].value = value_ports[index].value) + + list_output.set_output(new_literal) + diff --git a/code/modules/wiremod/datatypes/basic.dm b/code/modules/wiremod/datatypes/basic.dm index d112f2b9d96..b567c9d9ee0 100644 --- a/code/modules/wiremod/datatypes/basic.dm +++ b/code/modules/wiremod/datatypes/basic.dm @@ -1,9 +1,9 @@ // This file is for types that do not have any special conversion behaviour -/datum/circuit_datatype/list_type - datatype = PORT_TYPE_LIST - color = "white" - /datum/circuit_datatype/table datatype = PORT_TYPE_TABLE color = "grey" + +/datum/circuit_datatype/assoc_list + datatype = PORT_TYPE_ASSOC_LIST + color = "label" diff --git a/code/modules/wiremod/datatypes/list.dm b/code/modules/wiremod/datatypes/list.dm new file mode 100644 index 00000000000..e3042a444b8 --- /dev/null +++ b/code/modules/wiremod/datatypes/list.dm @@ -0,0 +1,10 @@ +/datum/circuit_datatype/list_type + datatype = PORT_TYPE_LIST + color = "white" + +/datum/circuit_datatype/list_type/can_receive_from_datatype(datatype_to_check) + . = ..() + if(.) + return + + return datatype_to_check == PORT_TYPE_ASSOC_LIST diff --git a/tgstation.dme b/tgstation.dme index 20e36764749..6124cd0a0ae 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3847,6 +3847,8 @@ #include "code\modules\wiremod\components\action\radio.dm" #include "code\modules\wiremod\components\action\soundemitter.dm" #include "code\modules\wiremod\components\action\speech.dm" +#include "code\modules\wiremod\components\admin\animate.dm" +#include "code\modules\wiremod\components\admin\filter.dm" #include "code\modules\wiremod\components\admin\getvar.dm" #include "code\modules\wiremod\components\admin\input_request.dm" #include "code\modules\wiremod\components\admin\proccall.dm" @@ -3868,6 +3870,7 @@ #include "code\modules\wiremod\components\bci\hud\counter_overlay.dm" #include "code\modules\wiremod\components\bci\hud\object_overlay.dm" #include "code\modules\wiremod\components\bci\hud\target_intercept.dm" +#include "code\modules\wiremod\components\list\assoc_literal.dm" #include "code\modules\wiremod\components\list\concat.dm" #include "code\modules\wiremod\components\list\get_column.dm" #include "code\modules\wiremod\components\list\index.dm" @@ -3911,6 +3914,7 @@ #include "code\modules\wiremod\datatypes\basic.dm" #include "code\modules\wiremod\datatypes\datum.dm" #include "code\modules\wiremod\datatypes\entity.dm" +#include "code\modules\wiremod\datatypes\list.dm" #include "code\modules\wiremod\datatypes\number.dm" #include "code\modules\wiremod\datatypes\option.dm" #include "code\modules\wiremod\datatypes\signal.dm"