|
|
@ -1,4 +1,4 @@ |
|
|
|
-module(base_node). |
|
|
|
-module(bvBaseNode). |
|
|
|
|
|
|
|
-include("eBhv3.hrl"). |
|
|
|
|
|
|
@ -30,7 +30,7 @@ |
|
|
|
%% @doc 执行节点 |
|
|
|
-spec execute(bt_uid(), bt_state()) -> {bt_status(), bt_state()}. |
|
|
|
execute(NodeID, BTState) -> |
|
|
|
BTNode = blackboard:get_btree_node(NodeID), |
|
|
|
BTNode = bvBlackBoard:get_btree_node(NodeID), |
|
|
|
BTState1 = do_open(BTNode, BTState), |
|
|
|
{BTStatus, BTState2} = do_tick(BTNode, BTState1), |
|
|
|
case BTStatus of |
|
|
@ -64,7 +64,7 @@ do_init(ParentNodeID, BTNodeID, TreeMaps, TreeNodeMaps) -> |
|
|
|
parent_id => ParentNodeID, |
|
|
|
children => [do_init(ID, ChildBTNodeID, TreeMaps, TreeNodeMaps) || ChildBTNodeID <- Children] |
|
|
|
}, |
|
|
|
blackboard:set_btree_node(BTNode2), |
|
|
|
bvBlackBoard:set_btree_node(BTNode2), |
|
|
|
{ok, ID}; |
|
|
|
_ -> |
|
|
|
{error, {btree_node_not_implement, Name}} |
|
|
@ -75,7 +75,7 @@ do_init(ParentNodeID, BTNodeID, TreeMaps, TreeNodeMaps) -> |
|
|
|
%% 如果树节点已经开启,则跳过 |
|
|
|
-spec do_open(bt_node(), bt_state()) -> bt_state(). |
|
|
|
do_open(#{id := ID, parent_id := ParentID, name := Mod} = BTNode, BTState) -> |
|
|
|
case blackboard:get('$is_open', ID, false, BTState) of |
|
|
|
case bvBlackBoard:get('$is_open', ID, false, BTState) of |
|
|
|
true -> |
|
|
|
BTState; |
|
|
|
false -> |
|
|
@ -85,11 +85,11 @@ do_open(#{id := ID, parent_id := ParentID, name := Mod} = BTNode, BTState) -> |
|
|
|
false -> |
|
|
|
BTState1 = BTState |
|
|
|
end, |
|
|
|
BTState2 = blackboard:set('$is_open', true, ID, BTState1), |
|
|
|
BTState2 = bvBlackBoard:set('$is_open', true, ID, BTState1), |
|
|
|
case is_reference(ParentID) of |
|
|
|
true -> |
|
|
|
Children = blackboard:get('$children', ParentID, [], BTState2), |
|
|
|
blackboard:set('$children', [ID | Children], ParentID, BTState2); |
|
|
|
Children = bvBlackBoard:get('$children', ParentID, [], BTState2), |
|
|
|
bvBlackBoard:set('$children', [ID | Children], ParentID, BTState2); |
|
|
|
false -> |
|
|
|
BTState2 |
|
|
|
end |
|
|
@ -104,7 +104,7 @@ do_tick(#{name := Mod} = BTNode, BTState) -> |
|
|
|
%% @doc 如果树节点有close/2函数实现,则执行close函数 |
|
|
|
-spec do_close(bt_node(), bt_state()) -> bt_state(). |
|
|
|
do_close(#{id := ID, name := Mod} = BTNode, BTState) -> |
|
|
|
Children = blackboard:get('$children', ID, [], BTState), |
|
|
|
Children = bvBlackBoard:get('$children', ID, [], BTState), |
|
|
|
BTState1 = do_close_1(Children, BTState), |
|
|
|
case erlang:function_exported(Mod, close, 2) of |
|
|
|
true -> |
|
|
@ -112,15 +112,15 @@ do_close(#{id := ID, name := Mod} = BTNode, BTState) -> |
|
|
|
false -> |
|
|
|
BTState2 = BTState1 |
|
|
|
end, |
|
|
|
BTState3 = blackboard:set('$is_open', false, ID, BTState2), |
|
|
|
BTState4 = blackboard:set('$children', [], ID, BTState3), |
|
|
|
blackboard:erase_node_local(ID, BTState4). |
|
|
|
BTState3 = bvBlackBoard:set('$is_open', false, ID, BTState2), |
|
|
|
BTState4 = bvBlackBoard:set('$children', [], ID, BTState3), |
|
|
|
bvBlackBoard:erase_node_local(ID, BTState4). |
|
|
|
|
|
|
|
do_close_1([NodeID | T], BTState) -> |
|
|
|
BTState1 = do_close_1(T, BTState), |
|
|
|
case blackboard:get('$is_open', NodeID, false, BTState1) of |
|
|
|
case bvBlackBoard:get('$is_open', NodeID, false, BTState1) of |
|
|
|
true -> |
|
|
|
BTNode = blackboard:get_btree_node(NodeID), |
|
|
|
BTNode = bvBlackBoard:get_btree_node(NodeID), |
|
|
|
do_close(BTNode, BTState1); |
|
|
|
false -> |
|
|
|
BTState1 |