-module(bvRUF). -include("eBhv3.hrl"). -export([open/2, tick/2, close/2]). -spec open(bt_node(), bt_state()) -> bt_state(). open(#{id := ID} = _BTNode, BTState) -> bvBlackBoard:set(i, 0, ID, BTState). -spec tick(bt_node(), bt_state()) -> {bt_status(), bt_state()}. tick(#{id := ID, children := [ChildID], properties := #{max_loop := MaxLoop}} = _BTNode, BTState) -> I = bvBlackBoard:get(i, ID, BTState), {I1, BTStatus, BTState1} = doTick(MaxLoop, I, ChildID, ?BT_ERROR, BTState), BTState2 = bvBlackBoard:set(i, I1, ID, BTState1), {BTStatus, BTState2}; tick(_BTNode, BTState) -> {?BT_ERROR, BTState}. -spec close(bt_node(), bt_state()) -> bt_state(). close(#{id := ID} = _BTNode, BTState) -> bvBlackBoard:remove(i, ID, BTState). doTick(MaxLoop, I, ChildID, _BTStatus, BTState) when MaxLoop < 0 orelse I < MaxLoop -> case bvBaseNode:execute(ChildID, BTState) of {?BT_SUCCESS, BTState1} -> doTick(MaxLoop, I + 1, ChildID, ?BT_SUCCESS, BTState1); {BTStatus, BTState1} -> {I, BTStatus, BTState1} end; doTick(_MaxLoop, I, _ChildID, BTStatus, BTState) -> {I, BTStatus, BTState}.