%% record definitions for nodes %% TODO: should probably prefix everything with bt_ eg. bt_decorator -record(decorator, { name = "Decorator":: string(), module :: atom(), args :: map(), state :: term(), child :: bt_erl_node(), metadata :: bt_metadata() }). -record(sequence, { name = "Sequence":: string(), namespace :: namespace(), children :: list(bt_erl_node()), metadata :: bt_metadata() }). %% TODO: add selector -record(selector, { name = "Selector":: string(), namespace :: namespace(), children :: list(bt_erl_node()), metadata :: bt_metadata() }). -record(task, { name = "Task" :: string(), module :: atom(), args :: map(), state :: term(), metadata :: bt_metadata() }). %% an intermediate representation of a node generator %% this is used when defining an erlang based tree %% this should NOT be present in parsed behaviour tree! -record(bt_erl_tree, { bb_keys = [] :: list(string()), params = [] :: list(string()), generator :: function(), %% arity 2: bb_keys, params as dictionaries %% args will not be filled during definition! only when it is instantiated %% should ideally have two different records for definition/instantiation? args = #{} :: map() }). -record (bt_metadata, { status=not_run :: bt_status() | not_run, exception :: {atom(), term(), term()} | undefined, %% these are all optional right now, not filling them since not using them. prev_state :: term(), prev_bb :: blackboard() | undefined, next_bb :: blackboard() | undefined }). %% result of a bt tick -record (bt_tick_result, { event :: bt_event(), status :: bt_status(), new_tree :: bt_node(), new_bb :: blackboard(), tick_id :: integer() }). -type namespace() :: list(string()) | undefined. -type decorator() :: #decorator{}. -type sequence() :: #sequence{}. -type selector() :: #selector{}. -type task() :: #task{}. -type bt_erl_tree() :: #bt_erl_tree{}. -type blackboard() :: map(). -type bt_event() :: term(). -type bt_status() :: success | failure | running. -type bt_metadata() :: #bt_metadata{} | undefined. -type bt_node() :: decorator() | sequence() | selector() | task(). -type bt_erl_node() :: bt_node() | bt_erl_tree().