Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 

72 řádky
1.9 KiB

%% 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.