core.lua 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. --[[ TODO:
  2. call/clone
  3. priority
  4. loop times until success/fail
  5. ]]
  6. bt.register_action("Sequence", {
  7. tick = function(node, data)
  8. local ret
  9. if node.current_kid == -1 then
  10. node.current_kid = 1
  11. ret = "success" -- trick reset into being run
  12. end
  13. while node.current_kid <= table.getn(node.kids) do
  14. local cn = node.kids[node.current_kid]
  15. -- reset fresh nodes
  16. if ret == "success" then
  17. bt.reset(cn, data)
  18. end
  19. -- tick the current node
  20. ret = bt.tick(cn, data)
  21. print(" sequence '"..node.name.."' got status ["..ret.."] from kid "..node.current_kid)
  22. if ret == "running" or ret == "failed" then
  23. return ret
  24. end
  25. node.current_kid = node.current_kid + 1
  26. end
  27. return "success"
  28. end,
  29. reset = function(node, data)
  30. node.current_kid = -1
  31. end,
  32. ctor = function(name, list)
  33. return {
  34. name=name,
  35. current_kid=-1,
  36. kids=list,
  37. }
  38. end,
  39. })
  40. bt.register_action("Selector", {
  41. tick = function(node, data)
  42. local ret
  43. if node.current_kid == -1 then
  44. node.current_kid = 1
  45. ret = "failed" -- trick reset into being run
  46. end
  47. while node.current_kid <= table.getn(node.kids) do
  48. local cn = node.kids[node.current_kid]
  49. -- reset fresh nodes
  50. if ret == "failed" then
  51. print("resetting kid "..node.current_kid)
  52. bt.reset(cn, data)
  53. end
  54. -- tick the current node
  55. ret = bt.tick(cn, data)
  56. print(" selector '"..node.name.."' got status ["..ret.."] from kid "..node.current_kid)
  57. if ret == "running" or ret == "success" then
  58. return ret
  59. end
  60. node.current_kid = node.current_kid + 1
  61. end
  62. return "failed"
  63. end,
  64. reset = function(node, data)
  65. print("selector resetting")
  66. node.current_kid = -1
  67. end,
  68. ctor = function(name, list)
  69. return {
  70. name=name,
  71. current_kid=-1,
  72. kids=list,
  73. }
  74. end,
  75. })
  76. bt.register_action("Repeat", {
  77. tick = function(node, data)
  78. --tprint(node)
  79. if node.times ~= -1 then
  80. node.count = node.count + 1
  81. if node.count > node.times then
  82. return "success"
  83. end
  84. end
  85. local ret = bt.tick(node.kids[1], data)
  86. if ret ~= "running" then
  87. bt.reset(node.kids[1], data)
  88. end
  89. return "success"
  90. end,
  91. reset = function(node, data)
  92. node.count = 0
  93. if node.times_fn then
  94. node.times = node.times_fn()
  95. end
  96. end,
  97. -- -1 times is forever
  98. ctor = function(name, times, what)
  99. local x = {
  100. name=name,
  101. kids = what,
  102. }
  103. if type(times) == "function" then
  104. x.times_fn = times
  105. elseif times == nil then
  106. x.times = -1
  107. else
  108. x.times = times
  109. end
  110. return x
  111. end,
  112. })
  113. bt.register_action("Succeed", {
  114. tick = function(node, data)
  115. local ret = bt.tick(node.kid, data)
  116. if ret == "running" then
  117. return "running"
  118. else
  119. return "success"
  120. end
  121. end,
  122. reset = function(node, data)
  123. bt.reset(node.kid, data)
  124. end,
  125. ctor = function(kid)
  126. return {
  127. kid=kid,
  128. }
  129. end,
  130. })
  131. bt.register_action("Fail", {
  132. tick = function(node, data)
  133. local ret = bt.tick(node.kid, data)
  134. if ret == "running" then
  135. return "running"
  136. else
  137. return "failed"
  138. end
  139. end,
  140. reset = function(node, data)
  141. bt.reset(node.kid, data)
  142. end,
  143. ctor = function(kid)
  144. return {
  145. kid=kid,
  146. }
  147. end,
  148. })
  149. bt.register_action("Invert", {
  150. tick = function(node, data)
  151. local ret = bt.tick(node.kid, data)
  152. if ret == "running" then
  153. return "running"
  154. elseif ret == "success" then
  155. return "failed"
  156. else
  157. return "success"
  158. end
  159. end,
  160. reset = function(node, data)
  161. bt.reset(node.kid, data)
  162. end,
  163. ctor = function(kid)
  164. return {
  165. kid=kid,
  166. }
  167. end,
  168. })
  169. bt.register_action("Random", {
  170. tick = function(node, data)
  171. return bt.tick(node.kids[node.chosen_kid], data)
  172. end,
  173. reset = function(node, data)
  174. node.chosen_kid = (math.random() % table.getn(node.kids)) + 1
  175. bt.reset(node.kids[node.chosen_kid], data)
  176. end,
  177. ctor = function(kids)
  178. return {
  179. kid=kids,
  180. chosen_kid=nil,
  181. }
  182. end,
  183. })
  184. bt.register_action("UntilFailed", {
  185. tick = function(node, data)
  186. -- TODO: BUG: make sure it resets the kid the first run
  187. local ret
  188. while ret ~= "failed" do
  189. ret = bt.tick(node.kid, data)
  190. if ret == "running" then
  191. return "running"
  192. elseif ret == "success" then
  193. bt.reset(node.kid, data)
  194. end
  195. end
  196. return "failed"
  197. end,
  198. reset = function(node, data)
  199. bt.reset(node.kid, data)
  200. end,
  201. -- -1 times is forever
  202. ctor = function(what)
  203. return {
  204. kid = what,
  205. }
  206. end,
  207. })
  208. bt.register_action("UntilSuccess", {
  209. tick = function(node, data)
  210. -- TODO: BUG: make sure it resets the kids the first run
  211. local ret
  212. while ret ~= "success" do
  213. ret = bt.tick(node.kid, data)
  214. if ret == "running" then
  215. return "running"
  216. elseif ret == "failed" then
  217. bt.reset(node.kid, data)
  218. end
  219. end
  220. return "success"
  221. end,
  222. reset = function(node, data)
  223. bt.reset(node.kid, data)
  224. end,
  225. -- -1 times is forever
  226. ctor = function(what)
  227. return {
  228. kid = what,
  229. }
  230. end,
  231. })
  232. bt.register_action("WaitTicks", {
  233. tick = function(node, data)
  234. if node.current == nil then
  235. node.current = 0
  236. end
  237. node.current = node.current + 1
  238. if node.current > node.n then
  239. node.current = 0
  240. return "success"
  241. end
  242. return "running"
  243. end,
  244. reset = function(node, data)
  245. node.current = 0
  246. end,
  247. -- -1 times is forever
  248. ctor = function(n)
  249. return {
  250. n=n,
  251. current=0,
  252. }
  253. end,
  254. })
  255. bt.register_action("Counter", {
  256. tick = function(node, data)
  257. if data.counters[node.cname] == nil then
  258. data.counters[node.cname] = 0
  259. end
  260. if node.op == "set" then
  261. data.counters[node.cname] = node.val
  262. elseif node.op == "inc" then
  263. data.counters[node.cname] = data.counters[node.cname] + 1
  264. elseif node.op == "dec" then
  265. data.counters[node.cname] = data.counters[node.cname] - 1
  266. elseif node.op == "add" then
  267. data.counters[node.cname] = data.counters[node.cname] + node.val
  268. elseif node.op == "sub" then
  269. data.counters[node.cname] = data.counters[node.cname] - node.val
  270. elseif node.op == "eq" and data.counters[node.cname] ~= node.val then
  271. return "failed"
  272. elseif node.op == "ne" and data.counters[node.cname] == node.val then
  273. return "failed"
  274. elseif node.op == "gt" and data.counters[node.cname] <= node.val then
  275. return "failed"
  276. elseif node.op == "lt" and data.counters[node.cname] >= node.val then
  277. return "failed"
  278. elseif node.op == "gte" and data.counters[node.cname] < node.val then
  279. return "failed"
  280. elseif node.op == "lte" and data.counters[node.cname] > node.val then
  281. return "failed"
  282. end
  283. return "success"
  284. end,
  285. ctor = function(name, op, val)
  286. return {
  287. cname = name,
  288. op = op,
  289. val = val,
  290. }
  291. end,
  292. })
  293. bt.register_action("Animate", {
  294. tick = function(node, data)
  295. set_animation(data.mob, node.anim)
  296. return "success"
  297. end,
  298. ctor = function(anim) return { anim= anim } end,
  299. })
  300. bt.register_action("Wield", {
  301. tick = function(node, data)
  302. data.mob.object:set_wielded_item(node.item)
  303. return "success"
  304. end,
  305. ctor = function(item) return { item= item } end,
  306. })
  307. bt.register_action("SetRole", {
  308. tick = function(node, data)
  309. data.role = node.role
  310. if data.groupID ~= nil then
  311. local gd = giants.groupData[data.groupID]
  312. if gd == nil then
  313. return "success"
  314. end
  315. if gd.members[data.mob.inv_id] == nil then
  316. gd.members[data.mob.inv_id] = {}
  317. end
  318. gd.members[data.mob.inv_id].role = node.role
  319. end
  320. return "success"
  321. end,
  322. ctor = function(role) return { role= role } end,
  323. })
  324. bt.register_action("Print", {
  325. tick = function(node, data)
  326. print(node.txt)
  327. return "success"
  328. end,
  329. ctor = function(txt)
  330. return {
  331. txt=txt,
  332. }
  333. end,
  334. })