[ { "name": "AlwaysFailure", "type": "Decorator", "children": 1, "status": [ "failure", "|running" ], "desc": "始终返回失败", "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `running` 时,返回 `running`\n+ 其它情况,不管子节点是否成功都返回 `failure`\n" }, { "name": "AlwaysRunning", "type": "Decorator", "children": 1, "status": [ "running" ], "desc": "始终返回运行中状态", "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 始终返回 `running`\n" }, { "name": "AlwaysSuccess", "type": "Decorator", "children": 1, "status": [ "success", "|running" ], "desc": "始终返回成功", "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `running` 时,返回 `running`\n+ 其它情况,不管子节点是否成功都返回 `success`\n" }, { "name": "Assert", "type": "Decorator", "children": 1, "status": [ "success" ], "desc": "断言", "args": [ { "name": "message", "type": "string", "desc": "消息" } ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `failure` 时,抛出异常\n+ 其余情况返回子节点的执行状态\n" }, { "name": "Calculate", "type": "Action", "children": 0, "status": [ "success" ], "desc": "简单的数值公式计算", "args": [ { "name": "value", "type": "expr", "desc": "计算公式" } ], "output": [ "计算结果" ], "doc": "+ 做简单的数值公式计算,返回结果到输出\n" }, { "name": "Case", "type": "Composite", "children": 2, "status": [ "&success", "|failure", "|running" ], "desc": "分支选择", "doc": "+ 必须有两个子节点\n+ 第一个子节点为判断条件\n+ 第二个子节点为判断为 `success` 时执行的节点\n+ 此节点不会真正意义的执行,而是交由 `Switch` 节点来执行\n" }, { "name": "Check", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "检查True或False", "args": [ { "name": "value", "type": "expr", "desc": "值" } ], "doc": "+ 做简单数值公式判定,返回 `success` 或 `failure`\n" }, { "name": "Concat", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "将两个输入合并为一个数组,并返回新数组", "input": [ "数组1", "数组2" ], "output": [ "新数组" ], "doc": "+ 如果输入不是数组,则返回 `failure`\n" }, { "name": "Delay", "type": "Decorator", "children": 1, "status": [ "success" ], "desc": "延时执行子节点", "input": [ "延时时间?" ], "args": [ { "name": "delay", "type": "float?", "desc": "延时时间", "oneof": "延时时间" }, { "name": "cacheVars", "type": "string[]?", "desc": "暂存环境变量" } ], "doc": "+ 当延时触发时,执行第一个子节点,多个仅执行第一个\n+ 如果子节点返回 `running`,会中断执行并清理执行栈" }, { "name": "Filter", "type": "Decorator", "children": 1, "status": [ "success", "failure", "|running" ], "desc": "返回满足条件的元素", "input": [ "输入数组" ], "output": [ "变量", "新数组" ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 遍历输入数组,将当前元素写入`变量`,满足条件的元素放入新数组\n+ 只有当新数组不为空时,才返回 `success`\n" }, { "name": "ForEach", "type": "Decorator", "children": 1, "status": [ "success", "|running", "|failure" ], "desc": "遍历数组", "input": [ "数组" ], "output": [ "变量", "索引?" ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 遍历输入数组,将当前元素写入`变量`\n+ 当子节点返回 `failure` 时,退出遍历并返回 `failure` 状态\n+ 执行完所有子节点后,返回 `success`" }, { "name": "GetField", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "获取对象的字段值", "args": [ { "name": "field", "type": "string?", "desc": "字段(field)", "oneof": "字段(field)" } ], "input": [ "对象", "字段(field)?" ], "output": [ "字段值(value)" ], "doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 只有获取到合法元素时候才会返回 `success`,否则返回 `failure`\n" }, { "name": "IfElse", "type": "Composite", "children": 3, "status": [ "|success", "|failure", "|running" ], "desc": "条件执行", "doc": "+ 必须有三个子节点\n+ 第一个子节点为条件节点\n+ 第二个子节点为条件为 `success` 时执行的节点\n+ 第三个子节点为条件为 `failure` 时执行的节点,\n" }, { "name": "Includes", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "判断元素是否在数组中", "input": [ "数组", "元素" ], "doc": "+ 若输入的元素不合法,返回 `failure`\n+ 只有数组包含元素时返回 `success`,否则返回 `failure`\n" }, { "name": "Index", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "索引输入的数组", "args": [ { "name": "index", "type": "int?", "desc": "索引", "oneof": "索引" } ], "input": [ "数组", "索引?" ], "output": [ "值" ], "doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 索引数组的时候,第一个元素的索引为 0\n+ 只有索引到有合法元素时候才会返回 `success`,否则返回 `failure`\n" }, { "name": "Invert", "type": "Decorator", "children": 1, "status": [ "!success", "!failure", "|running" ], "desc": "反转子节点运行结果", "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `success` 时返回 `failure`\n+ 当子节点返回 `failure` 时返回 `success`\n+ 当子节点返回 `error` 时返回 `error`\n" }, { "name": "IsNull", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "判断变量是否不存在", "input": [ "判断的变量" ] }, { "name": "JustFailure", "type": "Action", "children": 0, "status": [ "failure" ], "desc": "什么都不干,只返回失败" }, { "name": "JustSuccess", "type": "Action", "children": 0, "status": [ "success" ], "desc": "什么都不干,只返回成功" }, { "name": "Let", "type": "Action", "children": 0, "status": [ "success" ], "desc": "定义新的变量名", "input": [ "已存在变量名?" ], "args": [ { "name": "value", "type": "json?", "desc": "值(value)", "oneof": "已存在变量名" } ], "output": [ "新变量名" ], "doc": "+ 如果有输入变量,则给已有变量重新定义一个名字\n+ 如果`值(value)`为 `null`,则清除变量\n" }, { "name": "Listen", "type": "Decorator", "children": 1, "status": [ "success" ], "desc": "侦听事件", "input": [ "目标对象?" ], "output": [ "事件目标?", "事件参数..." ], "args": [ { "name": "event", "type": "string", "desc": "事件", "options": [ { "source": [ { "name": "左键单击", "value": "EVT_KEY_LEFT_CLICK" }, { "name": "左键双击", "value": "EVT_KEY_LEFT_DOUBLE_CLICK" }, { "name": "左键长按", "value": "EVT_KEY_LEFT_LONG_PRESS" }, { "name": "右键单击", "value": "EVT_KEY_RIGHT_CLICK" }, { "name": "右键双击", "value": "EVT_KEY_RIGHT_DOUBLE_CLICK" }, { "name": "右键长按", "value": "EVT_KEY_RIGHT_LONG_PRESS" }, { "name": "右键三击", "value": "EVT_KEY_RIGHT_TRIPLE_CLICK" }, { "name": "左右键同时长按", "value": "EVT_KEY_BOTH_LONG_PRESS" }, { "name": "触摸单击", "value": "EVT_TOUCH_TAP" }, { "name": "触摸三击", "value": "EVT_TOUCH_TRIPLE_TAP" }, { "name": "摇晃", "value": "EVT_GYRO_SHAKE" }, { "name": "人靠近", "value": "EVT_RADAR_PERSON_APPROACH" }, { "name": "人离开", "value": "EVT_RADAR_PERSON_LEAVE" }, { "name": "电量危险", "value": "EVT_BATTERY_CRITICAL" }, { "name": "Wi-Fi 已连接", "value": "EVT_WIFI_CONNECTED" }, { "name": "Wi-Fi 已断开", "value": "EVT_WIFI_DISCONNECTED" }, { "name": "剧本播放完成", "value": "EVT_SCRIPT_DONE" }, { "name": "饱食度变化", "value": "EVT_PHYSIOLOGY_FULLNESS_CHANGED" }, { "name": "清洁度变化", "value": "EVT_PHYSIOLOGY_CLEANLINESS_CHANGED" }, { "name": "精力值变化", "value": "EVT_PHYSIOLOGY_ENERGY_CHANGED" }, { "name": "开心值变化", "value": "EVT_PHYSIOLOGY_HAPPINESS_CHANGED" } ] } ] } ], "doc": "+ 当事件触发时,执行第一个子节点,多个仅执行第一个\n+ 如果子节点返回 `running`,会中断执行并清理执行栈" }, { "name": "Log", "type": "Action", "children": 0, "status": [ "success" ], "desc": "打印日志", "input": [ "日志?" ], "args": [ { "name": "message", "type": "string", "desc": "日志" }, { "name": "level", "type": "string", "desc": "日志级别", "default": "log", "options": [ { "source": [ { "name": "LOG", "value": "log" }, { "name": "INFO", "value": "info" }, { "name": "DEBUG", "value": "debug" }, { "name": "WARN", "value": "warn" }, { "name": "ERROR", "value": "error" } ] } ] } ] }, { "name": "Math", "type": "Action", "desc": "执行数学运算", "input": [ "参数..." ], "output": [ "结果" ], "status": [ "success", "failure" ], "args": [ { "name": "op", "type": "string", "desc": "数学运算类型", "options": [ { "source": [ { "name": "绝对值", "value": "abs" }, { "name": "向上取整", "value": "ceil" }, { "name": "向下取整", "value": "floor" }, { "name": "四舍五入", "value": "round" }, { "name": "符号", "value": "sign" }, { "name": "正弦", "value": "sin" }, { "name": "余弦", "value": "cos" }, { "name": "正切", "value": "tan" }, { "name": "反正切2", "value": "atan2" }, { "name": "幂运算", "value": "pow" }, { "name": "平方根", "value": "sqrt" }, { "name": "自然对数", "value": "log" }, { "name": "最小值", "value": "min" }, { "name": "最大值", "value": "max" }, { "name": "随机数", "value": "random" }, { "name": "随机整数", "value": "randInt" }, { "name": "随机浮点数", "value": "randFloat" }, { "name": "求和", "value": "sum" }, { "name": "平均值", "value": "average" }, { "name": "乘积", "value": "product" } ] } ] }, { "name": "value1", "type": "float?", "desc": "参数1(优先使用)" }, { "name": "value2", "type": "float?", "desc": "参数2(优先使用)" } ] }, { "name": "NotNull", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "判断变量是否存在", "input": [ "判断的变量" ] }, { "name": "Now", "type": "Action", "children": 0, "status": [ "success" ], "desc": "获取当前时间", "output": [ "当前时间" ] }, { "name": "Once", "type": "Decorator", "children": 1, "status": [ "success", "failure", "|running" ], "desc": "只执行一次", "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 第一次执行完全部子节点时返回 `success`,之后永远返回 `failure`" }, { "name": "Parallel", "type": "Composite", "status": [ "success", "|running" ], "children": -1, "desc": "并行执行", "doc": "+ 并行执行所有子节点\n+ 当有子节点返回 `running` 时,返回 `running` 状态\n+ 执行完所有子节点后,返回 `success`" }, { "name": "Push", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "向数组中添加元素", "input": [ "数组", "元素" ], "doc": "+ 当变量`数组`不是数组类型时返回 `failure`\n+ 其余返回 `success`\n" }, { "name": "Race", "type": "Composite", "status": [ "|success", "&failure", "|running" ], "children": -1, "desc": "竞争执行", "doc": "+ 并行执行所有子节点\n+ 当有子节点返回 `success` 时,立即返回 `success` 状态,并中断其他子节点\n+ 如果所有子节点返回 `failure`或 `error` 则返回 `failure`" }, { "name": "RandomIndex", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "随机返回输入的其中一个!", "input": [ "输入目标" ], "output": [ "随机目标", "索引?" ], "doc": "+ 合法元素不包括 `undefined` 和 `null`\n+ 在输入数组中,随机返回其中一个\n+ 当输入数组为空时,或者没有合法元素,返回 `failure`\n" }, { "name": "Repeat", "type": "Decorator", "children": 1, "status": [ "success", "|running", "|failure" ], "desc": "循环执行", "input": [ "循环次数?" ], "args": [ { "name": "count", "type": "int?", "desc": "循环次数", "oneof": "循环次数" } ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回 `failure` 时,退出遍历并返回 `failure` 状态\n+ 执行完所有子节点后,返回 `success`\n" }, { "name": "RetryUntilFailure", "type": "Decorator", "children": 1, "status": [ "!success", "failure", "running" ], "desc": "一直尝试直到子节点返回失败", "input": [ "最大尝试次数?" ], "args": [ { "name": "count", "type": "int?", "desc": "最大尝试次数" } ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 只有当子节点返回 `failure` 时,才返回 `success`,其它情况返回 `running` 状态\n+ 如果设定了尝试次数,超过指定次数则返回 `failure`" }, { "name": "RetryUntilSuccess", "type": "Decorator", "children": 1, "status": [ "|success", "failure", "running" ], "desc": "一直尝试直到子节点返回成功", "input": [ "最大尝试次数?" ], "args": [ { "name": "count", "type": "int?", "desc": "最大尝试次数" } ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 只有当子节点返回 `success` 时,才返回 `success`,其它情况返回 `running` 状态\n+ 如果设定了尝试次数,超过指定次数则返回 `failure`" }, { "name": "Selector", "type": "Composite", "children": -1, "desc": "选择执行", "status": [ "|success", "&failure", "|running" ], "doc": "+ 一直往下执行,直到有子节点返回 `success` 则返回 `success`\n+ 若全部节点返回 `failure`或 `error` 则返回 `failure`" }, { "name": "Sequence", "type": "Composite", "children": -1, "status": [ "&success", "|failure", "|running" ], "desc": "顺序执行", "doc": "+ 一直往下执行,只有当所有子节点都返回 `success`, 才返回 `success`\n+ 若子节点返回 `failure`,则直接返回 `failure` 状态\n+ 其余情况返回 `running` 状态\n" }, { "name": "SetField", "type": "Action", "children": 0, "status": [ "success", "failure" ], "desc": "设置对象字段值", "input": [ "输入对象", "字段(field)?", "值(value)?" ], "args": [ { "name": "field", "type": "string?", "desc": "字段(field)", "oneof": "字段(field)" }, { "name": "value", "type": "json?", "desc": "值(value)", "oneof": "值(value)" } ], "doc": "+ 对输入对象设置 `field` 和 `value`\n+ 输入参数1必须为对象,否则返回 `failure`\n+ 如果 `field` 不为 `string`, 也返回 `failure`\n+ 如果 `value` 为 `undefined` 或 `null`, 则删除 `field` 的值\n" }, { "name": "Switch", "type": "Composite", "children": -1, "status": [ "|success", "|failure", "|running" ], "desc": "分支执行", "doc": "+ 按顺序测试 `Case` 节点的判断条件(第一个子节点)\n+ 若测试返回 `success` 则执行 `Case` 第二个子节点,并返回子节点的执行状态\n+ 若没有判断为 `success` 的 `Case` 节点,则返回 `failure`\n" }, { "name": "Timeout", "type": "Decorator", "children": 1, "status": [ "|success", "|running", "failure" ], "desc": "超时", "input": [ "超时时间?" ], "args": [ { "name": "time", "type": "float?", "desc": "超时时间", "oneof": "超时时间" } ], "doc": "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点执行超时或返回 `failure` 时,返回 `failure`\n+ 其余情况返回子节点的执行状态\n" }, { "name": "PlayScript", "type": "Action", "children": 0, "status": [ "success", "running", "failure" ], "desc": "播放脚本(GIF/音频/LED)", "args": [ { "name": "script", "type": "string", "desc": "脚本路径,如 baby/interaction/curious" } ], "doc": "+ 根据脚本路径驱动 display / audio / led 执行\n+ 运行期间返回 `running`,完成后返回 `success`" }, { "name": "Wait", "type": "Action", "children": 0, "status": [ "success", "running" ], "desc": "等待", "input": [ "等待时间?" ], "args": [ { "name": "time", "type": "float?", "desc": "等待时间", "oneof": "等待时间" }, { "name": "random", "type": "float?", "desc": "随机范围" } ] }, { "name": "WaitForEvent", "type": "Action", "children": 0, "status": [ "success", "running" ], "desc": "等待事件触发", "args": [ { "name": "event", "type": "string", "desc": "事件名称" } ] }, { "name": "CheckPhysio", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "检查宠物生理数值", "args": [ { "name": "attr", "type": "string", "desc": "数值类型", "options": [ { "source": [ { "name": "饱食度(fullness)", "value": "fullness" }, { "name": "清洁度(cleanliness)", "value": "cleanliness" }, { "name": "精力值(energy)", "value": "energy" }, { "name": "开心值(happiness)", "value": "happiness" } ] } ] }, { "name": "op", "type": "string", "desc": "比较操作", "default": "<=", "options": [ { "source": [ { "name": "<=", "value": "<=" }, { "name": "<", "value": "<" }, { "name": ">=", "value": ">=" }, { "name": ">", "value": ">" }, { "name": "==", "value": "==" }, { "name": "!=", "value": "!=" } ] } ] }, { "name": "value", "type": "int", "desc": "比较阈值(0-100)" } ], "doc": "+ 从 demo7 DataCenter 读取指定数值并比较\n+ 例如 fullness <= 30 表示饱食度过低,需要播放饿了的剧本\n" }, { "name": "AddPhysio", "type": "Action", "children": 0, "status": [ "success" ], "desc": "增加或减少宠物生理数值", "args": [ { "name": "attr", "type": "string", "desc": "数值类型", "options": [ { "source": [ { "name": "饱食度(fullness)", "value": "fullness" }, { "name": "清洁度(cleanliness)", "value": "cleanliness" }, { "name": "精力值(energy)", "value": "energy" }, { "name": "开心值(happiness)", "value": "happiness" } ] } ] }, { "name": "amount", "type": "int", "desc": "变化量,可为负数" } ], "doc": "+ 调用 demo7 IPetContext 修改 DataCenter 中的数值\n+ 例如 happiness = -3 表示心情下降 3 点\n" }, { "name": "SetPhysio", "type": "Action", "children": 0, "status": [ "success" ], "desc": "直接设定宠物生理数值为指定绝对值", "args": [ { "name": "attr", "type": "string", "desc": "数值类型", "options": [ { "source": [ { "name": "饱食度(fullness)", "value": "fullness" }, { "name": "清洁度(cleanliness)", "value": "cleanliness" }, { "name": "精力值(energy)", "value": "energy" }, { "name": "开心值(happiness)", "value": "happiness" } ] } ] }, { "name": "value", "type": "int", "desc": "目标数值(0-100)" } ], "doc": "+ 直接将 DataCenter 中的指定数值设置为 value(绝对值,非增量)\n+ 例如喂食后 SetPhysio { fullness: 80 } 将饱食度重置为 80\n" }, { "name": "CheckUtility", "type": "Condition", "children": 0, "status": [ "success", "failure" ], "desc": "检查宠物行为效用值(由 PetBrain 计算的 0.0–1.0 驱动强度)", "args": [ { "name": "attr", "type": "string", "desc": "效用属性", "options": [ { "source": [ { "name": "饥饿(hungry)", "value": "hungry" }, { "name": "困倦(sleepy)", "value": "sleepy" }, { "name": "脏了(dirty)", "value": "dirty" }, { "name": "开心(laugh)", "value": "laugh" }, { "name": "好奇(curious)", "value": "curious" }, { "name": "悲伤(sad)", "value": "sad" } ] } ] }, { "name": "op", "type": "string", "desc": "比较操作", "default": ">=", "options": [ { "source": [ { "name": ">=", "value": ">=" }, { "name": ">", "value": ">" }, { "name": "<=", "value": "<=" }, { "name": "<", "value": "<" }, { "name": "==", "value": "==" }, { "name": "!=", "value": "!=" } ] } ] }, { "name": "value", "type": "float", "desc": "比较阈值(0.0 – 1.0)" } ], "doc": "+ 从 PetBrain::GetBehaviorUtilities() 读取效用分数,与阈值比较\n+ attr 可选值:hungry / sleepy / dirty / laugh / curious / sad\n+ 例如:{ attr: \"hungry\", op: \">=\", value: 0.6 } 表示饥饿驱动力 ≥ 60%,应播放饿了剧本\n+ 与 CheckPhysio 的区别:CheckPhysio 读取的是原始整数值(0-100),CheckUtility 读取的是经过曲线映射后的标准化驱动强度\n" }, { "name": "RequestModeSwitch", "type": "Action", "children": 0, "status": [ "success" ], "desc": "请求切换宠物模式", "args": [ { "name": "mode", "type": "string", "desc": "目标模式", "options": [ { "source": [ { "name": "待机模式", "value": "MODE_IDLE" }, { "name": "菜单模式", "value": "MODE_MENU" }, { "name": "睡眠模式", "value": "MODE_SLEEPING" } ] } ] } ], "doc": "+ 请求切换到指定的宠物模式\n+ MODE_MENU: 打开菜单(等同于 Log 中的 OPEN_MENU)\n+ MODE_IDLE: 返回待机\n+ MODE_SLEEPING: 进入睡眠\n" }, { "name": "Watchdog", "type": "Composite", "children": 3, "status": [ "|success", "|failure", "|running" ], "desc": "测试执行", "doc": "+ 必须有3个子节点\n+ 第一个子节点为条件节点,返回 `success` 或 `failure` 状态\n+ 第二个子节点为条件为 `success` 时执行的节点\n+ 第三个子节点为条件为 `failure` 时执行的节点,不管子节点返回什么状态,都直接返回 `failure`\n+ 当第二个子节点返回 `running` 时,由本节点维护其运行状态\n+ 每一次 tick 都会先执行测试节点,只有当测试节点返回 `success`,才执行第二个子节点\n" } ]