diff --git a/addons/beehave/nodes/beehave_tree.gd b/addons/beehave/nodes/beehave_tree.gd index 8c501921..abaaae90 100644 --- a/addons/beehave/nodes/beehave_tree.gd +++ b/addons/beehave/nodes/beehave_tree.gd @@ -39,7 +39,7 @@ signal tree_disabled @export_node_path var actor_node_path : NodePath: set(anp): actor_node_path = anp - if actor_node_path: + if actor_node_path != null and str(actor_node_path) != "..": actor = get_node(actor_node_path) else: actor = get_parent() diff --git a/addons/gdUnit4/GdUnitRunner.cfg b/addons/gdUnit4/GdUnitRunner.cfg index 57acaf37..2cb5e329 100644 --- a/addons/gdUnit4/GdUnitRunner.cfg +++ b/addons/gdUnit4/GdUnitRunner.cfg @@ -1 +1 @@ -{"included":{"res://test/nodes/decorators/time_limiter_test.gd":["test_return_failure_when_child_exceeds_time_limiter"]},"server_port":31002,"skipped":{},"version":"1.0"} \ No newline at end of file +{"included":{"res://test/nodes/decorators/time_limiter_test.gd":["test_reset_when_child_finishes"]},"server_port":31002,"skipped":{},"version":"1.0"} \ No newline at end of file diff --git a/examples/random_tree_example/RandomAction.gd b/examples/random_tree_example/RandomAction.gd index 0e9aa007..9d8049f5 100644 --- a/examples/random_tree_example/RandomAction.gd +++ b/examples/random_tree_example/RandomAction.gd @@ -6,28 +6,34 @@ @tool class_name RandomAction extends ActionLeaf + ## How often this action changes its return status, in milliseconds. @export var reset_duration_msec: = 1000 + + var last_step = 0 var action = 0 ## Array of 3 floats signifying the weights of SUCCESS, FAILURE and RUNNING ## statuses respectively. var weights = [3., 3., 1.] + + func _get_random_action(): - var sum = 0. - for w in weights: - sum += w - var rnd = randf_range(0, sum) - for i in weights.size(): - if rnd <= weights[i]: - return i - rnd -= weights[i] - return weights.size() - 1 + var sum = 0. + for w in weights: + sum += w + var rnd = randf_range(0, sum) + for i in weights.size(): + if rnd <= weights[i]: + return i + rnd -= weights[i] + return weights.size() - 1 + func tick(actor: Node, blackboard: Blackboard) -> int: - var step = Time.get_ticks_msec() / reset_duration_msec - if step != last_step: - action = _get_random_action() - last_step = step - return action + var step = Time.get_ticks_msec() / reset_duration_msec + if step != last_step: + action = _get_random_action() + last_step = step + return action diff --git a/examples/random_tree_example/RandomTree.gd b/examples/random_tree_example/RandomTree.gd index d393174f..eb2b914f 100644 --- a/examples/random_tree_example/RandomTree.gd +++ b/examples/random_tree_example/RandomTree.gd @@ -1,63 +1,69 @@ @tool extends BeehaveTree + @export_range(1, 100) var randomize_node_count: int = 20 @export var randomize_tree: bool = false: - set(v): - if !v: - return - randomize_tree = false - _randomize_tree() + set(v): + if !v: + return + randomize_tree = false + _randomize_tree() + class TNode extends RefCounted: - var children = [] + var children = [] + var long_name_suffix = "LooooooooongNameSuffix" + func get_name_suffix(): - var r = randi_range(0, 0) - if r: - return long_name_suffix - return "" + var r = randi_range(0, 0) + if r: + return long_name_suffix + return "" var tree_root: TNode var tree_nodes = [] func _get_random_node(): - return tree_nodes[randi_range(0, tree_nodes.size() - 1)] + return tree_nodes[randi_range(0, tree_nodes.size() - 1)] func _make_random_tree(): - # One node (the root) is already created - tree_root = TNode.new() - tree_nodes = [tree_root] - for i in randomize_node_count - 1: - var n = _get_random_node() - var new_node = TNode.new() - n.children.append(new_node) - tree_nodes.append(new_node) + # One node (the root) is already created + tree_root = TNode.new() + tree_nodes = [tree_root] + for i in randomize_node_count - 1: + var n = _get_random_node() + var new_node = TNode.new() + n.children.append(new_node) + tree_nodes.append(new_node) + func _parse_tree_node(parent, node, index: int): - var n - if node.children.size() > 1: - n = SelectorReactiveComposite.new() - n.name = "SelectorReactiveComposite%s-%d" % [get_name_suffix(), index] - elif node.children.size() == 1: - n = InverterDecorator.new() - n.name = "InverterDecorator%s-%d" % [get_name_suffix(), index] - else: - n = RandomAction.new() - n.name = "RandomAction%s-%d" % [get_name_suffix(), index] - parent.add_child(n) - if Engine.is_editor_hint(): - n.owner = get_tree().get_edited_scene_root() - var i = 0 - for ch in node.children: - _parse_tree_node(n, ch, i) - i += 1 + var n + if node.children.size() > 1: + n = SelectorReactiveComposite.new() + n.name = "SelectorReactiveComposite%s-%d" % [get_name_suffix(), index] + elif node.children.size() == 1: + n = InverterDecorator.new() + n.name = "InverterDecorator%s-%d" % [get_name_suffix(), index] + else: + n = RandomAction.new() + n.name = "RandomAction%s-%d" % [get_name_suffix(), index] + parent.add_child(n) + if Engine.is_editor_hint(): + n.owner = get_tree().get_edited_scene_root() + var i = 0 + for ch in node.children: + _parse_tree_node(n, ch, i) + i += 1 + func _randomize_tree(): - for ch in get_children(): - remove_child(ch) - ch.queue_free() - _make_random_tree() - _parse_tree_node(self, tree_root, 0) + for ch in get_children(): + remove_child(ch) + ch.queue_free() + _make_random_tree() + _parse_tree_node(self, tree_root, 0) diff --git a/project.godot b/project.godot index a8002da3..1e021385 100644 --- a/project.godot +++ b/project.godot @@ -68,3 +68,7 @@ ui_down={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null) ] } + +[rendering] + +renderer/rendering_method="gl_compatibility" diff --git a/test/actions/clear_count_action.gd b/test/actions/clear_count_action.gd index e84dbf98..2436f323 100644 --- a/test/actions/clear_count_action.gd +++ b/test/actions/clear_count_action.gd @@ -2,7 +2,7 @@ class_name ClearCountAction extends ActionLeaf @export var key = "custom_value" -func tick(actor: Node, blackboard: Blackboard) -> int: +func tick(_actor: Node, blackboard: Blackboard) -> int: if blackboard.has_value(key): blackboard.erase_value(key) return SUCCESS diff --git a/test/actions/count_up_action.gd b/test/actions/count_up_action.gd index 91727fd2..e83ae0e5 100644 --- a/test/actions/count_up_action.gd +++ b/test/actions/count_up_action.gd @@ -5,13 +5,13 @@ class_name CountUpAction extends ActionLeaf var count = 0 var status = SUCCESS -func tick(actor: Node, blackboard: Blackboard) -> int: +func tick(_actor: Node, blackboard: Blackboard) -> int: count += 1 blackboard.set_value(key, count) return status -func interrupt(actor: Node, blackboard: Blackboard) -> void: +func interrupt(_actor: Node, blackboard: Blackboard) -> void: count = 0 blackboard.set_value(key, count) status = FAILURE diff --git a/test/actions/mock_action.gd b/test/actions/mock_action.gd index 8e4148e9..5909446c 100644 --- a/test/actions/mock_action.gd +++ b/test/actions/mock_action.gd @@ -16,7 +16,7 @@ func before_run(actor: Node, blackboard: Blackboard) -> void: started_running.emit(actor, blackboard) -func tick(actor: Node, blackboard: Blackboard) -> int: +func tick(_actor: Node, _blackboard: Blackboard) -> int: if tick_count < running_frame_count: tick_count += 1 return RUNNING diff --git a/test/beehave_tree_test.gd b/test/beehave_tree_test.gd index 57fd12a3..3e990175 100644 --- a/test/beehave_tree_test.gd +++ b/test/beehave_tree_test.gd @@ -13,14 +13,14 @@ func create_scene() -> Node2D: func test_normal_tick() -> void: var scene = create_scene() - var runner := scene_runner(scene) + scene_runner(scene) scene.beehave_tree._physics_process(1.0) assert_that(scene.beehave_tree.status).is_equal(BeehaveNode.SUCCESS) func test_nothing_running_before_first_tick() -> void: var scene = create_scene() - var runner := scene_runner(scene) + scene_runner(scene) assert_that(scene.beehave_tree.get_running_action()).is_null() assert_that(scene.beehave_tree.get_last_condition()).is_null() assert_that(scene.beehave_tree.get_last_condition_status()).is_equal("") @@ -55,7 +55,7 @@ func test_reenabled() -> void: func test_interrupt_running_action() -> void: var scene = create_scene() - var runner := scene_runner(scene) + scene_runner(scene) scene.count_up_action.status = BeehaveNode.RUNNING scene.beehave_tree._physics_process(1.0) scene.beehave_tree._physics_process(1.0) diff --git a/test/before_after_run_test.gd b/test/before_after_run_test.gd index 154d46e3..44ec0397 100644 --- a/test/before_after_run_test.gd +++ b/test/before_after_run_test.gd @@ -28,10 +28,10 @@ func before_test() -> void: func test_action_after_run() -> void: - var before_run_callback = func (actor, blackboard): + var before_run_callback = func (_actor, blackboard): blackboard.set_value("entered", true) - var after_run_callback = func (actor, blackboard): + var after_run_callback = func (_actor, blackboard): blackboard.set_value("exited", true) action.started_running.connect(before_run_callback) diff --git a/test/conditions/value_reached_condition.gd b/test/conditions/value_reached_condition.gd index 24fcacda..30aeeb57 100644 --- a/test/conditions/value_reached_condition.gd +++ b/test/conditions/value_reached_condition.gd @@ -3,7 +3,7 @@ class_name ValueReachedCondition extends ConditionLeaf @export var limit = 2 @export var key = "custom_value" -func tick(actor: Node, blackboard: Blackboard) -> int: +func tick(_actor: Node, blackboard: Blackboard) -> int: if blackboard.get_value(key, 0) >= limit: return SUCCESS else: diff --git a/test/debug/debugger_test.gd b/test/debug/debugger_test.gd index 2f0af7b2..8c9d9006 100644 --- a/test/debug/debugger_test.gd +++ b/test/debug/debugger_test.gd @@ -14,8 +14,8 @@ func create_scene() -> Node2D: func test_debugger_renders_correctly(): var scene = create_scene() - var scene_runner = scene_runner(scene) - await scene_runner.simulate_frames(20) - await scene_runner.set_mouse_pos(Vector2(20, 20)) - await scene_runner.simulate_mouse_button_press(1) - await scene_runner.simulate_frames(10) + var runner = scene_runner(scene) + await runner.simulate_frames(20) + runner.set_mouse_pos(Vector2(20, 20)) + runner.simulate_mouse_button_press(1) + await runner.simulate_frames(10) diff --git a/test/nodes/composites/selector_test.gd b/test/nodes/composites/selector_test.gd index 26cccb81..4eaf2477 100644 --- a/test/nodes/composites/selector_test.gd +++ b/test/nodes/composites/selector_test.gd @@ -106,8 +106,6 @@ func test_clear_running_child_after_run() -> void: func test_not_interrupt_first_after_finished() -> void: var action3 = auto_free(load(__count_up_action).new()) selector.add_child(action3) - var running_action: Node - var blackboard_name: String = str(actor.get_instance_id()) action1.status = BeehaveNode.RUNNING action2.status = BeehaveNode.FAILURE diff --git a/test/nodes/decorators/limiter_test.gd b/test/nodes/decorators/limiter_test.gd index 13439cfa..c5880708 100644 --- a/test/nodes/decorators/limiter_test.gd +++ b/test/nodes/decorators/limiter_test.gd @@ -30,7 +30,7 @@ func before_test() -> void: tree.blackboard = blackboard -func test_max_count(count: int, test_parameters: Array = [[2], [0]]) -> void: +func test_max_count(count: int, _test_parameters: Array = [[2], [0]]) -> void: limiter.max_count = count action.status = BeehaveNode.RUNNING for i in range(count): diff --git a/test/nodes/decorators/repeater_test.gd b/test/nodes/decorators/repeater_test.gd index efc7490b..037a5787 100644 --- a/test/nodes/decorators/repeater_test.gd +++ b/test/nodes/decorators/repeater_test.gd @@ -42,7 +42,7 @@ func after_test(): tree.blackboard.set_value("ended", 0) -func test_repetitions(count: int, test_parameters: Array = [[2], [0]]) -> void: +func test_repetitions(count: int, _test_parameters: Array = [[2], [0]]) -> void: repeater.repetitions = count action.final_result = BeehaveNode.SUCCESS @@ -88,11 +88,11 @@ func test_failure(): assert_int(times_ended).is_equal(2) -func _on_action_started(actor, blackboard): +func _on_action_started(_actor, blackboard): var started = blackboard.get_value("started", 0) blackboard.set_value("started", started + 1) -func _on_action_ended(actor, blackboard): +func _on_action_ended(_actor, blackboard): var ended = blackboard.get_value("ended", 0) blackboard.set_value("ended", ended + 1) diff --git a/test/nodes/decorators/time_limiter_test.gd b/test/nodes/decorators/time_limiter_test.gd index 847f895d..1a1e100d 100644 --- a/test/nodes/decorators/time_limiter_test.gd +++ b/test/nodes/decorators/time_limiter_test.gd @@ -37,7 +37,7 @@ func before_test() -> void: func test_return_failure_when_child_exceeds_time_limiter() -> void: time_limiter.wait_time = 1.0 action.status = BeehaveNode.RUNNING - await runner.simulate_frames(1) + tree.tick() assert_that(tree.tick()).is_equal(BeehaveNode.RUNNING) await runner.simulate_frames(1, 1500) assert_that(tree.tick()).is_equal(BeehaveNode.FAILURE) @@ -46,18 +46,18 @@ func test_return_failure_when_child_exceeds_time_limiter() -> void: func test_reset_when_child_finishes() -> void: time_limiter.wait_time = 0.5 action.status = BeehaveNode.RUNNING - await runner.simulate_frames(1, 10) + tree.tick() assert_that(tree.tick()).is_equal(BeehaveNode.RUNNING) - await runner.simulate_frames(5, 100) + await runner.simulate_frames(2, 500) action.status = BeehaveNode.SUCCESS assert_that(tree.tick()).is_equal(BeehaveNode.SUCCESS) func test_clear_running_child_after_run() -> void: - time_limiter.wait_time = 0.5 + time_limiter.wait_time = 1.5 action.status = BeehaveNode.RUNNING - await runner.simulate_frames(1, 50) + tree.tick() assert_that(time_limiter.running_child).is_equal(action) action.status = BeehaveNode.SUCCESS - await runner.simulate_frames(1, 50) + await runner.simulate_frames(1, 1600) assert_that(time_limiter.running_child).is_null() diff --git a/test/nodes/leaves/actions/blackboard_set_test.gd b/test/nodes/leaves/actions/blackboard_set_test.gd index 63e88ec8..4689e74c 100644 --- a/test/nodes/leaves/actions/blackboard_set_test.gd +++ b/test/nodes/leaves/actions/blackboard_set_test.gd @@ -26,7 +26,7 @@ func before_test() -> void: func test_set_to_constant() -> void: blackboard_set.value = "0" - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) # run it as a scene, so that _ready gets called + scene_runner(blackboard_set) # run it as a scene, so that _ready gets called assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS) assert_bool(blackboard.has_value(KEY)).is_true() assert_that(blackboard.get_value(KEY)).is_equal(0) @@ -35,21 +35,21 @@ func test_set_to_constant() -> void: func test_copy_key() -> void: blackboard.set_value(KEY2, 0) blackboard_set.value = "get_value('%s')" % [KEY2] - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) + scene_runner(blackboard_set) assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS) assert_that(blackboard.get_value(KEY)).is_equal(blackboard.get_value(KEY2)) # properly copy values from one key to another func test_invalid_expression() -> void: blackboard_set.value = "this is not a valid expression" - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) + scene_runner(blackboard_set) assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE) assert_bool(blackboard.has_value(KEY)).is_false() func test_set_vector3() -> void: blackboard_set.value = "Vector3(0,0,0)" - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) + scene_runner(blackboard_set) assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.SUCCESS) assert_bool(blackboard.has_value(KEY)).is_true() assert_that(blackboard.get_value(KEY)).is_equal(Vector3(0,0,0)) @@ -57,11 +57,11 @@ func test_set_vector3() -> void: func test_invalid_key_expression() -> void: blackboard_set.key = "this is invalid!!!" - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) + scene_runner(blackboard_set) assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE) func test_invalid_value_expression() -> void: blackboard_set.value = "this is invalid!!!" - var runner: GdUnitSceneRunner = scene_runner(blackboard_set) + scene_runner(blackboard_set) assert_that(blackboard_set.tick(actor, blackboard)).is_equal(BeehaveNode.FAILURE) diff --git a/test/randomized_composites/weighted_sampling/selector_random/selector_random_weights.gd b/test/randomized_composites/weighted_sampling/selector_random/selector_random_weights.gd index c0e6d0d4..9a63be0d 100644 --- a/test/randomized_composites/weighted_sampling/selector_random/selector_random_weights.gd +++ b/test/randomized_composites/weighted_sampling/selector_random/selector_random_weights.gd @@ -14,7 +14,7 @@ func _ready(): _counter_keys[action.name] = action.key -func _process(delta): +func _process(_delta:float): var debug_text = "" var sample_size = 0 @@ -37,7 +37,6 @@ func get_final_results() -> Dictionary: sample_size += count for action_name in _counter_keys.keys(): - var a = _counter_keys[action_name] var value = blackboard.get_value(_counter_keys[action_name], 0) var perc = (float(value) / float(sample_size)) * 100.0 results[action_name] = perc