From 5fc3aa5b3db0569a4e8fcd72ba5e3f2388cf3aac Mon Sep 17 00:00:00 2001 From: Y0SH1M4S73R Date: Fri, 1 Oct 2021 16:00:02 -0400 Subject: [PATCH] Adds Animation and Filter Components for Admin Circuits (#61766) Adds a selection of components for animating atoms and manipulating filters. Makes animating atoms and filters using circuits more intuitive. Also Watermelon planned to make these but was too busy with other circuit QOL stuff and asked me if I would be willing to do it. --- code/__DEFINES/wiremod.dm | 2 + code/_globalvars/lists/wiremod.dm | 2 + .../wiremod/components/admin/animate.dm | 112 +++++++ .../wiremod/components/admin/filter.dm | 313 ++++++++++++++++++ .../wiremod/components/list/assoc_literal.dm | 89 +++++ code/modules/wiremod/datatypes/basic.dm | 8 +- code/modules/wiremod/datatypes/list.dm | 10 + tgstation.dme | 4 + 8 files changed, 536 insertions(+), 4 deletions(-) create mode 100644 code/modules/wiremod/components/admin/animate.dm create mode 100644 code/modules/wiremod/components/admin/filter.dm create mode 100644 code/modules/wiremod/components/list/assoc_literal.dm create mode 100644 code/modules/wiremod/datatypes/list.dm 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"