{"id":20572057,"url":"https://github.com/netease/pomelo-bt","last_synced_at":"2025-04-14T17:07:58.479Z","repository":{"id":5569089,"uuid":"6774566","full_name":"NetEase/pomelo-bt","owner":"NetEase","description":"behavior tree implementation for pomelo ai","archived":false,"fork":false,"pushed_at":"2013-02-22T03:46:46.000Z","size":189,"stargazers_count":33,"open_issues_count":1,"forks_count":17,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-14T17:07:52.624Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NetEase.png","metadata":{"files":{"readme":"README-Chinese.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-11-20T08:29:36.000Z","updated_at":"2025-03-07T11:30:44.000Z","dependencies_parsed_at":"2022-08-26T19:42:23.615Z","dependency_job_id":null,"html_url":"https://github.com/NetEase/pomelo-bt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-bt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-bt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-bt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetEase%2Fpomelo-bt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NetEase","download_url":"https://codeload.github.com/NetEase/pomelo-bt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248923765,"owners_count":21183953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-16T05:18:11.188Z","updated_at":"2025-04-14T17:07:58.427Z","avatar_url":"https://github.com/NetEase.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"#pomelo-bt - behavior tree for node.js\npomelo-bt是pomelo项目中AI模块所依赖的行为树模块，提供了基本的行为树实现。\n\n+ Tags: node.js\n\n##安装\n```\nnpm install pomelo-bt\n```\n\n##行为树节点基类\n###节点基类 Node\n所有行为树节点都从该类派生，构造函数接受一个blackboard实例作为参数。\n每个节点都提供一个执行的入口doAction方法。doAction执行完完毕后，向父节点返回执行结果：\nRES_SUCCESS, RES_FAIL, RES_WAIT分别代表当前执行成功，失败和仍在执行中。\n父节点根据子节点的返回值再做后续流程决策。\n\n###组合节点基类 Composite\n所有组合节点都从该类派生，内部可以维护多个孩子节点。提供addChild接口，添加孩子节点。\n\n###装饰节点基类 Decorator\n所有装饰节点都从该类派生，提供setChild接口，添加唯一的孩子节点。\n\n##组合节点\n###Sequence\n实现行为树sequence语义。\n####构造函数Sequenec(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n\n###Parallel\n实现行为树parallel语义。\n####构造函数Parallel(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n+ opts.policy - Parallel节点失败策略，可选值：Parallel.POLICY_FAIL_ON_ONE（默认值）, Parallel.POLICY_FAIL_ON_ALL。\n\n###Selector\n实现行为树selector语义。\n####构造函数Selector(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n\n##装饰节点\n###Loop\n循环节点。\n####构造函数Loop(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n+ opts.child - 孩子节点。\n+ opts.loopCond(blackboard) - 循环条件判断函数。返回true表示循环条件成立，否则不成立。\n\n##条件节点\n###Condition\n条件成立返回RES_SUCCESS, 反之返回RES_FAIL。\n####构造函数Condition(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n+ opts.cond(blackboard) - 条件判断函数，返回true表示条件成立，否则不成立。\n\n##其他节点\n###If\n实现if语义，如果条件成立，则执行关联的孩子节点。\n####构造函数If(opts)\n+ opts.blackboard - 构造行为树节点的blackboard实例。\n+ opts.action - 孩子节点。\n+ opts.cond(blackboard) - 条件判断函数，返回true表示条件成立，否则不成立。\n\n##用法\n``` javascript\nvar util = require('util');\nvar bt = require('pomelo-bt');\nvar Sequence = bt.Sequence;\nvar Node = bt.Node;\n\n// define some action nodes\nvar HelloNode = function(blackboard) {\n  Node.call(this, blackboard);\n};\nutil.inherits(HelloNode, Node);\n\nHelloNode.prototype.doAction = function() {\n  console.log('Hello ');\n  return bt.RES_SUCCESS;\n};\n\n\nvar WorldNode = function(blackboard) {\n  Node.call(this, blackboard);\n};\nutil.inherits(WorldNode, Node);\n\nWorldNode.prototype.doAction = function() {\n  console.log('World');\n  return bt.RES_SUCCESS;\n};\n\nvar blackboard = {};\n\n// composite your behavior tree\nvar seq = new Sequence({blackboard: blackboard});\nvar hello = new HelloNode(blackboard);\nvar world = new WorldNode(blackboard);\n\nseq.addChild(hello);\nseq.addChild(world);\n\n// run the behavior tree\nseq.doAction();\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetease%2Fpomelo-bt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetease%2Fpomelo-bt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetease%2Fpomelo-bt/lists"}