@tool extends BeehaveTree func _ready(): if Engine.is_editor_hint(): return # Only setup for bots if not get_parent().is_in_group("Bots"): queue_free() # Remove tree if not a bot return # Set this tree's actor actor = get_parent() enabled = true # Create root selector var selector = SelectorComposite.new() add_child(selector) # Add sequences selector.add_child(create_arrange_sequence()) selector.add_child(create_grab_sequence()) selector.add_child(create_put_sequence()) selector.add_child(create_move_sequence()) func create_arrange_sequence() -> SequenceComposite: var sequence = SequenceComposite.new() sequence.name = "ArrangeSequence" # Has enough action points? var check_ap = ConditionLeaf.new() check_ap.name = "HasEnoughAP" check_ap.set_script(preload("res://scripts/behaviors/conditions/has_ap.gd")) # Can arrange items? var can_arrange = ConditionLeaf.new() can_arrange.name = "CanArrange" can_arrange.set_script(preload("res://scripts/behaviors/conditions/can_arrange.gd")) # Do arrange action var do_arrange = ActionLeaf.new() do_arrange.name = "DoArrange" do_arrange.set_script(preload("res://scripts/behaviors/actions/do_arrange.gd")) sequence.add_child(check_ap) sequence.add_child(can_arrange) sequence.add_child(do_arrange) return sequence func create_grab_sequence() -> SequenceComposite: var sequence = SequenceComposite.new() sequence.name = "GrabSequence" # Has enough action points? var check_ap = ConditionLeaf.new() check_ap.name = "HasAP" check_ap.set_script(preload("res://scripts/behaviors/conditions/has_ap.gd")) # Can grab item? var can_grab = ConditionLeaf.new() can_grab.name = "CanGrab" can_grab.set_script(preload("res://scripts/behaviors/conditions/can_grab.gd")) # Do grab action var do_grab = ActionLeaf.new() do_grab.name = "DoGrab" do_grab.set_script(preload("res://scripts/behaviors/actions/do_grab.gd")) sequence.add_child(check_ap) sequence.add_child(can_grab) sequence.add_child(do_grab) return sequence func create_put_sequence() -> SequenceComposite: var sequence = SequenceComposite.new() sequence.name = "PutSequence" # Has enough action points? var check_ap = ConditionLeaf.new() check_ap.name = "HasAP" check_ap.set_script(preload("res://scripts/behaviors/conditions/has_ap.gd")) # Can put item? var can_put = ConditionLeaf.new() can_put.name = "CanPut" can_put.set_script(preload("res://scripts/behaviors/conditions/can_put.gd")) # Do put action var do_put = ActionLeaf.new() do_put.name = "DoPut" do_put.set_script(preload("res://scripts/behaviors/actions/do_put.gd")) sequence.add_child(check_ap) sequence.add_child(can_put) sequence.add_child(do_put) return sequence func create_move_sequence() -> SequenceComposite: var sequence = SequenceComposite.new() sequence.name = "MoveSequence" # Has enough action points? var check_ap = ConditionLeaf.new() check_ap.name = "HasAP" check_ap.set_script(preload("res://scripts/behaviors/conditions/has_ap.gd")) # Should move? var should_move = ConditionLeaf.new() should_move.name = "ShouldMove" should_move.set_script(preload("res://scripts/behaviors/conditions/should_move.gd")) # Do move action var do_move = ActionLeaf.new() do_move.name = "DoMove" do_move.set_script(preload("res://scripts/behaviors/actions/do_move.gd")) sequence.add_child(check_ap) sequence.add_child(should_move) sequence.add_child(do_move) return sequence