11extends Object
22
33const BlockDefinition = preload ("res://addons/block_code/code_generation/block_definition.gd" )
4+ const OptionData = preload ("res://addons/block_code/code_generation/option_data.gd" )
45const Types = preload ("res://addons/block_code/types/types.gd" )
56const Util = preload ("res://addons/block_code/code_generation/util.gd" )
7+ const VariableDefinition = preload ("res://addons/block_code/code_generation/variable_definition.gd" )
68
79const _BLOCKS_PATH = "res://addons/block_code/blocks/"
810
@@ -94,6 +96,40 @@ static func _setup_definitions_from_files():
9496 _by_class_name [target ][block_definition .name ] = block_definition
9597
9698
99+ static func _add_output_definitions (definitions : Array [BlockDefinition ]):
100+ # Capture things of format [test]
101+ var _output_regex := RegEx .create_from_string ("\\ [([^\\ ]]+)\\ ]" )
102+
103+ for definition in definitions :
104+ if definition .type != Types .BlockType .ENTRY :
105+ continue
106+
107+ for reg_match in _output_regex .search_all (definition .display_template ):
108+ var parts := reg_match .get_string (1 ).split (": " )
109+ var param_name := parts [0 ]
110+ var param_type : Variant .Type = Types .STRING_TO_VARIANT_TYPE [parts [1 ]]
111+
112+ var output_def := BlockDefinition .new ()
113+ output_def .name = & "% s_% s" % [definition .name , param_name ]
114+ output_def .target_node_class = definition .target_node_class
115+ output_def .category = definition .category
116+ output_def .type = Types .BlockType .VALUE
117+ output_def .variant_type = param_type
118+ output_def .display_template = param_name
119+ output_def .code_template = param_name
120+ output_def .scope = definition .code_template
121+
122+ # Note that these are not added to the _by_class_name dict
123+ # because they only make sense within the entry block scope.
124+ _catalog [output_def .name ] = output_def
125+
126+
127+ static func _setup_output_definitions ():
128+ var definitions : Array [BlockDefinition ]
129+ definitions .assign (_catalog .values ())
130+ _add_output_definitions (definitions )
131+
132+
97133static func _add_property_definitions (_class_name : String , property_list : Array [Dictionary ], property_settings : Dictionary ):
98134 for property in property_list :
99135 if not property .name in property_settings :
@@ -218,6 +254,7 @@ static func setup():
218254
219255 _catalog = {}
220256 _setup_definitions_from_files ()
257+ _setup_output_definitions ()
221258 _setup_properties_for_class ()
222259 _setup_input_block ()
223260
@@ -237,6 +274,45 @@ static func get_blocks_by_class(_class_name: String):
237274 return block_definitions .values ()
238275
239276
277+ static func _get_builtin_parents (_class_name : String ) -> Array [String ]:
278+ var parents : Array [String ] = []
279+ var current = _class_name
280+
281+ while current != "" :
282+ parents .append (current )
283+ current = ClassDB .get_parent_class (current )
284+
285+ return parents
286+
287+
288+ static func _get_custom_parent_class_name (_custom_class_name : String ) -> String :
289+ for class_dict in ProjectSettings .get_global_class_list ():
290+ if class_dict .class != _custom_class_name :
291+ continue
292+ var script = load (class_dict .path )
293+ var builtin_class = script .get_instance_base_type ()
294+ return builtin_class
295+ return "Node"
296+
297+
298+ static func _get_parents (_class_name : String ) -> Array [String ]:
299+ if ClassDB .class_exists (_class_name ):
300+ return _get_builtin_parents (_class_name )
301+ var parents : Array [String ] = [_class_name ]
302+ var _parent_class_name = _get_custom_parent_class_name (_class_name )
303+ parents .append_array (_get_builtin_parents (_parent_class_name ))
304+ return parents
305+
306+
307+ static func get_inherited_blocks (_class_name : String ) -> Array [BlockDefinition ]:
308+ setup ()
309+
310+ var definitions : Array [BlockDefinition ] = []
311+ for _parent_class_name in _get_parents (_class_name ):
312+ definitions .append_array (get_blocks_by_class (_parent_class_name ))
313+ return definitions
314+
315+
240316static func add_custom_blocks (
241317 _class_name ,
242318 block_definitions : Array [BlockDefinition ] = [],
@@ -252,4 +328,32 @@ static func add_custom_blocks(
252328 _catalog [block_definition .name ] = block_definition
253329 _by_class_name [_class_name ][block_definition .name ] = block_definition
254330
331+ _add_output_definitions (block_definitions )
255332 _add_property_definitions (_class_name , property_list , property_settings )
333+
334+
335+ static func get_variable_block_definitions (variables : Array [VariableDefinition ]) -> Array [BlockDefinition ]:
336+ var block_definitions : Array [BlockDefinition ] = []
337+ for variable : VariableDefinition in variables :
338+ var type_string : String = Types .VARIANT_TYPE_TO_STRING [variable .var_type ]
339+
340+ # Getter
341+ var block_def = BlockDefinition .new ()
342+ block_def .name = "get_var_%s " % variable .var_name
343+ block_def .category = "Variables"
344+ block_def .type = Types .BlockType .VALUE
345+ block_def .variant_type = variable .var_type
346+ block_def .display_template = variable .var_name
347+ block_def .code_template = variable .var_name
348+ block_definitions .append (block_def )
349+
350+ # Setter
351+ block_def = BlockDefinition .new ()
352+ block_def .name = "set_var_%s " % variable .var_name
353+ block_def .category = "Variables"
354+ block_def .type = Types .BlockType .STATEMENT
355+ block_def .display_template = "Set %s to {value: %s} " % [variable .var_name , type_string ]
356+ block_def .code_template = "%s = {value} " % [variable .var_name ]
357+ block_definitions .append (block_def )
358+
359+ return block_definitions
0 commit comments