@esengine/behavior-tree 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/{index.d.ts → dist/index.d.ts} +361 -73
- package/dist/index.js +4692 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -29
- package/index.cjs +0 -2
- package/index.cjs.map +0 -1
- package/index.es5.js +0 -4
- package/index.es5.js.map +0 -1
- package/index.mjs +0 -2
- package/index.mjs.map +0 -1
- package/index.umd.js +0 -2
- package/index.umd.js.map +0 -1
package/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../bin/Types/TaskStatus.js","../bin/Runtime/BehaviorTreeData.js","../../../node_modules/tslib/tslib.es6.mjs","../bin/Runtime/BehaviorTreeRuntimeComponent.js","../bin/Runtime/BehaviorTreeAssetManager.js","../bin/Runtime/NodeExecutor.js","../bin/Runtime/NodeMetadata.js","../bin/Runtime/Executors/SequenceExecutor.js","../bin/Runtime/Executors/SelectorExecutor.js","../bin/Runtime/Executors/ParallelExecutor.js","../bin/Runtime/Executors/ParallelSelectorExecutor.js","../bin/Runtime/Executors/RandomSequenceExecutor.js","../bin/Runtime/Executors/RandomSelectorExecutor.js","../bin/Runtime/Executors/InverterExecutor.js","../bin/Runtime/Executors/RepeaterExecutor.js","../bin/Runtime/Executors/AlwaysSucceedExecutor.js","../bin/Runtime/Executors/AlwaysFailExecutor.js","../bin/Runtime/Executors/UntilSuccessExecutor.js","../bin/Runtime/Executors/UntilFailExecutor.js","../bin/Runtime/Executors/ConditionalExecutor.js","../bin/Runtime/Executors/CooldownExecutor.js","../bin/Runtime/Executors/TimeoutExecutor.js","../bin/Runtime/Executors/ServiceDecorator.js","../bin/Runtime/Executors/WaitAction.js","../bin/Runtime/Executors/LogAction.js","../bin/Runtime/Executors/SetBlackboardValue.js","../bin/Runtime/Executors/ModifyBlackboardValue.js","../bin/Runtime/Executors/ExecuteAction.js","../bin/Runtime/Executors/SubTreeExecutor.js","../bin/Runtime/Executors/BlackboardCompare.js","../bin/Runtime/Executors/BlackboardExists.js","../bin/Runtime/Executors/RandomProbability.js","../bin/Runtime/Executors/ExecuteCondition.js","../bin/Runtime/BehaviorTreeExecutionSystem.js","../bin/BehaviorTreeStarter.js","../bin/BehaviorTreeBuilder.js","../bin/Serialization/NodeTemplates.js","../bin/Serialization/BehaviorTreeAsset.js","../bin/Serialization/EditorFormatConverter.js","../bin/Serialization/BehaviorTreeAssetSerializer.js","../bin/Services/GlobalBlackboardService.js","../bin/BehaviorTreePlugin.js"],"sourcesContent":["/**\n * 任务执行状态\n */\nexport var TaskStatus;\n(function (TaskStatus) {\n /** 无效状态 - 节点未初始化或已被重置 */\n TaskStatus[TaskStatus[\"Invalid\"] = 0] = \"Invalid\";\n /** 成功 - 节点执行成功完成 */\n TaskStatus[TaskStatus[\"Success\"] = 1] = \"Success\";\n /** 失败 - 节点执行失败 */\n TaskStatus[TaskStatus[\"Failure\"] = 2] = \"Failure\";\n /** 运行中 - 节点正在执行,需要在后续帧继续 */\n TaskStatus[TaskStatus[\"Running\"] = 3] = \"Running\";\n})(TaskStatus || (TaskStatus = {}));\n/**\n * 内置节点类型常量\n */\nexport const NodeType = {\n /** 复合节点 - 有多个子节点 */\n Composite: 'composite',\n /** 装饰器节点 - 有一个子节点 */\n Decorator: 'decorator',\n /** 动作节点 - 叶子节点 */\n Action: 'action',\n /** 条件节点 - 叶子节点 */\n Condition: 'condition'\n};\n/**\n * 复合节点类型\n */\nexport var CompositeType;\n(function (CompositeType) {\n /** 序列 - 按顺序执行,全部成功才成功 */\n CompositeType[\"Sequence\"] = \"sequence\";\n /** 选择 - 按顺序执行,任一成功则成功 */\n CompositeType[\"Selector\"] = \"selector\";\n /** 并行 - 同时执行所有子节点 */\n CompositeType[\"Parallel\"] = \"parallel\";\n /** 并行选择 - 并行执行,任一成功则成功 */\n CompositeType[\"ParallelSelector\"] = \"parallel-selector\";\n /** 随机序列 - 随机顺序执行序列 */\n CompositeType[\"RandomSequence\"] = \"random-sequence\";\n /** 随机选择 - 随机顺序执行选择 */\n CompositeType[\"RandomSelector\"] = \"random-selector\";\n})(CompositeType || (CompositeType = {}));\n/**\n * 装饰器节点类型\n */\nexport var DecoratorType;\n(function (DecoratorType) {\n /** 反转 - 反转子节点结果 */\n DecoratorType[\"Inverter\"] = \"inverter\";\n /** 重复 - 重复执行子节点 */\n DecoratorType[\"Repeater\"] = \"repeater\";\n /** 直到成功 - 重复直到成功 */\n DecoratorType[\"UntilSuccess\"] = \"until-success\";\n /** 直到失败 - 重复直到失败 */\n DecoratorType[\"UntilFail\"] = \"until-fail\";\n /** 总是成功 - 无论子节点结果都返回成功 */\n DecoratorType[\"AlwaysSucceed\"] = \"always-succeed\";\n /** 总是失败 - 无论子节点结果都返回失败 */\n DecoratorType[\"AlwaysFail\"] = \"always-fail\";\n /** 条件装饰器 - 基于条件执行子节点 */\n DecoratorType[\"Conditional\"] = \"conditional\";\n /** 冷却 - 冷却时间内阻止执行 */\n DecoratorType[\"Cooldown\"] = \"cooldown\";\n /** 超时 - 超时则返回失败 */\n DecoratorType[\"Timeout\"] = \"timeout\";\n})(DecoratorType || (DecoratorType = {}));\n/**\n * 中止类型\n *\n * 用于动态优先级和条件重新评估\n */\nexport var AbortType;\n(function (AbortType) {\n /** 无 - 不中止任何节点 */\n AbortType[\"None\"] = \"none\";\n /** 自身 - 条件变化时可以中止自身的执行 */\n AbortType[\"Self\"] = \"self\";\n /** 低优先级 - 条件满足时可以中止低优先级的兄弟节点 */\n AbortType[\"LowerPriority\"] = \"lower-priority\";\n /** 两者 - 可以中止自身和低优先级节点 */\n AbortType[\"Both\"] = \"both\";\n})(AbortType || (AbortType = {}));\n/**\n * 黑板变量类型\n */\nexport var BlackboardValueType;\n(function (BlackboardValueType) {\n BlackboardValueType[\"String\"] = \"string\";\n BlackboardValueType[\"Number\"] = \"number\";\n BlackboardValueType[\"Boolean\"] = \"boolean\";\n BlackboardValueType[\"Vector2\"] = \"vector2\";\n BlackboardValueType[\"Vector3\"] = \"vector3\";\n BlackboardValueType[\"Object\"] = \"object\";\n BlackboardValueType[\"Array\"] = \"array\";\n})(BlackboardValueType || (BlackboardValueType = {}));\n//# sourceMappingURL=TaskStatus.js.map","import { TaskStatus } from '../Types/TaskStatus';\n/**\n * 创建默认的运行时状态\n */\nexport function createDefaultRuntimeState() {\n return {\n status: TaskStatus.Invalid,\n currentChildIndex: 0\n };\n}\n//# sourceMappingURL=BehaviorTreeData.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { createDefaultRuntimeState } from './BehaviorTreeData';\nimport { TaskStatus } from '../Types/TaskStatus';\n/**\n * 行为树运行时组件\n *\n * 挂载到游戏Entity上,引用共享的BehaviorTreeData\n * 维护该Entity独立的运行时状态\n */\nlet BehaviorTreeRuntimeComponent = class BehaviorTreeRuntimeComponent extends Component {\n constructor() {\n super(...arguments);\n /**\n * 引用的行为树资产ID(可序列化)\n */\n this.treeAssetId = '';\n /**\n * 是否自动启动\n */\n this.autoStart = true;\n /**\n * 是否正在运行\n */\n this.isRunning = false;\n /**\n * 节点运行时状态(每个节点独立)\n * 不序列化,每次加载时重新初始化\n */\n this.nodeStates = new Map();\n /**\n * 黑板数据(该Entity独立的数据)\n * 不序列化,通过初始化设置\n */\n this.blackboard = new Map();\n /**\n * 黑板观察者列表\n */\n this.blackboardObservers = new Map();\n /**\n * 当前激活的节点ID列表(用于调试)\n */\n this.activeNodeIds = new Set();\n /**\n * 标记是否需要在下一个tick重置状态\n */\n this.needsReset = false;\n /**\n * 需要中止的节点ID列表\n */\n this.nodesToAbort = new Set();\n }\n /**\n * 获取节点运行时状态\n */\n getNodeState(nodeId) {\n if (!this.nodeStates.has(nodeId)) {\n this.nodeStates.set(nodeId, createDefaultRuntimeState());\n }\n return this.nodeStates.get(nodeId);\n }\n /**\n * 重置节点状态\n */\n resetNodeState(nodeId) {\n const state = this.getNodeState(nodeId);\n state.status = TaskStatus.Invalid;\n state.currentChildIndex = 0;\n delete state.startTime;\n delete state.lastExecutionTime;\n delete state.repeatCount;\n delete state.cachedResult;\n delete state.shuffledIndices;\n delete state.isAborted;\n delete state.lastConditionResult;\n delete state.observedKeys;\n }\n /**\n * 重置所有节点状态\n */\n resetAllStates() {\n this.nodeStates.clear();\n this.activeNodeIds.clear();\n }\n /**\n * 获取黑板值\n */\n getBlackboardValue(key) {\n return this.blackboard.get(key);\n }\n /**\n * 设置黑板值\n */\n setBlackboardValue(key, value) {\n const oldValue = this.blackboard.get(key);\n this.blackboard.set(key, value);\n if (oldValue !== value) {\n this.notifyBlackboardChange(key, value, oldValue);\n }\n }\n /**\n * 检查黑板是否有某个键\n */\n hasBlackboardKey(key) {\n return this.blackboard.has(key);\n }\n /**\n * 初始化黑板(从树定义的默认值)\n */\n initializeBlackboard(variables) {\n if (variables) {\n variables.forEach((value, key) => {\n if (!this.blackboard.has(key)) {\n this.blackboard.set(key, value);\n }\n });\n }\n }\n /**\n * 清空黑板\n */\n clearBlackboard() {\n this.blackboard.clear();\n }\n /**\n * 启动行为树\n */\n start() {\n this.isRunning = true;\n this.resetAllStates();\n }\n /**\n * 停止行为树\n */\n stop() {\n this.isRunning = false;\n this.activeNodeIds.clear();\n }\n /**\n * 暂停行为树\n */\n pause() {\n this.isRunning = false;\n }\n /**\n * 恢复行为树\n */\n resume() {\n this.isRunning = true;\n }\n /**\n * 注册黑板观察者\n */\n observeBlackboard(nodeId, keys, callback) {\n const observer = {\n nodeId,\n keys: new Set(keys),\n callback\n };\n for (const key of keys) {\n if (!this.blackboardObservers.has(key)) {\n this.blackboardObservers.set(key, []);\n }\n this.blackboardObservers.get(key).push(observer);\n }\n }\n /**\n * 取消注册黑板观察者\n */\n unobserveBlackboard(nodeId) {\n for (const observers of this.blackboardObservers.values()) {\n const index = observers.findIndex(o => o.nodeId === nodeId);\n if (index !== -1) {\n observers.splice(index, 1);\n }\n }\n }\n /**\n * 通知黑板变化\n */\n notifyBlackboardChange(key, newValue, oldValue) {\n const observers = this.blackboardObservers.get(key);\n if (!observers)\n return;\n for (const observer of observers) {\n try {\n observer.callback(key, newValue, oldValue);\n }\n catch (error) {\n console.error(`黑板观察者回调错误 (节点: ${observer.nodeId}):`, error);\n }\n }\n }\n /**\n * 请求中止节点\n */\n requestAbort(nodeId) {\n this.nodesToAbort.add(nodeId);\n }\n /**\n * 检查节点是否需要中止\n */\n shouldAbort(nodeId) {\n return this.nodesToAbort.has(nodeId);\n }\n /**\n * 清除中止请求\n */\n clearAbortRequest(nodeId) {\n this.nodesToAbort.delete(nodeId);\n }\n /**\n * 清除所有中止请求\n */\n clearAllAbortRequests() {\n this.nodesToAbort.clear();\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeRuntimeComponent.prototype, \"treeAssetId\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], BehaviorTreeRuntimeComponent.prototype, \"autoStart\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Boolean)\n], BehaviorTreeRuntimeComponent.prototype, \"isRunning\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Map)\n], BehaviorTreeRuntimeComponent.prototype, \"nodeStates\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Map)\n], BehaviorTreeRuntimeComponent.prototype, \"blackboard\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Map)\n], BehaviorTreeRuntimeComponent.prototype, \"blackboardObservers\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Set)\n], BehaviorTreeRuntimeComponent.prototype, \"activeNodeIds\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Boolean)\n], BehaviorTreeRuntimeComponent.prototype, \"needsReset\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Set)\n], BehaviorTreeRuntimeComponent.prototype, \"nodesToAbort\", void 0);\nBehaviorTreeRuntimeComponent = __decorate([\n ECSComponent('BehaviorTreeRuntime'),\n Serializable({ version: 1 })\n], BehaviorTreeRuntimeComponent);\nexport { BehaviorTreeRuntimeComponent };\n//# sourceMappingURL=BehaviorTreeRuntimeComponent.js.map","import { createLogger } from '@esengine/ecs-framework';\nconst logger = createLogger('BehaviorTreeAssetManager');\n/**\n * 行为树资产管理器(服务)\n *\n * 管理所有共享的BehaviorTreeData\n * 多个实例可以引用同一份数据\n *\n * 使用方式:\n * ```typescript\n * // 注册服务\n * Core.services.registerSingleton(BehaviorTreeAssetManager);\n *\n * // 使用服务\n * const assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n * ```\n */\nexport class BehaviorTreeAssetManager {\n constructor() {\n /**\n * 已加载的行为树资产\n */\n this.assets = new Map();\n }\n /**\n * 加载行为树资产\n */\n loadAsset(asset) {\n if (this.assets.has(asset.id)) {\n logger.warn(`行为树资产已存在,将被覆盖: ${asset.id}`);\n }\n this.assets.set(asset.id, asset);\n logger.info(`行为树资产已加载: ${asset.name} (${asset.nodes.size}个节点)`);\n }\n /**\n * 获取行为树资产\n */\n getAsset(assetId) {\n return this.assets.get(assetId);\n }\n /**\n * 检查资产是否存在\n */\n hasAsset(assetId) {\n return this.assets.has(assetId);\n }\n /**\n * 卸载行为树资产\n */\n unloadAsset(assetId) {\n const result = this.assets.delete(assetId);\n if (result) {\n logger.info(`行为树资产已卸载: ${assetId}`);\n }\n return result;\n }\n /**\n * 清空所有资产\n */\n clearAll() {\n this.assets.clear();\n logger.info('所有行为树资产已清空');\n }\n /**\n * 获取已加载资产数量\n */\n getAssetCount() {\n return this.assets.size;\n }\n /**\n * 获取所有资产ID\n */\n getAllAssetIds() {\n return Array.from(this.assets.keys());\n }\n /**\n * 释放资源(实现IService接口)\n */\n dispose() {\n this.clearAll();\n }\n}\n//# sourceMappingURL=BehaviorTreeAssetManager.js.map","/**\n * 绑定辅助工具\n *\n * 处理配置属性的黑板绑定\n */\nexport class BindingHelper {\n /**\n * 获取配置值(考虑黑板绑定)\n *\n * @param context 执行上下文\n * @param configKey 配置键名\n * @param defaultValue 默认值\n * @returns 解析后的值\n */\n static getValue(context, configKey, defaultValue) {\n const { nodeData, runtime } = context;\n if (nodeData.bindings && nodeData.bindings[configKey]) {\n const blackboardKey = nodeData.bindings[configKey];\n const boundValue = runtime.getBlackboardValue(blackboardKey);\n return boundValue !== undefined ? boundValue : defaultValue;\n }\n const configValue = nodeData.config[configKey];\n return configValue !== undefined ? configValue : defaultValue;\n }\n /**\n * 检查配置是否绑定到黑板变量\n */\n static hasBinding(context, configKey) {\n return !!(context.nodeData.bindings && context.nodeData.bindings[configKey]);\n }\n /**\n * 获取绑定的黑板变量名\n */\n static getBindingKey(context, configKey) {\n return context.nodeData.bindings?.[configKey];\n }\n}\n/**\n * 节点执行器注册表\n *\n * 管理所有节点类型的执行器\n */\nexport class NodeExecutorRegistry {\n constructor() {\n this.executors = new Map();\n }\n /**\n * 注册执行器\n *\n * @param implementationType 节点实现类型(对应BehaviorNodeData.implementationType)\n * @param executor 执行器实例\n */\n register(implementationType, executor) {\n if (this.executors.has(implementationType)) {\n console.warn(`执行器已存在,将被覆盖: ${implementationType}`);\n }\n this.executors.set(implementationType, executor);\n }\n /**\n * 获取执行器\n */\n get(implementationType) {\n return this.executors.get(implementationType);\n }\n /**\n * 检查是否有执行器\n */\n has(implementationType) {\n return this.executors.has(implementationType);\n }\n /**\n * 注销执行器\n */\n unregister(implementationType) {\n return this.executors.delete(implementationType);\n }\n /**\n * 清空所有执行器\n */\n clear() {\n this.executors.clear();\n }\n}\n//# sourceMappingURL=NodeExecutor.js.map","/**\n * 节点元数据注册表\n */\nexport class NodeMetadataRegistry {\n static register(target, metadata) {\n this.metadataMap.set(metadata.implementationType, metadata);\n this.executorClassMap.set(target, metadata.implementationType);\n this.executorConstructors.set(metadata.implementationType, target);\n }\n static getMetadata(implementationType) {\n return this.metadataMap.get(implementationType);\n }\n static getAllMetadata() {\n return Array.from(this.metadataMap.values());\n }\n static getByCategory(category) {\n return this.getAllMetadata().filter(m => m.category === category);\n }\n static getByNodeType(nodeType) {\n return this.getAllMetadata().filter(m => m.nodeType === nodeType);\n }\n static getImplementationType(executorClass) {\n return this.executorClassMap.get(executorClass);\n }\n static getExecutorConstructor(implementationType) {\n return this.executorConstructors.get(implementationType);\n }\n static getAllExecutorConstructors() {\n return new Map(this.executorConstructors);\n }\n}\nNodeMetadataRegistry.metadataMap = new Map();\nNodeMetadataRegistry.executorClassMap = new Map();\nNodeMetadataRegistry.executorConstructors = new Map();\n/**\n * 节点执行器元数据装饰器\n */\nexport function NodeExecutorMetadata(metadata) {\n return function (target) {\n NodeMetadataRegistry.register(target, metadata);\n };\n}\n//# sourceMappingURL=NodeMetadata.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 序列节点执行器\n *\n * 按顺序执行子节点,全部成功才成功,任一失败则失败\n */\nlet SequenceExecutor = class SequenceExecutor {\n execute(context) {\n const { nodeData, state } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n while (state.currentChildIndex < nodeData.children.length) {\n const childId = nodeData.children[state.currentChildIndex];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n state.currentChildIndex++;\n }\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n reset(context) {\n context.state.currentChildIndex = 0;\n }\n};\nSequenceExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Sequence',\n nodeType: NodeType.Composite,\n displayName: '序列',\n description: '按顺序执行子节点,全部成功才成功',\n category: 'Composite'\n })\n], SequenceExecutor);\nexport { SequenceExecutor };\n//# sourceMappingURL=SequenceExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 选择器节点执行器\n *\n * 按顺序执行子节点,任一成功则成功,全部失败才失败\n */\nlet SelectorExecutor = class SelectorExecutor {\n execute(context) {\n const { nodeData, state } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n while (state.currentChildIndex < nodeData.children.length) {\n const childId = nodeData.children[state.currentChildIndex];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Success) {\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n state.currentChildIndex++;\n }\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n reset(context) {\n context.state.currentChildIndex = 0;\n }\n};\nSelectorExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Selector',\n nodeType: NodeType.Composite,\n displayName: '选择器',\n description: '按顺序执行子节点,任一成功则成功',\n category: 'Composite'\n })\n], SelectorExecutor);\nexport { SelectorExecutor };\n//# sourceMappingURL=SelectorExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 并行节点执行器\n *\n * 同时执行所有子节点\n */\nlet ParallelExecutor = class ParallelExecutor {\n execute(context) {\n const { nodeData } = context;\n const successPolicy = BindingHelper.getValue(context, 'successPolicy', 'all');\n const failurePolicy = BindingHelper.getValue(context, 'failurePolicy', 'one');\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n let hasRunning = false;\n let successCount = 0;\n let failureCount = 0;\n for (const childId of nodeData.children) {\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n hasRunning = true;\n }\n else if (status === TaskStatus.Success) {\n successCount++;\n }\n else if (status === TaskStatus.Failure) {\n failureCount++;\n }\n }\n if (successPolicy === 'one' && successCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Success;\n }\n if (successPolicy === 'all' && successCount === nodeData.children.length) {\n return TaskStatus.Success;\n }\n if (failurePolicy === 'one' && failureCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Failure;\n }\n if (failurePolicy === 'all' && failureCount === nodeData.children.length) {\n return TaskStatus.Failure;\n }\n return hasRunning ? TaskStatus.Running : TaskStatus.Success;\n }\n stopAllChildren(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children)\n return;\n for (const childId of nodeData.children) {\n runtime.activeNodeIds.delete(childId);\n runtime.resetNodeState(childId);\n }\n }\n reset(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children)\n return;\n for (const childId of nodeData.children) {\n runtime.resetNodeState(childId);\n }\n }\n};\nParallelExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Parallel',\n nodeType: NodeType.Composite,\n displayName: '并行',\n description: '同时执行所有子节点',\n category: 'Composite',\n configSchema: {\n successPolicy: {\n type: 'string',\n default: 'all',\n description: '成功策略',\n options: ['all', 'one']\n },\n failurePolicy: {\n type: 'string',\n default: 'one',\n description: '失败策略',\n options: ['all', 'one']\n }\n }\n })\n], ParallelExecutor);\nexport { ParallelExecutor };\n//# sourceMappingURL=ParallelExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 并行选择器执行器\n *\n * 并行执行子节点,任一成功则成功\n */\nlet ParallelSelectorExecutor = class ParallelSelectorExecutor {\n execute(context) {\n const { nodeData } = context;\n const failurePolicy = BindingHelper.getValue(context, 'failurePolicy', 'all');\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n let hasRunning = false;\n let successCount = 0;\n let failureCount = 0;\n for (const childId of nodeData.children) {\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n hasRunning = true;\n }\n else if (status === TaskStatus.Success) {\n successCount++;\n }\n else if (status === TaskStatus.Failure) {\n failureCount++;\n }\n }\n if (successCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Success;\n }\n if (failurePolicy === 'one' && failureCount > 0) {\n this.stopAllChildren(context);\n return TaskStatus.Failure;\n }\n if (failurePolicy === 'all' && failureCount === nodeData.children.length) {\n return TaskStatus.Failure;\n }\n return hasRunning ? TaskStatus.Running : TaskStatus.Failure;\n }\n stopAllChildren(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children)\n return;\n for (const childId of nodeData.children) {\n runtime.activeNodeIds.delete(childId);\n runtime.resetNodeState(childId);\n }\n }\n reset(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children)\n return;\n for (const childId of nodeData.children) {\n runtime.resetNodeState(childId);\n }\n }\n};\nParallelSelectorExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'ParallelSelector',\n nodeType: NodeType.Composite,\n displayName: '并行选择器',\n description: '并行执行子节点,任一成功则成功',\n category: 'Composite',\n configSchema: {\n failurePolicy: {\n type: 'string',\n default: 'all',\n description: '失败策略',\n options: ['all', 'one']\n }\n }\n })\n], ParallelSelectorExecutor);\nexport { ParallelSelectorExecutor };\n//# sourceMappingURL=ParallelSelectorExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 随机序列执行器\n *\n * 随机顺序执行子节点序列,全部成功才成功\n */\nlet RandomSequenceExecutor = class RandomSequenceExecutor {\n execute(context) {\n const { nodeData, state } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n if (!state.shuffledIndices || state.shuffledIndices.length === 0) {\n state.shuffledIndices = this.shuffleIndices(nodeData.children.length);\n }\n while (state.currentChildIndex < state.shuffledIndices.length) {\n const shuffledIndex = state.shuffledIndices[state.currentChildIndex];\n const childId = nodeData.children[shuffledIndex];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Failure;\n }\n state.currentChildIndex++;\n }\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Success;\n }\n shuffleIndices(length) {\n const indices = Array.from({ length }, (_, i) => i);\n for (let i = indices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = indices[i];\n indices[i] = indices[j];\n indices[j] = temp;\n }\n return indices;\n }\n reset(context) {\n context.state.currentChildIndex = 0;\n delete context.state.shuffledIndices;\n }\n};\nRandomSequenceExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'RandomSequence',\n nodeType: NodeType.Composite,\n displayName: '随机序列',\n description: '随机顺序执行子节点,全部成功才成功',\n category: 'Composite'\n })\n], RandomSequenceExecutor);\nexport { RandomSequenceExecutor };\n//# sourceMappingURL=RandomSequenceExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 随机选择器执行器\n *\n * 随机顺序执行子节点,任一成功则成功\n */\nlet RandomSelectorExecutor = class RandomSelectorExecutor {\n execute(context) {\n const { nodeData, state } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n if (!state.shuffledIndices || state.shuffledIndices.length === 0) {\n state.shuffledIndices = this.shuffleIndices(nodeData.children.length);\n }\n while (state.currentChildIndex < state.shuffledIndices.length) {\n const shuffledIndex = state.shuffledIndices[state.currentChildIndex];\n const childId = nodeData.children[shuffledIndex];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Success) {\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Success;\n }\n state.currentChildIndex++;\n }\n state.currentChildIndex = 0;\n delete state.shuffledIndices;\n return TaskStatus.Failure;\n }\n shuffleIndices(length) {\n const indices = Array.from({ length }, (_, i) => i);\n for (let i = indices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = indices[i];\n indices[i] = indices[j];\n indices[j] = temp;\n }\n return indices;\n }\n reset(context) {\n context.state.currentChildIndex = 0;\n delete context.state.shuffledIndices;\n }\n};\nRandomSelectorExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'RandomSelector',\n nodeType: NodeType.Composite,\n displayName: '随机选择器',\n description: '随机顺序执行子节点,任一成功则成功',\n category: 'Composite'\n })\n], RandomSelectorExecutor);\nexport { RandomSelectorExecutor };\n//# sourceMappingURL=RandomSelectorExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 反转装饰器执行器\n *\n * 反转子节点的执行结果\n */\nlet InverterExecutor = class InverterExecutor {\n execute(context) {\n const { nodeData } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Success) {\n return TaskStatus.Failure;\n }\n if (status === TaskStatus.Failure) {\n return TaskStatus.Success;\n }\n return TaskStatus.Failure;\n }\n reset(context) {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nInverterExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Inverter',\n nodeType: NodeType.Decorator,\n displayName: '反转',\n description: '反转子节点的执行结果',\n category: 'Decorator'\n })\n], InverterExecutor);\nexport { InverterExecutor };\n//# sourceMappingURL=InverterExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 重复装饰器执行器\n *\n * 重复执行子节点指定次数\n */\nlet RepeaterExecutor = class RepeaterExecutor {\n execute(context) {\n const { nodeData, state, runtime } = context;\n const repeatCount = BindingHelper.getValue(context, 'repeatCount', 1);\n const endOnFailure = BindingHelper.getValue(context, 'endOnFailure', false);\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n const childId = nodeData.children[0];\n if (!state.repeatCount) {\n state.repeatCount = 0;\n }\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Failure && endOnFailure) {\n state.repeatCount = 0;\n return TaskStatus.Failure;\n }\n state.repeatCount++;\n runtime.resetNodeState(childId);\n const shouldContinue = (repeatCount === -1) || (state.repeatCount < repeatCount);\n if (shouldContinue) {\n return TaskStatus.Running;\n }\n else {\n state.repeatCount = 0;\n return TaskStatus.Success;\n }\n }\n reset(context) {\n delete context.state.repeatCount;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nRepeaterExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Repeater',\n nodeType: NodeType.Decorator,\n displayName: '重复',\n description: '重复执行子节点指定次数',\n category: 'Decorator',\n configSchema: {\n repeatCount: {\n type: 'number',\n default: 1,\n description: '重复次数(-1表示无限循环)',\n supportBinding: true\n },\n endOnFailure: {\n type: 'boolean',\n default: false,\n description: '子节点失败时是否结束'\n }\n }\n })\n], RepeaterExecutor);\nexport { RepeaterExecutor };\n//# sourceMappingURL=RepeaterExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 总是成功装饰器执行器\n *\n * 无论子节点结果如何都返回成功\n */\nlet AlwaysSucceedExecutor = class AlwaysSucceedExecutor {\n execute(context) {\n const { nodeData } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n return TaskStatus.Success;\n }\n reset(context) {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nAlwaysSucceedExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'AlwaysSucceed',\n nodeType: NodeType.Decorator,\n displayName: '总是成功',\n description: '无论子节点结果如何都返回成功',\n category: 'Decorator'\n })\n], AlwaysSucceedExecutor);\nexport { AlwaysSucceedExecutor };\n//# sourceMappingURL=AlwaysSucceedExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 总是失败装饰器执行器\n *\n * 无论子节点结果如何都返回失败\n */\nlet AlwaysFailExecutor = class AlwaysFailExecutor {\n execute(context) {\n const { nodeData } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n return TaskStatus.Failure;\n }\n reset(context) {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nAlwaysFailExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'AlwaysFail',\n nodeType: NodeType.Decorator,\n displayName: '总是失败',\n description: '无论子节点结果如何都返回失败',\n category: 'Decorator'\n })\n], AlwaysFailExecutor);\nexport { AlwaysFailExecutor };\n//# sourceMappingURL=AlwaysFailExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 直到成功装饰器执行器\n *\n * 重复执行子节点直到成功\n */\nlet UntilSuccessExecutor = class UntilSuccessExecutor {\n execute(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Success) {\n return TaskStatus.Success;\n }\n runtime.resetNodeState(childId);\n return TaskStatus.Running;\n }\n reset(context) {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nUntilSuccessExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'UntilSuccess',\n nodeType: NodeType.Decorator,\n displayName: '直到成功',\n description: '重复执行子节点直到成功',\n category: 'Decorator'\n })\n], UntilSuccessExecutor);\nexport { UntilSuccessExecutor };\n//# sourceMappingURL=UntilSuccessExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 直到失败装饰器执行器\n *\n * 重复执行子节点直到失败\n */\nlet UntilFailExecutor = class UntilFailExecutor {\n execute(context) {\n const { nodeData, runtime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Failure) {\n return TaskStatus.Failure;\n }\n runtime.resetNodeState(childId);\n return TaskStatus.Running;\n }\n reset(context) {\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nUntilFailExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'UntilFail',\n nodeType: NodeType.Decorator,\n displayName: '直到失败',\n description: '重复执行子节点直到失败',\n category: 'Decorator'\n })\n], UntilFailExecutor);\nexport { UntilFailExecutor };\n//# sourceMappingURL=UntilFailExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType, AbortType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 条件装饰器执行器\n *\n * 根据条件决定是否执行子节点\n * 支持动态优先级和中止机制\n */\nlet ConditionalExecutor = class ConditionalExecutor {\n execute(context) {\n const { nodeData, runtime, state } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const blackboardKey = BindingHelper.getValue(context, 'blackboardKey', '');\n const expectedValue = BindingHelper.getValue(context, 'expectedValue');\n const operator = BindingHelper.getValue(context, 'operator', 'equals');\n const abortType = (nodeData.abortType || AbortType.None);\n if (!blackboardKey) {\n return TaskStatus.Failure;\n }\n const actualValue = runtime.getBlackboardValue(blackboardKey);\n const conditionMet = this.evaluateCondition(actualValue, expectedValue, operator);\n const wasRunning = state.status === TaskStatus.Running;\n if (abortType !== AbortType.None) {\n if (!state.observedKeys || state.observedKeys.length === 0) {\n state.observedKeys = [blackboardKey];\n this.setupObserver(context, blackboardKey, expectedValue, operator, abortType);\n }\n if (state.lastConditionResult !== undefined && state.lastConditionResult !== conditionMet) {\n if (conditionMet) {\n this.handleConditionBecameTrue(context, abortType);\n }\n else if (wasRunning) {\n this.handleConditionBecameFalse(context, abortType);\n }\n }\n }\n state.lastConditionResult = conditionMet;\n if (!conditionMet) {\n return TaskStatus.Failure;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n return status;\n }\n evaluateCondition(actualValue, expectedValue, operator) {\n switch (operator) {\n case 'equals':\n return actualValue === expectedValue;\n case 'notEquals':\n return actualValue !== expectedValue;\n case 'greaterThan':\n return actualValue > expectedValue;\n case 'lessThan':\n return actualValue < expectedValue;\n case 'greaterOrEqual':\n return actualValue >= expectedValue;\n case 'lessOrEqual':\n return actualValue <= expectedValue;\n default:\n return false;\n }\n }\n /**\n * 设置黑板观察者\n */\n setupObserver(context, blackboardKey, expectedValue, operator, abortType) {\n const { nodeData, runtime } = context;\n runtime.observeBlackboard(nodeData.id, [blackboardKey], (_key, newValue) => {\n const conditionMet = this.evaluateCondition(newValue, expectedValue, operator);\n const lastResult = context.state.lastConditionResult;\n if (lastResult !== undefined && lastResult !== conditionMet) {\n if (conditionMet) {\n this.handleConditionBecameTrue(context, abortType);\n }\n else {\n this.handleConditionBecameFalse(context, abortType);\n }\n }\n context.state.lastConditionResult = conditionMet;\n });\n }\n /**\n * 处理条件变为true\n */\n handleConditionBecameTrue(context, abortType) {\n if (abortType === AbortType.LowerPriority || abortType === AbortType.Both) {\n this.requestAbortLowerPriority(context);\n }\n }\n /**\n * 处理条件变为false\n */\n handleConditionBecameFalse(context, abortType) {\n const { nodeData, runtime } = context;\n if (abortType === AbortType.Self || abortType === AbortType.Both) {\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.requestAbort(nodeData.children[0]);\n }\n }\n }\n /**\n * 请求中止低优先级节点\n */\n requestAbortLowerPriority(context) {\n const { runtime } = context;\n runtime.requestAbort('__lower_priority__');\n }\n reset(context) {\n const { nodeData, runtime, state } = context;\n if (state.observedKeys && state.observedKeys.length > 0) {\n runtime.unobserveBlackboard(nodeData.id);\n delete state.observedKeys;\n }\n delete state.lastConditionResult;\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.resetNodeState(nodeData.children[0]);\n }\n }\n};\nConditionalExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Conditional',\n nodeType: NodeType.Decorator,\n displayName: '条件',\n description: '根据条件决定是否执行子节点',\n category: 'Decorator',\n configSchema: {\n blackboardKey: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n expectedValue: {\n type: 'object',\n description: '期望值',\n supportBinding: true\n },\n operator: {\n type: 'string',\n default: 'equals',\n description: '比较运算符',\n options: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterOrEqual', 'lessOrEqual']\n },\n abortType: {\n type: 'string',\n default: 'none',\n description: '中止类型',\n options: ['none', 'self', 'lower-priority', 'both']\n }\n }\n })\n], ConditionalExecutor);\nexport { ConditionalExecutor };\n//# sourceMappingURL=ConditionalExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 冷却装饰器执行器\n *\n * 子节点执行成功后进入冷却时间\n */\nlet CooldownExecutor = class CooldownExecutor {\n execute(context) {\n const { nodeData, state, totalTime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const cooldownTime = BindingHelper.getValue(context, 'cooldownTime', 1.0);\n if (state.lastExecutionTime !== undefined) {\n const timeSinceLastExecution = totalTime - state.lastExecutionTime;\n if (timeSinceLastExecution < cooldownTime) {\n return TaskStatus.Failure;\n }\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (status === TaskStatus.Success) {\n state.lastExecutionTime = totalTime;\n return TaskStatus.Success;\n }\n return TaskStatus.Failure;\n }\n reset(context) {\n delete context.state.lastExecutionTime;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nCooldownExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Cooldown',\n nodeType: NodeType.Decorator,\n displayName: '冷却',\n description: '子节点执行成功后进入冷却时间',\n category: 'Decorator',\n configSchema: {\n cooldownTime: {\n type: 'number',\n default: 1.0,\n description: '冷却时间(秒)',\n min: 0,\n supportBinding: true\n }\n }\n })\n], CooldownExecutor);\nexport { CooldownExecutor };\n//# sourceMappingURL=CooldownExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 超时装饰器执行器\n *\n * 限制子节点的执行时间\n */\nlet TimeoutExecutor = class TimeoutExecutor {\n execute(context) {\n const { nodeData, state, totalTime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const timeout = BindingHelper.getValue(context, 'timeout', 1.0);\n if (state.startTime === undefined) {\n state.startTime = totalTime;\n }\n const elapsedTime = totalTime - state.startTime;\n if (elapsedTime >= timeout) {\n delete state.startTime;\n return TaskStatus.Failure;\n }\n const childId = nodeData.children[0];\n const status = context.executeChild(childId);\n if (status === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n delete state.startTime;\n return status;\n }\n reset(context) {\n delete context.state.startTime;\n if (context.nodeData.children && context.nodeData.children.length > 0) {\n context.runtime.resetNodeState(context.nodeData.children[0]);\n }\n }\n};\nTimeoutExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Timeout',\n nodeType: NodeType.Decorator,\n displayName: '超时',\n description: '限制子节点的执行时间',\n category: 'Decorator',\n configSchema: {\n timeout: {\n type: 'number',\n default: 1.0,\n description: '超时时间(秒)',\n min: 0,\n supportBinding: true\n }\n }\n })\n], TimeoutExecutor);\nexport { TimeoutExecutor };\n//# sourceMappingURL=TimeoutExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * Service注册表\n */\nclass ServiceRegistry {\n static register(name, service) {\n this.services.set(name, service);\n }\n static get(name) {\n return this.services.get(name);\n }\n static has(name) {\n return this.services.has(name);\n }\n static unregister(name) {\n return this.services.delete(name);\n }\n}\nServiceRegistry.services = new Map();\n/**\n * Service装饰器执行器\n *\n * 在子节点执行期间持续运行后台逻辑\n */\nlet ServiceDecorator = class ServiceDecorator {\n execute(context) {\n const { nodeData, state, totalTime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Failure;\n }\n const serviceName = BindingHelper.getValue(context, 'serviceName', '');\n const tickInterval = BindingHelper.getValue(context, 'tickInterval', 0);\n if (!serviceName) {\n return TaskStatus.Failure;\n }\n const service = ServiceRegistry.get(serviceName);\n if (!service) {\n console.warn(`未找到Service: ${serviceName}`);\n return TaskStatus.Failure;\n }\n if (state.status !== TaskStatus.Running) {\n state.startTime = totalTime;\n state.lastExecutionTime = totalTime;\n if (service.onServiceStart) {\n service.onServiceStart(context);\n }\n }\n const shouldTick = tickInterval === 0 ||\n (state.lastExecutionTime !== undefined &&\n (totalTime - state.lastExecutionTime) >= tickInterval);\n if (shouldTick) {\n service.onServiceTick(context);\n state.lastExecutionTime = totalTime;\n }\n const childId = nodeData.children[0];\n const childStatus = context.executeChild(childId);\n if (childStatus !== TaskStatus.Running) {\n if (service.onServiceEnd) {\n service.onServiceEnd(context);\n }\n }\n return childStatus;\n }\n reset(context) {\n const { nodeData, runtime, state } = context;\n const serviceName = BindingHelper.getValue(context, 'serviceName', '');\n if (serviceName) {\n const service = ServiceRegistry.get(serviceName);\n if (service && service.onServiceEnd) {\n service.onServiceEnd(context);\n }\n }\n delete state.startTime;\n delete state.lastExecutionTime;\n if (nodeData.children && nodeData.children.length > 0) {\n runtime.resetNodeState(nodeData.children[0]);\n }\n }\n};\nServiceDecorator = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Service',\n nodeType: NodeType.Decorator,\n displayName: 'Service',\n description: '在子节点执行期间持续运行后台逻辑',\n category: 'Decorator',\n configSchema: {\n serviceName: {\n type: 'string',\n default: '',\n description: 'Service名称'\n },\n tickInterval: {\n type: 'number',\n default: 0,\n description: 'Service更新间隔(秒,0表示每帧更新)',\n supportBinding: true\n }\n }\n })\n], ServiceDecorator);\nexport { ServiceDecorator };\nexport { ServiceRegistry };\n//# sourceMappingURL=ServiceDecorator.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 等待动作执行器\n *\n * 等待指定时间后返回成功\n */\nlet WaitAction = class WaitAction {\n execute(context) {\n const { state, totalTime } = context;\n const duration = BindingHelper.getValue(context, 'duration', 1.0);\n if (!state.startTime) {\n state.startTime = totalTime;\n return TaskStatus.Running;\n }\n if (totalTime - state.startTime >= duration) {\n return TaskStatus.Success;\n }\n return TaskStatus.Running;\n }\n reset(context) {\n delete context.state.startTime;\n }\n};\nWaitAction = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Wait',\n nodeType: NodeType.Action,\n displayName: '等待',\n description: '等待指定时间后返回成功',\n category: 'Action',\n configSchema: {\n duration: {\n type: 'number',\n default: 1.0,\n description: '等待时长(秒)',\n min: 0,\n supportBinding: true\n }\n }\n })\n], WaitAction);\nexport { WaitAction };\n//# sourceMappingURL=WaitAction.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 日志动作执行器\n *\n * 输出日志信息\n */\nlet LogAction = class LogAction {\n execute(context) {\n const { runtime } = context;\n const message = BindingHelper.getValue(context, 'message', '');\n const logLevel = BindingHelper.getValue(context, 'logLevel', 'info');\n const finalMessage = this.replaceBlackboardVariables(message, runtime);\n this.log(finalMessage, logLevel);\n return TaskStatus.Success;\n }\n replaceBlackboardVariables(message, runtime) {\n if (!message.includes('{') || !message.includes('}')) {\n return message;\n }\n // 使用限制长度的正则表达式避免 ReDoS 攻击\n // 限制占位符名称最多100个字符,只允许字母、数字、下划线和点号\n return message.replace(/\\{([\\w.]{1,100})\\}/g, (_, key) => {\n const value = runtime.getBlackboardValue(key.trim());\n return value !== undefined ? String(value) : `{${key}}`;\n });\n }\n log(message, level) {\n switch (level) {\n case 'error':\n console.error(message);\n break;\n case 'warn':\n console.warn(message);\n break;\n case 'info':\n default:\n console.log(message);\n break;\n }\n }\n};\nLogAction = __decorate([\n NodeExecutorMetadata({\n implementationType: 'Log',\n nodeType: NodeType.Action,\n displayName: '日志',\n description: '输出日志信息',\n category: 'Action',\n configSchema: {\n message: {\n type: 'string',\n default: '',\n description: '日志消息,支持{key}占位符引用黑板变量',\n supportBinding: true\n },\n logLevel: {\n type: 'string',\n default: 'info',\n description: '日志级别',\n options: ['info', 'warn', 'error']\n }\n }\n })\n], LogAction);\nexport { LogAction };\n//# sourceMappingURL=LogAction.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 设置黑板值动作执行器\n *\n * 设置黑板中的变量值\n */\nlet SetBlackboardValue = class SetBlackboardValue {\n execute(context) {\n const { runtime } = context;\n const key = BindingHelper.getValue(context, 'key', '');\n const value = BindingHelper.getValue(context, 'value');\n if (!key) {\n return TaskStatus.Failure;\n }\n runtime.setBlackboardValue(key, value);\n return TaskStatus.Success;\n }\n};\nSetBlackboardValue = __decorate([\n NodeExecutorMetadata({\n implementationType: 'SetBlackboardValue',\n nodeType: NodeType.Action,\n displayName: '设置黑板值',\n description: '设置黑板中的变量值',\n category: 'Action',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n value: {\n type: 'object',\n description: '要设置的值',\n supportBinding: true\n }\n }\n })\n], SetBlackboardValue);\nexport { SetBlackboardValue };\n//# sourceMappingURL=SetBlackboardValue.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 修改黑板值动作执行器\n *\n * 对黑板中的数值进行运算\n */\nlet ModifyBlackboardValue = class ModifyBlackboardValue {\n execute(context) {\n const { runtime } = context;\n const key = BindingHelper.getValue(context, 'key', '');\n const operation = BindingHelper.getValue(context, 'operation', 'add');\n const value = BindingHelper.getValue(context, 'value', 0);\n if (!key) {\n return TaskStatus.Failure;\n }\n const currentValue = runtime.getBlackboardValue(key) || 0;\n let newValue;\n switch (operation) {\n case 'add':\n newValue = currentValue + value;\n break;\n case 'subtract':\n newValue = currentValue - value;\n break;\n case 'multiply':\n newValue = currentValue * value;\n break;\n case 'divide':\n newValue = value !== 0 ? currentValue / value : currentValue;\n break;\n case 'set':\n newValue = value;\n break;\n default:\n return TaskStatus.Failure;\n }\n runtime.setBlackboardValue(key, newValue);\n return TaskStatus.Success;\n }\n};\nModifyBlackboardValue = __decorate([\n NodeExecutorMetadata({\n implementationType: 'ModifyBlackboardValue',\n nodeType: NodeType.Action,\n displayName: '修改黑板值',\n description: '对黑板中的数值进行运算',\n category: 'Action',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n operation: {\n type: 'string',\n default: 'add',\n description: '运算类型',\n options: ['add', 'subtract', 'multiply', 'divide', 'set']\n },\n value: {\n type: 'number',\n default: 0,\n description: '操作数',\n supportBinding: true\n }\n }\n })\n], ModifyBlackboardValue);\nexport { ModifyBlackboardValue };\n//# sourceMappingURL=ModifyBlackboardValue.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 执行动作执行器\n *\n * 执行自定义动作逻辑\n */\nlet ExecuteAction = class ExecuteAction {\n execute(context) {\n const { runtime, entity } = context;\n const actionName = BindingHelper.getValue(context, 'actionName', '');\n if (!actionName) {\n return TaskStatus.Failure;\n }\n const actionFunction = runtime.getBlackboardValue(`action_${actionName}`);\n if (!actionFunction || typeof actionFunction !== 'function') {\n return TaskStatus.Failure;\n }\n try {\n return actionFunction(entity);\n }\n catch (error) {\n console.error(`ExecuteAction failed: ${error}`);\n return TaskStatus.Failure;\n }\n }\n};\nExecuteAction = __decorate([\n NodeExecutorMetadata({\n implementationType: 'ExecuteAction',\n nodeType: NodeType.Action,\n displayName: '执行动作',\n description: '执行自定义动作逻辑',\n category: 'Action',\n configSchema: {\n actionName: {\n type: 'string',\n default: '',\n description: '动作名称(黑板中action_前缀的函数)'\n }\n }\n })\n], ExecuteAction);\nexport { ExecuteAction };\n//# sourceMappingURL=ExecuteAction.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\nimport { BehaviorTreeAssetManager } from '../BehaviorTreeAssetManager';\nimport { Core } from '@esengine/ecs-framework';\n/**\n * SubTree执行器\n *\n * 引用并执行其他行为树,实现模块化和复用\n */\nlet SubTreeExecutor = class SubTreeExecutor {\n constructor() {\n this.assetManager = null;\n }\n getAssetManager() {\n if (!this.assetManager) {\n this.assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n }\n return this.assetManager;\n }\n execute(context) {\n const { runtime, state, entity } = context;\n const treeAssetId = BindingHelper.getValue(context, 'treeAssetId', '');\n const shareBlackboard = BindingHelper.getValue(context, 'shareBlackboard', true);\n if (!treeAssetId) {\n return TaskStatus.Failure;\n }\n const assetManager = this.getAssetManager();\n const subTreeData = assetManager.getAsset(treeAssetId);\n if (!subTreeData) {\n console.warn(`未找到子树资产: ${treeAssetId}`);\n return TaskStatus.Failure;\n }\n const rootNode = subTreeData.nodes.get(subTreeData.rootNodeId);\n if (!rootNode) {\n console.warn(`子树根节点未找到: ${subTreeData.rootNodeId}`);\n return TaskStatus.Failure;\n }\n if (!shareBlackboard && state.status !== TaskStatus.Running) {\n if (subTreeData.blackboardVariables) {\n for (const [key, value] of subTreeData.blackboardVariables.entries()) {\n if (!runtime.hasBlackboardKey(key)) {\n runtime.setBlackboardValue(key, value);\n }\n }\n }\n }\n const subTreeContext = {\n entity,\n nodeData: rootNode,\n state: runtime.getNodeState(rootNode.id),\n runtime,\n treeData: subTreeData,\n deltaTime: context.deltaTime,\n totalTime: context.totalTime,\n executeChild: (childId) => {\n const childData = subTreeData.nodes.get(childId);\n if (!childData) {\n console.warn(`子树节点未找到: ${childId}`);\n return TaskStatus.Failure;\n }\n const childContext = {\n entity,\n nodeData: childData,\n state: runtime.getNodeState(childId),\n runtime,\n treeData: subTreeData,\n deltaTime: context.deltaTime,\n totalTime: context.totalTime,\n executeChild: subTreeContext.executeChild\n };\n return this.executeSubTreeNode(childContext);\n }\n };\n return this.executeSubTreeNode(subTreeContext);\n }\n executeSubTreeNode(context) {\n const { nodeData, runtime } = context;\n const state = runtime.getNodeState(nodeData.id);\n if (!nodeData.children || nodeData.children.length === 0) {\n return TaskStatus.Success;\n }\n const childId = nodeData.children[state.currentChildIndex];\n const childStatus = context.executeChild(childId);\n if (childStatus === TaskStatus.Running) {\n return TaskStatus.Running;\n }\n if (childStatus === TaskStatus.Failure) {\n state.currentChildIndex = 0;\n return TaskStatus.Failure;\n }\n state.currentChildIndex++;\n if (state.currentChildIndex >= nodeData.children.length) {\n state.currentChildIndex = 0;\n return TaskStatus.Success;\n }\n return TaskStatus.Running;\n }\n reset(context) {\n const treeAssetId = BindingHelper.getValue(context, 'treeAssetId', '');\n if (treeAssetId) {\n const assetManager = this.getAssetManager();\n const subTreeData = assetManager.getAsset(treeAssetId);\n if (subTreeData) {\n const rootNode = subTreeData.nodes.get(subTreeData.rootNodeId);\n if (rootNode) {\n context.runtime.resetNodeState(rootNode.id);\n if (rootNode.children) {\n for (const childId of rootNode.children) {\n context.runtime.resetNodeState(childId);\n }\n }\n }\n }\n }\n }\n};\nSubTreeExecutor = __decorate([\n NodeExecutorMetadata({\n implementationType: 'SubTree',\n nodeType: NodeType.Action,\n displayName: '子树',\n description: '引用并执行其他行为树',\n category: 'Special',\n configSchema: {\n treeAssetId: {\n type: 'string',\n default: '',\n description: '要执行的行为树资产ID',\n supportBinding: true\n },\n shareBlackboard: {\n type: 'boolean',\n default: true,\n description: '是否共享黑板数据'\n }\n }\n })\n], SubTreeExecutor);\nexport { SubTreeExecutor };\n//# sourceMappingURL=SubTreeExecutor.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 黑板比较条件执行器\n *\n * 比较黑板中的值\n */\nlet BlackboardCompare = class BlackboardCompare {\n execute(context) {\n const { runtime } = context;\n const key = BindingHelper.getValue(context, 'key', '');\n const compareValue = BindingHelper.getValue(context, 'compareValue');\n const operator = BindingHelper.getValue(context, 'operator', 'equals');\n if (!key) {\n return TaskStatus.Failure;\n }\n const actualValue = runtime.getBlackboardValue(key);\n if (this.compare(actualValue, compareValue, operator)) {\n return TaskStatus.Success;\n }\n return TaskStatus.Failure;\n }\n compare(actualValue, compareValue, operator) {\n switch (operator) {\n case 'equals':\n return actualValue === compareValue;\n case 'notEquals':\n return actualValue !== compareValue;\n case 'greaterThan':\n return actualValue > compareValue;\n case 'lessThan':\n return actualValue < compareValue;\n case 'greaterOrEqual':\n return actualValue >= compareValue;\n case 'lessOrEqual':\n return actualValue <= compareValue;\n default:\n return false;\n }\n }\n};\nBlackboardCompare = __decorate([\n NodeExecutorMetadata({\n implementationType: 'BlackboardCompare',\n nodeType: NodeType.Condition,\n displayName: '黑板比较',\n description: '比较黑板中的值',\n category: 'Condition',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n compareValue: {\n type: 'object',\n description: '比较值',\n supportBinding: true\n },\n operator: {\n type: 'string',\n default: 'equals',\n description: '比较运算符',\n options: ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterOrEqual', 'lessOrEqual']\n }\n }\n })\n], BlackboardCompare);\nexport { BlackboardCompare };\n//# sourceMappingURL=BlackboardCompare.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 黑板存在检查条件执行器\n *\n * 检查黑板中是否存在指定的键\n */\nlet BlackboardExists = class BlackboardExists {\n execute(context) {\n const { runtime } = context;\n const key = BindingHelper.getValue(context, 'key', '');\n const checkNull = BindingHelper.getValue(context, 'checkNull', false);\n if (!key) {\n return TaskStatus.Failure;\n }\n const value = runtime.getBlackboardValue(key);\n if (value === undefined) {\n return TaskStatus.Failure;\n }\n if (checkNull && value === null) {\n return TaskStatus.Failure;\n }\n return TaskStatus.Success;\n }\n};\nBlackboardExists = __decorate([\n NodeExecutorMetadata({\n implementationType: 'BlackboardExists',\n nodeType: NodeType.Condition,\n displayName: '黑板存在',\n description: '检查黑板中是否存在指定的键',\n category: 'Condition',\n configSchema: {\n key: {\n type: 'string',\n default: '',\n description: '黑板变量名'\n },\n checkNull: {\n type: 'boolean',\n default: false,\n description: '检查是否为null'\n }\n }\n })\n], BlackboardExists);\nexport { BlackboardExists };\n//# sourceMappingURL=BlackboardExists.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 随机概率条件执行器\n *\n * 根据概率返回成功或失败\n */\nlet RandomProbability = class RandomProbability {\n execute(context) {\n const probability = BindingHelper.getValue(context, 'probability', 0.5);\n const clampedProbability = Math.max(0, Math.min(1, probability));\n if (Math.random() < clampedProbability) {\n return TaskStatus.Success;\n }\n return TaskStatus.Failure;\n }\n};\nRandomProbability = __decorate([\n NodeExecutorMetadata({\n implementationType: 'RandomProbability',\n nodeType: NodeType.Condition,\n displayName: '随机概率',\n description: '根据概率返回成功或失败',\n category: 'Condition',\n configSchema: {\n probability: {\n type: 'number',\n default: 0.5,\n description: '成功概率(0-1)',\n min: 0,\n max: 1,\n supportBinding: true\n }\n }\n })\n], RandomProbability);\nexport { RandomProbability };\n//# sourceMappingURL=RandomProbability.js.map","import { __decorate } from \"tslib\";\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BindingHelper } from '../NodeExecutor';\nimport { NodeExecutorMetadata } from '../NodeMetadata';\n/**\n * 执行条件执行器\n *\n * 执行自定义条件逻辑\n */\nlet ExecuteCondition = class ExecuteCondition {\n execute(context) {\n const { runtime, entity } = context;\n const conditionName = BindingHelper.getValue(context, 'conditionName', '');\n if (!conditionName) {\n return TaskStatus.Failure;\n }\n const conditionFunction = runtime.getBlackboardValue(`condition_${conditionName}`);\n if (!conditionFunction || typeof conditionFunction !== 'function') {\n return TaskStatus.Failure;\n }\n try {\n return conditionFunction(entity) ? TaskStatus.Success : TaskStatus.Failure;\n }\n catch (error) {\n console.error(`ExecuteCondition failed: ${error}`);\n return TaskStatus.Failure;\n }\n }\n};\nExecuteCondition = __decorate([\n NodeExecutorMetadata({\n implementationType: 'ExecuteCondition',\n nodeType: NodeType.Condition,\n displayName: '执行条件',\n description: '执行自定义条件逻辑',\n category: 'Condition',\n configSchema: {\n conditionName: {\n type: 'string',\n default: '',\n description: '条件名称(黑板中condition_前缀的函数)'\n }\n }\n })\n], ExecuteCondition);\nexport { ExecuteCondition };\n//# sourceMappingURL=ExecuteCondition.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { EntitySystem, Matcher, Time, Core, ECSSystem } from '@esengine/ecs-framework';\nimport { BehaviorTreeRuntimeComponent } from './BehaviorTreeRuntimeComponent';\nimport { BehaviorTreeAssetManager } from './BehaviorTreeAssetManager';\nimport { NodeExecutorRegistry } from './NodeExecutor';\nimport { TaskStatus } from '../Types/TaskStatus';\nimport { NodeMetadataRegistry } from './NodeMetadata';\nimport './Executors';\n/**\n * 行为树执行系统\n *\n * 统一处理所有行为树的执行\n */\nlet BehaviorTreeExecutionSystem = class BehaviorTreeExecutionSystem extends EntitySystem {\n constructor() {\n super(Matcher.empty().all(BehaviorTreeRuntimeComponent));\n this.assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n this.executorRegistry = new NodeExecutorRegistry();\n this.registerBuiltInExecutors();\n }\n /**\n * 注册所有执行器(包括内置和插件提供的)\n */\n registerBuiltInExecutors() {\n const constructors = NodeMetadataRegistry.getAllExecutorConstructors();\n for (const [implementationType, ExecutorClass] of constructors) {\n try {\n const instance = new ExecutorClass();\n this.executorRegistry.register(implementationType, instance);\n }\n catch (error) {\n this.logger.error(`注册执行器失败: ${implementationType}`, error);\n }\n }\n }\n /**\n * 获取执行器注册表\n */\n getExecutorRegistry() {\n return this.executorRegistry;\n }\n process(entities) {\n for (const entity of entities) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (!runtime.isRunning) {\n continue;\n }\n const treeData = this.assetManager.getAsset(runtime.treeAssetId);\n if (!treeData) {\n this.logger.warn(`未找到行为树资产: ${runtime.treeAssetId}`);\n continue;\n }\n // 如果标记了需要重置,先重置状态\n if (runtime.needsReset) {\n runtime.resetAllStates();\n runtime.needsReset = false;\n }\n this.executeTree(entity, runtime, treeData);\n }\n }\n /**\n * 执行整个行为树\n */\n executeTree(entity, runtime, treeData) {\n const rootNode = treeData.nodes.get(treeData.rootNodeId);\n if (!rootNode) {\n this.logger.error(`未找到根节点: ${treeData.rootNodeId}`);\n return;\n }\n const status = this.executeNode(entity, runtime, rootNode, treeData);\n // 如果树完成了,标记在下一个tick时重置状态\n // 这样UI可以看到节点的最终状态\n if (status !== TaskStatus.Running) {\n runtime.needsReset = true;\n }\n else {\n runtime.needsReset = false;\n }\n }\n /**\n * 执行单个节点\n */\n executeNode(entity, runtime, nodeData, treeData) {\n const state = runtime.getNodeState(nodeData.id);\n if (runtime.shouldAbort(nodeData.id)) {\n runtime.clearAbortRequest(nodeData.id);\n state.isAborted = true;\n const executor = this.executorRegistry.get(nodeData.implementationType);\n if (executor && executor.reset) {\n const context = this.createContext(entity, runtime, nodeData, treeData);\n executor.reset(context);\n }\n runtime.activeNodeIds.delete(nodeData.id);\n state.status = TaskStatus.Failure;\n return TaskStatus.Failure;\n }\n runtime.activeNodeIds.add(nodeData.id);\n state.isAborted = false;\n const executor = this.executorRegistry.get(nodeData.implementationType);\n if (!executor) {\n this.logger.error(`未找到执行器: ${nodeData.implementationType}`);\n state.status = TaskStatus.Failure;\n return TaskStatus.Failure;\n }\n const context = this.createContext(entity, runtime, nodeData, treeData);\n try {\n const status = executor.execute(context);\n state.status = status;\n if (status !== TaskStatus.Running) {\n runtime.activeNodeIds.delete(nodeData.id);\n if (executor.reset) {\n executor.reset(context);\n }\n }\n return status;\n }\n catch (error) {\n this.logger.error(`执行节点时发生错误: ${nodeData.name}`, error);\n state.status = TaskStatus.Failure;\n runtime.activeNodeIds.delete(nodeData.id);\n return TaskStatus.Failure;\n }\n }\n /**\n * 创建执行上下文\n */\n createContext(entity, runtime, nodeData, treeData) {\n return {\n entity,\n nodeData,\n state: runtime.getNodeState(nodeData.id),\n runtime,\n treeData,\n deltaTime: Time.deltaTime,\n totalTime: Time.totalTime,\n executeChild: (childId) => {\n const childData = treeData.nodes.get(childId);\n if (!childData) {\n this.logger.warn(`未找到子节点: ${childId}`);\n return TaskStatus.Failure;\n }\n return this.executeNode(entity, runtime, childData, treeData);\n }\n };\n }\n /**\n * 执行子节点列表\n */\n executeChildren(context, childIndices) {\n const { nodeData, treeData, entity, runtime } = context;\n if (!nodeData.children || nodeData.children.length === 0) {\n return [];\n }\n const results = [];\n const indicesToExecute = childIndices ||\n Array.from({ length: nodeData.children.length }, (_, i) => i);\n for (const index of indicesToExecute) {\n if (index >= nodeData.children.length) {\n continue;\n }\n const childId = nodeData.children[index];\n const childData = treeData.nodes.get(childId);\n if (!childData) {\n this.logger.warn(`未找到子节点: ${childId}`);\n results.push(TaskStatus.Failure);\n continue;\n }\n const status = this.executeNode(entity, runtime, childData, treeData);\n results.push(status);\n }\n return results;\n }\n};\nBehaviorTreeExecutionSystem = __decorate([\n ECSSystem('BehaviorTreeExecution'),\n __metadata(\"design:paramtypes\", [])\n], BehaviorTreeExecutionSystem);\nexport { BehaviorTreeExecutionSystem };\n//# sourceMappingURL=BehaviorTreeExecutionSystem.js.map","import { Core } from '@esengine/ecs-framework';\nimport { BehaviorTreeRuntimeComponent } from './Runtime/BehaviorTreeRuntimeComponent';\nimport { BehaviorTreeAssetManager } from './Runtime/BehaviorTreeAssetManager';\n/**\n * 行为树启动辅助类\n *\n * 提供便捷方法来启动、停止行为树\n */\nexport class BehaviorTreeStarter {\n /**\n * 启动行为树\n *\n * @param entity 游戏实体\n * @param treeData 行为树数据\n * @param autoStart 是否自动开始执行\n */\n static start(entity, treeData, autoStart = true) {\n const assetManager = Core.services.resolve(BehaviorTreeAssetManager);\n assetManager.loadAsset(treeData);\n let runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (!runtime) {\n runtime = new BehaviorTreeRuntimeComponent();\n entity.addComponent(runtime);\n }\n runtime.treeAssetId = treeData.id;\n runtime.autoStart = autoStart;\n if (treeData.blackboardVariables) {\n for (const [key, value] of treeData.blackboardVariables.entries()) {\n runtime.setBlackboardValue(key, value);\n }\n }\n if (autoStart) {\n runtime.isRunning = true;\n }\n }\n /**\n * 停止行为树\n *\n * @param entity 游戏实体\n */\n static stop(entity) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = false;\n runtime.resetAllStates();\n }\n }\n /**\n * 暂停行为树\n *\n * @param entity 游戏实体\n */\n static pause(entity) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = false;\n }\n }\n /**\n * 恢复行为树\n *\n * @param entity 游戏实体\n */\n static resume(entity) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.isRunning = true;\n }\n }\n /**\n * 重启行为树\n *\n * @param entity 游戏实体\n */\n static restart(entity) {\n const runtime = entity.getComponent(BehaviorTreeRuntimeComponent);\n if (runtime) {\n runtime.resetAllStates();\n runtime.isRunning = true;\n }\n }\n}\n//# sourceMappingURL=BehaviorTreeStarter.js.map","import { NodeType } from './Types/TaskStatus';\n/**\n * 行为树构建器\n *\n * 提供流式API构建行为树数据结构\n */\nexport class BehaviorTreeBuilder {\n constructor(treeName) {\n this.nodeStack = [];\n this.nodeIdCounter = 0;\n this.treeData = {\n id: `tree_${Date.now()}`,\n name: treeName,\n rootNodeId: '',\n nodes: new Map(),\n blackboardVariables: new Map()\n };\n }\n /**\n * 创建构建器\n */\n static create(treeName = 'BehaviorTree') {\n return new BehaviorTreeBuilder(treeName);\n }\n /**\n * 定义黑板变量\n */\n defineBlackboardVariable(key, initialValue) {\n if (!this.treeData.blackboardVariables) {\n this.treeData.blackboardVariables = new Map();\n }\n this.treeData.blackboardVariables.set(key, initialValue);\n return this;\n }\n /**\n * 添加序列节点\n */\n sequence(name) {\n return this.addCompositeNode('Sequence', name || 'Sequence');\n }\n /**\n * 添加选择器节点\n */\n selector(name) {\n return this.addCompositeNode('Selector', name || 'Selector');\n }\n /**\n * 添加并行节点\n */\n parallel(name, config) {\n return this.addCompositeNode('Parallel', name || 'Parallel', config);\n }\n /**\n * 添加并行选择器节点\n */\n parallelSelector(name, config) {\n return this.addCompositeNode('ParallelSelector', name || 'ParallelSelector', config);\n }\n /**\n * 添加随机序列节点\n */\n randomSequence(name) {\n return this.addCompositeNode('RandomSequence', name || 'RandomSequence');\n }\n /**\n * 添加随机选择器节点\n */\n randomSelector(name) {\n return this.addCompositeNode('RandomSelector', name || 'RandomSelector');\n }\n /**\n * 添加反转装饰器\n */\n inverter(name) {\n return this.addDecoratorNode('Inverter', name || 'Inverter');\n }\n /**\n * 添加重复装饰器\n */\n repeater(repeatCount, name) {\n return this.addDecoratorNode('Repeater', name || 'Repeater', { repeatCount });\n }\n /**\n * 添加总是成功装饰器\n */\n alwaysSucceed(name) {\n return this.addDecoratorNode('AlwaysSucceed', name || 'AlwaysSucceed');\n }\n /**\n * 添加总是失败装饰器\n */\n alwaysFail(name) {\n return this.addDecoratorNode('AlwaysFail', name || 'AlwaysFail');\n }\n /**\n * 添加直到成功装饰器\n */\n untilSuccess(name) {\n return this.addDecoratorNode('UntilSuccess', name || 'UntilSuccess');\n }\n /**\n * 添加直到失败装饰器\n */\n untilFail(name) {\n return this.addDecoratorNode('UntilFail', name || 'UntilFail');\n }\n /**\n * 添加条件装饰器\n */\n conditional(blackboardKey, expectedValue, operator, name) {\n return this.addDecoratorNode('Conditional', name || 'Conditional', {\n blackboardKey,\n expectedValue,\n operator: operator || 'equals'\n });\n }\n /**\n * 添加冷却装饰器\n */\n cooldown(cooldownTime, name) {\n return this.addDecoratorNode('Cooldown', name || 'Cooldown', { cooldownTime });\n }\n /**\n * 添加超时装饰器\n */\n timeout(timeout, name) {\n return this.addDecoratorNode('Timeout', name || 'Timeout', { timeout });\n }\n /**\n * 添加等待动作\n */\n wait(duration, name) {\n return this.addActionNode('Wait', name || 'Wait', { duration });\n }\n /**\n * 添加日志动作\n */\n log(message, name) {\n return this.addActionNode('Log', name || 'Log', { message });\n }\n /**\n * 添加设置黑板值动作\n */\n setBlackboardValue(key, value, name) {\n return this.addActionNode('SetBlackboardValue', name || 'SetBlackboardValue', { key, value });\n }\n /**\n * 添加修改黑板值动作\n */\n modifyBlackboardValue(key, operation, value, name) {\n return this.addActionNode('ModifyBlackboardValue', name || 'ModifyBlackboardValue', {\n key,\n operation,\n value\n });\n }\n /**\n * 添加执行动作\n */\n executeAction(actionName, name) {\n return this.addActionNode('ExecuteAction', name || 'ExecuteAction', { actionName });\n }\n /**\n * 添加黑板比较条件\n */\n blackboardCompare(key, compareValue, operator, name) {\n return this.addConditionNode('BlackboardCompare', name || 'BlackboardCompare', {\n key,\n compareValue,\n operator: operator || 'equals'\n });\n }\n /**\n * 添加黑板存在检查条件\n */\n blackboardExists(key, name) {\n return this.addConditionNode('BlackboardExists', name || 'BlackboardExists', { key });\n }\n /**\n * 添加随机概率条件\n */\n randomProbability(probability, name) {\n return this.addConditionNode('RandomProbability', name || 'RandomProbability', { probability });\n }\n /**\n * 添加执行条件\n */\n executeCondition(conditionName, name) {\n return this.addConditionNode('ExecuteCondition', name || 'ExecuteCondition', { conditionName });\n }\n /**\n * 结束当前节点,返回父节点\n */\n end() {\n if (this.nodeStack.length > 0) {\n this.nodeStack.pop();\n }\n return this;\n }\n /**\n * 构建行为树数据\n */\n build() {\n if (!this.treeData.rootNodeId) {\n throw new Error('No root node defined. Add at least one node to the tree.');\n }\n return this.treeData;\n }\n addCompositeNode(implementationType, name, config = {}) {\n const nodeId = this.generateNodeId();\n const node = {\n id: nodeId,\n name,\n nodeType: NodeType.Composite,\n implementationType,\n children: [],\n config\n };\n this.treeData.nodes.set(nodeId, node);\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1];\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n this.nodeStack.push(nodeId);\n return this;\n }\n addDecoratorNode(implementationType, name, config = {}) {\n const nodeId = this.generateNodeId();\n const node = {\n id: nodeId,\n name,\n nodeType: NodeType.Decorator,\n implementationType,\n children: [],\n config\n };\n this.treeData.nodes.set(nodeId, node);\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1];\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n this.nodeStack.push(nodeId);\n return this;\n }\n addActionNode(implementationType, name, config = {}) {\n const nodeId = this.generateNodeId();\n const node = {\n id: nodeId,\n name,\n nodeType: NodeType.Action,\n implementationType,\n config\n };\n this.treeData.nodes.set(nodeId, node);\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1];\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n return this;\n }\n addConditionNode(implementationType, name, config = {}) {\n const nodeId = this.generateNodeId();\n const node = {\n id: nodeId,\n name,\n nodeType: NodeType.Condition,\n implementationType,\n config\n };\n this.treeData.nodes.set(nodeId, node);\n if (!this.treeData.rootNodeId) {\n this.treeData.rootNodeId = nodeId;\n }\n if (this.nodeStack.length > 0) {\n const parentId = this.nodeStack[this.nodeStack.length - 1];\n const parentNode = this.treeData.nodes.get(parentId);\n if (parentNode && parentNode.children) {\n parentNode.children.push(nodeId);\n }\n }\n return this;\n }\n generateNodeId() {\n return `node_${this.nodeIdCounter++}`;\n }\n}\n//# sourceMappingURL=BehaviorTreeBuilder.js.map","import { NodeType } from '../Types/TaskStatus';\nimport { NodeMetadataRegistry } from '../Runtime/NodeMetadata';\n/**\n * 内置属性类型常量\n */\nexport const PropertyType = {\n /** 字符串 */\n String: 'string',\n /** 数值 */\n Number: 'number',\n /** 布尔值 */\n Boolean: 'boolean',\n /** 选择框 */\n Select: 'select',\n /** 黑板变量引用 */\n Blackboard: 'blackboard',\n /** 代码编辑器 */\n Code: 'code',\n /** 变量引用 */\n Variable: 'variable',\n /** 资产引用 */\n Asset: 'asset'\n};\n/**\n * 节点模板库\n */\nexport class NodeTemplates {\n /**\n * 获取所有节点模板\n */\n static getAllTemplates() {\n const allMetadata = NodeMetadataRegistry.getAllMetadata();\n return allMetadata.map(metadata => this.convertMetadataToTemplate(metadata));\n }\n /**\n * 根据类型和子类型获取模板\n */\n static getTemplate(type, subType) {\n return this.getAllTemplates().find(t => {\n if (t.type !== type)\n return false;\n const config = t.defaultConfig;\n switch (type) {\n case NodeType.Composite:\n return config.compositeType === subType;\n case NodeType.Decorator:\n return config.decoratorType === subType;\n case NodeType.Action:\n return config.actionType === subType;\n case NodeType.Condition:\n return config.conditionType === subType;\n default:\n return false;\n }\n });\n }\n /**\n * 将NodeMetadata转换为NodeTemplate\n */\n static convertMetadataToTemplate(metadata) {\n const properties = this.convertConfigSchemaToProperties(metadata.configSchema || {});\n const defaultConfig = {\n nodeType: this.nodeTypeToString(metadata.nodeType)\n };\n switch (metadata.nodeType) {\n case NodeType.Composite:\n defaultConfig.compositeType = metadata.implementationType;\n break;\n case NodeType.Decorator:\n defaultConfig.decoratorType = metadata.implementationType;\n break;\n case NodeType.Action:\n defaultConfig.actionType = metadata.implementationType;\n break;\n case NodeType.Condition:\n defaultConfig.conditionType = metadata.implementationType;\n break;\n }\n if (metadata.configSchema) {\n for (const [key, field] of Object.entries(metadata.configSchema)) {\n const fieldDef = field;\n if (fieldDef.default !== undefined) {\n defaultConfig[key] = fieldDef.default;\n }\n }\n }\n // 根据节点类型生成默认颜色和图标\n const { icon, color } = this.getIconAndColorByType(metadata.nodeType, metadata.category || '');\n return {\n type: metadata.nodeType,\n displayName: metadata.displayName,\n category: metadata.category || this.getCategoryByNodeType(metadata.nodeType),\n description: metadata.description || '',\n className: metadata.implementationType,\n icon,\n color,\n defaultConfig,\n properties\n };\n }\n /**\n * 将ConfigSchema转换为PropertyDefinition数组\n */\n static convertConfigSchemaToProperties(configSchema) {\n const properties = [];\n for (const [name, field] of Object.entries(configSchema)) {\n const property = {\n name,\n type: this.mapFieldTypeToPropertyType(field),\n label: name\n };\n if (field.description !== undefined) {\n property.description = field.description;\n }\n if (field.default !== undefined) {\n property.defaultValue = field.default;\n }\n if (field.min !== undefined) {\n property.min = field.min;\n }\n if (field.max !== undefined) {\n property.max = field.max;\n }\n if (field.allowMultipleConnections !== undefined) {\n property.allowMultipleConnections = field.allowMultipleConnections;\n }\n if (field.options) {\n property.options = field.options.map(opt => ({\n label: opt,\n value: opt\n }));\n }\n if (field.supportBinding) {\n property.renderConfig = {\n component: 'BindableInput',\n props: {\n supportBinding: true\n }\n };\n }\n properties.push(property);\n }\n return properties;\n }\n /**\n * 映射字段类型到属性类型\n */\n static mapFieldTypeToPropertyType(field) {\n if (field.options && field.options.length > 0) {\n return PropertyType.Select;\n }\n switch (field.type) {\n case 'string':\n return PropertyType.String;\n case 'number':\n return PropertyType.Number;\n case 'boolean':\n return PropertyType.Boolean;\n case 'array':\n case 'object':\n default:\n return PropertyType.String;\n }\n }\n /**\n * NodeType转字符串\n */\n static nodeTypeToString(nodeType) {\n switch (nodeType) {\n case NodeType.Composite:\n return 'composite';\n case NodeType.Decorator:\n return 'decorator';\n case NodeType.Action:\n return 'action';\n case NodeType.Condition:\n return 'condition';\n default:\n return 'unknown';\n }\n }\n /**\n * 根据NodeType获取默认分类\n */\n static getCategoryByNodeType(nodeType) {\n switch (nodeType) {\n case NodeType.Composite:\n return '组合';\n case NodeType.Decorator:\n return '装饰器';\n case NodeType.Action:\n return '动作';\n case NodeType.Condition:\n return '条件';\n default:\n return '其他';\n }\n }\n /**\n * 根据节点类型获取默认图标和颜色\n */\n static getIconAndColorByType(nodeType, _category) {\n // 根据节点类型设置默认值\n switch (nodeType) {\n case NodeType.Composite:\n return { icon: 'GitBranch', color: '#1976d2' }; // 蓝色\n case NodeType.Decorator:\n return { icon: 'Settings', color: '#fb8c00' }; // 橙色\n case NodeType.Action:\n return { icon: 'Play', color: '#388e3c' }; // 绿色\n case NodeType.Condition:\n return { icon: 'HelpCircle', color: '#d32f2f' }; // 红色\n default:\n return { icon: 'Circle', color: '#757575' }; // 灰色\n }\n }\n}\n//# sourceMappingURL=NodeTemplates.js.map","import { NodeType } from '../Types/TaskStatus';\n/**\n * 资产验证器\n */\nexport class BehaviorTreeAssetValidator {\n /**\n * 验证资产数据的完整性和正确性\n */\n static validate(asset) {\n const errors = [];\n const warnings = [];\n // 检查版本\n if (!asset.version) {\n errors.push('Missing version field');\n }\n // 检查元数据\n if (!asset.metadata || !asset.metadata.name) {\n errors.push('Missing or invalid metadata');\n }\n // 检查根节点\n if (!asset.rootNodeId) {\n errors.push('Missing rootNodeId');\n }\n // 检查节点列表\n if (!asset.nodes || !Array.isArray(asset.nodes)) {\n errors.push('Missing or invalid nodes array');\n }\n else {\n const nodeIds = new Set();\n const rootNode = asset.nodes.find(n => n.id === asset.rootNodeId);\n if (!rootNode) {\n errors.push(`Root node '${asset.rootNodeId}' not found in nodes array`);\n }\n // 检查节点ID唯一性\n for (const node of asset.nodes) {\n if (!node.id) {\n errors.push('Node missing id field');\n continue;\n }\n if (nodeIds.has(node.id)) {\n errors.push(`Duplicate node id: ${node.id}`);\n }\n nodeIds.add(node.id);\n // 检查节点类型\n if (!node.nodeType) {\n errors.push(`Node ${node.id} missing nodeType`);\n }\n // 检查子节点引用\n if (node.children) {\n for (const childId of node.children) {\n if (!asset.nodes.find(n => n.id === childId)) {\n errors.push(`Node ${node.id} references non-existent child: ${childId}`);\n }\n }\n }\n }\n // 检查是否有孤立节点\n const referencedNodes = new Set([asset.rootNodeId]);\n const collectReferencedNodes = (nodeId) => {\n const node = asset.nodes.find(n => n.id === nodeId);\n if (node && node.children) {\n for (const childId of node.children) {\n referencedNodes.add(childId);\n collectReferencedNodes(childId);\n }\n }\n };\n collectReferencedNodes(asset.rootNodeId);\n for (const node of asset.nodes) {\n if (!referencedNodes.has(node.id)) {\n warnings.push(`Orphaned node detected: ${node.id} (${node.name})`);\n }\n }\n }\n // 检查黑板定义\n if (asset.blackboard && Array.isArray(asset.blackboard)) {\n const varNames = new Set();\n for (const variable of asset.blackboard) {\n if (!variable.name) {\n errors.push('Blackboard variable missing name');\n continue;\n }\n if (varNames.has(variable.name)) {\n errors.push(`Duplicate blackboard variable: ${variable.name}`);\n }\n varNames.add(variable.name);\n if (!variable.type) {\n errors.push(`Blackboard variable ${variable.name} missing type`);\n }\n }\n }\n // 检查属性绑定\n if (asset.propertyBindings && Array.isArray(asset.propertyBindings)) {\n const nodeIds = new Set(asset.nodes.map(n => n.id));\n const varNames = new Set(asset.blackboard?.map(v => v.name) || []);\n for (const binding of asset.propertyBindings) {\n if (!nodeIds.has(binding.nodeId)) {\n errors.push(`Property binding references non-existent node: ${binding.nodeId}`);\n }\n if (!varNames.has(binding.variableName)) {\n errors.push(`Property binding references non-existent variable: ${binding.variableName}`);\n }\n if (!binding.propertyName) {\n errors.push('Property binding missing propertyName');\n }\n }\n }\n const result = {\n valid: errors.length === 0\n };\n if (errors.length > 0) {\n result.errors = errors;\n }\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n return result;\n }\n /**\n * 获取资产统计信息\n */\n static getStats(asset) {\n let actionCount = 0;\n let conditionCount = 0;\n let compositeCount = 0;\n let decoratorCount = 0;\n for (const node of asset.nodes) {\n switch (node.nodeType) {\n case NodeType.Action:\n actionCount++;\n break;\n case NodeType.Condition:\n conditionCount++;\n break;\n case NodeType.Composite:\n compositeCount++;\n break;\n case NodeType.Decorator:\n decoratorCount++;\n break;\n }\n }\n // 计算最大深度\n const getDepth = (nodeId, currentDepth = 0) => {\n const node = asset.nodes.find(n => n.id === nodeId);\n if (!node || !node.children || node.children.length === 0) {\n return currentDepth;\n }\n let maxChildDepth = currentDepth;\n for (const childId of node.children) {\n const childDepth = getDepth(childId, currentDepth + 1);\n maxChildDepth = Math.max(maxChildDepth, childDepth);\n }\n return maxChildDepth;\n };\n return {\n nodeCount: asset.nodes.length,\n actionCount,\n conditionCount,\n compositeCount,\n decoratorCount,\n blackboardVariableCount: asset.blackboard?.length || 0,\n propertyBindingCount: asset.propertyBindings?.length || 0,\n maxDepth: getDepth(asset.rootNodeId)\n };\n }\n}\n//# sourceMappingURL=BehaviorTreeAsset.js.map","import { createLogger } from '@esengine/ecs-framework';\nimport { NodeType, BlackboardValueType } from '../Types/TaskStatus';\nconst logger = createLogger('EditorFormatConverter');\n/**\n * 编辑器格式转换器\n *\n * 将编辑器格式转换为运行时资产格式\n */\nexport class EditorFormatConverter {\n /**\n * 转换编辑器格式为资产格式\n *\n * @param editorData 编辑器数据\n * @param metadata 可选的元数据覆盖\n * @returns 行为树资产\n */\n static toAsset(editorData, metadata) {\n logger.info('开始转换编辑器格式到资产格式');\n const rootNode = this.findRootNode(editorData.nodes);\n if (!rootNode) {\n throw new Error('未找到根节点');\n }\n const assetMetadata = {\n name: metadata?.name || editorData.metadata?.name || 'Untitled Behavior Tree',\n version: metadata?.version || editorData.version || '1.0.0'\n };\n const description = metadata?.description || editorData.metadata?.description;\n if (description) {\n assetMetadata.description = description;\n }\n const createdAt = metadata?.createdAt || editorData.metadata?.createdAt;\n if (createdAt) {\n assetMetadata.createdAt = createdAt;\n }\n const modifiedAt = metadata?.modifiedAt || new Date().toISOString();\n if (modifiedAt) {\n assetMetadata.modifiedAt = modifiedAt;\n }\n const nodes = this.convertNodes(editorData.nodes);\n const blackboard = this.convertBlackboard(editorData.blackboard);\n const propertyBindings = this.convertPropertyBindings(editorData.connections, editorData.nodes, blackboard);\n const asset = {\n version: '1.0.0',\n metadata: assetMetadata,\n rootNodeId: rootNode.id,\n nodes,\n blackboard\n };\n if (propertyBindings.length > 0) {\n asset.propertyBindings = propertyBindings;\n }\n logger.info(`转换完成: ${nodes.length}个节点, ${blackboard.length}个黑板变量, ${propertyBindings.length}个属性绑定`);\n return asset;\n }\n /**\n * 查找根节点\n */\n static findRootNode(nodes) {\n return nodes.find(node => node.template.category === '根节点' ||\n node.data.nodeType === 'root') || null;\n }\n /**\n * 转换节点列表\n */\n static convertNodes(editorNodes) {\n return editorNodes.map(node => this.convertNode(node));\n }\n /**\n * 转换单个节点\n */\n static convertNode(editorNode) {\n const data = { ...editorNode.data };\n delete data.nodeType;\n if (editorNode.template.className) {\n data.className = editorNode.template.className;\n }\n return {\n id: editorNode.id,\n name: editorNode.template.displayName || editorNode.data.name || 'Node',\n nodeType: editorNode.template.type,\n data,\n children: editorNode.children || []\n };\n }\n /**\n * 转换黑板变量\n */\n static convertBlackboard(blackboard) {\n const variables = [];\n for (const [name, value] of Object.entries(blackboard)) {\n const type = this.inferBlackboardType(value);\n variables.push({\n name,\n type,\n defaultValue: value\n });\n }\n return variables;\n }\n /**\n * 推断黑板变量类型\n */\n static inferBlackboardType(value) {\n if (typeof value === 'number') {\n return BlackboardValueType.Number;\n }\n else if (typeof value === 'string') {\n return BlackboardValueType.String;\n }\n else if (typeof value === 'boolean') {\n return BlackboardValueType.Boolean;\n }\n else {\n return BlackboardValueType.Object;\n }\n }\n /**\n * 转换属性绑定\n */\n static convertPropertyBindings(connections, nodes, blackboard) {\n const bindings = [];\n const blackboardVarNames = new Set(blackboard.map(v => v.name));\n const propertyConnections = connections.filter(conn => conn.connectionType === 'property');\n for (const conn of propertyConnections) {\n const fromNode = nodes.find(n => n.id === conn.from);\n const toNode = nodes.find(n => n.id === conn.to);\n if (!fromNode || !toNode || !conn.toProperty) {\n logger.warn(`跳过无效的属性连接: from=${conn.from}, to=${conn.to}`);\n continue;\n }\n let variableName;\n if (fromNode.data.nodeType === 'blackboard-variable') {\n variableName = fromNode.data.variableName;\n }\n else if (conn.fromProperty) {\n variableName = conn.fromProperty;\n }\n if (!variableName) {\n logger.warn(`无法确定变量名: from节点=${fromNode.template.displayName}`);\n continue;\n }\n if (!blackboardVarNames.has(variableName)) {\n logger.warn(`属性绑定引用了不存在的黑板变量: ${variableName}`);\n continue;\n }\n bindings.push({\n nodeId: toNode.id,\n propertyName: conn.toProperty,\n variableName\n });\n }\n return bindings;\n }\n /**\n * 从资产格式转换回编辑器格式(用于加载)\n *\n * @param asset 行为树资产\n * @returns 编辑器格式数据\n */\n static fromAsset(asset) {\n logger.info('开始转换资产格式到编辑器格式');\n const nodes = this.convertNodesFromAsset(asset.nodes);\n const blackboard = {};\n for (const variable of asset.blackboard) {\n blackboard[variable.name] = variable.defaultValue;\n }\n const connections = this.convertPropertyBindingsToConnections(asset.propertyBindings || []);\n const nodeConnections = this.buildNodeConnections(asset.nodes);\n connections.push(...nodeConnections);\n const metadata = {\n name: asset.metadata.name\n };\n if (asset.metadata.description) {\n metadata.description = asset.metadata.description;\n }\n if (asset.metadata.createdAt) {\n metadata.createdAt = asset.metadata.createdAt;\n }\n if (asset.metadata.modifiedAt) {\n metadata.modifiedAt = asset.metadata.modifiedAt;\n }\n const editorData = {\n version: asset.metadata.version,\n metadata,\n nodes,\n connections,\n blackboard,\n canvasState: {\n offset: { x: 0, y: 0 },\n scale: 1\n }\n };\n logger.info(`转换完成: ${nodes.length}个节点, ${connections.length}个连接`);\n return editorData;\n }\n /**\n * 从资产格式转换节点\n */\n static convertNodesFromAsset(assetNodes) {\n return assetNodes.map((node, index) => {\n const position = {\n x: 100 + (index % 5) * 250,\n y: 100 + Math.floor(index / 5) * 150\n };\n const template = {\n displayName: node.name,\n category: this.inferCategory(node.nodeType),\n type: node.nodeType\n };\n if (node.data.className) {\n template.className = node.data.className;\n }\n return {\n id: node.id,\n template,\n data: { ...node.data },\n position,\n children: node.children\n };\n });\n }\n /**\n * 推断节点分类\n */\n static inferCategory(nodeType) {\n switch (nodeType) {\n case NodeType.Action:\n return '动作';\n case NodeType.Condition:\n return '条件';\n case NodeType.Composite:\n return '组合';\n case NodeType.Decorator:\n return '装饰器';\n default:\n return '其他';\n }\n }\n /**\n * 将属性绑定转换为连接\n */\n static convertPropertyBindingsToConnections(bindings) {\n const connections = [];\n for (const binding of bindings) {\n connections.push({\n from: 'blackboard',\n to: binding.nodeId,\n toProperty: binding.propertyName,\n connectionType: 'property'\n });\n }\n return connections;\n }\n /**\n * 根据children关系构建节点连接\n */\n static buildNodeConnections(nodes) {\n const connections = [];\n for (const node of nodes) {\n for (const childId of node.children) {\n connections.push({\n from: node.id,\n to: childId,\n connectionType: 'node'\n });\n }\n }\n return connections;\n }\n}\n//# sourceMappingURL=EditorFormatConverter.js.map","import { createLogger, BinarySerializer } from '@esengine/ecs-framework';\nimport { BehaviorTreeAssetValidator } from './BehaviorTreeAsset';\nimport { EditorFormatConverter } from './EditorFormatConverter';\nconst logger = createLogger('BehaviorTreeAssetSerializer');\n/**\n * 行为树资产序列化器\n *\n * 支持JSON和二进制两种格式\n */\nexport class BehaviorTreeAssetSerializer {\n /**\n * 序列化资产\n *\n * @param asset 行为树资产\n * @param options 序列化选项\n * @returns 序列化后的数据(字符串或Uint8Array)\n *\n * @example\n * ```typescript\n * // JSON格式\n * const jsonData = BehaviorTreeAssetSerializer.serialize(asset, { format: 'json', pretty: true });\n *\n * // 二进制格式\n * const binaryData = BehaviorTreeAssetSerializer.serialize(asset, { format: 'binary' });\n * ```\n */\n static serialize(asset, options = { format: 'json', pretty: true }) {\n // 验证资产(如果需要)\n if (options.validate !== false) {\n const validation = BehaviorTreeAssetValidator.validate(asset);\n if (!validation.valid) {\n const errors = validation.errors?.join(', ') || 'Unknown error';\n throw new Error(`资产验证失败: ${errors}`);\n }\n if (validation.warnings && validation.warnings.length > 0) {\n logger.warn(`资产验证警告: ${validation.warnings.join(', ')}`);\n }\n }\n // 根据格式序列化\n if (options.format === 'json') {\n return this.serializeToJSON(asset, options.pretty);\n }\n else {\n return this.serializeToBinary(asset);\n }\n }\n /**\n * 序列化为JSON格式\n */\n static serializeToJSON(asset, pretty = true) {\n try {\n const json = pretty\n ? JSON.stringify(asset, null, 2)\n : JSON.stringify(asset);\n logger.info(`已序列化为JSON: ${json.length} 字符`);\n return json;\n }\n catch (error) {\n throw new Error(`JSON序列化失败: ${error}`);\n }\n }\n /**\n * 序列化为二进制格式\n */\n static serializeToBinary(asset) {\n try {\n const binary = BinarySerializer.encode(asset);\n logger.info(`已序列化为二进制: ${binary.length} 字节`);\n return binary;\n }\n catch (error) {\n throw new Error(`二进制序列化失败: ${error}`);\n }\n }\n /**\n * 反序列化资产\n *\n * @param data 序列化的数据(字符串或Uint8Array)\n * @param options 反序列化选项\n * @returns 行为树资产\n *\n * @example\n * ```typescript\n * // 从JSON加载\n * const asset = BehaviorTreeAssetSerializer.deserialize(jsonString);\n *\n * // 从二进制加载\n * const asset = BehaviorTreeAssetSerializer.deserialize(binaryData);\n * ```\n */\n static deserialize(data, options = { validate: true, strict: true }) {\n let asset;\n try {\n if (typeof data === 'string') {\n asset = this.deserializeFromJSON(data);\n }\n else {\n asset = this.deserializeFromBinary(data);\n }\n }\n catch (error) {\n throw new Error(`反序列化失败: ${error}`);\n }\n // 验证资产(如果需要)\n if (options.validate !== false) {\n const validation = BehaviorTreeAssetValidator.validate(asset);\n if (!validation.valid) {\n const errors = validation.errors?.join(', ') || 'Unknown error';\n if (options.strict) {\n throw new Error(`资产验证失败: ${errors}`);\n }\n else {\n logger.error(`资产验证失败: ${errors}`);\n }\n }\n if (validation.warnings && validation.warnings.length > 0) {\n logger.warn(`资产验证警告: ${validation.warnings.join(', ')}`);\n }\n }\n return asset;\n }\n /**\n * 从JSON反序列化\n */\n static deserializeFromJSON(json) {\n try {\n const data = JSON.parse(json);\n // 检测是否是编辑器格式(EditorFormat)\n // 编辑器格式有 nodes/connections/blackboard,但没有 rootNodeId\n // 运行时资产格式有 rootNodeId\n const isEditorFormat = !data.rootNodeId && data.nodes && data.connections;\n if (isEditorFormat) {\n logger.info('检测到编辑器格式,正在转换为运行时资产格式...');\n const editorData = data;\n const asset = EditorFormatConverter.toAsset(editorData);\n logger.info(`已从编辑器格式转换: ${asset.nodes.length} 个节点`);\n return asset;\n }\n else {\n const asset = data;\n logger.info(`已从运行时资产格式反序列化: ${asset.nodes.length} 个节点`);\n return asset;\n }\n }\n catch (error) {\n throw new Error(`JSON解析失败: ${error}`);\n }\n }\n /**\n * 从二进制反序列化\n */\n static deserializeFromBinary(binary) {\n try {\n const asset = BinarySerializer.decode(binary);\n logger.info(`已从二进制反序列化: ${asset.nodes.length} 个节点`);\n return asset;\n }\n catch (error) {\n throw new Error(`二进制解码失败: ${error}`);\n }\n }\n /**\n * 检测数据格式\n *\n * @param data 序列化的数据\n * @returns 格式类型\n */\n static detectFormat(data) {\n if (typeof data === 'string') {\n return 'json';\n }\n else {\n return 'binary';\n }\n }\n /**\n * 获取序列化数据的信息(不完全反序列化)\n *\n * @param data 序列化的数据\n * @returns 资产元信息\n */\n static getInfo(data) {\n try {\n const format = this.detectFormat(data);\n let asset;\n if (format === 'json') {\n asset = JSON.parse(data);\n }\n else {\n asset = BinarySerializer.decode(data);\n }\n const size = typeof data === 'string' ? data.length : data.length;\n return {\n format,\n name: asset.metadata.name,\n version: asset.version,\n nodeCount: asset.nodes.length,\n blackboardVariableCount: asset.blackboard.length,\n size\n };\n }\n catch (error) {\n logger.error(`获取资产信息失败: ${error}`);\n return null;\n }\n }\n /**\n * 转换格式\n *\n * @param data 源数据\n * @param targetFormat 目标格式\n * @param pretty 是否美化JSON(仅当目标格式为json时有效)\n * @returns 转换后的数据\n *\n * @example\n * ```typescript\n * // JSON转二进制\n * const binary = BehaviorTreeAssetSerializer.convert(jsonString, 'binary');\n *\n * // 二进制转JSON\n * const json = BehaviorTreeAssetSerializer.convert(binaryData, 'json', true);\n * ```\n */\n static convert(data, targetFormat, pretty = true) {\n const asset = this.deserialize(data, { validate: false });\n return this.serialize(asset, {\n format: targetFormat,\n pretty,\n validate: false\n });\n }\n /**\n * 比较两个资产数据的大小\n *\n * @param jsonData JSON格式数据\n * @param binaryData 二进制格式数据\n * @returns 压缩率(百分比)\n */\n static compareSize(jsonData, binaryData) {\n const jsonSize = jsonData.length;\n const binarySize = binaryData.length;\n const savedBytes = jsonSize - binarySize;\n const compressionRatio = (savedBytes / jsonSize) * 100;\n return {\n jsonSize,\n binarySize,\n compressionRatio,\n savedBytes\n };\n }\n}\n//# sourceMappingURL=BehaviorTreeAssetSerializer.js.map","/**\n * 全局黑板服务\n *\n * 提供所有行为树共享的全局变量存储\n *\n * 使用方式:\n * ```typescript\n * // 注册服务(在 BehaviorTreePlugin.install 中自动完成)\n * core.services.registerSingleton(GlobalBlackboardService);\n *\n * // 获取服务\n * const blackboard = core.services.resolve(GlobalBlackboardService);\n * ```\n */\nexport class GlobalBlackboardService {\n constructor() {\n this.variables = new Map();\n }\n dispose() {\n this.variables.clear();\n }\n /**\n * 定义全局变量\n */\n defineVariable(name, type, initialValue, options) {\n const variable = {\n name,\n type,\n value: initialValue,\n readonly: options?.readonly ?? false\n };\n if (options?.description !== undefined) {\n variable.description = options.description;\n }\n this.variables.set(name, variable);\n }\n /**\n * 获取全局变量值\n */\n getValue(name) {\n const variable = this.variables.get(name);\n return variable?.value;\n }\n /**\n * 设置全局变量值\n */\n setValue(name, value, force = false) {\n const variable = this.variables.get(name);\n if (!variable) {\n return false;\n }\n if (variable.readonly && !force) {\n return false;\n }\n variable.value = value;\n return true;\n }\n /**\n * 检查全局变量是否存在\n */\n hasVariable(name) {\n return this.variables.has(name);\n }\n /**\n * 删除全局变量\n */\n removeVariable(name) {\n return this.variables.delete(name);\n }\n /**\n * 获取所有变量名\n */\n getVariableNames() {\n return Array.from(this.variables.keys());\n }\n /**\n * 获取所有变量\n */\n getAllVariables() {\n return Array.from(this.variables.values());\n }\n /**\n * 清空所有全局变量\n */\n clear() {\n this.variables.clear();\n }\n /**\n * 批量设置变量\n */\n setVariables(values) {\n for (const [name, value] of Object.entries(values)) {\n const variable = this.variables.get(name);\n if (variable && !variable.readonly) {\n variable.value = value;\n }\n }\n }\n /**\n * 批量获取变量\n */\n getVariables(names) {\n const result = {};\n for (const name of names) {\n const value = this.getValue(name);\n if (value !== undefined) {\n result[name] = value;\n }\n }\n return result;\n }\n /**\n * 导出配置\n */\n exportConfig() {\n return {\n version: '1.0',\n variables: Array.from(this.variables.values())\n };\n }\n /**\n * 导入配置\n */\n importConfig(config) {\n this.variables.clear();\n for (const variable of config.variables) {\n this.variables.set(variable.name, variable);\n }\n }\n /**\n * 序列化为 JSON\n */\n toJSON() {\n return JSON.stringify(this.exportConfig(), null, 2);\n }\n /**\n * 从 JSON 反序列化\n */\n static fromJSON(json) {\n return JSON.parse(json);\n }\n}\n//# sourceMappingURL=GlobalBlackboardService.js.map","import { WorldManager } from '@esengine/ecs-framework';\nimport { BehaviorTreeExecutionSystem } from './Runtime/BehaviorTreeExecutionSystem';\nimport { GlobalBlackboardService } from './Services/GlobalBlackboardService';\nimport { BehaviorTreeAssetManager } from './Runtime/BehaviorTreeAssetManager';\n/**\n * 行为树插件\n *\n * 提供便捷方法向场景添加行为树系统\n *\n * @example\n * ```typescript\n * const core = Core.create();\n * const plugin = new BehaviorTreePlugin();\n * await core.pluginManager.install(plugin);\n *\n * // 为场景添加行为树系统\n * const scene = new Scene();\n * plugin.setupScene(scene);\n * ```\n */\nexport class BehaviorTreePlugin {\n constructor() {\n this.name = '@esengine/behavior-tree';\n this.version = '1.0.0';\n this.worldManager = null;\n this.services = null;\n }\n /**\n * 安装插件\n */\n async install(_core, services) {\n this.services = services;\n // 注册全局服务\n services.registerSingleton(GlobalBlackboardService);\n services.registerSingleton(BehaviorTreeAssetManager);\n this.worldManager = services.resolve(WorldManager);\n }\n /**\n * 卸载插件\n */\n async uninstall() {\n if (this.services) {\n this.services.unregister(GlobalBlackboardService);\n this.services.unregister(BehaviorTreeAssetManager);\n }\n this.worldManager = null;\n this.services = null;\n }\n /**\n * 为场景设置行为树系统\n *\n * 向场景添加行为树执行系统\n *\n * @param scene 目标场景\n *\n * @example\n * ```typescript\n * const scene = new Scene();\n * behaviorTreePlugin.setupScene(scene);\n * ```\n */\n setupScene(scene) {\n scene.addSystem(new BehaviorTreeExecutionSystem());\n }\n /**\n * 为所有现有场景设置行为树系统\n */\n setupAllScenes() {\n if (!this.worldManager) {\n throw new Error('Plugin not installed');\n }\n const worlds = this.worldManager.getAllWorlds();\n for (const world of worlds) {\n for (const scene of world.getAllScenes()) {\n this.setupScene(scene);\n }\n }\n }\n}\n//# sourceMappingURL=BehaviorTreePlugin.js.map"],"names":["TaskStatus","NodeType","Composite","Decorator","Action","Condition","CompositeType","DecoratorType","AbortType","BlackboardValueType","createDefaultRuntimeState","status","Invalid","currentChildIndex","__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__metadata","metadataKey","metadataValue","metadata","BehaviorTreeRuntimeComponent","Component","constructor","this","treeAssetId","autoStart","isRunning","nodeStates","Map","blackboard","blackboardObservers","activeNodeIds","Set","needsReset","nodesToAbort","getNodeState","nodeId","has","set","get","resetNodeState","state","startTime","lastExecutionTime","repeatCount","cachedResult","shuffledIndices","isAborted","lastConditionResult","observedKeys","resetAllStates","clear","getBlackboardValue","setBlackboardValue","value","oldValue","notifyBlackboardChange","hasBlackboardKey","initializeBlackboard","variables","forEach","clearBlackboard","start","stop","pause","resume","observeBlackboard","keys","callback","observer","push","unobserveBlackboard","observers","values","index","findIndex","o","splice","newValue","error","console","requestAbort","add","shouldAbort","clearAbortRequest","delete","clearAllAbortRequests","Serialize","String","prototype","Boolean","IgnoreSerialization","ECSComponent","Serializable","version","logger","createLogger","BehaviorTreeAssetManager","assets","loadAsset","asset","id","warn","info","name","nodes","size","getAsset","assetId","hasAsset","unloadAsset","result","clearAll","getAssetCount","getAllAssetIds","Array","from","dispose","BindingHelper","getValue","context","configKey","defaultValue","nodeData","runtime","bindings","blackboardKey","boundValue","undefined","configValue","config","hasBinding","getBindingKey","NodeExecutorRegistry","executors","register","implementationType","executor","unregister","NodeMetadataRegistry","metadataMap","executorClassMap","executorConstructors","getMetadata","getAllMetadata","getByCategory","category","filter","m","getByNodeType","nodeType","getImplementationType","executorClass","getExecutorConstructor","getAllExecutorConstructors","NodeExecutorMetadata","SequenceExecutor","execute","children","Success","childId","executeChild","Running","Failure","reset","displayName","description","SelectorExecutor","ParallelExecutor","successPolicy","failurePolicy","hasRunning","successCount","failureCount","stopAllChildren","configSchema","type","default","options","ParallelSelectorExecutor","RandomSequenceExecutor","shuffleIndices","shuffledIndex","indices","_","j","Math","floor","random","temp","RandomSelectorExecutor","InverterExecutor","RepeaterExecutor","endOnFailure","supportBinding","AlwaysSucceedExecutor","AlwaysFailExecutor","UntilSuccessExecutor","UntilFailExecutor","ConditionalExecutor","expectedValue","operator","abortType","None","actualValue","conditionMet","evaluateCondition","wasRunning","setupObserver","handleConditionBecameTrue","handleConditionBecameFalse","_key","lastResult","LowerPriority","Both","requestAbortLowerPriority","Self","CooldownExecutor","totalTime","cooldownTime","min","TimeoutExecutor","timeout","ServiceRegistry","service","services","ServiceDecorator","serviceName","tickInterval","onServiceStart","onServiceTick","childStatus","onServiceEnd","WaitAction","duration","LogAction","message","logLevel","finalMessage","replaceBlackboardVariables","log","includes","replace","trim","level","SetBlackboardValue","ModifyBlackboardValue","operation","currentValue","ExecuteAction","entity","actionName","actionFunction","SubTreeExecutor","assetManager","getAssetManager","Core","resolve","shareBlackboard","subTreeData","rootNode","rootNodeId","blackboardVariables","entries","subTreeContext","treeData","deltaTime","childData","childContext","executeSubTreeNode","BlackboardCompare","compareValue","compare","BlackboardExists","checkNull","RandomProbability","probability","clampedProbability","max","ExecuteCondition","conditionName","conditionFunction","BehaviorTreeExecutionSystem","EntitySystem","super","Matcher","empty","all","executorRegistry","registerBuiltInExecutors","constructors","ExecutorClass","instance","getExecutorRegistry","process","entities","getComponent","executeTree","executeNode","createContext","Time","executeChildren","childIndices","results","indicesToExecute","ECSSystem","BehaviorTreeStarter","addComponent","restart","BehaviorTreeBuilder","treeName","nodeStack","nodeIdCounter","Date","now","create","defineBlackboardVariable","initialValue","sequence","addCompositeNode","selector","parallel","parallelSelector","randomSequence","randomSelector","inverter","addDecoratorNode","repeater","alwaysSucceed","alwaysFail","untilSuccess","untilFail","conditional","cooldown","wait","addActionNode","modifyBlackboardValue","executeAction","blackboardCompare","addConditionNode","blackboardExists","randomProbability","executeCondition","end","pop","build","Error","generateNodeId","node","parentId","parentNode","PropertyType","Number","Select","Blackboard","Code","Variable","Asset","NodeTemplates","getAllTemplates","map","convertMetadataToTemplate","getTemplate","subType","find","t","defaultConfig","compositeType","decoratorType","actionType","conditionType","properties","convertConfigSchemaToProperties","nodeTypeToString","field","fieldDef","icon","color","getIconAndColorByType","getCategoryByNodeType","className","property","mapFieldTypeToPropertyType","label","allowMultipleConnections","opt","renderConfig","component","props","_category","BehaviorTreeAssetValidator","validate","errors","warnings","isArray","nodeIds","n","referencedNodes","collectReferencedNodes","varNames","variable","propertyBindings","v","binding","variableName","propertyName","valid","getStats","actionCount","conditionCount","compositeCount","decoratorCount","getDepth","currentDepth","maxChildDepth","childDepth","nodeCount","blackboardVariableCount","propertyBindingCount","maxDepth","EditorFormatConverter","toAsset","editorData","findRootNode","assetMetadata","createdAt","modifiedAt","toISOString","convertNodes","convertBlackboard","convertPropertyBindings","connections","template","data","editorNodes","convertNode","editorNode","inferBlackboardType","blackboardVarNames","propertyConnections","conn","connectionType","fromNode","toNode","to","toProperty","fromProperty","fromAsset","convertNodesFromAsset","convertPropertyBindingsToConnections","nodeConnections","buildNodeConnections","canvasState","offset","x","y","scale","assetNodes","position","inferCategory","BehaviorTreeAssetSerializer","serialize","format","pretty","validation","join","serializeToJSON","serializeToBinary","json","JSON","stringify","binary","BinarySerializer","encode","deserialize","strict","deserializeFromJSON","deserializeFromBinary","parse","decode","detectFormat","getInfo","convert","targetFormat","compareSize","jsonData","binaryData","jsonSize","binarySize","savedBytes","compressionRatio","GlobalBlackboardService","defineVariable","readonly","setValue","force","hasVariable","removeVariable","getVariableNames","getAllVariables","setVariables","getVariables","names","exportConfig","importConfig","toJSON","fromJSON","BehaviorTreePlugin","worldManager","install","_core","registerSingleton","WorldManager","uninstall","setupScene","scene","addSystem","setupAllScenes","worlds","getAllWorlds","world","getAllScenes"],"mappings":"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","x_google_ignoreList":[2]}
|