%% Author: zouv
|
|
%% Date: 2016-09-26
|
|
%% Doc: Random Selector Node
|
|
|
|
-module(n_random_selector).
|
|
-behaviour(bte_node_behaviour).
|
|
|
|
-include("common.hrl").
|
|
|
|
-record(r_data, {
|
|
tick_children = []
|
|
}).
|
|
|
|
-export([
|
|
node_name/0,
|
|
init/1,
|
|
execute/3
|
|
]).
|
|
|
|
node_name() ->
|
|
"RandomSelector".
|
|
|
|
init(_Parameters) ->
|
|
#r_data{}.
|
|
|
|
execute(BteStatus, Node, IsFromStack) ->
|
|
?BTE_DEBUG("~p execute: ~p~n", [?MODULE, {IsFromStack, BteStatus#r_bte_status.status, length(Node#r_bte_node.children)}]),
|
|
if
|
|
IsFromStack ->
|
|
if
|
|
BteStatus#r_bte_status.status == ?BTE_SUCCESS ->
|
|
BteStatus;
|
|
true ->
|
|
execute1(BteStatus, Node)
|
|
end;
|
|
true ->
|
|
execute1(BteStatus, Node#r_bte_node{data = #r_data{tick_children = Node#r_bte_node.children}})
|
|
end.
|
|
|
|
execute1(BteStatus, Node) ->
|
|
Children = Node#r_bte_node.data#r_data.tick_children,
|
|
if
|
|
length(Children) > 0 ->
|
|
ChildId = lists:nth(bte_util:rand(1, length(Children)), Children),
|
|
?BTE_DEBUG("~p execute___1: ~p~n", [?MODULE, {length(Children) - 1}]),
|
|
BteStatus1 = bte_tick:push_stack(BteStatus, ChildId),
|
|
BteStatus2 = bte_tick:execute(BteStatus1, ChildId),
|
|
if
|
|
BteStatus2#r_bte_status.status /= ?BTE_RUNNING ->
|
|
{BteStatus3, _} = bte_tick:pop_stack(BteStatus2);
|
|
true ->
|
|
BteStatus3 = BteStatus2
|
|
end,
|
|
LeftChildren = lists:delete(ChildId, Children),
|
|
Data = Node#r_bte_node.data,
|
|
if
|
|
BteStatus3#r_bte_status.status == ?BTE_SUCCESS ->
|
|
NewData = Data#r_data{tick_children = Node#r_bte_node.children},
|
|
NewNode = Node#r_bte_node{data = NewData},
|
|
bte_tick:update_node(BteStatus3, NewNode);
|
|
BteStatus3#r_bte_status.status == ?BTE_RUNNING ->
|
|
NewData = Data#r_data{tick_children = LeftChildren},
|
|
NewNode = Node#r_bte_node{data = NewData},
|
|
bte_tick:update_node(BteStatus3, NewNode);
|
|
true ->
|
|
NewData = Data#r_data{tick_children = LeftChildren},
|
|
NewNode = Node#r_bte_node{data = NewData},
|
|
execute1(BteStatus3, NewNode)
|
|
end;
|
|
true ->
|
|
BteStatus
|
|
end.
|