@esengine/behavior-tree 1.0.0
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/index.cjs +2 -0
- package/index.cjs.map +1 -0
- package/index.d.ts +2875 -0
- package/index.es5.js +4 -0
- package/index.es5.js.map +1 -0
- package/index.mjs +2 -0
- package/index.mjs.map +1 -0
- package/index.umd.js +2 -0
- package/index.umd.js.map +1 -0
- package/package.json +56 -0
package/index.es5.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es5.js","sources":["../bin/Types/TaskStatus.js","../../../node_modules/tslib/tslib.es6.mjs","../bin/Decorators/BehaviorNodeDecorator.js","../bin/Components/Actions/ModifyBlackboardValueAction.js","../bin/Components/Conditions/BlackboardCompareCondition.js","../bin/Components/Actions/ExecuteAction.js","../bin/Components/Actions/WaitAction.js","../bin/Components/Actions/LogAction.js","../bin/Components/Actions/SetBlackboardValueAction.js","../bin/Components/Conditions/BlackboardExistsCondition.js","../bin/Components/Conditions/RandomProbabilityCondition.js","../bin/Components/Conditions/ExecuteCondition.js","../bin/Components/CompositeNodeComponent.js","../bin/Components/Composites/SequenceNode.js","../bin/Components/Composites/SelectorNode.js","../bin/Components/Composites/ParallelNode.js","../bin/Components/Composites/ParallelSelectorNode.js","../bin/Components/Composites/RandomSequenceNode.js","../bin/Components/Composites/RandomSelectorNode.js","../bin/Components/Composites/SubTreeNode.js","../bin/Components/DecoratorNodeComponent.js","../bin/Components/Decorators/InverterNode.js","../bin/Components/Decorators/RepeaterNode.js","../bin/Components/Decorators/UntilSuccessNode.js","../bin/Components/Decorators/UntilFailNode.js","../bin/Components/Decorators/AlwaysSucceedNode.js","../bin/Components/Decorators/AlwaysFailNode.js","../bin/Components/Decorators/ConditionalNode.js","../bin/Components/Decorators/CooldownNode.js","../bin/Components/Decorators/TimeoutNode.js","../bin/Components/BehaviorTreeNode.js","../bin/Services/GlobalBlackboardService.js","../bin/Components/BlackboardComponent.js","../bin/Components/ActiveNode.js","../bin/Components/PropertyBindings.js","../bin/Components/LogOutput.js","../bin/Components/AssetMetadata.js","../bin/Components/Composites/RootNode.js","../../../node_modules/@msgpack/msgpack/dist.esm/utils/utf8.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/ExtData.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/DecodeError.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/utils/int.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/timestamp.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/ExtensionCodec.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/utils/typedArrays.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/Encoder.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/utils/prettyByte.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/Decoder.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/CachedKeyDecoder.mjs","../../../node_modules/@msgpack/msgpack/dist.esm/decode.mjs","../bin/Serialization/BehaviorTreeAsset.js","../bin/Systems/RootExecutionSystem.js","../bin/Serialization/EditorFormatConverter.js","../bin/Serialization/BehaviorTreeAssetSerializer.js","../../../node_modules/@msgpack/msgpack/dist.esm/encode.mjs","../bin/Services/FileSystemAssetLoader.js","../bin/Serialization/BehaviorTreeAssetLoader.js","../bin/Services/AssetLoadingTypes.js","../bin/Systems/LeafExecutionSystem.js","../bin/Systems/DecoratorExecutionSystem.js","../bin/Systems/CompositeExecutionSystem.js","../bin/Services/WorkspaceService.js","../bin/Services/AssetLoadingManager.js","../bin/Systems/SubTreeExecutionSystem.js","../bin/BehaviorTreePlugin.js","../bin/BehaviorTreeStarter.js","../bin/BehaviorTreeBuilder.js","../bin/Serialization/BehaviorTreePersistence.js","../bin/Serialization/NodeTemplates.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 var NodeType;\n(function (NodeType) {\n /** 复合节点 - 有多个子节点 */\n NodeType[\"Composite\"] = \"composite\";\n /** 装饰器节点 - 有一个子节点 */\n NodeType[\"Decorator\"] = \"decorator\";\n /** 动作节点 - 叶子节点 */\n NodeType[\"Action\"] = \"action\";\n /** 条件节点 - 叶子节点 */\n NodeType[\"Condition\"] = \"condition\";\n})(NodeType || (NodeType = {}));\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","/******************************************************************************\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 { NodeType } from '../Types/TaskStatus';\n/**\n * 节点类注册表\n */\nclass NodeClassRegistry {\n static registerNodeClass(constructor, metadata) {\n const key = `${metadata.category}:${metadata.displayName}`;\n this.nodeClasses.set(key, { metadata, constructor });\n }\n static getAllNodeClasses() {\n return Array.from(this.nodeClasses.values());\n }\n static getNodeClass(category, displayName) {\n const key = `${category}:${displayName}`;\n return this.nodeClasses.get(key)?.constructor;\n }\n static clear() {\n this.nodeClasses.clear();\n }\n}\nNodeClassRegistry.nodeClasses = new Map();\n/**\n * 行为树节点装饰器\n *\n * 用于标注一个类是可在编辑器中使用的行为树节点\n *\n * @example\n * ```typescript\n * @BehaviorNode({\n * displayName: '等待',\n * category: '动作',\n * type: NodeType.Action,\n * icon: 'Clock',\n * description: '等待指定时间',\n * color: '#9E9E9E'\n * })\n * class WaitNode extends Component {\n * @BehaviorProperty({\n * label: '持续时间',\n * type: 'number',\n * min: 0,\n * step: 0.1,\n * description: '等待时间(秒)'\n * })\n * duration: number = 1.0;\n * }\n * ```\n */\nexport function BehaviorNode(metadata) {\n return function (constructor) {\n const metadataWithClassName = {\n ...metadata,\n className: constructor.name\n };\n NodeClassRegistry.registerNodeClass(constructor, metadataWithClassName);\n return constructor;\n };\n}\n/**\n * 行为树属性装饰器\n *\n * 用于标注节点的可配置属性,这些属性会在编辑器中显示\n *\n * @example\n * ```typescript\n * @BehaviorNode({ ... })\n * class MyNode {\n * @BehaviorProperty({\n * label: '速度',\n * type: 'number',\n * min: 0,\n * max: 100,\n * description: '移动速度'\n * })\n * speed: number = 10;\n * }\n * ```\n */\nexport function BehaviorProperty(config) {\n return function (target, propertyKey) {\n if (!target.constructor.__nodeProperties) {\n target.constructor.__nodeProperties = [];\n }\n target.constructor.__nodeProperties.push({\n name: propertyKey,\n ...config\n });\n };\n}\n/**\n * @deprecated 使用 BehaviorProperty 代替\n */\nexport const NodeProperty = BehaviorProperty;\n/**\n * 获取所有注册的节点模板\n */\nexport function getRegisteredNodeTemplates() {\n return NodeClassRegistry.getAllNodeClasses().map(({ metadata, constructor }) => {\n // 从类的 __nodeProperties 收集属性定义\n const propertyDefs = constructor.__nodeProperties || [];\n const defaultConfig = {\n nodeType: metadata.type.toLowerCase()\n };\n // 从类的默认值中提取配置,并补充 defaultValue\n const instance = new constructor();\n const properties = propertyDefs.map((prop) => {\n const defaultValue = instance[prop.name];\n if (defaultValue !== undefined) {\n defaultConfig[prop.name] = defaultValue;\n }\n return {\n ...prop,\n defaultValue: defaultValue !== undefined ? defaultValue : prop.defaultValue\n };\n });\n // 添加子类型字段\n switch (metadata.type) {\n case NodeType.Composite:\n defaultConfig.compositeType = metadata.displayName;\n break;\n case NodeType.Decorator:\n defaultConfig.decoratorType = metadata.displayName;\n break;\n case NodeType.Action:\n defaultConfig.actionType = metadata.displayName;\n break;\n case NodeType.Condition:\n defaultConfig.conditionType = metadata.displayName;\n break;\n }\n return {\n type: metadata.type,\n displayName: metadata.displayName,\n category: metadata.category,\n icon: metadata.icon,\n description: metadata.description,\n color: metadata.color,\n className: metadata.className,\n requiresChildren: metadata.requiresChildren,\n defaultConfig,\n properties\n };\n });\n}\n/**\n * 清空所有注册的节点类\n */\nexport function clearRegisteredNodes() {\n NodeClassRegistry.clear();\n}\nexport { NodeClassRegistry };\n//# sourceMappingURL=BehaviorNodeDecorator.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 修改操作类型\n */\nexport var ModifyOperation;\n(function (ModifyOperation) {\n /** 加法 */\n ModifyOperation[\"Add\"] = \"add\";\n /** 减法 */\n ModifyOperation[\"Subtract\"] = \"subtract\";\n /** 乘法 */\n ModifyOperation[\"Multiply\"] = \"multiply\";\n /** 除法 */\n ModifyOperation[\"Divide\"] = \"divide\";\n /** 取模 */\n ModifyOperation[\"Modulo\"] = \"modulo\";\n /** 追加(数组/字符串) */\n ModifyOperation[\"Append\"] = \"append\";\n /** 移除(数组) */\n ModifyOperation[\"Remove\"] = \"remove\";\n})(ModifyOperation || (ModifyOperation = {}));\n/**\n * 修改黑板变量值动作组件\n *\n * 对黑板变量执行数学或逻辑操作\n */\nlet ModifyBlackboardValueAction = class ModifyBlackboardValueAction extends Component {\n constructor() {\n super(...arguments);\n this.variableName = '';\n this.operation = ModifyOperation.Add;\n this.operand = 0;\n this.force = false;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '变量名',\n type: 'variable',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ModifyBlackboardValueAction.prototype, \"variableName\", void 0);\n__decorate([\n BehaviorProperty({\n label: '操作类型',\n type: 'select',\n options: [\n { label: '加法', value: 'add' },\n { label: '减法', value: 'subtract' },\n { label: '乘法', value: 'multiply' },\n { label: '除法', value: 'divide' },\n { label: '取模', value: 'modulo' },\n { label: '追加', value: 'append' },\n { label: '移除', value: 'remove' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ModifyBlackboardValueAction.prototype, \"operation\", void 0);\n__decorate([\n BehaviorProperty({\n label: '操作数',\n type: 'string',\n description: '可以是固定值或变量引用 {{varName}}'\n }),\n Serialize(),\n __metadata(\"design:type\", Object)\n], ModifyBlackboardValueAction.prototype, \"operand\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], ModifyBlackboardValueAction.prototype, \"force\", void 0);\nModifyBlackboardValueAction = __decorate([\n BehaviorNode({\n displayName: '修改变量',\n category: '动作',\n type: NodeType.Action,\n icon: 'Calculator',\n description: '对黑板变量执行数学或逻辑操作',\n color: '#FF9800'\n }),\n ECSComponent('ModifyBlackboardValueAction'),\n Serializable({ version: 1 })\n], ModifyBlackboardValueAction);\nexport { ModifyBlackboardValueAction };\n//# sourceMappingURL=ModifyBlackboardValueAction.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 比较运算符\n */\nexport var CompareOperator;\n(function (CompareOperator) {\n /** 等于 */\n CompareOperator[\"Equal\"] = \"equal\";\n /** 不等于 */\n CompareOperator[\"NotEqual\"] = \"notEqual\";\n /** 大于 */\n CompareOperator[\"Greater\"] = \"greater\";\n /** 大于等于 */\n CompareOperator[\"GreaterOrEqual\"] = \"greaterOrEqual\";\n /** 小于 */\n CompareOperator[\"Less\"] = \"less\";\n /** 小于等于 */\n CompareOperator[\"LessOrEqual\"] = \"lessOrEqual\";\n /** 包含(字符串/数组) */\n CompareOperator[\"Contains\"] = \"contains\";\n /** 正则匹配 */\n CompareOperator[\"Matches\"] = \"matches\";\n})(CompareOperator || (CompareOperator = {}));\n/**\n * 黑板变量比较条件组件\n *\n * 比较黑板变量与指定值或另一个变量\n */\nlet BlackboardCompareCondition = class BlackboardCompareCondition extends Component {\n constructor() {\n super(...arguments);\n this.variableName = '';\n this.operator = CompareOperator.Equal;\n this.compareValue = null;\n this.invertResult = false;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '变量名',\n type: 'variable',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], BlackboardCompareCondition.prototype, \"variableName\", void 0);\n__decorate([\n BehaviorProperty({\n label: '运算符',\n type: 'select',\n options: [\n { label: '等于', value: 'equal' },\n { label: '不等于', value: 'notEqual' },\n { label: '大于', value: 'greater' },\n { label: '大于等于', value: 'greaterOrEqual' },\n { label: '小于', value: 'less' },\n { label: '小于等于', value: 'lessOrEqual' },\n { label: '包含', value: 'contains' },\n { label: '正则匹配', value: 'matches' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], BlackboardCompareCondition.prototype, \"operator\", void 0);\n__decorate([\n BehaviorProperty({\n label: '比较值',\n type: 'string',\n description: '可以是固定值或变量引用 {{varName}}'\n }),\n Serialize(),\n __metadata(\"design:type\", Object)\n], BlackboardCompareCondition.prototype, \"compareValue\", void 0);\n__decorate([\n BehaviorProperty({\n label: '反转结果',\n type: 'boolean'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], BlackboardCompareCondition.prototype, \"invertResult\", void 0);\nBlackboardCompareCondition = __decorate([\n BehaviorNode({\n displayName: '比较变量',\n category: '条件',\n type: NodeType.Condition,\n icon: 'Scale',\n description: '比较黑板变量与指定值',\n color: '#2196F3'\n }),\n ECSComponent('BlackboardCompareCondition'),\n Serializable({ version: 1 })\n], BlackboardCompareCondition);\nexport { BlackboardCompareCondition };\n//# sourceMappingURL=BlackboardCompareCondition.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 执行自定义函数动作组件\n *\n * 允许用户提供自定义的动作执行函数\n */\nlet ExecuteAction = class ExecuteAction extends Component {\n constructor() {\n super(...arguments);\n this.actionCode = 'return TaskStatus.Success;';\n this.parameters = {};\n }\n /**\n * 获取或编译执行函数\n */\n getFunction() {\n if (!this.compiledFunction && this.actionCode) {\n try {\n const func = new Function('entity', 'blackboard', 'deltaTime', 'parameters', 'TaskStatus', `\n const { Success, Failure, Running, Invalid } = TaskStatus;\n try {\n ${this.actionCode}\n } catch (error) {\n return TaskStatus.Failure;\n }\n `);\n this.compiledFunction = (entity, blackboard, deltaTime) => {\n return func(entity, blackboard, deltaTime, this.parameters, TaskStatus) || TaskStatus.Success;\n };\n }\n catch (error) {\n return undefined;\n }\n }\n return this.compiledFunction;\n }\n /**\n * 设置自定义函数(运行时使用)\n */\n setFunction(func) {\n this.compiledFunction = func;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '动作代码',\n type: 'code',\n description: 'JavaScript 代码,返回 TaskStatus',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ExecuteAction.prototype, \"actionCode\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Object)\n], ExecuteAction.prototype, \"parameters\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Function)\n], ExecuteAction.prototype, \"compiledFunction\", void 0);\nExecuteAction = __decorate([\n BehaviorNode({\n displayName: '自定义动作',\n category: '动作',\n type: NodeType.Action,\n icon: 'Code',\n description: '执行自定义代码',\n color: '#FFC107'\n }),\n ECSComponent('ExecuteAction'),\n Serializable({ version: 1 })\n], ExecuteAction);\nexport { ExecuteAction };\n//# sourceMappingURL=ExecuteAction.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 等待动作组件\n *\n * 等待指定时间后返回成功\n */\nlet WaitAction = class WaitAction extends Component {\n constructor() {\n super(...arguments);\n this.waitTime = 1.0;\n /** 已等待时间(秒) */\n this.elapsedTime = 0;\n }\n /**\n * 重置等待状态\n */\n reset() {\n this.elapsedTime = 0;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '等待时间',\n type: 'number',\n min: 0,\n step: 0.1,\n description: '等待时间(秒)',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", Number)\n], WaitAction.prototype, \"waitTime\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], WaitAction.prototype, \"elapsedTime\", void 0);\nWaitAction = __decorate([\n BehaviorNode({\n displayName: '等待',\n category: '动作',\n type: NodeType.Action,\n icon: 'Clock',\n description: '等待指定时间',\n color: '#9E9E9E'\n }),\n ECSComponent('WaitAction'),\n Serializable({ version: 1 })\n], WaitAction);\nexport { WaitAction };\n//# sourceMappingURL=WaitAction.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 日志动作组件\n *\n * 输出日志信息\n */\nlet LogAction = class LogAction extends Component {\n constructor() {\n super(...arguments);\n this.message = 'Hello';\n this.level = 'log';\n this.includeEntityInfo = false;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '消息',\n type: 'string',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], LogAction.prototype, \"message\", void 0);\n__decorate([\n BehaviorProperty({\n label: '级别',\n type: 'select',\n options: [\n { label: 'Log', value: 'log' },\n { label: 'Info', value: 'info' },\n { label: 'Warn', value: 'warn' },\n { label: 'Error', value: 'error' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], LogAction.prototype, \"level\", void 0);\n__decorate([\n BehaviorProperty({\n label: '包含实体信息',\n type: 'boolean'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], LogAction.prototype, \"includeEntityInfo\", void 0);\nLogAction = __decorate([\n BehaviorNode({\n displayName: '日志',\n category: '动作',\n type: NodeType.Action,\n icon: 'FileText',\n description: '输出日志消息',\n color: '#673AB7'\n }),\n ECSComponent('LogAction'),\n Serializable({ version: 1 })\n], LogAction);\nexport { LogAction };\n//# sourceMappingURL=LogAction.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 设置黑板变量值动作组件\n *\n * 将指定值或另一个黑板变量的值设置到目标变量\n */\nlet SetBlackboardValueAction = class SetBlackboardValueAction extends Component {\n constructor() {\n super(...arguments);\n this.variableName = '';\n this.value = '';\n this.force = false;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '变量名',\n type: 'variable',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], SetBlackboardValueAction.prototype, \"variableName\", void 0);\n__decorate([\n BehaviorProperty({\n label: '值',\n type: 'string',\n description: '可以使用 {{varName}} 引用其他变量'\n }),\n Serialize(),\n __metadata(\"design:type\", Object)\n], SetBlackboardValueAction.prototype, \"value\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], SetBlackboardValueAction.prototype, \"sourceVariable\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], SetBlackboardValueAction.prototype, \"force\", void 0);\nSetBlackboardValueAction = __decorate([\n BehaviorNode({\n displayName: '设置变量',\n category: '动作',\n type: NodeType.Action,\n icon: 'Edit',\n description: '设置黑板变量的值',\n color: '#3F51B5'\n }),\n ECSComponent('SetBlackboardValueAction'),\n Serializable({ version: 1 })\n], SetBlackboardValueAction);\nexport { SetBlackboardValueAction };\n//# sourceMappingURL=SetBlackboardValueAction.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 黑板变量存在性检查条件组件\n *\n * 检查黑板变量是否存在\n */\nlet BlackboardExistsCondition = class BlackboardExistsCondition extends Component {\n constructor() {\n super(...arguments);\n this.variableName = '';\n this.checkNotNull = false;\n this.invertResult = false;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '变量名',\n type: 'variable',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], BlackboardExistsCondition.prototype, \"variableName\", void 0);\n__decorate([\n BehaviorProperty({\n label: '检查非空',\n type: 'boolean',\n description: '检查值不为 null/undefined'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], BlackboardExistsCondition.prototype, \"checkNotNull\", void 0);\n__decorate([\n BehaviorProperty({\n label: '反转结果',\n type: 'boolean',\n description: '检查不存在'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], BlackboardExistsCondition.prototype, \"invertResult\", void 0);\nBlackboardExistsCondition = __decorate([\n BehaviorNode({\n displayName: '检查变量存在',\n category: '条件',\n type: NodeType.Condition,\n icon: 'Search',\n description: '检查黑板变量是否存在',\n color: '#00BCD4'\n }),\n ECSComponent('BlackboardExistsCondition'),\n Serializable({ version: 1 })\n], BlackboardExistsCondition);\nexport { BlackboardExistsCondition };\n//# sourceMappingURL=BlackboardExistsCondition.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 随机概率条件组件\n *\n * 根据概率返回成功或失败\n */\nlet RandomProbabilityCondition = class RandomProbabilityCondition extends Component {\n constructor() {\n super(...arguments);\n this.probability = 0.5;\n this.alwaysRandomize = true;\n }\n /**\n * 评估随机概率\n */\n evaluate() {\n if (this.alwaysRandomize || this.cachedResult === undefined) {\n this.cachedResult = Math.random() < this.probability;\n }\n return this.cachedResult;\n }\n /**\n * 重置缓存\n */\n reset() {\n this.cachedResult = undefined;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '成功概率',\n type: 'number',\n min: 0,\n max: 1,\n step: 0.1,\n description: '0.0 - 1.0',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", Number)\n], RandomProbabilityCondition.prototype, \"probability\", void 0);\n__decorate([\n BehaviorProperty({\n label: '总是重新随机',\n type: 'boolean',\n description: 'false则第一次随机后固定结果'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], RandomProbabilityCondition.prototype, \"alwaysRandomize\", void 0);\nRandomProbabilityCondition = __decorate([\n BehaviorNode({\n displayName: '随机概率',\n category: '条件',\n type: NodeType.Condition,\n icon: 'Dice',\n description: '根据概率返回成功或失败',\n color: '#E91E63'\n }),\n ECSComponent('RandomProbabilityCondition'),\n Serializable({ version: 1 })\n], RandomProbabilityCondition);\nexport { RandomProbabilityCondition };\n//# sourceMappingURL=RandomProbabilityCondition.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * 执行自定义条件组件\n *\n * 允许用户提供自定义的条件检查函数\n */\nlet ExecuteCondition = class ExecuteCondition extends Component {\n constructor() {\n super(...arguments);\n this.parameters = {};\n this.invertResult = false;\n }\n /**\n * 获取或编译条件函数\n */\n getFunction() {\n if (!this.compiledFunction && this.conditionCode) {\n try {\n const func = new Function('entity', 'blackboard', 'deltaTime', 'parameters', `\n try {\n ${this.conditionCode}\n } catch (error) {\n return false;\n }\n `);\n this.compiledFunction = (entity, blackboard, deltaTime) => {\n return Boolean(func(entity, blackboard, deltaTime, this.parameters));\n };\n }\n catch (error) {\n return undefined;\n }\n }\n return this.compiledFunction;\n }\n /**\n * 设置自定义函数(运行时使用)\n */\n setFunction(func) {\n this.compiledFunction = func;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '条件代码',\n type: 'code',\n description: 'JavaScript 代码,返回 boolean',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ExecuteCondition.prototype, \"conditionCode\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Object)\n], ExecuteCondition.prototype, \"parameters\", void 0);\n__decorate([\n BehaviorProperty({\n label: '反转结果',\n type: 'boolean'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], ExecuteCondition.prototype, \"invertResult\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Function)\n], ExecuteCondition.prototype, \"compiledFunction\", void 0);\nExecuteCondition = __decorate([\n BehaviorNode({\n displayName: '自定义条件',\n category: '条件',\n type: NodeType.Condition,\n icon: 'Code',\n description: '执行自定义条件代码',\n color: '#9C27B0'\n }),\n ECSComponent('ExecuteCondition'),\n Serializable({ version: 1 })\n], ExecuteCondition);\nexport { ExecuteCondition };\n//# sourceMappingURL=ExecuteCondition.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { CompositeType } from '../Types/TaskStatus';\n/**\n * 复合节点组件\n *\n * 用于标识复合节点类型(Sequence, Selector, Parallel等)\n */\nlet CompositeNodeComponent = class CompositeNodeComponent extends Component {\n constructor() {\n super(...arguments);\n /** 复合节点类型 */\n this.compositeType = CompositeType.Sequence;\n /** 随机化的子节点索引顺序 */\n this.shuffledIndices = [];\n /** 是否在重启时重新洗牌(子类可选) */\n this.reshuffleOnRestart = true;\n }\n /**\n * 获取下一个子节点索引\n */\n getNextChildIndex(currentIndex, totalChildren) {\n // 对于随机类型,使用洗牌后的索引\n if (this.compositeType === CompositeType.RandomSequence ||\n this.compositeType === CompositeType.RandomSelector) {\n // 首次执行或需要重新洗牌\n if (this.shuffledIndices.length === 0 || currentIndex === 0 && this.reshuffleOnRestart) {\n this.shuffleIndices(totalChildren);\n }\n if (currentIndex < this.shuffledIndices.length) {\n return this.shuffledIndices[currentIndex];\n }\n return totalChildren; // 结束\n }\n // 普通顺序执行\n return currentIndex;\n }\n /**\n * 洗牌子节点索引\n */\n shuffleIndices(count) {\n this.shuffledIndices = Array.from({ length: count }, (_, i) => i);\n // Fisher-Yates 洗牌算法\n for (let i = this.shuffledIndices.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [this.shuffledIndices[i], this.shuffledIndices[j]] =\n [this.shuffledIndices[j], this.shuffledIndices[i]];\n }\n }\n /**\n * 重置洗牌状态\n */\n resetShuffle() {\n this.shuffledIndices = [];\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], CompositeNodeComponent.prototype, \"compositeType\", void 0);\nCompositeNodeComponent = __decorate([\n ECSComponent('CompositeNode'),\n Serializable({ version: 1 })\n], CompositeNodeComponent);\nexport { CompositeNodeComponent };\n//# sourceMappingURL=CompositeNodeComponent.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType, AbortType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 序列节点\n *\n * 按顺序执行所有子节点,全部成功才成功\n */\nlet SequenceNode = class SequenceNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.abortType = AbortType.None;\n this.compositeType = CompositeType.Sequence;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '中止类型',\n type: 'select',\n description: '条件变化时的中止行为',\n options: [\n { label: '无', value: 'none' },\n { label: '自身', value: 'self' },\n { label: '低优先级', value: 'lower-priority' },\n { label: '两者', value: 'both' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], SequenceNode.prototype, \"abortType\", void 0);\nSequenceNode = __decorate([\n BehaviorNode({\n displayName: '序列',\n category: '组合',\n type: NodeType.Composite,\n icon: 'List',\n description: '按顺序执行子节点,全部成功才成功',\n color: '#4CAF50'\n }),\n ECSComponent('SequenceNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], SequenceNode);\nexport { SequenceNode };\n//# sourceMappingURL=SequenceNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType, AbortType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 选择节点\n *\n * 按顺序执行子节点,任一成功则成功\n */\nlet SelectorNode = class SelectorNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.abortType = AbortType.None;\n this.compositeType = CompositeType.Selector;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '中止类型',\n type: 'select',\n description: '条件变化时的中止行为',\n options: [\n { label: '无', value: 'none' },\n { label: '自身', value: 'self' },\n { label: '低优先级', value: 'lower-priority' },\n { label: '两者', value: 'both' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], SelectorNode.prototype, \"abortType\", void 0);\nSelectorNode = __decorate([\n BehaviorNode({\n displayName: '选择',\n category: '组合',\n type: NodeType.Composite,\n icon: 'GitBranch',\n description: '按顺序执行子节点,任一成功则成功',\n color: '#8BC34A'\n }),\n ECSComponent('SelectorNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], SelectorNode);\nexport { SelectorNode };\n//# sourceMappingURL=SelectorNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 并行节点\n *\n * 同时执行所有子节点\n */\nlet ParallelNode = class ParallelNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.successPolicy = 'all';\n this.failurePolicy = 'one';\n this.compositeType = CompositeType.Parallel;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '成功策略',\n type: 'select',\n description: '多少个子节点成功时整体成功',\n options: [\n { label: '全部成功', value: 'all' },\n { label: '任意一个成功', value: 'one' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ParallelNode.prototype, \"successPolicy\", void 0);\n__decorate([\n BehaviorProperty({\n label: '失败策略',\n type: 'select',\n description: '多少个子节点失败时整体失败',\n options: [\n { label: '任意一个失败', value: 'one' },\n { label: '全部失败', value: 'all' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ParallelNode.prototype, \"failurePolicy\", void 0);\nParallelNode = __decorate([\n BehaviorNode({\n displayName: '并行',\n category: '组合',\n type: NodeType.Composite,\n icon: 'Layers',\n description: '同时执行所有子节点',\n color: '#CDDC39'\n }),\n ECSComponent('ParallelNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], ParallelNode);\nexport { ParallelNode };\n//# sourceMappingURL=ParallelNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 并行选择节点\n *\n * 并行执行子节点,任一成功则成功\n */\nlet ParallelSelectorNode = class ParallelSelectorNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.failurePolicy = 'all';\n this.compositeType = CompositeType.ParallelSelector;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '失败策略',\n type: 'select',\n description: '多少个子节点失败时整体失败',\n options: [\n { label: '任意一个失败', value: 'one' },\n { label: '全部失败', value: 'all' }\n ]\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ParallelSelectorNode.prototype, \"failurePolicy\", void 0);\nParallelSelectorNode = __decorate([\n BehaviorNode({\n displayName: '并行选择',\n category: '组合',\n type: NodeType.Composite,\n icon: 'Sparkles',\n description: '并行执行子节点,任一成功则成功',\n color: '#FFC107'\n }),\n ECSComponent('ParallelSelectorNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], ParallelSelectorNode);\nexport { ParallelSelectorNode };\n//# sourceMappingURL=ParallelSelectorNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 随机序列节点\n *\n * 随机顺序执行子节点序列\n */\nlet RandomSequenceNode = class RandomSequenceNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.reshuffleOnRestart = true;\n this.compositeType = CompositeType.RandomSequence;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '重启时重新洗牌',\n type: 'boolean',\n description: '每次重启时是否重新随机子节点顺序'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], RandomSequenceNode.prototype, \"reshuffleOnRestart\", void 0);\nRandomSequenceNode = __decorate([\n BehaviorNode({\n displayName: '随机序列',\n category: '组合',\n type: NodeType.Composite,\n icon: 'Shuffle',\n description: '随机顺序执行子节点序列',\n color: '#FF5722'\n }),\n ECSComponent('RandomSequenceNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], RandomSequenceNode);\nexport { RandomSequenceNode };\n//# sourceMappingURL=RandomSequenceNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 随机选择节点\n *\n * 随机顺序执行子节点选择\n */\nlet RandomSelectorNode = class RandomSelectorNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.reshuffleOnRestart = true;\n this.compositeType = CompositeType.RandomSelector;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '重启时重新洗牌',\n type: 'boolean',\n description: '每次重启时是否重新随机子节点顺序'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], RandomSelectorNode.prototype, \"reshuffleOnRestart\", void 0);\nRandomSelectorNode = __decorate([\n BehaviorNode({\n displayName: '随机选择',\n category: '组合',\n type: NodeType.Composite,\n icon: 'Dices',\n description: '随机顺序执行子节点选择',\n color: '#F44336'\n }),\n ECSComponent('RandomSelectorNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], RandomSelectorNode);\nexport { RandomSelectorNode };\n//# sourceMappingURL=RandomSelectorNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent, Serializable, Serialize } from '@esengine/ecs-framework';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\nimport { TaskStatus, NodeType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\n/**\n * SubTree 节点 - 引用其他行为树作为子树\n *\n * 允许将其他行为树嵌入到当前树中,实现行为树的复用和模块化。\n *\n * 注意:SubTreeNode 是一个特殊的叶子节点,它不会执行编辑器中静态连接的子节点,\n * 只会执行从 assetId 动态加载的外部行为树文件。\n *\n * @example\n * ```typescript\n * const subTree = entity.addComponent(SubTreeNode);\n * subTree.assetId = 'patrol';\n * subTree.inheritParentBlackboard = true;\n * ```\n */\nlet SubTreeNode = class SubTreeNode extends CompositeNodeComponent {\n constructor() {\n super(...arguments);\n /**\n * 引用的子树资产ID\n * 逻辑标识符,例如 'patrol' 或 'ai/patrol'\n * 实际的文件路径由 AssetLoader 决定\n */\n this.assetId = '';\n /**\n * 是否将父黑板传递给子树\n *\n * - true: 子树可以访问和修改父树的黑板变量\n * - false: 子树使用独立的黑板实例\n */\n this.inheritParentBlackboard = true;\n /**\n * 子树执行失败时是否传播失败状态\n *\n * - true: 子树失败时,SubTree 节点返回 Failure\n * - false: 子树失败时,SubTree 节点返回 Success(忽略失败)\n */\n this.propagateFailure = true;\n /**\n * 是否在行为树启动时预加载子树\n *\n * - true: 在根节点开始执行前预加载此子树,确保执行时子树已就绪\n * - false: 运行时异步加载,执行到此节点时才开始加载(可能会有延迟)\n */\n this.preload = true;\n /**\n * 子树是否已完成\n */\n this.subTreeCompleted = false;\n /**\n * 子树的最终状态\n */\n this.subTreeResult = TaskStatus.Invalid;\n }\n /**\n * 获取子树根实体\n */\n getSubTreeRoot() {\n return this.subTreeRoot;\n }\n /**\n * 设置子树根实体(由执行系统调用)\n */\n setSubTreeRoot(root) {\n this.subTreeRoot = root;\n this.subTreeCompleted = false;\n this.subTreeResult = TaskStatus.Invalid;\n }\n /**\n * 标记子树完成(由执行系统调用)\n */\n markSubTreeCompleted(result) {\n this.subTreeCompleted = true;\n this.subTreeResult = result;\n }\n /**\n * 检查子树是否已完成\n */\n isSubTreeCompleted() {\n return this.subTreeCompleted;\n }\n /**\n * 获取子树执行结果\n */\n getSubTreeResult() {\n return this.subTreeResult;\n }\n /**\n * 重置子树状态\n */\n reset() {\n this.subTreeRoot = undefined;\n this.subTreeCompleted = false;\n this.subTreeResult = TaskStatus.Invalid;\n }\n /**\n * 重置完成状态(用于复用预加载的子树)\n * 保留子树根引用,只重置完成标记\n */\n resetCompletionState() {\n this.subTreeCompleted = false;\n this.subTreeResult = TaskStatus.Invalid;\n }\n /**\n * 验证配置\n */\n validate() {\n const errors = [];\n if (!this.assetId || this.assetId.trim() === '') {\n errors.push('SubTree 节点必须指定资产ID');\n }\n return errors;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '资产ID',\n type: 'asset',\n description: '要引用的行为树资产ID'\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], SubTreeNode.prototype, \"assetId\", void 0);\n__decorate([\n BehaviorProperty({\n label: '继承父黑板',\n type: 'boolean',\n description: '子树是否可以访问父树的黑板变量'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], SubTreeNode.prototype, \"inheritParentBlackboard\", void 0);\n__decorate([\n BehaviorProperty({\n label: '传播失败',\n type: 'boolean',\n description: '子树失败时是否传播失败状态'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], SubTreeNode.prototype, \"propagateFailure\", void 0);\n__decorate([\n BehaviorProperty({\n label: '预加载',\n type: 'boolean',\n description: '在行为树启动时预加载子树,避免运行时加载延迟'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], SubTreeNode.prototype, \"preload\", void 0);\nSubTreeNode = __decorate([\n BehaviorNode({\n displayName: '子树',\n category: '组合',\n type: NodeType.Composite,\n icon: 'GitBranch',\n description: '引用并执行外部行为树文件(不支持静态子节点)',\n color: '#FF9800',\n requiresChildren: false\n }),\n ECSComponent('SubTreeNode'),\n Serializable({ version: 1 })\n], SubTreeNode);\nexport { SubTreeNode };\n//# sourceMappingURL=SubTreeNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { DecoratorType } from '../Types/TaskStatus';\n/**\n * 装饰器节点组件基类\n *\n * 只包含通用的装饰器类型标识\n * 具体的属性由各个子类自己定义\n */\nlet DecoratorNodeComponent = class DecoratorNodeComponent extends Component {\n constructor() {\n super(...arguments);\n /** 装饰器类型 */\n this.decoratorType = DecoratorType.Inverter;\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], DecoratorNodeComponent.prototype, \"decoratorType\", void 0);\nDecoratorNodeComponent = __decorate([\n ECSComponent('DecoratorNode'),\n Serializable({ version: 1 })\n], DecoratorNodeComponent);\nexport { DecoratorNodeComponent };\n//# sourceMappingURL=DecoratorNodeComponent.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 反转节点\n *\n * 反转子节点的执行结果\n */\nlet InverterNode = class InverterNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.decoratorType = DecoratorType.Inverter;\n }\n};\nInverterNode = __decorate([\n BehaviorNode({\n displayName: '反转',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'RotateCcw',\n description: '反转子节点的执行结果',\n color: '#607D8B'\n }),\n ECSComponent('InverterNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], InverterNode);\nexport { InverterNode };\n//# sourceMappingURL=InverterNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 重复节点\n *\n * 重复执行子节点指定次数\n */\nlet RepeaterNode = class RepeaterNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.repeatCount = 1;\n this.endOnFailure = false;\n /** 当前已重复次数 */\n this.currentRepeatCount = 0;\n this.decoratorType = DecoratorType.Repeater;\n }\n /**\n * 增加重复计数\n */\n incrementRepeat() {\n this.currentRepeatCount++;\n }\n /**\n * 检查是否应该继续重复\n */\n shouldContinueRepeat() {\n if (this.repeatCount === -1) {\n return true;\n }\n return this.currentRepeatCount < this.repeatCount;\n }\n /**\n * 重置状态\n */\n reset() {\n this.currentRepeatCount = 0;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '重复次数',\n type: 'number',\n min: -1,\n step: 1,\n description: '-1表示无限重复',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", Number)\n], RepeaterNode.prototype, \"repeatCount\", void 0);\n__decorate([\n BehaviorProperty({\n label: '失败时停止',\n type: 'boolean',\n description: '子节点失败时是否停止重复'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], RepeaterNode.prototype, \"endOnFailure\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], RepeaterNode.prototype, \"currentRepeatCount\", void 0);\nRepeaterNode = __decorate([\n BehaviorNode({\n displayName: '重复',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'Repeat',\n description: '重复执行子节点指定次数',\n color: '#9E9E9E'\n }),\n ECSComponent('RepeaterNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], RepeaterNode);\nexport { RepeaterNode };\n//# sourceMappingURL=RepeaterNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 直到成功节点\n *\n * 重复执行子节点直到成功\n */\nlet UntilSuccessNode = class UntilSuccessNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.decoratorType = DecoratorType.UntilSuccess;\n }\n};\nUntilSuccessNode = __decorate([\n BehaviorNode({\n displayName: '直到成功',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'CheckCircle',\n description: '重复执行子节点直到成功',\n color: '#4CAF50'\n }),\n ECSComponent('UntilSuccessNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], UntilSuccessNode);\nexport { UntilSuccessNode };\n//# sourceMappingURL=UntilSuccessNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 直到失败节点\n *\n * 重复执行子节点直到失败\n */\nlet UntilFailNode = class UntilFailNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.decoratorType = DecoratorType.UntilFail;\n }\n};\nUntilFailNode = __decorate([\n BehaviorNode({\n displayName: '直到失败',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'XCircle',\n description: '重复执行子节点直到失败',\n color: '#F44336'\n }),\n ECSComponent('UntilFailNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], UntilFailNode);\nexport { UntilFailNode };\n//# sourceMappingURL=UntilFailNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 总是成功节点\n *\n * 无论子节点结果如何都返回成功\n */\nlet AlwaysSucceedNode = class AlwaysSucceedNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.decoratorType = DecoratorType.AlwaysSucceed;\n }\n};\nAlwaysSucceedNode = __decorate([\n BehaviorNode({\n displayName: '总是成功',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'ThumbsUp',\n description: '无论子节点结果如何都返回成功',\n color: '#8BC34A'\n }),\n ECSComponent('AlwaysSucceedNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], AlwaysSucceedNode);\nexport { AlwaysSucceedNode };\n//# sourceMappingURL=AlwaysSucceedNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 总是失败节点\n *\n * 无论子节点结果如何都返回失败\n */\nlet AlwaysFailNode = class AlwaysFailNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.decoratorType = DecoratorType.AlwaysFail;\n }\n};\nAlwaysFailNode = __decorate([\n BehaviorNode({\n displayName: '总是失败',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'ThumbsDown',\n description: '无论子节点结果如何都返回失败',\n color: '#FF5722'\n }),\n ECSComponent('AlwaysFailNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], AlwaysFailNode);\nexport { AlwaysFailNode };\n//# sourceMappingURL=AlwaysFailNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 条件装饰器节点\n *\n * 基于条件判断是否执行子节点\n */\nlet ConditionalNode = class ConditionalNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.shouldReevaluate = true;\n this.decoratorType = DecoratorType.Conditional;\n }\n /**\n * 评估条件\n */\n evaluateCondition(entity, blackboard) {\n if (!this.conditionCode) {\n return false;\n }\n if (!this.compiledCondition) {\n try {\n const func = new Function('entity', 'blackboard', `\n try {\n return Boolean(${this.conditionCode});\n } catch (error) {\n return false;\n }\n `);\n this.compiledCondition = (entity, blackboard) => {\n return Boolean(func(entity, blackboard));\n };\n }\n catch (error) {\n return false;\n }\n }\n return this.compiledCondition(entity, blackboard);\n }\n /**\n * 设置条件函数(运行时使用)\n */\n setConditionFunction(func) {\n this.compiledCondition = func;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '条件代码',\n type: 'code',\n description: 'JavaScript 代码,返回 boolean',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", String)\n], ConditionalNode.prototype, \"conditionCode\", void 0);\n__decorate([\n BehaviorProperty({\n label: '重新评估条件',\n type: 'boolean',\n description: '每次执行时是否重新评估条件'\n }),\n Serialize(),\n __metadata(\"design:type\", Boolean)\n], ConditionalNode.prototype, \"shouldReevaluate\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Function)\n], ConditionalNode.prototype, \"compiledCondition\", void 0);\nConditionalNode = __decorate([\n BehaviorNode({\n displayName: '条件装饰器',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'Filter',\n description: '基于条件判断是否执行子节点',\n color: '#3F51B5'\n }),\n ECSComponent('ConditionalNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], ConditionalNode);\nexport { ConditionalNode };\n//# sourceMappingURL=ConditionalNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 冷却节点\n *\n * 在冷却时间内阻止子节点执行\n */\nlet CooldownNode = class CooldownNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.cooldownTime = 1.0;\n /** 上次执行时间 */\n this.lastExecutionTime = 0;\n this.decoratorType = DecoratorType.Cooldown;\n }\n /**\n * 检查是否可以执行\n */\n canExecute(currentTime) {\n // 如果从未执行过,允许执行\n if (this.lastExecutionTime === 0) {\n return true;\n }\n return currentTime - this.lastExecutionTime >= this.cooldownTime;\n }\n /**\n * 记录执行时间\n */\n recordExecution(currentTime) {\n this.lastExecutionTime = currentTime;\n }\n /**\n * 重置状态\n */\n reset() {\n this.lastExecutionTime = 0;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '冷却时间',\n type: 'number',\n min: 0,\n step: 0.1,\n description: '冷却时间(秒)',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", Number)\n], CooldownNode.prototype, \"cooldownTime\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], CooldownNode.prototype, \"lastExecutionTime\", void 0);\nCooldownNode = __decorate([\n BehaviorNode({\n displayName: '冷却',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'Timer',\n description: '在冷却时间内阻止子节点执行',\n color: '#00BCD4'\n }),\n ECSComponent('CooldownNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], CooldownNode);\nexport { CooldownNode };\n//# sourceMappingURL=CooldownNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { NodeType, DecoratorType } from '../../Types/TaskStatus';\nimport { BehaviorNode, BehaviorProperty } from '../../Decorators/BehaviorNodeDecorator';\nimport { DecoratorNodeComponent } from '../DecoratorNodeComponent';\n/**\n * 超时节点\n *\n * 子节点执行超时则返回失败\n */\nlet TimeoutNode = class TimeoutNode extends DecoratorNodeComponent {\n constructor() {\n super();\n this.timeoutDuration = 5.0;\n /** 开始执行时间 */\n this.startTime = 0;\n this.decoratorType = DecoratorType.Timeout;\n }\n /**\n * 记录开始时间\n */\n recordStartTime(currentTime) {\n if (this.startTime === 0) {\n this.startTime = currentTime;\n }\n }\n /**\n * 检查是否超时\n */\n isTimeout(currentTime) {\n if (this.startTime === 0) {\n return false;\n }\n return currentTime - this.startTime >= this.timeoutDuration;\n }\n /**\n * 重置状态\n */\n reset() {\n this.startTime = 0;\n }\n};\n__decorate([\n BehaviorProperty({\n label: '超时时间',\n type: 'number',\n min: 0,\n step: 0.1,\n description: '超时时间(秒)',\n required: true\n }),\n Serialize(),\n __metadata(\"design:type\", Number)\n], TimeoutNode.prototype, \"timeoutDuration\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], TimeoutNode.prototype, \"startTime\", void 0);\nTimeoutNode = __decorate([\n BehaviorNode({\n displayName: '超时',\n category: '装饰器',\n type: NodeType.Decorator,\n icon: 'Clock',\n description: '子节点执行超时则返回失败',\n color: '#FF9800'\n }),\n ECSComponent('TimeoutNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], TimeoutNode);\nexport { TimeoutNode };\n//# sourceMappingURL=TimeoutNode.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable, Serialize, IgnoreSerialization } from '@esengine/ecs-framework';\nimport { TaskStatus, NodeType } from '../Types/TaskStatus';\n/**\n * 行为树节点基础组件\n *\n * 所有行为树节点都必须包含此组件\n */\nlet BehaviorTreeNode = class BehaviorTreeNode extends Component {\n constructor() {\n super(...arguments);\n /** 节点类型 */\n this.nodeType = NodeType.Action;\n /** 节点名称(用于调试) */\n this.nodeName = 'Node';\n /** 当前执行状态 */\n this.status = TaskStatus.Invalid;\n /** 当前执行的子节点索引(用于复合节点) */\n this.currentChildIndex = 0;\n }\n /**\n * 重置节点状态\n */\n reset() {\n this.status = TaskStatus.Invalid;\n this.currentChildIndex = 0;\n }\n /**\n * 标记节点为失效(递归重置子节点)\n * 注意:此方法只重置当前节点,子节点需要在 System 中处理\n */\n invalidate() {\n this.reset();\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeNode.prototype, \"nodeType\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeNode.prototype, \"nodeName\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], BehaviorTreeNode.prototype, \"status\", void 0);\n__decorate([\n IgnoreSerialization(),\n __metadata(\"design:type\", Number)\n], BehaviorTreeNode.prototype, \"currentChildIndex\", void 0);\nBehaviorTreeNode = __decorate([\n ECSComponent('BehaviorTreeNode'),\n Serializable({ version: 1 })\n], BehaviorTreeNode);\nexport { BehaviorTreeNode };\n//# sourceMappingURL=BehaviorTreeNode.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 this.variables.set(name, {\n name,\n type,\n value: initialValue,\n readonly: options?.readonly ?? false,\n description: options?.description\n });\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 { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent, Core } from '@esengine/ecs-framework';\nimport { Serializable, Serialize } from '@esengine/ecs-framework';\nimport { GlobalBlackboardService } from '../Services/GlobalBlackboardService';\n/**\n * 黑板组件 - 用于节点间共享数据\n *\n * 支持分层查找:\n * 1. 先查找本地变量\n * 2. 如果找不到,自动查找全局 Blackboard\n *\n * 通常附加到行为树的根节点上\n */\nlet BlackboardComponent = class BlackboardComponent extends Component {\n constructor() {\n super(...arguments);\n /** 存储的本地变量 */\n this.variables = new Map();\n /** 是否启用全局 Blackboard 查找 */\n this.useGlobalBlackboard = true;\n }\n /**\n * 定义一个新变量\n */\n defineVariable(name, type, initialValue, options) {\n this.variables.set(name, {\n name,\n type,\n value: initialValue,\n readonly: options?.readonly ?? false,\n description: options?.description\n });\n }\n /**\n * 获取变量值\n * 先查找本地变量,找不到则查找全局变量\n */\n getValue(name) {\n const variable = this.variables.get(name);\n if (variable !== undefined) {\n return variable.value;\n }\n if (this.useGlobalBlackboard) {\n return Core.services.resolve(GlobalBlackboardService).getValue(name);\n }\n return undefined;\n }\n /**\n * 获取本地变量值(不查找全局)\n */\n getLocalValue(name) {\n const variable = this.variables.get(name);\n return variable?.value;\n }\n /**\n * 设置变量值\n * 优先设置本地变量,如果本地不存在且全局存在,则设置全局变量\n */\n setValue(name, value, force = false) {\n const variable = this.variables.get(name);\n if (variable) {\n if (variable.readonly && !force) {\n return false;\n }\n variable.value = value;\n return true;\n }\n if (this.useGlobalBlackboard) {\n return Core.services.resolve(GlobalBlackboardService).setValue(name, value, force);\n }\n return false;\n }\n /**\n * 设置本地变量值(不影响全局)\n */\n setLocalValue(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 if (this.variables.has(name)) {\n return true;\n }\n if (this.useGlobalBlackboard) {\n return Core.services.resolve(GlobalBlackboardService).hasVariable(name);\n }\n return false;\n }\n /**\n * 检查本地变量是否存在\n */\n hasLocalVariable(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 clear() {\n this.variables.clear();\n }\n /**\n * 启用/禁用全局 Blackboard 查找\n */\n setUseGlobalBlackboard(enabled) {\n this.useGlobalBlackboard = enabled;\n }\n /**\n * 是否启用全局 Blackboard 查找\n */\n isUsingGlobalBlackboard() {\n return this.useGlobalBlackboard;\n }\n /**\n * 获取所有变量(包括本地和全局)\n */\n getAllVariables() {\n const locals = Array.from(this.variables.values());\n if (this.useGlobalBlackboard) {\n const globals = Core.services.resolve(GlobalBlackboardService).getAllVariables();\n const localNames = new Set(this.variables.keys());\n const filteredGlobals = globals.filter(v => !localNames.has(v.name));\n return [...locals, ...filteredGlobals];\n }\n return locals;\n }\n /**\n * 获取全局 Blackboard 服务的引用\n */\n static getGlobalBlackboard() {\n return Core.services.resolve(GlobalBlackboardService);\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Map)\n], BlackboardComponent.prototype, \"variables\", void 0);\nBlackboardComponent = __decorate([\n ECSComponent('Blackboard'),\n Serializable({ version: 1 })\n], BlackboardComponent);\nexport { BlackboardComponent };\n//# sourceMappingURL=BlackboardComponent.js.map","import { __decorate } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\n/**\n * 活跃节点标记组件\n *\n * 标记当前应该被执行的节点。\n * 只有带有此组件的节点才会被各个执行系统处理。\n *\n * 这是一个标记组件(Tag Component),不包含数据,只用于标识。\n *\n * 执行流程:\n * 1. 初始时只有根节点带有 ActiveNode\n * 2. 父节点决定激活哪个子节点时,为子节点添加 ActiveNode\n * 3. 节点执行完成后移除 ActiveNode\n * 4. 通过这种方式实现按需执行,避免每帧遍历整棵树\n */\nlet ActiveNode = class ActiveNode extends Component {\n};\nActiveNode = __decorate([\n ECSComponent('ActiveNode')\n], ActiveNode);\nexport { ActiveNode };\n//# sourceMappingURL=ActiveNode.js.map","import { Component } from '@esengine/ecs-framework';\n/**\n * 属性绑定组件\n * 记录节点属性到黑板变量的绑定关系\n */\nexport class PropertyBindings extends Component {\n constructor() {\n super(...arguments);\n /**\n * 属性绑定映射\n * key: 属性名称 (如 'message')\n * value: 黑板变量名 (如 'test1')\n */\n this.bindings = new Map();\n }\n /**\n * 添加属性绑定\n */\n addBinding(propertyName, blackboardKey) {\n this.bindings.set(propertyName, blackboardKey);\n }\n /**\n * 获取属性绑定的黑板变量名\n */\n getBinding(propertyName) {\n return this.bindings.get(propertyName);\n }\n /**\n * 检查属性是否绑定到黑板变量\n */\n hasBinding(propertyName) {\n return this.bindings.has(propertyName);\n }\n /**\n * 清除所有绑定\n */\n clearBindings() {\n this.bindings.clear();\n }\n}\n//# sourceMappingURL=PropertyBindings.js.map","import { __decorate } from \"tslib\";\nimport { Component, ECSComponent } from '@esengine/ecs-framework';\n/**\n * 日志输出组件\n *\n * 存储运行时输出的日志信息,用于在UI中显示\n */\nlet LogOutput = class LogOutput extends Component {\n constructor() {\n super(...arguments);\n /**\n * 日志消息列表\n */\n this.messages = [];\n }\n /**\n * 添加日志消息\n */\n addMessage(message, level = 'log') {\n this.messages.push({\n timestamp: Date.now(),\n message,\n level\n });\n }\n /**\n * 清空日志\n */\n clear() {\n this.messages = [];\n }\n};\nLogOutput = __decorate([\n ECSComponent('LogOutput')\n], LogOutput);\nexport { LogOutput };\n//# sourceMappingURL=LogOutput.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { Component, ECSComponent, Serializable, Serialize } from '@esengine/ecs-framework';\n/**\n * 资产元数据组件\n *\n * 附加到从资产实例化的行为树根节点上,\n * 用于标记资产ID和版本信息,便于循环引用检测和调试。\n *\n * @example\n * ```typescript\n * const rootEntity = BehaviorTreeAssetLoader.instantiate(asset, scene);\n *\n * // 添加元数据\n * const metadata = rootEntity.addComponent(new BehaviorTreeAssetMetadata());\n * metadata.assetId = 'patrol';\n * metadata.assetVersion = '1.0.0';\n * ```\n */\nlet BehaviorTreeAssetMetadata = class BehaviorTreeAssetMetadata extends Component {\n constructor() {\n super(...arguments);\n /**\n * 资产ID\n */\n this.assetId = '';\n /**\n * 资产版本\n */\n this.assetVersion = '';\n /**\n * 资产名称\n */\n this.assetName = '';\n /**\n * 加载时间\n */\n this.loadedAt = 0;\n /**\n * 资产描述\n */\n this.description = '';\n }\n /**\n * 初始化\n */\n initialize(assetId, assetVersion, assetName) {\n this.assetId = assetId;\n this.assetVersion = assetVersion;\n this.assetName = assetName || assetId;\n this.loadedAt = Date.now();\n }\n};\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeAssetMetadata.prototype, \"assetId\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeAssetMetadata.prototype, \"assetVersion\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeAssetMetadata.prototype, \"assetName\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", Number)\n], BehaviorTreeAssetMetadata.prototype, \"loadedAt\", void 0);\n__decorate([\n Serialize(),\n __metadata(\"design:type\", String)\n], BehaviorTreeAssetMetadata.prototype, \"description\", void 0);\nBehaviorTreeAssetMetadata = __decorate([\n ECSComponent('BehaviorTreeAssetMetadata'),\n Serializable({ version: 1 })\n], BehaviorTreeAssetMetadata);\nexport { BehaviorTreeAssetMetadata };\n//# sourceMappingURL=AssetMetadata.js.map","import { __decorate, __metadata } from \"tslib\";\nimport { ECSComponent } from '@esengine/ecs-framework';\nimport { Serializable } from '@esengine/ecs-framework';\nimport { NodeType, CompositeType } from '../../Types/TaskStatus';\nimport { BehaviorNode } from '../../Decorators/BehaviorNodeDecorator';\nimport { CompositeNodeComponent } from '../CompositeNodeComponent';\n/**\n * 根节点\n *\n * 行为树的根节点,简单地激活第一个子节点\n */\nlet RootNode = class RootNode extends CompositeNodeComponent {\n constructor() {\n super();\n this.compositeType = CompositeType.Sequence;\n }\n};\nRootNode = __decorate([\n BehaviorNode({\n displayName: '根节点',\n category: '根节点',\n type: NodeType.Composite,\n icon: 'TreePine',\n description: '行为树的根节点',\n color: '#FFD700'\n }),\n ECSComponent('RootNode'),\n Serializable({ version: 1 }),\n __metadata(\"design:paramtypes\", [])\n], RootNode);\nexport { RootNode };\n//# sourceMappingURL=RootNode.js.map","export function utf8Count(str) {\n const strLength = str.length;\n let byteLength = 0;\n let pos = 0;\n while (pos < strLength) {\n let value = str.charCodeAt(pos++);\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n byteLength++;\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-bytes\n byteLength += 2;\n }\n else {\n // handle surrogate pair\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < strLength) {\n const extra = str.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n }\n if ((value & 0xffff0000) === 0) {\n // 3-byte\n byteLength += 3;\n }\n else {\n // 4-byte\n byteLength += 4;\n }\n }\n }\n return byteLength;\n}\nexport function utf8EncodeJs(str, output, outputOffset) {\n const strLength = str.length;\n let offset = outputOffset;\n let pos = 0;\n while (pos < strLength) {\n let value = str.charCodeAt(pos++);\n if ((value & 0xffffff80) === 0) {\n // 1-byte\n output[offset++] = value;\n continue;\n }\n else if ((value & 0xfffff800) === 0) {\n // 2-bytes\n output[offset++] = ((value >> 6) & 0x1f) | 0xc0;\n }\n else {\n // handle surrogate pair\n if (value >= 0xd800 && value <= 0xdbff) {\n // high surrogate\n if (pos < strLength) {\n const extra = str.charCodeAt(pos);\n if ((extra & 0xfc00) === 0xdc00) {\n ++pos;\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n }\n }\n if ((value & 0xffff0000) === 0) {\n // 3-byte\n output[offset++] = ((value >> 12) & 0x0f) | 0xe0;\n output[offset++] = ((value >> 6) & 0x3f) | 0x80;\n }\n else {\n // 4-byte\n output[offset++] = ((value >> 18) & 0x07) | 0xf0;\n output[offset++] = ((value >> 12) & 0x3f) | 0x80;\n output[offset++] = ((value >> 6) & 0x3f) | 0x80;\n }\n }\n output[offset++] = (value & 0x3f) | 0x80;\n }\n}\n// TextEncoder and TextDecoder are standardized in whatwg encoding:\n// https://encoding.spec.whatwg.org/\n// and available in all the modern browsers:\n// https://caniuse.com/textencoder\n// They are available in Node.js since v12 LTS as well:\n// https://nodejs.org/api/globals.html#textencoder\nconst sharedTextEncoder = new TextEncoder();\n// This threshold should be determined by benchmarking, which might vary in engines and input data.\n// Run `npx ts-node benchmark/encode-string.ts` for details.\nconst TEXT_ENCODER_THRESHOLD = 50;\nexport function utf8EncodeTE(str, output, outputOffset) {\n sharedTextEncoder.encodeInto(str, output.subarray(outputOffset));\n}\nexport function utf8Encode(str, output, outputOffset) {\n if (str.length > TEXT_ENCODER_THRESHOLD) {\n utf8EncodeTE(str, output, outputOffset);\n }\n else {\n utf8EncodeJs(str, output, outputOffset);\n }\n}\nconst CHUNK_SIZE = 4096;\nexport function utf8DecodeJs(bytes, inputOffset, byteLength) {\n let offset = inputOffset;\n const end = offset + byteLength;\n const units = [];\n let result = \"\";\n while (offset < end) {\n const byte1 = bytes[offset++];\n if ((byte1 & 0x80) === 0) {\n // 1 byte\n units.push(byte1);\n }\n else if ((byte1 & 0xe0) === 0xc0) {\n // 2 bytes\n const byte2 = bytes[offset++] & 0x3f;\n units.push(((byte1 & 0x1f) << 6) | byte2);\n }\n else if ((byte1 & 0xf0) === 0xe0) {\n // 3 bytes\n const byte2 = bytes[offset++] & 0x3f;\n const byte3 = bytes[offset++] & 0x3f;\n units.push(((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3);\n }\n else if ((byte1 & 0xf8) === 0xf0) {\n // 4 bytes\n const byte2 = bytes[offset++] & 0x3f;\n const byte3 = bytes[offset++] & 0x3f;\n const byte4 = bytes[offset++] & 0x3f;\n let unit = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;\n if (unit > 0xffff) {\n unit -= 0x10000;\n units.push(((unit >>> 10) & 0x3ff) | 0xd800);\n unit = 0xdc00 | (unit & 0x3ff);\n }\n units.push(unit);\n }\n else {\n units.push(byte1);\n }\n if (units.length >= CHUNK_SIZE) {\n result += String.fromCharCode(...units);\n units.length = 0;\n }\n }\n if (units.length > 0) {\n result += String.fromCharCode(...units);\n }\n return result;\n}\nconst sharedTextDecoder = new TextDecoder();\n// This threshold should be determined by benchmarking, which might vary in engines and input data.\n// Run `npx ts-node benchmark/decode-string.ts` for details.\nconst TEXT_DECODER_THRESHOLD = 200;\nexport function utf8DecodeTD(bytes, inputOffset, byteLength) {\n const stringBytes = bytes.subarray(inputOffset, inputOffset + byteLength);\n return sharedTextDecoder.decode(stringBytes);\n}\nexport function utf8Decode(bytes, inputOffset, byteLength) {\n if (byteLength > TEXT_DECODER_THRESHOLD) {\n return utf8DecodeTD(bytes, inputOffset, byteLength);\n }\n else {\n return utf8DecodeJs(bytes, inputOffset, byteLength);\n }\n}\n//# sourceMappingURL=utf8.mjs.map","/**\n * ExtData is used to handle Extension Types that are not registered to ExtensionCodec.\n */\nexport class ExtData {\n constructor(type, data) {\n this.type = type;\n this.data = data;\n }\n}\n//# sourceMappingURL=ExtData.mjs.map","export class DecodeError extends Error {\n constructor(message) {\n super(message);\n // fix the prototype chain in a cross-platform way\n const proto = Object.create(DecodeError.prototype);\n Object.setPrototypeOf(this, proto);\n Object.defineProperty(this, \"name\", {\n configurable: true,\n enumerable: false,\n value: DecodeError.name,\n });\n }\n}\n//# sourceMappingURL=DecodeError.mjs.map","// Integer Utility\nexport const UINT32_MAX = 4294967295;\n// DataView extension to handle int64 / uint64,\n// where the actual range is 53-bits integer (a.k.a. safe integer)\nexport function setUint64(view, offset, value) {\n const high = value / 4294967296;\n const low = value; // high bits are truncated by DataView\n view.setUint32(offset, high);\n view.setUint32(offset + 4, low);\n}\nexport function setInt64(view, offset, value) {\n const high = Math.floor(value / 4294967296);\n const low = value; // high bits are truncated by DataView\n view.setUint32(offset, high);\n view.setUint32(offset + 4, low);\n}\nexport function getInt64(view, offset) {\n const high = view.getInt32(offset);\n const low = view.getUint32(offset + 4);\n return high * 4294967296 + low;\n}\nexport function getUint64(view, offset) {\n const high = view.getUint32(offset);\n const low = view.getUint32(offset + 4);\n return high * 4294967296 + low;\n}\n//# sourceMappingURL=int.mjs.map","// https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type\nimport { DecodeError } from \"./DecodeError.mjs\";\nimport { getInt64, setInt64 } from \"./utils/int.mjs\";\nexport const EXT_TIMESTAMP = -1;\nconst TIMESTAMP32_MAX_SEC = 0x100000000 - 1; // 32-bit unsigned int\nconst TIMESTAMP64_MAX_SEC = 0x400000000 - 1; // 34-bit unsigned int\nexport function encodeTimeSpecToTimestamp({ sec, nsec }) {\n if (sec >= 0 && nsec >= 0 && sec <= TIMESTAMP64_MAX_SEC) {\n // Here sec >= 0 && nsec >= 0\n if (nsec === 0 && sec <= TIMESTAMP32_MAX_SEC) {\n // timestamp 32 = { sec32 (unsigned) }\n const rv = new Uint8Array(4);\n const view = new DataView(rv.buffer);\n view.setUint32(0, sec);\n return rv;\n }\n else {\n // timestamp 64 = { nsec30 (unsigned), sec34 (unsigned) }\n const secHigh = sec / 0x100000000;\n const secLow = sec & 0xffffffff;\n const rv = new Uint8Array(8);\n const view = new DataView(rv.buffer);\n // nsec30 | secHigh2\n view.setUint32(0, (nsec << 2) | (secHigh & 0x3));\n // secLow32\n view.setUint32(4, secLow);\n return rv;\n }\n }\n else {\n // timestamp 96 = { nsec32 (unsigned), sec64 (signed) }\n const rv = new Uint8Array(12);\n const view = new DataView(rv.buffer);\n view.setUint32(0, nsec);\n setInt64(view, 4, sec);\n return rv;\n }\n}\nexport function encodeDateToTimeSpec(date) {\n const msec = date.getTime();\n const sec = Math.floor(msec / 1e3);\n const nsec = (msec - sec * 1e3) * 1e6;\n // Normalizes { sec, nsec } to ensure nsec is unsigned.\n const nsecInSec = Math.floor(nsec / 1e9);\n return {\n sec: sec + nsecInSec,\n nsec: nsec - nsecInSec * 1e9,\n };\n}\nexport function encodeTimestampExtension(object) {\n if (object instanceof Date) {\n const timeSpec = encodeDateToTimeSpec(object);\n return encodeTimeSpecToTimestamp(timeSpec);\n }\n else {\n return null;\n }\n}\nexport function decodeTimestampToTimeSpec(data) {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n // data may be 32, 64, or 96 bits\n switch (data.byteLength) {\n case 4: {\n // timestamp 32 = { sec32 }\n const sec = view.getUint32(0);\n const nsec = 0;\n return { sec, nsec };\n }\n case 8: {\n // timestamp 64 = { nsec30, sec34 }\n const nsec30AndSecHigh2 = view.getUint32(0);\n const secLow32 = view.getUint32(4);\n const sec = (nsec30AndSecHigh2 & 0x3) * 0x100000000 + secLow32;\n const nsec = nsec30AndSecHigh2 >>> 2;\n return { sec, nsec };\n }\n case 12: {\n // timestamp 96 = { nsec32 (unsigned), sec64 (signed) }\n const sec = getInt64(view, 4);\n const nsec = view.getUint32(0);\n return { sec, nsec };\n }\n default:\n throw new DecodeError(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${data.length}`);\n }\n}\nexport function decodeTimestampExtension(data) {\n const timeSpec = decodeTimestampToTimeSpec(data);\n return new Date(timeSpec.sec * 1e3 + timeSpec.nsec / 1e6);\n}\nexport const timestampExtension = {\n type: EXT_TIMESTAMP,\n encode: encodeTimestampExtension,\n decode: decodeTimestampExtension,\n};\n//# sourceMappingURL=timestamp.mjs.map","// ExtensionCodec to handle MessagePack extensions\nimport { ExtData } from \"./ExtData.mjs\";\nimport { timestampExtension } from \"./timestamp.mjs\";\nexport class ExtensionCodec {\n constructor() {\n // built-in extensions\n this.builtInEncoders = [];\n this.builtInDecoders = [];\n // custom extensions\n this.encoders = [];\n this.decoders = [];\n this.register(timestampExtension);\n }\n register({ type, encode, decode, }) {\n if (type >= 0) {\n // custom extensions\n this.encoders[type] = encode;\n this.decoders[type] = decode;\n }\n else {\n // built-in extensions\n const index = -1 - type;\n this.builtInEncoders[index] = encode;\n this.builtInDecoders[index] = decode;\n }\n }\n tryToEncode(object, context) {\n // built-in extensions\n for (let i = 0; i < this.builtInEncoders.length; i++) {\n const encodeExt = this.builtInEncoders[i];\n if (encodeExt != null) {\n const data = encodeExt(object, context);\n if (data != null) {\n const type = -1 - i;\n return new ExtData(type, data);\n }\n }\n }\n // custom extensions\n for (let i = 0; i < this.encoders.length; i++) {\n const encodeExt = this.encoders[i];\n if (encodeExt != null) {\n const data = encodeExt(object, context);\n if (data != null) {\n const type = i;\n return new ExtData(type, data);\n }\n }\n }\n if (object instanceof ExtData) {\n // to keep ExtData as is\n return object;\n }\n return null;\n }\n decode(data, type, context) {\n const decodeExt = type < 0 ? this.builtInDecoders[-1 - type] : this.decoders[type];\n if (decodeExt) {\n return decodeExt(data, type, context);\n }\n else {\n // decode() does not fail, returns ExtData instead.\n return new ExtData(type, data);\n }\n }\n}\nExtensionCodec.defaultCodec = new ExtensionCodec();\n//# sourceMappingURL=ExtensionCodec.mjs.map","function isArrayBufferLike(buffer) {\n return (buffer instanceof ArrayBuffer || (typeof SharedArrayBuffer !== \"undefined\" && buffer instanceof SharedArrayBuffer));\n}\nexport function ensureUint8Array(buffer) {\n if (buffer instanceof Uint8Array) {\n return buffer;\n }\n else if (ArrayBuffer.isView(buffer)) {\n return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n }\n else if (isArrayBufferLike(buffer)) {\n return new Uint8Array(buffer);\n }\n else {\n // ArrayLike<number>\n return Uint8Array.from(buffer);\n }\n}\n//# sourceMappingURL=typedArrays.mjs.map","import { utf8Count, utf8Encode } from \"./utils/utf8.mjs\";\nimport { ExtensionCodec } from \"./ExtensionCodec.mjs\";\nimport { setInt64, setUint64 } from \"./utils/int.mjs\";\nimport { ensureUint8Array } from \"./utils/typedArrays.mjs\";\nexport const DEFAULT_MAX_DEPTH = 100;\nexport const DEFAULT_INITIAL_BUFFER_SIZE = 2048;\nexport class Encoder {\n constructor(options) {\n this.entered = false;\n this.extensionCodec = options?.extensionCodec ?? ExtensionCodec.defaultCodec;\n this.context = options?.context; // needs a type assertion because EncoderOptions has no context property when ContextType is undefined\n this.useBigInt64 = options?.useBigInt64 ?? false;\n this.maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n this.initialBufferSize = options?.initialBufferSize ?? DEFAULT_INITIAL_BUFFER_SIZE;\n this.sortKeys = options?.sortKeys ?? false;\n this.forceFloat32 = options?.forceFloat32 ?? false;\n this.ignoreUndefined = options?.ignoreUndefined ?? false;\n this.forceIntegerToFloat = options?.forceIntegerToFloat ?? false;\n this.pos = 0;\n this.view = new DataView(new ArrayBuffer(this.initialBufferSize));\n this.bytes = new Uint8Array(this.view.buffer);\n }\n clone() {\n // Because of slightly special argument `context`,\n // type assertion is needed.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return new Encoder({\n extensionCodec: this.extensionCodec,\n context: this.context,\n useBigInt64: this.useBigInt64,\n maxDepth: this.maxDepth,\n initialBufferSize: this.initialBufferSize,\n sortKeys: this.sortKeys,\n forceFloat32: this.forceFloat32,\n ignoreUndefined: this.ignoreUndefined,\n forceIntegerToFloat: this.forceIntegerToFloat,\n });\n }\n reinitializeState() {\n this.pos = 0;\n }\n /**\n * This is almost equivalent to {@link Encoder#encode}, but it returns an reference of the encoder's internal buffer and thus much faster than {@link Encoder#encode}.\n *\n * @returns Encodes the object and returns a shared reference the encoder's internal buffer.\n */\n encodeSharedRef(object) {\n if (this.entered) {\n const instance = this.clone();\n return instance.encodeSharedRef(object);\n }\n try {\n this.entered = true;\n this.reinitializeState();\n this.doEncode(object, 1);\n return this.bytes.subarray(0, this.pos);\n }\n finally {\n this.entered = false;\n }\n }\n /**\n * @returns Encodes the object and returns a copy of the encoder's internal buffer.\n */\n encode(object) {\n if (this.entered) {\n const instance = this.clone();\n return instance.encode(object);\n }\n try {\n this.entered = true;\n this.reinitializeState();\n this.doEncode(object, 1);\n return this.bytes.slice(0, this.pos);\n }\n finally {\n this.entered = false;\n }\n }\n doEncode(object, depth) {\n if (depth > this.maxDepth) {\n throw new Error(`Too deep objects in depth ${depth}`);\n }\n if (object == null) {\n this.encodeNil();\n }\n else if (typeof object === \"boolean\") {\n this.encodeBoolean(object);\n }\n else if (typeof object === \"number\") {\n if (!this.forceIntegerToFloat) {\n this.encodeNumber(object);\n }\n else {\n this.encodeNumberAsFloat(object);\n }\n }\n else if (typeof object === \"string\") {\n this.encodeString(object);\n }\n else if (this.useBigInt64 && typeof object === \"bigint\") {\n this.encodeBigInt64(object);\n }\n else {\n this.encodeObject(object, depth);\n }\n }\n ensureBufferSizeToWrite(sizeToWrite) {\n const requiredSize = this.pos + sizeToWrite;\n if (this.view.byteLength < requiredSize) {\n this.resizeBuffer(requiredSize * 2);\n }\n }\n resizeBuffer(newSize) {\n const newBuffer = new ArrayBuffer(newSize);\n const newBytes = new Uint8Array(newBuffer);\n const newView = new DataView(newBuffer);\n newBytes.set(this.bytes);\n this.view = newView;\n this.bytes = newBytes;\n }\n encodeNil() {\n this.writeU8(0xc0);\n }\n encodeBoolean(object) {\n if (object === false) {\n this.writeU8(0xc2);\n }\n else {\n this.writeU8(0xc3);\n }\n }\n encodeNumber(object) {\n if (!this.forceIntegerToFloat && Number.isSafeInteger(object)) {\n if (object >= 0) {\n if (object < 0x80) {\n // positive fixint\n this.writeU8(object);\n }\n else if (object < 0x100) {\n // uint 8\n this.writeU8(0xcc);\n this.writeU8(object);\n }\n else if (object < 0x10000) {\n // uint 16\n this.writeU8(0xcd);\n this.writeU16(object);\n }\n else if (object < 0x100000000) {\n // uint 32\n this.writeU8(0xce);\n this.writeU32(object);\n }\n else if (!this.useBigInt64) {\n // uint 64\n this.writeU8(0xcf);\n this.writeU64(object);\n }\n else {\n this.encodeNumberAsFloat(object);\n }\n }\n else {\n if (object >= -0x20) {\n // negative fixint\n this.writeU8(0xe0 | (object + 0x20));\n }\n else if (object >= -0x80) {\n // int 8\n this.writeU8(0xd0);\n this.writeI8(object);\n }\n else if (object >= -0x8000) {\n // int 16\n this.writeU8(0xd1);\n this.writeI16(object);\n }\n else if (object >= -0x80000000) {\n // int 32\n this.writeU8(0xd2);\n this.writeI32(object);\n }\n else if (!this.useBigInt64) {\n // int 64\n this.writeU8(0xd3);\n this.writeI64(object);\n }\n else {\n this.encodeNumberAsFloat(object);\n }\n }\n }\n else {\n this.encodeNumberAsFloat(object);\n }\n }\n encodeNumberAsFloat(object) {\n if (this.forceFloat32) {\n // float 32\n this.writeU8(0xca);\n this.writeF32(object);\n }\n else {\n // float 64\n this.writeU8(0xcb);\n this.writeF64(object);\n }\n }\n encodeBigInt64(object) {\n if (object >= BigInt(0)) {\n // uint 64\n this.writeU8(0xcf);\n this.writeBigUint64(object);\n }\n else {\n // int 64\n this.writeU8(0xd3);\n this.writeBigInt64(object);\n }\n }\n writeStringHeader(byteLength) {\n if (byteLength < 32) {\n // fixstr\n this.writeU8(0xa0 + byteLength);\n }\n else if (byteLength < 0x100) {\n // str 8\n this.writeU8(0xd9);\n this.writeU8(byteLength);\n }\n else if (byteLength < 0x10000) {\n // str 16\n this.writeU8(0xda);\n this.writeU16(byteLength);\n }\n else if (byteLength < 0x100000000) {\n // str 32\n this.writeU8(0xdb);\n this.writeU32(byteLength);\n }\n else {\n throw new Error(`Too long string: ${byteLength} bytes in UTF-8`);\n }\n }\n encodeString(object) {\n const maxHeaderSize = 1 + 4;\n const byteLength = utf8Count(object);\n this.ensureBufferSizeToWrite(maxHeaderSize + byteLength);\n this.writeStringHeader(byteLength);\n utf8Encode(object, this.bytes, this.pos);\n this.pos += byteLength;\n }\n encodeObject(object, depth) {\n // try to encode objects with custom codec first of non-primitives\n const ext = this.extensionCodec.tryToEncode(object, this.context);\n if (ext != null) {\n this.encodeExtension(ext);\n }\n else if (Array.isArray(object)) {\n this.encodeArray(object, depth);\n }\n else if (ArrayBuffer.isView(object)) {\n this.encodeBinary(object);\n }\n else if (typeof object === \"object\") {\n this.encodeMap(object, depth);\n }\n else {\n // symbol, function and other special object come here unless extensionCodec handles them.\n throw new Error(`Unrecognized object: ${Object.prototype.toString.apply(object)}`);\n }\n }\n encodeBinary(object) {\n const size = object.byteLength;\n if (size < 0x100) {\n // bin 8\n this.writeU8(0xc4);\n this.writeU8(size);\n }\n else if (size < 0x10000) {\n // bin 16\n this.writeU8(0xc5);\n this.writeU16(size);\n }\n else if (size < 0x100000000) {\n // bin 32\n this.writeU8(0xc6);\n this.writeU32(size);\n }\n else {\n throw new Error(`Too large binary: ${size}`);\n }\n const bytes = ensureUint8Array(object);\n this.writeU8a(bytes);\n }\n encodeArray(object, depth) {\n const size = object.length;\n if (size < 16) {\n // fixarray\n this.writeU8(0x90 + size);\n }\n else if (size < 0x10000) {\n // array 16\n this.writeU8(0xdc);\n this.writeU16(size);\n }\n else if (size < 0x100000000) {\n // array 32\n this.writeU8(0xdd);\n this.writeU32(size);\n }\n else {\n throw new Error(`Too large array: ${size}`);\n }\n for (const item of object) {\n this.doEncode(item, depth + 1);\n }\n }\n countWithoutUndefined(object, keys) {\n let count = 0;\n for (const key of keys) {\n if (object[key] !== undefined) {\n count++;\n }\n }\n return count;\n }\n encodeMap(object, depth) {\n const keys = Object.keys(object);\n if (this.sortKeys) {\n keys.sort();\n }\n const size = this.ignoreUndefined ? this.countWithoutUndefined(object, keys) : keys.length;\n if (size < 16) {\n // fixmap\n this.writeU8(0x80 + size);\n }\n else if (size < 0x10000) {\n // map 16\n this.writeU8(0xde);\n this.writeU16(size);\n }\n else if (size < 0x100000000) {\n // map 32\n this.writeU8(0xdf);\n this.writeU32(size);\n }\n else {\n throw new Error(`Too large map object: ${size}`);\n }\n for (const key of keys) {\n const value = object[key];\n if (!(this.ignoreUndefined && value === undefined)) {\n this.encodeString(key);\n this.doEncode(value, depth + 1);\n }\n }\n }\n encodeExtension(ext) {\n if (typeof ext.data === \"function\") {\n const data = ext.data(this.pos + 6);\n const size = data.length;\n if (size >= 0x100000000) {\n throw new Error(`Too large extension object: ${size}`);\n }\n this.writeU8(0xc9);\n this.writeU32(size);\n this.writeI8(ext.type);\n this.writeU8a(data);\n return;\n }\n const size = ext.data.length;\n if (size === 1) {\n // fixext 1\n this.writeU8(0xd4);\n }\n else if (size === 2) {\n // fixext 2\n this.writeU8(0xd5);\n }\n else if (size === 4) {\n // fixext 4\n this.writeU8(0xd6);\n }\n else if (size === 8) {\n // fixext 8\n this.writeU8(0xd7);\n }\n else if (size === 16) {\n // fixext 16\n this.writeU8(0xd8);\n }\n else if (size < 0x100) {\n // ext 8\n this.writeU8(0xc7);\n this.writeU8(size);\n }\n else if (size < 0x10000) {\n // ext 16\n this.writeU8(0xc8);\n this.writeU16(size);\n }\n else if (size < 0x100000000) {\n // ext 32\n this.writeU8(0xc9);\n this.writeU32(size);\n }\n else {\n throw new Error(`Too large extension object: ${size}`);\n }\n this.writeI8(ext.type);\n this.writeU8a(ext.data);\n }\n writeU8(value) {\n this.ensureBufferSizeToWrite(1);\n this.view.setUint8(this.pos, value);\n this.pos++;\n }\n writeU8a(values) {\n const size = values.length;\n this.ensureBufferSizeToWrite(size);\n this.bytes.set(values, this.pos);\n this.pos += size;\n }\n writeI8(value) {\n this.ensureBufferSizeToWrite(1);\n this.view.setInt8(this.pos, value);\n this.pos++;\n }\n writeU16(value) {\n this.ensureBufferSizeToWrite(2);\n this.view.setUint16(this.pos, value);\n this.pos += 2;\n }\n writeI16(value) {\n this.ensureBufferSizeToWrite(2);\n this.view.setInt16(this.pos, value);\n this.pos += 2;\n }\n writeU32(value) {\n this.ensureBufferSizeToWrite(4);\n this.view.setUint32(this.pos, value);\n this.pos += 4;\n }\n writeI32(value) {\n this.ensureBufferSizeToWrite(4);\n this.view.setInt32(this.pos, value);\n this.pos += 4;\n }\n writeF32(value) {\n this.ensureBufferSizeToWrite(4);\n this.view.setFloat32(this.pos, value);\n this.pos += 4;\n }\n writeF64(value) {\n this.ensureBufferSizeToWrite(8);\n this.view.setFloat64(this.pos, value);\n this.pos += 8;\n }\n writeU64(value) {\n this.ensureBufferSizeToWrite(8);\n setUint64(this.view, this.pos, value);\n this.pos += 8;\n }\n writeI64(value) {\n this.ensureBufferSizeToWrite(8);\n setInt64(this.view, this.pos, value);\n this.pos += 8;\n }\n writeBigUint64(value) {\n this.ensureBufferSizeToWrite(8);\n this.view.setBigUint64(this.pos, value);\n this.pos += 8;\n }\n writeBigInt64(value) {\n this.ensureBufferSizeToWrite(8);\n this.view.setBigInt64(this.pos, value);\n this.pos += 8;\n }\n}\n//# sourceMappingURL=Encoder.mjs.map","export function prettyByte(byte) {\n return `${byte < 0 ? \"-\" : \"\"}0x${Math.abs(byte).toString(16).padStart(2, \"0\")}`;\n}\n//# sourceMappingURL=prettyByte.mjs.map","import { prettyByte } from \"./utils/prettyByte.mjs\";\nimport { ExtensionCodec } from \"./ExtensionCodec.mjs\";\nimport { getInt64, getUint64, UINT32_MAX } from \"./utils/int.mjs\";\nimport { utf8Decode } from \"./utils/utf8.mjs\";\nimport { ensureUint8Array } from \"./utils/typedArrays.mjs\";\nimport { CachedKeyDecoder } from \"./CachedKeyDecoder.mjs\";\nimport { DecodeError } from \"./DecodeError.mjs\";\nconst STATE_ARRAY = \"array\";\nconst STATE_MAP_KEY = \"map_key\";\nconst STATE_MAP_VALUE = \"map_value\";\nconst mapKeyConverter = (key) => {\n if (typeof key === \"string\" || typeof key === \"number\") {\n return key;\n }\n throw new DecodeError(\"The type of key must be string or number but \" + typeof key);\n};\nclass StackPool {\n constructor() {\n this.stack = [];\n this.stackHeadPosition = -1;\n }\n get length() {\n return this.stackHeadPosition + 1;\n }\n top() {\n return this.stack[this.stackHeadPosition];\n }\n pushArrayState(size) {\n const state = this.getUninitializedStateFromPool();\n state.type = STATE_ARRAY;\n state.position = 0;\n state.size = size;\n state.array = new Array(size);\n }\n pushMapState(size) {\n const state = this.getUninitializedStateFromPool();\n state.type = STATE_MAP_KEY;\n state.readCount = 0;\n state.size = size;\n state.map = {};\n }\n getUninitializedStateFromPool() {\n this.stackHeadPosition++;\n if (this.stackHeadPosition === this.stack.length) {\n const partialState = {\n type: undefined,\n size: 0,\n array: undefined,\n position: 0,\n readCount: 0,\n map: undefined,\n key: null,\n };\n this.stack.push(partialState);\n }\n return this.stack[this.stackHeadPosition];\n }\n release(state) {\n const topStackState = this.stack[this.stackHeadPosition];\n if (topStackState !== state) {\n throw new Error(\"Invalid stack state. Released state is not on top of the stack.\");\n }\n if (state.type === STATE_ARRAY) {\n const partialState = state;\n partialState.size = 0;\n partialState.array = undefined;\n partialState.position = 0;\n partialState.type = undefined;\n }\n if (state.type === STATE_MAP_KEY || state.type === STATE_MAP_VALUE) {\n const partialState = state;\n partialState.size = 0;\n partialState.map = undefined;\n partialState.readCount = 0;\n partialState.type = undefined;\n }\n this.stackHeadPosition--;\n }\n reset() {\n this.stack.length = 0;\n this.stackHeadPosition = -1;\n }\n}\nconst HEAD_BYTE_REQUIRED = -1;\nconst EMPTY_VIEW = new DataView(new ArrayBuffer(0));\nconst EMPTY_BYTES = new Uint8Array(EMPTY_VIEW.buffer);\ntry {\n // IE11: The spec says it should throw RangeError,\n // IE11: but in IE11 it throws TypeError.\n EMPTY_VIEW.getInt8(0);\n}\ncatch (e) {\n if (!(e instanceof RangeError)) {\n throw new Error(\"This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access\");\n }\n}\nconst MORE_DATA = new RangeError(\"Insufficient data\");\nconst sharedCachedKeyDecoder = new CachedKeyDecoder();\nexport class Decoder {\n constructor(options) {\n this.totalPos = 0;\n this.pos = 0;\n this.view = EMPTY_VIEW;\n this.bytes = EMPTY_BYTES;\n this.headByte = HEAD_BYTE_REQUIRED;\n this.stack = new StackPool();\n this.entered = false;\n this.extensionCodec = options?.extensionCodec ?? ExtensionCodec.defaultCodec;\n this.context = options?.context; // needs a type assertion because EncoderOptions has no context property when ContextType is undefined\n this.useBigInt64 = options?.useBigInt64 ?? false;\n this.rawStrings = options?.rawStrings ?? false;\n this.maxStrLength = options?.maxStrLength ?? UINT32_MAX;\n this.maxBinLength = options?.maxBinLength ?? UINT32_MAX;\n this.maxArrayLength = options?.maxArrayLength ?? UINT32_MAX;\n this.maxMapLength = options?.maxMapLength ?? UINT32_MAX;\n this.maxExtLength = options?.maxExtLength ?? UINT32_MAX;\n this.keyDecoder = options?.keyDecoder !== undefined ? options.keyDecoder : sharedCachedKeyDecoder;\n this.mapKeyConverter = options?.mapKeyConverter ?? mapKeyConverter;\n }\n clone() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return new Decoder({\n extensionCodec: this.extensionCodec,\n context: this.context,\n useBigInt64: this.useBigInt64,\n rawStrings: this.rawStrings,\n maxStrLength: this.maxStrLength,\n maxBinLength: this.maxBinLength,\n maxArrayLength: this.maxArrayLength,\n maxMapLength: this.maxMapLength,\n maxExtLength: this.maxExtLength,\n keyDecoder: this.keyDecoder,\n });\n }\n reinitializeState() {\n this.totalPos = 0;\n this.headByte = HEAD_BYTE_REQUIRED;\n this.stack.reset();\n // view, bytes, and pos will be re-initialized in setBuffer()\n }\n setBuffer(buffer) {\n const bytes = ensureUint8Array(buffer);\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n this.pos = 0;\n }\n appendBuffer(buffer) {\n if (this.headByte === HEAD_BYTE_REQUIRED && !this.hasRemaining(1)) {\n this.setBuffer(buffer);\n }\n else {\n const remainingData = this.bytes.subarray(this.pos);\n const newData = ensureUint8Array(buffer);\n // concat remainingData + newData\n const newBuffer = new Uint8Array(remainingData.length + newData.length);\n newBuffer.set(remainingData);\n newBuffer.set(newData, remainingData.length);\n this.setBuffer(newBuffer);\n }\n }\n hasRemaining(size) {\n return this.view.byteLength - this.pos >= size;\n }\n createExtraByteError(posToShow) {\n const { view, pos } = this;\n return new RangeError(`Extra ${view.byteLength - pos} of ${view.byteLength} byte(s) found at buffer[${posToShow}]`);\n }\n /**\n * @throws {@link DecodeError}\n * @throws {@link RangeError}\n */\n decode(buffer) {\n if (this.entered) {\n const instance = this.clone();\n return instance.decode(buffer);\n }\n try {\n this.entered = true;\n this.reinitializeState();\n this.setBuffer(buffer);\n const object = this.doDecodeSync();\n if (this.hasRemaining(1)) {\n throw this.createExtraByteError(this.pos);\n }\n return object;\n }\n finally {\n this.entered = false;\n }\n }\n *decodeMulti(buffer) {\n if (this.entered) {\n const instance = this.clone();\n yield* instance.decodeMulti(buffer);\n return;\n }\n try {\n this.entered = true;\n this.reinitializeState();\n this.setBuffer(buffer);\n while (this.hasRemaining(1)) {\n yield this.doDecodeSync();\n }\n }\n finally {\n this.entered = false;\n }\n }\n async decodeAsync(stream) {\n if (this.entered) {\n const instance = this.clone();\n return instance.decodeAsync(stream);\n }\n try {\n this.entered = true;\n let decoded = false;\n let object;\n for await (const buffer of stream) {\n if (decoded) {\n this.entered = false;\n throw this.createExtraByteError(this.totalPos);\n }\n this.appendBuffer(buffer);\n try {\n object = this.doDecodeSync();\n decoded = true;\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e; // rethrow\n }\n // fallthrough\n }\n this.totalPos += this.pos;\n }\n if (decoded) {\n if (this.hasRemaining(1)) {\n throw this.createExtraByteError(this.totalPos);\n }\n return object;\n }\n const { headByte, pos, totalPos } = this;\n throw new RangeError(`Insufficient data in parsing ${prettyByte(headByte)} at ${totalPos} (${pos} in the current buffer)`);\n }\n finally {\n this.entered = false;\n }\n }\n decodeArrayStream(stream) {\n return this.decodeMultiAsync(stream, true);\n }\n decodeStream(stream) {\n return this.decodeMultiAsync(stream, false);\n }\n async *decodeMultiAsync(stream, isArray) {\n if (this.entered) {\n const instance = this.clone();\n yield* instance.decodeMultiAsync(stream, isArray);\n return;\n }\n try {\n this.entered = true;\n let isArrayHeaderRequired = isArray;\n let arrayItemsLeft = -1;\n for await (const buffer of stream) {\n if (isArray && arrayItemsLeft === 0) {\n throw this.createExtraByteError(this.totalPos);\n }\n this.appendBuffer(buffer);\n if (isArrayHeaderRequired) {\n arrayItemsLeft = this.readArraySize();\n isArrayHeaderRequired = false;\n this.complete();\n }\n try {\n while (true) {\n yield this.doDecodeSync();\n if (--arrayItemsLeft === 0) {\n break;\n }\n }\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e; // rethrow\n }\n // fallthrough\n }\n this.totalPos += this.pos;\n }\n }\n finally {\n this.entered = false;\n }\n }\n doDecodeSync() {\n DECODE: while (true) {\n const headByte = this.readHeadByte();\n let object;\n if (headByte >= 0xe0) {\n // negative fixint (111x xxxx) 0xe0 - 0xff\n object = headByte - 0x100;\n }\n else if (headByte < 0xc0) {\n if (headByte < 0x80) {\n // positive fixint (0xxx xxxx) 0x00 - 0x7f\n object = headByte;\n }\n else if (headByte < 0x90) {\n // fixmap (1000 xxxx) 0x80 - 0x8f\n const size = headByte - 0x80;\n if (size !== 0) {\n this.pushMapState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = {};\n }\n }\n else if (headByte < 0xa0) {\n // fixarray (1001 xxxx) 0x90 - 0x9f\n const size = headByte - 0x90;\n if (size !== 0) {\n this.pushArrayState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = [];\n }\n }\n else {\n // fixstr (101x xxxx) 0xa0 - 0xbf\n const byteLength = headByte - 0xa0;\n object = this.decodeString(byteLength, 0);\n }\n }\n else if (headByte === 0xc0) {\n // nil\n object = null;\n }\n else if (headByte === 0xc2) {\n // false\n object = false;\n }\n else if (headByte === 0xc3) {\n // true\n object = true;\n }\n else if (headByte === 0xca) {\n // float 32\n object = this.readF32();\n }\n else if (headByte === 0xcb) {\n // float 64\n object = this.readF64();\n }\n else if (headByte === 0xcc) {\n // uint 8\n object = this.readU8();\n }\n else if (headByte === 0xcd) {\n // uint 16\n object = this.readU16();\n }\n else if (headByte === 0xce) {\n // uint 32\n object = this.readU32();\n }\n else if (headByte === 0xcf) {\n // uint 64\n if (this.useBigInt64) {\n object = this.readU64AsBigInt();\n }\n else {\n object = this.readU64();\n }\n }\n else if (headByte === 0xd0) {\n // int 8\n object = this.readI8();\n }\n else if (headByte === 0xd1) {\n // int 16\n object = this.readI16();\n }\n else if (headByte === 0xd2) {\n // int 32\n object = this.readI32();\n }\n else if (headByte === 0xd3) {\n // int 64\n if (this.useBigInt64) {\n object = this.readI64AsBigInt();\n }\n else {\n object = this.readI64();\n }\n }\n else if (headByte === 0xd9) {\n // str 8\n const byteLength = this.lookU8();\n object = this.decodeString(byteLength, 1);\n }\n else if (headByte === 0xda) {\n // str 16\n const byteLength = this.lookU16();\n object = this.decodeString(byteLength, 2);\n }\n else if (headByte === 0xdb) {\n // str 32\n const byteLength = this.lookU32();\n object = this.decodeString(byteLength, 4);\n }\n else if (headByte === 0xdc) {\n // array 16\n const size = this.readU16();\n if (size !== 0) {\n this.pushArrayState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = [];\n }\n }\n else if (headByte === 0xdd) {\n // array 32\n const size = this.readU32();\n if (size !== 0) {\n this.pushArrayState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = [];\n }\n }\n else if (headByte === 0xde) {\n // map 16\n const size = this.readU16();\n if (size !== 0) {\n this.pushMapState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = {};\n }\n }\n else if (headByte === 0xdf) {\n // map 32\n const size = this.readU32();\n if (size !== 0) {\n this.pushMapState(size);\n this.complete();\n continue DECODE;\n }\n else {\n object = {};\n }\n }\n else if (headByte === 0xc4) {\n // bin 8\n const size = this.lookU8();\n object = this.decodeBinary(size, 1);\n }\n else if (headByte === 0xc5) {\n // bin 16\n const size = this.lookU16();\n object = this.decodeBinary(size, 2);\n }\n else if (headByte === 0xc6) {\n // bin 32\n const size = this.lookU32();\n object = this.decodeBinary(size, 4);\n }\n else if (headByte === 0xd4) {\n // fixext 1\n object = this.decodeExtension(1, 0);\n }\n else if (headByte === 0xd5) {\n // fixext 2\n object = this.decodeExtension(2, 0);\n }\n else if (headByte === 0xd6) {\n // fixext 4\n object = this.decodeExtension(4, 0);\n }\n else if (headByte === 0xd7) {\n // fixext 8\n object = this.decodeExtension(8, 0);\n }\n else if (headByte === 0xd8) {\n // fixext 16\n object = this.decodeExtension(16, 0);\n }\n else if (headByte === 0xc7) {\n // ext 8\n const size = this.lookU8();\n object = this.decodeExtension(size, 1);\n }\n else if (headByte === 0xc8) {\n // ext 16\n const size = this.lookU16();\n object = this.decodeExtension(size, 2);\n }\n else if (headByte === 0xc9) {\n // ext 32\n const size = this.lookU32();\n object = this.decodeExtension(size, 4);\n }\n else {\n throw new DecodeError(`Unrecognized type byte: ${prettyByte(headByte)}`);\n }\n this.complete();\n const stack = this.stack;\n while (stack.length > 0) {\n // arrays and maps\n const state = stack.top();\n if (state.type === STATE_ARRAY) {\n state.array[state.position] = object;\n state.position++;\n if (state.position === state.size) {\n object = state.array;\n stack.release(state);\n }\n else {\n continue DECODE;\n }\n }\n else if (state.type === STATE_MAP_KEY) {\n if (object === \"__proto__\") {\n throw new DecodeError(\"The key __proto__ is not allowed\");\n }\n state.key = this.mapKeyConverter(object);\n state.type = STATE_MAP_VALUE;\n continue DECODE;\n }\n else {\n // it must be `state.type === State.MAP_VALUE` here\n state.map[state.key] = object;\n state.readCount++;\n if (state.readCount === state.size) {\n object = state.map;\n stack.release(state);\n }\n else {\n state.key = null;\n state.type = STATE_MAP_KEY;\n continue DECODE;\n }\n }\n }\n return object;\n }\n }\n readHeadByte() {\n if (this.headByte === HEAD_BYTE_REQUIRED) {\n this.headByte = this.readU8();\n // console.log(\"headByte\", prettyByte(this.headByte));\n }\n return this.headByte;\n }\n complete() {\n this.headByte = HEAD_BYTE_REQUIRED;\n }\n readArraySize() {\n const headByte = this.readHeadByte();\n switch (headByte) {\n case 0xdc:\n return this.readU16();\n case 0xdd:\n return this.readU32();\n default: {\n if (headByte < 0xa0) {\n return headByte - 0x90;\n }\n else {\n throw new DecodeError(`Unrecognized array type byte: ${prettyByte(headByte)}`);\n }\n }\n }\n }\n pushMapState(size) {\n if (size > this.maxMapLength) {\n throw new DecodeError(`Max length exceeded: map length (${size}) > maxMapLengthLength (${this.maxMapLength})`);\n }\n this.stack.pushMapState(size);\n }\n pushArrayState(size) {\n if (size > this.maxArrayLength) {\n throw new DecodeError(`Max length exceeded: array length (${size}) > maxArrayLength (${this.maxArrayLength})`);\n }\n this.stack.pushArrayState(size);\n }\n decodeString(byteLength, headerOffset) {\n if (!this.rawStrings || this.stateIsMapKey()) {\n return this.decodeUtf8String(byteLength, headerOffset);\n }\n return this.decodeBinary(byteLength, headerOffset);\n }\n /**\n * @throws {@link RangeError}\n */\n decodeUtf8String(byteLength, headerOffset) {\n if (byteLength > this.maxStrLength) {\n throw new DecodeError(`Max length exceeded: UTF-8 byte length (${byteLength}) > maxStrLength (${this.maxStrLength})`);\n }\n if (this.bytes.byteLength < this.pos + headerOffset + byteLength) {\n throw MORE_DATA;\n }\n const offset = this.pos + headerOffset;\n let object;\n if (this.stateIsMapKey() && this.keyDecoder?.canBeCached(byteLength)) {\n object = this.keyDecoder.decode(this.bytes, offset, byteLength);\n }\n else {\n object = utf8Decode(this.bytes, offset, byteLength);\n }\n this.pos += headerOffset + byteLength;\n return object;\n }\n stateIsMapKey() {\n if (this.stack.length > 0) {\n const state = this.stack.top();\n return state.type === STATE_MAP_KEY;\n }\n return false;\n }\n /**\n * @throws {@link RangeError}\n */\n decodeBinary(byteLength, headOffset) {\n if (byteLength > this.maxBinLength) {\n throw new DecodeError(`Max length exceeded: bin length (${byteLength}) > maxBinLength (${this.maxBinLength})`);\n }\n if (!this.hasRemaining(byteLength + headOffset)) {\n throw MORE_DATA;\n }\n const offset = this.pos + headOffset;\n const object = this.bytes.subarray(offset, offset + byteLength);\n this.pos += headOffset + byteLength;\n return object;\n }\n decodeExtension(size, headOffset) {\n if (size > this.maxExtLength) {\n throw new DecodeError(`Max length exceeded: ext length (${size}) > maxExtLength (${this.maxExtLength})`);\n }\n const extType = this.view.getInt8(this.pos + headOffset);\n const data = this.decodeBinary(size, headOffset + 1 /* extType */);\n return this.extensionCodec.decode(data, extType, this.context);\n }\n lookU8() {\n return this.view.getUint8(this.pos);\n }\n lookU16() {\n return this.view.getUint16(this.pos);\n }\n lookU32() {\n return this.view.getUint32(this.pos);\n }\n readU8() {\n const value = this.view.getUint8(this.pos);\n this.pos++;\n return value;\n }\n readI8() {\n const value = this.view.getInt8(this.pos);\n this.pos++;\n return value;\n }\n readU16() {\n const value = this.view.getUint16(this.pos);\n this.pos += 2;\n return value;\n }\n readI16() {\n const value = this.view.getInt16(this.pos);\n this.pos += 2;\n return value;\n }\n readU32() {\n const value = this.view.getUint32(this.pos);\n this.pos += 4;\n return value;\n }\n readI32() {\n const value = this.view.getInt32(this.pos);\n this.pos += 4;\n return value;\n }\n readU64() {\n const value = getUint64(this.view, this.pos);\n this.pos += 8;\n return value;\n }\n readI64() {\n const value = getInt64(this.view, this.pos);\n this.pos += 8;\n return value;\n }\n readU64AsBigInt() {\n const value = this.view.getBigUint64(this.pos);\n this.pos += 8;\n return value;\n }\n readI64AsBigInt() {\n const value = this.view.getBigInt64(this.pos);\n this.pos += 8;\n return value;\n }\n readF32() {\n const value = this.view.getFloat32(this.pos);\n this.pos += 4;\n return value;\n }\n readF64() {\n const value = this.view.getFloat64(this.pos);\n this.pos += 8;\n return value;\n }\n}\n//# sourceMappingURL=Decoder.mjs.map","import { utf8DecodeJs } from \"./utils/utf8.mjs\";\nconst DEFAULT_MAX_KEY_LENGTH = 16;\nconst DEFAULT_MAX_LENGTH_PER_KEY = 16;\nexport class CachedKeyDecoder {\n constructor(maxKeyLength = DEFAULT_MAX_KEY_LENGTH, maxLengthPerKey = DEFAULT_MAX_LENGTH_PER_KEY) {\n this.hit = 0;\n this.miss = 0;\n this.maxKeyLength = maxKeyLength;\n this.maxLengthPerKey = maxLengthPerKey;\n // avoid `new Array(N)`, which makes a sparse array,\n // because a sparse array is typically slower than a non-sparse array.\n this.caches = [];\n for (let i = 0; i < this.maxKeyLength; i++) {\n this.caches.push([]);\n }\n }\n canBeCached(byteLength) {\n return byteLength > 0 && byteLength <= this.maxKeyLength;\n }\n find(bytes, inputOffset, byteLength) {\n const records = this.caches[byteLength - 1];\n FIND_CHUNK: for (const record of records) {\n const recordBytes = record.bytes;\n for (let j = 0; j < byteLength; j++) {\n if (recordBytes[j] !== bytes[inputOffset + j]) {\n continue FIND_CHUNK;\n }\n }\n return record.str;\n }\n return null;\n }\n store(bytes, value) {\n const records = this.caches[bytes.length - 1];\n const record = { bytes, str: value };\n if (records.length >= this.maxLengthPerKey) {\n // `records` are full!\n // Set `record` to an arbitrary position.\n records[(Math.random() * records.length) | 0] = record;\n }\n else {\n records.push(record);\n }\n }\n decode(bytes, inputOffset, byteLength) {\n const cachedValue = this.find(bytes, inputOffset, byteLength);\n if (cachedValue != null) {\n this.hit++;\n return cachedValue;\n }\n this.miss++;\n const str = utf8DecodeJs(bytes, inputOffset, byteLength);\n // Ensure to copy a slice of bytes because the bytes may be a NodeJS Buffer and Buffer#slice() returns a reference to its internal ArrayBuffer.\n const slicedCopyOfBytes = Uint8Array.prototype.slice.call(bytes, inputOffset, inputOffset + byteLength);\n this.store(slicedCopyOfBytes, str);\n return str;\n }\n}\n//# sourceMappingURL=CachedKeyDecoder.mjs.map","import { Decoder } from \"./Decoder.mjs\";\n/**\n * It decodes a single MessagePack object in a buffer.\n *\n * This is a synchronous decoding function.\n * See other variants for asynchronous decoding: {@link decodeAsync}, {@link decodeMultiStream}, or {@link decodeArrayStream}.\n *\n * @throws {@link RangeError} if the buffer is incomplete, including the case where the buffer is empty.\n * @throws {@link DecodeError} if the buffer contains invalid data.\n */\nexport function decode(buffer, options) {\n const decoder = new Decoder(options);\n return decoder.decode(buffer);\n}\n/**\n * It decodes multiple MessagePack objects in a buffer.\n * This is corresponding to {@link decodeMultiStream}.\n *\n * @throws {@link RangeError} if the buffer is incomplete, including the case where the buffer is empty.\n * @throws {@link DecodeError} if the buffer contains invalid data.\n */\nexport function decodeMulti(buffer, options) {\n const decoder = new Decoder(options);\n return decoder.decodeMulti(buffer);\n}\n//# sourceMappingURL=decode.mjs.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 return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined\n };\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 { EntitySystem, Matcher, Core } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { RootNode } from '../Components/Composites/RootNode';\nimport { ActiveNode } from '../Components/ActiveNode';\nimport { TaskStatus, NodeType } from '../Types/TaskStatus';\nimport { SubTreeNode } from '../Components/Composites/SubTreeNode';\nimport { LogOutput } from '../Components/LogOutput';\nimport { FileSystemAssetLoader } from '../Services/FileSystemAssetLoader';\nimport { BehaviorTreeAssetLoader } from '../Serialization/BehaviorTreeAssetLoader';\nimport { BehaviorTreeAssetMetadata } from '../Components/AssetMetadata';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\n/**\n * 预加载状态\n */\nvar PreloadState;\n(function (PreloadState) {\n /** 未开始预加载 */\n PreloadState[PreloadState[\"NotStarted\"] = 0] = \"NotStarted\";\n /** 正在预加载 */\n PreloadState[PreloadState[\"Loading\"] = 1] = \"Loading\";\n /** 预加载完成 */\n PreloadState[PreloadState[\"Completed\"] = 2] = \"Completed\";\n /** 预加载失败 */\n PreloadState[PreloadState[\"Failed\"] = 3] = \"Failed\";\n})(PreloadState || (PreloadState = {}));\n/**\n * 根节点执行系统\n *\n * 专门处理根节点的执行逻辑\n * 根节点的职责:\n * 1. 扫描并预加载所有标记为 preload=true 的子树\n * 2. 激活第一个子节点,并根据子节点的状态来设置自己的状态\n *\n * updateOrder: 350 (在所有其他执行系统之后)\n */\nexport class RootExecutionSystem extends EntitySystem {\n constructor() {\n super(Matcher.empty().all(BehaviorTreeNode, ActiveNode));\n /** 跟踪每个根节点的预加载状态 */\n this.preloadStates = new Map();\n /** 跟踪预加载任务 */\n this.preloadTasks = new Map();\n this.updateOrder = 350;\n }\n process(entities) {\n for (const entity of entities) {\n const node = entity.getComponent(BehaviorTreeNode);\n // 只处理根节点\n if (node.nodeType !== NodeType.Composite) {\n continue;\n }\n // 检查是否是根节点\n if (!entity.hasComponent(RootNode)) {\n continue;\n }\n this.executeRoot(entity, node);\n }\n }\n /**\n * 执行根节点逻辑\n */\n executeRoot(entity, node) {\n // 检查预加载状态\n const preloadState = this.preloadStates.get(entity.id) || PreloadState.NotStarted;\n if (preloadState === PreloadState.NotStarted) {\n // 开始预加载\n this.startPreload(entity, node);\n return;\n }\n else if (preloadState === PreloadState.Loading) {\n // 正在预加载,等待\n node.status = TaskStatus.Running;\n return;\n }\n else if (preloadState === PreloadState.Failed) {\n // 预加载失败,标记为失败\n node.status = TaskStatus.Failure;\n entity.removeComponentByType(ActiveNode);\n return;\n }\n // 预加载完成,执行正常逻辑\n const children = entity.children;\n // 如果没有子节点,标记为成功\n if (children.length === 0) {\n node.status = TaskStatus.Success;\n return;\n }\n // 获取第一个子节点\n const firstChild = children[0];\n const childNode = firstChild.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n return;\n }\n // 激活第一个子节点(如果还没激活)\n if (!firstChild.hasComponent(ActiveNode)) {\n firstChild.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n // 根据第一个子节点的状态来设置根节点的状态\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else if (childNode.status === TaskStatus.Success) {\n node.status = TaskStatus.Success;\n // 移除根节点的 ActiveNode,结束整个行为树\n entity.removeComponentByType(ActiveNode);\n }\n else if (childNode.status === TaskStatus.Failure) {\n node.status = TaskStatus.Failure;\n // 移除根节点的 ActiveNode,结束整个行为树\n entity.removeComponentByType(ActiveNode);\n }\n }\n /**\n * 开始预加载子树\n */\n startPreload(rootEntity, node) {\n // 扫描所有需要预加载的子树节点\n const subTreeNodesToPreload = this.scanSubTreeNodes(rootEntity);\n if (subTreeNodesToPreload.length === 0) {\n // 没有需要预加载的子树,直接标记为完成\n this.preloadStates.set(rootEntity.id, PreloadState.Completed);\n this.outputLog(rootEntity, '没有需要预加载的子树', 'info');\n return;\n }\n // 标记为正在加载\n this.preloadStates.set(rootEntity.id, PreloadState.Loading);\n node.status = TaskStatus.Running;\n this.outputLog(rootEntity, `开始预加载 ${subTreeNodesToPreload.length} 个子树...`, 'info');\n // 并行加载所有子树\n const loadTask = this.preloadAllSubTrees(rootEntity, subTreeNodesToPreload);\n this.preloadTasks.set(rootEntity.id, loadTask);\n // 异步处理加载结果\n loadTask.then(() => {\n this.preloadStates.set(rootEntity.id, PreloadState.Completed);\n this.outputLog(rootEntity, '所有子树预加载完成', 'info');\n }).catch(error => {\n this.preloadStates.set(rootEntity.id, PreloadState.Failed);\n this.outputLog(rootEntity, `子树预加载失败: ${error.message}`, 'error');\n });\n }\n /**\n * 扫描所有需要预加载的子树节点\n */\n scanSubTreeNodes(entity) {\n const result = [];\n // 检查当前实体\n const subTree = entity.getComponent(SubTreeNode);\n if (subTree && subTree.preload) {\n result.push({ entity, subTree });\n }\n // 递归扫描子节点\n for (const child of entity.children) {\n result.push(...this.scanSubTreeNodes(child));\n }\n return result;\n }\n /**\n * 预加载所有子树\n */\n async preloadAllSubTrees(rootEntity, subTreeNodes) {\n // 确保 AssetLoader 已初始化\n if (!this.assetLoader) {\n try {\n this.assetLoader = Core.services.resolve(FileSystemAssetLoader);\n }\n catch (error) {\n throw new Error('AssetLoader 未配置,无法预加载子树');\n }\n }\n // 并行加载所有子树\n await Promise.all(subTreeNodes.map(({ entity, subTree }) => this.preloadSingleSubTree(rootEntity, entity, subTree)));\n }\n /**\n * 预加载单个子树\n */\n async preloadSingleSubTree(rootEntity, subTreeEntity, subTree) {\n try {\n this.outputLog(rootEntity, `预加载子树: ${subTree.assetId}`, 'info');\n // 加载资产\n const asset = await this.assetLoader.loadBehaviorTree(subTree.assetId);\n // 实例化为 Entity 树(作为子树,跳过 RootNode)\n const subTreeRoot = BehaviorTreeAssetLoader.instantiate(asset, this.scene, {\n asSubTree: true\n });\n // 设置子树根实体\n subTree.setSubTreeRoot(subTreeRoot);\n // 将子树根实体设置为 SubTreeNode 的子节点,这样子树中的节点可以通过 parent 链找到主树的根节点\n subTreeEntity.addChild(subTreeRoot);\n // 添加资产元数据\n const metadata = subTreeRoot.addComponent(new BehaviorTreeAssetMetadata());\n metadata.initialize(subTree.assetId, '1.0.0');\n // 处理黑板继承\n if (subTree.inheritParentBlackboard) {\n this.setupBlackboardInheritance(subTreeEntity, subTreeRoot);\n }\n // 输出子树内部结构(用于调试)\n this.outputLog(rootEntity, `=== 预加载子树 ${subTree.assetId} 的内部结构 ===`, 'info');\n this.logSubTreeStructure(rootEntity, subTreeRoot, 0);\n this.outputLog(rootEntity, `=== 预加载子树结构结束 ===`, 'info');\n this.outputLog(rootEntity, `✓ 子树 ${subTree.assetId} 预加载完成`, 'info');\n }\n catch (error) {\n this.outputLog(rootEntity, `✗ 子树 ${subTree.assetId} 预加载失败: ${error.message}`, 'error');\n throw error;\n }\n }\n /**\n * 设置黑板继承\n */\n setupBlackboardInheritance(parentEntity, subTreeRoot) {\n const parentBlackboard = this.findBlackboard(parentEntity);\n if (!parentBlackboard) {\n return;\n }\n // 找到子树的黑板\n const subTreeBlackboard = subTreeRoot.getComponent(BlackboardComponent);\n if (subTreeBlackboard) {\n subTreeBlackboard.setUseGlobalBlackboard(true);\n }\n }\n /**\n * 查找黑板组件\n */\n findBlackboard(entity) {\n let current = entity;\n while (current) {\n const blackboard = current.getComponent(BlackboardComponent);\n if (blackboard) {\n return blackboard;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 查找根实体\n */\n findRootEntity(entity) {\n let current = entity;\n while (current) {\n if (!current.parent) {\n return current;\n }\n current = current.parent;\n }\n return null;\n }\n /**\n * 统一的日志输出方法\n */\n outputLog(entity, message, level = 'info') {\n // 输出到控制台\n switch (level) {\n case 'info':\n this.logger.info(message);\n break;\n case 'warn':\n this.logger.warn(message);\n break;\n case 'error':\n this.logger.error(message);\n break;\n default:\n this.logger.info(message);\n break;\n }\n // 输出到LogOutput组件\n const rootEntity = this.findRootEntity(entity);\n if (rootEntity) {\n const logOutput = rootEntity.getComponent(LogOutput);\n if (logOutput) {\n logOutput.addMessage(message, level);\n }\n }\n }\n /**\n * 递归打印子树结构(用于调试)\n */\n logSubTreeStructure(parentEntity, entity, depth) {\n const indent = ' '.repeat(depth);\n const btNode = entity.getComponent(BehaviorTreeNode);\n // 获取节点的具体类型组件\n const allComponents = entity.components.map(c => c.constructor.name);\n const nodeTypeComponent = allComponents.find(name => name !== 'BehaviorTreeNode' && name !== 'ActiveNode' &&\n name !== 'BlackboardComponent' && name !== 'LogOutput' &&\n name !== 'PropertyBindings' && name !== 'BehaviorTreeAssetMetadata') || 'Unknown';\n // 构建节点显示名称\n let nodeName = entity.name;\n if (nodeTypeComponent !== 'Unknown') {\n nodeName = `${nodeName} [${nodeTypeComponent}]`;\n }\n this.outputLog(parentEntity, `${indent}└─ ${nodeName}`, 'info');\n // 递归打印子节点\n if (entity.children.length > 0) {\n this.outputLog(parentEntity, `${indent} 子节点数: ${entity.children.length}`, 'info');\n entity.children.forEach((child) => {\n this.logSubTreeStructure(parentEntity, child, depth + 1);\n });\n }\n }\n /**\n * 清理资源\n */\n onDestroy() {\n this.preloadStates.clear();\n this.preloadTasks.clear();\n super.onDestroy();\n }\n getLoggerName() {\n return 'RootExecutionSystem';\n }\n}\n//# sourceMappingURL=RootExecutionSystem.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 // 查找根节点\n const rootNode = this.findRootNode(editorData.nodes);\n if (!rootNode) {\n throw new Error('未找到根节点');\n }\n // 转换元数据\n const assetMetadata = {\n name: metadata?.name || editorData.metadata?.name || 'Untitled Behavior Tree',\n description: metadata?.description || editorData.metadata?.description,\n version: metadata?.version || editorData.version || '1.0.0',\n createdAt: metadata?.createdAt || editorData.metadata?.createdAt,\n modifiedAt: metadata?.modifiedAt || new Date().toISOString()\n };\n // 转换节点\n const nodes = this.convertNodes(editorData.nodes);\n // 转换黑板\n const blackboard = this.convertBlackboard(editorData.blackboard);\n // 转换属性绑定\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 propertyBindings: propertyBindings.length > 0 ? propertyBindings : undefined\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 // 复制data,去除编辑器特有的字段\n const data = { ...editorNode.data };\n // 移除可能存在的UI相关字段\n delete data.nodeType; // 这个信息已经在nodeType字段中\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 // 推断类型\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 // 只处理属性类型的连接\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 // 检查 from 节点是否是黑板变量节点\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 // 转换节点\n const nodes = this.convertNodesFromAsset(asset.nodes);\n // 转换黑板\n const blackboard = {};\n for (const variable of asset.blackboard) {\n blackboard[variable.name] = variable.defaultValue;\n }\n // 转换属性绑定为连接\n const connections = this.convertPropertyBindingsToConnections(asset.propertyBindings || [], asset.nodes);\n // 添加节点连接(基于children关系)\n const nodeConnections = this.buildNodeConnections(asset.nodes);\n connections.push(...nodeConnections);\n const editorData = {\n version: asset.metadata.version,\n metadata: {\n name: asset.metadata.name,\n description: asset.metadata.description,\n createdAt: asset.metadata.createdAt,\n modifiedAt: asset.metadata.modifiedAt\n },\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 // 简单的自动布局:按索引计算位置\n const position = {\n x: 100 + (index % 5) * 250,\n y: 100 + Math.floor(index / 5) * 150\n };\n return {\n id: node.id,\n template: {\n displayName: node.name,\n category: this.inferCategory(node.nodeType),\n type: node.nodeType\n },\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, nodes) {\n const connections = [];\n for (const binding of bindings) {\n // 需要找到代表这个黑板变量的节点(如果有的话)\n // 这里简化处理,在实际使用中可能需要更复杂的逻辑\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 { encode, decode } from '@msgpack/msgpack';\nimport { createLogger } from '@esengine/ecs-framework';\nimport { BehaviorTreeAssetValidator } from './BehaviorTreeAsset';\nimport { EditorFormatConverter } from './EditorFormatConverter';\nconst logger = createLogger('BehaviorTreeAssetSerializer');\n/**\n * 行为树资产序列化器\n *\n * 支持JSON和二进制(MessagePack)两种格式\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 * 序列化为二进制格式(MessagePack)\n */\n static serializeToBinary(asset) {\n try {\n const binary = 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 = 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 = 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","import { Encoder } from \"./Encoder.mjs\";\n/**\n * It encodes `value` in the MessagePack format and\n * returns a byte buffer.\n *\n * The returned buffer is a slice of a larger `ArrayBuffer`, so you have to use its `#byteOffset` and `#byteLength` in order to convert it to another typed arrays including NodeJS `Buffer`.\n */\nexport function encode(value, options) {\n const encoder = new Encoder(options);\n return encoder.encodeSharedRef(value);\n}\n//# sourceMappingURL=encode.mjs.map","import { BehaviorTreeAssetSerializer } from '../Serialization/BehaviorTreeAssetSerializer';\nimport { createLogger } from '@esengine/ecs-framework';\nconst logger = createLogger('FileSystemAssetLoader');\n/**\n * 文件系统资产加载器\n *\n * 从文件系统加载行为树资产,支持 JSON 和 Binary 格式。\n * 提供资产缓存和预加载功能。\n *\n * @example\n * ```typescript\n * // 创建加载器\n * const loader = new FileSystemAssetLoader({\n * basePath: 'assets/behavior-trees',\n * format: 'json',\n * enableCache: true\n * });\n *\n * // 加载资产\n * const asset = await loader.loadBehaviorTree('patrol');\n * ```\n */\nexport class FileSystemAssetLoader {\n constructor(config) {\n this.cache = new Map();\n this.config = {\n basePath: config.basePath,\n format: config.format,\n extension: config.extension || (config.format === 'json' ? '.btree.json' : '.btree.bin'),\n enableCache: config.enableCache ?? true,\n readFile: config.readFile || this.defaultReadFile.bind(this)\n };\n // 规范化路径\n this.config.basePath = this.config.basePath.replace(/\\\\/g, '/').replace(/\\/$/, '');\n }\n /**\n * 加载行为树资产\n */\n async loadBehaviorTree(assetId) {\n // 检查缓存\n if (this.config.enableCache && this.cache.has(assetId)) {\n logger.debug(`从缓存加载资产: ${assetId}`);\n return this.cache.get(assetId);\n }\n logger.info(`加载行为树资产: ${assetId}`);\n try {\n // 构建文件路径\n const filePath = this.resolveAssetPath(assetId);\n // 读取文件\n const data = await this.config.readFile(filePath);\n // 反序列化(自动根据 data 类型判断格式)\n const options = {\n validate: true,\n strict: true\n };\n const asset = BehaviorTreeAssetSerializer.deserialize(data, options);\n // 缓存资产\n if (this.config.enableCache) {\n this.cache.set(assetId, asset);\n }\n logger.info(`成功加载资产: ${assetId}`);\n return asset;\n }\n catch (error) {\n logger.error(`加载资产失败: ${assetId}`, error);\n throw new Error(`Failed to load behavior tree asset '${assetId}': ${error}`);\n }\n }\n /**\n * 检查资产是否存在\n */\n async exists(assetId) {\n // 如果在缓存中,直接返回 true\n if (this.config.enableCache && this.cache.has(assetId)) {\n return true;\n }\n try {\n const filePath = this.resolveAssetPath(assetId);\n // 尝试读取文件(如果文件不存在会抛出异常)\n await this.config.readFile(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n /**\n * 预加载资产\n */\n async preload(assetIds) {\n logger.info(`预加载 ${assetIds.length} 个资产...`);\n const promises = assetIds.map(id => this.loadBehaviorTree(id).catch(error => {\n logger.warn(`预加载资产失败: ${id}`, error);\n }));\n await Promise.all(promises);\n logger.info(`预加载完成`);\n }\n /**\n * 卸载资产\n */\n unload(assetId) {\n if (this.cache.has(assetId)) {\n this.cache.delete(assetId);\n logger.debug(`卸载资产: ${assetId}`);\n }\n }\n /**\n * 清空缓存\n */\n clearCache() {\n this.cache.clear();\n logger.info('缓存已清空');\n }\n /**\n * 获取缓存的资产数量\n */\n getCacheSize() {\n return this.cache.size;\n }\n /**\n * 释放资源\n */\n dispose() {\n this.clearCache();\n }\n /**\n * 解析资产路径\n */\n resolveAssetPath(assetId) {\n // 移除开头的斜杠\n const normalizedId = assetId.replace(/^\\/+/, '');\n // 构建完整路径\n return `${this.config.basePath}/${normalizedId}${this.config.extension}`;\n }\n /**\n * 默认文件读取实现\n *\n * 注意:此实现依赖运行环境\n * - 浏览器:需要通过 fetch 或 XMLHttpRequest\n * - Node.js:需要使用 fs\n * - 游戏引擎:需要使用引擎的文件 API\n *\n * 用户应该提供自己的 readFile 实现\n */\n async defaultReadFile(path) {\n // 检测运行环境\n if (typeof window !== 'undefined' && typeof fetch !== 'undefined') {\n // 浏览器环境\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n if (this.config.format === 'binary') {\n const buffer = await response.arrayBuffer();\n return new Uint8Array(buffer);\n }\n else {\n return await response.text();\n }\n }\n else if (typeof require !== 'undefined') {\n // Node.js 环境\n try {\n const fs = require('fs').promises;\n if (this.config.format === 'binary') {\n const buffer = await fs.readFile(path);\n return new Uint8Array(buffer);\n }\n else {\n return await fs.readFile(path, 'utf-8');\n }\n }\n catch (error) {\n throw new Error(`Failed to read file '${path}': ${error}`);\n }\n }\n else {\n throw new Error('No default file reading implementation available. ' +\n 'Please provide a custom readFile function in the config.');\n }\n }\n}\n//# sourceMappingURL=FileSystemAssetLoader.js.map","import { createLogger } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\nimport { PropertyBindings } from '../Components/PropertyBindings';\nimport { NodeType } from '../Types/TaskStatus';\n// 导入所有节点组件\nimport { RootNode } from '../Components/Composites/RootNode';\nimport { SequenceNode } from '../Components/Composites/SequenceNode';\nimport { SelectorNode } from '../Components/Composites/SelectorNode';\nimport { ParallelNode } from '../Components/Composites/ParallelNode';\nimport { ParallelSelectorNode } from '../Components/Composites/ParallelSelectorNode';\nimport { RandomSequenceNode } from '../Components/Composites/RandomSequenceNode';\nimport { RandomSelectorNode } from '../Components/Composites/RandomSelectorNode';\nimport { InverterNode } from '../Components/Decorators/InverterNode';\nimport { RepeaterNode } from '../Components/Decorators/RepeaterNode';\nimport { UntilSuccessNode } from '../Components/Decorators/UntilSuccessNode';\nimport { UntilFailNode } from '../Components/Decorators/UntilFailNode';\nimport { AlwaysSucceedNode } from '../Components/Decorators/AlwaysSucceedNode';\nimport { AlwaysFailNode } from '../Components/Decorators/AlwaysFailNode';\nimport { ConditionalNode } from '../Components/Decorators/ConditionalNode';\nimport { CooldownNode } from '../Components/Decorators/CooldownNode';\nimport { TimeoutNode } from '../Components/Decorators/TimeoutNode';\nimport { WaitAction } from '../Components/Actions/WaitAction';\nimport { LogAction } from '../Components/Actions/LogAction';\nimport { SetBlackboardValueAction } from '../Components/Actions/SetBlackboardValueAction';\nimport { ModifyBlackboardValueAction } from '../Components/Actions/ModifyBlackboardValueAction';\nimport { ExecuteAction } from '../Components/Actions/ExecuteAction';\nimport { BlackboardCompareCondition, CompareOperator } from '../Components/Conditions/BlackboardCompareCondition';\nimport { BlackboardExistsCondition } from '../Components/Conditions/BlackboardExistsCondition';\nimport { RandomProbabilityCondition } from '../Components/Conditions/RandomProbabilityCondition';\nimport { ExecuteCondition } from '../Components/Conditions/ExecuteCondition';\nimport { AbortType } from '../Types/TaskStatus';\nconst logger = createLogger('BehaviorTreeAssetLoader');\n/**\n * 行为树资产加载器\n *\n * 将BehaviorTreeAsset实例化为可运行的Entity树\n */\nexport class BehaviorTreeAssetLoader {\n /**\n * 从资产实例化行为树\n *\n * @param asset 行为树资产\n * @param scene 目标场景\n * @param options 实例化选项\n * @returns 根实体\n *\n * @example\n * ```typescript\n * const asset = await loadAssetFromFile('enemy-ai.btree.bin');\n * const aiRoot = BehaviorTreeAssetLoader.instantiate(asset, scene);\n * BehaviorTreeStarter.start(aiRoot);\n * ```\n */\n static instantiate(asset, scene, options = {}) {\n logger.info(`开始实例化行为树: ${asset.metadata.name}`);\n // 创建节点映射\n const nodeMap = new Map();\n for (const node of asset.nodes) {\n nodeMap.set(node.id, node);\n }\n // 查找根节点\n const rootNodeData = nodeMap.get(asset.rootNodeId);\n if (!rootNodeData) {\n throw new Error(`未找到根节点: ${asset.rootNodeId}`);\n }\n // 创建实体映射\n const entityMap = new Map();\n // 递归创建实体树\n const rootEntity = this.createEntityTree(rootNodeData, nodeMap, entityMap, scene, options.namePrefix, options.asSubTree);\n // 添加黑板\n this.setupBlackboard(rootEntity, asset.blackboard, options.blackboardOverrides);\n // 设置属性绑定\n if (asset.propertyBindings && asset.propertyBindings.length > 0) {\n this.setupPropertyBindings(asset.propertyBindings, entityMap);\n }\n logger.info(`行为树实例化完成: ${asset.nodes.length} 个节点`);\n return rootEntity;\n }\n /**\n * 递归创建实体树\n */\n static createEntityTree(nodeData, nodeMap, entityMap, scene, namePrefix, asSubTree, isRootOfSubTree = true) {\n const entityName = namePrefix ? `${namePrefix}_${nodeData.name}` : nodeData.name;\n const entity = scene.createEntity(entityName);\n // 记录实体\n entityMap.set(nodeData.id, entity);\n // 添加BehaviorTreeNode组件\n const btNode = entity.addComponent(new BehaviorTreeNode());\n btNode.nodeType = nodeData.nodeType;\n btNode.nodeName = nodeData.name;\n // 添加节点特定组件(如果是子树的根节点,跳过 RootNode)\n this.addNodeComponents(entity, nodeData, asSubTree && isRootOfSubTree);\n // 递归创建子节点\n for (const childId of nodeData.children) {\n const childData = nodeMap.get(childId);\n if (!childData) {\n logger.warn(`子节点未找到: ${childId}`);\n continue;\n }\n const childEntity = this.createEntityTree(childData, nodeMap, entityMap, scene, namePrefix, asSubTree, false // 子节点不是根节点\n );\n entity.addChild(childEntity);\n }\n return entity;\n }\n /**\n * 添加节点特定组件\n * @param skipRootNode 是否跳过添加 RootNode 组件(用于子树)\n */\n static addNodeComponents(entity, nodeData, skipRootNode = false) {\n const { nodeType, data, name } = nodeData;\n logger.debug(`addNodeComponents: name=${name}, data.nodeType=${data.nodeType}, skipRootNode=${skipRootNode}`);\n // 根据节点类型和名称添加对应组件\n if (data.nodeType === 'root' || name === '根节点' || name === 'Root') {\n if (!skipRootNode) {\n logger.debug(`添加 RootNode 组件: ${name}`);\n entity.addComponent(new RootNode());\n }\n else {\n // 子树的根节点,使用第一个子节点的类型(通常是 SequenceNode)\n logger.debug(`跳过为子树根节点添加 RootNode: ${name}`);\n // 添加一个默认的 SequenceNode 作为子树的根\n this.addCompositeComponent(entity, '序列', data);\n }\n }\n // 组合节点\n else if (nodeType === NodeType.Composite) {\n this.addCompositeComponent(entity, name, data);\n }\n // 装饰器节点\n else if (nodeType === NodeType.Decorator) {\n this.addDecoratorComponent(entity, name, data);\n }\n // 动作节点\n else if (nodeType === NodeType.Action) {\n this.addActionComponent(entity, name, data);\n }\n // 条件节点\n else if (nodeType === NodeType.Condition) {\n this.addConditionComponent(entity, name, data);\n }\n }\n /**\n * 添加组合节点组件\n */\n static addCompositeComponent(entity, name, data) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes('sequence') || nameLower.includes('序列')) {\n const node = entity.addComponent(new SequenceNode());\n node.abortType = data.abortType ?? AbortType.None;\n }\n else if (nameLower.includes('selector') || nameLower.includes('选择')) {\n const node = entity.addComponent(new SelectorNode());\n node.abortType = data.abortType ?? AbortType.None;\n }\n else if (nameLower.includes('parallelselector') || nameLower.includes('并行选择')) {\n const node = entity.addComponent(new ParallelSelectorNode());\n node.failurePolicy = data.failurePolicy ?? 'one';\n }\n else if (nameLower.includes('parallel') || nameLower.includes('并行')) {\n const node = entity.addComponent(new ParallelNode());\n node.successPolicy = data.successPolicy ?? 'all';\n node.failurePolicy = data.failurePolicy ?? 'one';\n }\n else if (nameLower.includes('randomsequence') || nameLower.includes('随机序列')) {\n entity.addComponent(new RandomSequenceNode());\n }\n else if (nameLower.includes('randomselector') || nameLower.includes('随机选择')) {\n entity.addComponent(new RandomSelectorNode());\n }\n else {\n logger.warn(`未知的组合节点类型: ${name}`);\n }\n }\n /**\n * 添加装饰器组件\n */\n static addDecoratorComponent(entity, name, data) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes('inverter') || nameLower.includes('反转')) {\n entity.addComponent(new InverterNode());\n }\n else if (nameLower.includes('repeater') || nameLower.includes('重复')) {\n const node = entity.addComponent(new RepeaterNode());\n node.repeatCount = data.repeatCount ?? -1;\n node.endOnFailure = data.endOnFailure ?? false;\n }\n else if (nameLower.includes('untilsuccess') || nameLower.includes('直到成功')) {\n entity.addComponent(new UntilSuccessNode());\n }\n else if (nameLower.includes('untilfail') || nameLower.includes('直到失败')) {\n entity.addComponent(new UntilFailNode());\n }\n else if (nameLower.includes('alwayssucceed') || nameLower.includes('总是成功')) {\n entity.addComponent(new AlwaysSucceedNode());\n }\n else if (nameLower.includes('alwaysfail') || nameLower.includes('总是失败')) {\n entity.addComponent(new AlwaysFailNode());\n }\n else if (nameLower.includes('conditional') || nameLower.includes('条件装饰')) {\n const node = entity.addComponent(new ConditionalNode());\n node.conditionCode = data.conditionCode ?? '';\n node.shouldReevaluate = data.shouldReevaluate ?? true;\n }\n else if (nameLower.includes('cooldown') || nameLower.includes('冷却')) {\n const node = entity.addComponent(new CooldownNode());\n node.cooldownTime = data.cooldownTime ?? 1.0;\n }\n else if (nameLower.includes('timeout') || nameLower.includes('超时')) {\n const node = entity.addComponent(new TimeoutNode());\n node.timeoutDuration = data.timeoutDuration ?? 1.0;\n }\n else {\n logger.warn(`未知的装饰器类型: ${name}`);\n }\n }\n /**\n * 添加动作组件\n */\n static addActionComponent(entity, name, data) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes('wait') || nameLower.includes('等待')) {\n const action = entity.addComponent(new WaitAction());\n action.waitTime = data.waitTime ?? 1.0;\n }\n else if (nameLower.includes('log') || nameLower.includes('日志')) {\n const action = entity.addComponent(new LogAction());\n action.message = data.message ?? '';\n action.level = data.level ?? 'log';\n }\n else if (nameLower.includes('setblackboard') || nameLower.includes('setvalue') || nameLower.includes('设置变量')) {\n const action = entity.addComponent(new SetBlackboardValueAction());\n action.variableName = data.variableName ?? '';\n action.value = data.value;\n }\n else if (nameLower.includes('modifyblackboard') || nameLower.includes('modifyvalue') || nameLower.includes('修改变量')) {\n const action = entity.addComponent(new ModifyBlackboardValueAction());\n action.variableName = data.variableName ?? '';\n action.operation = data.operation ?? 'add';\n action.operand = data.operand ?? 0;\n }\n else if (nameLower.includes('execute') || nameLower.includes('自定义')) {\n const action = entity.addComponent(new ExecuteAction());\n action.actionCode = data.actionCode ?? 'return TaskStatus.Success;';\n }\n else {\n logger.warn(`未知的动作类型: ${name}`);\n }\n }\n /**\n * 添加条件组件\n */\n static addConditionComponent(entity, name, data) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes('compare') || nameLower.includes('比较变量')) {\n const condition = entity.addComponent(new BlackboardCompareCondition());\n condition.variableName = data.variableName ?? '';\n condition.operator = data.operator ?? CompareOperator.Equal;\n condition.compareValue = data.compareValue;\n condition.invertResult = data.invertResult ?? false;\n }\n else if (nameLower.includes('exists') || nameLower.includes('变量存在')) {\n const condition = entity.addComponent(new BlackboardExistsCondition());\n condition.variableName = data.variableName ?? '';\n condition.checkNotNull = data.checkNotNull ?? false;\n condition.invertResult = data.invertResult ?? false;\n }\n else if (nameLower.includes('random') || nameLower.includes('概率')) {\n const condition = entity.addComponent(new RandomProbabilityCondition());\n condition.probability = data.probability ?? 0.5;\n }\n else if (nameLower.includes('execute') || nameLower.includes('执行条件')) {\n const condition = entity.addComponent(new ExecuteCondition());\n condition.conditionCode = data.conditionCode ?? '';\n condition.invertResult = data.invertResult ?? false;\n }\n else {\n logger.warn(`未知的条件类型: ${name}`);\n }\n }\n /**\n * 设置黑板\n */\n static setupBlackboard(rootEntity, blackboardDef, overrides) {\n const blackboard = rootEntity.addComponent(new BlackboardComponent());\n for (const variable of blackboardDef) {\n const value = overrides && overrides[variable.name] !== undefined\n ? overrides[variable.name]\n : variable.defaultValue;\n blackboard.defineVariable(variable.name, variable.type, value, {\n readonly: variable.readonly,\n description: variable.description\n });\n }\n logger.info(`已设置黑板: ${blackboardDef.length} 个变量`);\n }\n /**\n * 设置属性绑定\n */\n static setupPropertyBindings(bindings, entityMap) {\n for (const binding of bindings) {\n const entity = entityMap.get(binding.nodeId);\n if (!entity) {\n logger.warn(`属性绑定引用的节点不存在: ${binding.nodeId}`);\n continue;\n }\n let propertyBindings = entity.getComponent(PropertyBindings);\n if (!propertyBindings) {\n propertyBindings = entity.addComponent(new PropertyBindings());\n }\n propertyBindings.addBinding(binding.propertyName, binding.variableName);\n }\n logger.info(`已设置属性绑定: ${bindings.length} 个绑定`);\n }\n}\n//# sourceMappingURL=BehaviorTreeAssetLoader.js.map","/**\n * 资产加载状态\n */\nexport var LoadingState;\n(function (LoadingState) {\n /** 未开始 */\n LoadingState[\"Idle\"] = \"idle\";\n /** 即将开始 */\n LoadingState[\"Pending\"] = \"pending\";\n /** 加载中 */\n LoadingState[\"Loading\"] = \"loading\";\n /** 加载成功 */\n LoadingState[\"Loaded\"] = \"loaded\";\n /** 加载失败 */\n LoadingState[\"Failed\"] = \"failed\";\n /** 加载超时 */\n LoadingState[\"Timeout\"] = \"timeout\";\n /** 已取消 */\n LoadingState[\"Cancelled\"] = \"cancelled\";\n})(LoadingState || (LoadingState = {}));\n/**\n * 超时错误\n */\nexport class TimeoutError extends Error {\n constructor(message) {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n/**\n * 循环依赖错误\n */\nexport class CircularDependencyError extends Error {\n constructor(message) {\n super(message);\n this.name = 'CircularDependencyError';\n }\n}\n/**\n * 实体已销毁错误\n */\nexport class EntityDestroyedError extends Error {\n constructor(message) {\n super(message);\n this.name = 'EntityDestroyedError';\n }\n}\n//# sourceMappingURL=AssetLoadingTypes.js.map","import { EntitySystem, Matcher, Time } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\nimport { ActiveNode } from '../Components/ActiveNode';\nimport { PropertyBindings } from '../Components/PropertyBindings';\nimport { LogOutput } from '../Components/LogOutput';\nimport { TaskStatus, NodeType } from '../Types/TaskStatus';\n// 导入具体的动作组件\nimport { WaitAction } from '../Components/Actions/WaitAction';\nimport { LogAction } from '../Components/Actions/LogAction';\nimport { SetBlackboardValueAction } from '../Components/Actions/SetBlackboardValueAction';\nimport { ModifyBlackboardValueAction, ModifyOperation } from '../Components/Actions/ModifyBlackboardValueAction';\nimport { ExecuteAction } from '../Components/Actions/ExecuteAction';\n// 导入具体的条件组件\nimport { BlackboardCompareCondition, CompareOperator } from '../Components/Conditions/BlackboardCompareCondition';\nimport { BlackboardExistsCondition } from '../Components/Conditions/BlackboardExistsCondition';\nimport { RandomProbabilityCondition } from '../Components/Conditions/RandomProbabilityCondition';\nimport { ExecuteCondition } from '../Components/Conditions/ExecuteCondition';\n/**\n * 叶子节点执行系统\n *\n * 负责执行所有活跃的叶子节点(Action 和 Condition)\n * 只处理带有 ActiveNode 标记的节点\n *\n * updateOrder: 100 (最先执行)\n */\nexport class LeafExecutionSystem extends EntitySystem {\n constructor() {\n // 只处理活跃的叶子节点\n super(Matcher.empty().all(BehaviorTreeNode, ActiveNode));\n this.updateOrder = 100;\n }\n process(entities) {\n for (const entity of entities) {\n const node = entity.getComponent(BehaviorTreeNode);\n // 只处理叶子节点\n if (node.nodeType === NodeType.Action) {\n this.executeAction(entity, node);\n }\n else if (node.nodeType === NodeType.Condition) {\n this.executeCondition(entity, node);\n }\n }\n }\n /**\n * 执行动作节点\n */\n executeAction(entity, node) {\n let status = TaskStatus.Failure;\n const { displayName, nodeIdShort } = this.getNodeInfo(entity);\n // 检测实体有哪些动作组件并执行\n if (entity.hasComponent(WaitAction)) {\n status = this.executeWaitAction(entity);\n }\n else if (entity.hasComponent(LogAction)) {\n status = this.executeLogAction(entity);\n }\n else if (entity.hasComponent(SetBlackboardValueAction)) {\n status = this.executeSetBlackboardValue(entity);\n }\n else if (entity.hasComponent(ModifyBlackboardValueAction)) {\n status = this.executeModifyBlackboardValue(entity);\n }\n else if (entity.hasComponent(ExecuteAction)) {\n status = this.executeCustomAction(entity);\n }\n else {\n this.outputLog(entity, `动作节点没有找到任何已知的动作组件`, 'warn');\n }\n node.status = status;\n // 输出节点执行后的状态\n const statusText = status === TaskStatus.Success ? 'Success' :\n status === TaskStatus.Failure ? 'Failure' :\n status === TaskStatus.Running ? 'Running' : 'Unknown';\n if (status !== TaskStatus.Running) {\n this.outputLog(entity, `[${displayName}#${nodeIdShort}] 执行完成 -> ${statusText}`, status === TaskStatus.Success ? 'info' : 'warn');\n }\n // 如果不是 Running 状态,节点执行完成\n if (status !== TaskStatus.Running) {\n this.deactivateNode(entity);\n this.notifyParent(entity);\n }\n }\n /**\n * 执行等待动作\n */\n executeWaitAction(entity) {\n const waitAction = entity.getComponent(WaitAction);\n const node = entity.getComponent(BehaviorTreeNode);\n const { displayName, nodeIdShort } = this.getNodeInfo(entity);\n // 从 PropertyBindings 读取绑定的黑板变量值\n const waitTime = this.resolvePropertyValue(entity, 'waitTime', waitAction.waitTime);\n waitAction.elapsedTime += Time.deltaTime;\n // 输出调试信息(显示在UI中)\n this.outputLog(entity, `[${displayName}#${nodeIdShort}] deltaTime=${Time.deltaTime.toFixed(3)}s, ` +\n `elapsed=${waitAction.elapsedTime.toFixed(3)}s/${waitTime.toFixed(3)}s`, 'info');\n if (waitAction.elapsedTime >= waitTime) {\n waitAction.reset();\n this.outputLog(entity, `[${displayName}#${nodeIdShort}] 等待完成,返回成功`, 'info');\n return TaskStatus.Success;\n }\n return TaskStatus.Running;\n }\n /**\n * 执行日志动作\n */\n executeLogAction(entity) {\n const logAction = entity.getComponent(LogAction);\n const node = entity.getComponent(BehaviorTreeNode);\n // 从 PropertyBindings 读取绑定的黑板变量值\n let message = this.resolvePropertyValue(entity, 'message', logAction.message);\n const { displayName, nodeIdShort } = this.getNodeInfo(entity);\n // 在消息前添加节点ID信息\n if (node) {\n message = `[${displayName}#${nodeIdShort}] ${message}`;\n }\n if (logAction.includeEntityInfo) {\n message = `[Entity: ${entity.name}] ${message}`;\n }\n // 输出到浏览器控制台\n switch (logAction.level) {\n case 'info':\n console.info(message);\n break;\n case 'warn':\n console.warn(message);\n break;\n case 'error':\n console.error(message);\n break;\n default:\n console.log(message);\n break;\n }\n // 同时记录到LogOutput组件,以便在UI中显示\n const rootEntity = this.findRootEntity(entity);\n if (rootEntity) {\n const logOutput = rootEntity.getComponent(LogOutput);\n if (logOutput) {\n logOutput.addMessage(message, logAction.level);\n }\n }\n return TaskStatus.Success;\n }\n /**\n * 查找根实体\n */\n findRootEntity(entity) {\n let current = entity;\n while (current) {\n if (!current.parent) {\n return current;\n }\n current = current.parent;\n }\n return null;\n }\n /**\n * 执行设置黑板变量值\n */\n executeSetBlackboardValue(entity) {\n const action = entity.getComponent(SetBlackboardValueAction);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard) {\n this.outputLog(entity, '未找到黑板组件', 'warn');\n return TaskStatus.Failure;\n }\n let valueToSet;\n // 如果指定了源变量,从中读取值\n if (action.sourceVariable) {\n if (!blackboard.hasVariable(action.sourceVariable)) {\n this.outputLog(entity, `源变量不存在: ${action.sourceVariable}`, 'warn');\n return TaskStatus.Failure;\n }\n valueToSet = blackboard.getValue(action.sourceVariable);\n }\n else {\n // 从 PropertyBindings 读取绑定的值\n valueToSet = this.resolvePropertyValue(entity, 'value', action.value);\n }\n const success = blackboard.setValue(action.variableName, valueToSet, action.force);\n return success ? TaskStatus.Success : TaskStatus.Failure;\n }\n /**\n * 执行修改黑板变量值\n */\n executeModifyBlackboardValue(entity) {\n const action = entity.getComponent(ModifyBlackboardValueAction);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard) {\n this.outputLog(entity, '未找到黑板组件', 'warn');\n return TaskStatus.Failure;\n }\n if (!blackboard.hasVariable(action.variableName)) {\n this.outputLog(entity, `变量不存在: ${action.variableName}`, 'warn');\n return TaskStatus.Failure;\n }\n let currentValue = blackboard.getValue(action.variableName);\n // 从 PropertyBindings 读取绑定的值\n let operand = this.resolvePropertyValue(entity, 'operand', action.operand);\n // 执行操作\n let newValue;\n switch (action.operation) {\n case ModifyOperation.Add:\n newValue = Number(currentValue) + Number(operand);\n break;\n case ModifyOperation.Subtract:\n newValue = Number(currentValue) - Number(operand);\n break;\n case ModifyOperation.Multiply:\n newValue = Number(currentValue) * Number(operand);\n break;\n case ModifyOperation.Divide:\n if (Number(operand) === 0) {\n this.outputLog(entity, '除数不能为0', 'warn');\n return TaskStatus.Failure;\n }\n newValue = Number(currentValue) / Number(operand);\n break;\n case ModifyOperation.Modulo:\n newValue = Number(currentValue) % Number(operand);\n break;\n case ModifyOperation.Append:\n if (Array.isArray(currentValue)) {\n newValue = [...currentValue, operand];\n }\n else if (typeof currentValue === 'string') {\n newValue = currentValue + operand;\n }\n else {\n this.outputLog(entity, `变量 ${action.variableName} 不支持 append 操作`, 'warn');\n return TaskStatus.Failure;\n }\n break;\n case ModifyOperation.Remove:\n if (Array.isArray(currentValue)) {\n newValue = currentValue.filter(item => item !== operand);\n }\n else {\n this.outputLog(entity, `变量 ${action.variableName} 不是数组,不支持 remove 操作`, 'warn');\n return TaskStatus.Failure;\n }\n break;\n default:\n return TaskStatus.Failure;\n }\n const success = blackboard.setValue(action.variableName, newValue, action.force);\n return success ? TaskStatus.Success : TaskStatus.Failure;\n }\n /**\n * 执行自定义动作\n */\n executeCustomAction(entity) {\n const action = entity.getComponent(ExecuteAction);\n const func = action.getFunction();\n if (!func) {\n return TaskStatus.Failure;\n }\n const blackboard = this.findBlackboard(entity);\n return func(entity, blackboard, Time.deltaTime);\n }\n /**\n * 执行条件节点\n */\n executeCondition(entity, node) {\n let result = false;\n const { displayName, nodeIdShort } = this.getNodeInfo(entity);\n // 检测实体有哪些条件组件并评估\n if (entity.hasComponent(BlackboardCompareCondition)) {\n result = this.evaluateBlackboardCompare(entity);\n }\n else if (entity.hasComponent(BlackboardExistsCondition)) {\n result = this.evaluateBlackboardExists(entity);\n }\n else if (entity.hasComponent(RandomProbabilityCondition)) {\n result = this.evaluateRandomProbability(entity);\n }\n else if (entity.hasComponent(ExecuteCondition)) {\n result = this.evaluateCustomCondition(entity);\n }\n else {\n this.outputLog(entity, '条件节点没有找到任何已知的条件组件', 'warn');\n }\n node.status = result ? TaskStatus.Success : TaskStatus.Failure;\n // 输出条件评估结果\n const statusText = result ? 'Success (true)' : 'Failure (false)';\n this.outputLog(entity, `[${displayName}#${nodeIdShort}] 条件评估 -> ${statusText}`, result ? 'info' : 'warn');\n // 条件节点总是立即完成\n this.deactivateNode(entity);\n this.notifyParent(entity);\n }\n /**\n * 评估黑板比较条件\n */\n evaluateBlackboardCompare(entity) {\n const condition = entity.getComponent(BlackboardCompareCondition);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard || !blackboard.hasVariable(condition.variableName)) {\n return false;\n }\n const value = blackboard.getValue(condition.variableName);\n // 从 PropertyBindings 读取绑定的值\n let compareValue = this.resolvePropertyValue(entity, 'compareValue', condition.compareValue);\n let result = false;\n switch (condition.operator) {\n case CompareOperator.Equal:\n result = value === compareValue;\n break;\n case CompareOperator.NotEqual:\n result = value !== compareValue;\n break;\n case CompareOperator.Greater:\n result = value > compareValue;\n break;\n case CompareOperator.GreaterOrEqual:\n result = value >= compareValue;\n break;\n case CompareOperator.Less:\n result = value < compareValue;\n break;\n case CompareOperator.LessOrEqual:\n result = value <= compareValue;\n break;\n case CompareOperator.Contains:\n if (typeof value === 'string') {\n result = value.includes(compareValue);\n }\n else if (Array.isArray(value)) {\n result = value.includes(compareValue);\n }\n break;\n case CompareOperator.Matches:\n if (typeof value === 'string' && typeof compareValue === 'string') {\n const regex = new RegExp(compareValue);\n result = regex.test(value);\n }\n break;\n }\n return condition.invertResult ? !result : result;\n }\n /**\n * 评估黑板变量存在性\n */\n evaluateBlackboardExists(entity) {\n const condition = entity.getComponent(BlackboardExistsCondition);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard) {\n return false;\n }\n let result = blackboard.hasVariable(condition.variableName);\n if (result && condition.checkNotNull) {\n const value = blackboard.getValue(condition.variableName);\n result = value !== null && value !== undefined;\n }\n return condition.invertResult ? !result : result;\n }\n /**\n * 评估随机概率\n */\n evaluateRandomProbability(entity) {\n const condition = entity.getComponent(RandomProbabilityCondition);\n // 从 PropertyBindings 读取绑定的黑板变量值\n const probability = this.resolvePropertyValue(entity, 'probability', condition.probability);\n // 使用解析后的概率值进行评估\n if (condition.alwaysRandomize || condition['cachedResult'] === undefined) {\n condition['cachedResult'] = Math.random() < probability;\n }\n return condition['cachedResult'];\n }\n /**\n * 评估自定义条件\n */\n evaluateCustomCondition(entity) {\n const condition = entity.getComponent(ExecuteCondition);\n const func = condition.getFunction();\n if (!func) {\n return false;\n }\n const blackboard = this.findBlackboard(entity);\n const result = func(entity, blackboard, Time.deltaTime);\n return condition.invertResult ? !result : result;\n }\n /**\n * 解析属性值\n * 如果属性绑定到黑板变量,从黑板读取最新值\n */\n resolvePropertyValue(entity, propertyName, defaultValue) {\n // 检查实体是否有 PropertyBindings 组件\n const bindings = entity.getComponent(PropertyBindings);\n if (!bindings || !bindings.hasBinding(propertyName)) {\n // 没有绑定,返回默认值\n return defaultValue;\n }\n // 有绑定,从黑板读取值\n const blackboardKey = bindings.getBinding(propertyName);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard) {\n this.outputLog(entity, `[属性绑定] 未找到黑板组件,实体: ${entity.name}`, 'warn');\n return defaultValue;\n }\n if (!blackboard.hasVariable(blackboardKey)) {\n this.outputLog(entity, `[属性绑定] 黑板变量不存在: ${blackboardKey}`, 'warn');\n return defaultValue;\n }\n const value = blackboard.getValue(blackboardKey);\n return value;\n }\n /**\n * 移除节点的活跃标记\n */\n deactivateNode(entity) {\n entity.removeComponentByType(ActiveNode);\n }\n /**\n * 通知父节点子节点已完成\n */\n notifyParent(entity) {\n if (entity.parent && entity.parent.hasComponent(BehaviorTreeNode)) {\n // 为父节点添加活跃标记,让它在下一帧被处理\n if (!entity.parent.hasComponent(ActiveNode)) {\n entity.parent.addComponent(new ActiveNode());\n }\n }\n }\n /**\n * 查找黑板组件(向上遍历父节点)\n */\n findBlackboard(entity) {\n let current = entity;\n while (current) {\n const blackboard = current.getComponent(BlackboardComponent);\n if (blackboard) {\n return blackboard;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 从Entity提取节点显示名称和ID\n */\n getNodeInfo(entity) {\n let displayName = 'Node';\n let nodeIdShort = '';\n if (entity.name && entity.name.includes('#')) {\n const parts = entity.name.split('#');\n displayName = parts[0];\n nodeIdShort = parts[1];\n }\n else {\n nodeIdShort = entity.id.toString().substring(0, 8);\n }\n return { displayName, nodeIdShort };\n }\n /**\n * 统一的日志输出方法\n * 同时输出到控制台和LogOutput组件,确保用户在UI中能看到\n */\n outputLog(entity, message, level = 'info') {\n // 输出到浏览器控制台(方便开发调试)\n switch (level) {\n case 'info':\n this.logger.info(message);\n break;\n case 'warn':\n this.logger.warn(message);\n break;\n case 'error':\n this.logger.error(message);\n break;\n default:\n this.logger.info(message);\n break;\n }\n // 输出到LogOutput组件(显示在UI中)\n const rootEntity = this.findRootEntity(entity);\n if (rootEntity) {\n const logOutput = rootEntity.getComponent(LogOutput);\n if (logOutput) {\n logOutput.addMessage(message, level);\n }\n }\n }\n getLoggerName() {\n return 'LeafExecutionSystem';\n }\n}\n//# sourceMappingURL=LeafExecutionSystem.js.map","import { EntitySystem, Matcher, Time } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { DecoratorNodeComponent } from '../Components/DecoratorNodeComponent';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\nimport { ActiveNode } from '../Components/ActiveNode';\nimport { PropertyBindings } from '../Components/PropertyBindings';\nimport { LogOutput } from '../Components/LogOutput';\nimport { TaskStatus, NodeType, DecoratorType } from '../Types/TaskStatus';\n/**\n * 装饰器节点执行系统\n *\n * 负责处理所有活跃的装饰器节点\n * 读取子节点状态,根据装饰器规则决定自己的状态\n *\n * updateOrder: 200 (在叶子节点之后执行)\n */\nexport class DecoratorExecutionSystem extends EntitySystem {\n constructor() {\n super(Matcher.empty().all(BehaviorTreeNode, ActiveNode));\n this.updateOrder = 200;\n }\n process(entities) {\n for (const entity of entities) {\n const node = entity.getComponent(BehaviorTreeNode);\n // 只处理装饰器节点\n if (node.nodeType !== NodeType.Decorator) {\n continue;\n }\n // 使用 getComponentByType 支持继承查找\n const decorator = entity.getComponentByType(DecoratorNodeComponent);\n if (!decorator) {\n continue;\n }\n this.executeDecorator(entity, node, decorator);\n }\n }\n /**\n * 执行装饰器逻辑\n */\n executeDecorator(entity, node, decorator) {\n const children = entity.children;\n if (children.length === 0) {\n this.logger.warn('装饰器节点没有子节点');\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n const child = children[0]; // 装饰器只有一个子节点\n const childNode = child.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 根据装饰器类型处理\n switch (decorator.decoratorType) {\n case DecoratorType.Inverter:\n this.handleInverter(entity, node, child, childNode);\n break;\n case DecoratorType.Repeater:\n this.handleRepeater(entity, node, decorator, child, childNode);\n break;\n case DecoratorType.UntilSuccess:\n this.handleUntilSuccess(entity, node, child, childNode);\n break;\n case DecoratorType.UntilFail:\n this.handleUntilFail(entity, node, child, childNode);\n break;\n case DecoratorType.AlwaysSucceed:\n this.handleAlwaysSucceed(entity, node, child, childNode);\n break;\n case DecoratorType.AlwaysFail:\n this.handleAlwaysFail(entity, node, child, childNode);\n break;\n case DecoratorType.Conditional:\n this.handleConditional(entity, node, decorator, child, childNode);\n break;\n case DecoratorType.Cooldown:\n this.handleCooldown(entity, node, decorator, child, childNode);\n break;\n case DecoratorType.Timeout:\n this.handleTimeout(entity, node, decorator, child, childNode);\n break;\n default:\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n break;\n }\n }\n /**\n * 反转装饰器\n */\n handleInverter(entity, node, child, childNode) {\n if (!child.hasComponent(ActiveNode)) {\n // 子节点未激活,激活它\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n }\n else {\n // 子节点正在执行\n node.status = TaskStatus.Running;\n }\n // 如果子节点完成了\n if (childNode.status === TaskStatus.Success || childNode.status === TaskStatus.Failure) {\n // 反转结果\n node.status = childNode.status === TaskStatus.Success ? TaskStatus.Failure : TaskStatus.Success;\n this.completeNode(entity);\n }\n }\n /**\n * 重复装饰器\n */\n handleRepeater(entity, node, decorator, child, childNode) {\n const repeater = decorator;\n // 从 PropertyBindings 读取绑定的黑板变量值\n const repeatCount = this.resolvePropertyValue(entity, 'repeatCount', repeater.repeatCount);\n const endOnFailure = this.resolvePropertyValue(entity, 'endOnFailure', repeater.endOnFailure);\n // 如果子节点未激活,激活它\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n // 子节点正在执行\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n return;\n }\n // 子节点完成\n if (childNode.status === TaskStatus.Failure && endOnFailure) {\n node.status = TaskStatus.Failure;\n repeater.reset();\n this.completeNode(entity);\n return;\n }\n // 增加重复计数\n repeater.incrementRepeat();\n // 检查是否继续重复(使用解析后的值)\n const shouldContinue = (repeatCount === -1) || (repeater.currentRepeatCount < repeatCount);\n if (shouldContinue) {\n // 重置子节点并继续\n childNode.invalidate();\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n }\n else {\n // 完成\n node.status = TaskStatus.Success;\n repeater.reset();\n this.completeNode(entity);\n }\n }\n /**\n * 直到成功装饰器\n */\n handleUntilSuccess(entity, node, child, childNode) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Success) {\n node.status = TaskStatus.Success;\n this.completeNode(entity);\n }\n else {\n // 失败则重试\n childNode.invalidate();\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 直到失败装饰器\n */\n handleUntilFail(entity, node, child, childNode) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Failure) {\n node.status = TaskStatus.Success;\n this.completeNode(entity);\n }\n else {\n // 成功则重试\n childNode.invalidate();\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 总是成功装饰器\n */\n handleAlwaysSucceed(entity, node, child, childNode) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else {\n node.status = TaskStatus.Success;\n this.completeNode(entity);\n }\n }\n /**\n * 总是失败装饰器\n */\n handleAlwaysFail(entity, node, child, childNode) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n }\n }\n /**\n * 条件装饰器\n */\n handleConditional(entity, node, decorator, child, childNode) {\n const conditional = decorator;\n // 评估条件\n const conditionMet = conditional.evaluateCondition(entity, this.findBlackboard(entity));\n if (!conditionMet) {\n // 条件不满足,直接失败\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 条件满足,执行子节点\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n node.status = childNode.status;\n if (childNode.status !== TaskStatus.Running) {\n this.completeNode(entity);\n }\n }\n /**\n * 冷却装饰器\n */\n handleCooldown(entity, node, decorator, child, childNode) {\n const cooldown = decorator;\n // 从 PropertyBindings 读取绑定的黑板变量值\n const cooldownTime = this.resolvePropertyValue(entity, 'cooldownTime', cooldown.cooldownTime);\n // 检查冷却(使用解析后的值)\n // 如果从未执行过(lastExecutionTime === 0),允许执行\n const timeSinceLastExecution = Time.totalTime - cooldown.lastExecutionTime;\n const canExecute = (cooldown.lastExecutionTime === 0) || (timeSinceLastExecution >= cooldownTime);\n // 添加调试日志\n this.outputLog(entity, `[冷却检查] Time.totalTime=${Time.totalTime.toFixed(3)}, lastExecution=${cooldown.lastExecutionTime.toFixed(3)}, ` +\n `cooldownTime=${cooldownTime}, timeSince=${timeSinceLastExecution.toFixed(3)}, canExecute=${canExecute}, childStatus=${childNode.status}`, 'info');\n if (!canExecute) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 先检查子节点状态,再决定是否激活\n if (childNode.status !== TaskStatus.Invalid && childNode.status !== TaskStatus.Running) {\n // 子节点已经完成(Success 或 Failure)\n node.status = childNode.status;\n cooldown.recordExecution(Time.totalTime);\n this.outputLog(entity, `[冷却记录] 记录执行时间: ${Time.totalTime.toFixed(3)}, 下次可执行时间: ${(Time.totalTime + cooldownTime).toFixed(3)}`, 'info');\n this.completeNode(entity);\n return;\n }\n // 子节点还没开始或正在执行\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n node.status = TaskStatus.Running;\n }\n /**\n * 超时装饰器\n */\n handleTimeout(entity, node, decorator, child, childNode) {\n const timeout = decorator;\n // 从 PropertyBindings 读取绑定的黑板变量值\n const timeoutDuration = this.resolvePropertyValue(entity, 'timeoutDuration', timeout.timeoutDuration);\n timeout.recordStartTime(Time.totalTime);\n // 检查超时(使用解析后的值)\n const isTimeout = timeout.startTime > 0 && (Time.totalTime - timeout.startTime >= timeoutDuration);\n if (isTimeout) {\n node.status = TaskStatus.Failure;\n timeout.reset();\n // 移除子节点的活跃标记\n child.removeComponentByType(ActiveNode);\n this.completeNode(entity);\n return;\n }\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n node.status = TaskStatus.Running;\n return;\n }\n node.status = childNode.status;\n if (childNode.status !== TaskStatus.Running) {\n timeout.reset();\n this.completeNode(entity);\n }\n }\n /**\n * 完成节点执行\n */\n completeNode(entity) {\n entity.removeComponentByType(ActiveNode);\n // 通知父节点\n if (entity.parent && entity.parent.hasComponent(BehaviorTreeNode)) {\n if (!entity.parent.hasComponent(ActiveNode)) {\n entity.parent.addComponent(new ActiveNode());\n }\n }\n }\n /**\n * 查找黑板组件(向上遍历父节点)\n */\n findBlackboard(entity) {\n let current = entity;\n while (current) {\n const blackboard = current.getComponent(BlackboardComponent);\n if (blackboard) {\n return blackboard;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 解析属性值\n * 如果属性绑定到黑板变量,从黑板读取最新值\n */\n resolvePropertyValue(entity, propertyName, defaultValue) {\n const bindings = entity.getComponent(PropertyBindings);\n if (!bindings || !bindings.hasBinding(propertyName)) {\n return defaultValue;\n }\n const blackboardKey = bindings.getBinding(propertyName);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard || !blackboard.hasVariable(blackboardKey)) {\n return defaultValue;\n }\n return blackboard.getValue(blackboardKey);\n }\n /**\n * 查找根实体\n */\n findRootEntity(entity) {\n let current = entity;\n while (current) {\n if (!current.parent) {\n return current;\n }\n current = current.parent;\n }\n return null;\n }\n /**\n * 统一的日志输出方法\n * 同时输出到控制台和LogOutput组件,确保用户在UI中能看到\n */\n outputLog(entity, message, level = 'info') {\n switch (level) {\n case 'info':\n this.logger.info(message);\n break;\n case 'warn':\n this.logger.warn(message);\n break;\n case 'error':\n this.logger.error(message);\n break;\n default:\n this.logger.info(message);\n break;\n }\n const rootEntity = this.findRootEntity(entity);\n if (rootEntity) {\n const logOutput = rootEntity.getComponent(LogOutput);\n if (logOutput) {\n logOutput.addMessage(message, level);\n }\n }\n }\n getLoggerName() {\n return 'DecoratorExecutionSystem';\n }\n}\n//# sourceMappingURL=DecoratorExecutionSystem.js.map","import { EntitySystem, Matcher } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { CompositeNodeComponent } from '../Components/CompositeNodeComponent';\nimport { ActiveNode } from '../Components/ActiveNode';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\nimport { TaskStatus, NodeType, CompositeType, AbortType } from '../Types/TaskStatus';\nimport { SequenceNode } from '../Components/Composites/SequenceNode';\nimport { SelectorNode } from '../Components/Composites/SelectorNode';\nimport { RootNode } from '../Components/Composites/RootNode';\nimport { SubTreeNode } from '../Components/Composites/SubTreeNode';\nimport { BlackboardCompareCondition, CompareOperator } from '../Components/Conditions/BlackboardCompareCondition';\nimport { BlackboardExistsCondition } from '../Components/Conditions/BlackboardExistsCondition';\nimport { RandomProbabilityCondition } from '../Components/Conditions/RandomProbabilityCondition';\nimport { ExecuteCondition } from '../Components/Conditions/ExecuteCondition';\n/**\n * 复合节点执行系统\n *\n * 负责处理所有活跃的复合节点\n * 读取子节点状态,根据复合规则决定自己的状态和激活哪些子节点\n *\n * updateOrder: 300 (在叶子节点和装饰器之后执行)\n */\nexport class CompositeExecutionSystem extends EntitySystem {\n constructor() {\n super(Matcher.empty().all(BehaviorTreeNode, ActiveNode).exclude(RootNode, SubTreeNode));\n this.updateOrder = 300;\n }\n process(entities) {\n for (const entity of entities) {\n const node = entity.getComponent(BehaviorTreeNode);\n // 只处理复合节点\n if (node.nodeType !== NodeType.Composite) {\n continue;\n }\n // 使用 getComponentByType 支持继承查找\n const composite = entity.getComponentByType(CompositeNodeComponent);\n if (!composite) {\n this.logger.warn(`复合节点 ${entity.name} 没有找到复合节点组件`);\n const components = entity.components.map(c => c.constructor.name).join(', ');\n this.logger.warn(` 组件列表: ${components}`);\n continue;\n }\n this.executeComposite(entity, node, composite);\n }\n }\n /**\n * 执行复合节点逻辑\n */\n executeComposite(entity, node, composite) {\n const children = entity.children;\n if (children.length === 0) {\n node.status = TaskStatus.Success;\n this.completeNode(entity);\n return;\n }\n // 根据复合节点类型处理\n switch (composite.compositeType) {\n case CompositeType.Sequence:\n this.handleSequence(entity, node, children);\n break;\n case CompositeType.Selector:\n this.handleSelector(entity, node, children);\n break;\n case CompositeType.Parallel:\n this.handleParallel(entity, node, children);\n break;\n case CompositeType.ParallelSelector:\n this.handleParallelSelector(entity, node, children);\n break;\n case CompositeType.RandomSequence:\n this.handleRandomSequence(entity, node, composite, children);\n break;\n case CompositeType.RandomSelector:\n this.handleRandomSelector(entity, node, composite, children);\n break;\n default:\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n break;\n }\n }\n /**\n * 序列节点:所有子节点都成功才成功\n */\n handleSequence(entity, node, children) {\n // 检查是否需要中止\n const sequenceNode = entity.getComponentByType(SequenceNode);\n if (sequenceNode && sequenceNode.abortType !== AbortType.None) {\n if (this.shouldAbort(entity, node, children, sequenceNode.abortType)) {\n this.abortExecution(entity, node, children);\n return;\n }\n }\n // 检查当前子节点\n if (node.currentChildIndex >= children.length) {\n // 所有子节点都成功\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n this.completeNode(entity);\n return;\n }\n const currentChild = children[node.currentChildIndex];\n const childNode = currentChild.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 如果子节点还没开始执行,激活它\n if (childNode.status === TaskStatus.Invalid) {\n if (!currentChild.hasComponent(ActiveNode)) {\n currentChild.addComponent(new ActiveNode());\n }\n node.status = TaskStatus.Running;\n return;\n }\n // 检查子节点状态\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else if (childNode.status === TaskStatus.Failure) {\n // 任一失败则失败\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n this.completeNode(entity);\n }\n else if (childNode.status === TaskStatus.Success) {\n // 成功则移动到下一个子节点\n // 重置已完成的子节点状态,以便下次行为树重新执行时从头开始\n childNode.reset();\n node.currentChildIndex++;\n // 继续保持活跃,下一帧处理下一个子节点\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 选择器节点:任一子节点成功就成功\n */\n handleSelector(entity, node, children) {\n // 检查是否需要中止\n const selectorNode = entity.getComponentByType(SelectorNode);\n if (selectorNode && selectorNode.abortType !== AbortType.None) {\n if (this.shouldAbort(entity, node, children, selectorNode.abortType)) {\n this.abortExecution(entity, node, children);\n return;\n }\n }\n // 检查当前子节点\n if (node.currentChildIndex >= children.length) {\n // 所有子节点都失败\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n this.completeNode(entity);\n return;\n }\n const currentChild = children[node.currentChildIndex];\n const childNode = currentChild.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 如果子节点还没开始执行,激活它\n if (childNode.status === TaskStatus.Invalid) {\n if (!currentChild.hasComponent(ActiveNode)) {\n currentChild.addComponent(new ActiveNode());\n }\n node.status = TaskStatus.Running;\n return;\n }\n // 检查子节点状态\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else if (childNode.status === TaskStatus.Success) {\n // 任一成功则成功\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n this.completeNode(entity);\n }\n else if (childNode.status === TaskStatus.Failure) {\n // 失败则移动到下一个子节点\n // 重置已完成的子节点状态,以便下次行为树重新执行时从头开始\n childNode.reset();\n node.currentChildIndex++;\n // 继续保持活跃,下一帧处理下一个子节点\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 并行节点:所有子节点都执行,全部成功才成功\n */\n handleParallel(entity, node, children) {\n let hasRunning = false;\n let hasFailed = false;\n // 激活所有子节点\n for (const child of children) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n }\n const childNode = child.getComponent(BehaviorTreeNode);\n if (!childNode)\n continue;\n if (childNode.status === TaskStatus.Running) {\n hasRunning = true;\n }\n else if (childNode.status === TaskStatus.Failure) {\n hasFailed = true;\n }\n }\n if (hasRunning) {\n node.status = TaskStatus.Running;\n }\n else if (hasFailed) {\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n this.completeNode(entity);\n }\n else {\n // 所有子节点都成功\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n this.completeNode(entity);\n }\n }\n /**\n * 并行选择器:任一成功则成功\n */\n handleParallelSelector(entity, node, children) {\n let hasRunning = false;\n let hasSucceeded = false;\n // 激活所有子节点\n for (const child of children) {\n if (!child.hasComponent(ActiveNode)) {\n child.addComponent(new ActiveNode());\n }\n const childNode = child.getComponent(BehaviorTreeNode);\n if (!childNode)\n continue;\n if (childNode.status === TaskStatus.Running) {\n hasRunning = true;\n }\n else if (childNode.status === TaskStatus.Success) {\n hasSucceeded = true;\n }\n }\n if (hasSucceeded) {\n // 任一成功则成功\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n // 停止所有子节点\n for (const child of children) {\n child.removeComponentByType(ActiveNode);\n }\n this.completeNode(entity);\n }\n else if (hasRunning) {\n node.status = TaskStatus.Running;\n }\n else {\n // 所有子节点都失败\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n this.completeNode(entity);\n }\n }\n /**\n * 随机序列\n */\n handleRandomSequence(entity, node, composite, children) {\n // 获取洗牌后的子节点索引\n const childIndex = composite.getNextChildIndex(node.currentChildIndex, children.length);\n if (childIndex >= children.length) {\n // 所有子节点都成功\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n composite.resetShuffle();\n this.completeNode(entity);\n return;\n }\n const currentChild = children[childIndex];\n const childNode = currentChild.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 如果子节点还没开始执行,激活它\n if (childNode.status === TaskStatus.Invalid) {\n if (!currentChild.hasComponent(ActiveNode)) {\n currentChild.addComponent(new ActiveNode());\n }\n node.status = TaskStatus.Running;\n return;\n }\n // 检查子节点状态\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else if (childNode.status === TaskStatus.Failure) {\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n composite.resetShuffle();\n this.completeNode(entity);\n }\n else if (childNode.status === TaskStatus.Success) {\n // 成功则移动到下一个子节点\n // 重置已完成的子节点状态,以便下次行为树重新执行时从头开始\n childNode.reset();\n node.currentChildIndex++;\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 随机选择器\n */\n handleRandomSelector(entity, node, composite, children) {\n // 获取洗牌后的子节点索引\n const childIndex = composite.getNextChildIndex(node.currentChildIndex, children.length);\n if (childIndex >= children.length) {\n // 所有子节点都失败\n node.status = TaskStatus.Failure;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Failure\n composite.resetShuffle();\n this.completeNode(entity);\n return;\n }\n const currentChild = children[childIndex];\n const childNode = currentChild.getComponent(BehaviorTreeNode);\n if (!childNode) {\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 如果子节点还没开始执行,激活它\n if (childNode.status === TaskStatus.Invalid) {\n if (!currentChild.hasComponent(ActiveNode)) {\n currentChild.addComponent(new ActiveNode());\n }\n node.status = TaskStatus.Running;\n return;\n }\n // 检查子节点状态\n if (childNode.status === TaskStatus.Running) {\n node.status = TaskStatus.Running;\n }\n else if (childNode.status === TaskStatus.Success) {\n node.status = TaskStatus.Success;\n node.currentChildIndex = 0; // 只重置索引,保持状态为Success\n composite.resetShuffle();\n this.completeNode(entity);\n }\n else if (childNode.status === TaskStatus.Failure) {\n // 失败则移动到下一个子节点\n // 重置已完成的子节点状态,以便下次行为树重新执行时从头开始\n childNode.reset();\n node.currentChildIndex++;\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 检查是否应该中止当前执行\n */\n shouldAbort(entity, node, children, abortType) {\n const currentIndex = node.currentChildIndex;\n // 如果还没开始执行任何子节点,不需要中止\n if (currentIndex === 0) {\n return false;\n }\n // Self: 检查当前执行路径中的条件节点是否失败\n if (abortType === AbortType.Self || abortType === AbortType.Both) {\n // 检查当前正在执行的分支之前的条件节点\n for (let i = 0; i < currentIndex; i++) {\n const child = children[i];\n const childNode = child.getComponent(BehaviorTreeNode);\n if (childNode && childNode.nodeType === NodeType.Condition) {\n // 如果条件节点现在失败了,应该中止\n if (childNode.status === TaskStatus.Failure) {\n return true;\n }\n }\n }\n }\n // LowerPriority: 检查高优先级分支的条件是否满足\n if (abortType === AbortType.LowerPriority || abortType === AbortType.Both) {\n // 检查当前索引之前的所有分支(优先级更高)\n for (let i = 0; i < currentIndex; i++) {\n const child = children[i];\n const childNode = child.getComponent(BehaviorTreeNode);\n if (!childNode)\n continue;\n // 如果是条件节点且现在成功了\n if (childNode.nodeType === NodeType.Condition) {\n if (this.evaluateCondition(child, childNode)) {\n return true;\n }\n }\n // 如果是复合节点,检查其第一个子节点(通常是条件)\n else if (childNode.nodeType === NodeType.Composite && child.children.length > 0) {\n const firstGrandChild = child.children[0];\n const firstGrandChildNode = firstGrandChild.getComponent(BehaviorTreeNode);\n if (firstGrandChildNode && firstGrandChildNode.nodeType === NodeType.Condition) {\n if (this.evaluateCondition(firstGrandChild, firstGrandChildNode)) {\n return true;\n }\n }\n }\n }\n }\n return false;\n }\n /**\n * 评估条件节点\n */\n evaluateCondition(entity, node) {\n if (node.nodeType !== NodeType.Condition) {\n return false;\n }\n let result = false;\n if (entity.hasComponent(BlackboardCompareCondition)) {\n result = this.evaluateBlackboardCompare(entity);\n }\n else if (entity.hasComponent(BlackboardExistsCondition)) {\n result = this.evaluateBlackboardExists(entity);\n }\n else if (entity.hasComponent(RandomProbabilityCondition)) {\n result = this.evaluateRandomProbability(entity);\n }\n else if (entity.hasComponent(ExecuteCondition)) {\n result = this.evaluateCustomCondition(entity);\n }\n return result;\n }\n /**\n * 评估黑板比较条件\n */\n evaluateBlackboardCompare(entity) {\n const condition = entity.getComponent(BlackboardCompareCondition);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard || !blackboard.hasVariable(condition.variableName)) {\n return false;\n }\n const value = blackboard.getValue(condition.variableName);\n let compareValue = condition.compareValue;\n if (typeof compareValue === 'string') {\n compareValue = this.resolveVariableReferences(compareValue, blackboard);\n }\n let result = false;\n switch (condition.operator) {\n case CompareOperator.Equal:\n result = value === compareValue;\n break;\n case CompareOperator.NotEqual:\n result = value !== compareValue;\n break;\n case CompareOperator.Greater:\n result = value > compareValue;\n break;\n case CompareOperator.GreaterOrEqual:\n result = value >= compareValue;\n break;\n case CompareOperator.Less:\n result = value < compareValue;\n break;\n case CompareOperator.LessOrEqual:\n result = value <= compareValue;\n break;\n case CompareOperator.Contains:\n if (typeof value === 'string') {\n result = value.includes(compareValue);\n }\n else if (Array.isArray(value)) {\n result = value.includes(compareValue);\n }\n break;\n case CompareOperator.Matches:\n if (typeof value === 'string' && typeof compareValue === 'string') {\n const regex = new RegExp(compareValue);\n result = regex.test(value);\n }\n break;\n }\n return condition.invertResult ? !result : result;\n }\n /**\n * 评估黑板变量存在性\n */\n evaluateBlackboardExists(entity) {\n const condition = entity.getComponent(BlackboardExistsCondition);\n const blackboard = this.findBlackboard(entity);\n if (!blackboard) {\n return false;\n }\n let result = blackboard.hasVariable(condition.variableName);\n if (result && condition.checkNotNull) {\n const value = blackboard.getValue(condition.variableName);\n result = value !== null && value !== undefined;\n }\n return condition.invertResult ? !result : result;\n }\n /**\n * 评估随机概率\n */\n evaluateRandomProbability(entity) {\n const condition = entity.getComponent(RandomProbabilityCondition);\n return condition.evaluate();\n }\n /**\n * 评估自定义条件\n */\n evaluateCustomCondition(entity) {\n const condition = entity.getComponent(ExecuteCondition);\n const func = condition.getFunction();\n if (!func) {\n return false;\n }\n const blackboard = this.findBlackboard(entity);\n const result = func(entity, blackboard, 0);\n return condition.invertResult ? !result : result;\n }\n /**\n * 解析字符串中的变量引用\n */\n resolveVariableReferences(value, blackboard) {\n const pureMatch = value.match(/^{{\\s*(\\w+)\\s*}}$/);\n if (pureMatch) {\n const varName = pureMatch[1];\n if (blackboard.hasVariable(varName)) {\n return blackboard.getValue(varName);\n }\n return value;\n }\n return value.replace(/\\{\\{(\\w+)\\}\\}/g, (match, varName) => {\n if (blackboard.hasVariable(varName)) {\n const val = blackboard.getValue(varName);\n return val !== undefined ? String(val) : match;\n }\n return match;\n });\n }\n /**\n * 查找黑板组件\n */\n findBlackboard(entity) {\n let current = entity;\n while (current) {\n const blackboard = current.getComponent(BlackboardComponent);\n if (blackboard) {\n return blackboard;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 中止当前执行\n */\n abortExecution(entity, node, children) {\n // 停止当前正在执行的子节点\n const currentIndex = node.currentChildIndex;\n if (currentIndex < children.length) {\n const currentChild = children[currentIndex];\n this.deactivateNode(currentChild);\n }\n // 重置节点状态,从头开始\n node.currentChildIndex = 0;\n node.status = TaskStatus.Running;\n // 不需要 completeNode,因为我们要继续执行(从头开始)\n }\n /**\n * 递归停用节点及其所有子节点\n */\n deactivateNode(entity) {\n // 移除活跃标记\n entity.removeComponentByType(ActiveNode);\n // 重置节点状态\n const node = entity.getComponent(BehaviorTreeNode);\n if (node) {\n node.reset();\n }\n // 递归停用所有子节点\n for (const child of entity.children) {\n this.deactivateNode(child);\n }\n }\n /**\n * 递归重置所有子节点的状态\n */\n resetAllChildren(entity) {\n for (const child of entity.children) {\n const childNode = child.getComponent(BehaviorTreeNode);\n if (childNode) {\n childNode.reset();\n }\n // 递归重置孙子节点\n this.resetAllChildren(child);\n }\n }\n /**\n * 完成节点执行\n */\n completeNode(entity) {\n entity.removeComponentByType(ActiveNode);\n // 如果是复合节点完成,重置所有子节点状态\n const node = entity.getComponent(BehaviorTreeNode);\n if (node && node.nodeType === NodeType.Composite) {\n this.resetAllChildren(entity);\n }\n // 通知父节点\n if (entity.parent && entity.parent.hasComponent(BehaviorTreeNode)) {\n if (!entity.parent.hasComponent(ActiveNode)) {\n entity.parent.addComponent(new ActiveNode());\n }\n }\n }\n getLoggerName() {\n return 'CompositeExecutionSystem';\n }\n}\n//# sourceMappingURL=CompositeExecutionSystem.js.map","/**\n * 资产类型\n */\nexport var AssetType;\n(function (AssetType) {\n AssetType[\"BehaviorTree\"] = \"behavior-tree\";\n AssetType[\"Blackboard\"] = \"blackboard\";\n AssetType[\"Unknown\"] = \"unknown\";\n})(AssetType || (AssetType = {}));\n/**\n * 工作区服务\n *\n * 管理项目的工作区配置和资产注册表,提供:\n * - 工作区配置的加载和保存\n * - 资产注册和查询\n * - 依赖关系追踪\n * - 循环依赖检测\n */\nexport class WorkspaceService {\n constructor() {\n this.config = null;\n this.assetMap = new Map();\n this.assetPathMap = new Map();\n }\n /**\n * 初始化工作区\n */\n initialize(config) {\n this.config = config;\n this.rebuildAssetMaps();\n }\n /**\n * 重建资产映射表\n */\n rebuildAssetMaps() {\n this.assetMap.clear();\n this.assetPathMap.clear();\n if (!this.config)\n return;\n for (const asset of this.config.assets) {\n this.assetMap.set(asset.id, asset);\n this.assetPathMap.set(asset.path, asset);\n }\n }\n /**\n * 获取工作区配置\n */\n getConfig() {\n return this.config;\n }\n /**\n * 更新工作区配置\n */\n updateConfig(config) {\n this.config = config;\n this.rebuildAssetMaps();\n }\n /**\n * 注册资产\n */\n registerAsset(asset) {\n if (!this.config) {\n throw new Error('工作区未初始化');\n }\n // 检查是否已存在\n const existing = this.config.assets.find(a => a.id === asset.id);\n if (existing) {\n // 更新现有资产\n Object.assign(existing, asset);\n }\n else {\n // 添加新资产\n this.config.assets.push(asset);\n }\n this.rebuildAssetMaps();\n }\n /**\n * 取消注册资产\n */\n unregisterAsset(assetId) {\n if (!this.config)\n return;\n const index = this.config.assets.findIndex(a => a.id === assetId);\n if (index !== -1) {\n this.config.assets.splice(index, 1);\n this.rebuildAssetMaps();\n }\n }\n /**\n * 通过ID获取资产\n */\n getAssetById(assetId) {\n return this.assetMap.get(assetId);\n }\n /**\n * 通过路径获取资产\n */\n getAssetByPath(path) {\n return this.assetPathMap.get(path);\n }\n /**\n * 获取所有资产\n */\n getAllAssets() {\n return this.config?.assets || [];\n }\n /**\n * 按类型获取资产\n */\n getAssetsByType(type) {\n return this.getAllAssets().filter(a => a.type === type);\n }\n /**\n * 获取行为树资产列表\n */\n getBehaviorTreeAssets() {\n return this.getAssetsByType(AssetType.BehaviorTree);\n }\n /**\n * 获取黑板资产列表\n */\n getBlackboardAssets() {\n return this.getAssetsByType(AssetType.Blackboard);\n }\n /**\n * 获取资产的所有依赖(递归)\n */\n getAssetDependencies(assetId, visited = new Set()) {\n if (visited.has(assetId)) {\n return [];\n }\n visited.add(assetId);\n const asset = this.getAssetById(assetId);\n if (!asset) {\n return [];\n }\n const dependencies = [];\n for (const depId of asset.dependencies) {\n const depAsset = this.getAssetById(depId);\n if (depAsset) {\n dependencies.push(depAsset);\n // 递归获取依赖的依赖\n dependencies.push(...this.getAssetDependencies(depId, visited));\n }\n }\n return dependencies;\n }\n /**\n * 检测循环依赖\n *\n * @param assetId 要检查的资产ID\n * @returns 如果存在循环依赖,返回循环路径;否则返回 null\n */\n detectCircularDependency(assetId) {\n const visited = new Set();\n const path = [];\n const dfs = (currentId) => {\n if (path.includes(currentId)) {\n // 找到循环\n path.push(currentId);\n return true;\n }\n if (visited.has(currentId)) {\n return false;\n }\n visited.add(currentId);\n path.push(currentId);\n const asset = this.getAssetById(currentId);\n if (asset) {\n for (const depId of asset.dependencies) {\n if (dfs(depId)) {\n return true;\n }\n }\n }\n path.pop();\n return false;\n };\n return dfs(assetId) ? path : null;\n }\n /**\n * 检查是否可以添加依赖(不会造成循环依赖)\n *\n * @param assetId 资产ID\n * @param dependencyId 要添加的依赖ID\n * @returns 是否可以安全添加\n */\n canAddDependency(assetId, dependencyId) {\n const asset = this.getAssetById(assetId);\n if (!asset)\n return false;\n // 临时添加依赖\n const originalDeps = [...asset.dependencies];\n asset.dependencies.push(dependencyId);\n // 检测循环依赖\n const hasCircular = this.detectCircularDependency(assetId) !== null;\n // 恢复原始依赖\n asset.dependencies = originalDeps;\n return !hasCircular;\n }\n /**\n * 添加资产依赖\n */\n addAssetDependency(assetId, dependencyId) {\n if (!this.canAddDependency(assetId, dependencyId)) {\n return false;\n }\n const asset = this.getAssetById(assetId);\n if (!asset)\n return false;\n if (!asset.dependencies.includes(dependencyId)) {\n asset.dependencies.push(dependencyId);\n }\n return true;\n }\n /**\n * 移除资产依赖\n */\n removeAssetDependency(assetId, dependencyId) {\n const asset = this.getAssetById(assetId);\n if (!asset)\n return;\n const index = asset.dependencies.indexOf(dependencyId);\n if (index !== -1) {\n asset.dependencies.splice(index, 1);\n }\n }\n /**\n * 解析资产路径(支持相对路径和绝对路径)\n */\n resolveAssetPath(path) {\n if (!this.config)\n return path;\n // 如果是绝对路径,直接返回\n if (path.startsWith('/') || path.match(/^[A-Za-z]:/)) {\n return path;\n }\n // 相对路径,拼接工作区根目录\n return `${this.config.rootPath}/${path}`.replace(/\\\\/g, '/');\n }\n /**\n * 获取资产的相对路径\n */\n getRelativePath(absolutePath) {\n if (!this.config)\n return absolutePath;\n const rootPath = this.config.rootPath.replace(/\\\\/g, '/');\n const absPath = absolutePath.replace(/\\\\/g, '/');\n if (absPath.startsWith(rootPath)) {\n return absPath.substring(rootPath.length + 1);\n }\n return absolutePath;\n }\n /**\n * 清理资源\n */\n dispose() {\n this.config = null;\n this.assetMap.clear();\n this.assetPathMap.clear();\n }\n}\n//# sourceMappingURL=WorkspaceService.js.map","import { createLogger } from '@esengine/ecs-framework';\nimport { LoadingState, TimeoutError, CircularDependencyError, EntityDestroyedError } from './AssetLoadingTypes';\nconst logger = createLogger('AssetLoadingManager');\n/**\n * 资产加载管理器\n *\n * 统一管理行为树资产的异步加载,提供:\n * - 超时检测和自动重试\n * - 循环引用检测\n * - 实体生命周期安全\n * - 加载状态追踪\n *\n * @example\n * ```typescript\n * const manager = new AssetLoadingManager();\n *\n * const handle = manager.startLoading(\n * 'patrol',\n * parentEntity,\n * () => assetLoader.loadBehaviorTree('patrol'),\n * { timeoutMs: 5000, maxRetries: 3 }\n * );\n *\n * // 在系统的 process() 中轮询检查\n * const state = handle.getState();\n * if (state === LoadingState.Loaded) {\n * const entity = await handle.promise;\n * // 使用加载的实体\n * }\n * ```\n */\nexport class AssetLoadingManager {\n constructor() {\n /** 正在进行的加载任务 */\n this.tasks = new Map();\n /** 加载栈(用于循环检测) */\n this.loadingStack = new Set();\n /** 默认配置 */\n this.defaultOptions = {\n timeoutMs: 5000,\n maxRetries: 3,\n retryDelayBase: 100,\n maxRetryDelay: 2000\n };\n }\n /**\n * 开始加载资产\n *\n * @param assetId 资产ID\n * @param parentEntity 父实体(用于生命周期检查)\n * @param loader 加载函数\n * @param options 加载选项\n * @returns 加载任务句柄\n */\n startLoading(assetId, parentEntity, loader, options = {}) {\n // 合并选项\n const finalOptions = {\n ...this.defaultOptions,\n ...options\n };\n // 循环引用检测\n if (options.parentAssetId) {\n if (this.detectCircularDependency(assetId, options.parentAssetId)) {\n const error = new CircularDependencyError(`检测到循环引用: ${options.parentAssetId} → ${assetId}\\n` +\n `加载栈: ${Array.from(this.loadingStack).join(' → ')}`);\n logger.error(error.message);\n throw error;\n }\n }\n // 检查是否已有任务\n const existingTask = this.tasks.get(assetId);\n if (existingTask) {\n logger.debug(`资产 ${assetId} 已在加载中,返回现有任务`);\n return this.createHandle(existingTask);\n }\n // 创建新任务\n const task = {\n assetId,\n promise: null, // 稍后设置\n startTime: Date.now(),\n lastRetryTime: 0,\n retryCount: 0,\n maxRetries: finalOptions.maxRetries,\n timeoutMs: finalOptions.timeoutMs,\n state: LoadingState.Pending,\n parentEntityId: parentEntity.id,\n parentEntity: parentEntity,\n parentAssetId: options.parentAssetId\n };\n // 添加到加载栈(循环检测)\n this.loadingStack.add(assetId);\n // 创建带超时和重试的Promise\n task.promise = this.loadWithTimeoutAndRetry(task, loader, finalOptions);\n task.state = LoadingState.Loading;\n this.tasks.set(assetId, task);\n logger.info(`开始加载资产: ${assetId}`, {\n timeoutMs: finalOptions.timeoutMs,\n maxRetries: finalOptions.maxRetries,\n parentAssetId: options.parentAssetId\n });\n return this.createHandle(task);\n }\n /**\n * 带超时和重试的加载\n */\n async loadWithTimeoutAndRetry(task, loader, options) {\n let lastError = null;\n for (let attempt = 0; attempt <= task.maxRetries; attempt++) {\n // 检查父实体是否还存在\n if (task.parentEntity.isDestroyed) {\n const error = new EntityDestroyedError(`父实体已销毁,取消加载: ${task.assetId}`);\n task.state = LoadingState.Cancelled;\n this.cleanup(task.assetId);\n logger.warn(error.message);\n throw error;\n }\n try {\n task.retryCount = attempt;\n task.lastRetryTime = Date.now();\n logger.debug(`加载尝试 ${attempt + 1}/${task.maxRetries + 1}: ${task.assetId}`);\n // 使用超时包装\n const result = await this.withTimeout(loader(), task.timeoutMs, `加载资产 ${task.assetId} 超时(${task.timeoutMs}ms)`);\n // 加载成功\n task.state = LoadingState.Loaded;\n task.result = result;\n this.cleanup(task.assetId);\n logger.info(`资产加载成功: ${task.assetId}`, {\n attempts: attempt + 1,\n elapsedMs: Date.now() - task.startTime\n });\n return result;\n }\n catch (error) {\n lastError = error;\n // 记录错误类型\n if (error instanceof TimeoutError) {\n task.state = LoadingState.Timeout;\n logger.warn(`资产加载超时: ${task.assetId} (尝试 ${attempt + 1})`);\n }\n else if (error instanceof EntityDestroyedError) {\n // 实体已销毁,不需要重试\n throw error;\n }\n else {\n logger.warn(`资产加载失败: ${task.assetId} (尝试 ${attempt + 1})`, error);\n }\n // 最后一次尝试失败\n if (attempt === task.maxRetries) {\n task.state = LoadingState.Failed;\n task.error = lastError;\n this.cleanup(task.assetId);\n logger.error(`资产加载最终失败: ${task.assetId}`, {\n attempts: attempt + 1,\n error: lastError.message\n });\n throw lastError;\n }\n // 计算重试延迟(指数退避)\n const delayMs = Math.min(Math.pow(2, attempt) * options.retryDelayBase, options.maxRetryDelay);\n logger.debug(`等待 ${delayMs}ms 后重试...`);\n await this.delay(delayMs);\n }\n }\n throw lastError;\n }\n /**\n * Promise 超时包装\n */\n withTimeout(promise, timeoutMs, message) {\n let timeoutId;\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TimeoutError(message));\n }, timeoutMs);\n });\n return Promise.race([\n promise.then(result => {\n clearTimeout(timeoutId);\n return result;\n }),\n timeoutPromise\n ]).catch(error => {\n clearTimeout(timeoutId);\n throw error;\n });\n }\n /**\n * 循环依赖检测\n */\n detectCircularDependency(assetId, parentAssetId) {\n // 如果父资产正在加载中,说明有循环\n if (this.loadingStack.has(parentAssetId)) {\n return true;\n }\n // TODO: 更复杂的循环检测(检查完整的依赖链)\n // 当前只检测直接循环(A→B→A)\n // 未来可以检测间接循环(A→B→C→A)\n return false;\n }\n /**\n * 获取任务状态\n */\n getTaskState(assetId) {\n return this.tasks.get(assetId)?.state ?? LoadingState.Idle;\n }\n /**\n * 获取任务\n */\n getTask(assetId) {\n return this.tasks.get(assetId);\n }\n /**\n * 取消加载\n */\n cancelLoading(assetId) {\n const task = this.tasks.get(assetId);\n if (task) {\n task.state = LoadingState.Cancelled;\n this.cleanup(assetId);\n logger.info(`取消加载: ${assetId}`);\n }\n }\n /**\n * 清理任务\n */\n cleanup(assetId) {\n const task = this.tasks.get(assetId);\n if (task) {\n // 清除实体引用,帮助GC\n task.parentEntity = null;\n }\n this.tasks.delete(assetId);\n this.loadingStack.delete(assetId);\n }\n /**\n * 延迟\n */\n delay(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n /**\n * 创建任务句柄\n */\n createHandle(task) {\n return {\n assetId: task.assetId,\n getState: () => task.state,\n getError: () => task.error,\n getProgress: () => {\n const now = Date.now();\n const elapsed = now - task.startTime;\n const remaining = Math.max(0, task.timeoutMs - elapsed);\n return {\n state: task.state,\n elapsedMs: elapsed,\n remainingTimeoutMs: remaining,\n retryCount: task.retryCount,\n maxRetries: task.maxRetries\n };\n },\n cancel: () => this.cancelLoading(task.assetId),\n promise: task.promise\n };\n }\n /**\n * 获取所有正在加载的资产\n */\n getLoadingAssets() {\n return Array.from(this.tasks.keys());\n }\n /**\n * 获取加载统计信息\n */\n getStats() {\n const tasks = Array.from(this.tasks.values());\n return {\n totalTasks: tasks.length,\n loadingTasks: tasks.filter(t => t.state === LoadingState.Loading).length,\n failedTasks: tasks.filter(t => t.state === LoadingState.Failed).length,\n timeoutTasks: tasks.filter(t => t.state === LoadingState.Timeout).length\n };\n }\n /**\n * 清空所有任务\n */\n clear() {\n logger.info('清空所有加载任务', this.getStats());\n this.tasks.clear();\n this.loadingStack.clear();\n }\n /**\n * 释放资源\n */\n dispose() {\n this.clear();\n }\n}\n//# sourceMappingURL=AssetLoadingManager.js.map","import { EntitySystem, Matcher, Core } from '@esengine/ecs-framework';\nimport { SubTreeNode } from '../Components/Composites/SubTreeNode';\nimport { ActiveNode } from '../Components/ActiveNode';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\nimport { TaskStatus } from '../Types/TaskStatus';\nimport { FileSystemAssetLoader } from '../Services/FileSystemAssetLoader';\nimport { BehaviorTreeAssetLoader } from '../Serialization/BehaviorTreeAssetLoader';\nimport { BlackboardComponent } from '../Components/BlackboardComponent';\nimport { LogOutput } from '../Components/LogOutput';\nimport { AssetLoadingManager } from '../Services/AssetLoadingManager';\nimport { LoadingState, CircularDependencyError, EntityDestroyedError } from '../Services/AssetLoadingTypes';\nimport { BehaviorTreeAssetMetadata } from '../Components/AssetMetadata';\n/**\n * SubTree 执行系统\n *\n * 处理 SubTree 节点的执行,包括:\n * - 子树资产加载\n * - 子树实例化\n * - 黑板继承\n * - 子树执行和状态管理\n *\n * updateOrder: 300 (与 CompositeExecutionSystem 同级)\n */\nexport class SubTreeExecutionSystem extends EntitySystem {\n constructor(loadingManager) {\n super(Matcher.empty().all(SubTreeNode, ActiveNode, BehaviorTreeNode));\n this.assetLoaderInitialized = false;\n this.hasLoggedMissingAssetLoader = false;\n this.loadingTasks = new Map();\n this.updateOrder = 300;\n this.loadingManager = loadingManager || new AssetLoadingManager();\n }\n onInitialize() {\n // 延迟初始化 AssetLoader,不在这里尝试获取\n // 只在第一次真正需要处理 SubTree 节点时才获取\n }\n process(entities) {\n for (const entity of entities) {\n const subTree = entity.getComponent(SubTreeNode);\n const node = entity.getComponent(BehaviorTreeNode);\n this.executeSubTree(entity, subTree, node);\n }\n }\n /**\n * 执行子树节点\n */\n executeSubTree(entity, subTree, node) {\n // 验证配置\n const errors = subTree.validate();\n if (errors.length > 0) {\n this.logger.error(`SubTree 节点配置错误: ${errors.join(', ')}`);\n node.status = TaskStatus.Failure;\n this.completeNode(entity);\n return;\n }\n // 检查是否已有子树(可能是预加载的)\n const existingSubTreeRoot = subTree.getSubTreeRoot();\n if (existingSubTreeRoot) {\n const subTreeNode = existingSubTreeRoot.getComponent(BehaviorTreeNode);\n if (subTreeNode) {\n const statusName = TaskStatus[subTreeNode.status];\n const hasActive = existingSubTreeRoot.hasComponent(ActiveNode);\n this.outputLog(entity, `检查预加载子树 ${subTree.assetId}: status=${statusName}, hasActive=${hasActive}`, 'info');\n // 如果子树还没开始执行(状态是 Invalid),需要激活它\n if (subTreeNode.status === TaskStatus.Invalid) {\n this.outputLog(entity, `使用预加载的子树: ${subTree.assetId}`, 'info');\n // 检查子节点\n this.outputLog(entity, `激活前:子树根节点 ${existingSubTreeRoot.name} 有 ${existingSubTreeRoot.children.length} 个子节点`, 'info');\n if (existingSubTreeRoot.children.length > 0) {\n const firstChild = existingSubTreeRoot.children[0];\n this.outputLog(entity, ` 第一个子节点: ${firstChild.name}`, 'info');\n }\n // 激活根节点\n if (!existingSubTreeRoot.hasComponent(ActiveNode)) {\n existingSubTreeRoot.addComponent(new ActiveNode());\n this.outputLog(entity, `为子树根节点添加 ActiveNode: ${existingSubTreeRoot.name}`, 'info');\n }\n const subTreeRootNode = existingSubTreeRoot.getComponent(BehaviorTreeNode);\n if (subTreeRootNode) {\n this.outputLog(entity, `设置子树根节点状态: ${existingSubTreeRoot.name} -> Running`, 'info');\n subTreeRootNode.status = TaskStatus.Running;\n }\n // 再次检查(验证激活后子节点没有丢失)\n this.outputLog(entity, `激活后:子树根节点 ${existingSubTreeRoot.name} 有 ${existingSubTreeRoot.children.length} 个子节点`, 'info');\n this.outputLog(entity, `激活预加载的子树: ${subTree.assetId}`, 'info');\n node.status = TaskStatus.Running;\n return;\n }\n }\n // 子树已激活或已完成,更新状态\n this.updateSubTree(entity, subTree, node);\n return;\n }\n // 子树未预加载,开始运行时加载\n this.outputLog(entity, `子树未预加载,开始运行时加载: ${subTree.assetId}`, 'info');\n this.loadAndInstantiateSubTree(entity, subTree, node);\n }\n /**\n * 延迟初始化 AssetLoader\n */\n ensureAssetLoaderInitialized() {\n if (!this.assetLoaderInitialized) {\n try {\n this.assetLoader = Core.services.resolve(FileSystemAssetLoader);\n this.assetLoaderInitialized = true;\n this.logger.debug('AssetLoader 已初始化');\n }\n catch (error) {\n this.assetLoaderInitialized = true;\n this.assetLoader = undefined;\n // 只在第一次失败时记录警告,避免重复日志\n if (!this.hasLoggedMissingAssetLoader) {\n this.logger.warn('AssetLoader 未配置。SubTree 节点需要 AssetLoader 来加载子树资产。\\n' +\n '如果您在编辑器中,请确保已打开项目并配置了项目路径。\\n' +\n '如果您在运行时环境,请确保已正确注册 FileSystemAssetLoader 服务。');\n this.hasLoggedMissingAssetLoader = true;\n }\n return false;\n }\n }\n return this.assetLoader !== undefined;\n }\n /**\n * 加载并实例化子树(使用加载管理器)\n */\n loadAndInstantiateSubTree(parentEntity, subTree, node) {\n // 延迟初始化 AssetLoader\n if (!this.ensureAssetLoaderInitialized()) {\n this.logger.debug('AssetLoader 不可用,SubTree 节点执行失败');\n node.status = TaskStatus.Failure;\n this.completeNode(parentEntity);\n return;\n }\n const assetId = subTree.assetId;\n // 检查是否有正在进行的加载任务\n let taskHandle = this.loadingTasks.get(parentEntity.id);\n if (taskHandle) {\n // 轮询检查状态\n const state = taskHandle.getState();\n switch (state) {\n case LoadingState.Loading:\n case LoadingState.Pending:\n // 仍在加载中\n node.status = TaskStatus.Running;\n // 输出进度信息\n const progress = taskHandle.getProgress();\n if (progress.elapsedMs > 1000) {\n this.logger.debug(`子树加载中: ${assetId} (已耗时: ${Math.round(progress.elapsedMs / 1000)}s, ` +\n `重试: ${progress.retryCount}/${progress.maxRetries})`);\n }\n return;\n case LoadingState.Loaded:\n // 加载完成\n this.onLoadingComplete(parentEntity, subTree, node, taskHandle);\n return;\n case LoadingState.Failed:\n case LoadingState.Timeout:\n // 加载失败\n const error = taskHandle.getError();\n this.outputLog(parentEntity, `子树加载失败: ${assetId} - ${error?.message || '未知错误'}`, 'error');\n node.status = TaskStatus.Failure;\n this.loadingTasks.delete(parentEntity.id);\n this.completeNode(parentEntity);\n return;\n case LoadingState.Cancelled:\n // 已取消(实体被销毁)\n this.loadingTasks.delete(parentEntity.id);\n return;\n }\n }\n // 开始新的加载任务\n this.startNewLoading(parentEntity, subTree, node);\n }\n /**\n * 开始新的加载任务\n */\n startNewLoading(parentEntity, subTree, node) {\n const assetId = subTree.assetId;\n // 获取父树的资产ID(用于循环检测)\n const parentAssetId = this.getParentTreeAssetId(parentEntity);\n try {\n // 使用加载管理器\n const taskHandle = this.loadingManager.startLoading(assetId, parentEntity, () => this.loadAsset(assetId), {\n timeoutMs: 5000,\n maxRetries: 2,\n parentAssetId: parentAssetId\n });\n this.loadingTasks.set(parentEntity.id, taskHandle);\n node.status = TaskStatus.Running;\n this.outputLog(parentEntity, `开始加载子树: ${assetId} (父树: ${parentAssetId || 'none'})`, 'info');\n }\n catch (error) {\n if (error instanceof CircularDependencyError) {\n this.outputLog(parentEntity, `检测到循环引用: ${error.message}`, 'error');\n }\n else {\n this.outputLog(parentEntity, `启动加载失败: ${assetId}`, 'error');\n }\n node.status = TaskStatus.Failure;\n this.completeNode(parentEntity);\n }\n }\n /**\n * 加载完成时的处理\n */\n onLoadingComplete(parentEntity, subTree, node, taskHandle) {\n // 获取加载结果\n taskHandle.promise.then(subTreeRoot => {\n // 再次检查实体是否存在\n if (parentEntity.isDestroyed) {\n this.logger.warn(`父实体已销毁,丢弃加载结果: ${taskHandle.assetId}`);\n subTreeRoot.destroy();\n return;\n }\n // 设置子树\n subTree.setSubTreeRoot(subTreeRoot);\n // 将子树根实体设置为 SubTreeNode 的子节点,这样子树中的节点可以通过 parent 链找到主树的根节点\n parentEntity.addChild(subTreeRoot);\n // 添加资产元数据(用于循环检测)\n const metadata = subTreeRoot.addComponent(new BehaviorTreeAssetMetadata());\n metadata.initialize(taskHandle.assetId, '1.0.0');\n // 处理黑板继承\n if (subTree.inheritParentBlackboard) {\n this.setupBlackboardInheritance(parentEntity, subTreeRoot);\n }\n this.outputLog(parentEntity, `子树 ${taskHandle.assetId} 加载成功并激活`, 'info');\n // 打印子树结构(用于调试)\n this.outputLog(parentEntity, `=== 子树 ${taskHandle.assetId} 内部结构 ===`, 'info');\n this.logSubTreeStructure(parentEntity, subTreeRoot, 0);\n this.outputLog(parentEntity, `=== 子树结构结束 ===`, 'info');\n // 激活子树执行\n this.startSubTreeExecution(subTreeRoot, parentEntity);\n // 清理任务\n this.loadingTasks.delete(parentEntity.id);\n }).catch(error => {\n // 这里不应该到达,因为错误应该在状态机中处理了\n if (!(error instanceof EntityDestroyedError)) {\n this.logger.error('意外错误:', error);\n }\n });\n }\n /**\n * 加载资产\n */\n async loadAsset(assetId) {\n if (!this.scene) {\n throw new Error('Scene 不存在');\n }\n // 加载资产\n const asset = await this.assetLoader.loadBehaviorTree(assetId);\n // 实例化为 Entity 树(作为子树,跳过 RootNode)\n const rootEntity = BehaviorTreeAssetLoader.instantiate(asset, this.scene, {\n asSubTree: true\n });\n return rootEntity;\n }\n /**\n * 设置黑板继承\n */\n setupBlackboardInheritance(parentEntity, subTreeRoot) {\n const parentBlackboard = this.findBlackboard(parentEntity);\n if (!parentBlackboard) {\n return;\n }\n // 找到子树的黑板\n const subTreeBlackboard = subTreeRoot.getComponent(BlackboardComponent);\n if (subTreeBlackboard) {\n // 启用全局黑板查找(这样子树可以访问父树的变量)\n subTreeBlackboard.setUseGlobalBlackboard(true);\n }\n }\n /**\n * 查找黑板\n */\n findBlackboard(entity) {\n let current = entity;\n while (current) {\n const blackboard = current.getComponent(BlackboardComponent);\n if (blackboard) {\n return blackboard;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 开始子树执行\n */\n startSubTreeExecution(subTreeRoot, parentEntity) {\n // 调试:检查子树根节点的子节点\n if (parentEntity) {\n this.outputLog(parentEntity, `子树根节点 ${subTreeRoot.name} 有 ${subTreeRoot.children.length} 个子节点`, 'info');\n }\n // 激活根节点\n if (!subTreeRoot.hasComponent(ActiveNode)) {\n subTreeRoot.addComponent(new ActiveNode());\n if (parentEntity) {\n this.outputLog(parentEntity, `为子树根节点添加 ActiveNode: ${subTreeRoot.name}`, 'info');\n }\n }\n const node = subTreeRoot.getComponent(BehaviorTreeNode);\n if (node) {\n if (parentEntity) {\n this.outputLog(parentEntity, `设置子树根节点状态: ${subTreeRoot.name} -> Running`, 'info');\n }\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 更新子树状态\n */\n updateSubTree(parentEntity, subTree, node) {\n const subTreeRoot = subTree.getSubTreeRoot();\n if (!subTreeRoot) {\n return;\n }\n // 检查子树是否完成\n const subTreeNode = subTreeRoot.getComponent(BehaviorTreeNode);\n if (!subTreeNode) {\n return;\n }\n // 输出子树当前状态(调试)\n const statusName = TaskStatus[subTreeNode.status];\n this.outputLog(parentEntity, `子树 ${subTree.assetId} 当前状态: ${statusName}`, 'info');\n if (subTreeNode.status !== TaskStatus.Running) {\n // 子树完成\n this.onSubTreeCompleted(parentEntity, subTree, node, subTreeNode.status);\n }\n else {\n // 子树仍在运行\n node.status = TaskStatus.Running;\n }\n }\n /**\n * 子树完成时的处理\n */\n onSubTreeCompleted(parentEntity, subTree, node, subTreeStatus) {\n this.outputLog(parentEntity, `子树完成,状态: ${TaskStatus[subTreeStatus]}`, 'info');\n // 检查完成前 SubTreeNode 的子节点\n this.outputLog(parentEntity, `完成前:SubTreeNode ${parentEntity.name} 有 ${parentEntity.children.length} 个子节点`, 'info');\n // 标记子树完成\n subTree.markSubTreeCompleted(subTreeStatus);\n // 决定父节点状态\n if (subTreeStatus === TaskStatus.Success) {\n node.status = TaskStatus.Success;\n }\n else if (subTreeStatus === TaskStatus.Failure) {\n if (subTree.propagateFailure) {\n node.status = TaskStatus.Failure;\n }\n else {\n // 忽略失败,返回成功\n node.status = TaskStatus.Success;\n }\n }\n else {\n node.status = subTreeStatus;\n }\n // 清理子树\n this.cleanupSubTree(subTree);\n // 检查清理后 SubTreeNode 的子节点\n this.outputLog(parentEntity, `清理后:SubTreeNode ${parentEntity.name} 有 ${parentEntity.children.length} 个子节点`, 'info');\n // 完成父节点\n this.completeNode(parentEntity);\n }\n /**\n * 清理子树\n */\n cleanupSubTree(subTree) {\n const subTreeRoot = subTree.getSubTreeRoot();\n if (!subTreeRoot) {\n return;\n }\n // 如果是预加载的子树,不销毁,只重置状态以便复用\n if (subTree.preload) {\n this.logger.debug(`重置预加载子树以便复用: ${subTree.assetId}`);\n // 递归重置整个子树的所有节点\n this.resetSubTreeRecursively(subTreeRoot);\n // 重置 SubTreeNode 的完成状态,但保留 subTreeRoot 引用\n subTree.resetCompletionState();\n }\n else {\n // 运行时加载的子树,销毁并清理\n this.logger.debug(`销毁运行时加载的子树: ${subTree.assetId}`);\n subTreeRoot.destroy();\n subTree.setSubTreeRoot(undefined);\n subTree.reset();\n }\n }\n /**\n * 递归重置子树的所有节点\n */\n resetSubTreeRecursively(entity) {\n // 移除 ActiveNode\n if (entity.hasComponent(ActiveNode)) {\n entity.removeComponentByType(ActiveNode);\n }\n // 重置节点状态\n const node = entity.getComponent(BehaviorTreeNode);\n if (node) {\n node.status = TaskStatus.Invalid;\n }\n // 递归处理子节点\n for (const child of entity.children) {\n this.resetSubTreeRecursively(child);\n }\n }\n /**\n * 完成节点执行\n */\n completeNode(entity) {\n entity.removeComponentByType(ActiveNode);\n // 通知父节点\n if (entity.parent && entity.parent.hasComponent(BehaviorTreeNode)) {\n if (!entity.parent.hasComponent(ActiveNode)) {\n entity.parent.addComponent(new ActiveNode());\n }\n }\n }\n /**\n * 获取父树的资产ID(用于循环检测)\n */\n getParentTreeAssetId(entity) {\n let current = entity;\n while (current) {\n // 查找带有资产元数据的组件\n const metadata = current.getComponent(BehaviorTreeAssetMetadata);\n if (metadata && metadata.assetId) {\n return metadata.assetId;\n }\n current = current.parent;\n }\n return undefined;\n }\n /**\n * 系统销毁时清理\n */\n onDestroy() {\n // 取消所有正在加载的任务\n for (const taskHandle of this.loadingTasks.values()) {\n taskHandle.cancel();\n }\n this.loadingTasks.clear();\n super.onDestroy();\n }\n /**\n * 查找根实体\n */\n findRootEntity(entity) {\n let current = entity;\n while (current) {\n if (!current.parent) {\n return current;\n }\n current = current.parent;\n }\n return null;\n }\n /**\n * 统一的日志输出方法\n * 同时输出到控制台和LogOutput组件,确保用户在UI中能看到\n */\n outputLog(entity, message, level = 'info') {\n // 输出到浏览器控制台(方便开发调试)\n switch (level) {\n case 'info':\n this.logger.info(message);\n break;\n case 'warn':\n this.logger.warn(message);\n break;\n case 'error':\n this.logger.error(message);\n break;\n default:\n this.logger.info(message);\n break;\n }\n // 输出到LogOutput组件(显示在UI中)\n const rootEntity = this.findRootEntity(entity);\n if (rootEntity) {\n const logOutput = rootEntity.getComponent(LogOutput);\n if (logOutput) {\n logOutput.addMessage(message, level);\n }\n }\n }\n /**\n * 递归打印子树结构(用于调试)\n */\n logSubTreeStructure(parentEntity, entity, depth) {\n const indent = ' '.repeat(depth);\n const btNode = entity.getComponent(BehaviorTreeNode);\n // 获取节点的具体类型组件\n const allComponents = entity.components.map(c => c.constructor.name);\n const nodeTypeComponent = allComponents.find(name => name !== 'BehaviorTreeNode' && name !== 'ActiveNode' &&\n name !== 'BlackboardComponent' && name !== 'LogOutput' &&\n name !== 'PropertyBindings' && name !== 'BehaviorTreeAssetMetadata') || 'Unknown';\n // 构建节点显示名称\n let nodeName = entity.name;\n if (nodeTypeComponent !== 'Unknown') {\n nodeName = `${nodeName} [${nodeTypeComponent}]`;\n }\n this.outputLog(parentEntity, `${indent}└─ ${nodeName}`, 'info');\n // 递归打印子节点\n if (entity.children.length > 0) {\n this.outputLog(parentEntity, `${indent} 子节点数: ${entity.children.length}`, 'info');\n entity.children.forEach((child) => {\n this.logSubTreeStructure(parentEntity, child, depth + 1);\n });\n }\n }\n getLoggerName() {\n return 'SubTreeExecutionSystem';\n }\n}\n//# sourceMappingURL=SubTreeExecutionSystem.js.map","import { WorldManager } from '@esengine/ecs-framework';\nimport { LeafExecutionSystem } from './Systems/LeafExecutionSystem';\nimport { DecoratorExecutionSystem } from './Systems/DecoratorExecutionSystem';\nimport { CompositeExecutionSystem } from './Systems/CompositeExecutionSystem';\nimport { SubTreeExecutionSystem } from './Systems/SubTreeExecutionSystem';\nimport { GlobalBlackboardService } from './Services/GlobalBlackboardService';\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 this.worldManager = services.resolve(WorldManager);\n }\n /**\n * 卸载插件\n */\n async uninstall() {\n // 注销全局黑板服务\n if (this.services) {\n this.services.unregister(GlobalBlackboardService);\n }\n this.worldManager = null;\n this.services = null;\n }\n /**\n * 为场景设置行为树系统\n *\n * 向场景添加所有必需的行为树系统:\n * - LeafExecutionSystem (updateOrder: 100)\n * - DecoratorExecutionSystem (updateOrder: 200)\n * - CompositeExecutionSystem (updateOrder: 300)\n * - SubTreeExecutionSystem (updateOrder: 300)\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 LeafExecutionSystem());\n scene.addSystem(new DecoratorExecutionSystem());\n scene.addSystem(new CompositeExecutionSystem());\n scene.addSystem(new SubTreeExecutionSystem());\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","import { BehaviorTreeNode } from './Components/BehaviorTreeNode';\nimport { ActiveNode } from './Components/ActiveNode';\nimport { TaskStatus } from './Types/TaskStatus';\n/**\n * 行为树启动/停止辅助类\n *\n * 提供便捷方法来启动、停止和暂停行为树\n */\nexport class BehaviorTreeStarter {\n /**\n * 启动行为树\n *\n * 给根节点添加 ActiveNode 组件,使行为树开始执行\n *\n * @param rootEntity 行为树根节点实体\n *\n * @example\n * ```typescript\n * const aiRoot = scene.createEntity('aiRoot');\n * // ... 构建行为树结构\n * BehaviorTreeStarter.start(aiRoot);\n * ```\n */\n static start(rootEntity) {\n if (!rootEntity.hasComponent(BehaviorTreeNode)) {\n throw new Error('Entity must have BehaviorTreeNode component');\n }\n if (!rootEntity.hasComponent(ActiveNode)) {\n rootEntity.addComponent(new ActiveNode());\n }\n }\n /**\n * 停止行为树\n *\n * 移除所有节点的 ActiveNode 组件,停止执行\n *\n * @param rootEntity 行为树根节点实体\n *\n * @example\n * ```typescript\n * BehaviorTreeStarter.stop(aiRoot);\n * ```\n */\n static stop(rootEntity) {\n this.stopRecursive(rootEntity);\n }\n /**\n * 递归停止所有子节点\n */\n static stopRecursive(entity) {\n // 移除活跃标记\n if (entity.hasComponent(ActiveNode)) {\n entity.removeComponentByType(ActiveNode);\n }\n // 重置节点状态\n const node = entity.getComponent(BehaviorTreeNode);\n if (node) {\n node.reset();\n }\n // 递归处理子节点\n for (const child of entity.children) {\n this.stopRecursive(child);\n }\n }\n /**\n * 暂停行为树\n *\n * 移除 ActiveNode 但保留节点状态,可以恢复执行\n *\n * @param rootEntity 行为树根节点实体\n *\n * @example\n * ```typescript\n * // 暂停\n * BehaviorTreeStarter.pause(aiRoot);\n *\n * // 恢复\n * BehaviorTreeStarter.resume(aiRoot);\n * ```\n */\n static pause(rootEntity) {\n this.pauseRecursive(rootEntity);\n }\n /**\n * 递归暂停所有子节点\n */\n static pauseRecursive(entity) {\n // 只移除活跃标记,不重置状态\n if (entity.hasComponent(ActiveNode)) {\n entity.removeComponentByType(ActiveNode);\n }\n // 递归处理子节点\n for (const child of entity.children) {\n this.pauseRecursive(child);\n }\n }\n /**\n * 恢复行为树执行\n *\n * 从暂停状态恢复,重新添加 ActiveNode 到之前正在执行的节点\n *\n * @param rootEntity 行为树根节点实体\n *\n * @example\n * ```typescript\n * BehaviorTreeStarter.resume(aiRoot);\n * ```\n */\n static resume(rootEntity) {\n this.resumeRecursive(rootEntity);\n }\n /**\n * 递归恢复所有正在执行的节点\n */\n static resumeRecursive(entity) {\n const node = entity.getComponent(BehaviorTreeNode);\n if (!node) {\n return;\n }\n // 如果节点状态是 Running,恢复活跃标记\n if (node.status === TaskStatus.Running) {\n if (!entity.hasComponent(ActiveNode)) {\n entity.addComponent(new ActiveNode());\n }\n }\n // 递归处理子节点\n for (const child of entity.children) {\n this.resumeRecursive(child);\n }\n }\n /**\n * 重启行为树\n *\n * 停止并重置所有节点,然后重新启动\n *\n * @param rootEntity 行为树根节点实体\n *\n * @example\n * ```typescript\n * BehaviorTreeStarter.restart(aiRoot);\n * ```\n */\n static restart(rootEntity) {\n this.stop(rootEntity);\n this.start(rootEntity);\n }\n /**\n * 检查行为树是否正在运行\n *\n * @param rootEntity 行为树根节点实体\n * @returns 是否正在运行\n *\n * @example\n * ```typescript\n * if (BehaviorTreeStarter.isRunning(aiRoot)) {\n * console.log('AI is active');\n * }\n * ```\n */\n static isRunning(rootEntity) {\n return rootEntity.hasComponent(ActiveNode);\n }\n}\n//# sourceMappingURL=BehaviorTreeStarter.js.map","import { BehaviorTreeNode } from './Components/BehaviorTreeNode';\nimport { CompositeNodeComponent } from './Components/CompositeNodeComponent';\nimport { BlackboardComponent } from './Components/BlackboardComponent';\nimport { NodeType, CompositeType } from './Types/TaskStatus';\n// 导入动作组件\nimport { WaitAction } from './Components/Actions/WaitAction';\nimport { LogAction } from './Components/Actions/LogAction';\nimport { SetBlackboardValueAction } from './Components/Actions/SetBlackboardValueAction';\nimport { ModifyBlackboardValueAction } from './Components/Actions/ModifyBlackboardValueAction';\nimport { ExecuteAction } from './Components/Actions/ExecuteAction';\n// 导入条件组件\nimport { BlackboardCompareCondition } from './Components/Conditions/BlackboardCompareCondition';\nimport { BlackboardExistsCondition } from './Components/Conditions/BlackboardExistsCondition';\nimport { RandomProbabilityCondition } from './Components/Conditions/RandomProbabilityCondition';\nimport { ExecuteCondition } from './Components/Conditions/ExecuteCondition';\n// 导入装饰器组件\nimport { RepeaterNode } from './Components/Decorators/RepeaterNode';\nimport { InverterNode } from './Components/Decorators/InverterNode';\nimport { UntilSuccessNode } from './Components/Decorators/UntilSuccessNode';\nimport { UntilFailNode } from './Components/Decorators/UntilFailNode';\nimport { AlwaysSucceedNode } from './Components/Decorators/AlwaysSucceedNode';\nimport { AlwaysFailNode } from './Components/Decorators/AlwaysFailNode';\nimport { ConditionalNode } from './Components/Decorators/ConditionalNode';\nimport { CooldownNode } from './Components/Decorators/CooldownNode';\nimport { TimeoutNode } from './Components/Decorators/TimeoutNode';\n/**\n * 行为树构建器\n *\n * 提供流式 API 来构建行为树结构\n *\n * @example\n * ```typescript\n * const aiRoot = BehaviorTreeBuilder.create(scene, 'AI')\n * .blackboard()\n * .defineVariable('health', BlackboardValueType.Number, 100)\n * .defineVariable('target', BlackboardValueType.Object, null)\n * .endBlackboard()\n * .selector('MainSelector')\n * .sequence('AttackSequence')\n * .condition((entity, blackboard) => {\n * return blackboard?.getValue('health') > 50;\n * })\n * .action('Attack', (entity) => TaskStatus.Success)\n * .end()\n * .action('Flee', (entity) => TaskStatus.Success)\n * .end()\n * .build();\n * ```\n */\nexport class BehaviorTreeBuilder {\n constructor(scene, rootName) {\n this.entityStack = [];\n this.scene = scene;\n this.currentEntity = scene.createEntity(rootName);\n }\n /**\n * 创建行为树构建器\n *\n * @param scene 场景实例\n * @param rootName 根节点名称\n * @returns 构建器实例\n */\n static create(scene, rootName = 'BehaviorTreeRoot') {\n return new BehaviorTreeBuilder(scene, rootName);\n }\n /**\n * 添加黑板组件到根节点\n */\n blackboard() {\n this.blackboardEntity = this.currentEntity;\n this.currentEntity.addComponent(new BlackboardComponent());\n return this;\n }\n /**\n * 定义黑板变量\n */\n defineVariable(name, type, initialValue, options) {\n if (!this.blackboardEntity) {\n throw new Error('Must call blackboard() first');\n }\n const blackboard = this.blackboardEntity.getComponent(BlackboardComponent);\n if (blackboard) {\n blackboard.defineVariable(name, type, initialValue, options);\n }\n return this;\n }\n /**\n * 结束黑板定义\n */\n endBlackboard() {\n this.blackboardEntity = undefined;\n return this;\n }\n /**\n * 创建序列节点\n */\n sequence(name = 'Sequence') {\n return this.composite(name, CompositeType.Sequence);\n }\n /**\n * 创建选择器节点\n */\n selector(name = 'Selector') {\n return this.composite(name, CompositeType.Selector);\n }\n /**\n * 创建并行节点\n */\n parallel(name = 'Parallel') {\n return this.composite(name, CompositeType.Parallel);\n }\n /**\n * 创建并行选择器节点\n */\n parallelSelector(name = 'ParallelSelector') {\n return this.composite(name, CompositeType.ParallelSelector);\n }\n /**\n * 创建随机序列节点\n */\n randomSequence(name = 'RandomSequence') {\n return this.composite(name, CompositeType.RandomSequence);\n }\n /**\n * 创建随机选择器节点\n */\n randomSelector(name = 'RandomSelector') {\n return this.composite(name, CompositeType.RandomSelector);\n }\n /**\n * 创建复合节点\n */\n composite(name, type) {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Composite;\n node.nodeName = name;\n const composite = entity.addComponent(new CompositeNodeComponent());\n composite.compositeType = type;\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建反转装饰器\n */\n inverter(name = 'Inverter') {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n entity.addComponent(new InverterNode());\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建重复装饰器\n */\n repeater(name = 'Repeater', count = -1, endOnFailure = false) {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n const decorator = entity.addComponent(new RepeaterNode());\n decorator.repeatCount = count;\n decorator.endOnFailure = endOnFailure;\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建直到成功装饰器\n */\n untilSuccess(name = 'UntilSuccess') {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n entity.addComponent(new UntilSuccessNode());\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建直到失败装饰器\n */\n untilFail(name = 'UntilFail') {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n entity.addComponent(new UntilFailNode());\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建总是成功装饰器\n */\n alwaysSucceed(name = 'AlwaysSucceed') {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n entity.addComponent(new AlwaysSucceedNode());\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建总是失败装饰器\n */\n alwaysFail(name = 'AlwaysFail') {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n entity.addComponent(new AlwaysFailNode());\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建条件装饰器\n */\n conditional(name, conditionCode) {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n const decorator = entity.addComponent(new ConditionalNode());\n decorator.conditionCode = conditionCode;\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建冷却装饰器\n */\n cooldown(name = 'Cooldown', cooldownTime = 1.0) {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n const decorator = entity.addComponent(new CooldownNode());\n decorator.cooldownTime = cooldownTime;\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建超时装饰器\n */\n timeout(name = 'Timeout', timeoutDuration = 5.0) {\n this.entityStack.push(this.currentEntity);\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Decorator;\n node.nodeName = name;\n const decorator = entity.addComponent(new TimeoutNode());\n decorator.timeoutDuration = timeoutDuration;\n this.currentEntity = entity;\n return this;\n }\n /**\n * 创建等待动作\n */\n wait(waitTime, name = 'Wait') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Action;\n node.nodeName = name;\n const action = entity.addComponent(new WaitAction());\n action.waitTime = waitTime;\n return this;\n }\n /**\n * 创建日志动作\n */\n log(message, level = 'log', name = 'Log') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Action;\n node.nodeName = name;\n const action = entity.addComponent(new LogAction());\n action.message = message;\n action.level = level;\n return this;\n }\n /**\n * 创建设置黑板值动作\n */\n setBlackboardValue(variableName, value, name = 'SetValue') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Action;\n node.nodeName = name;\n const action = entity.addComponent(new SetBlackboardValueAction());\n action.variableName = variableName;\n action.value = value;\n return this;\n }\n /**\n * 创建修改黑板值动作\n */\n modifyBlackboardValue(variableName, operation, operand, name = 'ModifyValue') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Action;\n node.nodeName = name;\n const action = entity.addComponent(new ModifyBlackboardValueAction());\n action.variableName = variableName;\n action.operation = operation;\n action.operand = operand;\n return this;\n }\n /**\n * 创建自定义动作\n */\n action(name, func) {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Action;\n node.nodeName = name;\n const action = entity.addComponent(new ExecuteAction());\n action.setFunction(func);\n return this;\n }\n /**\n * 创建黑板比较条件\n */\n compareBlackboardValue(variableName, operator, compareValue, name = 'Compare') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Condition;\n node.nodeName = name;\n const condition = entity.addComponent(new BlackboardCompareCondition());\n condition.variableName = variableName;\n condition.operator = operator;\n condition.compareValue = compareValue;\n return this;\n }\n /**\n * 创建黑板变量存在条件\n */\n checkBlackboardExists(variableName, checkNotNull = false, name = 'Exists') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Condition;\n node.nodeName = name;\n const condition = entity.addComponent(new BlackboardExistsCondition());\n condition.variableName = variableName;\n condition.checkNotNull = checkNotNull;\n return this;\n }\n /**\n * 创建随机概率条件\n */\n randomProbability(probability, name = 'Random') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Condition;\n node.nodeName = name;\n const condition = entity.addComponent(new RandomProbabilityCondition());\n condition.probability = probability;\n return this;\n }\n /**\n * 创建自定义条件\n */\n condition(func, name = 'Condition') {\n const entity = this.scene.createEntity(name);\n this.currentEntity.addChild(entity);\n const node = entity.addComponent(new BehaviorTreeNode());\n node.nodeType = NodeType.Condition;\n node.nodeName = name;\n const condition = entity.addComponent(new ExecuteCondition());\n condition.setFunction(func);\n return this;\n }\n /**\n * 结束当前节点,返回父节点\n */\n end() {\n if (this.entityStack.length === 0) {\n throw new Error('No parent node to return to');\n }\n this.currentEntity = this.entityStack.pop();\n return this;\n }\n /**\n * 构建并返回根节点实体\n */\n build() {\n // 确保返回到根节点\n while (this.entityStack.length > 0) {\n this.currentEntity = this.entityStack.pop();\n }\n return this.currentEntity;\n }\n}\n//# sourceMappingURL=BehaviorTreeBuilder.js.map","import { SceneSerializer } from '@esengine/ecs-framework';\nimport { BehaviorTreeNode } from '../Components/BehaviorTreeNode';\n/**\n * 行为树持久化工具\n *\n * 使用框架的序列化系统进行二进制/JSON序列化\n */\nexport class BehaviorTreePersistence {\n /**\n * 序列化行为树(JSON格式)\n *\n * @param rootEntity 行为树根实体\n * @param pretty 是否格式化\n * @returns 序列化数据(JSON字符串或二进制)\n *\n * @example\n * ```typescript\n * const data = BehaviorTreePersistence.serialize(aiRoot);\n * ```\n */\n static serialize(rootEntity, pretty = true) {\n if (!rootEntity.hasComponent(BehaviorTreeNode)) {\n throw new Error('Entity must have BehaviorTreeNode component');\n }\n if (!rootEntity.scene) {\n throw new Error('Entity must be attached to a scene');\n }\n // 使用 SceneSerializer,但只序列化这棵行为树\n // 创建一个临时场景包含只这个实体树\n return SceneSerializer.serialize(rootEntity.scene, {\n format: 'json',\n pretty: pretty,\n includeMetadata: true\n });\n }\n /**\n * 从序列化数据加载行为树\n *\n * @param scene 场景实例\n * @param data 序列化数据(JSON字符串或二进制)\n *\n * @example\n * ```typescript\n * // 从文件读取\n * const json = await readFile('behavior-tree.json');\n *\n * // 恢复行为树到场景\n * BehaviorTreePersistence.deserialize(scene, json);\n * ```\n */\n static deserialize(scene, data) {\n SceneSerializer.deserialize(scene, data, {\n strategy: 'merge'\n });\n }\n /**\n * 序列化为 JSON 字符串\n *\n * @param rootEntity 行为树根实体\n * @param pretty 是否格式化\n * @returns JSON 字符串\n */\n static toJSON(rootEntity, pretty = true) {\n const data = this.serialize(rootEntity, pretty);\n return JSON.stringify(data, null, pretty ? 2 : 0);\n }\n /**\n * 从 JSON 字符串加载\n *\n * @param scene 场景实例\n * @param json JSON 字符串\n */\n static fromJSON(scene, json) {\n this.deserialize(scene, json);\n }\n /**\n * 保存到文件(需要 Tauri 环境)\n *\n * @param rootEntity 行为树根实体\n * @param filePath 文件路径\n *\n * @example\n * ```typescript\n * await BehaviorTreePersistence.saveToFile(aiRoot, 'ai-behavior.json');\n * ```\n */\n static async saveToFile(rootEntity, filePath) {\n const json = this.toJSON(rootEntity, true);\n // 需要在 Tauri 环境中使用\n // const { writeTextFile } = await import('@tauri-apps/api/fs');\n // await writeTextFile(filePath, json);\n throw new Error('saveToFile requires Tauri environment. Use toJSON() for manual saving.');\n }\n /**\n * 从文件加载(需要 Tauri 环境)\n *\n * @param scene 场景实例\n * @param filePath 文件路径\n * @returns 恢复的根实体\n *\n * @example\n * ```typescript\n * const aiRoot = await BehaviorTreePersistence.loadFromFile(scene, 'ai-behavior.json');\n * ```\n */\n static async loadFromFile(scene, filePath) {\n // 需要在 Tauri 环境中使用\n // const { readTextFile } = await import('@tauri-apps/api/fs');\n // const json = await readTextFile(filePath);\n // return this.fromJSON(scene, json);\n throw new Error('loadFromFile requires Tauri environment. Use fromJSON() for manual loading.');\n }\n /**\n * 验证是否为有效的行为树数据\n *\n * @param data 序列化数据(字符串格式)\n * @returns 是否有效\n */\n static validate(data) {\n try {\n const parsed = JSON.parse(data);\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n // 检查必要字段\n if (!parsed.name ||\n typeof parsed.version !== 'number' ||\n !Array.isArray(parsed.entities) ||\n !Array.isArray(parsed.componentTypeRegistry)) {\n return false;\n }\n // 检查是否至少有一个实体包含 BehaviorTreeNode 组件\n const hasBehaviorTreeNode = parsed.entities.some((entity) => {\n return entity.components.some((comp) => comp.type === 'BehaviorTreeNode');\n });\n return hasBehaviorTreeNode;\n }\n catch {\n return false;\n }\n }\n /**\n * 克隆行为树\n *\n * @param scene 场景实例\n * @param rootEntity 要克隆的行为树根实体\n * @returns 克隆的新实体\n *\n * @example\n * ```typescript\n * const clonedAI = BehaviorTreePersistence.clone(scene, originalAI);\n * ```\n */\n static clone(scene, rootEntity) {\n const data = this.serialize(rootEntity);\n const entityCountBefore = scene.entities.count;\n this.deserialize(scene, data);\n // 找到新添加的根实体(最后添加的实体)\n const entities = Array.from(scene.entities.buffer);\n for (let i = entities.length - 1; i >= entityCountBefore; i--) {\n const entity = entities[i];\n if (entity.hasComponent(BehaviorTreeNode) && !entity.parent) {\n return entity;\n }\n }\n throw new Error('Failed to find cloned root entity');\n }\n}\n//# sourceMappingURL=BehaviorTreePersistence.js.map","import { NodeType } from '../Types/TaskStatus';\nimport { getRegisteredNodeTemplates } from '../Decorators/BehaviorNodeDecorator';\n/**\n * 编辑器节点模板库\n *\n * 使用装饰器系统管理所有节点\n */\nexport class NodeTemplates {\n /**\n * 获取所有节点模板(通过装饰器注册)\n */\n static getAllTemplates() {\n return getRegisteredNodeTemplates();\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//# sourceMappingURL=NodeTemplates.js.map"],"names":["TaskStatus","NodeType","CompositeType","DecoratorType","AbortType","BlackboardValueType","__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__metadata","metadataKey","metadataValue","metadata","SuppressedError","NodeClassRegistry","registerNodeClass","constructor","category","displayName","this","nodeClasses","set","getAllNodeClasses","Array","from","values","getNodeClass","_this$nodeClasses$get","get","clear","BehaviorNode","metadataWithClassName","_extends","className","name","BehaviorProperty","config","propertyKey","__nodeProperties","push","Map","ModifyOperation","CompareOperator","NodeProperty","getRegisteredNodeTemplates","map","_ref","propertyDefs","defaultConfig","nodeType","type","toLowerCase","instance","properties","prop","defaultValue","undefined","Composite","compositeType","Decorator","decoratorType","Action","actionType","Condition","conditionType","icon","description","color","requiresChildren","ExecuteAction","_Component","_this","actionCode","parameters","_inheritsLoose","_proto","prototype","getFunction","_this2","compiledFunction","func","Function","entity","blackboard","deltaTime","Success","error","setFunction","Component","label","required","Serialize","String","IgnoreSerialization","ECSComponent","Serializable","version","WaitAction","waitTime","elapsedTime","reset","min","step","Number","LogAction","message","level","includeEntityInfo","options","value","Boolean","SetBlackboardValueAction","variableName","force","ModifyBlackboardValueAction","operation","Add","operand","BlackboardCompareCondition","operator","Equal","compareValue","invertResult","BlackboardExistsCondition","checkNotNull","RandomProbabilityCondition","probability","alwaysRandomize","evaluate","cachedResult","Math","random","max","ExecuteCondition","conditionCode","CompositeNodeComponent","Sequence","shuffledIndices","reshuffleOnRestart","getNextChildIndex","currentIndex","totalChildren","RandomSequence","RandomSelector","shuffleIndices","count","_","j","floor","resetShuffle","SequenceNode","_CompositeNodeCompone","call","abortType","None","SelectorNode","Selector","ParallelNode","successPolicy","failurePolicy","Parallel","ParallelSelectorNode","ParallelSelector","RandomSequenceNode","RandomSelectorNode","SubTreeNode","assetId","inheritParentBlackboard","propagateFailure","preload","subTreeCompleted","subTreeResult","Invalid","getSubTreeRoot","subTreeRoot","setSubTreeRoot","root","markSubTreeCompleted","result","isSubTreeCompleted","getSubTreeResult","resetCompletionState","validate","errors","trim","DecoratorNodeComponent","Inverter","InverterNode","_DecoratorNodeCompone","RepeaterNode","repeatCount","endOnFailure","currentRepeatCount","Repeater","incrementRepeat","shouldContinueRepeat","UntilSuccessNode","UntilSuccess","UntilFailNode","UntilFail","AlwaysSucceedNode","AlwaysSucceed","AlwaysFailNode","AlwaysFail","ConditionalNode","shouldReevaluate","Conditional","evaluateCondition","compiledCondition","setConditionFunction","CooldownNode","cooldownTime","lastExecutionTime","Cooldown","canExecute","currentTime","recordExecution","TimeoutNode","timeoutDuration","startTime","Timeout","recordStartTime","isTimeout","BehaviorTreeNode","nodeName","status","currentChildIndex","invalidate","GlobalBlackboardService","variables","dispose","defineVariable","initialValue","_options$readonly","readonly","getValue","variable","setValue","hasVariable","has","removeVariable","getVariableNames","keys","getAllVariables","setVariables","_i","_Object$entries","entries","_Object$entries$_i","getVariables","names","_step","_iterator","_createForOfIteratorHelperLoose","done","exportConfig","importConfig","_step2","_iterator2","toJSON","JSON","stringify","fromJSON","json","parse","BlackboardComponent","useGlobalBlackboard","Core","services","resolve","getLocalValue","setLocalValue","hasLocalVariable","setUseGlobalBlackboard","enabled","isUsingGlobalBlackboard","locals","globals","localNames","Set","filteredGlobals","filter","v","concat","getGlobalBlackboard","ActiveNode","apply","PropertyBindings","bindings","addBinding","propertyName","blackboardKey","getBinding","hasBinding","clearBindings","LogOutput","messages","addMessage","timestamp","Date","now","BehaviorTreeAssetMetadata","assetVersion","assetName","loadedAt","initialize","RootNode","sharedTextEncoder","TextEncoder","utf8Encode","str","output","outputOffset","encodeInto","subarray","utf8EncodeTE","strLength","offset","pos","charCodeAt","extra","utf8EncodeJs","utf8DecodeJs","bytes","inputOffset","byteLength","end","units","byte1","byte2","byte3","unit","fromCharCode","sharedTextDecoder","TextDecoder","utf8Decode","stringBytes","decode","utf8DecodeTD","ExtData","data","DecodeError","Error","super","proto","create","setPrototypeOf","configurable","enumerable","UINT32_MAX","setInt64","view","high","low","setUint32","getInt64","getInt32","getUint32","timestampExtension","encode","object","sec","nsec","rv","Uint8Array","DataView","buffer","secHigh","secLow","encodeTimeSpecToTimestamp","date","msec","getTime","nsecInSec","encodeDateToTimeSpec","timeSpec","byteOffset","nsec30AndSecHigh2","decodeTimestampToTimeSpec","ExtensionCodec","builtInEncoders","builtInDecoders","encoders","decoders","register","index","tryToEncode","context","encodeExt","decodeExt","ensureUint8Array","ArrayBuffer","isView","SharedArrayBuffer","isArrayBufferLike","defaultCodec","Encoder","entered","extensionCodec","useBigInt64","maxDepth","initialBufferSize","sortKeys","forceFloat32","ignoreUndefined","forceIntegerToFloat","clone","reinitializeState","encodeSharedRef","doEncode","slice","depth","encodeNil","encodeBoolean","encodeNumberAsFloat","encodeNumber","encodeString","encodeBigInt64","encodeObject","ensureBufferSizeToWrite","sizeToWrite","requiredSize","resizeBuffer","newSize","newBuffer","newBytes","newView","writeU8","isSafeInteger","writeU16","writeU32","writeU64","writeI8","writeI16","writeI32","writeI64","writeF32","writeF64","BigInt","writeBigUint64","writeBigInt64","writeStringHeader","utf8Count","ext","encodeExtension","isArray","encodeArray","encodeBinary","toString","encodeMap","size","writeU8a","item","countWithoutUndefined","sort","setUint8","setInt8","setUint16","setInt16","setInt32","setFloat32","setFloat64","setUint64","setBigUint64","setBigInt64","prettyByte","byte","abs","padStart","STATE_ARRAY","STATE_MAP_KEY","STATE_MAP_VALUE","mapKeyConverter","StackPool","stack","stackHeadPosition","top","pushArrayState","state","getUninitializedStateFromPool","position","array","pushMapState","readCount","partialState","release","EMPTY_VIEW","EMPTY_BYTES","getInt8","e","RangeError","MORE_DATA","sharedCachedKeyDecoder","maxKeyLength","maxLengthPerKey","hit","miss","caches","canBeCached","find","records","FIND_CHUNK","record","recordBytes","store","cachedValue","slicedCopyOfBytes","Decoder","totalPos","headByte","rawStrings","maxStrLength","maxBinLength","maxArrayLength","maxMapLength","maxExtLength","keyDecoder","setBuffer","appendBuffer","hasRemaining","remainingData","newData","createExtraByteError","posToShow","doDecodeSync","decodeMulti","decodeAsync","stream","decoded","decodeArrayStream","decodeMultiAsync","decodeStream","isArrayHeaderRequired","arrayItemsLeft","readArraySize","complete","DECODE","readHeadByte","decodeString","readF32","readF64","readU8","readU16","readU32","readU64AsBigInt","readU64","readI8","readI16","readI32","readI64AsBigInt","readI64","lookU8","lookU16","lookU32","decodeBinary","decodeExtension","headerOffset","stateIsMapKey","decodeUtf8String","headOffset","extType","getUint8","getUint16","getInt16","getBigUint64","getBigInt64","getFloat32","getFloat64","PreloadState","BehaviorTreeAssetValidator","asset","warnings","rootNodeId","nodes","nodeIds","n","id","node","add","children","_step4","_loop","childId","_iterator4","referencedNodes","collectReferencedNodes","nodeId","_step3","_iterator3","_step5","varNames","_iterator5","propertyBindings","_asset$blackboard","_step6","_iterator6","binding","valid","getStats","_asset$blackboard2","_asset$propertyBindin","_step7","actionCount","conditionCount","compositeCount","decoratorCount","_iterator7","getDepth","currentDepth","_step8","maxChildDepth","_iterator8","childDepth","nodeCount","blackboardVariableCount","propertyBindingCount","logger","createLogger","EditorFormatConverter","toAsset","editorData","_editorData$metadata","_editorData$metadata2","_editorData$metadata3","info","rootNode","findRootNode","assetMetadata","createdAt","modifiedAt","toISOString","convertNodes","convertBlackboard","convertPropertyBindings","connections","template","editorNodes","convertNode","editorNode","inferBlackboardType","blackboardVarNames","conn","fromNode","toNode","to","toProperty","fromProperty","warn","connectionType","fromAsset","convertNodesFromAsset","convertPropertyBindingsToConnections","nodeConnections","buildNodeConnections","canvasState","x","y","scale","assetNodes","inferCategory","BehaviorTreeAssetSerializer","serialize","format","pretty","validation","_validation$errors","join","serializeToJSON","serializeToBinary","binary","deserialize","strict","deserializeFromJSON","deserializeFromBinary","_validation$errors2","detectFormat","getInfo","convert","targetFormat","compareSize","jsonData","binaryData","jsonSize","binarySize","savedBytes","compressionRatio","FileSystemAssetLoader","_config$enableCache","cache","basePath","extension","enableCache","readFile","defaultReadFile","bind","replace","loadBehaviorTree","_loadBehaviorTree","_asyncToGenerator","_regenerator","m","_callee","filePath","_t","w","_context","p","debug","a","resolveAssetPath","_x","exists","_exists","_callee2","_context2","_x2","_preload","_callee3","assetIds","promises","_context3","Promise","all","_x3","unload","clearCache","getCacheSize","normalizedId","_defaultReadFile","_callee4","path","response","fs","_buffer","_t3","_context4","window","fetch","ok","statusText","arrayBuffer","text","require","_x4","BehaviorTreeAssetLoader","instantiate","scene","nodeMap","rootNodeData","entityMap","rootEntity","createEntityTree","namePrefix","asSubTree","setupBlackboard","blackboardOverrides","setupPropertyBindings","nodeData","isRootOfSubTree","entityName","createEntity","btNode","addComponent","addNodeComponents","childData","childEntity","addChild","skipRootNode","addCompositeComponent","addDecoratorComponent","addActionComponent","addConditionComponent","_data$abortType","nameLower","includes","_data$abortType2","_data$failurePolicy","_data$successPolicy","_data$failurePolicy2","_data$repeatCount","_data$endOnFailure","_data$conditionCode","_data$shouldReevaluat","_data$cooldownTime","_data$timeoutDuration","_data$waitTime","_data$message","_data$level","action","_data$variableName","_data$variableName2","_data$operation","_data$operand","_data$actionCode","_data$variableName3","_data$operator","_data$invertResult","condition","_data$variableName4","_data$checkNotNull","_data$invertResult2","_data$probability","_data$conditionCode2","_data$invertResult3","blackboardDef","overrides","getComponent","RootExecutionSystem","LoadingState","_EntitySystem","Matcher","empty","preloadStates","preloadTasks","updateOrder","process","entities","hasComponent","executeRoot","preloadState","NotStarted","Loading","Failed","Failure","removeComponentByType","firstChild","childNode","Running","startPreload","subTreeNodesToPreload","scanSubTreeNodes","Completed","outputLog","loadTask","preloadAllSubTrees","then","subTree","child","_preloadAllSubTrees","subTreeNodes","_this3","assetLoader","preloadSingleSubTree","_preloadSingleSubTree","subTreeEntity","_t2","setupBlackboardInheritance","logSubTreeStructure","_x5","parentEntity","findBlackboard","subTreeBlackboard","current","parent","findRootEntity","logOutput","_this4","indent","repeat","nodeTypeComponent","components","forEach","onDestroy","getLoggerName","EntitySystem","LeafExecutionSystem","executeAction","executeCondition","_this$getNodeInfo","getNodeInfo","nodeIdShort","executeWaitAction","executeLogAction","executeSetBlackboardValue","executeModifyBlackboardValue","executeCustomAction","deactivateNode","notifyParent","waitAction","_this$getNodeInfo2","resolvePropertyValue","Time","toFixed","logAction","_this$getNodeInfo3","console","log","valueToSet","sourceVariable","newValue","currentValue","Subtract","Multiply","Divide","Modulo","Append","Remove","_this$getNodeInfo4","evaluateBlackboardCompare","evaluateBlackboardExists","evaluateRandomProbability","evaluateCustomCondition","NotEqual","Greater","GreaterOrEqual","Less","LessOrEqual","Contains","Matches","RegExp","test","parts","split","substring","DecoratorExecutionSystem","decorator","getComponentByType","executeDecorator","completeNode","handleInverter","handleRepeater","handleUntilSuccess","handleUntilFail","handleAlwaysSucceed","handleAlwaysFail","handleConditional","handleCooldown","handleTimeout","repeater","cooldown","timeSinceLastExecution","totalTime","timeout","CompositeExecutionSystem","exclude","composite","executeComposite","handleSequence","handleSelector","handleParallel","handleParallelSelector","handleRandomSequence","handleRandomSelector","sequenceNode","shouldAbort","currentChild","abortExecution","selectorNode","hasRunning","hasFailed","hasSucceeded","childIndex","Self","Both","LowerPriority","firstGrandChild","firstGrandChildNode","resolveVariableReferences","pureMatch","match","varName","val","resetAllChildren","TimeoutError","AssetType","_Error","_wrapNativeSuper","CircularDependencyError","_Error2","EntityDestroyedError","_Error3","AssetLoadingManager","tasks","loadingStack","defaultOptions","timeoutMs","maxRetries","retryDelayBase","maxRetryDelay","startLoading","loader","finalOptions","parentAssetId","detectCircularDependency","existingTask","createHandle","task","promise","lastRetryTime","retryCount","Pending","parentEntityId","loadWithTimeoutAndRetry","_loadWithTimeoutAndRetry","lastError","attempt","delayMs","isDestroyed","Cancelled","cleanup","withTimeout","Loaded","attempts","elapsedMs","pow","delay","timeoutId","timeoutPromise","reject","setTimeout","race","clearTimeout","getTaskState","_this$tasks$get$state","_this$tasks$get","Idle","getTask","cancelLoading","ms","getState","getError","getProgress","elapsed","remaining","remainingTimeoutMs","cancel","getLoadingAssets","totalTasks","loadingTasks","t","failedTasks","timeoutTasks","SubTreeExecutionSystem","loadingManager","assetLoaderInitialized","hasLoggedMissingAssetLoader","onInitialize","executeSubTree","existingSubTreeRoot","subTreeNode","statusName","hasActive","subTreeRootNode","updateSubTree","loadAndInstantiateSubTree","ensureAssetLoaderInitialized","taskHandle","progress","round","onLoadingComplete","startNewLoading","getParentTreeAssetId","loadAsset","destroy","startSubTreeExecution","_loadAsset","onSubTreeCompleted","subTreeStatus","cleanupSubTree","resetSubTreeRecursively","WorkspaceService","assetMap","assetPathMap","rebuildAssetMaps","assets","getConfig","updateConfig","registerAsset","existing","assign","unregisterAsset","findIndex","splice","getAssetById","getAssetByPath","getAllAssets","_this$config","getAssetsByType","getBehaviorTreeAssets","BehaviorTree","getBlackboardAssets","Blackboard","getAssetDependencies","visited","dependencies","depId","depAsset","dfs","currentId","pop","canAddDependency","dependencyId","originalDeps","hasCircular","addAssetDependency","removeAssetDependency","indexOf","startsWith","rootPath","getRelativePath","absolutePath","absPath","BehaviorTreePlugin","worldManager","install","_install","core","registerSingleton","WorldManager","uninstall","_uninstall","unregister","setupScene","addSystem","setupAllScenes","getAllWorlds","getAllScenes","BehaviorTreeStarter","start","stop","stopRecursive","pause","pauseRecursive","resume","resumeRecursive","restart","isRunning","BehaviorTreeBuilder","rootName","entityStack","currentEntity","blackboardEntity","endBlackboard","sequence","selector","parallel","parallelSelector","randomSequence","randomSelector","inverter","untilSuccess","untilFail","alwaysSucceed","alwaysFail","conditional","wait","setBlackboardValue","modifyBlackboardValue","compareBlackboardValue","checkBlackboardExists","randomProbability","build","BehaviorTreePersistence","SceneSerializer","includeMetadata","strategy","saveToFile","_saveToFile","loadFromFile","_loadFromFile","parsed","componentTypeRegistry","some","comp","_unused","entityCountBefore","NodeTemplates","getAllTemplates","getTemplate","subType"],"mappings":"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","x_google_ignoreList":[1,38,39,40,41,42,43,44,45,46,47,48,49,54]}
|