core.lua 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  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. -- debug -- 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. -- debug -- 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. -- debug -- 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. -- debug -- 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. -- not yet working
  77. --[[
  78. This node tries everything in succession until something comes back
  79. running, like Selector, except it retries the whole list every few
  80. ticks (tick_divisor) whether the previous child finished or not. If
  81. the previously running child is returned to it is not reset. If a new
  82. child returns running, the old child is reset and the new one runs.
  83. A few data properties must be preserved:
  84. targetPos
  85. ]]
  86. bt.register_action("Priority", {
  87. tick = function(node, data)
  88. local ret
  89. if node.current_kid == -1 then
  90. node.current_kid = 1
  91. ret = "failed" -- trick reset into being run
  92. end
  93. while node.current_kid <= table.getn(node.kids) do
  94. local cn = node.kids[node.current_kid]
  95. -- reset fresh nodes
  96. if ret == "failed" then
  97. -- debug -- print("resetting kid "..node.current_kid)
  98. bt.reset(cn, data)
  99. end
  100. -- tick the current node
  101. ret = bt.tick(cn, data)
  102. -- debug -- print(" selector '"..node.name.."' got status ["..ret.."] from kid "..node.current_kid)
  103. if ret == "running" or ret == "success" then
  104. return ret
  105. end
  106. node.current_kid = node.current_kid + 1
  107. end
  108. return "failed"
  109. end,
  110. reset = function(node, data)
  111. -- debug -- print("priority resetting - PRIORITY IS BROKEN")
  112. node.current_kid = -1
  113. node.fallback_kid = -1
  114. end,
  115. ctor = function(name, tick_divisor, list)
  116. return {
  117. name=name,
  118. tick_divisor = tick_divisor,
  119. current_kid=-1,
  120. fallback_kid=-1,
  121. kids=list,
  122. }
  123. end,
  124. })
  125. bt.register_action("Repeat", {
  126. tick = function(node, data)
  127. --tprint(node)
  128. if node.times ~= -1 then
  129. node.count = node.count + 1
  130. if node.count > node.times then
  131. return "success"
  132. end
  133. end
  134. local ret = bt.tick(node.kids[1], data)
  135. if ret ~= "running" then
  136. bt.reset(node.kids[1], data)
  137. end
  138. return "success"
  139. end,
  140. reset = function(node, data)
  141. node.count = 0
  142. if node.times_fn then
  143. node.times = node.times_fn()
  144. end
  145. end,
  146. -- -1 times is forever
  147. ctor = function(name, times, what)
  148. local x = {
  149. name=name,
  150. kids = what,
  151. }
  152. if type(times) == "function" then
  153. x.times_fn = times
  154. elseif times == nil then
  155. x.times = -1
  156. else
  157. x.times = times
  158. end
  159. return x
  160. end,
  161. })
  162. bt.register_action("Succeed", {
  163. tick = function(node, data)
  164. local ret = bt.tick(node.kid, data)
  165. if ret == "running" then
  166. return "running"
  167. else
  168. return "success"
  169. end
  170. end,
  171. reset = function(node, data)
  172. bt.reset(node.kid, data)
  173. end,
  174. ctor = function(kid)
  175. return {
  176. kid=kid,
  177. }
  178. end,
  179. })
  180. bt.register_action("Fail", {
  181. tick = function(node, data)
  182. local ret = bt.tick(node.kid, data)
  183. if ret == "running" then
  184. return "running"
  185. else
  186. return "failed"
  187. end
  188. end,
  189. reset = function(node, data)
  190. bt.reset(node.kid, data)
  191. end,
  192. ctor = function(kid)
  193. return {
  194. kid=kid,
  195. }
  196. end,
  197. })
  198. bt.register_action("Invert", {
  199. tick = function(node, data)
  200. local ret = bt.tick(node.kid, data)
  201. if ret == "running" then
  202. return "running"
  203. elseif ret == "success" then
  204. return "failed"
  205. else
  206. return "success"
  207. end
  208. end,
  209. reset = function(node, data)
  210. bt.reset(node.kid, data)
  211. end,
  212. ctor = function(kid)
  213. return {
  214. kid=kid,
  215. }
  216. end,
  217. })
  218. bt.register_action("Random", {
  219. tick = function(node, data)
  220. return bt.tick(node.kids[node.chosen_kid], data)
  221. --return "failed"
  222. end,
  223. reset = function(node, data)
  224. node.chosen_kid = math.random(1, table.getn(node.kids))
  225. -- debug -- print("chosen: "..node.chosen_kid)
  226. bt.reset(node.kids[node.chosen_kid], data)
  227. end,
  228. ctor = function(kids)
  229. return {
  230. kids=kids,
  231. chosen_kid=nil,
  232. }
  233. end,
  234. })
  235. bt.register_action("UntilFailed", {
  236. tick = function(node, data)
  237. -- TODO: BUG: make sure it resets the kid the first run
  238. local ret
  239. while ret ~= "failed" do
  240. ret = bt.tick(node.kid, data)
  241. if ret == "running" then
  242. return "running"
  243. elseif ret == "success" then
  244. bt.reset(node.kid, data)
  245. end
  246. end
  247. return "failed"
  248. end,
  249. reset = function(node, data)
  250. bt.reset(node.kid, data)
  251. end,
  252. -- -1 times is forever
  253. ctor = function(what)
  254. return {
  255. kid = what,
  256. }
  257. end,
  258. })
  259. bt.register_action("UntilSuccess", {
  260. tick = function(node, data)
  261. -- TODO: BUG: make sure it resets the kids the first run
  262. local ret
  263. while ret ~= "success" do
  264. ret = bt.tick(node.kid, data)
  265. if ret == "running" then
  266. return "running"
  267. elseif ret == "failed" then
  268. bt.reset(node.kid, data)
  269. end
  270. end
  271. return "success"
  272. end,
  273. reset = function(node, data)
  274. bt.reset(node.kid, data)
  275. end,
  276. -- -1 times is forever
  277. ctor = function(what)
  278. return {
  279. kid = what,
  280. }
  281. end,
  282. })
  283. bt.register_action("WaitTicks", {
  284. tick = function(node, data)
  285. if node.current == nil then
  286. node.current = 0
  287. end
  288. node.current = node.current + 1
  289. if node.current > node.n then
  290. node.current = 0
  291. return "success"
  292. end
  293. return "running"
  294. end,
  295. reset = function(node, data)
  296. node.current = 0
  297. end,
  298. -- -1 times is forever
  299. ctor = function(n)
  300. return {
  301. n=n,
  302. current=0,
  303. }
  304. end,
  305. })
  306. bt.register_action("Counter", {
  307. tick = function(node, data)
  308. if data.counters[node.cname] == nil then
  309. data.counters[node.cname] = 0
  310. end
  311. if node.op == "set" then
  312. data.counters[node.cname] = node.val
  313. elseif node.op == "inc" then
  314. data.counters[node.cname] = data.counters[node.cname] + 1
  315. elseif node.op == "dec" then
  316. data.counters[node.cname] = data.counters[node.cname] - 1
  317. elseif node.op == "add" then
  318. data.counters[node.cname] = data.counters[node.cname] + node.val
  319. elseif node.op == "sub" then
  320. data.counters[node.cname] = data.counters[node.cname] - node.val
  321. elseif node.op == "eq" and data.counters[node.cname] ~= node.val then
  322. return "failed"
  323. elseif node.op == "ne" and data.counters[node.cname] == node.val then
  324. return "failed"
  325. elseif node.op == "gt" and data.counters[node.cname] <= node.val then
  326. return "failed"
  327. elseif node.op == "lt" and data.counters[node.cname] >= node.val then
  328. return "failed"
  329. elseif node.op == "gte" and data.counters[node.cname] < node.val then
  330. return "failed"
  331. elseif node.op == "lte" and data.counters[node.cname] > node.val then
  332. return "failed"
  333. elseif node.op == "mod=0" and (data.counters[node.cname] + (node.val2 or 0)) % node.val ~= 0 then
  334. return "failed"
  335. end
  336. return "success"
  337. end,
  338. ctor = function(name, op, val, val2)
  339. return {
  340. cname = name,
  341. op = op,
  342. val = val,
  343. val2 = val2,
  344. }
  345. end,
  346. })
  347. bt.register_action("Animate", {
  348. tick = function(node, data)
  349. set_animation(data.mob, node.anim)
  350. return "success"
  351. end,
  352. ctor = function(anim) return { anim= anim } end,
  353. })
  354. bt.register_action("Wield", {
  355. tick = function(node, data)
  356. data.mob.object:set_wielded_item(node.item)
  357. return "success"
  358. end,
  359. ctor = function(item) return { item= item } end,
  360. })
  361. bt.register_action("SetRole", {
  362. tick = function(node, data)
  363. data.role = node.role
  364. if data.groupID ~= nil then
  365. local gd = mobehavior.groupData[data.groupID]
  366. if gd == nil then
  367. return "success"
  368. end
  369. if gd.members[data.mob.inv_id] == nil then
  370. gd.members[data.mob.inv_id] = {}
  371. end
  372. gd.members[data.mob.inv_id].role = node.role
  373. end
  374. return "success"
  375. end,
  376. ctor = function(role) return { role= role } end,
  377. })
  378. bt.register_action("Print", {
  379. tick = function(node, data)
  380. print(node.txt)
  381. return "success"
  382. end,
  383. ctor = function(txt)
  384. return {
  385. txt=txt,
  386. }
  387. end,
  388. })