Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

72 linhas
1.9 KiB

8 anos atrás
  1. %% Author: zouv
  2. %% Date: 2016-09-26
  3. %% Doc: Random Selector Node
  4. -module(n_random_selector).
  5. -behaviour(bte_node_behaviour).
  6. -include("common.hrl").
  7. -record(r_data, {
  8. tick_children = []
  9. }).
  10. -export([
  11. node_name/0,
  12. init/1,
  13. execute/3
  14. ]).
  15. node_name() ->
  16. "RandomSelector".
  17. init(_Parameters) ->
  18. #r_data{}.
  19. execute(BteStatus, Node, IsFromStack) ->
  20. ?BTE_DEBUG("~p execute: ~p~n", [?MODULE, {IsFromStack, BteStatus#r_bte_status.status, length(Node#r_bte_node.children)}]),
  21. if
  22. IsFromStack ->
  23. if
  24. BteStatus#r_bte_status.status == ?BTE_SUCCESS ->
  25. BteStatus;
  26. true ->
  27. execute1(BteStatus, Node)
  28. end;
  29. true ->
  30. execute1(BteStatus, Node#r_bte_node{data = #r_data{tick_children = Node#r_bte_node.children}})
  31. end.
  32. execute1(BteStatus, Node) ->
  33. Children = Node#r_bte_node.data#r_data.tick_children,
  34. if
  35. length(Children) > 0 ->
  36. ChildId = lists:nth(bte_util:rand(1, length(Children)), Children),
  37. ?BTE_DEBUG("~p execute___1: ~p~n", [?MODULE, {length(Children) - 1}]),
  38. BteStatus1 = bte_tick:push_stack(BteStatus, ChildId),
  39. BteStatus2 = bte_tick:execute(BteStatus1, ChildId),
  40. if
  41. BteStatus2#r_bte_status.status /= ?BTE_RUNNING ->
  42. {BteStatus3, _} = bte_tick:pop_stack(BteStatus2);
  43. true ->
  44. BteStatus3 = BteStatus2
  45. end,
  46. LeftChildren = lists:delete(ChildId, Children),
  47. Data = Node#r_bte_node.data,
  48. if
  49. BteStatus3#r_bte_status.status == ?BTE_SUCCESS ->
  50. NewData = Data#r_data{tick_children = Node#r_bte_node.children},
  51. NewNode = Node#r_bte_node{data = NewData},
  52. bte_tick:update_node(BteStatus3, NewNode);
  53. BteStatus3#r_bte_status.status == ?BTE_RUNNING ->
  54. NewData = Data#r_data{tick_children = LeftChildren},
  55. NewNode = Node#r_bte_node{data = NewData},
  56. bte_tick:update_node(BteStatus3, NewNode);
  57. true ->
  58. NewData = Data#r_data{tick_children = LeftChildren},
  59. NewNode = Node#r_bte_node{data = NewData},
  60. execute1(BteStatus3, NewNode)
  61. end;
  62. true ->
  63. BteStatus
  64. end.