behavior3行为树
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 

32 lignes
1.1 KiB

-module(repeat_until_failure).
-include("eBhv3.hrl").
-export([open/2, tick/2, close/2]).
-spec open(bt_node(), bt_state()) -> bt_state().
open(#{id := ID} = _BTNode, BTState) ->
blackboard: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 = blackboard:get(i, ID, BTState),
{I1, BTStatus, BTState1} = tick_1(MaxLoop, I, ChildID, ?BT_ERROR, BTState),
BTState2 = blackboard: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) ->
blackboard:remove(i, ID, BTState).
tick_1(MaxLoop, I, ChildID, _BTStatus, BTState) when MaxLoop < 0 orelse I < MaxLoop ->
case base_node:execute(ChildID, BTState) of
{?BT_SUCCESS, BTState1} ->
tick_1(MaxLoop, I + 1, ChildID, ?BT_SUCCESS, BTState1);
{BTStatus, BTState1} ->
{I, BTStatus, BTState1}
end;
tick_1(_MaxLoop, I, _ChildID, BTStatus, BTState) ->
{I, BTStatus, BTState}.