Skip to content

Instantly share code, notes, and snippets.

@GammaGames
Last active August 11, 2022 05:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GammaGames/28f3368128b67a4c02af0faed679cc93 to your computer and use it in GitHub Desktop.
Save GammaGames/28f3368128b67a4c02af0faed679cc93 to your computer and use it in GitHub Desktop.
debug helper for beehave
extends BeehaveNode
class_name BeehaveDebug, "../icons/tree.svg"
export(NodePath) var _beehave_tree
var beehave_tree : BeehaveRoot setget set_beehave_tree
export(Theme) var theme
export(Color) var tick_color := Color.whitesmoke
export(Color) var success_color := Color.forestgreen
export(Color) var running_color := Color.royalblue
export(Color) var failure_color := Color.crimson
var tree : Tree
var tree_map := {}
func _ready():
if self._beehave_tree:
self.beehave_tree = get_node(self._beehave_tree)
func set_beehave_tree(value):
if beehave_tree != value:
if self.beehave_tree:
self.beehave_tree.disconnect("tick_start", self, "_tick_start")
self.beehave_tree.disconnect("tick_end", self, "_tick_end")
beehave_tree = value
generate_tree()
func generate_tree():
if self.tree:
remove_child(self.tree)
self.tree_map = {}
self.tree = self._create_tree()
add_child(self.tree)
self.beehave_tree.connect("tick_start", self, "_tick_start")
self.beehave_tree.connect("tick_end", self, "_tick_end")
_add_children(self.tree.create_item(), self.beehave_tree)
func _create_tree():
var tree := Tree.new()
tree.anchor_left = 0
tree.anchor_right = 1
tree.anchor_top = 0
tree.anchor_bottom = 1
tree.hide_folding = true
if self.theme:
tree.theme = self.theme
return tree
func _add_children(item, node):
tree_map[node] = item
item.set_text(0, node.name)
item.set_icon(0, self._get_icon(node))
for c in node.get_children():
if c is BeehaveTree:
var i = self.tree.create_item(item)
self._add_children(i, c)
func _get_icon(node):
var icon
if node is BeehaveRoot:
icon = preload("../icons/tree.svg")
elif node is Composite:
if node is SelectorComposite:
icon = preload("../icons/selector.svg")
elif node is SelectorStarComposite:
icon = preload("../icons/selector.svg")
elif node is SequenceComposite:
icon = preload("../icons/sequencer.svg")
elif node is SequenceStarComposite:
icon = preload("../icons/sequencer.svg")
else:
icon = preload("../icons/category_composite.svg")
elif node is Decorator:
if node is InverterDecorator:
icon = preload("../icons/inverter.svg")
else:
icon = preload("../icons/category_decorator.svg")
elif node is ActionLeaf:
icon = preload("../icons/action.svg")
elif node is ConditionLeaf:
icon = preload("../icons/condition.svg")
return icon
func _input(event):
if self.beehave_tree and event.is_action_pressed("tick"):
self.beehave_tree.tick(1.0 / Engine.iterations_per_second)
func _tick_start(_blackboard):
for node in self.tree_map.keys():
self._set_bg(tree_map[node])
func _tick_end(blackboard):
self._set_bg(tree_map[self.beehave_tree], blackboard.get(self.beehave_tree))
for node in blackboard.get("processed"):
self._set_bg(tree_map[node], blackboard.get(node))
func _set_bg(item, status=null):
match status:
SUCCESS:
item.set_custom_bg_color(0, self.success_color)
FAILURE:
item.set_custom_bg_color(0, self.failure_color)
RUNNING:
item.set_custom_bg_color(0, self.running_color)
_:
item.clear_custom_bg_color(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment