@esengine/blueprint 4.2.0 → 4.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/pins.ts","../src/types/nodes.ts","../src/types/blueprint.ts","../src/registry/BlueprintDecorators.ts","../src/runtime/ExecutionContext.ts","../src/runtime/NodeRegistry.ts","../src/runtime/BlueprintVM.ts","../src/runtime/BlueprintComponent.ts","../src/runtime/BlueprintSystem.ts","../src/registry/ComponentNodeGenerator.ts","../src/triggers/TriggerTypes.ts","../src/triggers/TriggerCondition.ts","../src/triggers/BlueprintTrigger.ts","../src/triggers/TriggerDispatcher.ts","../src/composition/BlueprintFragment.ts","../src/composition/BlueprintComposer.ts","../src/composition/FragmentRegistry.ts","../src/nodes/events/EventBeginPlay.ts","../src/nodes/events/EventTick.ts","../src/nodes/events/EventEndPlay.ts","../src/nodes/ecs/EntityNodes.ts","../src/nodes/ecs/ComponentNodes.ts","../src/nodes/ecs/FlowNodes.ts","../src/nodes/math/MathOperations.ts","../src/nodes/time/GetDeltaTime.ts","../src/nodes/time/GetTime.ts","../src/nodes/time/Delay.ts","../src/nodes/debug/Print.ts","../src/index.ts"],"sourcesContent":["/**\n * Blueprint Pin Types\n * 蓝图引脚类型\n */\n\n/**\n * Pin data type for blueprint nodes\n * 蓝图节点的引脚数据类型\n */\nexport type BlueprintPinType =\n | 'exec' // Execution flow (执行流)\n | 'bool' // Boolean (布尔)\n | 'int' // Integer (整数)\n | 'float' // Float (浮点数)\n | 'string' // String (字符串)\n | 'vector2' // 2D Vector (二维向量)\n | 'vector3' // 3D Vector (三维向量)\n | 'color' // RGBA Color (颜色)\n | 'entity' // Entity reference (实体引用)\n | 'component' // Component reference (组件引用)\n | 'object' // Generic object (通用对象)\n | 'array' // Array (数组)\n | 'any'; // Wildcard (通配符)\n\n/**\n * Pin direction\n * 引脚方向\n */\nexport type BlueprintPinDirection = 'input' | 'output';\n\n/**\n * Pin definition for node templates\n * 节点模板的引脚定义\n *\n * Note: direction is determined by whether the pin is in inputs[] or outputs[] array\n * 注意:方向由引脚在 inputs[] 还是 outputs[] 数组中决定\n */\nexport interface BlueprintPinDefinition {\n /** Unique name within node (节点内唯一名称) */\n name: string;\n\n /** Pin data type (引脚数据类型) */\n type: BlueprintPinType;\n\n /** Display name shown in the editor (编辑器中显示的名称) */\n displayName?: string;\n\n /** Default value when not connected (未连接时的默认值) */\n defaultValue?: unknown;\n\n /** Allow multiple connections (允许多个连接) */\n allowMultiple?: boolean;\n\n /** Array element type if type is 'array' (数组元素类型) */\n arrayType?: BlueprintPinType;\n\n /** Whether this pin is optional (是否可选) */\n optional?: boolean;\n\n /** Tooltip description (提示描述) */\n tooltip?: string;\n}\n\n/**\n * Runtime pin with direction - used when processing pins\n * 带方向的运行时引脚 - 处理引脚时使用\n */\nexport interface BlueprintRuntimePin extends BlueprintPinDefinition {\n /** Pin direction (引脚方向) */\n direction: BlueprintPinDirection;\n}\n\n/**\n * Pin instance in a node\n * 节点中的引脚实例\n */\nexport interface BlueprintPin {\n id: string;\n nodeId: string;\n definition: BlueprintPinDefinition;\n value?: unknown;\n}\n\n/**\n * Gets the color for a pin type\n * 获取引脚类型的颜色\n */\nexport function getPinTypeColor(type: BlueprintPinType): string {\n const colors: Record<BlueprintPinType, string> = {\n exec: '#ffffff',\n bool: '#cc0000',\n int: '#00d4aa',\n float: '#88cc00',\n string: '#ff88cc',\n vector2: '#d4aa00',\n vector3: '#ffcc00',\n color: '#ff8844',\n entity: '#0088ff',\n component: '#44aaff',\n object: '#4444aa',\n array: '#8844ff',\n any: '#888888'\n };\n return colors[type] ?? colors.any;\n}\n\n/**\n * Checks if two pin types are compatible for connection\n * 检查两个引脚类型是否兼容连接\n */\nexport function arePinTypesCompatible(from: BlueprintPinType, to: BlueprintPinType): boolean {\n // Same type always compatible\n // 相同类型始终兼容\n if (from === to) return true;\n\n // Any type is compatible with everything\n // any 类型与所有类型兼容\n if (from === 'any' || to === 'any') return true;\n\n // Exec can only connect to exec\n // exec 只能连接 exec\n if (from === 'exec' || to === 'exec') return false;\n\n // Numeric coercion\n // 数值类型转换\n const numericTypes: BlueprintPinType[] = ['int', 'float'];\n if (numericTypes.includes(from) && numericTypes.includes(to)) return true;\n\n // Vector coercion\n // 向量类型转换\n const vectorTypes: BlueprintPinType[] = ['vector2', 'vector3', 'color'];\n if (vectorTypes.includes(from) && vectorTypes.includes(to)) return true;\n\n return false;\n}\n","/**\n * Blueprint Node Types\n * 蓝图节点类型\n */\n\nimport { BlueprintPinDefinition } from './pins';\n\n/**\n * Node category for visual styling and organization\n * 节点类别,用于视觉样式和组织\n */\nexport type BlueprintNodeCategory =\n | 'event' // Event nodes - red (事件节点 - 红色)\n | 'flow' // Flow control - gray (流程控制 - 灰色)\n | 'entity' // Entity operations - blue (实体操作 - 蓝色)\n | 'component' // Component access - cyan (组件访问 - 青色)\n | 'math' // Math operations - green (数学运算 - 绿色)\n | 'logic' // Logic operations - red (逻辑运算 - 红色)\n | 'variable' // Variable access - purple (变量访问 - 紫色)\n | 'input' // Input handling - orange (输入处理 - 橙色)\n | 'physics' // Physics - yellow (物理 - 黄色)\n | 'audio' // Audio - pink (音频 - 粉色)\n | 'time' // Time utilities - cyan (时间工具 - 青色)\n | 'debug' // Debug utilities - gray (调试工具 - 灰色)\n | 'custom'; // Custom nodes (自定义节点)\n\n/**\n * Node template definition - describes a type of node\n * 节点模板定义 - 描述一种节点类型\n */\nexport interface BlueprintNodeTemplate {\n /** Unique type identifier (唯一类型标识符) */\n type: string;\n\n /** Display title (显示标题) */\n title: string;\n\n /** Node category (节点类别) */\n category: BlueprintNodeCategory;\n\n /** Optional subtitle (可选副标题) */\n subtitle?: string;\n\n /** Icon name (图标名称) */\n icon?: string;\n\n /** Description for documentation (文档描述) */\n description?: string;\n\n /** Search keywords (搜索关键词) */\n keywords?: string[];\n\n /** Menu path for node palette (节点面板的菜单路径) */\n menuPath?: string[];\n\n /** Input pin definitions (输入引脚定义) */\n inputs: BlueprintPinDefinition[];\n\n /** Output pin definitions (输出引脚定义) */\n outputs: BlueprintPinDefinition[];\n\n /** Whether this node is pure (no exec pins) (是否是纯节点,无执行引脚) */\n isPure?: boolean;\n\n /** Whether this node can be collapsed (是否可折叠) */\n collapsible?: boolean;\n\n /** Custom header color override (自定义头部颜色) */\n headerColor?: string;\n\n /** Node color for visual distinction (节点颜色用于视觉区分) */\n color?: string;\n}\n\n/**\n * Node instance in a blueprint graph\n * 蓝图图中的节点实例\n */\nexport interface BlueprintNode {\n /** Unique instance ID (唯一实例ID) */\n id: string;\n\n /** Template type reference (模板类型引用) */\n type: string;\n\n /** Position in graph (图中位置) */\n position: { x: number; y: number };\n\n /** Custom data for this instance (此实例的自定义数据) */\n data: Record<string, unknown>;\n\n /** Comment/note for this node (此节点的注释) */\n comment?: string;\n}\n\n/**\n * Connection between two pins\n * 两个引脚之间的连接\n */\nexport interface BlueprintConnection {\n /** Unique connection ID (唯一连接ID) */\n id: string;\n\n /** Source node ID (源节点ID) */\n fromNodeId: string;\n\n /** Source pin name (源引脚名称) */\n fromPin: string;\n\n /** Target node ID (目标节点ID) */\n toNodeId: string;\n\n /** Target pin name (目标引脚名称) */\n toPin: string;\n}\n\n/**\n * Gets the header color for a node category\n * 获取节点类别的头部颜色\n */\nexport function getNodeCategoryColor(category: BlueprintNodeCategory): string {\n const colors: Record<BlueprintNodeCategory, string> = {\n event: '#8b1e1e',\n flow: '#4a4a4a',\n entity: '#1e5a8b',\n component: '#1e8b8b',\n math: '#1e8b5a',\n logic: '#8b1e5a',\n variable: '#5a1e8b',\n input: '#8b5a1e',\n physics: '#8b8b1e',\n audio: '#8b1e6b',\n time: '#1e6b8b',\n debug: '#5a5a5a',\n custom: '#4a4a4a'\n };\n return colors[category] ?? colors.custom;\n}\n","/**\n * Blueprint Asset Types\n * 蓝图资产类型\n */\n\nimport { BlueprintNode, BlueprintConnection } from './nodes';\n\n/**\n * Variable scope determines lifetime and accessibility\n * 变量作用域决定生命周期和可访问性\n */\nexport type VariableScope =\n | 'local' // Per-execution (每次执行)\n | 'instance' // Per-entity (每个实体)\n | 'global'; // Shared across all (全局共享)\n\n/**\n * Blueprint variable definition\n * 蓝图变量定义\n */\nexport interface BlueprintVariable {\n /** Variable name (变量名) */\n name: string;\n\n /** Variable type (变量类型) */\n type: string;\n\n /** Default value (默认值) */\n defaultValue: unknown;\n\n /** Variable scope (变量作用域) */\n scope: VariableScope;\n\n /** Category for organization (分类) */\n category?: string;\n\n /** Description tooltip (描述提示) */\n tooltip?: string;\n}\n\n/**\n * Blueprint asset metadata\n * 蓝图资产元数据\n */\nexport interface BlueprintMetadata {\n /** Blueprint name (蓝图名称) */\n name: string;\n\n /** Description (描述) */\n description?: string;\n\n /** Category for organization (分类) */\n category?: string;\n\n /** Author (作者) */\n author?: string;\n\n /** Creation timestamp (创建时间戳) */\n createdAt?: number;\n\n /** Last modified timestamp (最后修改时间戳) */\n modifiedAt?: number;\n}\n\n/**\n * Blueprint asset format - saved to .bp files\n * 蓝图资产格式 - 保存为 .bp 文件\n */\nexport interface BlueprintAsset {\n /** Format version (格式版本) */\n version: number;\n\n /** Asset type identifier (资产类型标识符) */\n type: 'blueprint';\n\n /** Metadata (元数据) */\n metadata: BlueprintMetadata;\n\n /** Variable definitions (变量定义) */\n variables: BlueprintVariable[];\n\n /** Node instances (节点实例) */\n nodes: BlueprintNode[];\n\n /** Connections between nodes (节点之间的连接) */\n connections: BlueprintConnection[];\n}\n\n/**\n * Creates an empty blueprint asset with default Event Begin Play node\n * 创建带有默认 Event Begin Play 节点的空蓝图资产\n */\nexport function createEmptyBlueprint(name: string, includeBeginPlay: boolean = true): BlueprintAsset {\n const nodes: BlueprintNode[] = [];\n\n if (includeBeginPlay) {\n nodes.push({\n id: 'node_beginplay_1',\n type: 'EventBeginPlay',\n position: { x: 100, y: 200 },\n data: {}\n });\n }\n\n return {\n version: 1,\n type: 'blueprint',\n metadata: {\n name,\n createdAt: Date.now(),\n modifiedAt: Date.now()\n },\n variables: [],\n nodes,\n connections: []\n };\n}\n\n/**\n * Validates a blueprint asset structure\n * 验证蓝图资产结构\n */\nexport function validateBlueprintAsset(asset: unknown): asset is BlueprintAsset {\n if (!asset || typeof asset !== 'object') return false;\n\n const bp = asset as BlueprintAsset;\n\n return (\n typeof bp.version === 'number' &&\n bp.type === 'blueprint' &&\n typeof bp.metadata === 'object' &&\n Array.isArray(bp.variables) &&\n Array.isArray(bp.nodes) &&\n Array.isArray(bp.connections)\n );\n}\n","/**\n * @zh 蓝图装饰器 - 用于标记可在蓝图中使用的组件、属性和方法\n * @en Blueprint Decorators - Mark components, properties and methods for blueprint use\n *\n * @example\n * ```typescript\n * import { BlueprintExpose, BlueprintProperty, BlueprintMethod } from '@esengine/blueprint';\n *\n * @ECSComponent('Health')\n * @BlueprintExpose({ displayName: '生命值组件', category: 'gameplay' })\n * export class HealthComponent extends Component {\n *\n * @BlueprintProperty({ displayName: '当前生命值', type: 'float' })\n * current: number = 100;\n *\n * @BlueprintProperty({ displayName: '最大生命值', type: 'float', readonly: true })\n * max: number = 100;\n *\n * @BlueprintMethod({\n * displayName: '治疗',\n * params: [{ name: 'amount', type: 'float' }]\n * })\n * heal(amount: number): void {\n * this.current = Math.min(this.current + amount, this.max);\n * }\n *\n * @BlueprintMethod({\n * displayName: '受伤',\n * params: [{ name: 'amount', type: 'float' }],\n * returnType: 'bool'\n * })\n * takeDamage(amount: number): boolean {\n * this.current -= amount;\n * return this.current <= 0;\n * }\n * }\n * ```\n */\n\nimport type { BlueprintPinType } from '../types/pins';\n\n// ============================================================================\n// Types | 类型定义\n// ============================================================================\n\n/**\n * @zh 参数定义\n * @en Parameter definition\n */\nexport interface BlueprintParamDef {\n /** @zh 参数名称 @en Parameter name */\n name: string;\n /** @zh 显示名称 @en Display name */\n displayName?: string;\n /** @zh 引脚类型 @en Pin type */\n type?: BlueprintPinType;\n /** @zh 默认值 @en Default value */\n defaultValue?: unknown;\n}\n\n/**\n * @zh 蓝图暴露选项\n * @en Blueprint expose options\n */\nexport interface BlueprintExposeOptions {\n /** @zh 组件显示名称 @en Component display name */\n displayName?: string;\n /** @zh 组件描述 @en Component description */\n description?: string;\n /** @zh 组件分类 @en Component category */\n category?: string;\n /** @zh 组件颜色 @en Component color */\n color?: string;\n /** @zh 组件图标 @en Component icon */\n icon?: string;\n}\n\n/**\n * @zh 蓝图属性选项\n * @en Blueprint property options\n */\nexport interface BlueprintPropertyOptions {\n /** @zh 属性显示名称 @en Property display name */\n displayName?: string;\n /** @zh 属性描述 @en Property description */\n description?: string;\n /** @zh 引脚类型 @en Pin type */\n type?: BlueprintPinType;\n /** @zh 是否只读(不生成 Set 节点)@en Readonly (no Set node generated) */\n readonly?: boolean;\n /** @zh 默认值 @en Default value */\n defaultValue?: unknown;\n}\n\n/**\n * @zh 蓝图方法选项\n * @en Blueprint method options\n */\nexport interface BlueprintMethodOptions {\n /** @zh 方法显示名称 @en Method display name */\n displayName?: string;\n /** @zh 方法描述 @en Method description */\n description?: string;\n /** @zh 是否是纯函数(无副作用)@en Is pure function (no side effects) */\n isPure?: boolean;\n /** @zh 参数列表 @en Parameter list */\n params?: BlueprintParamDef[];\n /** @zh 返回值类型 @en Return type */\n returnType?: BlueprintPinType;\n}\n\n/**\n * @zh 属性元数据\n * @en Property metadata\n */\nexport interface PropertyMetadata {\n propertyKey: string;\n displayName: string;\n description?: string;\n pinType: BlueprintPinType;\n readonly: boolean;\n defaultValue?: unknown;\n}\n\n/**\n * @zh 方法元数据\n * @en Method metadata\n */\nexport interface MethodMetadata {\n methodKey: string;\n displayName: string;\n description?: string;\n isPure: boolean;\n params: BlueprintParamDef[];\n returnType: BlueprintPinType;\n}\n\n/**\n * @zh 组件蓝图元数据\n * @en Component blueprint metadata\n */\nexport interface ComponentBlueprintMetadata extends BlueprintExposeOptions {\n componentName: string;\n properties: PropertyMetadata[];\n methods: MethodMetadata[];\n}\n\n// ============================================================================\n// Registry | 注册表\n// ============================================================================\n\n/**\n * @zh 已注册的蓝图组件\n * @en Registered blueprint components\n */\nconst registeredComponents = new Map<Function, ComponentBlueprintMetadata>();\n\n/**\n * @zh 获取所有已注册的蓝图组件\n * @en Get all registered blueprint components\n */\nexport function getRegisteredBlueprintComponents(): Map<Function, ComponentBlueprintMetadata> {\n return registeredComponents;\n}\n\n/**\n * @zh 获取组件的蓝图元数据\n * @en Get blueprint metadata for a component\n */\nexport function getBlueprintMetadata(componentClass: Function): ComponentBlueprintMetadata | undefined {\n return registeredComponents.get(componentClass);\n}\n\n/**\n * @zh 清除所有注册的蓝图组件(用于测试)\n * @en Clear all registered blueprint components (for testing)\n */\nexport function clearRegisteredComponents(): void {\n registeredComponents.clear();\n}\n\n// ============================================================================\n// Internal Helpers | 内部辅助函数\n// ============================================================================\n\nfunction getOrCreateMetadata(constructor: Function): ComponentBlueprintMetadata {\n let metadata = registeredComponents.get(constructor);\n if (!metadata) {\n metadata = {\n componentName: (constructor as any).__componentName__ ?? constructor.name,\n properties: [],\n methods: []\n };\n registeredComponents.set(constructor, metadata);\n }\n return metadata;\n}\n\n// ============================================================================\n// Decorators | 装饰器\n// ============================================================================\n\n/**\n * @zh 标记组件可在蓝图中使用\n * @en Mark component as usable in blueprint\n *\n * @example\n * ```typescript\n * @ECSComponent('Player')\n * @BlueprintExpose({ displayName: '玩家', category: 'gameplay' })\n * export class PlayerComponent extends Component { }\n * ```\n */\nexport function BlueprintExpose(options: BlueprintExposeOptions = {}): ClassDecorator {\n return function (target: Function) {\n const metadata = getOrCreateMetadata(target);\n Object.assign(metadata, options);\n metadata.componentName = (target as any).__componentName__ ?? target.name;\n return target as any;\n };\n}\n\n/**\n * @zh 标记属性可在蓝图中访问\n * @en Mark property as accessible in blueprint\n *\n * @example\n * ```typescript\n * @BlueprintProperty({ displayName: '生命值', type: 'float' })\n * health: number = 100;\n *\n * @BlueprintProperty({ displayName: '名称', type: 'string', readonly: true })\n * name: string = 'Player';\n * ```\n */\nexport function BlueprintProperty(options: BlueprintPropertyOptions = {}): PropertyDecorator {\n return function (target: Object, propertyKey: string | symbol) {\n const key = String(propertyKey);\n const metadata = getOrCreateMetadata(target.constructor);\n\n const propMeta: PropertyMetadata = {\n propertyKey: key,\n displayName: options.displayName ?? key,\n description: options.description,\n pinType: options.type ?? 'any',\n readonly: options.readonly ?? false,\n defaultValue: options.defaultValue\n };\n\n const existingIndex = metadata.properties.findIndex(p => p.propertyKey === key);\n if (existingIndex >= 0) {\n metadata.properties[existingIndex] = propMeta;\n } else {\n metadata.properties.push(propMeta);\n }\n };\n}\n\n/**\n * @zh 标记方法可在蓝图中调用\n * @en Mark method as callable in blueprint\n *\n * @example\n * ```typescript\n * @BlueprintMethod({\n * displayName: '攻击',\n * params: [\n * { name: 'target', type: 'entity' },\n * { name: 'damage', type: 'float' }\n * ],\n * returnType: 'bool'\n * })\n * attack(target: Entity, damage: number): boolean { }\n *\n * @BlueprintMethod({ displayName: '获取速度', isPure: true, returnType: 'float' })\n * getSpeed(): number { return this.speed; }\n * ```\n */\nexport function BlueprintMethod(options: BlueprintMethodOptions = {}): MethodDecorator {\n return function (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const key = String(propertyKey);\n const metadata = getOrCreateMetadata(target.constructor);\n\n const methodMeta: MethodMetadata = {\n methodKey: key,\n displayName: options.displayName ?? key,\n description: options.description,\n isPure: options.isPure ?? false,\n params: options.params ?? [],\n returnType: options.returnType ?? 'any'\n };\n\n const existingIndex = metadata.methods.findIndex(m => m.methodKey === key);\n if (existingIndex >= 0) {\n metadata.methods[existingIndex] = methodMeta;\n } else {\n metadata.methods.push(methodMeta);\n }\n\n return descriptor;\n };\n}\n\n// ============================================================================\n// Utility Functions | 工具函数\n// ============================================================================\n\n/**\n * @zh 从 TypeScript 类型名推断蓝图引脚类型\n * @en Infer blueprint pin type from TypeScript type name\n */\nexport function inferPinType(typeName: string): BlueprintPinType {\n const typeMap: Record<string, BlueprintPinType> = {\n 'number': 'float',\n 'Number': 'float',\n 'string': 'string',\n 'String': 'string',\n 'boolean': 'bool',\n 'Boolean': 'bool',\n 'Entity': 'entity',\n 'Component': 'component',\n 'Vector2': 'vector2',\n 'Vec2': 'vector2',\n 'Vector3': 'vector3',\n 'Vec3': 'vector3',\n 'Color': 'color',\n 'Array': 'array',\n 'Object': 'object',\n 'void': 'exec',\n 'undefined': 'exec'\n };\n\n return typeMap[typeName] ?? 'any';\n}\n","/**\n * Execution Context - Runtime context for blueprint execution\n * 执行上下文 - 蓝图执行的运行时上下文\n */\n\nimport type { Entity, IScene, Component } from '@esengine/ecs-framework';\nimport { BlueprintNode, BlueprintConnection } from '../types/nodes';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { getRegisteredBlueprintComponents } from '../registry/BlueprintDecorators';\n\n/**\n * Result of node execution\n * 节点执行的结果\n */\nexport interface ExecutionResult {\n /**\n * Next exec pin to follow (null to stop, undefined to continue default)\n * 下一个要执行的引脚(null 停止,undefined 继续默认)\n */\n nextExec?: string | null;\n\n /**\n * Output values by pin name\n * 按引脚名称的输出值\n */\n outputs?: Record<string, unknown>;\n\n /**\n * Whether to yield execution (for async operations)\n * 是否暂停执行(用于异步操作)\n */\n yield?: boolean;\n\n /**\n * Delay before continuing (in seconds)\n * 继续前的延迟(秒)\n */\n delay?: number;\n\n /**\n * Error message if execution failed\n * 执行失败时的错误消息\n */\n error?: string;\n}\n\n/**\n * Execution context provides access to runtime services\n * 执行上下文提供对运行时服务的访问\n */\nexport class ExecutionContext {\n /** Current blueprint asset (当前蓝图资产) */\n readonly blueprint: BlueprintAsset;\n\n /** Owner entity (所有者实体) */\n readonly entity: Entity;\n\n /** Current scene (当前场景) */\n readonly scene: IScene;\n\n /** Frame delta time (帧增量时间) */\n deltaTime: number = 0;\n\n /** Total time since start (开始以来的总时间) */\n time: number = 0;\n\n /** Instance variables (实例变量) */\n private _instanceVariables: Map<string, unknown> = new Map();\n\n /** Local variables (per-execution) (局部变量,每次执行) */\n private _localVariables: Map<string, unknown> = new Map();\n\n /** Global variables (shared) (全局变量,共享) */\n private static _globalVariables: Map<string, unknown> = new Map();\n\n /** Component class registry (组件类注册表) */\n private static _componentRegistry: Map<string, new () => Component> = new Map();\n\n /** Node output cache for current execution (当前执行的节点输出缓存) */\n private _outputCache: Map<string, Record<string, unknown>> = new Map();\n\n /** Connection lookup by target (按目标的连接查找) */\n private _connectionsByTarget: Map<string, BlueprintConnection[]> = new Map();\n\n /** Connection lookup by source (按源的连接查找) */\n private _connectionsBySource: Map<string, BlueprintConnection[]> = new Map();\n\n constructor(blueprint: BlueprintAsset, entity: Entity, scene: IScene) {\n this.blueprint = blueprint;\n this.entity = entity;\n this.scene = scene;\n\n // Initialize instance variables with defaults\n // 使用默认值初始化实例变量\n for (const variable of blueprint.variables) {\n if (variable.scope === 'instance') {\n this._instanceVariables.set(variable.name, variable.defaultValue);\n }\n }\n\n // Build connection lookup maps\n // 构建连接查找映射\n this._buildConnectionMaps();\n }\n\n private _buildConnectionMaps(): void {\n for (const conn of this.blueprint.connections) {\n // By target\n const targetKey = `${conn.toNodeId}.${conn.toPin}`;\n if (!this._connectionsByTarget.has(targetKey)) {\n this._connectionsByTarget.set(targetKey, []);\n }\n this._connectionsByTarget.get(targetKey)!.push(conn);\n\n // By source\n const sourceKey = `${conn.fromNodeId}.${conn.fromPin}`;\n if (!this._connectionsBySource.has(sourceKey)) {\n this._connectionsBySource.set(sourceKey, []);\n }\n this._connectionsBySource.get(sourceKey)!.push(conn);\n }\n }\n\n /**\n * Get a node by ID\n * 通过ID获取节点\n */\n getNode(nodeId: string): BlueprintNode | undefined {\n return this.blueprint.nodes.find(n => n.id === nodeId);\n }\n\n /**\n * Get connections to a target pin\n * 获取到目标引脚的连接\n */\n getConnectionsToPin(nodeId: string, pinName: string): BlueprintConnection[] {\n return this._connectionsByTarget.get(`${nodeId}.${pinName}`) ?? [];\n }\n\n /**\n * Get connections from a source pin\n * 获取从源引脚的连接\n */\n getConnectionsFromPin(nodeId: string, pinName: string): BlueprintConnection[] {\n return this._connectionsBySource.get(`${nodeId}.${pinName}`) ?? [];\n }\n\n /**\n * Evaluate an input pin value (follows connections or uses default)\n * 计算输入引脚值(跟随连接或使用默认值)\n */\n evaluateInput(nodeId: string, pinName: string, defaultValue?: unknown): unknown {\n const connections = this.getConnectionsToPin(nodeId, pinName);\n\n if (connections.length === 0) {\n // Use default from node data or provided default\n // 使用节点数据的默认值或提供的默认值\n const node = this.getNode(nodeId);\n return node?.data[pinName] ?? defaultValue;\n }\n\n // Get value from connected output\n // 从连接的输出获取值\n const conn = connections[0];\n const cachedOutputs = this._outputCache.get(conn.fromNodeId);\n\n if (cachedOutputs && conn.fromPin in cachedOutputs) {\n return cachedOutputs[conn.fromPin];\n }\n\n // Need to execute the source node first (lazy evaluation)\n // 需要先执行源节点(延迟求值)\n return defaultValue;\n }\n\n /**\n * Set output values for a node (cached for current execution)\n * 设置节点的输出值(为当前执行缓存)\n */\n setOutputs(nodeId: string, outputs: Record<string, unknown>): void {\n this._outputCache.set(nodeId, outputs);\n }\n\n /**\n * Get cached outputs for a node\n * 获取节点的缓存输出\n */\n getOutputs(nodeId: string): Record<string, unknown> | undefined {\n return this._outputCache.get(nodeId);\n }\n\n /**\n * Clear output cache (call at start of new execution)\n * 清除输出缓存(在新执行开始时调用)\n */\n clearOutputCache(): void {\n this._outputCache.clear();\n this._localVariables.clear();\n }\n\n /**\n * Get a variable value\n * 获取变量值\n */\n getVariable(name: string): unknown {\n // Check local first, then instance, then global\n // 先检查局部,然后实例,然后全局\n if (this._localVariables.has(name)) {\n return this._localVariables.get(name);\n }\n if (this._instanceVariables.has(name)) {\n return this._instanceVariables.get(name);\n }\n if (ExecutionContext._globalVariables.has(name)) {\n return ExecutionContext._globalVariables.get(name);\n }\n\n // Return default from variable definition\n // 返回变量定义的默认值\n const varDef = this.blueprint.variables.find(v => v.name === name);\n return varDef?.defaultValue;\n }\n\n /**\n * Set a variable value\n * 设置变量值\n */\n setVariable(name: string, value: unknown): void {\n const varDef = this.blueprint.variables.find(v => v.name === name);\n\n if (!varDef) {\n // Treat unknown variables as local\n // 将未知变量视为局部变量\n this._localVariables.set(name, value);\n return;\n }\n\n switch (varDef.scope) {\n case 'local':\n this._localVariables.set(name, value);\n break;\n case 'instance':\n this._instanceVariables.set(name, value);\n break;\n case 'global':\n ExecutionContext._globalVariables.set(name, value);\n break;\n }\n }\n\n /**\n * Get all instance variables (for serialization)\n * 获取所有实例变量(用于序列化)\n */\n getInstanceVariables(): Map<string, unknown> {\n return new Map(this._instanceVariables);\n }\n\n /**\n * Set instance variables (for deserialization)\n * 设置实例变量(用于反序列化)\n */\n setInstanceVariables(variables: Map<string, unknown>): void {\n this._instanceVariables = new Map(variables);\n }\n\n /**\n * Clear global variables (for scene reset)\n * 清除全局变量(用于场景重置)\n */\n static clearGlobalVariables(): void {\n ExecutionContext._globalVariables.clear();\n }\n\n /**\n * Get a component class by name\n * 通过名称获取组件类\n *\n * @zh 首先检查 @BlueprintExpose 装饰的组件,然后检查手动注册的组件\n * @en First checks @BlueprintExpose decorated components, then manually registered ones\n */\n getComponentClass(typeName: string): (new () => Component) | undefined {\n // First check registered blueprint components\n const blueprintComponents = getRegisteredBlueprintComponents();\n for (const [componentClass, metadata] of blueprintComponents) {\n if (metadata.componentName === typeName ||\n componentClass.name === typeName) {\n return componentClass as new () => Component;\n }\n }\n\n // Then check manual registry\n return ExecutionContext._componentRegistry.get(typeName);\n }\n\n /**\n * Register a component class for dynamic creation\n * 注册组件类以支持动态创建\n */\n static registerComponentClass(typeName: string, componentClass: new () => Component): void {\n ExecutionContext._componentRegistry.set(typeName, componentClass);\n }\n\n /**\n * Unregister a component class\n * 取消注册组件类\n */\n static unregisterComponentClass(typeName: string): void {\n ExecutionContext._componentRegistry.delete(typeName);\n }\n\n /**\n * Get all registered component classes\n * 获取所有已注册的组件类\n */\n static getRegisteredComponentClasses(): Map<string, new () => Component> {\n return new Map(ExecutionContext._componentRegistry);\n }\n}\n","/**\n * Node Registry - Manages node templates and executors\n * 节点注册表 - 管理节点模板和执行器\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../types/nodes';\nimport { ExecutionContext, ExecutionResult } from './ExecutionContext';\n\n/**\n * Node executor interface - implements the logic for a node type\n * 节点执行器接口 - 实现节点类型的逻辑\n */\nexport interface INodeExecutor {\n /**\n * Execute the node\n * 执行节点\n *\n * @param node - Node instance (节点实例)\n * @param context - Execution context (执行上下文)\n * @returns Execution result (执行结果)\n */\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult;\n}\n\n/**\n * Node definition combines template with executor\n * 节点定义组合模板和执行器\n */\nexport interface NodeDefinition {\n template: BlueprintNodeTemplate;\n executor: INodeExecutor;\n}\n\n/**\n * Node Registry - singleton that holds all registered node types\n * 节点注册表 - 持有所有注册节点类型的单例\n */\nexport class NodeRegistry {\n private static _instance: NodeRegistry;\n private _nodes: Map<string, NodeDefinition> = new Map();\n\n private constructor() {}\n\n static get instance(): NodeRegistry {\n if (!NodeRegistry._instance) {\n NodeRegistry._instance = new NodeRegistry();\n }\n return NodeRegistry._instance;\n }\n\n /**\n * Register a node type\n * 注册节点类型\n */\n register(template: BlueprintNodeTemplate, executor: INodeExecutor): void {\n if (this._nodes.has(template.type)) {\n console.warn(`Node type \"${template.type}\" is already registered, overwriting`);\n }\n this._nodes.set(template.type, { template, executor });\n }\n\n /**\n * Get a node definition by type\n * 通过类型获取节点定义\n */\n get(type: string): NodeDefinition | undefined {\n return this._nodes.get(type);\n }\n\n /**\n * Get node template by type\n * 通过类型获取节点模板\n */\n getTemplate(type: string): BlueprintNodeTemplate | undefined {\n return this._nodes.get(type)?.template;\n }\n\n /**\n * Get node executor by type\n * 通过类型获取节点执行器\n */\n getExecutor(type: string): INodeExecutor | undefined {\n return this._nodes.get(type)?.executor;\n }\n\n /**\n * Check if a node type is registered\n * 检查节点类型是否已注册\n */\n has(type: string): boolean {\n return this._nodes.has(type);\n }\n\n /**\n * Get all registered templates\n * 获取所有注册的模板\n */\n getAllTemplates(): BlueprintNodeTemplate[] {\n return Array.from(this._nodes.values()).map(d => d.template);\n }\n\n /**\n * Get templates by category\n * 按类别获取模板\n */\n getTemplatesByCategory(category: string): BlueprintNodeTemplate[] {\n return this.getAllTemplates().filter(t => t.category === category);\n }\n\n /**\n * Search templates by keyword\n * 按关键词搜索模板\n */\n searchTemplates(keyword: string): BlueprintNodeTemplate[] {\n const lower = keyword.toLowerCase();\n return this.getAllTemplates().filter(t =>\n t.title.toLowerCase().includes(lower) ||\n t.type.toLowerCase().includes(lower) ||\n t.keywords?.some(k => k.toLowerCase().includes(lower)) ||\n t.description?.toLowerCase().includes(lower)\n );\n }\n\n /**\n * Clear all registrations (for testing)\n * 清除所有注册(用于测试)\n */\n clear(): void {\n this._nodes.clear();\n }\n}\n\n/**\n * Decorator for registering node executors\n * 用于注册节点执行器的装饰器\n *\n * @example\n * ```typescript\n * @RegisterNode(EventTickTemplate)\n * class EventTickExecutor implements INodeExecutor {\n * execute(node, context) { ... }\n * }\n * ```\n */\nexport function RegisterNode(template: BlueprintNodeTemplate) {\n return function<T extends new () => INodeExecutor>(constructor: T) {\n const executor = new constructor();\n NodeRegistry.instance.register(template, executor);\n return constructor;\n };\n}\n","/**\n * Blueprint Virtual Machine - Executes blueprint graphs\n * 蓝图虚拟机 - 执行蓝图图\n */\n\nimport type { Entity, IScene } from '@esengine/ecs-framework';\nimport { BlueprintNode } from '../types/nodes';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { ExecutionContext, ExecutionResult } from './ExecutionContext';\nimport { NodeRegistry } from './NodeRegistry';\n\n/**\n * Pending execution frame (for delayed/async execution)\n * 待处理的执行帧(用于延迟/异步执行)\n */\ninterface PendingExecution {\n nodeId: string;\n execPin: string;\n resumeTime: number;\n}\n\n/**\n * Event trigger types\n * 事件触发类型\n */\nexport type EventType =\n | 'BeginPlay'\n | 'Tick'\n | 'EndPlay'\n | 'Collision'\n | 'TriggerEnter'\n | 'TriggerExit'\n | 'Custom';\n\n/**\n * Blueprint Virtual Machine\n * 蓝图虚拟机\n */\nexport class BlueprintVM {\n /** Execution context (执行上下文) */\n private _context: ExecutionContext;\n\n /** Pending executions (delayed nodes) (待处理的执行) */\n private _pendingExecutions: PendingExecution[] = [];\n\n /** Event node cache by type (按类型缓存的事件节点) */\n private _eventNodes: Map<string, BlueprintNode[]> = new Map();\n\n /** Whether the VM is running (VM 是否运行中) */\n private _isRunning: boolean = false;\n\n /** Current execution time (当前执行时间) */\n private _currentTime: number = 0;\n\n /** Maximum execution steps per frame (每帧最大执行步骤) */\n private _maxStepsPerFrame: number = 1000;\n\n /** Debug mode (调试模式) */\n debug: boolean = false;\n\n constructor(blueprint: BlueprintAsset, entity: Entity, scene: IScene) {\n this._context = new ExecutionContext(blueprint, entity, scene);\n this._cacheEventNodes();\n }\n\n get context(): ExecutionContext {\n return this._context;\n }\n\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n /**\n * Cache event nodes by type for quick lookup\n * 按类型缓存事件节点以便快速查找\n */\n private _cacheEventNodes(): void {\n for (const node of this._context.blueprint.nodes) {\n // Event nodes start with \"Event\"\n // 事件节点以 \"Event\" 开头\n if (node.type.startsWith('Event')) {\n const eventType = node.type;\n if (!this._eventNodes.has(eventType)) {\n this._eventNodes.set(eventType, []);\n }\n this._eventNodes.get(eventType)!.push(node);\n }\n }\n }\n\n /**\n * Start the VM\n * 启动 VM\n */\n start(): void {\n this._isRunning = true;\n this._currentTime = 0;\n\n // Trigger BeginPlay event\n // 触发 BeginPlay 事件\n this.triggerEvent('EventBeginPlay');\n }\n\n /**\n * Stop the VM\n * 停止 VM\n */\n stop(): void {\n // Trigger EndPlay event\n // 触发 EndPlay 事件\n this.triggerEvent('EventEndPlay');\n\n this._isRunning = false;\n this._pendingExecutions = [];\n }\n\n /**\n * Pause the VM\n * 暂停 VM\n */\n pause(): void {\n this._isRunning = false;\n }\n\n /**\n * Resume the VM\n * 恢复 VM\n */\n resume(): void {\n this._isRunning = true;\n }\n\n /**\n * Update the VM (called every frame)\n * 更新 VM(每帧调用)\n */\n tick(deltaTime: number): void {\n if (!this._isRunning) return;\n\n this._currentTime += deltaTime;\n this._context.deltaTime = deltaTime;\n this._context.time = this._currentTime;\n\n // Process pending delayed executions\n // 处理待处理的延迟执行\n this._processPendingExecutions();\n\n // Trigger Tick event\n // 触发 Tick 事件\n this.triggerEvent('EventTick');\n }\n\n /**\n * Trigger an event by type\n * 按类型触发事件\n */\n triggerEvent(eventType: string, data?: Record<string, unknown>): void {\n const eventNodes = this._eventNodes.get(eventType);\n if (!eventNodes) return;\n\n for (const node of eventNodes) {\n this._executeFromNode(node, 'exec', data);\n }\n }\n\n /**\n * Trigger a custom event by name\n * 按名称触发自定义事件\n */\n triggerCustomEvent(eventName: string, data?: Record<string, unknown>): void {\n const eventNodes = this._eventNodes.get('EventCustom');\n if (!eventNodes) return;\n\n for (const node of eventNodes) {\n if (node.data.eventName === eventName) {\n this._executeFromNode(node, 'exec', data);\n }\n }\n }\n\n /**\n * Execute from a starting node\n * 从起始节点执行\n */\n private _executeFromNode(\n startNode: BlueprintNode,\n startPin: string,\n eventData?: Record<string, unknown>\n ): void {\n // Clear output cache for new execution\n // 为新执行清除输出缓存\n this._context.clearOutputCache();\n\n // Set event data as node outputs\n // 设置事件数据为节点输出\n if (eventData) {\n this._context.setOutputs(startNode.id, eventData);\n }\n\n // Follow execution chain\n // 跟随执行链\n let currentNodeId: string | null = startNode.id;\n let currentPin: string = startPin;\n let steps = 0;\n\n while (currentNodeId && steps < this._maxStepsPerFrame) {\n steps++;\n\n // Get connected nodes from current exec pin\n // 从当前执行引脚获取连接的节点\n const connections = this._context.getConnectionsFromPin(currentNodeId, currentPin);\n\n if (connections.length === 0) {\n // No more connections, end execution\n // 没有更多连接,结束执行\n break;\n }\n\n // Execute connected node\n // 执行连接的节点\n const nextConn = connections[0];\n const result = this._executeNode(nextConn.toNodeId);\n\n if (result.error) {\n console.error(`Blueprint error in node ${nextConn.toNodeId}: ${result.error}`);\n break;\n }\n\n if (result.delay && result.delay > 0) {\n // Schedule delayed execution\n // 安排延迟执行\n this._pendingExecutions.push({\n nodeId: nextConn.toNodeId,\n execPin: result.nextExec ?? 'exec',\n resumeTime: this._currentTime + result.delay\n });\n break;\n }\n\n if (result.yield) {\n // Yield execution until next frame\n // 暂停执行直到下一帧\n break;\n }\n\n if (result.nextExec === null) {\n // Explicitly stop execution\n // 显式停止执行\n break;\n }\n\n // Continue to next node\n // 继续到下一个节点\n currentNodeId = nextConn.toNodeId;\n currentPin = result.nextExec ?? 'exec';\n }\n\n if (steps >= this._maxStepsPerFrame) {\n console.warn('Blueprint execution exceeded maximum steps, possible infinite loop');\n }\n }\n\n /**\n * Execute a single node\n * 执行单个节点\n */\n private _executeNode(nodeId: string): ExecutionResult {\n const node = this._context.getNode(nodeId);\n if (!node) {\n return { error: `Node not found: ${nodeId}` };\n }\n\n const executor = NodeRegistry.instance.getExecutor(node.type);\n if (!executor) {\n return { error: `No executor for node type: ${node.type}` };\n }\n\n try {\n if (this.debug) {\n console.log(`[Blueprint] Executing: ${node.type} (${nodeId})`);\n }\n\n const result = executor.execute(node, this._context);\n\n // Cache outputs\n // 缓存输出\n if (result.outputs) {\n this._context.setOutputs(nodeId, result.outputs);\n }\n\n return result;\n } catch (error) {\n return { error: `Execution error: ${error}` };\n }\n }\n\n /**\n * Process pending delayed executions\n * 处理待处理的延迟执行\n */\n private _processPendingExecutions(): void {\n const stillPending: PendingExecution[] = [];\n\n for (const pending of this._pendingExecutions) {\n if (this._currentTime >= pending.resumeTime) {\n // Resume execution\n // 恢复执行\n const node = this._context.getNode(pending.nodeId);\n if (node) {\n this._executeFromNode(node, pending.execPin);\n }\n } else {\n stillPending.push(pending);\n }\n }\n\n this._pendingExecutions = stillPending;\n }\n\n /**\n * Get instance variables for serialization\n * 获取实例变量用于序列化\n */\n getInstanceVariables(): Map<string, unknown> {\n return this._context.getInstanceVariables();\n }\n\n /**\n * Set instance variables from serialization\n * 从序列化设置实例变量\n */\n setInstanceVariables(variables: Map<string, unknown>): void {\n this._context.setInstanceVariables(variables);\n }\n}\n","/**\n * @zh 蓝图组件 - 将蓝图附加到实体\n * @en Blueprint Component - Attaches a blueprint to an entity\n */\n\nimport { Component, ECSComponent, type Entity, type IScene } from '@esengine/ecs-framework';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { BlueprintVM } from './BlueprintVM';\n\n/**\n * @zh 蓝图组件,用于将可视化脚本附加到 ECS 实体\n * @en Blueprint component for attaching visual scripts to ECS entities\n *\n * @example\n * ```typescript\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * blueprint.autoStart = true;\n * entity.addComponent(blueprint);\n * ```\n */\n@ECSComponent('Blueprint')\nexport class BlueprintComponent extends Component {\n /**\n * @zh 蓝图资产引用\n * @en Blueprint asset reference\n */\n blueprintAsset: BlueprintAsset | null = null;\n\n /**\n * @zh 用于序列化的蓝图资产路径\n * @en Blueprint asset path for serialization\n */\n blueprintPath: string = '';\n\n /**\n * @zh 实体创建时自动开始执行\n * @en Auto-start execution when entity is created\n */\n autoStart: boolean = true;\n\n /**\n * @zh 启用 VM 调试模式\n * @en Enable debug mode for VM\n */\n debug: boolean = false;\n\n /**\n * @zh 运行时 VM 实例\n * @en Runtime VM instance\n */\n vm: BlueprintVM | null = null;\n\n /**\n * @zh 蓝图是否已启动\n * @en Whether the blueprint has started\n */\n isStarted: boolean = false;\n\n /**\n * @zh 初始化蓝图 VM\n * @en Initialize blueprint VM\n */\n initialize(entity: Entity, scene: IScene): void {\n if (!this.blueprintAsset) return;\n\n this.vm = new BlueprintVM(this.blueprintAsset, entity, scene);\n this.vm.debug = this.debug;\n }\n\n /**\n * @zh 开始执行蓝图\n * @en Start blueprint execution\n */\n start(): void {\n if (this.vm && !this.isStarted) {\n this.vm.start();\n this.isStarted = true;\n }\n }\n\n /**\n * @zh 停止执行蓝图\n * @en Stop blueprint execution\n */\n stop(): void {\n if (this.vm && this.isStarted) {\n this.vm.stop();\n this.isStarted = false;\n }\n }\n\n /**\n * @zh 更新蓝图\n * @en Update blueprint\n */\n tick(deltaTime: number): void {\n if (this.vm && this.isStarted) {\n this.vm.tick(deltaTime);\n }\n }\n\n /**\n * @zh 清理蓝图资源\n * @en Cleanup blueprint resources\n */\n cleanup(): void {\n if (this.vm) {\n if (this.isStarted) {\n this.vm.stop();\n }\n this.vm = null;\n this.isStarted = false;\n }\n }\n}\n","/**\n * @zh 蓝图系统 - 处理所有带有 BlueprintComponent 的实体\n * @en Blueprint System - Processes all entities with BlueprintComponent\n */\n\nimport { EntitySystem, Matcher, ECSSystem, type Entity, Time } from '@esengine/ecs-framework';\nimport { BlueprintComponent } from './BlueprintComponent';\nimport { registerAllComponentNodes } from '../registry';\n\n/**\n * @zh 蓝图执行系统\n * @en Blueprint execution system\n *\n * @zh 自动处理所有带有 BlueprintComponent 的实体,管理蓝图的初始化、执行和清理\n * @en Automatically processes all entities with BlueprintComponent, manages blueprint initialization, execution and cleanup\n *\n * @example\n * ```typescript\n * import { BlueprintSystem } from '@esengine/blueprint';\n *\n * // 添加到场景\n * scene.addSystem(new BlueprintSystem());\n *\n * // 为实体添加蓝图\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * entity.addComponent(blueprint);\n * ```\n */\n@ECSSystem('BlueprintSystem')\nexport class BlueprintSystem extends EntitySystem {\n private _componentsRegistered = false;\n\n constructor() {\n super(Matcher.all(BlueprintComponent));\n }\n\n /**\n * @zh 系统初始化时注册所有组件节点\n * @en Register all component nodes when system initializes\n */\n protected override onInitialize(): void {\n if (!this._componentsRegistered) {\n registerAllComponentNodes();\n this._componentsRegistered = true;\n }\n }\n\n /**\n * @zh 处理所有带有蓝图组件的实体\n * @en Process all entities with blueprint components\n */\n protected override process(entities: readonly Entity[]): void {\n const dt = Time.deltaTime;\n\n for (const entity of entities) {\n const blueprint = entity.getComponent(BlueprintComponent);\n if (!blueprint?.blueprintAsset) continue;\n\n // 初始化 VM\n if (!blueprint.vm) {\n blueprint.initialize(entity, this.scene!);\n }\n\n // 自动启动\n if (blueprint.autoStart && !blueprint.isStarted) {\n blueprint.start();\n }\n\n // 每帧更新\n blueprint.tick(dt);\n }\n }\n\n /**\n * @zh 实体移除时清理蓝图资源\n * @en Cleanup blueprint resources when entity is removed\n */\n protected override onRemoved(entity: Entity): void {\n const blueprint = entity.getComponent(BlueprintComponent);\n if (blueprint) {\n blueprint.cleanup();\n }\n }\n}\n","/**\n * @zh 组件节点生成器 - 自动为标记的组件生成蓝图节点\n * @en Component Node Generator - Auto-generate blueprint nodes for marked components\n *\n * @zh 根据 @BlueprintExpose、@BlueprintProperty、@BlueprintMethod 装饰器\n * 自动生成对应的 Get/Set/Call 节点并注册到 NodeRegistry\n *\n * @en Based on @BlueprintExpose, @BlueprintProperty, @BlueprintMethod decorators,\n * auto-generate corresponding Get/Set/Call nodes and register to NodeRegistry\n */\n\nimport type { Component, Entity } from '@esengine/ecs-framework';\nimport type { BlueprintNodeTemplate, BlueprintNode } from '../types/nodes';\nimport type { BlueprintPinType } from '../types/pins';\nimport type { ExecutionContext, ExecutionResult } from '../runtime/ExecutionContext';\nimport type { INodeExecutor } from '../runtime/NodeRegistry';\nimport { NodeRegistry } from '../runtime/NodeRegistry';\nimport {\n getRegisteredBlueprintComponents,\n type ComponentBlueprintMetadata,\n type PropertyMetadata,\n type MethodMetadata\n} from './BlueprintDecorators';\n\n// ============================================================================\n// Node Generator | 节点生成器\n// ============================================================================\n\n/**\n * @zh 为组件生成所有蓝图节点\n * @en Generate all blueprint nodes for a component\n */\nexport function generateComponentNodes(\n componentClass: Function,\n metadata: ComponentBlueprintMetadata\n): void {\n const { componentName, properties, methods } = metadata;\n const category = metadata.category ?? 'component';\n const color = metadata.color ?? '#1e8b8b';\n\n // Generate Add/Get component nodes\n generateAddComponentNode(componentClass, componentName, metadata, color);\n generateGetComponentNode(componentClass, componentName, metadata, color);\n\n for (const prop of properties) {\n generatePropertyGetNode(componentName, prop, category, color);\n if (!prop.readonly) {\n generatePropertySetNode(componentName, prop, category, color);\n }\n }\n\n for (const method of methods) {\n generateMethodCallNode(componentName, method, category, color);\n }\n}\n\n/**\n * @zh 生成 Add Component 节点\n * @en Generate Add Component node\n */\nfunction generateAddComponentNode(\n componentClass: Function,\n componentName: string,\n metadata: ComponentBlueprintMetadata,\n color: string\n): void {\n const nodeType = `Add_${componentName}`;\n const displayName = metadata.displayName ?? componentName;\n\n // Build input pins for initial property values\n const propertyInputs: BlueprintNodeTemplate['inputs'] = [];\n const propertyDefaults: Record<string, unknown> = {};\n\n for (const prop of metadata.properties) {\n if (!prop.readonly) {\n propertyInputs.push({\n name: prop.propertyKey,\n type: prop.pinType,\n displayName: prop.displayName,\n defaultValue: prop.defaultValue\n });\n propertyDefaults[prop.propertyKey] = prop.defaultValue;\n }\n }\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Add ${displayName}`,\n category: 'component',\n color,\n description: `Adds ${displayName} component to entity (为实体添加 ${displayName} 组件)`,\n keywords: ['add', 'component', 'create', componentName.toLowerCase()],\n menuPath: ['Components', displayName, `Add ${displayName}`],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n ...propertyInputs\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: displayName },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n };\n\n const propertyKeys = metadata.properties\n .filter(p => !p.readonly)\n .map(p => p.propertyKey);\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n // Check if component already exists\n const existing = entity.components.find(c =>\n c.constructor === componentClass ||\n c.constructor.name === componentName ||\n (c.constructor as any).__componentName__ === componentName\n );\n\n if (existing) {\n // Component already exists, return it\n return { outputs: { component: existing, success: false }, nextExec: 'exec' };\n }\n\n try {\n // Create new component instance\n const component = new (componentClass as new () => Component)();\n\n // Set initial property values from inputs\n for (const key of propertyKeys) {\n const value = context.evaluateInput(node.id, key, propertyDefaults[key]);\n if (value !== undefined) {\n (component as any)[key] = value;\n }\n }\n\n // Add to entity\n entity.addComponent(component);\n\n return { outputs: { component, success: true }, nextExec: 'exec' };\n } catch (error) {\n console.error(`[Blueprint] Failed to add ${componentName}:`, error);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成 Get Component 节点\n * @en Generate Get Component node\n */\nfunction generateGetComponentNode(\n componentClass: Function,\n componentName: string,\n metadata: ComponentBlueprintMetadata,\n color: string\n): void {\n const nodeType = `Get_${componentName}`;\n const displayName = metadata.displayName ?? componentName;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Get ${displayName}`,\n category: 'component',\n color,\n isPure: true,\n description: `Gets ${displayName} component from entity (从实体获取 ${displayName} 组件)`,\n keywords: ['get', 'component', componentName.toLowerCase()],\n menuPath: ['Components', displayName, `Get ${displayName}`],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'component', type: 'component', displayName: displayName },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n };\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { component: null, found: false } };\n }\n\n const component = entity.components.find(c =>\n c.constructor === componentClass ||\n c.constructor.name === componentName ||\n (c.constructor as any).__componentName__ === componentName\n );\n\n return {\n outputs: {\n component: component ?? null,\n found: component != null\n }\n };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成属性 Get 节点\n * @en Generate property Get node\n */\nfunction generatePropertyGetNode(\n componentName: string,\n prop: PropertyMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Get_${componentName}_${prop.propertyKey}`;\n const { displayName, pinType } = prop;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Get ${displayName}`,\n subtitle: componentName,\n category: category as any,\n color,\n isPure: true,\n description: prop.description ?? `Gets ${displayName} from ${componentName} (从 ${componentName} 获取 ${displayName})`,\n keywords: ['get', 'property', componentName.toLowerCase(), prop.propertyKey.toLowerCase()],\n menuPath: ['Components', componentName, `Get ${displayName}`],\n inputs: [\n { name: 'component', type: 'component', displayName: componentName }\n ],\n outputs: [\n { name: 'value', type: pinType, displayName }\n ]\n };\n\n const propertyKey = prop.propertyKey;\n const defaultValue = prop.defaultValue;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return { outputs: { value: defaultValue ?? null } };\n }\n\n const value = (component as any)[propertyKey];\n return { outputs: { value } };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成属性 Set 节点\n * @en Generate property Set node\n */\nfunction generatePropertySetNode(\n componentName: string,\n prop: PropertyMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Set_${componentName}_${prop.propertyKey}`;\n const { displayName, pinType, defaultValue } = prop;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Set ${displayName}`,\n subtitle: componentName,\n category: category as any,\n color,\n description: prop.description ?? `Sets ${displayName} on ${componentName} (设置 ${componentName} 的 ${displayName})`,\n keywords: ['set', 'property', componentName.toLowerCase(), prop.propertyKey.toLowerCase()],\n menuPath: ['Components', componentName, `Set ${displayName}`],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: componentName },\n { name: 'value', type: pinType, displayName, defaultValue }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n };\n\n const propertyKey = prop.propertyKey;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const value = context.evaluateInput(node.id, 'value', defaultValue);\n\n if (component) {\n (component as any)[propertyKey] = value;\n }\n\n return { nextExec: 'exec' };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成方法调用节点\n * @en Generate method call node\n */\nfunction generateMethodCallNode(\n componentName: string,\n method: MethodMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Call_${componentName}_${method.methodKey}`;\n const { displayName, isPure, params, returnType } = method;\n\n const inputs: BlueprintNodeTemplate['inputs'] = [];\n\n if (!isPure) {\n inputs.push({ name: 'exec', type: 'exec', displayName: '' });\n }\n\n inputs.push({ name: 'component', type: 'component', displayName: componentName });\n\n const paramNames: string[] = [];\n for (const param of params) {\n inputs.push({\n name: param.name,\n type: param.type ?? 'any',\n displayName: param.displayName ?? param.name,\n defaultValue: param.defaultValue\n });\n paramNames.push(param.name);\n }\n\n const outputs: BlueprintNodeTemplate['outputs'] = [];\n\n if (!isPure) {\n outputs.push({ name: 'exec', type: 'exec', displayName: '' });\n }\n\n if (returnType !== 'exec' && returnType !== 'any') {\n outputs.push({\n name: 'result',\n type: returnType as BlueprintPinType,\n displayName: 'Result'\n });\n }\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: displayName,\n subtitle: componentName,\n category: category as any,\n color,\n isPure,\n description: method.description ?? `Calls ${displayName} on ${componentName} (调用 ${componentName} 的 ${displayName})`,\n keywords: ['call', 'method', componentName.toLowerCase(), method.methodKey.toLowerCase()],\n menuPath: ['Components', componentName, displayName],\n inputs,\n outputs\n };\n\n const methodKey = method.methodKey;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return isPure ? { outputs: { result: null } } : { nextExec: 'exec' };\n }\n\n const args: unknown[] = paramNames.map(name =>\n context.evaluateInput(node.id, name, undefined)\n );\n\n const fn = (component as any)[methodKey];\n if (typeof fn !== 'function') {\n console.warn(`Method ${methodKey} not found on component ${componentName}`);\n return isPure ? { outputs: { result: null } } : { nextExec: 'exec' };\n }\n\n const result = fn.apply(component, args);\n\n return isPure\n ? { outputs: { result } }\n : { outputs: { result }, nextExec: 'exec' };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n// ============================================================================\n// Registration | 注册\n// ============================================================================\n\n/**\n * @zh 注册所有已标记的组件节点\n * @en Register all marked component nodes\n *\n * @zh 应该在蓝图系统初始化时调用,会扫描所有使用 @BlueprintExpose 装饰的组件\n * 并自动生成对应的蓝图节点\n *\n * @en Should be called during blueprint system initialization, scans all components\n * decorated with @BlueprintExpose and auto-generates corresponding blueprint nodes\n */\nexport function registerAllComponentNodes(): void {\n const components = getRegisteredBlueprintComponents();\n\n for (const [componentClass, metadata] of components) {\n try {\n generateComponentNodes(componentClass, metadata);\n console.log(`[Blueprint] Registered component: ${metadata.componentName} (${metadata.properties.length} properties, ${metadata.methods.length} methods)`);\n } catch (error) {\n console.error(`[Blueprint] Failed to register component ${metadata.componentName}:`, error);\n }\n }\n\n console.log(`[Blueprint] Registered ${components.size} component(s)`);\n}\n\n/**\n * @zh 手动注册单个组件\n * @en Manually register a single component\n */\nexport function registerComponentNodes(componentClass: Function): void {\n const components = getRegisteredBlueprintComponents();\n const metadata = components.get(componentClass);\n\n if (!metadata) {\n console.warn(`[Blueprint] Component ${componentClass.name} is not marked with @BlueprintExpose`);\n return;\n }\n\n generateComponentNodes(componentClass, metadata);\n}\n","/**\n * @zh 蓝图触发器类型定义\n * @en Blueprint Trigger Type Definitions\n *\n * @zh 定义触发器的核心类型和接口\n * @en Defines core types and interfaces for triggers\n */\n\n// =============================================================================\n// 触发器类型 | Trigger Types\n// =============================================================================\n\n/**\n * @zh 触发器类型枚举\n * @en Trigger type enumeration\n */\nexport type TriggerType =\n | 'tick' // 每帧触发 | Every frame\n | 'input' // 输入事件 | Input event\n | 'collision' // 碰撞事件 | Collision event\n | 'message' // 消息事件 | Message event\n | 'timer' // 定时器事件 | Timer event\n | 'stateEnter' // 状态进入 | State enter\n | 'stateExit' // 状态退出 | State exit\n | 'custom'; // 自定义事件 | Custom event\n\n/**\n * @zh 触发器类型常量\n * @en Trigger type constants\n */\nexport const TriggerTypes = {\n TICK: 'tick' as const,\n INPUT: 'input' as const,\n COLLISION: 'collision' as const,\n MESSAGE: 'message' as const,\n TIMER: 'timer' as const,\n STATE_ENTER: 'stateEnter' as const,\n STATE_EXIT: 'stateExit' as const,\n CUSTOM: 'custom' as const\n} as const;\n\n// =============================================================================\n// 触发器上下文 | Trigger Context\n// =============================================================================\n\n/**\n * @zh 触发器上下文基础接口\n * @en Trigger context base interface\n */\nexport interface ITriggerContext {\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n readonly type: TriggerType;\n\n /**\n * @zh 触发时间戳\n * @en Trigger timestamp\n */\n readonly timestamp: number;\n\n /**\n * @zh 触发源实体 ID\n * @en Source entity ID\n */\n readonly sourceEntityId?: string;\n\n /**\n * @zh 附加数据\n * @en Additional data\n */\n readonly data?: Record<string, unknown>;\n}\n\n/**\n * @zh Tick 触发器上下文\n * @en Tick trigger context\n */\nexport interface ITickTriggerContext extends ITriggerContext {\n readonly type: 'tick';\n /**\n * @zh 增量时间(秒)\n * @en Delta time (seconds)\n */\n readonly deltaTime: number;\n /**\n * @zh 帧计数\n * @en Frame count\n */\n readonly frameCount: number;\n}\n\n/**\n * @zh 输入触发器上下文\n * @en Input trigger context\n */\nexport interface IInputTriggerContext extends ITriggerContext {\n readonly type: 'input';\n /**\n * @zh 输入动作名称\n * @en Input action name\n */\n readonly action: string;\n /**\n * @zh 输入值\n * @en Input value\n */\n readonly value: number | boolean;\n /**\n * @zh 是否刚按下\n * @en Is just pressed\n */\n readonly pressed?: boolean;\n /**\n * @zh 是否刚释放\n * @en Is just released\n */\n readonly released?: boolean;\n}\n\n/**\n * @zh 碰撞触发器上下文\n * @en Collision trigger context\n */\nexport interface ICollisionTriggerContext extends ITriggerContext {\n readonly type: 'collision';\n /**\n * @zh 碰撞的另一个实体 ID\n * @en Other entity ID in collision\n */\n readonly otherEntityId: string;\n /**\n * @zh 碰撞点\n * @en Collision point\n */\n readonly point?: { x: number; y: number };\n /**\n * @zh 碰撞法线\n * @en Collision normal\n */\n readonly normal?: { x: number; y: number };\n /**\n * @zh 是否开始碰撞\n * @en Is collision start\n */\n readonly isEnter: boolean;\n /**\n * @zh 是否结束碰撞\n * @en Is collision end\n */\n readonly isExit: boolean;\n}\n\n/**\n * @zh 消息触发器上下文\n * @en Message trigger context\n */\nexport interface IMessageTriggerContext extends ITriggerContext {\n readonly type: 'message';\n /**\n * @zh 消息名称\n * @en Message name\n */\n readonly messageName: string;\n /**\n * @zh 发送者 ID\n * @en Sender ID\n */\n readonly senderId?: string;\n /**\n * @zh 消息负载\n * @en Message payload\n */\n readonly payload?: unknown;\n}\n\n/**\n * @zh 定时器触发器上下文\n * @en Timer trigger context\n */\nexport interface ITimerTriggerContext extends ITriggerContext {\n readonly type: 'timer';\n /**\n * @zh 定时器 ID\n * @en Timer ID\n */\n readonly timerId: string;\n /**\n * @zh 是否循环触发\n * @en Is repeating\n */\n readonly isRepeating: boolean;\n /**\n * @zh 已触发次数\n * @en Times fired\n */\n readonly timesFired: number;\n}\n\n/**\n * @zh 状态触发器上下文\n * @en State trigger context\n */\nexport interface IStateTriggerContext extends ITriggerContext {\n readonly type: 'stateEnter' | 'stateExit';\n /**\n * @zh 状态机 ID\n * @en State machine ID\n */\n readonly stateMachineId: string;\n /**\n * @zh 当前状态\n * @en Current state\n */\n readonly currentState: string;\n /**\n * @zh 之前状态\n * @en Previous state\n */\n readonly previousState?: string;\n}\n\n/**\n * @zh 自定义触发器上下文\n * @en Custom trigger context\n */\nexport interface ICustomTriggerContext extends ITriggerContext {\n readonly type: 'custom';\n /**\n * @zh 事件名称\n * @en Event name\n */\n readonly eventName: string;\n}\n\n/**\n * @zh 所有触发器上下文的联合类型\n * @en Union type of all trigger contexts\n */\nexport type TriggerContext =\n | ITickTriggerContext\n | IInputTriggerContext\n | ICollisionTriggerContext\n | IMessageTriggerContext\n | ITimerTriggerContext\n | IStateTriggerContext\n | ICustomTriggerContext;\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建 Tick 触发器上下文\n * @en Create tick trigger context\n */\nexport function createTickContext(\n deltaTime: number,\n frameCount: number,\n sourceEntityId?: string\n): ITickTriggerContext {\n return {\n type: 'tick',\n timestamp: Date.now(),\n deltaTime,\n frameCount,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建输入触发器上下文\n * @en Create input trigger context\n */\nexport function createInputContext(\n action: string,\n value: number | boolean,\n options?: {\n pressed?: boolean;\n released?: boolean;\n sourceEntityId?: string;\n }\n): IInputTriggerContext {\n return {\n type: 'input',\n timestamp: Date.now(),\n action,\n value,\n pressed: options?.pressed,\n released: options?.released,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建碰撞触发器上下文\n * @en Create collision trigger context\n */\nexport function createCollisionContext(\n otherEntityId: string,\n isEnter: boolean,\n options?: {\n point?: { x: number; y: number };\n normal?: { x: number; y: number };\n sourceEntityId?: string;\n }\n): ICollisionTriggerContext {\n return {\n type: 'collision',\n timestamp: Date.now(),\n otherEntityId,\n isEnter,\n isExit: !isEnter,\n point: options?.point,\n normal: options?.normal,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建消息触发器上下文\n * @en Create message trigger context\n */\nexport function createMessageContext(\n messageName: string,\n payload?: unknown,\n options?: {\n senderId?: string;\n sourceEntityId?: string;\n }\n): IMessageTriggerContext {\n return {\n type: 'message',\n timestamp: Date.now(),\n messageName,\n payload,\n senderId: options?.senderId,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建定时器触发器上下文\n * @en Create timer trigger context\n */\nexport function createTimerContext(\n timerId: string,\n isRepeating: boolean,\n timesFired: number,\n sourceEntityId?: string\n): ITimerTriggerContext {\n return {\n type: 'timer',\n timestamp: Date.now(),\n timerId,\n isRepeating,\n timesFired,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建状态触发器上下文\n * @en Create state trigger context\n */\nexport function createStateContext(\n type: 'stateEnter' | 'stateExit',\n stateMachineId: string,\n currentState: string,\n previousState?: string,\n sourceEntityId?: string\n): IStateTriggerContext {\n return {\n type,\n timestamp: Date.now(),\n stateMachineId,\n currentState,\n previousState,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建自定义触发器上下文\n * @en Create custom trigger context\n */\nexport function createCustomContext(\n eventName: string,\n data?: Record<string, unknown>,\n sourceEntityId?: string\n): ICustomTriggerContext {\n return {\n type: 'custom',\n timestamp: Date.now(),\n eventName,\n data,\n sourceEntityId\n };\n}\n","/**\n * @zh 触发器条件系统\n * @en Trigger Condition System\n *\n * @zh 提供触发器触发前的条件检查能力\n * @en Provides condition checking before trigger fires\n */\n\nimport type {\n ITriggerContext,\n TriggerType,\n IInputTriggerContext,\n IMessageTriggerContext,\n IStateTriggerContext,\n ITimerTriggerContext,\n ICollisionTriggerContext,\n ICustomTriggerContext\n} from './TriggerTypes';\n\n// =============================================================================\n// 条件接口 | Condition Interface\n// =============================================================================\n\n/**\n * @zh 触发器条件接口\n * @en Trigger condition interface\n */\nexport interface ITriggerCondition {\n /**\n * @zh 条件类型标识\n * @en Condition type identifier\n */\n readonly type: string;\n\n /**\n * @zh 评估条件是否满足\n * @en Evaluate if condition is met\n *\n * @param context - @zh 触发器上下文 @en Trigger context\n * @returns @zh 条件是否满足 @en Whether condition is met\n */\n evaluate(context: ITriggerContext): boolean;\n}\n\n/**\n * @zh 条件组合逻辑\n * @en Condition combination logic\n */\nexport type ConditionLogic = 'and' | 'or';\n\n// =============================================================================\n// 复合条件 | Composite Conditions\n// =============================================================================\n\n/**\n * @zh 复合条件 - 组合多个条件\n * @en Composite condition - combines multiple conditions\n */\nexport class CompositeCondition implements ITriggerCondition {\n readonly type = 'composite';\n\n constructor(\n private readonly _conditions: ITriggerCondition[],\n private readonly _logic: ConditionLogic = 'and'\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (this._conditions.length === 0) {\n return true;\n }\n\n if (this._logic === 'and') {\n return this._conditions.every(c => c.evaluate(context));\n } else {\n return this._conditions.some(c => c.evaluate(context));\n }\n }\n}\n\n/**\n * @zh 非条件 - 取反\n * @en Not condition - negates\n */\nexport class NotCondition implements ITriggerCondition {\n readonly type = 'not';\n\n constructor(private readonly _condition: ITriggerCondition) {}\n\n evaluate(context: ITriggerContext): boolean {\n return !this._condition.evaluate(context);\n }\n}\n\n// =============================================================================\n// 通用条件 | Generic Conditions\n// =============================================================================\n\n/**\n * @zh 始终为真的条件\n * @en Always true condition\n */\nexport class AlwaysTrueCondition implements ITriggerCondition {\n readonly type = 'alwaysTrue';\n\n evaluate(_context: ITriggerContext): boolean {\n return true;\n }\n}\n\n/**\n * @zh 始终为假的条件\n * @en Always false condition\n */\nexport class AlwaysFalseCondition implements ITriggerCondition {\n readonly type = 'alwaysFalse';\n\n evaluate(_context: ITriggerContext): boolean {\n return false;\n }\n}\n\n/**\n * @zh 触发器类型条件\n * @en Trigger type condition\n */\nexport class TriggerTypeCondition implements ITriggerCondition {\n readonly type = 'triggerType';\n\n constructor(private readonly _allowedTypes: TriggerType[]) {}\n\n evaluate(context: ITriggerContext): boolean {\n return this._allowedTypes.includes(context.type);\n }\n}\n\n/**\n * @zh 实体 ID 条件\n * @en Entity ID condition\n */\nexport class EntityIdCondition implements ITriggerCondition {\n readonly type = 'entityId';\n\n constructor(\n private readonly _entityId: string,\n private readonly _checkSource: boolean = true\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (this._checkSource) {\n return context.sourceEntityId === this._entityId;\n }\n return false;\n }\n}\n\n/**\n * @zh 自定义函数条件\n * @en Custom function condition\n */\nexport class FunctionCondition implements ITriggerCondition {\n readonly type = 'function';\n\n constructor(\n private readonly _predicate: (context: ITriggerContext) => boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n return this._predicate(context);\n }\n}\n\n// =============================================================================\n// 特定类型条件 | Type-Specific Conditions\n// =============================================================================\n\n/**\n * @zh 输入动作条件\n * @en Input action condition\n */\nexport class InputActionCondition implements ITriggerCondition {\n readonly type = 'inputAction';\n\n constructor(\n private readonly _action: string,\n private readonly _checkPressed?: boolean,\n private readonly _checkReleased?: boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'input') {\n return false;\n }\n\n const inputContext = context as unknown as IInputTriggerContext;\n\n if (inputContext.action !== this._action) {\n return false;\n }\n\n if (this._checkPressed !== undefined && inputContext.pressed !== this._checkPressed) {\n return false;\n }\n\n if (this._checkReleased !== undefined && inputContext.released !== this._checkReleased) {\n return false;\n }\n\n return true;\n }\n}\n\n/**\n * @zh 消息名称条件\n * @en Message name condition\n */\nexport class MessageNameCondition implements ITriggerCondition {\n readonly type = 'messageName';\n\n constructor(private readonly _messageName: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'message') {\n return false;\n }\n\n const messageContext = context as unknown as IMessageTriggerContext;\n return messageContext.messageName === this._messageName;\n }\n}\n\n/**\n * @zh 状态名称条件\n * @en State name condition\n */\nexport class StateNameCondition implements ITriggerCondition {\n readonly type = 'stateName';\n\n constructor(\n private readonly _stateName: string,\n private readonly _checkCurrent: boolean = true\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'stateEnter' && context.type !== 'stateExit') {\n return false;\n }\n\n const stateContext = context as unknown as IStateTriggerContext;\n\n if (this._checkCurrent) {\n return stateContext.currentState === this._stateName;\n } else {\n return stateContext.previousState === this._stateName;\n }\n }\n}\n\n/**\n * @zh 定时器 ID 条件\n * @en Timer ID condition\n */\nexport class TimerIdCondition implements ITriggerCondition {\n readonly type = 'timerId';\n\n constructor(private readonly _timerId: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'timer') {\n return false;\n }\n\n const timerContext = context as unknown as ITimerTriggerContext;\n return timerContext.timerId === this._timerId;\n }\n}\n\n/**\n * @zh 碰撞实体条件\n * @en Collision entity condition\n */\nexport class CollisionEntityCondition implements ITriggerCondition {\n readonly type = 'collisionEntity';\n\n constructor(\n private readonly _otherEntityId?: string,\n private readonly _checkEnter?: boolean,\n private readonly _checkExit?: boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'collision') {\n return false;\n }\n\n const collisionContext = context as unknown as ICollisionTriggerContext;\n\n if (this._otherEntityId !== undefined && collisionContext.otherEntityId !== this._otherEntityId) {\n return false;\n }\n\n if (this._checkEnter !== undefined && collisionContext.isEnter !== this._checkEnter) {\n return false;\n }\n\n if (this._checkExit !== undefined && collisionContext.isExit !== this._checkExit) {\n return false;\n }\n\n return true;\n }\n}\n\n/**\n * @zh 自定义事件名称条件\n * @en Custom event name condition\n */\nexport class CustomEventCondition implements ITriggerCondition {\n readonly type = 'customEvent';\n\n constructor(private readonly _eventName: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'custom') {\n return false;\n }\n\n const customContext = context as unknown as ICustomTriggerContext;\n return customContext.eventName === this._eventName;\n }\n}\n\n// =============================================================================\n// 条件构建器 | Condition Builder\n// =============================================================================\n\n/**\n * @zh 条件构建器 - 链式 API\n * @en Condition builder - fluent API\n */\nexport class ConditionBuilder {\n private _conditions: ITriggerCondition[] = [];\n private _logic: ConditionLogic = 'and';\n\n /**\n * @zh 设置组合逻辑为 AND\n * @en Set combination logic to AND\n */\n and(): this {\n this._logic = 'and';\n return this;\n }\n\n /**\n * @zh 设置组合逻辑为 OR\n * @en Set combination logic to OR\n */\n or(): this {\n this._logic = 'or';\n return this;\n }\n\n /**\n * @zh 添加触发器类型条件\n * @en Add trigger type condition\n */\n ofType(...types: TriggerType[]): this {\n this._conditions.push(new TriggerTypeCondition(types));\n return this;\n }\n\n /**\n * @zh 添加实体 ID 条件\n * @en Add entity ID condition\n */\n fromEntity(entityId: string): this {\n this._conditions.push(new EntityIdCondition(entityId));\n return this;\n }\n\n /**\n * @zh 添加输入动作条件\n * @en Add input action condition\n */\n onInput(action: string, options?: { pressed?: boolean; released?: boolean }): this {\n this._conditions.push(new InputActionCondition(action, options?.pressed, options?.released));\n return this;\n }\n\n /**\n * @zh 添加消息条件\n * @en Add message condition\n */\n onMessage(messageName: string): this {\n this._conditions.push(new MessageNameCondition(messageName));\n return this;\n }\n\n /**\n * @zh 添加状态条件\n * @en Add state condition\n */\n onState(stateName: string, checkCurrent: boolean = true): this {\n this._conditions.push(new StateNameCondition(stateName, checkCurrent));\n return this;\n }\n\n /**\n * @zh 添加定时器条件\n * @en Add timer condition\n */\n onTimer(timerId: string): this {\n this._conditions.push(new TimerIdCondition(timerId));\n return this;\n }\n\n /**\n * @zh 添加碰撞条件\n * @en Add collision condition\n */\n onCollision(options?: { entityId?: string; isEnter?: boolean; isExit?: boolean }): this {\n this._conditions.push(new CollisionEntityCondition(\n options?.entityId,\n options?.isEnter,\n options?.isExit\n ));\n return this;\n }\n\n /**\n * @zh 添加自定义事件条件\n * @en Add custom event condition\n */\n onCustomEvent(eventName: string): this {\n this._conditions.push(new CustomEventCondition(eventName));\n return this;\n }\n\n /**\n * @zh 添加自定义函数条件\n * @en Add custom function condition\n */\n where(predicate: (context: ITriggerContext) => boolean): this {\n this._conditions.push(new FunctionCondition(predicate));\n return this;\n }\n\n /**\n * @zh 添加取反条件\n * @en Add negated condition\n */\n not(condition: ITriggerCondition): this {\n this._conditions.push(new NotCondition(condition));\n return this;\n }\n\n /**\n * @zh 构建条件\n * @en Build condition\n */\n build(): ITriggerCondition {\n if (this._conditions.length === 0) {\n return new AlwaysTrueCondition();\n }\n\n if (this._conditions.length === 1) {\n return this._conditions[0];\n }\n\n return new CompositeCondition(this._conditions, this._logic);\n }\n}\n\n/**\n * @zh 创建条件构建器\n * @en Create condition builder\n */\nexport function condition(): ConditionBuilder {\n return new ConditionBuilder();\n}\n","/**\n * @zh 蓝图触发器\n * @en Blueprint Trigger\n *\n * @zh 定义触发器的核心实现\n * @en Defines core trigger implementation\n */\n\nimport type { TriggerType, ITriggerContext } from './TriggerTypes';\nimport type { ITriggerCondition } from './TriggerCondition';\nimport { AlwaysTrueCondition } from './TriggerCondition';\n\n// =============================================================================\n// 触发器接口 | Trigger Interface\n// =============================================================================\n\n/**\n * @zh 触发器回调函数类型\n * @en Trigger callback function type\n */\nexport type TriggerCallback = (context: ITriggerContext) => void;\n\n/**\n * @zh 蓝图触发器接口\n * @en Blueprint trigger interface\n */\nexport interface IBlueprintTrigger {\n /**\n * @zh 触发器唯一标识\n * @en Trigger unique identifier\n */\n readonly id: string;\n\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n readonly type: TriggerType;\n\n /**\n * @zh 触发器条件\n * @en Trigger conditions\n */\n readonly condition: ITriggerCondition;\n\n /**\n * @zh 是否启用\n * @en Is enabled\n */\n enabled: boolean;\n\n /**\n * @zh 优先级(越高越先执行)\n * @en Priority (higher executes first)\n */\n readonly priority: number;\n\n /**\n * @zh 检查是否应该触发\n * @en Check if should fire\n */\n shouldFire(context: ITriggerContext): boolean;\n\n /**\n * @zh 执行触发器\n * @en Execute trigger\n */\n fire(context: ITriggerContext): void;\n}\n\n/**\n * @zh 触发器配置\n * @en Trigger configuration\n */\nexport interface TriggerConfig {\n /**\n * @zh 触发器 ID\n * @en Trigger ID\n */\n id?: string;\n\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n type: TriggerType;\n\n /**\n * @zh 触发条件\n * @en Trigger condition\n */\n condition?: ITriggerCondition;\n\n /**\n * @zh 是否启用\n * @en Is enabled\n */\n enabled?: boolean;\n\n /**\n * @zh 优先级\n * @en Priority\n */\n priority?: number;\n\n /**\n * @zh 回调函数\n * @en Callback function\n */\n callback?: TriggerCallback;\n}\n\n// =============================================================================\n// 触发器实现 | Trigger Implementation\n// =============================================================================\n\nlet _triggerId = 0;\n\n/**\n * @zh 生成唯一触发器 ID\n * @en Generate unique trigger ID\n */\nfunction generateTriggerId(): string {\n return `trigger_${++_triggerId}`;\n}\n\n/**\n * @zh 蓝图触发器实现\n * @en Blueprint trigger implementation\n */\nexport class BlueprintTrigger implements IBlueprintTrigger {\n readonly id: string;\n readonly type: TriggerType;\n readonly condition: ITriggerCondition;\n readonly priority: number;\n enabled: boolean;\n\n private readonly _callback?: TriggerCallback;\n private readonly _callbacks: Set<TriggerCallback> = new Set();\n\n constructor(config: TriggerConfig) {\n this.id = config.id ?? generateTriggerId();\n this.type = config.type;\n this.condition = config.condition ?? new AlwaysTrueCondition();\n this.priority = config.priority ?? 0;\n this.enabled = config.enabled ?? true;\n this._callback = config.callback;\n }\n\n /**\n * @zh 检查是否应该触发\n * @en Check if should fire\n */\n shouldFire(context: ITriggerContext): boolean {\n if (!this.enabled) {\n return false;\n }\n\n if (context.type !== this.type && this.type !== 'custom') {\n return false;\n }\n\n return this.condition.evaluate(context);\n }\n\n /**\n * @zh 执行触发器\n * @en Execute trigger\n */\n fire(context: ITriggerContext): void {\n if (this._callback) {\n this._callback(context);\n }\n\n for (const callback of this._callbacks) {\n callback(context);\n }\n }\n\n /**\n * @zh 添加回调\n * @en Add callback\n */\n addCallback(callback: TriggerCallback): void {\n this._callbacks.add(callback);\n }\n\n /**\n * @zh 移除回调\n * @en Remove callback\n */\n removeCallback(callback: TriggerCallback): void {\n this._callbacks.delete(callback);\n }\n\n /**\n * @zh 清除所有回调\n * @en Clear all callbacks\n */\n clearCallbacks(): void {\n this._callbacks.clear();\n }\n}\n\n// =============================================================================\n// 触发器注册表 | Trigger Registry\n// =============================================================================\n\n/**\n * @zh 触发器注册表接口\n * @en Trigger registry interface\n */\nexport interface ITriggerRegistry {\n /**\n * @zh 注册触发器\n * @en Register trigger\n */\n register(trigger: IBlueprintTrigger): void;\n\n /**\n * @zh 注销触发器\n * @en Unregister trigger\n */\n unregister(triggerId: string): boolean;\n\n /**\n * @zh 获取触发器\n * @en Get trigger\n */\n get(triggerId: string): IBlueprintTrigger | undefined;\n\n /**\n * @zh 获取所有触发器\n * @en Get all triggers\n */\n getAll(): IBlueprintTrigger[];\n\n /**\n * @zh 按类型获取触发器\n * @en Get triggers by type\n */\n getByType(type: TriggerType): IBlueprintTrigger[];\n\n /**\n * @zh 清除所有触发器\n * @en Clear all triggers\n */\n clear(): void;\n}\n\n/**\n * @zh 触发器注册表实现\n * @en Trigger registry implementation\n */\nexport class TriggerRegistry implements ITriggerRegistry {\n private readonly _triggers: Map<string, IBlueprintTrigger> = new Map();\n private readonly _triggersByType: Map<TriggerType, Set<string>> = new Map();\n\n /**\n * @zh 注册触发器\n * @en Register trigger\n */\n register(trigger: IBlueprintTrigger): void {\n if (this._triggers.has(trigger.id)) {\n console.warn(`Trigger ${trigger.id} already registered, overwriting`);\n }\n\n this._triggers.set(trigger.id, trigger);\n\n if (!this._triggersByType.has(trigger.type)) {\n this._triggersByType.set(trigger.type, new Set());\n }\n this._triggersByType.get(trigger.type)!.add(trigger.id);\n }\n\n /**\n * @zh 注销触发器\n * @en Unregister trigger\n */\n unregister(triggerId: string): boolean {\n const trigger = this._triggers.get(triggerId);\n if (!trigger) {\n return false;\n }\n\n this._triggers.delete(triggerId);\n\n const typeSet = this._triggersByType.get(trigger.type);\n if (typeSet) {\n typeSet.delete(triggerId);\n }\n\n return true;\n }\n\n /**\n * @zh 获取触发器\n * @en Get trigger\n */\n get(triggerId: string): IBlueprintTrigger | undefined {\n return this._triggers.get(triggerId);\n }\n\n /**\n * @zh 获取所有触发器\n * @en Get all triggers\n */\n getAll(): IBlueprintTrigger[] {\n return Array.from(this._triggers.values());\n }\n\n /**\n * @zh 按类型获取触发器\n * @en Get triggers by type\n */\n getByType(type: TriggerType): IBlueprintTrigger[] {\n const typeSet = this._triggersByType.get(type);\n if (!typeSet) {\n return [];\n }\n\n const triggers: IBlueprintTrigger[] = [];\n for (const id of typeSet) {\n const trigger = this._triggers.get(id);\n if (trigger) {\n triggers.push(trigger);\n }\n }\n\n return triggers.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * @zh 清除所有触发器\n * @en Clear all triggers\n */\n clear(): void {\n this._triggers.clear();\n this._triggersByType.clear();\n }\n\n /**\n * @zh 获取触发器数量\n * @en Get trigger count\n */\n get count(): number {\n return this._triggers.size;\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建触发器\n * @en Create trigger\n */\nexport function createTrigger(config: TriggerConfig): BlueprintTrigger {\n return new BlueprintTrigger(config);\n}\n\n/**\n * @zh 创建 Tick 触发器\n * @en Create tick trigger\n */\nexport function createTickTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'tick',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建输入触发器\n * @en Create input trigger\n */\nexport function createInputTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'input',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建碰撞触发器\n * @en Create collision trigger\n */\nexport function createCollisionTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'collision',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建消息触发器\n * @en Create message trigger\n */\nexport function createMessageTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'message',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建定时器触发器\n * @en Create timer trigger\n */\nexport function createTimerTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'timer',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建状态进入触发器\n * @en Create state enter trigger\n */\nexport function createStateEnterTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'stateEnter',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建状态退出触发器\n * @en Create state exit trigger\n */\nexport function createStateExitTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'stateExit',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建自定义触发器\n * @en Create custom trigger\n */\nexport function createCustomTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'custom',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n","/**\n * @zh 触发器调度器\n * @en Trigger Dispatcher\n *\n * @zh 负责分发触发器事件到订阅者\n * @en Responsible for dispatching trigger events to subscribers\n */\n\nimport type { TriggerType, ITriggerContext } from './TriggerTypes';\nimport type { IBlueprintTrigger, ITriggerRegistry, TriggerCallback } from './BlueprintTrigger';\nimport { TriggerRegistry } from './BlueprintTrigger';\n\n// =============================================================================\n// 调度器接口 | Dispatcher Interface\n// =============================================================================\n\n/**\n * @zh 触发结果\n * @en Trigger result\n */\nexport interface TriggerResult {\n /**\n * @zh 触发器 ID\n * @en Trigger ID\n */\n triggerId: string;\n\n /**\n * @zh 是否成功\n * @en Is successful\n */\n success: boolean;\n\n /**\n * @zh 错误信息\n * @en Error message\n */\n error?: string;\n}\n\n/**\n * @zh 调度结果\n * @en Dispatch result\n */\nexport interface DispatchResult {\n /**\n * @zh 上下文\n * @en Context\n */\n context: ITriggerContext;\n\n /**\n * @zh 触发的触发器数量\n * @en Number of triggers fired\n */\n triggeredCount: number;\n\n /**\n * @zh 各触发器结果\n * @en Results of each trigger\n */\n results: TriggerResult[];\n}\n\n/**\n * @zh 触发器调度器接口\n * @en Trigger dispatcher interface\n */\nexport interface ITriggerDispatcher {\n /**\n * @zh 调度触发器\n * @en Dispatch trigger\n */\n dispatch(context: ITriggerContext): DispatchResult;\n\n /**\n * @zh 异步调度触发器\n * @en Async dispatch trigger\n */\n dispatchAsync(context: ITriggerContext): Promise<DispatchResult>;\n\n /**\n * @zh 订阅触发器类型\n * @en Subscribe to trigger type\n */\n subscribe(type: TriggerType, callback: TriggerCallback): () => void;\n\n /**\n * @zh 取消订阅\n * @en Unsubscribe\n */\n unsubscribe(type: TriggerType, callback: TriggerCallback): void;\n\n /**\n * @zh 获取注册表\n * @en Get registry\n */\n readonly registry: ITriggerRegistry;\n}\n\n// =============================================================================\n// 调度器实现 | Dispatcher Implementation\n// =============================================================================\n\n/**\n * @zh 触发器调度器实现\n * @en Trigger dispatcher implementation\n */\nexport class TriggerDispatcher implements ITriggerDispatcher {\n private readonly _registry: ITriggerRegistry;\n private readonly _typeSubscribers: Map<TriggerType, Set<TriggerCallback>> = new Map();\n private readonly _globalSubscribers: Set<TriggerCallback> = new Set();\n private _isDispatching: boolean = false;\n private _pendingContexts: ITriggerContext[] = [];\n\n constructor(registry?: ITriggerRegistry) {\n this._registry = registry ?? new TriggerRegistry();\n }\n\n get registry(): ITriggerRegistry {\n return this._registry;\n }\n\n /**\n * @zh 调度触发器\n * @en Dispatch trigger\n */\n dispatch(context: ITriggerContext): DispatchResult {\n if (this._isDispatching) {\n this._pendingContexts.push(context);\n return {\n context,\n triggeredCount: 0,\n results: []\n };\n }\n\n this._isDispatching = true;\n\n try {\n const result = this._doDispatch(context);\n\n while (this._pendingContexts.length > 0) {\n const pendingContext = this._pendingContexts.shift()!;\n this._doDispatch(pendingContext);\n }\n\n return result;\n } finally {\n this._isDispatching = false;\n }\n }\n\n /**\n * @zh 执行调度\n * @en Do dispatch\n */\n private _doDispatch(context: ITriggerContext): DispatchResult {\n const results: TriggerResult[] = [];\n let triggeredCount = 0;\n\n const triggers = this._registry.getByType(context.type);\n\n for (const trigger of triggers) {\n if (trigger.shouldFire(context)) {\n try {\n trigger.fire(context);\n triggeredCount++;\n results.push({\n triggerId: trigger.id,\n success: true\n });\n } catch (error) {\n results.push({\n triggerId: trigger.id,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n }\n\n this._notifySubscribers(context);\n\n return {\n context,\n triggeredCount,\n results\n };\n }\n\n /**\n * @zh 通知订阅者\n * @en Notify subscribers\n */\n private _notifySubscribers(context: ITriggerContext): void {\n const typeSubscribers = this._typeSubscribers.get(context.type);\n if (typeSubscribers) {\n for (const callback of typeSubscribers) {\n try {\n callback(context);\n } catch (error) {\n console.error(`Trigger subscriber error: ${error}`);\n }\n }\n }\n\n for (const callback of this._globalSubscribers) {\n try {\n callback(context);\n } catch (error) {\n console.error(`Global trigger subscriber error: ${error}`);\n }\n }\n }\n\n /**\n * @zh 异步调度触发器\n * @en Async dispatch trigger\n */\n async dispatchAsync(context: ITriggerContext): Promise<DispatchResult> {\n return new Promise((resolve) => {\n queueMicrotask(() => {\n resolve(this.dispatch(context));\n });\n });\n }\n\n /**\n * @zh 订阅触发器类型\n * @en Subscribe to trigger type\n */\n subscribe(type: TriggerType, callback: TriggerCallback): () => void {\n if (!this._typeSubscribers.has(type)) {\n this._typeSubscribers.set(type, new Set());\n }\n\n this._typeSubscribers.get(type)!.add(callback);\n\n return () => this.unsubscribe(type, callback);\n }\n\n /**\n * @zh 取消订阅\n * @en Unsubscribe\n */\n unsubscribe(type: TriggerType, callback: TriggerCallback): void {\n const subscribers = this._typeSubscribers.get(type);\n if (subscribers) {\n subscribers.delete(callback);\n }\n }\n\n /**\n * @zh 订阅所有触发器\n * @en Subscribe to all triggers\n */\n subscribeAll(callback: TriggerCallback): () => void {\n this._globalSubscribers.add(callback);\n return () => this.unsubscribeAll(callback);\n }\n\n /**\n * @zh 取消订阅所有\n * @en Unsubscribe from all\n */\n unsubscribeAll(callback: TriggerCallback): void {\n this._globalSubscribers.delete(callback);\n }\n\n /**\n * @zh 清除所有订阅\n * @en Clear all subscriptions\n */\n clearSubscriptions(): void {\n this._typeSubscribers.clear();\n this._globalSubscribers.clear();\n }\n}\n\n// =============================================================================\n// 实体触发器管理器 | Entity Trigger Manager\n// =============================================================================\n\n/**\n * @zh 实体触发器管理器接口\n * @en Entity trigger manager interface\n */\nexport interface IEntityTriggerManager {\n /**\n * @zh 为实体注册触发器\n * @en Register trigger for entity\n */\n registerForEntity(entityId: string, trigger: IBlueprintTrigger): void;\n\n /**\n * @zh 注销实体的触发器\n * @en Unregister trigger from entity\n */\n unregisterFromEntity(entityId: string, triggerId: string): boolean;\n\n /**\n * @zh 获取实体的所有触发器\n * @en Get all triggers for entity\n */\n getEntityTriggers(entityId: string): IBlueprintTrigger[];\n\n /**\n * @zh 清除实体的所有触发器\n * @en Clear all triggers for entity\n */\n clearEntityTriggers(entityId: string): void;\n\n /**\n * @zh 调度器\n * @en Dispatcher\n */\n readonly dispatcher: ITriggerDispatcher;\n}\n\n/**\n * @zh 实体触发器管理器实现\n * @en Entity trigger manager implementation\n */\nexport class EntityTriggerManager implements IEntityTriggerManager {\n private readonly _dispatcher: ITriggerDispatcher;\n private readonly _entityTriggers: Map<string, Set<string>> = new Map();\n\n constructor(dispatcher?: ITriggerDispatcher) {\n this._dispatcher = dispatcher ?? new TriggerDispatcher();\n }\n\n get dispatcher(): ITriggerDispatcher {\n return this._dispatcher;\n }\n\n /**\n * @zh 为实体注册触发器\n * @en Register trigger for entity\n */\n registerForEntity(entityId: string, trigger: IBlueprintTrigger): void {\n this._dispatcher.registry.register(trigger);\n\n if (!this._entityTriggers.has(entityId)) {\n this._entityTriggers.set(entityId, new Set());\n }\n\n this._entityTriggers.get(entityId)!.add(trigger.id);\n }\n\n /**\n * @zh 注销实体的触发器\n * @en Unregister trigger from entity\n */\n unregisterFromEntity(entityId: string, triggerId: string): boolean {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return false;\n }\n\n if (!entitySet.has(triggerId)) {\n return false;\n }\n\n entitySet.delete(triggerId);\n return this._dispatcher.registry.unregister(triggerId);\n }\n\n /**\n * @zh 获取实体的所有触发器\n * @en Get all triggers for entity\n */\n getEntityTriggers(entityId: string): IBlueprintTrigger[] {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return [];\n }\n\n const triggers: IBlueprintTrigger[] = [];\n for (const triggerId of entitySet) {\n const trigger = this._dispatcher.registry.get(triggerId);\n if (trigger) {\n triggers.push(trigger);\n }\n }\n\n return triggers;\n }\n\n /**\n * @zh 清除实体的所有触发器\n * @en Clear all triggers for entity\n */\n clearEntityTriggers(entityId: string): void {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return;\n }\n\n for (const triggerId of entitySet) {\n this._dispatcher.registry.unregister(triggerId);\n }\n\n this._entityTriggers.delete(entityId);\n }\n\n /**\n * @zh 调度触发器到实体\n * @en Dispatch trigger to entity\n */\n dispatchToEntity(entityId: string, context: ITriggerContext): DispatchResult {\n const entityTriggers = this.getEntityTriggers(entityId);\n const results: TriggerResult[] = [];\n let triggeredCount = 0;\n\n for (const trigger of entityTriggers) {\n if (trigger.shouldFire(context)) {\n try {\n trigger.fire(context);\n triggeredCount++;\n results.push({\n triggerId: trigger.id,\n success: true\n });\n } catch (error) {\n results.push({\n triggerId: trigger.id,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n }\n\n return {\n context,\n triggeredCount,\n results\n };\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建触发器调度器\n * @en Create trigger dispatcher\n */\nexport function createTriggerDispatcher(registry?: ITriggerRegistry): TriggerDispatcher {\n return new TriggerDispatcher(registry);\n}\n\n/**\n * @zh 创建实体触发器管理器\n * @en Create entity trigger manager\n */\nexport function createEntityTriggerManager(dispatcher?: ITriggerDispatcher): EntityTriggerManager {\n return new EntityTriggerManager(dispatcher);\n}\n","/**\n * @zh 蓝图片段接口和实现\n * @en Blueprint Fragment Interface and Implementation\n *\n * @zh 定义可重用的蓝图片段,用于组合系统\n * @en Defines reusable blueprint fragments for the composition system\n */\n\nimport type { BlueprintAsset } from '../types/blueprint';\nimport type { BlueprintPinType } from '../types/pins';\n\n// =============================================================================\n// 暴露引脚定义 | Exposed Pin Definition\n// =============================================================================\n\n/**\n * @zh 暴露引脚定义\n * @en Exposed pin definition\n *\n * @zh 片段对外暴露的引脚,可与其他片段连接\n * @en Pins exposed by the fragment that can be connected to other fragments\n */\nexport interface ExposedPin {\n /**\n * @zh 引脚名称\n * @en Pin name\n */\n readonly name: string;\n\n /**\n * @zh 显示名称\n * @en Display name\n */\n readonly displayName: string;\n\n /**\n * @zh 引脚类型\n * @en Pin type\n */\n readonly type: BlueprintPinType;\n\n /**\n * @zh 引脚方向\n * @en Pin direction\n */\n readonly direction: 'input' | 'output';\n\n /**\n * @zh 描述\n * @en Description\n */\n readonly description?: string;\n\n /**\n * @zh 默认值(仅输入引脚)\n * @en Default value (input pins only)\n */\n readonly defaultValue?: unknown;\n\n /**\n * @zh 关联的内部节点 ID\n * @en Associated internal node ID\n */\n readonly internalNodeId: string;\n\n /**\n * @zh 关联的内部引脚名称\n * @en Associated internal pin name\n */\n readonly internalPinName: string;\n}\n\n// =============================================================================\n// 蓝图片段接口 | Blueprint Fragment Interface\n// =============================================================================\n\n/**\n * @zh 蓝图片段接口\n * @en Blueprint fragment interface\n *\n * @zh 代表一个可重用的蓝图逻辑单元,如技能、卡牌效果等\n * @en Represents a reusable unit of blueprint logic, such as skills, card effects, etc.\n */\nexport interface IBlueprintFragment {\n /**\n * @zh 片段唯一标识\n * @en Fragment unique identifier\n */\n readonly id: string;\n\n /**\n * @zh 片段名称\n * @en Fragment name\n */\n readonly name: string;\n\n /**\n * @zh 片段描述\n * @en Fragment description\n */\n readonly description?: string;\n\n /**\n * @zh 片段分类\n * @en Fragment category\n */\n readonly category?: string;\n\n /**\n * @zh 片段标签\n * @en Fragment tags\n */\n readonly tags?: string[];\n\n /**\n * @zh 暴露的输入引脚\n * @en Exposed input pins\n */\n readonly inputs: ExposedPin[];\n\n /**\n * @zh 暴露的输出引脚\n * @en Exposed output pins\n */\n readonly outputs: ExposedPin[];\n\n /**\n * @zh 内部蓝图图\n * @en Internal blueprint graph\n */\n readonly graph: BlueprintAsset;\n\n /**\n * @zh 片段版本\n * @en Fragment version\n */\n readonly version?: string;\n\n /**\n * @zh 图标名称\n * @en Icon name\n */\n readonly icon?: string;\n\n /**\n * @zh 颜色(用于可视化)\n * @en Color (for visualization)\n */\n readonly color?: string;\n}\n\n// =============================================================================\n// 蓝图片段实现 | Blueprint Fragment Implementation\n// =============================================================================\n\n/**\n * @zh 蓝图片段配置\n * @en Blueprint fragment configuration\n */\nexport interface BlueprintFragmentConfig {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n inputs?: ExposedPin[];\n outputs?: ExposedPin[];\n graph: BlueprintAsset;\n version?: string;\n icon?: string;\n color?: string;\n}\n\n/**\n * @zh 蓝图片段实现\n * @en Blueprint fragment implementation\n */\nexport class BlueprintFragment implements IBlueprintFragment {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly category?: string;\n readonly tags?: string[];\n readonly inputs: ExposedPin[];\n readonly outputs: ExposedPin[];\n readonly graph: BlueprintAsset;\n readonly version?: string;\n readonly icon?: string;\n readonly color?: string;\n\n constructor(config: BlueprintFragmentConfig) {\n this.id = config.id;\n this.name = config.name;\n this.description = config.description;\n this.category = config.category;\n this.tags = config.tags;\n this.inputs = config.inputs ?? [];\n this.outputs = config.outputs ?? [];\n this.graph = config.graph;\n this.version = config.version;\n this.icon = config.icon;\n this.color = config.color;\n }\n\n /**\n * @zh 获取所有暴露引脚\n * @en Get all exposed pins\n */\n getAllExposedPins(): ExposedPin[] {\n return [...this.inputs, ...this.outputs];\n }\n\n /**\n * @zh 通过名称查找输入引脚\n * @en Find input pin by name\n */\n findInput(name: string): ExposedPin | undefined {\n return this.inputs.find(p => p.name === name);\n }\n\n /**\n * @zh 通过名称查找输出引脚\n * @en Find output pin by name\n */\n findOutput(name: string): ExposedPin | undefined {\n return this.outputs.find(p => p.name === name);\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建暴露引脚\n * @en Create exposed pin\n */\nexport function createExposedPin(\n name: string,\n type: BlueprintPinType,\n direction: 'input' | 'output',\n internalNodeId: string,\n internalPinName: string,\n options?: {\n displayName?: string;\n description?: string;\n defaultValue?: unknown;\n }\n): ExposedPin {\n return {\n name,\n displayName: options?.displayName ?? name,\n type,\n direction,\n description: options?.description,\n defaultValue: options?.defaultValue,\n internalNodeId,\n internalPinName\n };\n}\n\n/**\n * @zh 创建蓝图片段\n * @en Create blueprint fragment\n */\nexport function createFragment(config: BlueprintFragmentConfig): IBlueprintFragment {\n return new BlueprintFragment(config);\n}\n\n// =============================================================================\n// 片段资产格式 | Fragment Asset Format\n// =============================================================================\n\n/**\n * @zh 蓝图片段资产格式\n * @en Blueprint fragment asset format\n *\n * @zh 用于序列化和反序列化片段\n * @en Used for serializing and deserializing fragments\n */\nexport interface BlueprintFragmentAsset {\n /**\n * @zh 格式版本\n * @en Format version\n */\n version: number;\n\n /**\n * @zh 资产类型标识\n * @en Asset type identifier\n */\n type: 'blueprint-fragment';\n\n /**\n * @zh 片段数据\n * @en Fragment data\n */\n fragment: {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n inputs: ExposedPin[];\n outputs: ExposedPin[];\n version?: string;\n icon?: string;\n color?: string;\n };\n\n /**\n * @zh 内部蓝图图\n * @en Internal blueprint graph\n */\n graph: BlueprintAsset;\n}\n\n/**\n * @zh 从资产创建片段\n * @en Create fragment from asset\n */\nexport function fragmentFromAsset(asset: BlueprintFragmentAsset): IBlueprintFragment {\n return new BlueprintFragment({\n ...asset.fragment,\n graph: asset.graph\n });\n}\n\n/**\n * @zh 将片段转为资产\n * @en Convert fragment to asset\n */\nexport function fragmentToAsset(fragment: IBlueprintFragment): BlueprintFragmentAsset {\n return {\n version: 1,\n type: 'blueprint-fragment',\n fragment: {\n id: fragment.id,\n name: fragment.name,\n description: fragment.description,\n category: fragment.category,\n tags: fragment.tags,\n inputs: fragment.inputs,\n outputs: fragment.outputs,\n version: fragment.version,\n icon: fragment.icon,\n color: fragment.color\n },\n graph: fragment.graph\n };\n}\n","/**\n * @zh 蓝图组合器接口和实现\n * @en Blueprint Composer Interface and Implementation\n *\n * @zh 将多个蓝图片段组合成一个完整的蓝图\n * @en Composes multiple blueprint fragments into a complete blueprint\n */\n\nimport type { BlueprintAsset, BlueprintVariable } from '../types/blueprint';\nimport type { BlueprintNode, BlueprintConnection } from '../types/nodes';\nimport type { IBlueprintFragment } from './BlueprintFragment';\n\n// =============================================================================\n// 槽位定义 | Slot Definition\n// =============================================================================\n\n/**\n * @zh 片段槽位\n * @en Fragment slot\n *\n * @zh 组合器中放置片段的位置\n * @en A position in the composer where a fragment is placed\n */\nexport interface FragmentSlot {\n /**\n * @zh 槽位 ID\n * @en Slot ID\n */\n readonly id: string;\n\n /**\n * @zh 槽位名称\n * @en Slot name\n */\n readonly name: string;\n\n /**\n * @zh 放置的片段\n * @en Placed fragment\n */\n readonly fragment: IBlueprintFragment;\n\n /**\n * @zh 在组合图中的位置偏移\n * @en Position offset in the composed graph\n */\n readonly position: { x: number; y: number };\n}\n\n/**\n * @zh 槽位间连接\n * @en Connection between slots\n */\nexport interface SlotConnection {\n /**\n * @zh 连接 ID\n * @en Connection ID\n */\n readonly id: string;\n\n /**\n * @zh 源槽位 ID\n * @en Source slot ID\n */\n readonly fromSlotId: string;\n\n /**\n * @zh 源引脚名称\n * @en Source pin name\n */\n readonly fromPin: string;\n\n /**\n * @zh 目标槽位 ID\n * @en Target slot ID\n */\n readonly toSlotId: string;\n\n /**\n * @zh 目标引脚名称\n * @en Target pin name\n */\n readonly toPin: string;\n}\n\n// =============================================================================\n// 组合器接口 | Composer Interface\n// =============================================================================\n\n/**\n * @zh 蓝图组合器接口\n * @en Blueprint composer interface\n *\n * @zh 用于将多个蓝图片段组合成一个完整蓝图\n * @en Used to compose multiple blueprint fragments into a complete blueprint\n */\nexport interface IBlueprintComposer {\n /**\n * @zh 组合器名称\n * @en Composer name\n */\n readonly name: string;\n\n /**\n * @zh 获取所有槽位\n * @en Get all slots\n */\n getSlots(): FragmentSlot[];\n\n /**\n * @zh 获取所有连接\n * @en Get all connections\n */\n getConnections(): SlotConnection[];\n\n /**\n * @zh 添加片段到槽位\n * @en Add fragment to slot\n *\n * @param fragment - @zh 蓝图片段 @en Blueprint fragment\n * @param slotId - @zh 槽位 ID @en Slot ID\n * @param options - @zh 选项 @en Options\n */\n addFragment(\n fragment: IBlueprintFragment,\n slotId: string,\n options?: {\n name?: string;\n position?: { x: number; y: number };\n }\n ): void;\n\n /**\n * @zh 移除槽位\n * @en Remove slot\n *\n * @param slotId - @zh 槽位 ID @en Slot ID\n */\n removeSlot(slotId: string): void;\n\n /**\n * @zh 连接两个槽位的引脚\n * @en Connect pins between two slots\n *\n * @param fromSlotId - @zh 源槽位 ID @en Source slot ID\n * @param fromPin - @zh 源引脚名称 @en Source pin name\n * @param toSlotId - @zh 目标槽位 ID @en Target slot ID\n * @param toPin - @zh 目标引脚名称 @en Target pin name\n */\n connect(\n fromSlotId: string,\n fromPin: string,\n toSlotId: string,\n toPin: string\n ): void;\n\n /**\n * @zh 断开连接\n * @en Disconnect\n *\n * @param connectionId - @zh 连接 ID @en Connection ID\n */\n disconnect(connectionId: string): void;\n\n /**\n * @zh 验证组合是否有效\n * @en Validate if the composition is valid\n */\n validate(): CompositionValidationResult;\n\n /**\n * @zh 编译成蓝图资产\n * @en Compile into blueprint asset\n */\n compile(): BlueprintAsset;\n\n /**\n * @zh 清空组合器\n * @en Clear the composer\n */\n clear(): void;\n}\n\n// =============================================================================\n// 验证结果 | Validation Result\n// =============================================================================\n\n/**\n * @zh 组合验证结果\n * @en Composition validation result\n */\nexport interface CompositionValidationResult {\n /**\n * @zh 是否有效\n * @en Whether valid\n */\n readonly isValid: boolean;\n\n /**\n * @zh 错误列表\n * @en Error list\n */\n readonly errors: CompositionError[];\n\n /**\n * @zh 警告列表\n * @en Warning list\n */\n readonly warnings: CompositionWarning[];\n}\n\n/**\n * @zh 组合错误\n * @en Composition error\n */\nexport interface CompositionError {\n readonly type: 'missing-connection' | 'type-mismatch' | 'cycle-detected' | 'invalid-slot';\n readonly message: string;\n readonly slotId?: string;\n readonly pinName?: string;\n}\n\n/**\n * @zh 组合警告\n * @en Composition warning\n */\nexport interface CompositionWarning {\n readonly type: 'unused-output' | 'unconnected-input';\n readonly message: string;\n readonly slotId?: string;\n readonly pinName?: string;\n}\n\n// =============================================================================\n// 组合器实现 | Composer Implementation\n// =============================================================================\n\n/**\n * @zh 蓝图组合器实现\n * @en Blueprint composer implementation\n */\nexport class BlueprintComposer implements IBlueprintComposer {\n readonly name: string;\n\n private slots: Map<string, FragmentSlot> = new Map();\n private connections: Map<string, SlotConnection> = new Map();\n private connectionIdCounter = 0;\n\n constructor(name: string) {\n this.name = name;\n }\n\n getSlots(): FragmentSlot[] {\n return Array.from(this.slots.values());\n }\n\n getConnections(): SlotConnection[] {\n return Array.from(this.connections.values());\n }\n\n addFragment(\n fragment: IBlueprintFragment,\n slotId: string,\n options?: {\n name?: string;\n position?: { x: number; y: number };\n }\n ): void {\n if (this.slots.has(slotId)) {\n throw new Error(`Slot '${slotId}' already exists`);\n }\n\n const slot: FragmentSlot = {\n id: slotId,\n name: options?.name ?? fragment.name,\n fragment,\n position: options?.position ?? { x: 0, y: 0 }\n };\n\n this.slots.set(slotId, slot);\n }\n\n removeSlot(slotId: string): void {\n if (!this.slots.has(slotId)) {\n return;\n }\n\n // Remove all connections involving this slot\n const toRemove: string[] = [];\n for (const [id, conn] of this.connections) {\n if (conn.fromSlotId === slotId || conn.toSlotId === slotId) {\n toRemove.push(id);\n }\n }\n for (const id of toRemove) {\n this.connections.delete(id);\n }\n\n this.slots.delete(slotId);\n }\n\n connect(\n fromSlotId: string,\n fromPin: string,\n toSlotId: string,\n toPin: string\n ): void {\n const fromSlot = this.slots.get(fromSlotId);\n const toSlot = this.slots.get(toSlotId);\n\n if (!fromSlot) {\n throw new Error(`Source slot '${fromSlotId}' not found`);\n }\n if (!toSlot) {\n throw new Error(`Target slot '${toSlotId}' not found`);\n }\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === toPin);\n\n if (!fromPinDef) {\n throw new Error(`Output pin '${fromPin}' not found in slot '${fromSlotId}'`);\n }\n if (!toPinDef) {\n throw new Error(`Input pin '${toPin}' not found in slot '${toSlotId}'`);\n }\n\n const connectionId = `conn_${++this.connectionIdCounter}`;\n\n const connection: SlotConnection = {\n id: connectionId,\n fromSlotId,\n fromPin,\n toSlotId,\n toPin\n };\n\n this.connections.set(connectionId, connection);\n }\n\n disconnect(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n validate(): CompositionValidationResult {\n const errors: CompositionError[] = [];\n const warnings: CompositionWarning[] = [];\n\n // Check for required inputs without connections\n for (const slot of this.slots.values()) {\n for (const input of slot.fragment.inputs) {\n const hasConnection = Array.from(this.connections.values()).some(\n c => c.toSlotId === slot.id && c.toPin === input.name\n );\n\n if (!hasConnection && input.defaultValue === undefined) {\n warnings.push({\n type: 'unconnected-input',\n message: `Input '${input.name}' in slot '${slot.id}' is not connected`,\n slotId: slot.id,\n pinName: input.name\n });\n }\n }\n\n // Check for unused outputs\n for (const output of slot.fragment.outputs) {\n const hasConnection = Array.from(this.connections.values()).some(\n c => c.fromSlotId === slot.id && c.fromPin === output.name\n );\n\n if (!hasConnection) {\n warnings.push({\n type: 'unused-output',\n message: `Output '${output.name}' in slot '${slot.id}' is not connected`,\n slotId: slot.id,\n pinName: output.name\n });\n }\n }\n }\n\n // Check type compatibility\n for (const conn of this.connections.values()) {\n const fromSlot = this.slots.get(conn.fromSlotId);\n const toSlot = this.slots.get(conn.toSlotId);\n\n if (!fromSlot || !toSlot) {\n errors.push({\n type: 'invalid-slot',\n message: `Invalid slot reference in connection '${conn.id}'`\n });\n continue;\n }\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === conn.fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === conn.toPin);\n\n if (fromPinDef && toPinDef && fromPinDef.type !== toPinDef.type) {\n if (fromPinDef.type !== 'any' && toPinDef.type !== 'any') {\n errors.push({\n type: 'type-mismatch',\n message: `Type mismatch: '${fromPinDef.type}' -> '${toPinDef.type}' in connection '${conn.id}'`\n });\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings\n };\n }\n\n compile(): BlueprintAsset {\n const nodes: BlueprintNode[] = [];\n const connections: BlueprintConnection[] = [];\n const variables: BlueprintVariable[] = [];\n\n const nodeIdMap = new Map<string, Map<string, string>>();\n\n // Copy nodes from each fragment with new IDs\n let nodeIdCounter = 0;\n for (const slot of this.slots.values()) {\n const slotNodeMap = new Map<string, string>();\n nodeIdMap.set(slot.id, slotNodeMap);\n\n for (const node of slot.fragment.graph.nodes) {\n const newNodeId = `node_${++nodeIdCounter}`;\n slotNodeMap.set(node.id, newNodeId);\n\n nodes.push({\n ...node,\n id: newNodeId,\n position: {\n x: node.position.x + slot.position.x,\n y: node.position.y + slot.position.y\n }\n });\n }\n\n // Copy internal connections\n for (const conn of slot.fragment.graph.connections) {\n const newFromId = slotNodeMap.get(conn.fromNodeId);\n const newToId = slotNodeMap.get(conn.toNodeId);\n\n if (newFromId && newToId) {\n connections.push({\n ...conn,\n id: `conn_internal_${connections.length}`,\n fromNodeId: newFromId,\n toNodeId: newToId\n });\n }\n }\n\n // Copy variables (with slot prefix to avoid conflicts)\n for (const variable of slot.fragment.graph.variables) {\n variables.push({\n ...variable,\n name: `${slot.id}_${variable.name}`\n });\n }\n }\n\n // Create connections between slots based on exposed pins\n for (const slotConn of this.connections.values()) {\n const fromSlot = this.slots.get(slotConn.fromSlotId);\n const toSlot = this.slots.get(slotConn.toSlotId);\n\n if (!fromSlot || !toSlot) continue;\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === slotConn.fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === slotConn.toPin);\n\n if (!fromPinDef || !toPinDef) continue;\n\n const fromNodeMap = nodeIdMap.get(slotConn.fromSlotId);\n const toNodeMap = nodeIdMap.get(slotConn.toSlotId);\n\n if (!fromNodeMap || !toNodeMap) continue;\n\n const fromNodeId = fromNodeMap.get(fromPinDef.internalNodeId);\n const toNodeId = toNodeMap.get(toPinDef.internalNodeId);\n\n if (fromNodeId && toNodeId) {\n connections.push({\n id: `conn_slot_${connections.length}`,\n fromNodeId,\n fromPin: fromPinDef.internalPinName,\n toNodeId,\n toPin: toPinDef.internalPinName\n });\n }\n }\n\n return {\n version: 1,\n type: 'blueprint',\n metadata: {\n name: this.name,\n description: `Composed from ${this.slots.size} fragments`,\n createdAt: Date.now(),\n modifiedAt: Date.now()\n },\n variables,\n nodes,\n connections\n };\n }\n\n clear(): void {\n this.slots.clear();\n this.connections.clear();\n this.connectionIdCounter = 0;\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建蓝图组合器\n * @en Create blueprint composer\n */\nexport function createComposer(name: string): IBlueprintComposer {\n return new BlueprintComposer(name);\n}\n\n// =============================================================================\n// 组合资产格式 | Composition Asset Format\n// =============================================================================\n\n/**\n * @zh 蓝图组合资产格式\n * @en Blueprint composition asset format\n */\nexport interface BlueprintCompositionAsset {\n /**\n * @zh 格式版本\n * @en Format version\n */\n version: number;\n\n /**\n * @zh 资产类型标识\n * @en Asset type identifier\n */\n type: 'blueprint-composition';\n\n /**\n * @zh 组合名称\n * @en Composition name\n */\n name: string;\n\n /**\n * @zh 槽位数据\n * @en Slot data\n */\n slots: Array<{\n id: string;\n name: string;\n fragmentId: string;\n position: { x: number; y: number };\n }>;\n\n /**\n * @zh 连接数据\n * @en Connection data\n */\n connections: SlotConnection[];\n}\n","/**\n * @zh 片段注册表\n * @en Fragment Registry\n *\n * @zh 管理和查询蓝图片段\n * @en Manages and queries blueprint fragments\n */\n\nimport type { IBlueprintFragment } from './BlueprintFragment';\n\n// =============================================================================\n// 片段注册表接口 | Fragment Registry Interface\n// =============================================================================\n\n/**\n * @zh 片段过滤器\n * @en Fragment filter\n */\nexport interface FragmentFilter {\n /**\n * @zh 按分类过滤\n * @en Filter by category\n */\n category?: string;\n\n /**\n * @zh 按标签过滤(任意匹配)\n * @en Filter by tags (any match)\n */\n tags?: string[];\n\n /**\n * @zh 按名称搜索\n * @en Search by name\n */\n search?: string;\n}\n\n/**\n * @zh 片段注册表接口\n * @en Fragment registry interface\n */\nexport interface IFragmentRegistry {\n /**\n * @zh 注册片段\n * @en Register fragment\n */\n register(fragment: IBlueprintFragment): void;\n\n /**\n * @zh 注销片段\n * @en Unregister fragment\n */\n unregister(id: string): void;\n\n /**\n * @zh 获取片段\n * @en Get fragment\n */\n get(id: string): IBlueprintFragment | undefined;\n\n /**\n * @zh 检查片段是否存在\n * @en Check if fragment exists\n */\n has(id: string): boolean;\n\n /**\n * @zh 获取所有片段\n * @en Get all fragments\n */\n getAll(): IBlueprintFragment[];\n\n /**\n * @zh 按条件过滤片段\n * @en Filter fragments by criteria\n */\n filter(filter: FragmentFilter): IBlueprintFragment[];\n\n /**\n * @zh 获取所有分类\n * @en Get all categories\n */\n getCategories(): string[];\n\n /**\n * @zh 获取所有标签\n * @en Get all tags\n */\n getTags(): string[];\n\n /**\n * @zh 清空注册表\n * @en Clear registry\n */\n clear(): void;\n}\n\n// =============================================================================\n// 片段注册表实现 | Fragment Registry Implementation\n// =============================================================================\n\n/**\n * @zh 片段注册表实现\n * @en Fragment registry implementation\n */\nexport class FragmentRegistry implements IFragmentRegistry {\n private fragments: Map<string, IBlueprintFragment> = new Map();\n\n register(fragment: IBlueprintFragment): void {\n if (this.fragments.has(fragment.id)) {\n console.warn(`Fragment '${fragment.id}' already registered, overwriting`);\n }\n this.fragments.set(fragment.id, fragment);\n }\n\n unregister(id: string): void {\n this.fragments.delete(id);\n }\n\n get(id: string): IBlueprintFragment | undefined {\n return this.fragments.get(id);\n }\n\n has(id: string): boolean {\n return this.fragments.has(id);\n }\n\n getAll(): IBlueprintFragment[] {\n return Array.from(this.fragments.values());\n }\n\n filter(filter: FragmentFilter): IBlueprintFragment[] {\n let results = this.getAll();\n\n if (filter.category) {\n results = results.filter(f => f.category === filter.category);\n }\n\n if (filter.tags && filter.tags.length > 0) {\n results = results.filter(f =>\n f.tags && filter.tags!.some(t => f.tags!.includes(t))\n );\n }\n\n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n results = results.filter(f =>\n f.name.toLowerCase().includes(searchLower) ||\n f.description?.toLowerCase().includes(searchLower)\n );\n }\n\n return results;\n }\n\n getCategories(): string[] {\n const categories = new Set<string>();\n for (const fragment of this.fragments.values()) {\n if (fragment.category) {\n categories.add(fragment.category);\n }\n }\n return Array.from(categories).sort();\n }\n\n getTags(): string[] {\n const tags = new Set<string>();\n for (const fragment of this.fragments.values()) {\n if (fragment.tags) {\n for (const tag of fragment.tags) {\n tags.add(tag);\n }\n }\n }\n return Array.from(tags).sort();\n }\n\n clear(): void {\n this.fragments.clear();\n }\n\n /**\n * @zh 获取片段数量\n * @en Get fragment count\n */\n get size(): number {\n return this.fragments.size;\n }\n}\n\n// =============================================================================\n// 单例实例 | Singleton Instance\n// =============================================================================\n\n/**\n * @zh 默认片段注册表实例\n * @en Default fragment registry instance\n */\nexport const defaultFragmentRegistry = new FragmentRegistry();\n\n/**\n * @zh 创建片段注册表\n * @en Create fragment registry\n */\nexport function createFragmentRegistry(): IFragmentRegistry {\n return new FragmentRegistry();\n}\n","/**\n * Event Begin Play Node - Triggered when the blueprint starts\n * 开始播放事件节点 - 蓝图启动时触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventBeginPlay node template\n * EventBeginPlay 节点模板\n */\nexport const EventBeginPlayTemplate: BlueprintNodeTemplate = {\n type: 'EventBeginPlay',\n title: 'Event Begin Play',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered once when the blueprint starts executing (蓝图开始执行时触发一次)',\n keywords: ['start', 'begin', 'init', 'event', 'self'],\n menuPath: ['Events', 'Begin Play'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n }\n ]\n};\n\n/**\n * EventBeginPlay node executor\n * EventBeginPlay 节点执行器\n */\n@RegisterNode(EventBeginPlayTemplate)\nexport class EventBeginPlayExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity\n }\n };\n }\n}\n","/**\n * Event Tick Node - Triggered every frame\n * 每帧事件节点 - 每帧触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventTick node template\n * EventTick 节点模板\n */\nexport const EventTickTemplate: BlueprintNodeTemplate = {\n type: 'EventTick',\n title: 'Event Tick',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered every frame during execution (执行期间每帧触发)',\n keywords: ['update', 'frame', 'tick', 'event', 'self'],\n menuPath: ['Events', 'Tick'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n },\n {\n name: 'deltaTime',\n type: 'float',\n displayName: 'Delta Seconds'\n }\n ]\n};\n\n/**\n * EventTick node executor\n * EventTick 节点执行器\n */\n@RegisterNode(EventTickTemplate)\nexport class EventTickExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity,\n deltaTime: context.deltaTime\n }\n };\n }\n}\n","/**\n * Event End Play Node - Triggered when the blueprint stops\n * 结束播放事件节点 - 蓝图停止时触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventEndPlay node template\n * EventEndPlay 节点模板\n */\nexport const EventEndPlayTemplate: BlueprintNodeTemplate = {\n type: 'EventEndPlay',\n title: 'Event End Play',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered once when the blueprint stops executing (蓝图停止执行时触发一次)',\n keywords: ['stop', 'end', 'destroy', 'event', 'self'],\n menuPath: ['Events', 'End Play'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n }\n ]\n};\n\n/**\n * EventEndPlay node executor\n * EventEndPlay 节点执行器\n */\n@RegisterNode(EventEndPlayTemplate)\nexport class EventEndPlayExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity\n }\n };\n }\n}\n","/**\n * @zh ECS 实体操作节点\n * @en ECS Entity Operation Nodes\n *\n * @zh 提供蓝图中对 ECS 实体的完整操作支持\n * @en Provides complete ECS entity operations in blueprint\n */\n\nimport type { Entity } from '@esengine/ecs-framework';\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Self Entity | 自身实体\n// ============================================================================\n\nexport const GetSelfTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetSelf',\n title: 'Get Self',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the entity that owns this blueprint (获取拥有此蓝图的实体)',\n keywords: ['self', 'this', 'owner', 'entity', 'me'],\n menuPath: ['ECS', 'Entity', 'Get Self'],\n inputs: [],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Self' }\n ]\n};\n\n@RegisterNode(GetSelfTemplate)\nexport class GetSelfExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return { outputs: { entity: context.entity } };\n }\n}\n\n// ============================================================================\n// Create Entity | 创建实体\n// ============================================================================\n\nexport const CreateEntityTemplate: BlueprintNodeTemplate = {\n type: 'ECS_CreateEntity',\n title: 'Create Entity',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Creates a new entity in the scene (在场景中创建新实体)',\n keywords: ['entity', 'create', 'spawn', 'new', 'instantiate'],\n menuPath: ['ECS', 'Entity', 'Create Entity'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: 'NewEntity' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ]\n};\n\n@RegisterNode(CreateEntityTemplate)\nexport class CreateEntityExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const name = context.evaluateInput(node.id, 'name', 'NewEntity') as string;\n const entity = context.scene.createEntity(name);\n return { outputs: { entity }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Destroy Entity | 销毁实体\n// ============================================================================\n\nexport const DestroyEntityTemplate: BlueprintNodeTemplate = {\n type: 'ECS_DestroyEntity',\n title: 'Destroy Entity',\n category: 'entity',\n color: '#8b1e1e',\n description: 'Destroys an entity from the scene (从场景中销毁实体)',\n keywords: ['entity', 'destroy', 'remove', 'delete', 'kill'],\n menuPath: ['ECS', 'Entity', 'Destroy Entity'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(DestroyEntityTemplate)\nexport class DestroyEntityExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', null) as Entity | null;\n if (entity && !entity.isDestroyed) {\n entity.destroy();\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Destroy Self | 销毁自身\n// ============================================================================\n\nexport const DestroySelfTemplate: BlueprintNodeTemplate = {\n type: 'ECS_DestroySelf',\n title: 'Destroy Self',\n category: 'entity',\n color: '#8b1e1e',\n description: 'Destroys the entity that owns this blueprint (销毁拥有此蓝图的实体)',\n keywords: ['self', 'destroy', 'suicide', 'remove', 'delete'],\n menuPath: ['ECS', 'Entity', 'Destroy Self'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: []\n};\n\n@RegisterNode(DestroySelfTemplate)\nexport class DestroySelfExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (!context.entity.isDestroyed) {\n context.entity.destroy();\n }\n return { nextExec: null };\n }\n}\n\n// ============================================================================\n// Is Valid | 是否有效\n// ============================================================================\n\nexport const IsValidTemplate: BlueprintNodeTemplate = {\n type: 'ECS_IsValid',\n title: 'Is Valid',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Checks if an entity reference is valid and not destroyed (检查实体引用是否有效且未被销毁)',\n keywords: ['entity', 'valid', 'null', 'check', 'exists', 'alive'],\n menuPath: ['ECS', 'Entity', 'Is Valid'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'isValid', type: 'bool', displayName: 'Is Valid' }\n ]\n};\n\n@RegisterNode(IsValidTemplate)\nexport class IsValidExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', null) as Entity | null;\n const isValid = entity != null && !entity.isDestroyed;\n return { outputs: { isValid } };\n }\n}\n\n// ============================================================================\n// Get Entity Name | 获取实体名称\n// ============================================================================\n\nexport const GetEntityNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityName',\n title: 'Get Entity Name',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the name of an entity (获取实体的名称)',\n keywords: ['entity', 'name', 'get', 'string'],\n menuPath: ['ECS', 'Entity', 'Get Name'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'name', type: 'string', displayName: 'Name' }\n ]\n};\n\n@RegisterNode(GetEntityNameTemplate)\nexport class GetEntityNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { name: entity?.name ?? '' } };\n }\n}\n\n// ============================================================================\n// Set Entity Name | 设置实体名称\n// ============================================================================\n\nexport const SetEntityNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityName',\n title: 'Set Entity Name',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets the name of an entity (设置实体的名称)',\n keywords: ['entity', 'name', 'set', 'rename'],\n menuPath: ['ECS', 'Entity', 'Set Name'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityNameTemplate)\nexport class SetEntityNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const name = context.evaluateInput(node.id, 'name', '') as string;\n if (entity && !entity.isDestroyed) {\n entity.name = name;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Entity Tag | 获取实体标签\n// ============================================================================\n\nexport const GetEntityTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityTag',\n title: 'Get Entity Tag',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the tag of an entity (获取实体的标签)',\n keywords: ['entity', 'tag', 'get', 'category'],\n menuPath: ['ECS', 'Entity', 'Get Tag'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'tag', type: 'int', displayName: 'Tag' }\n ]\n};\n\n@RegisterNode(GetEntityTagTemplate)\nexport class GetEntityTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { tag: entity?.tag ?? 0 } };\n }\n}\n\n// ============================================================================\n// Set Entity Tag | 设置实体标签\n// ============================================================================\n\nexport const SetEntityTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityTag',\n title: 'Set Entity Tag',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets the tag of an entity (设置实体的标签)',\n keywords: ['entity', 'tag', 'set', 'category'],\n menuPath: ['ECS', 'Entity', 'Set Tag'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'tag', type: 'int', displayName: 'Tag', defaultValue: 0 }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityTagTemplate)\nexport class SetEntityTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const tag = context.evaluateInput(node.id, 'tag', 0) as number;\n if (entity && !entity.isDestroyed) {\n entity.tag = tag;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Set Entity Active | 设置实体激活状态\n// ============================================================================\n\nexport const SetEntityActiveTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityActive',\n title: 'Set Active',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets whether an entity is active (设置实体是否激活)',\n keywords: ['entity', 'active', 'enable', 'disable', 'visible'],\n menuPath: ['ECS', 'Entity', 'Set Active'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'active', type: 'bool', displayName: 'Active', defaultValue: true }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityActiveTemplate)\nexport class SetEntityActiveExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const active = context.evaluateInput(node.id, 'active', true) as boolean;\n if (entity && !entity.isDestroyed) {\n entity.active = active;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Is Entity Active | 实体是否激活\n// ============================================================================\n\nexport const IsEntityActiveTemplate: BlueprintNodeTemplate = {\n type: 'ECS_IsEntityActive',\n title: 'Is Active',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Checks if an entity is active (检查实体是否激活)',\n keywords: ['entity', 'active', 'enabled', 'check'],\n menuPath: ['ECS', 'Entity', 'Is Active'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'isActive', type: 'bool', displayName: 'Is Active' }\n ]\n};\n\n@RegisterNode(IsEntityActiveTemplate)\nexport class IsEntityActiveExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { isActive: entity?.active ?? false } };\n }\n}\n\n// ============================================================================\n// Find Entity By Name | 按名称查找实体\n// ============================================================================\n\nexport const FindEntityByNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntityByName',\n title: 'Find Entity By Name',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds an entity by name in the scene (在场景中按名称查找实体)',\n keywords: ['entity', 'find', 'name', 'search', 'get', 'lookup'],\n menuPath: ['ECS', 'Entity', 'Find By Name'],\n inputs: [\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(FindEntityByNameTemplate)\nexport class FindEntityByNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const name = context.evaluateInput(node.id, 'name', '') as string;\n const entity = context.scene.findEntity(name);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n\n// ============================================================================\n// Find Entities By Tag | 按标签查找实体\n// ============================================================================\n\nexport const FindEntitiesByTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntitiesByTag',\n title: 'Find Entities By Tag',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds all entities with a specific tag (查找所有具有特定标签的实体)',\n keywords: ['entity', 'find', 'tag', 'search', 'get', 'all'],\n menuPath: ['ECS', 'Entity', 'Find By Tag'],\n inputs: [\n { name: 'tag', type: 'int', displayName: 'Tag', defaultValue: 0 }\n ],\n outputs: [\n { name: 'entities', type: 'array', displayName: 'Entities', arrayType: 'entity' },\n { name: 'count', type: 'int', displayName: 'Count' }\n ]\n};\n\n@RegisterNode(FindEntitiesByTagTemplate)\nexport class FindEntitiesByTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const tag = context.evaluateInput(node.id, 'tag', 0) as number;\n const entities = context.scene.findEntitiesByTag(tag);\n return {\n outputs: {\n entities,\n count: entities.length\n }\n };\n }\n}\n\n// ============================================================================\n// Get Entity ID | 获取实体 ID\n// ============================================================================\n\nexport const GetEntityIdTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityId',\n title: 'Get Entity ID',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the unique ID of an entity (获取实体的唯一ID)',\n keywords: ['entity', 'id', 'identifier', 'unique'],\n menuPath: ['ECS', 'Entity', 'Get ID'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'id', type: 'int', displayName: 'ID' }\n ]\n};\n\n@RegisterNode(GetEntityIdTemplate)\nexport class GetEntityIdExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { id: entity?.id ?? -1 } };\n }\n}\n\n// ============================================================================\n// Find Entity By ID | 按 ID 查找实体\n// ============================================================================\n\nexport const FindEntityByIdTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntityById',\n title: 'Find Entity By ID',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds an entity by its unique ID (通过唯一ID查找实体)',\n keywords: ['entity', 'find', 'id', 'identifier'],\n menuPath: ['ECS', 'Entity', 'Find By ID'],\n inputs: [\n { name: 'id', type: 'int', displayName: 'ID', defaultValue: 0 }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(FindEntityByIdTemplate)\nexport class FindEntityByIdExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const id = context.evaluateInput(node.id, 'id', 0) as number;\n const entity = context.scene.findEntityById(id);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n","/**\n * @zh ECS 组件操作节点\n * @en ECS Component Operation Nodes\n *\n * @zh 提供蓝图中对 ECS 组件的完整操作支持\n * @en Provides complete ECS component operations in blueprint\n */\n\nimport type { Entity, Component } from '@esengine/ecs-framework';\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Add Component (Generic) | 添加组件(通用)\n// ============================================================================\n\nexport const AddComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_AddComponent',\n title: 'Add Component',\n category: 'component',\n color: '#1e8b8b',\n description: 'Adds a component to an entity by type name (按类型名称为实体添加组件)',\n keywords: ['component', 'add', 'create', 'attach'],\n menuPath: ['ECS', 'Component', 'Add Component'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n};\n\n@RegisterNode(AddComponentTemplate)\nexport class AddComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n // Check if component already exists\n const existing = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n if (existing) {\n return { outputs: { component: existing, success: false }, nextExec: 'exec' };\n }\n\n // Try to create component from registry\n const ComponentClass = context.getComponentClass?.(componentType);\n if (!ComponentClass) {\n console.warn(`[Blueprint] Component type not found: ${componentType}`);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n try {\n const component = new ComponentClass();\n entity.addComponent(component);\n return { outputs: { component, success: true }, nextExec: 'exec' };\n } catch (error) {\n console.error(`[Blueprint] Failed to add component ${componentType}:`, error);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n }\n}\n\n// ============================================================================\n// Has Component | 是否有组件\n// ============================================================================\n\nexport const HasComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_HasComponent',\n title: 'Has Component',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Checks if an entity has a component of the specified type (检查实体是否拥有指定类型的组件)',\n keywords: ['component', 'has', 'check', 'exists', 'contains'],\n menuPath: ['ECS', 'Component', 'Has Component'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'hasComponent', type: 'bool', displayName: 'Has Component' }\n ]\n};\n\n@RegisterNode(HasComponentTemplate)\nexport class HasComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { hasComponent: false } };\n }\n\n const hasIt = entity.components.some(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n return { outputs: { hasComponent: hasIt } };\n }\n}\n\n// ============================================================================\n// Get Component | 获取组件\n// ============================================================================\n\nexport const GetComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponent',\n title: 'Get Component',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets a component from an entity by type name (按类型名称从实体获取组件)',\n keywords: ['component', 'get', 'find', 'access'],\n menuPath: ['ECS', 'Component', 'Get Component'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetComponentTemplate)\nexport class GetComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { component: null, found: false } };\n }\n\n const component = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n return {\n outputs: {\n component: component ?? null,\n found: component != null\n }\n };\n }\n}\n\n// ============================================================================\n// Get All Components | 获取所有组件\n// ============================================================================\n\nexport const GetAllComponentsTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetAllComponents',\n title: 'Get All Components',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets all components from an entity (获取实体的所有组件)',\n keywords: ['component', 'get', 'all', 'list'],\n menuPath: ['ECS', 'Component', 'Get All Components'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'components', type: 'array', displayName: 'Components', arrayType: 'component' },\n { name: 'count', type: 'int', displayName: 'Count' }\n ]\n};\n\n@RegisterNode(GetAllComponentsTemplate)\nexport class GetAllComponentsExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { components: [], count: 0 } };\n }\n\n const components = [...entity.components];\n return {\n outputs: {\n components,\n count: components.length\n }\n };\n }\n}\n\n// ============================================================================\n// Remove Component | 移除组件\n// ============================================================================\n\nexport const RemoveComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_RemoveComponent',\n title: 'Remove Component',\n category: 'component',\n color: '#8b1e1e',\n description: 'Removes a component from an entity (从实体移除组件)',\n keywords: ['component', 'remove', 'delete', 'destroy'],\n menuPath: ['ECS', 'Component', 'Remove Component'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'removed', type: 'bool', displayName: 'Removed' }\n ]\n};\n\n@RegisterNode(RemoveComponentTemplate)\nexport class RemoveComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { removed: false }, nextExec: 'exec' };\n }\n\n const component = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n if (component) {\n entity.removeComponent(component);\n return { outputs: { removed: true }, nextExec: 'exec' };\n }\n\n return { outputs: { removed: false }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Component Property | 获取组件属性\n// ============================================================================\n\nexport const GetComponentPropertyTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponentProperty',\n title: 'Get Component Property',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets a property value from a component (从组件获取属性值)',\n keywords: ['component', 'property', 'get', 'value', 'field'],\n menuPath: ['ECS', 'Component', 'Get Property'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'propertyName', type: 'string', displayName: 'Property Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'any', displayName: 'Value' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetComponentPropertyTemplate)\nexport class GetComponentPropertyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const propertyName = context.evaluateInput(node.id, 'propertyName', '') as string;\n\n if (!component || !propertyName) {\n return { outputs: { value: null, found: false } };\n }\n\n if (propertyName in component) {\n return {\n outputs: {\n value: (component as any)[propertyName],\n found: true\n }\n };\n }\n\n return { outputs: { value: null, found: false } };\n }\n}\n\n// ============================================================================\n// Set Component Property | 设置组件属性\n// ============================================================================\n\nexport const SetComponentPropertyTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetComponentProperty',\n title: 'Set Component Property',\n category: 'component',\n color: '#1e8b8b',\n description: 'Sets a property value on a component (设置组件的属性值)',\n keywords: ['component', 'property', 'set', 'value', 'field', 'modify'],\n menuPath: ['ECS', 'Component', 'Set Property'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'propertyName', type: 'string', displayName: 'Property Name', defaultValue: '' },\n { name: 'value', type: 'any', displayName: 'Value' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n};\n\n@RegisterNode(SetComponentPropertyTemplate)\nexport class SetComponentPropertyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const propertyName = context.evaluateInput(node.id, 'propertyName', '') as string;\n const value = context.evaluateInput(node.id, 'value', null);\n\n if (!component || !propertyName) {\n return { outputs: { success: false }, nextExec: 'exec' };\n }\n\n if (propertyName in component) {\n (component as any)[propertyName] = value;\n return { outputs: { success: true }, nextExec: 'exec' };\n }\n\n return { outputs: { success: false }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Component Type Name | 获取组件类型名称\n// ============================================================================\n\nexport const GetComponentTypeNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponentTypeName',\n title: 'Get Component Type',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets the type name of a component (获取组件的类型名称)',\n keywords: ['component', 'type', 'name', 'class'],\n menuPath: ['ECS', 'Component', 'Get Type Name'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' }\n ],\n outputs: [\n { name: 'typeName', type: 'string', displayName: 'Type Name' }\n ]\n};\n\n@RegisterNode(GetComponentTypeNameTemplate)\nexport class GetComponentTypeNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return { outputs: { typeName: '' } };\n }\n\n const typeName = (component.constructor as any).__componentName__ ?? component.constructor.name;\n return { outputs: { typeName } };\n }\n}\n\n// ============================================================================\n// Get Entity From Component | 从组件获取实体\n// ============================================================================\n\nexport const GetEntityFromComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityFromComponent',\n title: 'Get Owner Entity',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets the entity that owns a component (获取拥有组件的实体)',\n keywords: ['component', 'entity', 'owner', 'parent'],\n menuPath: ['ECS', 'Component', 'Get Owner Entity'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetEntityFromComponentTemplate)\nexport class GetEntityFromComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component || component.entityId == null) {\n return { outputs: { entity: null, found: false } };\n }\n\n const entity = context.scene.findEntityById(component.entityId);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n","/**\n * @zh 流程控制节点\n * @en Flow Control Nodes\n *\n * @zh 提供蓝图中的流程控制支持(分支、循环等)\n * @en Provides flow control in blueprint (branch, loop, etc.)\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Branch | 分支\n// ============================================================================\n\nexport const BranchTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Branch',\n title: 'Branch',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes one of two paths based on a condition (根据条件执行两条路径之一)',\n keywords: ['if', 'branch', 'condition', 'switch', 'else'],\n menuPath: ['Flow', 'Branch'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'condition', type: 'bool', displayName: 'Condition', defaultValue: false }\n ],\n outputs: [\n { name: 'true', type: 'exec', displayName: 'True' },\n { name: 'false', type: 'exec', displayName: 'False' }\n ]\n};\n\n@RegisterNode(BranchTemplate)\nexport class BranchExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const condition = context.evaluateInput(node.id, 'condition', false) as boolean;\n return { nextExec: condition ? 'true' : 'false' };\n }\n}\n\n// ============================================================================\n// Sequence | 序列\n// ============================================================================\n\nexport const SequenceTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Sequence',\n title: 'Sequence',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes multiple outputs in order (按顺序执行多个输出)',\n keywords: ['sequence', 'order', 'serial', 'chain'],\n menuPath: ['Flow', 'Sequence'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: [\n { name: 'then0', type: 'exec', displayName: 'Then 0' },\n { name: 'then1', type: 'exec', displayName: 'Then 1' },\n { name: 'then2', type: 'exec', displayName: 'Then 2' },\n { name: 'then3', type: 'exec', displayName: 'Then 3' }\n ]\n};\n\n@RegisterNode(SequenceTemplate)\nexport class SequenceExecutor implements INodeExecutor {\n private currentIndex = 0;\n\n execute(_node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const outputs = ['then0', 'then1', 'then2', 'then3'];\n const nextPin = outputs[this.currentIndex];\n this.currentIndex = (this.currentIndex + 1) % outputs.length;\n\n if (this.currentIndex === 0) {\n return { nextExec: null };\n }\n\n return { nextExec: nextPin };\n }\n}\n\n// ============================================================================\n// Do Once | 只执行一次\n// ============================================================================\n\nexport const DoOnceTemplate: BlueprintNodeTemplate = {\n type: 'Flow_DoOnce',\n title: 'Do Once',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the output only once, subsequent calls are ignored (只执行一次,后续调用被忽略)',\n keywords: ['once', 'single', 'first', 'one'],\n menuPath: ['Flow', 'Do Once'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'reset', type: 'exec', displayName: 'Reset' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(DoOnceTemplate)\nexport class DoOnceExecutor implements INodeExecutor {\n private executed = false;\n\n execute(node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const inputPin = node.data._lastInputPin as string | undefined;\n\n if (inputPin === 'reset') {\n this.executed = false;\n return { nextExec: null };\n }\n\n if (this.executed) {\n return { nextExec: null };\n }\n\n this.executed = true;\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Flip Flop | 触发器\n// ============================================================================\n\nexport const FlipFlopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_FlipFlop',\n title: 'Flip Flop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Alternates between two outputs on each execution (每次执行时在两个输出之间交替)',\n keywords: ['flip', 'flop', 'toggle', 'alternate', 'switch'],\n menuPath: ['Flow', 'Flip Flop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: [\n { name: 'a', type: 'exec', displayName: 'A' },\n { name: 'b', type: 'exec', displayName: 'B' },\n { name: 'isA', type: 'bool', displayName: 'Is A' }\n ]\n};\n\n@RegisterNode(FlipFlopTemplate)\nexport class FlipFlopExecutor implements INodeExecutor {\n private isA = true;\n\n execute(_node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const currentIsA = this.isA;\n this.isA = !this.isA;\n\n return {\n outputs: { isA: currentIsA },\n nextExec: currentIsA ? 'a' : 'b'\n };\n }\n}\n\n// ============================================================================\n// Gate | 门\n// ============================================================================\n\nexport const GateTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Gate',\n title: 'Gate',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Controls execution flow with open/close state (通过开/关状态控制执行流)',\n keywords: ['gate', 'open', 'close', 'block', 'allow'],\n menuPath: ['Flow', 'Gate'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: 'Enter' },\n { name: 'open', type: 'exec', displayName: 'Open' },\n { name: 'close', type: 'exec', displayName: 'Close' },\n { name: 'toggle', type: 'exec', displayName: 'Toggle' },\n { name: 'startOpen', type: 'bool', displayName: 'Start Open', defaultValue: true }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: 'Exit' }\n ]\n};\n\n@RegisterNode(GateTemplate)\nexport class GateExecutor implements INodeExecutor {\n private isOpen: boolean | null = null;\n\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (this.isOpen === null) {\n this.isOpen = context.evaluateInput(node.id, 'startOpen', true) as boolean;\n }\n\n const inputPin = node.data._lastInputPin as string | undefined;\n\n switch (inputPin) {\n case 'open':\n this.isOpen = true;\n return { nextExec: null };\n case 'close':\n this.isOpen = false;\n return { nextExec: null };\n case 'toggle':\n this.isOpen = !this.isOpen;\n return { nextExec: null };\n default:\n return { nextExec: this.isOpen ? 'exec' : null };\n }\n }\n}\n\n// ============================================================================\n// For Loop | For 循环\n// ============================================================================\n\nexport const ForLoopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_ForLoop',\n title: 'For Loop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the loop body for each index in range (对范围内的每个索引执行循环体)',\n keywords: ['for', 'loop', 'iterate', 'repeat', 'count'],\n menuPath: ['Flow', 'For Loop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'start', type: 'int', displayName: 'Start', defaultValue: 0 },\n { name: 'end', type: 'int', displayName: 'End', defaultValue: 10 }\n ],\n outputs: [\n { name: 'loopBody', type: 'exec', displayName: 'Loop Body' },\n { name: 'completed', type: 'exec', displayName: 'Completed' },\n { name: 'index', type: 'int', displayName: 'Index' }\n ]\n};\n\n@RegisterNode(ForLoopTemplate)\nexport class ForLoopExecutor implements INodeExecutor {\n private currentIndex = 0;\n private endIndex = 0;\n private isRunning = false;\n\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (!this.isRunning) {\n this.currentIndex = context.evaluateInput(node.id, 'start', 0) as number;\n this.endIndex = context.evaluateInput(node.id, 'end', 10) as number;\n this.isRunning = true;\n }\n\n if (this.currentIndex < this.endIndex) {\n const index = this.currentIndex;\n this.currentIndex++;\n\n return {\n outputs: { index },\n nextExec: 'loopBody'\n };\n }\n\n this.isRunning = false;\n return {\n outputs: { index: this.endIndex },\n nextExec: 'completed'\n };\n }\n}\n\n// ============================================================================\n// While Loop | While 循环\n// ============================================================================\n\nexport const WhileLoopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_WhileLoop',\n title: 'While Loop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the loop body while condition is true (当条件为真时执行循环体)',\n keywords: ['while', 'loop', 'repeat', 'condition'],\n menuPath: ['Flow', 'While Loop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'condition', type: 'bool', displayName: 'Condition', defaultValue: true }\n ],\n outputs: [\n { name: 'loopBody', type: 'exec', displayName: 'Loop Body' },\n { name: 'completed', type: 'exec', displayName: 'Completed' }\n ]\n};\n\n@RegisterNode(WhileLoopTemplate)\nexport class WhileLoopExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const condition = context.evaluateInput(node.id, 'condition', true) as boolean;\n\n if (condition) {\n return { nextExec: 'loopBody' };\n }\n\n return { nextExec: 'completed' };\n }\n}\n","/**\n * Math Operation Nodes - Basic arithmetic operations\n * 数学运算节点 - 基础算术运算\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// Add Node (加法节点)\nexport const AddTemplate: BlueprintNodeTemplate = {\n type: 'Add',\n title: 'Add',\n category: 'math',\n color: '#4CAF50',\n description: 'Adds two numbers together (将两个数字相加)',\n keywords: ['add', 'plus', 'sum', '+', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(AddTemplate)\nexport class AddExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 0));\n return { outputs: { result: a + b } };\n }\n}\n\n// Subtract Node (减法节点)\nexport const SubtractTemplate: BlueprintNodeTemplate = {\n type: 'Subtract',\n title: 'Subtract',\n category: 'math',\n color: '#4CAF50',\n description: 'Subtracts B from A (从 A 减去 B)',\n keywords: ['subtract', 'minus', '-', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(SubtractTemplate)\nexport class SubtractExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 0));\n return { outputs: { result: a - b } };\n }\n}\n\n// Multiply Node (乘法节点)\nexport const MultiplyTemplate: BlueprintNodeTemplate = {\n type: 'Multiply',\n title: 'Multiply',\n category: 'math',\n color: '#4CAF50',\n description: 'Multiplies two numbers (将两个数字相乘)',\n keywords: ['multiply', 'times', '*', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(MultiplyTemplate)\nexport class MultiplyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 1));\n return { outputs: { result: a * b } };\n }\n}\n\n// Divide Node (除法节点)\nexport const DivideTemplate: BlueprintNodeTemplate = {\n type: 'Divide',\n title: 'Divide',\n category: 'math',\n color: '#4CAF50',\n description: 'Divides A by B (A 除以 B)',\n keywords: ['divide', '/', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(DivideTemplate)\nexport class DivideExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 1));\n\n // Prevent division by zero (防止除零)\n if (b === 0) {\n return { outputs: { result: 0 } };\n }\n\n return { outputs: { result: a / b } };\n }\n}\n","/**\n * Get Delta Time Node - Returns the time since last frame\n * 获取增量时间节点 - 返回上一帧以来的时间\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * GetDeltaTime node template\n * GetDeltaTime 节点模板\n */\nexport const GetDeltaTimeTemplate: BlueprintNodeTemplate = {\n type: 'GetDeltaTime',\n title: 'Get Delta Time',\n category: 'time',\n color: '#4FC3F7',\n description: 'Returns the time elapsed since the last frame in seconds (返回上一帧以来经过的时间,单位秒)',\n keywords: ['delta', 'time', 'frame', 'dt'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'deltaTime',\n type: 'float',\n displayName: 'Delta Seconds'\n }\n ]\n};\n\n/**\n * GetDeltaTime node executor\n * GetDeltaTime 节点执行器\n */\n@RegisterNode(GetDeltaTimeTemplate)\nexport class GetDeltaTimeExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n outputs: {\n deltaTime: context.deltaTime\n }\n };\n }\n}\n","/**\n * Get Time Node - Returns the total time since blueprint started\n * 获取时间节点 - 返回蓝图启动以来的总时间\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * GetTime node template\n * GetTime 节点模板\n */\nexport const GetTimeTemplate: BlueprintNodeTemplate = {\n type: 'GetTime',\n title: 'Get Game Time',\n category: 'time',\n color: '#4FC3F7',\n description: 'Returns the total time since the blueprint started in seconds (返回蓝图启动以来的总时间,单位秒)',\n keywords: ['time', 'total', 'elapsed', 'game'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'time',\n type: 'float',\n displayName: 'Seconds'\n }\n ]\n};\n\n/**\n * GetTime node executor\n * GetTime 节点执行器\n */\n@RegisterNode(GetTimeTemplate)\nexport class GetTimeExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n outputs: {\n time: context.time\n }\n };\n }\n}\n","/**\n * Delay Node - Pauses execution for a specified duration\n * 延迟节点 - 暂停执行指定的时长\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * Delay node template\n * Delay 节点模板\n */\nexport const DelayTemplate: BlueprintNodeTemplate = {\n type: 'Delay',\n title: 'Delay',\n category: 'flow',\n color: '#FFFFFF',\n description: 'Pauses execution for a specified number of seconds (暂停执行指定的秒数)',\n keywords: ['wait', 'delay', 'pause', 'sleep', 'timer'],\n inputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'duration',\n type: 'float',\n displayName: 'Duration',\n defaultValue: 1.0\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: 'Completed'\n }\n ]\n};\n\n/**\n * Delay node executor\n * Delay 节点执行器\n */\n@RegisterNode(DelayTemplate)\nexport class DelayExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const duration = context.evaluateInput(node.id, 'duration', 1.0) as number;\n\n return {\n nextExec: 'exec',\n delay: duration\n };\n }\n}\n","/**\n * Print Node - Outputs a message for debugging\n * 打印节点 - 输出调试消息\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * Print node template\n * Print 节点模板\n */\nexport const PrintTemplate: BlueprintNodeTemplate = {\n type: 'Print',\n title: 'Print String',\n category: 'debug',\n color: '#785EF0',\n description: 'Prints a message to the console for debugging (打印消息到控制台用于调试)',\n keywords: ['log', 'debug', 'console', 'output', 'print'],\n inputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'message',\n type: 'string',\n displayName: 'Message',\n defaultValue: 'Hello Blueprint!'\n },\n {\n name: 'printToScreen',\n type: 'bool',\n displayName: 'Print to Screen',\n defaultValue: true\n },\n {\n name: 'duration',\n type: 'float',\n displayName: 'Duration',\n defaultValue: 2.0\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n }\n ]\n};\n\n/**\n * Print node executor\n * Print 节点执行器\n */\n@RegisterNode(PrintTemplate)\nexport class PrintExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const message = context.evaluateInput(node.id, 'message', 'Hello Blueprint!');\n const printToScreen = context.evaluateInput(node.id, 'printToScreen', true);\n const duration = context.evaluateInput(node.id, 'duration', 2.0);\n\n // Console output\n // 控制台输出\n console.log(`[Blueprint] ${message}`);\n\n // Screen output via event (handled by runtime)\n // 通过事件输出到屏幕(由运行时处理)\n if (printToScreen) {\n const event = new CustomEvent('blueprint:print', {\n detail: {\n message: String(message),\n duration: Number(duration),\n entityId: context.entity.id,\n entityName: context.entity.name\n }\n });\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(event);\n }\n }\n\n return {\n nextExec: 'exec'\n };\n }\n}\n","/**\n * @esengine/blueprint - Visual scripting system for ECS Framework\n *\n * @zh 蓝图可视化脚本系统 - 与 ECS 框架深度集成\n * @en Visual scripting system - Deep integration with ECS framework\n *\n * @zh 此包提供完整的可视化脚本功能:\n * - 内置 ECS 操作节点(Entity、Component、Flow)\n * - 组件自动节点生成(使用装饰器标记)\n * - 运行时蓝图执行\n *\n * @en This package provides complete visual scripting features:\n * - Built-in ECS operation nodes (Entity, Component, Flow)\n * - Auto component node generation (using decorators)\n * - Runtime blueprint execution\n *\n * @example 基础使用 | Basic Usage:\n * ```typescript\n * import { BlueprintSystem, BlueprintComponent } from '@esengine/blueprint';\n * import { Scene, Core } from '@esengine/ecs-framework';\n *\n * // 创建场景并添加蓝图系统\n * const scene = new Scene();\n * scene.addSystem(new BlueprintSystem());\n * Core.setScene(scene);\n *\n * // 为实体添加蓝图\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * entity.addComponent(blueprint);\n * ```\n *\n * @example 标记组件 | Mark Components:\n * ```typescript\n * import { BlueprintExpose, BlueprintProperty, BlueprintMethod } from '@esengine/blueprint';\n * import { Component, ECSComponent } from '@esengine/ecs-framework';\n *\n * @ECSComponent('Health')\n * @BlueprintExpose({ displayName: '生命值' })\n * export class HealthComponent extends Component {\n * @BlueprintProperty({ displayName: '当前生命值' })\n * current: number = 100;\n *\n * @BlueprintMethod({ displayName: '治疗' })\n * heal(amount: number): void {\n * this.current += amount;\n * }\n * }\n * ```\n *\n * @packageDocumentation\n */\n\n// Types\nexport * from './types';\n\n// Runtime\nexport * from './runtime';\n\n// Triggers\nexport * from './triggers';\n\n// Composition\nexport * from './composition';\n\n// Registry (decorators & auto-generation)\nexport * from './registry';\n\n// Nodes (import to register built-in nodes)\nimport './nodes';\n\n// Re-export commonly used items\nexport { NodeRegistry, RegisterNode } from './runtime/NodeRegistry';\nexport { BlueprintVM } from './runtime/BlueprintVM';\nexport { BlueprintComponent } from './runtime/BlueprintComponent';\nexport { BlueprintSystem } from './runtime/BlueprintSystem';\nexport { ExecutionContext } from './runtime/ExecutionContext';\nexport { createEmptyBlueprint, validateBlueprintAsset } from './types/blueprint';\n\n// Component registration helper\nimport { ExecutionContext } from './runtime/ExecutionContext';\nimport type { Component } from '@esengine/ecs-framework';\n\n/**\n * @zh 注册组件类以支持在蓝图中动态创建\n * @en Register a component class for dynamic creation in blueprints\n *\n * @example\n * ```typescript\n * import { registerComponentClass } from '@esengine/blueprint';\n * import { MyComponent } from './MyComponent';\n *\n * registerComponentClass('MyComponent', MyComponent);\n * ```\n */\nexport function registerComponentClass(typeName: string, componentClass: new () => Component): void {\n ExecutionContext.registerComponentClass(typeName, componentClass);\n}\n\n// Re-export registry for convenience\nexport {\n BlueprintExpose,\n BlueprintProperty,\n BlueprintMethod,\n registerAllComponentNodes,\n registerComponentNodes\n} from './registry';\n"],"mappings":"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","names":["getPinTypeColor","type","colors","exec","bool","int","float","string","vector2","vector3","color","entity","component","object","array","any","arePinTypesCompatible","from","to","numericTypes","includes","vectorTypes","getNodeCategoryColor","category","colors","event","flow","entity","component","math","logic","variable","input","physics","audio","time","debug","custom","createEmptyBlueprint","name","includeBeginPlay","nodes","push","id","type","position","x","y","data","version","metadata","createdAt","Date","now","modifiedAt","variables","connections","validateBlueprintAsset","asset","bp","Array","isArray","registeredComponents","Map","getRegisteredBlueprintComponents","getBlueprintMetadata","componentClass","get","clearRegisteredComponents","clear","getOrCreateMetadata","constructor","metadata","componentName","__componentName__","name","properties","methods","set","BlueprintExpose","options","target","Object","assign","BlueprintProperty","propertyKey","key","String","propMeta","displayName","description","pinType","type","readonly","defaultValue","existingIndex","findIndex","p","push","BlueprintMethod","descriptor","methodMeta","methodKey","isPure","params","returnType","m","inferPinType","typeName","typeMap","ExecutionContext","blueprint","entity","scene","deltaTime","time","_instanceVariables","Map","_localVariables","_outputCache","_connectionsByTarget","_connectionsBySource","variable","variables","scope","set","name","defaultValue","_buildConnectionMaps","conn","connections","targetKey","toNodeId","toPin","has","get","push","sourceKey","fromNodeId","fromPin","getNode","nodeId","nodes","find","n","id","getConnectionsToPin","pinName","getConnectionsFromPin","evaluateInput","length","node","data","cachedOutputs","setOutputs","outputs","getOutputs","clearOutputCache","clear","getVariable","_globalVariables","varDef","v","setVariable","value","getInstanceVariables","setInstanceVariables","clearGlobalVariables","getComponentClass","typeName","blueprintComponents","getRegisteredBlueprintComponents","componentClass","metadata","componentName","_componentRegistry","registerComponentClass","unregisterComponentClass","delete","getRegisteredComponentClasses","NodeRegistry","_nodes","Map","instance","_instance","register","template","executor","has","type","console","warn","set","get","getTemplate","getExecutor","getAllTemplates","Array","from","values","map","d","getTemplatesByCategory","category","filter","t","searchTemplates","keyword","lower","toLowerCase","title","includes","keywords","some","k","description","clear","RegisterNode","constructor","BlueprintVM","blueprint","entity","scene","_context","_pendingExecutions","_eventNodes","Map","_isRunning","_currentTime","_maxStepsPerFrame","debug","ExecutionContext","_cacheEventNodes","context","isRunning","node","nodes","type","startsWith","eventType","has","set","get","push","start","triggerEvent","stop","pause","resume","tick","deltaTime","time","_processPendingExecutions","data","eventNodes","_executeFromNode","triggerCustomEvent","eventName","startNode","startPin","eventData","clearOutputCache","setOutputs","id","currentNodeId","currentPin","steps","connections","getConnectionsFromPin","length","nextConn","result","_executeNode","toNodeId","error","console","delay","nodeId","execPin","nextExec","resumeTime","yield","warn","getNode","executor","NodeRegistry","instance","getExecutor","log","execute","outputs","stillPending","pending","getInstanceVariables","setInstanceVariables","variables","Component","ECSComponent","BlueprintComponent","Component","blueprintAsset","blueprintPath","autoStart","debug","vm","isStarted","initialize","entity","scene","BlueprintVM","start","stop","tick","deltaTime","cleanup","EntitySystem","Matcher","ECSSystem","Time","generateComponentNodes","componentClass","metadata","componentName","properties","methods","category","color","generateAddComponentNode","generateGetComponentNode","prop","generatePropertyGetNode","readonly","generatePropertySetNode","method","generateMethodCallNode","nodeType","displayName","propertyInputs","propertyDefaults","push","name","propertyKey","type","pinType","defaultValue","template","title","description","keywords","toLowerCase","menuPath","inputs","outputs","propertyKeys","filter","p","map","executor","execute","node","context","entity","evaluateInput","id","isDestroyed","component","success","nextExec","existing","components","find","c","__componentName__","key","value","undefined","addComponent","error","console","NodeRegistry","instance","register","isPure","found","subtitle","methodKey","params","returnType","paramNames","param","result","args","fn","warn","apply","registerAllComponentNodes","getRegisteredBlueprintComponents","log","length","size","registerComponentNodes","get","BlueprintSystem","EntitySystem","Matcher","all","BlueprintComponent","_componentsRegistered","onInitialize","registerAllComponentNodes","process","entities","dt","Time","deltaTime","entity","blueprint","getComponent","blueprintAsset","vm","initialize","scene","autoStart","isStarted","start","tick","onRemoved","cleanup","TriggerTypes","TICK","INPUT","COLLISION","MESSAGE","TIMER","STATE_ENTER","STATE_EXIT","CUSTOM","createTickContext","deltaTime","frameCount","sourceEntityId","type","timestamp","Date","now","createInputContext","action","value","options","pressed","released","createCollisionContext","otherEntityId","isEnter","isExit","point","normal","createMessageContext","messageName","payload","senderId","createTimerContext","timerId","isRepeating","timesFired","createStateContext","stateMachineId","currentState","previousState","createCustomContext","eventName","data","CompositeCondition","_conditions","_logic","type","evaluate","context","length","every","c","some","NotCondition","_condition","AlwaysTrueCondition","_context","AlwaysFalseCondition","TriggerTypeCondition","_allowedTypes","includes","EntityIdCondition","_entityId","_checkSource","sourceEntityId","FunctionCondition","_predicate","InputActionCondition","_action","_checkPressed","_checkReleased","inputContext","action","undefined","pressed","released","MessageNameCondition","_messageName","messageContext","messageName","StateNameCondition","_stateName","_checkCurrent","stateContext","currentState","previousState","TimerIdCondition","_timerId","timerContext","timerId","CollisionEntityCondition","_otherEntityId","_checkEnter","_checkExit","collisionContext","otherEntityId","isEnter","isExit","CustomEventCondition","_eventName","customContext","eventName","ConditionBuilder","and","or","ofType","types","push","fromEntity","entityId","onInput","options","onMessage","onState","stateName","checkCurrent","onTimer","onCollision","onCustomEvent","where","predicate","not","condition","build","_triggerId","generateTriggerId","BlueprintTrigger","config","id","type","condition","priority","enabled","_callback","_callbacks","Set","AlwaysTrueCondition","callback","shouldFire","context","evaluate","fire","addCallback","add","removeCallback","delete","clearCallbacks","clear","TriggerRegistry","_triggers","Map","_triggersByType","register","trigger","has","console","warn","set","get","unregister","triggerId","typeSet","getAll","Array","from","values","getByType","triggers","push","sort","a","b","count","size","createTrigger","createTickTrigger","options","createInputTrigger","createCollisionTrigger","createMessageTrigger","createTimerTrigger","createStateEnterTrigger","createStateExitTrigger","createCustomTrigger","TriggerDispatcher","registry","_registry","_typeSubscribers","Map","_globalSubscribers","Set","_isDispatching","_pendingContexts","TriggerRegistry","dispatch","context","push","triggeredCount","results","result","_doDispatch","length","pendingContext","shift","triggers","getByType","type","trigger","shouldFire","fire","triggerId","id","success","error","Error","message","String","_notifySubscribers","typeSubscribers","get","callback","console","dispatchAsync","Promise","resolve","queueMicrotask","subscribe","has","set","add","unsubscribe","subscribers","delete","subscribeAll","unsubscribeAll","clearSubscriptions","clear","EntityTriggerManager","dispatcher","_dispatcher","_entityTriggers","registerForEntity","entityId","register","unregisterFromEntity","entitySet","unregister","getEntityTriggers","clearEntityTriggers","dispatchToEntity","entityTriggers","createTriggerDispatcher","createEntityTriggerManager","BlueprintFragment","config","id","name","description","category","tags","inputs","outputs","graph","version","icon","color","getAllExposedPins","findInput","find","p","findOutput","createExposedPin","type","direction","internalNodeId","internalPinName","options","displayName","defaultValue","createFragment","fragmentFromAsset","asset","fragment","fragmentToAsset","BlueprintComposer","name","slots","Map","connections","connectionIdCounter","getSlots","Array","from","values","getConnections","addFragment","fragment","slotId","options","has","Error","slot","id","position","x","y","set","removeSlot","toRemove","conn","fromSlotId","toSlotId","push","delete","connect","fromPin","toPin","fromSlot","get","toSlot","fromPinDef","outputs","find","p","toPinDef","inputs","connectionId","connection","disconnect","validate","errors","warnings","input","hasConnection","some","c","defaultValue","undefined","type","message","pinName","output","isValid","length","compile","nodes","variables","nodeIdMap","nodeIdCounter","slotNodeMap","node","graph","newNodeId","newFromId","fromNodeId","newToId","toNodeId","variable","slotConn","fromNodeMap","toNodeMap","internalNodeId","internalPinName","version","metadata","description","size","createdAt","Date","now","modifiedAt","clear","createComposer","FragmentRegistry","fragments","Map","register","fragment","has","id","console","warn","set","unregister","delete","get","getAll","Array","from","values","filter","results","category","f","tags","length","some","t","includes","search","searchLower","toLowerCase","name","description","getCategories","categories","Set","add","sort","getTags","tag","clear","size","defaultFragmentRegistry","createFragmentRegistry","_ts_decorate","EventBeginPlayTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventBeginPlayExecutor","execute","_node","context","nextExec","self","entity","_ts_decorate","EventTickTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventTickExecutor","execute","_node","context","nextExec","self","entity","deltaTime","_ts_decorate","EventEndPlayTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventEndPlayExecutor","execute","_node","context","nextExec","self","entity","_ts_decorate","GetSelfTemplate","type","title","category","color","isPure","description","keywords","menuPath","inputs","outputs","name","displayName","GetSelfExecutor","execute","_node","context","entity","CreateEntityTemplate","defaultValue","CreateEntityExecutor","node","evaluateInput","id","scene","createEntity","nextExec","DestroyEntityTemplate","DestroyEntityExecutor","isDestroyed","destroy","DestroySelfTemplate","DestroySelfExecutor","IsValidTemplate","IsValidExecutor","isValid","GetEntityNameTemplate","GetEntityNameExecutor","SetEntityNameTemplate","SetEntityNameExecutor","GetEntityTagTemplate","GetEntityTagExecutor","tag","SetEntityTagTemplate","SetEntityTagExecutor","SetEntityActiveTemplate","SetEntityActiveExecutor","active","IsEntityActiveTemplate","IsEntityActiveExecutor","isActive","FindEntityByNameTemplate","FindEntityByNameExecutor","findEntity","found","FindEntitiesByTagTemplate","arrayType","FindEntitiesByTagExecutor","entities","findEntitiesByTag","count","length","GetEntityIdTemplate","GetEntityIdExecutor","FindEntityByIdTemplate","FindEntityByIdExecutor","findEntityById","_ts_decorate","AddComponentTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","AddComponentExecutor","execute","node","context","entity","evaluateInput","id","componentType","isDestroyed","component","success","nextExec","existing","components","find","c","__componentName__","ComponentClass","getComponentClass","console","warn","addComponent","error","HasComponentTemplate","isPure","HasComponentExecutor","hasComponent","hasIt","some","GetComponentTemplate","GetComponentExecutor","found","GetAllComponentsTemplate","arrayType","GetAllComponentsExecutor","count","length","RemoveComponentTemplate","RemoveComponentExecutor","removed","removeComponent","GetComponentPropertyTemplate","GetComponentPropertyExecutor","propertyName","value","SetComponentPropertyTemplate","SetComponentPropertyExecutor","GetComponentTypeNameTemplate","GetComponentTypeNameExecutor","typeName","GetEntityFromComponentTemplate","GetEntityFromComponentExecutor","entityId","scene","findEntityById","_ts_decorate","BranchTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","BranchExecutor","execute","node","context","condition","evaluateInput","id","nextExec","SequenceTemplate","SequenceExecutor","currentIndex","_node","_context","nextPin","length","DoOnceTemplate","DoOnceExecutor","executed","inputPin","data","_lastInputPin","FlipFlopTemplate","FlipFlopExecutor","isA","currentIsA","GateTemplate","GateExecutor","isOpen","ForLoopTemplate","ForLoopExecutor","endIndex","isRunning","index","WhileLoopTemplate","WhileLoopExecutor","_ts_decorate","AddTemplate","type","title","category","color","description","keywords","isPure","inputs","name","displayName","defaultValue","outputs","AddExecutor","execute","node","context","a","Number","evaluateInput","id","b","result","SubtractTemplate","SubtractExecutor","MultiplyTemplate","MultiplyExecutor","DivideTemplate","DivideExecutor","_ts_decorate","GetDeltaTimeTemplate","type","title","category","color","description","keywords","isPure","inputs","outputs","name","displayName","GetDeltaTimeExecutor","execute","_node","context","deltaTime","_ts_decorate","GetTimeTemplate","type","title","category","color","description","keywords","isPure","inputs","outputs","name","displayName","GetTimeExecutor","execute","_node","context","time","_ts_decorate","DelayTemplate","type","title","category","color","description","keywords","inputs","name","displayName","defaultValue","outputs","DelayExecutor","execute","node","context","duration","evaluateInput","id","nextExec","delay","_ts_decorate","PrintTemplate","type","title","category","color","description","keywords","inputs","name","displayName","defaultValue","outputs","PrintExecutor","execute","node","context","message","evaluateInput","id","printToScreen","duration","console","log","event","CustomEvent","detail","String","Number","entityId","entity","entityName","window","dispatchEvent","nextExec","registerComponentClass","typeName","componentClass","ExecutionContext"]}
1
+ {"version":3,"sources":["../src/types/pins.ts","../src/types/nodes.ts","../src/types/blueprint.ts","../src/registry/BlueprintDecorators.ts","../src/runtime/ExecutionContext.ts","../src/runtime/NodeRegistry.ts","../src/runtime/BlueprintVM.ts","../src/runtime/BlueprintComponent.ts","../src/runtime/BlueprintSystem.ts","../src/registry/ComponentNodeGenerator.ts","../src/triggers/TriggerTypes.ts","../src/triggers/TriggerCondition.ts","../src/triggers/BlueprintTrigger.ts","../src/triggers/TriggerDispatcher.ts","../src/composition/BlueprintFragment.ts","../src/composition/BlueprintComposer.ts","../src/composition/FragmentRegistry.ts","../src/nodes/events/EventBeginPlay.ts","../src/nodes/events/EventTick.ts","../src/nodes/events/EventEndPlay.ts","../src/nodes/ecs/EntityNodes.ts","../src/nodes/ecs/ComponentNodes.ts","../src/nodes/ecs/FlowNodes.ts","../src/nodes/variables/VariableNodes.ts","../src/nodes/math/MathOperations.ts","../src/nodes/time/GetDeltaTime.ts","../src/nodes/time/GetTime.ts","../src/nodes/time/Delay.ts","../src/nodes/debug/Print.ts","../src/index.ts"],"sourcesContent":["/**\n * Blueprint Pin Types\n * 蓝图引脚类型\n */\n\n/**\n * Pin data type for blueprint nodes\n * 蓝图节点的引脚数据类型\n */\nexport type BlueprintPinType =\n | 'exec' // Execution flow (执行流)\n | 'bool' // Boolean (布尔)\n | 'int' // Integer (整数)\n | 'float' // Float (浮点数)\n | 'string' // String (字符串)\n | 'vector2' // 2D Vector (二维向量)\n | 'vector3' // 3D Vector (三维向量)\n | 'color' // RGBA Color (颜色)\n | 'entity' // Entity reference (实体引用)\n | 'component' // Component reference (组件引用)\n | 'object' // Generic object (通用对象)\n | 'array' // Array (数组)\n | 'any'; // Wildcard (通配符)\n\n/**\n * Pin direction\n * 引脚方向\n */\nexport type BlueprintPinDirection = 'input' | 'output';\n\n/**\n * Pin definition for node templates\n * 节点模板的引脚定义\n *\n * Note: direction is determined by whether the pin is in inputs[] or outputs[] array\n * 注意:方向由引脚在 inputs[] 还是 outputs[] 数组中决定\n */\nexport interface BlueprintPinDefinition {\n /** Unique name within node (节点内唯一名称) */\n name: string;\n\n /** Pin data type (引脚数据类型) */\n type: BlueprintPinType;\n\n /** Display name shown in the editor (编辑器中显示的名称) */\n displayName?: string;\n\n /** Default value when not connected (未连接时的默认值) */\n defaultValue?: unknown;\n\n /** Allow multiple connections (允许多个连接) */\n allowMultiple?: boolean;\n\n /** Array element type if type is 'array' (数组元素类型) */\n arrayType?: BlueprintPinType;\n\n /** Whether this pin is optional (是否可选) */\n optional?: boolean;\n\n /** Tooltip description (提示描述) */\n tooltip?: string;\n}\n\n/**\n * Runtime pin with direction - used when processing pins\n * 带方向的运行时引脚 - 处理引脚时使用\n */\nexport interface BlueprintRuntimePin extends BlueprintPinDefinition {\n /** Pin direction (引脚方向) */\n direction: BlueprintPinDirection;\n}\n\n/**\n * Pin instance in a node\n * 节点中的引脚实例\n */\nexport interface BlueprintPin {\n id: string;\n nodeId: string;\n definition: BlueprintPinDefinition;\n value?: unknown;\n}\n\n/**\n * Gets the color for a pin type\n * 获取引脚类型的颜色\n */\nexport function getPinTypeColor(type: BlueprintPinType): string {\n const colors: Record<BlueprintPinType, string> = {\n exec: '#ffffff',\n bool: '#cc0000',\n int: '#00d4aa',\n float: '#88cc00',\n string: '#ff88cc',\n vector2: '#d4aa00',\n vector3: '#ffcc00',\n color: '#ff8844',\n entity: '#0088ff',\n component: '#44aaff',\n object: '#4444aa',\n array: '#8844ff',\n any: '#888888'\n };\n return colors[type] ?? colors.any;\n}\n\n/**\n * Checks if two pin types are compatible for connection\n * 检查两个引脚类型是否兼容连接\n */\nexport function arePinTypesCompatible(from: BlueprintPinType, to: BlueprintPinType): boolean {\n // Same type always compatible\n // 相同类型始终兼容\n if (from === to) return true;\n\n // Any type is compatible with everything\n // any 类型与所有类型兼容\n if (from === 'any' || to === 'any') return true;\n\n // Exec can only connect to exec\n // exec 只能连接 exec\n if (from === 'exec' || to === 'exec') return false;\n\n // Numeric coercion\n // 数值类型转换\n const numericTypes: BlueprintPinType[] = ['int', 'float'];\n if (numericTypes.includes(from) && numericTypes.includes(to)) return true;\n\n // Vector coercion\n // 向量类型转换\n const vectorTypes: BlueprintPinType[] = ['vector2', 'vector3', 'color'];\n if (vectorTypes.includes(from) && vectorTypes.includes(to)) return true;\n\n return false;\n}\n","/**\n * Blueprint Node Types\n * 蓝图节点类型\n */\n\nimport { BlueprintPinDefinition } from './pins';\n\n/**\n * Node category for visual styling and organization\n * 节点类别,用于视觉样式和组织\n */\nexport type BlueprintNodeCategory =\n | 'event' // Event nodes - red (事件节点 - 红色)\n | 'flow' // Flow control - gray (流程控制 - 灰色)\n | 'entity' // Entity operations - blue (实体操作 - 蓝色)\n | 'component' // Component access - cyan (组件访问 - 青色)\n | 'math' // Math operations - green (数学运算 - 绿色)\n | 'logic' // Logic operations - red (逻辑运算 - 红色)\n | 'variable' // Variable access - purple (变量访问 - 紫色)\n | 'input' // Input handling - orange (输入处理 - 橙色)\n | 'physics' // Physics - yellow (物理 - 黄色)\n | 'audio' // Audio - pink (音频 - 粉色)\n | 'time' // Time utilities - cyan (时间工具 - 青色)\n | 'debug' // Debug utilities - gray (调试工具 - 灰色)\n | 'custom'; // Custom nodes (自定义节点)\n\n/**\n * Node template definition - describes a type of node\n * 节点模板定义 - 描述一种节点类型\n */\nexport interface BlueprintNodeTemplate {\n /** Unique type identifier (唯一类型标识符) */\n type: string;\n\n /** Display title (显示标题) */\n title: string;\n\n /** Node category (节点类别) */\n category: BlueprintNodeCategory;\n\n /** Optional subtitle (可选副标题) */\n subtitle?: string;\n\n /** Icon name (图标名称) */\n icon?: string;\n\n /** Description for documentation (文档描述) */\n description?: string;\n\n /** Search keywords (搜索关键词) */\n keywords?: string[];\n\n /** Menu path for node palette (节点面板的菜单路径) */\n menuPath?: string[];\n\n /** Input pin definitions (输入引脚定义) */\n inputs: BlueprintPinDefinition[];\n\n /** Output pin definitions (输出引脚定义) */\n outputs: BlueprintPinDefinition[];\n\n /** Whether this node is pure (no exec pins) (是否是纯节点,无执行引脚) */\n isPure?: boolean;\n\n /** Whether this node can be collapsed (是否可折叠) */\n collapsible?: boolean;\n\n /** Custom header color override (自定义头部颜色) */\n headerColor?: string;\n\n /** Node color for visual distinction (节点颜色用于视觉区分) */\n color?: string;\n}\n\n/**\n * Node instance in a blueprint graph\n * 蓝图图中的节点实例\n */\nexport interface BlueprintNode {\n /** Unique instance ID (唯一实例ID) */\n id: string;\n\n /** Template type reference (模板类型引用) */\n type: string;\n\n /** Position in graph (图中位置) */\n position: { x: number; y: number };\n\n /** Custom data for this instance (此实例的自定义数据) */\n data: Record<string, unknown>;\n\n /** Comment/note for this node (此节点的注释) */\n comment?: string;\n}\n\n/**\n * Connection between two pins\n * 两个引脚之间的连接\n */\nexport interface BlueprintConnection {\n /** Unique connection ID (唯一连接ID) */\n id: string;\n\n /** Source node ID (源节点ID) */\n fromNodeId: string;\n\n /** Source pin name (源引脚名称) */\n fromPin: string;\n\n /** Target node ID (目标节点ID) */\n toNodeId: string;\n\n /** Target pin name (目标引脚名称) */\n toPin: string;\n}\n\n/**\n * Gets the header color for a node category\n * 获取节点类别的头部颜色\n */\nexport function getNodeCategoryColor(category: BlueprintNodeCategory): string {\n const colors: Record<BlueprintNodeCategory, string> = {\n event: '#8b1e1e',\n flow: '#4a4a4a',\n entity: '#1e5a8b',\n component: '#1e8b8b',\n math: '#1e8b5a',\n logic: '#8b1e5a',\n variable: '#5a1e8b',\n input: '#8b5a1e',\n physics: '#8b8b1e',\n audio: '#8b1e6b',\n time: '#1e6b8b',\n debug: '#5a5a5a',\n custom: '#4a4a4a'\n };\n return colors[category] ?? colors.custom;\n}\n","/**\n * Blueprint Asset Types\n * 蓝图资产类型\n */\n\nimport { BlueprintNode, BlueprintConnection } from './nodes';\n\n/**\n * Variable scope determines lifetime and accessibility\n * 变量作用域决定生命周期和可访问性\n */\nexport type VariableScope =\n | 'local' // Per-execution (每次执行)\n | 'instance' // Per-entity (每个实体)\n | 'global'; // Shared across all (全局共享)\n\n/**\n * Blueprint variable definition\n * 蓝图变量定义\n */\nexport interface BlueprintVariable {\n /** Variable name (变量名) */\n name: string;\n\n /** Variable type (变量类型) */\n type: string;\n\n /** Default value (默认值) */\n defaultValue: unknown;\n\n /** Variable scope (变量作用域) */\n scope: VariableScope;\n\n /** Category for organization (分类) */\n category?: string;\n\n /** Description tooltip (描述提示) */\n tooltip?: string;\n}\n\n/**\n * Blueprint asset metadata\n * 蓝图资产元数据\n */\nexport interface BlueprintMetadata {\n /** Blueprint name (蓝图名称) */\n name: string;\n\n /** Description (描述) */\n description?: string;\n\n /** Category for organization (分类) */\n category?: string;\n\n /** Author (作者) */\n author?: string;\n\n /** Creation timestamp (创建时间戳) */\n createdAt?: number;\n\n /** Last modified timestamp (最后修改时间戳) */\n modifiedAt?: number;\n}\n\n/**\n * Blueprint asset format - saved to .bp files\n * 蓝图资产格式 - 保存为 .bp 文件\n */\nexport interface BlueprintAsset {\n /** Format version (格式版本) */\n version: number;\n\n /** Asset type identifier (资产类型标识符) */\n type: 'blueprint';\n\n /** Metadata (元数据) */\n metadata: BlueprintMetadata;\n\n /** Variable definitions (变量定义) */\n variables: BlueprintVariable[];\n\n /** Node instances (节点实例) */\n nodes: BlueprintNode[];\n\n /** Connections between nodes (节点之间的连接) */\n connections: BlueprintConnection[];\n}\n\n/**\n * Creates an empty blueprint asset with default Event Begin Play node\n * 创建带有默认 Event Begin Play 节点的空蓝图资产\n */\nexport function createEmptyBlueprint(name: string, includeBeginPlay: boolean = true): BlueprintAsset {\n const nodes: BlueprintNode[] = [];\n\n if (includeBeginPlay) {\n nodes.push({\n id: 'node_beginplay_1',\n type: 'EventBeginPlay',\n position: { x: 100, y: 200 },\n data: {}\n });\n }\n\n return {\n version: 1,\n type: 'blueprint',\n metadata: {\n name,\n createdAt: Date.now(),\n modifiedAt: Date.now()\n },\n variables: [],\n nodes,\n connections: []\n };\n}\n\n/**\n * Validates a blueprint asset structure\n * 验证蓝图资产结构\n */\nexport function validateBlueprintAsset(asset: unknown): asset is BlueprintAsset {\n if (!asset || typeof asset !== 'object') return false;\n\n const bp = asset as BlueprintAsset;\n\n return (\n typeof bp.version === 'number' &&\n bp.type === 'blueprint' &&\n typeof bp.metadata === 'object' &&\n Array.isArray(bp.variables) &&\n Array.isArray(bp.nodes) &&\n Array.isArray(bp.connections)\n );\n}\n","/**\n * @zh 蓝图装饰器 - 用于标记可在蓝图中使用的组件、属性和方法\n * @en Blueprint Decorators - Mark components, properties and methods for blueprint use\n *\n * @example\n * ```typescript\n * import { BlueprintExpose, BlueprintProperty, BlueprintMethod } from '@esengine/blueprint';\n *\n * @ECSComponent('Health')\n * @BlueprintExpose({ displayName: '生命值组件', category: 'gameplay' })\n * export class HealthComponent extends Component {\n *\n * @BlueprintProperty({ displayName: '当前生命值', type: 'float' })\n * current: number = 100;\n *\n * @BlueprintProperty({ displayName: '最大生命值', type: 'float', readonly: true })\n * max: number = 100;\n *\n * @BlueprintMethod({\n * displayName: '治疗',\n * params: [{ name: 'amount', type: 'float' }]\n * })\n * heal(amount: number): void {\n * this.current = Math.min(this.current + amount, this.max);\n * }\n *\n * @BlueprintMethod({\n * displayName: '受伤',\n * params: [{ name: 'amount', type: 'float' }],\n * returnType: 'bool'\n * })\n * takeDamage(amount: number): boolean {\n * this.current -= amount;\n * return this.current <= 0;\n * }\n * }\n * ```\n */\n\nimport type { BlueprintPinType } from '../types/pins';\n\n// ============================================================================\n// Types | 类型定义\n// ============================================================================\n\n/**\n * @zh 参数定义\n * @en Parameter definition\n */\nexport interface BlueprintParamDef {\n /** @zh 参数名称 @en Parameter name */\n name: string;\n /** @zh 显示名称 @en Display name */\n displayName?: string;\n /** @zh 引脚类型 @en Pin type */\n type?: BlueprintPinType;\n /** @zh 默认值 @en Default value */\n defaultValue?: unknown;\n}\n\n/**\n * @zh 蓝图暴露选项\n * @en Blueprint expose options\n */\nexport interface BlueprintExposeOptions {\n /** @zh 组件显示名称 @en Component display name */\n displayName?: string;\n /** @zh 组件描述 @en Component description */\n description?: string;\n /** @zh 组件分类 @en Component category */\n category?: string;\n /** @zh 组件颜色 @en Component color */\n color?: string;\n /** @zh 组件图标 @en Component icon */\n icon?: string;\n}\n\n/**\n * @zh 蓝图属性选项\n * @en Blueprint property options\n */\nexport interface BlueprintPropertyOptions {\n /** @zh 属性显示名称 @en Property display name */\n displayName?: string;\n /** @zh 属性描述 @en Property description */\n description?: string;\n /** @zh 引脚类型 @en Pin type */\n type?: BlueprintPinType;\n /** @zh 是否只读(不生成 Set 节点)@en Readonly (no Set node generated) */\n readonly?: boolean;\n /** @zh 默认值 @en Default value */\n defaultValue?: unknown;\n}\n\n/**\n * @zh 蓝图方法选项\n * @en Blueprint method options\n */\nexport interface BlueprintMethodOptions {\n /** @zh 方法显示名称 @en Method display name */\n displayName?: string;\n /** @zh 方法描述 @en Method description */\n description?: string;\n /** @zh 是否是纯函数(无副作用)@en Is pure function (no side effects) */\n isPure?: boolean;\n /** @zh 参数列表 @en Parameter list */\n params?: BlueprintParamDef[];\n /** @zh 返回值类型 @en Return type */\n returnType?: BlueprintPinType;\n}\n\n/**\n * @zh 属性元数据\n * @en Property metadata\n */\nexport interface PropertyMetadata {\n propertyKey: string;\n displayName: string;\n description?: string;\n pinType: BlueprintPinType;\n readonly: boolean;\n defaultValue?: unknown;\n}\n\n/**\n * @zh 方法元数据\n * @en Method metadata\n */\nexport interface MethodMetadata {\n methodKey: string;\n displayName: string;\n description?: string;\n isPure: boolean;\n params: BlueprintParamDef[];\n returnType: BlueprintPinType;\n}\n\n/**\n * @zh 组件蓝图元数据\n * @en Component blueprint metadata\n */\nexport interface ComponentBlueprintMetadata extends BlueprintExposeOptions {\n componentName: string;\n properties: PropertyMetadata[];\n methods: MethodMetadata[];\n}\n\n// ============================================================================\n// Registry | 注册表\n// ============================================================================\n\n/**\n * @zh 已注册的蓝图组件\n * @en Registered blueprint components\n */\nconst registeredComponents = new Map<Function, ComponentBlueprintMetadata>();\n\n/**\n * @zh 获取所有已注册的蓝图组件\n * @en Get all registered blueprint components\n */\nexport function getRegisteredBlueprintComponents(): Map<Function, ComponentBlueprintMetadata> {\n return registeredComponents;\n}\n\n/**\n * @zh 获取组件的蓝图元数据\n * @en Get blueprint metadata for a component\n */\nexport function getBlueprintMetadata(componentClass: Function): ComponentBlueprintMetadata | undefined {\n return registeredComponents.get(componentClass);\n}\n\n/**\n * @zh 清除所有注册的蓝图组件(用于测试)\n * @en Clear all registered blueprint components (for testing)\n */\nexport function clearRegisteredComponents(): void {\n registeredComponents.clear();\n}\n\n// ============================================================================\n// Internal Helpers | 内部辅助函数\n// ============================================================================\n\nfunction getOrCreateMetadata(constructor: Function): ComponentBlueprintMetadata {\n let metadata = registeredComponents.get(constructor);\n if (!metadata) {\n metadata = {\n componentName: (constructor as any).__componentName__ ?? constructor.name,\n properties: [],\n methods: []\n };\n registeredComponents.set(constructor, metadata);\n }\n return metadata;\n}\n\n// ============================================================================\n// Decorators | 装饰器\n// ============================================================================\n\n/**\n * @zh 标记组件可在蓝图中使用\n * @en Mark component as usable in blueprint\n *\n * @example\n * ```typescript\n * @ECSComponent('Player')\n * @BlueprintExpose({ displayName: '玩家', category: 'gameplay' })\n * export class PlayerComponent extends Component { }\n * ```\n */\nexport function BlueprintExpose(options: BlueprintExposeOptions = {}): ClassDecorator {\n return function (target: Function) {\n const metadata = getOrCreateMetadata(target);\n Object.assign(metadata, options);\n metadata.componentName = (target as any).__componentName__ ?? target.name;\n return target as any;\n };\n}\n\n/**\n * @zh 标记属性可在蓝图中访问\n * @en Mark property as accessible in blueprint\n *\n * @example\n * ```typescript\n * @BlueprintProperty({ displayName: '生命值', type: 'float' })\n * health: number = 100;\n *\n * @BlueprintProperty({ displayName: '名称', type: 'string', readonly: true })\n * name: string = 'Player';\n * ```\n */\nexport function BlueprintProperty(options: BlueprintPropertyOptions = {}): PropertyDecorator {\n return function (target: Object, propertyKey: string | symbol) {\n const key = String(propertyKey);\n const metadata = getOrCreateMetadata(target.constructor);\n\n const propMeta: PropertyMetadata = {\n propertyKey: key,\n displayName: options.displayName ?? key,\n description: options.description,\n pinType: options.type ?? 'any',\n readonly: options.readonly ?? false,\n defaultValue: options.defaultValue\n };\n\n const existingIndex = metadata.properties.findIndex(p => p.propertyKey === key);\n if (existingIndex >= 0) {\n metadata.properties[existingIndex] = propMeta;\n } else {\n metadata.properties.push(propMeta);\n }\n };\n}\n\n/**\n * @zh 标记方法可在蓝图中调用\n * @en Mark method as callable in blueprint\n *\n * @example\n * ```typescript\n * @BlueprintMethod({\n * displayName: '攻击',\n * params: [\n * { name: 'target', type: 'entity' },\n * { name: 'damage', type: 'float' }\n * ],\n * returnType: 'bool'\n * })\n * attack(target: Entity, damage: number): boolean { }\n *\n * @BlueprintMethod({ displayName: '获取速度', isPure: true, returnType: 'float' })\n * getSpeed(): number { return this.speed; }\n * ```\n */\nexport function BlueprintMethod(options: BlueprintMethodOptions = {}): MethodDecorator {\n return function (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) {\n const key = String(propertyKey);\n const metadata = getOrCreateMetadata(target.constructor);\n\n const methodMeta: MethodMetadata = {\n methodKey: key,\n displayName: options.displayName ?? key,\n description: options.description,\n isPure: options.isPure ?? false,\n params: options.params ?? [],\n returnType: options.returnType ?? 'any'\n };\n\n const existingIndex = metadata.methods.findIndex(m => m.methodKey === key);\n if (existingIndex >= 0) {\n metadata.methods[existingIndex] = methodMeta;\n } else {\n metadata.methods.push(methodMeta);\n }\n\n return descriptor;\n };\n}\n\n// ============================================================================\n// Utility Functions | 工具函数\n// ============================================================================\n\n/**\n * @zh 从 TypeScript 类型名推断蓝图引脚类型\n * @en Infer blueprint pin type from TypeScript type name\n */\nexport function inferPinType(typeName: string): BlueprintPinType {\n const typeMap: Record<string, BlueprintPinType> = {\n 'number': 'float',\n 'Number': 'float',\n 'string': 'string',\n 'String': 'string',\n 'boolean': 'bool',\n 'Boolean': 'bool',\n 'Entity': 'entity',\n 'Component': 'component',\n 'Vector2': 'vector2',\n 'Vec2': 'vector2',\n 'Vector3': 'vector3',\n 'Vec3': 'vector3',\n 'Color': 'color',\n 'Array': 'array',\n 'Object': 'object',\n 'void': 'exec',\n 'undefined': 'exec'\n };\n\n return typeMap[typeName] ?? 'any';\n}\n","/**\n * Execution Context - Runtime context for blueprint execution\n * 执行上下文 - 蓝图执行的运行时上下文\n */\n\nimport type { Entity, IScene, Component } from '@esengine/ecs-framework';\nimport { BlueprintNode, BlueprintConnection } from '../types/nodes';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { getRegisteredBlueprintComponents } from '../registry/BlueprintDecorators';\n\n/**\n * Result of node execution\n * 节点执行的结果\n */\nexport interface ExecutionResult {\n /**\n * Next exec pin to follow (null to stop, undefined to continue default)\n * 下一个要执行的引脚(null 停止,undefined 继续默认)\n */\n nextExec?: string | null;\n\n /**\n * Output values by pin name\n * 按引脚名称的输出值\n */\n outputs?: Record<string, unknown>;\n\n /**\n * Whether to yield execution (for async operations)\n * 是否暂停执行(用于异步操作)\n */\n yield?: boolean;\n\n /**\n * Delay before continuing (in seconds)\n * 继续前的延迟(秒)\n */\n delay?: number;\n\n /**\n * Error message if execution failed\n * 执行失败时的错误消息\n */\n error?: string;\n}\n\n/**\n * Execution context provides access to runtime services\n * 执行上下文提供对运行时服务的访问\n */\nexport class ExecutionContext {\n /** Current blueprint asset (当前蓝图资产) */\n readonly blueprint: BlueprintAsset;\n\n /** Owner entity (所有者实体) */\n readonly entity: Entity;\n\n /** Current scene (当前场景) */\n readonly scene: IScene;\n\n /** Frame delta time (帧增量时间) */\n deltaTime: number = 0;\n\n /** Total time since start (开始以来的总时间) */\n time: number = 0;\n\n /** Instance variables (实例变量) */\n private _instanceVariables: Map<string, unknown> = new Map();\n\n /** Local variables (per-execution) (局部变量,每次执行) */\n private _localVariables: Map<string, unknown> = new Map();\n\n /** Global variables (shared) (全局变量,共享) */\n private static _globalVariables: Map<string, unknown> = new Map();\n\n /** Component class registry (组件类注册表) */\n private static _componentRegistry: Map<string, new () => Component> = new Map();\n\n /** Node output cache for current execution (当前执行的节点输出缓存) */\n private _outputCache: Map<string, Record<string, unknown>> = new Map();\n\n /** Connection lookup by target (按目标的连接查找) */\n private _connectionsByTarget: Map<string, BlueprintConnection[]> = new Map();\n\n /** Connection lookup by source (按源的连接查找) */\n private _connectionsBySource: Map<string, BlueprintConnection[]> = new Map();\n\n constructor(blueprint: BlueprintAsset, entity: Entity, scene: IScene) {\n this.blueprint = blueprint;\n this.entity = entity;\n this.scene = scene;\n\n // Initialize instance variables with defaults\n // 使用默认值初始化实例变量\n for (const variable of blueprint.variables) {\n if (variable.scope === 'instance') {\n this._instanceVariables.set(variable.name, variable.defaultValue);\n }\n }\n\n // Build connection lookup maps\n // 构建连接查找映射\n this._buildConnectionMaps();\n }\n\n private _buildConnectionMaps(): void {\n for (const conn of this.blueprint.connections) {\n // By target\n const targetKey = `${conn.toNodeId}.${conn.toPin}`;\n if (!this._connectionsByTarget.has(targetKey)) {\n this._connectionsByTarget.set(targetKey, []);\n }\n this._connectionsByTarget.get(targetKey)!.push(conn);\n\n // By source\n const sourceKey = `${conn.fromNodeId}.${conn.fromPin}`;\n if (!this._connectionsBySource.has(sourceKey)) {\n this._connectionsBySource.set(sourceKey, []);\n }\n this._connectionsBySource.get(sourceKey)!.push(conn);\n }\n }\n\n /**\n * Get a node by ID\n * 通过ID获取节点\n */\n getNode(nodeId: string): BlueprintNode | undefined {\n return this.blueprint.nodes.find(n => n.id === nodeId);\n }\n\n /**\n * Get connections to a target pin\n * 获取到目标引脚的连接\n */\n getConnectionsToPin(nodeId: string, pinName: string): BlueprintConnection[] {\n return this._connectionsByTarget.get(`${nodeId}.${pinName}`) ?? [];\n }\n\n /**\n * Get connections from a source pin\n * 获取从源引脚的连接\n */\n getConnectionsFromPin(nodeId: string, pinName: string): BlueprintConnection[] {\n return this._connectionsBySource.get(`${nodeId}.${pinName}`) ?? [];\n }\n\n /**\n * Evaluate an input pin value (follows connections or uses default)\n * 计算输入引脚值(跟随连接或使用默认值)\n */\n evaluateInput(nodeId: string, pinName: string, defaultValue?: unknown): unknown {\n const connections = this.getConnectionsToPin(nodeId, pinName);\n\n if (connections.length === 0) {\n // Use default from node data or provided default\n // 使用节点数据的默认值或提供的默认值\n const node = this.getNode(nodeId);\n return node?.data[pinName] ?? defaultValue;\n }\n\n // Get value from connected output\n // 从连接的输出获取值\n const conn = connections[0];\n const cachedOutputs = this._outputCache.get(conn.fromNodeId);\n\n if (cachedOutputs && conn.fromPin in cachedOutputs) {\n return cachedOutputs[conn.fromPin];\n }\n\n // Need to execute the source node first (lazy evaluation)\n // 需要先执行源节点(延迟求值)\n return defaultValue;\n }\n\n /**\n * Set output values for a node (cached for current execution)\n * 设置节点的输出值(为当前执行缓存)\n */\n setOutputs(nodeId: string, outputs: Record<string, unknown>): void {\n this._outputCache.set(nodeId, outputs);\n }\n\n /**\n * Get cached outputs for a node\n * 获取节点的缓存输出\n */\n getOutputs(nodeId: string): Record<string, unknown> | undefined {\n return this._outputCache.get(nodeId);\n }\n\n /**\n * Clear output cache (call at start of new execution)\n * 清除输出缓存(在新执行开始时调用)\n */\n clearOutputCache(): void {\n this._outputCache.clear();\n this._localVariables.clear();\n }\n\n /**\n * Get a variable value\n * 获取变量值\n */\n getVariable(name: string): unknown {\n // Check local first, then instance, then global\n // 先检查局部,然后实例,然后全局\n if (this._localVariables.has(name)) {\n return this._localVariables.get(name);\n }\n if (this._instanceVariables.has(name)) {\n return this._instanceVariables.get(name);\n }\n if (ExecutionContext._globalVariables.has(name)) {\n return ExecutionContext._globalVariables.get(name);\n }\n\n // Return default from variable definition\n // 返回变量定义的默认值\n const varDef = this.blueprint.variables.find(v => v.name === name);\n return varDef?.defaultValue;\n }\n\n /**\n * Set a variable value\n * 设置变量值\n */\n setVariable(name: string, value: unknown): void {\n const varDef = this.blueprint.variables.find(v => v.name === name);\n\n if (!varDef) {\n // Treat unknown variables as local\n // 将未知变量视为局部变量\n this._localVariables.set(name, value);\n return;\n }\n\n switch (varDef.scope) {\n case 'local':\n this._localVariables.set(name, value);\n break;\n case 'instance':\n this._instanceVariables.set(name, value);\n break;\n case 'global':\n ExecutionContext._globalVariables.set(name, value);\n break;\n }\n }\n\n /**\n * Get all instance variables (for serialization)\n * 获取所有实例变量(用于序列化)\n */\n getInstanceVariables(): Map<string, unknown> {\n return new Map(this._instanceVariables);\n }\n\n /**\n * Set instance variables (for deserialization)\n * 设置实例变量(用于反序列化)\n */\n setInstanceVariables(variables: Map<string, unknown>): void {\n this._instanceVariables = new Map(variables);\n }\n\n /**\n * Clear global variables (for scene reset)\n * 清除全局变量(用于场景重置)\n */\n static clearGlobalVariables(): void {\n ExecutionContext._globalVariables.clear();\n }\n\n /**\n * Get a component class by name\n * 通过名称获取组件类\n *\n * @zh 首先检查 @BlueprintExpose 装饰的组件,然后检查手动注册的组件\n * @en First checks @BlueprintExpose decorated components, then manually registered ones\n */\n getComponentClass(typeName: string): (new () => Component) | undefined {\n // First check registered blueprint components\n const blueprintComponents = getRegisteredBlueprintComponents();\n for (const [componentClass, metadata] of blueprintComponents) {\n if (metadata.componentName === typeName ||\n componentClass.name === typeName) {\n return componentClass as new () => Component;\n }\n }\n\n // Then check manual registry\n return ExecutionContext._componentRegistry.get(typeName);\n }\n\n /**\n * Register a component class for dynamic creation\n * 注册组件类以支持动态创建\n */\n static registerComponentClass(typeName: string, componentClass: new () => Component): void {\n ExecutionContext._componentRegistry.set(typeName, componentClass);\n }\n\n /**\n * Unregister a component class\n * 取消注册组件类\n */\n static unregisterComponentClass(typeName: string): void {\n ExecutionContext._componentRegistry.delete(typeName);\n }\n\n /**\n * Get all registered component classes\n * 获取所有已注册的组件类\n */\n static getRegisteredComponentClasses(): Map<string, new () => Component> {\n return new Map(ExecutionContext._componentRegistry);\n }\n}\n","/**\n * Node Registry - Manages node templates and executors\n * 节点注册表 - 管理节点模板和执行器\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../types/nodes';\nimport { ExecutionContext, ExecutionResult } from './ExecutionContext';\n\n/**\n * Node executor interface - implements the logic for a node type\n * 节点执行器接口 - 实现节点类型的逻辑\n */\nexport interface INodeExecutor {\n /**\n * Execute the node\n * 执行节点\n *\n * @param node - Node instance (节点实例)\n * @param context - Execution context (执行上下文)\n * @returns Execution result (执行结果)\n */\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult;\n}\n\n/**\n * Node definition combines template with executor\n * 节点定义组合模板和执行器\n */\nexport interface NodeDefinition {\n template: BlueprintNodeTemplate;\n executor: INodeExecutor;\n}\n\n/**\n * Node Registry - singleton that holds all registered node types\n * 节点注册表 - 持有所有注册节点类型的单例\n */\nexport class NodeRegistry {\n private static _instance: NodeRegistry;\n private _nodes: Map<string, NodeDefinition> = new Map();\n\n private constructor() {}\n\n static get instance(): NodeRegistry {\n if (!NodeRegistry._instance) {\n NodeRegistry._instance = new NodeRegistry();\n }\n return NodeRegistry._instance;\n }\n\n /**\n * Register a node type\n * 注册节点类型\n */\n register(template: BlueprintNodeTemplate, executor: INodeExecutor): void {\n if (this._nodes.has(template.type)) {\n console.warn(`Node type \"${template.type}\" is already registered, overwriting`);\n }\n this._nodes.set(template.type, { template, executor });\n }\n\n /**\n * Get a node definition by type\n * 通过类型获取节点定义\n */\n get(type: string): NodeDefinition | undefined {\n return this._nodes.get(type);\n }\n\n /**\n * Get node template by type\n * 通过类型获取节点模板\n */\n getTemplate(type: string): BlueprintNodeTemplate | undefined {\n return this._nodes.get(type)?.template;\n }\n\n /**\n * Get node executor by type\n * 通过类型获取节点执行器\n */\n getExecutor(type: string): INodeExecutor | undefined {\n return this._nodes.get(type)?.executor;\n }\n\n /**\n * Check if a node type is registered\n * 检查节点类型是否已注册\n */\n has(type: string): boolean {\n return this._nodes.has(type);\n }\n\n /**\n * Get all registered templates\n * 获取所有注册的模板\n */\n getAllTemplates(): BlueprintNodeTemplate[] {\n return Array.from(this._nodes.values()).map(d => d.template);\n }\n\n /**\n * Get templates by category\n * 按类别获取模板\n */\n getTemplatesByCategory(category: string): BlueprintNodeTemplate[] {\n return this.getAllTemplates().filter(t => t.category === category);\n }\n\n /**\n * Search templates by keyword\n * 按关键词搜索模板\n */\n searchTemplates(keyword: string): BlueprintNodeTemplate[] {\n const lower = keyword.toLowerCase();\n return this.getAllTemplates().filter(t =>\n t.title.toLowerCase().includes(lower) ||\n t.type.toLowerCase().includes(lower) ||\n t.keywords?.some(k => k.toLowerCase().includes(lower)) ||\n t.description?.toLowerCase().includes(lower)\n );\n }\n\n /**\n * Clear all registrations (for testing)\n * 清除所有注册(用于测试)\n */\n clear(): void {\n this._nodes.clear();\n }\n}\n\n/**\n * Decorator for registering node executors\n * 用于注册节点执行器的装饰器\n *\n * @example\n * ```typescript\n * @RegisterNode(EventTickTemplate)\n * class EventTickExecutor implements INodeExecutor {\n * execute(node, context) { ... }\n * }\n * ```\n */\nexport function RegisterNode(template: BlueprintNodeTemplate) {\n return function<T extends new () => INodeExecutor>(constructor: T) {\n const executor = new constructor();\n NodeRegistry.instance.register(template, executor);\n return constructor;\n };\n}\n","/**\n * Blueprint Virtual Machine - Executes blueprint graphs\n * 蓝图虚拟机 - 执行蓝图图\n */\n\nimport type { Entity, IScene } from '@esengine/ecs-framework';\nimport { BlueprintNode } from '../types/nodes';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { ExecutionContext, ExecutionResult } from './ExecutionContext';\nimport { NodeRegistry } from './NodeRegistry';\n\n/**\n * Pending execution frame (for delayed/async execution)\n * 待处理的执行帧(用于延迟/异步执行)\n */\ninterface PendingExecution {\n nodeId: string;\n execPin: string;\n resumeTime: number;\n}\n\n/**\n * Event trigger types\n * 事件触发类型\n */\nexport type EventType =\n | 'BeginPlay'\n | 'Tick'\n | 'EndPlay'\n | 'Collision'\n | 'TriggerEnter'\n | 'TriggerExit'\n | 'Custom';\n\n/**\n * Blueprint Virtual Machine\n * 蓝图虚拟机\n */\nexport class BlueprintVM {\n /** Execution context (执行上下文) */\n private _context: ExecutionContext;\n\n /** Pending executions (delayed nodes) (待处理的执行) */\n private _pendingExecutions: PendingExecution[] = [];\n\n /** Event node cache by type (按类型缓存的事件节点) */\n private _eventNodes: Map<string, BlueprintNode[]> = new Map();\n\n /** Whether the VM is running (VM 是否运行中) */\n private _isRunning: boolean = false;\n\n /** Current execution time (当前执行时间) */\n private _currentTime: number = 0;\n\n /** Maximum execution steps per frame (每帧最大执行步骤) */\n private _maxStepsPerFrame: number = 1000;\n\n /** Debug mode (调试模式) */\n debug: boolean = false;\n\n constructor(blueprint: BlueprintAsset, entity: Entity, scene: IScene) {\n this._context = new ExecutionContext(blueprint, entity, scene);\n this._cacheEventNodes();\n }\n\n get context(): ExecutionContext {\n return this._context;\n }\n\n get isRunning(): boolean {\n return this._isRunning;\n }\n\n /**\n * Cache event nodes by type for quick lookup\n * 按类型缓存事件节点以便快速查找\n */\n private _cacheEventNodes(): void {\n for (const node of this._context.blueprint.nodes) {\n // Event nodes start with \"Event\"\n // 事件节点以 \"Event\" 开头\n if (node.type.startsWith('Event')) {\n const eventType = node.type;\n if (!this._eventNodes.has(eventType)) {\n this._eventNodes.set(eventType, []);\n }\n this._eventNodes.get(eventType)!.push(node);\n }\n }\n }\n\n /**\n * Start the VM\n * 启动 VM\n */\n start(): void {\n this._isRunning = true;\n this._currentTime = 0;\n\n // Trigger BeginPlay event\n // 触发 BeginPlay 事件\n this.triggerEvent('EventBeginPlay');\n }\n\n /**\n * Stop the VM\n * 停止 VM\n */\n stop(): void {\n // Trigger EndPlay event\n // 触发 EndPlay 事件\n this.triggerEvent('EventEndPlay');\n\n this._isRunning = false;\n this._pendingExecutions = [];\n }\n\n /**\n * Pause the VM\n * 暂停 VM\n */\n pause(): void {\n this._isRunning = false;\n }\n\n /**\n * Resume the VM\n * 恢复 VM\n */\n resume(): void {\n this._isRunning = true;\n }\n\n /**\n * Update the VM (called every frame)\n * 更新 VM(每帧调用)\n */\n tick(deltaTime: number): void {\n if (!this._isRunning) return;\n\n this._currentTime += deltaTime;\n this._context.deltaTime = deltaTime;\n this._context.time = this._currentTime;\n\n // Process pending delayed executions\n // 处理待处理的延迟执行\n this._processPendingExecutions();\n\n // Trigger Tick event\n // 触发 Tick 事件\n this.triggerEvent('EventTick');\n }\n\n /**\n * Trigger an event by type\n * 按类型触发事件\n */\n triggerEvent(eventType: string, data?: Record<string, unknown>): void {\n const eventNodes = this._eventNodes.get(eventType);\n if (!eventNodes) return;\n\n for (const node of eventNodes) {\n this._executeFromNode(node, 'exec', data);\n }\n }\n\n /**\n * Trigger a custom event by name\n * 按名称触发自定义事件\n */\n triggerCustomEvent(eventName: string, data?: Record<string, unknown>): void {\n const eventNodes = this._eventNodes.get('EventCustom');\n if (!eventNodes) return;\n\n for (const node of eventNodes) {\n if (node.data.eventName === eventName) {\n this._executeFromNode(node, 'exec', data);\n }\n }\n }\n\n /**\n * Execute from a starting node\n * 从起始节点执行\n */\n private _executeFromNode(\n startNode: BlueprintNode,\n startPin: string,\n eventData?: Record<string, unknown>\n ): void {\n // Clear output cache for new execution\n // 为新执行清除输出缓存\n this._context.clearOutputCache();\n\n // Set event data as node outputs\n // 设置事件数据为节点输出\n if (eventData) {\n this._context.setOutputs(startNode.id, eventData);\n }\n\n // Follow execution chain\n // 跟随执行链\n let currentNodeId: string | null = startNode.id;\n let currentPin: string = startPin;\n let steps = 0;\n\n while (currentNodeId && steps < this._maxStepsPerFrame) {\n steps++;\n\n // Get connected nodes from current exec pin\n // 从当前执行引脚获取连接的节点\n const connections = this._context.getConnectionsFromPin(currentNodeId, currentPin);\n\n if (connections.length === 0) {\n // No more connections, end execution\n // 没有更多连接,结束执行\n break;\n }\n\n // Execute connected node\n // 执行连接的节点\n const nextConn = connections[0];\n const result = this._executeNode(nextConn.toNodeId);\n\n if (result.error) {\n console.error(`Blueprint error in node ${nextConn.toNodeId}: ${result.error}`);\n break;\n }\n\n if (result.delay && result.delay > 0) {\n // Schedule delayed execution\n // 安排延迟执行\n this._pendingExecutions.push({\n nodeId: nextConn.toNodeId,\n execPin: result.nextExec ?? 'exec',\n resumeTime: this._currentTime + result.delay\n });\n break;\n }\n\n if (result.yield) {\n // Yield execution until next frame\n // 暂停执行直到下一帧\n break;\n }\n\n if (result.nextExec === null) {\n // Explicitly stop execution\n // 显式停止执行\n break;\n }\n\n // Continue to next node\n // 继续到下一个节点\n currentNodeId = nextConn.toNodeId;\n currentPin = result.nextExec ?? 'exec';\n }\n\n if (steps >= this._maxStepsPerFrame) {\n console.warn('Blueprint execution exceeded maximum steps, possible infinite loop');\n }\n }\n\n /**\n * Execute a single node\n * 执行单个节点\n */\n private _executeNode(nodeId: string): ExecutionResult {\n const node = this._context.getNode(nodeId);\n if (!node) {\n return { error: `Node not found: ${nodeId}` };\n }\n\n const executor = NodeRegistry.instance.getExecutor(node.type);\n if (!executor) {\n return { error: `No executor for node type: ${node.type}` };\n }\n\n try {\n if (this.debug) {\n console.log(`[Blueprint] Executing: ${node.type} (${nodeId})`);\n }\n\n const result = executor.execute(node, this._context);\n\n // Cache outputs\n // 缓存输出\n if (result.outputs) {\n this._context.setOutputs(nodeId, result.outputs);\n }\n\n return result;\n } catch (error) {\n return { error: `Execution error: ${error}` };\n }\n }\n\n /**\n * Process pending delayed executions\n * 处理待处理的延迟执行\n */\n private _processPendingExecutions(): void {\n const stillPending: PendingExecution[] = [];\n\n for (const pending of this._pendingExecutions) {\n if (this._currentTime >= pending.resumeTime) {\n // Resume execution\n // 恢复执行\n const node = this._context.getNode(pending.nodeId);\n if (node) {\n this._executeFromNode(node, pending.execPin);\n }\n } else {\n stillPending.push(pending);\n }\n }\n\n this._pendingExecutions = stillPending;\n }\n\n /**\n * Get instance variables for serialization\n * 获取实例变量用于序列化\n */\n getInstanceVariables(): Map<string, unknown> {\n return this._context.getInstanceVariables();\n }\n\n /**\n * Set instance variables from serialization\n * 从序列化设置实例变量\n */\n setInstanceVariables(variables: Map<string, unknown>): void {\n this._context.setInstanceVariables(variables);\n }\n}\n","/**\n * @zh 蓝图组件 - 将蓝图附加到实体\n * @en Blueprint Component - Attaches a blueprint to an entity\n */\n\nimport { Component, ECSComponent, type Entity, type IScene } from '@esengine/ecs-framework';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { BlueprintVM } from './BlueprintVM';\n\n/**\n * @zh 蓝图组件,用于将可视化脚本附加到 ECS 实体\n * @en Blueprint component for attaching visual scripts to ECS entities\n *\n * @example\n * ```typescript\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * blueprint.autoStart = true;\n * entity.addComponent(blueprint);\n * ```\n */\n@ECSComponent('Blueprint')\nexport class BlueprintComponent extends Component {\n /**\n * @zh 蓝图资产引用\n * @en Blueprint asset reference\n */\n blueprintAsset: BlueprintAsset | null = null;\n\n /**\n * @zh 用于序列化的蓝图资产路径\n * @en Blueprint asset path for serialization\n */\n blueprintPath: string = '';\n\n /**\n * @zh 实体创建时自动开始执行\n * @en Auto-start execution when entity is created\n */\n autoStart: boolean = true;\n\n /**\n * @zh 启用 VM 调试模式\n * @en Enable debug mode for VM\n */\n debug: boolean = false;\n\n /**\n * @zh 运行时 VM 实例\n * @en Runtime VM instance\n */\n vm: BlueprintVM | null = null;\n\n /**\n * @zh 蓝图是否已启动\n * @en Whether the blueprint has started\n */\n isStarted: boolean = false;\n\n /**\n * @zh 初始化蓝图 VM\n * @en Initialize blueprint VM\n */\n initialize(entity: Entity, scene: IScene): void {\n if (!this.blueprintAsset) return;\n\n this.vm = new BlueprintVM(this.blueprintAsset, entity, scene);\n this.vm.debug = this.debug;\n }\n\n /**\n * @zh 开始执行蓝图\n * @en Start blueprint execution\n */\n start(): void {\n if (this.vm && !this.isStarted) {\n this.vm.start();\n this.isStarted = true;\n }\n }\n\n /**\n * @zh 停止执行蓝图\n * @en Stop blueprint execution\n */\n stop(): void {\n if (this.vm && this.isStarted) {\n this.vm.stop();\n this.isStarted = false;\n }\n }\n\n /**\n * @zh 更新蓝图\n * @en Update blueprint\n */\n tick(deltaTime: number): void {\n if (this.vm && this.isStarted) {\n this.vm.tick(deltaTime);\n }\n }\n\n /**\n * @zh 清理蓝图资源\n * @en Cleanup blueprint resources\n */\n cleanup(): void {\n if (this.vm) {\n if (this.isStarted) {\n this.vm.stop();\n }\n this.vm = null;\n this.isStarted = false;\n }\n }\n}\n","/**\n * @zh 蓝图系统 - 处理所有带有 BlueprintComponent 的实体\n * @en Blueprint System - Processes all entities with BlueprintComponent\n */\n\nimport { EntitySystem, Matcher, ECSSystem, type Entity, Time } from '@esengine/ecs-framework';\nimport { BlueprintComponent } from './BlueprintComponent';\nimport { registerAllComponentNodes } from '../registry';\n\n/**\n * @zh 蓝图执行系统\n * @en Blueprint execution system\n *\n * @zh 自动处理所有带有 BlueprintComponent 的实体,管理蓝图的初始化、执行和清理\n * @en Automatically processes all entities with BlueprintComponent, manages blueprint initialization, execution and cleanup\n *\n * @example\n * ```typescript\n * import { BlueprintSystem } from '@esengine/blueprint';\n *\n * // 添加到场景\n * scene.addSystem(new BlueprintSystem());\n *\n * // 为实体添加蓝图\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * entity.addComponent(blueprint);\n * ```\n */\n@ECSSystem('BlueprintSystem')\nexport class BlueprintSystem extends EntitySystem {\n private _componentsRegistered = false;\n\n constructor() {\n super(Matcher.all(BlueprintComponent));\n }\n\n /**\n * @zh 系统初始化时注册所有组件节点\n * @en Register all component nodes when system initializes\n */\n protected override onInitialize(): void {\n if (!this._componentsRegistered) {\n registerAllComponentNodes();\n this._componentsRegistered = true;\n }\n }\n\n /**\n * @zh 处理所有带有蓝图组件的实体\n * @en Process all entities with blueprint components\n */\n protected override process(entities: readonly Entity[]): void {\n const dt = Time.deltaTime;\n\n for (const entity of entities) {\n const blueprint = entity.getComponent(BlueprintComponent);\n if (!blueprint?.blueprintAsset) continue;\n\n // 初始化 VM\n if (!blueprint.vm) {\n blueprint.initialize(entity, this.scene!);\n }\n\n // 自动启动\n if (blueprint.autoStart && !blueprint.isStarted) {\n blueprint.start();\n }\n\n // 每帧更新\n blueprint.tick(dt);\n }\n }\n\n /**\n * @zh 实体移除时清理蓝图资源\n * @en Cleanup blueprint resources when entity is removed\n */\n protected override onRemoved(entity: Entity): void {\n const blueprint = entity.getComponent(BlueprintComponent);\n if (blueprint) {\n blueprint.cleanup();\n }\n }\n}\n","/**\n * @zh 组件节点生成器 - 自动为标记的组件生成蓝图节点\n * @en Component Node Generator - Auto-generate blueprint nodes for marked components\n *\n * @zh 根据 @BlueprintExpose、@BlueprintProperty、@BlueprintMethod 装饰器\n * 自动生成对应的 Get/Set/Call 节点并注册到 NodeRegistry\n *\n * @en Based on @BlueprintExpose, @BlueprintProperty, @BlueprintMethod decorators,\n * auto-generate corresponding Get/Set/Call nodes and register to NodeRegistry\n */\n\nimport type { Component, Entity } from '@esengine/ecs-framework';\nimport type { BlueprintNodeTemplate, BlueprintNode } from '../types/nodes';\nimport type { BlueprintPinType } from '../types/pins';\nimport type { ExecutionContext, ExecutionResult } from '../runtime/ExecutionContext';\nimport type { INodeExecutor } from '../runtime/NodeRegistry';\nimport { NodeRegistry } from '../runtime/NodeRegistry';\nimport {\n getRegisteredBlueprintComponents,\n type ComponentBlueprintMetadata,\n type PropertyMetadata,\n type MethodMetadata\n} from './BlueprintDecorators';\n\n// ============================================================================\n// Node Generator | 节点生成器\n// ============================================================================\n\n/**\n * @zh 为组件生成所有蓝图节点\n * @en Generate all blueprint nodes for a component\n */\nexport function generateComponentNodes(\n componentClass: Function,\n metadata: ComponentBlueprintMetadata\n): void {\n const { componentName, properties, methods } = metadata;\n const category = metadata.category ?? 'component';\n const color = metadata.color ?? '#1e8b8b';\n\n // Generate Add/Get component nodes\n generateAddComponentNode(componentClass, componentName, metadata, color);\n generateGetComponentNode(componentClass, componentName, metadata, color);\n\n for (const prop of properties) {\n generatePropertyGetNode(componentName, prop, category, color);\n if (!prop.readonly) {\n generatePropertySetNode(componentName, prop, category, color);\n }\n }\n\n for (const method of methods) {\n generateMethodCallNode(componentName, method, category, color);\n }\n}\n\n/**\n * @zh 生成 Add Component 节点\n * @en Generate Add Component node\n */\nfunction generateAddComponentNode(\n componentClass: Function,\n componentName: string,\n metadata: ComponentBlueprintMetadata,\n color: string\n): void {\n const nodeType = `Add_${componentName}`;\n const displayName = metadata.displayName ?? componentName;\n\n // Build input pins for initial property values\n const propertyInputs: BlueprintNodeTemplate['inputs'] = [];\n const propertyDefaults: Record<string, unknown> = {};\n\n for (const prop of metadata.properties) {\n if (!prop.readonly) {\n propertyInputs.push({\n name: prop.propertyKey,\n type: prop.pinType,\n displayName: prop.displayName,\n defaultValue: prop.defaultValue\n });\n propertyDefaults[prop.propertyKey] = prop.defaultValue;\n }\n }\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Add ${displayName}`,\n category: 'component',\n color,\n description: `Adds ${displayName} component to entity (为实体添加 ${displayName} 组件)`,\n keywords: ['add', 'component', 'create', componentName.toLowerCase()],\n menuPath: ['Components', displayName, `Add ${displayName}`],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n ...propertyInputs\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: displayName },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n };\n\n const propertyKeys = metadata.properties\n .filter(p => !p.readonly)\n .map(p => p.propertyKey);\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n // Check if component already exists\n const existing = entity.components.find(c =>\n c.constructor === componentClass ||\n c.constructor.name === componentName ||\n (c.constructor as any).__componentName__ === componentName\n );\n\n if (existing) {\n // Component already exists, return it\n return { outputs: { component: existing, success: false }, nextExec: 'exec' };\n }\n\n try {\n // Create new component instance\n const component = new (componentClass as new () => Component)();\n\n // Set initial property values from inputs\n for (const key of propertyKeys) {\n const value = context.evaluateInput(node.id, key, propertyDefaults[key]);\n if (value !== undefined) {\n (component as any)[key] = value;\n }\n }\n\n // Add to entity\n entity.addComponent(component);\n\n return { outputs: { component, success: true }, nextExec: 'exec' };\n } catch (error) {\n console.error(`[Blueprint] Failed to add ${componentName}:`, error);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成 Get Component 节点\n * @en Generate Get Component node\n */\nfunction generateGetComponentNode(\n componentClass: Function,\n componentName: string,\n metadata: ComponentBlueprintMetadata,\n color: string\n): void {\n const nodeType = `Get_${componentName}`;\n const displayName = metadata.displayName ?? componentName;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Get ${displayName}`,\n category: 'component',\n color,\n isPure: true,\n description: `Gets ${displayName} component from entity (从实体获取 ${displayName} 组件)`,\n keywords: ['get', 'component', componentName.toLowerCase()],\n menuPath: ['Components', displayName, `Get ${displayName}`],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'component', type: 'component', displayName: displayName },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n };\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { component: null, found: false } };\n }\n\n const component = entity.components.find(c =>\n c.constructor === componentClass ||\n c.constructor.name === componentName ||\n (c.constructor as any).__componentName__ === componentName\n );\n\n return {\n outputs: {\n component: component ?? null,\n found: component != null\n }\n };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成属性 Get 节点\n * @en Generate property Get node\n */\nfunction generatePropertyGetNode(\n componentName: string,\n prop: PropertyMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Get_${componentName}_${prop.propertyKey}`;\n const { displayName, pinType } = prop;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Get ${displayName}`,\n subtitle: componentName,\n category: category as any,\n color,\n isPure: true,\n description: prop.description ?? `Gets ${displayName} from ${componentName} (从 ${componentName} 获取 ${displayName})`,\n keywords: ['get', 'property', componentName.toLowerCase(), prop.propertyKey.toLowerCase()],\n menuPath: ['Components', componentName, `Get ${displayName}`],\n inputs: [\n { name: 'component', type: 'component', displayName: componentName }\n ],\n outputs: [\n { name: 'value', type: pinType, displayName }\n ]\n };\n\n const propertyKey = prop.propertyKey;\n const defaultValue = prop.defaultValue;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return { outputs: { value: defaultValue ?? null } };\n }\n\n const value = (component as any)[propertyKey];\n return { outputs: { value } };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成属性 Set 节点\n * @en Generate property Set node\n */\nfunction generatePropertySetNode(\n componentName: string,\n prop: PropertyMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Set_${componentName}_${prop.propertyKey}`;\n const { displayName, pinType, defaultValue } = prop;\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: `Set ${displayName}`,\n subtitle: componentName,\n category: category as any,\n color,\n description: prop.description ?? `Sets ${displayName} on ${componentName} (设置 ${componentName} 的 ${displayName})`,\n keywords: ['set', 'property', componentName.toLowerCase(), prop.propertyKey.toLowerCase()],\n menuPath: ['Components', componentName, `Set ${displayName}`],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: componentName },\n { name: 'value', type: pinType, displayName, defaultValue }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n };\n\n const propertyKey = prop.propertyKey;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const value = context.evaluateInput(node.id, 'value', defaultValue);\n\n if (component) {\n (component as any)[propertyKey] = value;\n }\n\n return { nextExec: 'exec' };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n/**\n * @zh 生成方法调用节点\n * @en Generate method call node\n */\nfunction generateMethodCallNode(\n componentName: string,\n method: MethodMetadata,\n category: string,\n color: string\n): void {\n const nodeType = `Call_${componentName}_${method.methodKey}`;\n const { displayName, isPure, params, returnType } = method;\n\n const inputs: BlueprintNodeTemplate['inputs'] = [];\n\n if (!isPure) {\n inputs.push({ name: 'exec', type: 'exec', displayName: '' });\n }\n\n inputs.push({ name: 'component', type: 'component', displayName: componentName });\n\n const paramNames: string[] = [];\n for (const param of params) {\n inputs.push({\n name: param.name,\n type: param.type ?? 'any',\n displayName: param.displayName ?? param.name,\n defaultValue: param.defaultValue\n });\n paramNames.push(param.name);\n }\n\n const outputs: BlueprintNodeTemplate['outputs'] = [];\n\n if (!isPure) {\n outputs.push({ name: 'exec', type: 'exec', displayName: '' });\n }\n\n if (returnType !== 'exec' && returnType !== 'any') {\n outputs.push({\n name: 'result',\n type: returnType as BlueprintPinType,\n displayName: 'Result'\n });\n }\n\n const template: BlueprintNodeTemplate = {\n type: nodeType,\n title: displayName,\n subtitle: componentName,\n category: category as any,\n color,\n isPure,\n description: method.description ?? `Calls ${displayName} on ${componentName} (调用 ${componentName} 的 ${displayName})`,\n keywords: ['call', 'method', componentName.toLowerCase(), method.methodKey.toLowerCase()],\n menuPath: ['Components', componentName, displayName],\n inputs,\n outputs\n };\n\n const methodKey = method.methodKey;\n\n const executor: INodeExecutor = {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return isPure ? { outputs: { result: null } } : { nextExec: 'exec' };\n }\n\n const args: unknown[] = paramNames.map(name =>\n context.evaluateInput(node.id, name, undefined)\n );\n\n const fn = (component as any)[methodKey];\n if (typeof fn !== 'function') {\n console.warn(`Method ${methodKey} not found on component ${componentName}`);\n return isPure ? { outputs: { result: null } } : { nextExec: 'exec' };\n }\n\n const result = fn.apply(component, args);\n\n return isPure\n ? { outputs: { result } }\n : { outputs: { result }, nextExec: 'exec' };\n }\n };\n\n NodeRegistry.instance.register(template, executor);\n}\n\n// ============================================================================\n// Registration | 注册\n// ============================================================================\n\n/**\n * @zh 注册所有已标记的组件节点\n * @en Register all marked component nodes\n *\n * @zh 应该在蓝图系统初始化时调用,会扫描所有使用 @BlueprintExpose 装饰的组件\n * 并自动生成对应的蓝图节点\n *\n * @en Should be called during blueprint system initialization, scans all components\n * decorated with @BlueprintExpose and auto-generates corresponding blueprint nodes\n */\nexport function registerAllComponentNodes(): void {\n const components = getRegisteredBlueprintComponents();\n\n for (const [componentClass, metadata] of components) {\n try {\n generateComponentNodes(componentClass, metadata);\n console.log(`[Blueprint] Registered component: ${metadata.componentName} (${metadata.properties.length} properties, ${metadata.methods.length} methods)`);\n } catch (error) {\n console.error(`[Blueprint] Failed to register component ${metadata.componentName}:`, error);\n }\n }\n\n console.log(`[Blueprint] Registered ${components.size} component(s)`);\n}\n\n/**\n * @zh 手动注册单个组件\n * @en Manually register a single component\n */\nexport function registerComponentNodes(componentClass: Function): void {\n const components = getRegisteredBlueprintComponents();\n const metadata = components.get(componentClass);\n\n if (!metadata) {\n console.warn(`[Blueprint] Component ${componentClass.name} is not marked with @BlueprintExpose`);\n return;\n }\n\n generateComponentNodes(componentClass, metadata);\n}\n","/**\n * @zh 蓝图触发器类型定义\n * @en Blueprint Trigger Type Definitions\n *\n * @zh 定义触发器的核心类型和接口\n * @en Defines core types and interfaces for triggers\n */\n\n// =============================================================================\n// 触发器类型 | Trigger Types\n// =============================================================================\n\n/**\n * @zh 触发器类型枚举\n * @en Trigger type enumeration\n */\nexport type TriggerType =\n | 'tick' // 每帧触发 | Every frame\n | 'input' // 输入事件 | Input event\n | 'collision' // 碰撞事件 | Collision event\n | 'message' // 消息事件 | Message event\n | 'timer' // 定时器事件 | Timer event\n | 'stateEnter' // 状态进入 | State enter\n | 'stateExit' // 状态退出 | State exit\n | 'custom'; // 自定义事件 | Custom event\n\n/**\n * @zh 触发器类型常量\n * @en Trigger type constants\n */\nexport const TriggerTypes = {\n TICK: 'tick' as const,\n INPUT: 'input' as const,\n COLLISION: 'collision' as const,\n MESSAGE: 'message' as const,\n TIMER: 'timer' as const,\n STATE_ENTER: 'stateEnter' as const,\n STATE_EXIT: 'stateExit' as const,\n CUSTOM: 'custom' as const\n} as const;\n\n// =============================================================================\n// 触发器上下文 | Trigger Context\n// =============================================================================\n\n/**\n * @zh 触发器上下文基础接口\n * @en Trigger context base interface\n */\nexport interface ITriggerContext {\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n readonly type: TriggerType;\n\n /**\n * @zh 触发时间戳\n * @en Trigger timestamp\n */\n readonly timestamp: number;\n\n /**\n * @zh 触发源实体 ID\n * @en Source entity ID\n */\n readonly sourceEntityId?: string;\n\n /**\n * @zh 附加数据\n * @en Additional data\n */\n readonly data?: Record<string, unknown>;\n}\n\n/**\n * @zh Tick 触发器上下文\n * @en Tick trigger context\n */\nexport interface ITickTriggerContext extends ITriggerContext {\n readonly type: 'tick';\n /**\n * @zh 增量时间(秒)\n * @en Delta time (seconds)\n */\n readonly deltaTime: number;\n /**\n * @zh 帧计数\n * @en Frame count\n */\n readonly frameCount: number;\n}\n\n/**\n * @zh 输入触发器上下文\n * @en Input trigger context\n */\nexport interface IInputTriggerContext extends ITriggerContext {\n readonly type: 'input';\n /**\n * @zh 输入动作名称\n * @en Input action name\n */\n readonly action: string;\n /**\n * @zh 输入值\n * @en Input value\n */\n readonly value: number | boolean;\n /**\n * @zh 是否刚按下\n * @en Is just pressed\n */\n readonly pressed?: boolean;\n /**\n * @zh 是否刚释放\n * @en Is just released\n */\n readonly released?: boolean;\n}\n\n/**\n * @zh 碰撞触发器上下文\n * @en Collision trigger context\n */\nexport interface ICollisionTriggerContext extends ITriggerContext {\n readonly type: 'collision';\n /**\n * @zh 碰撞的另一个实体 ID\n * @en Other entity ID in collision\n */\n readonly otherEntityId: string;\n /**\n * @zh 碰撞点\n * @en Collision point\n */\n readonly point?: { x: number; y: number };\n /**\n * @zh 碰撞法线\n * @en Collision normal\n */\n readonly normal?: { x: number; y: number };\n /**\n * @zh 是否开始碰撞\n * @en Is collision start\n */\n readonly isEnter: boolean;\n /**\n * @zh 是否结束碰撞\n * @en Is collision end\n */\n readonly isExit: boolean;\n}\n\n/**\n * @zh 消息触发器上下文\n * @en Message trigger context\n */\nexport interface IMessageTriggerContext extends ITriggerContext {\n readonly type: 'message';\n /**\n * @zh 消息名称\n * @en Message name\n */\n readonly messageName: string;\n /**\n * @zh 发送者 ID\n * @en Sender ID\n */\n readonly senderId?: string;\n /**\n * @zh 消息负载\n * @en Message payload\n */\n readonly payload?: unknown;\n}\n\n/**\n * @zh 定时器触发器上下文\n * @en Timer trigger context\n */\nexport interface ITimerTriggerContext extends ITriggerContext {\n readonly type: 'timer';\n /**\n * @zh 定时器 ID\n * @en Timer ID\n */\n readonly timerId: string;\n /**\n * @zh 是否循环触发\n * @en Is repeating\n */\n readonly isRepeating: boolean;\n /**\n * @zh 已触发次数\n * @en Times fired\n */\n readonly timesFired: number;\n}\n\n/**\n * @zh 状态触发器上下文\n * @en State trigger context\n */\nexport interface IStateTriggerContext extends ITriggerContext {\n readonly type: 'stateEnter' | 'stateExit';\n /**\n * @zh 状态机 ID\n * @en State machine ID\n */\n readonly stateMachineId: string;\n /**\n * @zh 当前状态\n * @en Current state\n */\n readonly currentState: string;\n /**\n * @zh 之前状态\n * @en Previous state\n */\n readonly previousState?: string;\n}\n\n/**\n * @zh 自定义触发器上下文\n * @en Custom trigger context\n */\nexport interface ICustomTriggerContext extends ITriggerContext {\n readonly type: 'custom';\n /**\n * @zh 事件名称\n * @en Event name\n */\n readonly eventName: string;\n}\n\n/**\n * @zh 所有触发器上下文的联合类型\n * @en Union type of all trigger contexts\n */\nexport type TriggerContext =\n | ITickTriggerContext\n | IInputTriggerContext\n | ICollisionTriggerContext\n | IMessageTriggerContext\n | ITimerTriggerContext\n | IStateTriggerContext\n | ICustomTriggerContext;\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建 Tick 触发器上下文\n * @en Create tick trigger context\n */\nexport function createTickContext(\n deltaTime: number,\n frameCount: number,\n sourceEntityId?: string\n): ITickTriggerContext {\n return {\n type: 'tick',\n timestamp: Date.now(),\n deltaTime,\n frameCount,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建输入触发器上下文\n * @en Create input trigger context\n */\nexport function createInputContext(\n action: string,\n value: number | boolean,\n options?: {\n pressed?: boolean;\n released?: boolean;\n sourceEntityId?: string;\n }\n): IInputTriggerContext {\n return {\n type: 'input',\n timestamp: Date.now(),\n action,\n value,\n pressed: options?.pressed,\n released: options?.released,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建碰撞触发器上下文\n * @en Create collision trigger context\n */\nexport function createCollisionContext(\n otherEntityId: string,\n isEnter: boolean,\n options?: {\n point?: { x: number; y: number };\n normal?: { x: number; y: number };\n sourceEntityId?: string;\n }\n): ICollisionTriggerContext {\n return {\n type: 'collision',\n timestamp: Date.now(),\n otherEntityId,\n isEnter,\n isExit: !isEnter,\n point: options?.point,\n normal: options?.normal,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建消息触发器上下文\n * @en Create message trigger context\n */\nexport function createMessageContext(\n messageName: string,\n payload?: unknown,\n options?: {\n senderId?: string;\n sourceEntityId?: string;\n }\n): IMessageTriggerContext {\n return {\n type: 'message',\n timestamp: Date.now(),\n messageName,\n payload,\n senderId: options?.senderId,\n sourceEntityId: options?.sourceEntityId\n };\n}\n\n/**\n * @zh 创建定时器触发器上下文\n * @en Create timer trigger context\n */\nexport function createTimerContext(\n timerId: string,\n isRepeating: boolean,\n timesFired: number,\n sourceEntityId?: string\n): ITimerTriggerContext {\n return {\n type: 'timer',\n timestamp: Date.now(),\n timerId,\n isRepeating,\n timesFired,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建状态触发器上下文\n * @en Create state trigger context\n */\nexport function createStateContext(\n type: 'stateEnter' | 'stateExit',\n stateMachineId: string,\n currentState: string,\n previousState?: string,\n sourceEntityId?: string\n): IStateTriggerContext {\n return {\n type,\n timestamp: Date.now(),\n stateMachineId,\n currentState,\n previousState,\n sourceEntityId\n };\n}\n\n/**\n * @zh 创建自定义触发器上下文\n * @en Create custom trigger context\n */\nexport function createCustomContext(\n eventName: string,\n data?: Record<string, unknown>,\n sourceEntityId?: string\n): ICustomTriggerContext {\n return {\n type: 'custom',\n timestamp: Date.now(),\n eventName,\n data,\n sourceEntityId\n };\n}\n","/**\n * @zh 触发器条件系统\n * @en Trigger Condition System\n *\n * @zh 提供触发器触发前的条件检查能力\n * @en Provides condition checking before trigger fires\n */\n\nimport type {\n ITriggerContext,\n TriggerType,\n IInputTriggerContext,\n IMessageTriggerContext,\n IStateTriggerContext,\n ITimerTriggerContext,\n ICollisionTriggerContext,\n ICustomTriggerContext\n} from './TriggerTypes';\n\n// =============================================================================\n// 条件接口 | Condition Interface\n// =============================================================================\n\n/**\n * @zh 触发器条件接口\n * @en Trigger condition interface\n */\nexport interface ITriggerCondition {\n /**\n * @zh 条件类型标识\n * @en Condition type identifier\n */\n readonly type: string;\n\n /**\n * @zh 评估条件是否满足\n * @en Evaluate if condition is met\n *\n * @param context - @zh 触发器上下文 @en Trigger context\n * @returns @zh 条件是否满足 @en Whether condition is met\n */\n evaluate(context: ITriggerContext): boolean;\n}\n\n/**\n * @zh 条件组合逻辑\n * @en Condition combination logic\n */\nexport type ConditionLogic = 'and' | 'or';\n\n// =============================================================================\n// 复合条件 | Composite Conditions\n// =============================================================================\n\n/**\n * @zh 复合条件 - 组合多个条件\n * @en Composite condition - combines multiple conditions\n */\nexport class CompositeCondition implements ITriggerCondition {\n readonly type = 'composite';\n\n constructor(\n private readonly _conditions: ITriggerCondition[],\n private readonly _logic: ConditionLogic = 'and'\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (this._conditions.length === 0) {\n return true;\n }\n\n if (this._logic === 'and') {\n return this._conditions.every(c => c.evaluate(context));\n } else {\n return this._conditions.some(c => c.evaluate(context));\n }\n }\n}\n\n/**\n * @zh 非条件 - 取反\n * @en Not condition - negates\n */\nexport class NotCondition implements ITriggerCondition {\n readonly type = 'not';\n\n constructor(private readonly _condition: ITriggerCondition) {}\n\n evaluate(context: ITriggerContext): boolean {\n return !this._condition.evaluate(context);\n }\n}\n\n// =============================================================================\n// 通用条件 | Generic Conditions\n// =============================================================================\n\n/**\n * @zh 始终为真的条件\n * @en Always true condition\n */\nexport class AlwaysTrueCondition implements ITriggerCondition {\n readonly type = 'alwaysTrue';\n\n evaluate(_context: ITriggerContext): boolean {\n return true;\n }\n}\n\n/**\n * @zh 始终为假的条件\n * @en Always false condition\n */\nexport class AlwaysFalseCondition implements ITriggerCondition {\n readonly type = 'alwaysFalse';\n\n evaluate(_context: ITriggerContext): boolean {\n return false;\n }\n}\n\n/**\n * @zh 触发器类型条件\n * @en Trigger type condition\n */\nexport class TriggerTypeCondition implements ITriggerCondition {\n readonly type = 'triggerType';\n\n constructor(private readonly _allowedTypes: TriggerType[]) {}\n\n evaluate(context: ITriggerContext): boolean {\n return this._allowedTypes.includes(context.type);\n }\n}\n\n/**\n * @zh 实体 ID 条件\n * @en Entity ID condition\n */\nexport class EntityIdCondition implements ITriggerCondition {\n readonly type = 'entityId';\n\n constructor(\n private readonly _entityId: string,\n private readonly _checkSource: boolean = true\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (this._checkSource) {\n return context.sourceEntityId === this._entityId;\n }\n return false;\n }\n}\n\n/**\n * @zh 自定义函数条件\n * @en Custom function condition\n */\nexport class FunctionCondition implements ITriggerCondition {\n readonly type = 'function';\n\n constructor(\n private readonly _predicate: (context: ITriggerContext) => boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n return this._predicate(context);\n }\n}\n\n// =============================================================================\n// 特定类型条件 | Type-Specific Conditions\n// =============================================================================\n\n/**\n * @zh 输入动作条件\n * @en Input action condition\n */\nexport class InputActionCondition implements ITriggerCondition {\n readonly type = 'inputAction';\n\n constructor(\n private readonly _action: string,\n private readonly _checkPressed?: boolean,\n private readonly _checkReleased?: boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'input') {\n return false;\n }\n\n const inputContext = context as unknown as IInputTriggerContext;\n\n if (inputContext.action !== this._action) {\n return false;\n }\n\n if (this._checkPressed !== undefined && inputContext.pressed !== this._checkPressed) {\n return false;\n }\n\n if (this._checkReleased !== undefined && inputContext.released !== this._checkReleased) {\n return false;\n }\n\n return true;\n }\n}\n\n/**\n * @zh 消息名称条件\n * @en Message name condition\n */\nexport class MessageNameCondition implements ITriggerCondition {\n readonly type = 'messageName';\n\n constructor(private readonly _messageName: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'message') {\n return false;\n }\n\n const messageContext = context as unknown as IMessageTriggerContext;\n return messageContext.messageName === this._messageName;\n }\n}\n\n/**\n * @zh 状态名称条件\n * @en State name condition\n */\nexport class StateNameCondition implements ITriggerCondition {\n readonly type = 'stateName';\n\n constructor(\n private readonly _stateName: string,\n private readonly _checkCurrent: boolean = true\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'stateEnter' && context.type !== 'stateExit') {\n return false;\n }\n\n const stateContext = context as unknown as IStateTriggerContext;\n\n if (this._checkCurrent) {\n return stateContext.currentState === this._stateName;\n } else {\n return stateContext.previousState === this._stateName;\n }\n }\n}\n\n/**\n * @zh 定时器 ID 条件\n * @en Timer ID condition\n */\nexport class TimerIdCondition implements ITriggerCondition {\n readonly type = 'timerId';\n\n constructor(private readonly _timerId: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'timer') {\n return false;\n }\n\n const timerContext = context as unknown as ITimerTriggerContext;\n return timerContext.timerId === this._timerId;\n }\n}\n\n/**\n * @zh 碰撞实体条件\n * @en Collision entity condition\n */\nexport class CollisionEntityCondition implements ITriggerCondition {\n readonly type = 'collisionEntity';\n\n constructor(\n private readonly _otherEntityId?: string,\n private readonly _checkEnter?: boolean,\n private readonly _checkExit?: boolean\n ) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'collision') {\n return false;\n }\n\n const collisionContext = context as unknown as ICollisionTriggerContext;\n\n if (this._otherEntityId !== undefined && collisionContext.otherEntityId !== this._otherEntityId) {\n return false;\n }\n\n if (this._checkEnter !== undefined && collisionContext.isEnter !== this._checkEnter) {\n return false;\n }\n\n if (this._checkExit !== undefined && collisionContext.isExit !== this._checkExit) {\n return false;\n }\n\n return true;\n }\n}\n\n/**\n * @zh 自定义事件名称条件\n * @en Custom event name condition\n */\nexport class CustomEventCondition implements ITriggerCondition {\n readonly type = 'customEvent';\n\n constructor(private readonly _eventName: string) {}\n\n evaluate(context: ITriggerContext): boolean {\n if (context.type !== 'custom') {\n return false;\n }\n\n const customContext = context as unknown as ICustomTriggerContext;\n return customContext.eventName === this._eventName;\n }\n}\n\n// =============================================================================\n// 条件构建器 | Condition Builder\n// =============================================================================\n\n/**\n * @zh 条件构建器 - 链式 API\n * @en Condition builder - fluent API\n */\nexport class ConditionBuilder {\n private _conditions: ITriggerCondition[] = [];\n private _logic: ConditionLogic = 'and';\n\n /**\n * @zh 设置组合逻辑为 AND\n * @en Set combination logic to AND\n */\n and(): this {\n this._logic = 'and';\n return this;\n }\n\n /**\n * @zh 设置组合逻辑为 OR\n * @en Set combination logic to OR\n */\n or(): this {\n this._logic = 'or';\n return this;\n }\n\n /**\n * @zh 添加触发器类型条件\n * @en Add trigger type condition\n */\n ofType(...types: TriggerType[]): this {\n this._conditions.push(new TriggerTypeCondition(types));\n return this;\n }\n\n /**\n * @zh 添加实体 ID 条件\n * @en Add entity ID condition\n */\n fromEntity(entityId: string): this {\n this._conditions.push(new EntityIdCondition(entityId));\n return this;\n }\n\n /**\n * @zh 添加输入动作条件\n * @en Add input action condition\n */\n onInput(action: string, options?: { pressed?: boolean; released?: boolean }): this {\n this._conditions.push(new InputActionCondition(action, options?.pressed, options?.released));\n return this;\n }\n\n /**\n * @zh 添加消息条件\n * @en Add message condition\n */\n onMessage(messageName: string): this {\n this._conditions.push(new MessageNameCondition(messageName));\n return this;\n }\n\n /**\n * @zh 添加状态条件\n * @en Add state condition\n */\n onState(stateName: string, checkCurrent: boolean = true): this {\n this._conditions.push(new StateNameCondition(stateName, checkCurrent));\n return this;\n }\n\n /**\n * @zh 添加定时器条件\n * @en Add timer condition\n */\n onTimer(timerId: string): this {\n this._conditions.push(new TimerIdCondition(timerId));\n return this;\n }\n\n /**\n * @zh 添加碰撞条件\n * @en Add collision condition\n */\n onCollision(options?: { entityId?: string; isEnter?: boolean; isExit?: boolean }): this {\n this._conditions.push(new CollisionEntityCondition(\n options?.entityId,\n options?.isEnter,\n options?.isExit\n ));\n return this;\n }\n\n /**\n * @zh 添加自定义事件条件\n * @en Add custom event condition\n */\n onCustomEvent(eventName: string): this {\n this._conditions.push(new CustomEventCondition(eventName));\n return this;\n }\n\n /**\n * @zh 添加自定义函数条件\n * @en Add custom function condition\n */\n where(predicate: (context: ITriggerContext) => boolean): this {\n this._conditions.push(new FunctionCondition(predicate));\n return this;\n }\n\n /**\n * @zh 添加取反条件\n * @en Add negated condition\n */\n not(condition: ITriggerCondition): this {\n this._conditions.push(new NotCondition(condition));\n return this;\n }\n\n /**\n * @zh 构建条件\n * @en Build condition\n */\n build(): ITriggerCondition {\n if (this._conditions.length === 0) {\n return new AlwaysTrueCondition();\n }\n\n if (this._conditions.length === 1) {\n return this._conditions[0];\n }\n\n return new CompositeCondition(this._conditions, this._logic);\n }\n}\n\n/**\n * @zh 创建条件构建器\n * @en Create condition builder\n */\nexport function condition(): ConditionBuilder {\n return new ConditionBuilder();\n}\n","/**\n * @zh 蓝图触发器\n * @en Blueprint Trigger\n *\n * @zh 定义触发器的核心实现\n * @en Defines core trigger implementation\n */\n\nimport type { TriggerType, ITriggerContext } from './TriggerTypes';\nimport type { ITriggerCondition } from './TriggerCondition';\nimport { AlwaysTrueCondition } from './TriggerCondition';\n\n// =============================================================================\n// 触发器接口 | Trigger Interface\n// =============================================================================\n\n/**\n * @zh 触发器回调函数类型\n * @en Trigger callback function type\n */\nexport type TriggerCallback = (context: ITriggerContext) => void;\n\n/**\n * @zh 蓝图触发器接口\n * @en Blueprint trigger interface\n */\nexport interface IBlueprintTrigger {\n /**\n * @zh 触发器唯一标识\n * @en Trigger unique identifier\n */\n readonly id: string;\n\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n readonly type: TriggerType;\n\n /**\n * @zh 触发器条件\n * @en Trigger conditions\n */\n readonly condition: ITriggerCondition;\n\n /**\n * @zh 是否启用\n * @en Is enabled\n */\n enabled: boolean;\n\n /**\n * @zh 优先级(越高越先执行)\n * @en Priority (higher executes first)\n */\n readonly priority: number;\n\n /**\n * @zh 检查是否应该触发\n * @en Check if should fire\n */\n shouldFire(context: ITriggerContext): boolean;\n\n /**\n * @zh 执行触发器\n * @en Execute trigger\n */\n fire(context: ITriggerContext): void;\n}\n\n/**\n * @zh 触发器配置\n * @en Trigger configuration\n */\nexport interface TriggerConfig {\n /**\n * @zh 触发器 ID\n * @en Trigger ID\n */\n id?: string;\n\n /**\n * @zh 触发器类型\n * @en Trigger type\n */\n type: TriggerType;\n\n /**\n * @zh 触发条件\n * @en Trigger condition\n */\n condition?: ITriggerCondition;\n\n /**\n * @zh 是否启用\n * @en Is enabled\n */\n enabled?: boolean;\n\n /**\n * @zh 优先级\n * @en Priority\n */\n priority?: number;\n\n /**\n * @zh 回调函数\n * @en Callback function\n */\n callback?: TriggerCallback;\n}\n\n// =============================================================================\n// 触发器实现 | Trigger Implementation\n// =============================================================================\n\nlet _triggerId = 0;\n\n/**\n * @zh 生成唯一触发器 ID\n * @en Generate unique trigger ID\n */\nfunction generateTriggerId(): string {\n return `trigger_${++_triggerId}`;\n}\n\n/**\n * @zh 蓝图触发器实现\n * @en Blueprint trigger implementation\n */\nexport class BlueprintTrigger implements IBlueprintTrigger {\n readonly id: string;\n readonly type: TriggerType;\n readonly condition: ITriggerCondition;\n readonly priority: number;\n enabled: boolean;\n\n private readonly _callback?: TriggerCallback;\n private readonly _callbacks: Set<TriggerCallback> = new Set();\n\n constructor(config: TriggerConfig) {\n this.id = config.id ?? generateTriggerId();\n this.type = config.type;\n this.condition = config.condition ?? new AlwaysTrueCondition();\n this.priority = config.priority ?? 0;\n this.enabled = config.enabled ?? true;\n this._callback = config.callback;\n }\n\n /**\n * @zh 检查是否应该触发\n * @en Check if should fire\n */\n shouldFire(context: ITriggerContext): boolean {\n if (!this.enabled) {\n return false;\n }\n\n if (context.type !== this.type && this.type !== 'custom') {\n return false;\n }\n\n return this.condition.evaluate(context);\n }\n\n /**\n * @zh 执行触发器\n * @en Execute trigger\n */\n fire(context: ITriggerContext): void {\n if (this._callback) {\n this._callback(context);\n }\n\n for (const callback of this._callbacks) {\n callback(context);\n }\n }\n\n /**\n * @zh 添加回调\n * @en Add callback\n */\n addCallback(callback: TriggerCallback): void {\n this._callbacks.add(callback);\n }\n\n /**\n * @zh 移除回调\n * @en Remove callback\n */\n removeCallback(callback: TriggerCallback): void {\n this._callbacks.delete(callback);\n }\n\n /**\n * @zh 清除所有回调\n * @en Clear all callbacks\n */\n clearCallbacks(): void {\n this._callbacks.clear();\n }\n}\n\n// =============================================================================\n// 触发器注册表 | Trigger Registry\n// =============================================================================\n\n/**\n * @zh 触发器注册表接口\n * @en Trigger registry interface\n */\nexport interface ITriggerRegistry {\n /**\n * @zh 注册触发器\n * @en Register trigger\n */\n register(trigger: IBlueprintTrigger): void;\n\n /**\n * @zh 注销触发器\n * @en Unregister trigger\n */\n unregister(triggerId: string): boolean;\n\n /**\n * @zh 获取触发器\n * @en Get trigger\n */\n get(triggerId: string): IBlueprintTrigger | undefined;\n\n /**\n * @zh 获取所有触发器\n * @en Get all triggers\n */\n getAll(): IBlueprintTrigger[];\n\n /**\n * @zh 按类型获取触发器\n * @en Get triggers by type\n */\n getByType(type: TriggerType): IBlueprintTrigger[];\n\n /**\n * @zh 清除所有触发器\n * @en Clear all triggers\n */\n clear(): void;\n}\n\n/**\n * @zh 触发器注册表实现\n * @en Trigger registry implementation\n */\nexport class TriggerRegistry implements ITriggerRegistry {\n private readonly _triggers: Map<string, IBlueprintTrigger> = new Map();\n private readonly _triggersByType: Map<TriggerType, Set<string>> = new Map();\n\n /**\n * @zh 注册触发器\n * @en Register trigger\n */\n register(trigger: IBlueprintTrigger): void {\n if (this._triggers.has(trigger.id)) {\n console.warn(`Trigger ${trigger.id} already registered, overwriting`);\n }\n\n this._triggers.set(trigger.id, trigger);\n\n if (!this._triggersByType.has(trigger.type)) {\n this._triggersByType.set(trigger.type, new Set());\n }\n this._triggersByType.get(trigger.type)!.add(trigger.id);\n }\n\n /**\n * @zh 注销触发器\n * @en Unregister trigger\n */\n unregister(triggerId: string): boolean {\n const trigger = this._triggers.get(triggerId);\n if (!trigger) {\n return false;\n }\n\n this._triggers.delete(triggerId);\n\n const typeSet = this._triggersByType.get(trigger.type);\n if (typeSet) {\n typeSet.delete(triggerId);\n }\n\n return true;\n }\n\n /**\n * @zh 获取触发器\n * @en Get trigger\n */\n get(triggerId: string): IBlueprintTrigger | undefined {\n return this._triggers.get(triggerId);\n }\n\n /**\n * @zh 获取所有触发器\n * @en Get all triggers\n */\n getAll(): IBlueprintTrigger[] {\n return Array.from(this._triggers.values());\n }\n\n /**\n * @zh 按类型获取触发器\n * @en Get triggers by type\n */\n getByType(type: TriggerType): IBlueprintTrigger[] {\n const typeSet = this._triggersByType.get(type);\n if (!typeSet) {\n return [];\n }\n\n const triggers: IBlueprintTrigger[] = [];\n for (const id of typeSet) {\n const trigger = this._triggers.get(id);\n if (trigger) {\n triggers.push(trigger);\n }\n }\n\n return triggers.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * @zh 清除所有触发器\n * @en Clear all triggers\n */\n clear(): void {\n this._triggers.clear();\n this._triggersByType.clear();\n }\n\n /**\n * @zh 获取触发器数量\n * @en Get trigger count\n */\n get count(): number {\n return this._triggers.size;\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建触发器\n * @en Create trigger\n */\nexport function createTrigger(config: TriggerConfig): BlueprintTrigger {\n return new BlueprintTrigger(config);\n}\n\n/**\n * @zh 创建 Tick 触发器\n * @en Create tick trigger\n */\nexport function createTickTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'tick',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建输入触发器\n * @en Create input trigger\n */\nexport function createInputTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'input',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建碰撞触发器\n * @en Create collision trigger\n */\nexport function createCollisionTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'collision',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建消息触发器\n * @en Create message trigger\n */\nexport function createMessageTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'message',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建定时器触发器\n * @en Create timer trigger\n */\nexport function createTimerTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'timer',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建状态进入触发器\n * @en Create state enter trigger\n */\nexport function createStateEnterTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'stateEnter',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建状态退出触发器\n * @en Create state exit trigger\n */\nexport function createStateExitTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'stateExit',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n\n/**\n * @zh 创建自定义触发器\n * @en Create custom trigger\n */\nexport function createCustomTrigger(\n callback?: TriggerCallback,\n options?: { id?: string; condition?: ITriggerCondition; priority?: number }\n): BlueprintTrigger {\n return new BlueprintTrigger({\n id: options?.id,\n type: 'custom',\n condition: options?.condition,\n priority: options?.priority,\n callback\n });\n}\n","/**\n * @zh 触发器调度器\n * @en Trigger Dispatcher\n *\n * @zh 负责分发触发器事件到订阅者\n * @en Responsible for dispatching trigger events to subscribers\n */\n\nimport type { TriggerType, ITriggerContext } from './TriggerTypes';\nimport type { IBlueprintTrigger, ITriggerRegistry, TriggerCallback } from './BlueprintTrigger';\nimport { TriggerRegistry } from './BlueprintTrigger';\n\n// =============================================================================\n// 调度器接口 | Dispatcher Interface\n// =============================================================================\n\n/**\n * @zh 触发结果\n * @en Trigger result\n */\nexport interface TriggerResult {\n /**\n * @zh 触发器 ID\n * @en Trigger ID\n */\n triggerId: string;\n\n /**\n * @zh 是否成功\n * @en Is successful\n */\n success: boolean;\n\n /**\n * @zh 错误信息\n * @en Error message\n */\n error?: string;\n}\n\n/**\n * @zh 调度结果\n * @en Dispatch result\n */\nexport interface DispatchResult {\n /**\n * @zh 上下文\n * @en Context\n */\n context: ITriggerContext;\n\n /**\n * @zh 触发的触发器数量\n * @en Number of triggers fired\n */\n triggeredCount: number;\n\n /**\n * @zh 各触发器结果\n * @en Results of each trigger\n */\n results: TriggerResult[];\n}\n\n/**\n * @zh 触发器调度器接口\n * @en Trigger dispatcher interface\n */\nexport interface ITriggerDispatcher {\n /**\n * @zh 调度触发器\n * @en Dispatch trigger\n */\n dispatch(context: ITriggerContext): DispatchResult;\n\n /**\n * @zh 异步调度触发器\n * @en Async dispatch trigger\n */\n dispatchAsync(context: ITriggerContext): Promise<DispatchResult>;\n\n /**\n * @zh 订阅触发器类型\n * @en Subscribe to trigger type\n */\n subscribe(type: TriggerType, callback: TriggerCallback): () => void;\n\n /**\n * @zh 取消订阅\n * @en Unsubscribe\n */\n unsubscribe(type: TriggerType, callback: TriggerCallback): void;\n\n /**\n * @zh 获取注册表\n * @en Get registry\n */\n readonly registry: ITriggerRegistry;\n}\n\n// =============================================================================\n// 调度器实现 | Dispatcher Implementation\n// =============================================================================\n\n/**\n * @zh 触发器调度器实现\n * @en Trigger dispatcher implementation\n */\nexport class TriggerDispatcher implements ITriggerDispatcher {\n private readonly _registry: ITriggerRegistry;\n private readonly _typeSubscribers: Map<TriggerType, Set<TriggerCallback>> = new Map();\n private readonly _globalSubscribers: Set<TriggerCallback> = new Set();\n private _isDispatching: boolean = false;\n private _pendingContexts: ITriggerContext[] = [];\n\n constructor(registry?: ITriggerRegistry) {\n this._registry = registry ?? new TriggerRegistry();\n }\n\n get registry(): ITriggerRegistry {\n return this._registry;\n }\n\n /**\n * @zh 调度触发器\n * @en Dispatch trigger\n */\n dispatch(context: ITriggerContext): DispatchResult {\n if (this._isDispatching) {\n this._pendingContexts.push(context);\n return {\n context,\n triggeredCount: 0,\n results: []\n };\n }\n\n this._isDispatching = true;\n\n try {\n const result = this._doDispatch(context);\n\n while (this._pendingContexts.length > 0) {\n const pendingContext = this._pendingContexts.shift()!;\n this._doDispatch(pendingContext);\n }\n\n return result;\n } finally {\n this._isDispatching = false;\n }\n }\n\n /**\n * @zh 执行调度\n * @en Do dispatch\n */\n private _doDispatch(context: ITriggerContext): DispatchResult {\n const results: TriggerResult[] = [];\n let triggeredCount = 0;\n\n const triggers = this._registry.getByType(context.type);\n\n for (const trigger of triggers) {\n if (trigger.shouldFire(context)) {\n try {\n trigger.fire(context);\n triggeredCount++;\n results.push({\n triggerId: trigger.id,\n success: true\n });\n } catch (error) {\n results.push({\n triggerId: trigger.id,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n }\n\n this._notifySubscribers(context);\n\n return {\n context,\n triggeredCount,\n results\n };\n }\n\n /**\n * @zh 通知订阅者\n * @en Notify subscribers\n */\n private _notifySubscribers(context: ITriggerContext): void {\n const typeSubscribers = this._typeSubscribers.get(context.type);\n if (typeSubscribers) {\n for (const callback of typeSubscribers) {\n try {\n callback(context);\n } catch (error) {\n console.error(`Trigger subscriber error: ${error}`);\n }\n }\n }\n\n for (const callback of this._globalSubscribers) {\n try {\n callback(context);\n } catch (error) {\n console.error(`Global trigger subscriber error: ${error}`);\n }\n }\n }\n\n /**\n * @zh 异步调度触发器\n * @en Async dispatch trigger\n */\n async dispatchAsync(context: ITriggerContext): Promise<DispatchResult> {\n return new Promise((resolve) => {\n queueMicrotask(() => {\n resolve(this.dispatch(context));\n });\n });\n }\n\n /**\n * @zh 订阅触发器类型\n * @en Subscribe to trigger type\n */\n subscribe(type: TriggerType, callback: TriggerCallback): () => void {\n if (!this._typeSubscribers.has(type)) {\n this._typeSubscribers.set(type, new Set());\n }\n\n this._typeSubscribers.get(type)!.add(callback);\n\n return () => this.unsubscribe(type, callback);\n }\n\n /**\n * @zh 取消订阅\n * @en Unsubscribe\n */\n unsubscribe(type: TriggerType, callback: TriggerCallback): void {\n const subscribers = this._typeSubscribers.get(type);\n if (subscribers) {\n subscribers.delete(callback);\n }\n }\n\n /**\n * @zh 订阅所有触发器\n * @en Subscribe to all triggers\n */\n subscribeAll(callback: TriggerCallback): () => void {\n this._globalSubscribers.add(callback);\n return () => this.unsubscribeAll(callback);\n }\n\n /**\n * @zh 取消订阅所有\n * @en Unsubscribe from all\n */\n unsubscribeAll(callback: TriggerCallback): void {\n this._globalSubscribers.delete(callback);\n }\n\n /**\n * @zh 清除所有订阅\n * @en Clear all subscriptions\n */\n clearSubscriptions(): void {\n this._typeSubscribers.clear();\n this._globalSubscribers.clear();\n }\n}\n\n// =============================================================================\n// 实体触发器管理器 | Entity Trigger Manager\n// =============================================================================\n\n/**\n * @zh 实体触发器管理器接口\n * @en Entity trigger manager interface\n */\nexport interface IEntityTriggerManager {\n /**\n * @zh 为实体注册触发器\n * @en Register trigger for entity\n */\n registerForEntity(entityId: string, trigger: IBlueprintTrigger): void;\n\n /**\n * @zh 注销实体的触发器\n * @en Unregister trigger from entity\n */\n unregisterFromEntity(entityId: string, triggerId: string): boolean;\n\n /**\n * @zh 获取实体的所有触发器\n * @en Get all triggers for entity\n */\n getEntityTriggers(entityId: string): IBlueprintTrigger[];\n\n /**\n * @zh 清除实体的所有触发器\n * @en Clear all triggers for entity\n */\n clearEntityTriggers(entityId: string): void;\n\n /**\n * @zh 调度器\n * @en Dispatcher\n */\n readonly dispatcher: ITriggerDispatcher;\n}\n\n/**\n * @zh 实体触发器管理器实现\n * @en Entity trigger manager implementation\n */\nexport class EntityTriggerManager implements IEntityTriggerManager {\n private readonly _dispatcher: ITriggerDispatcher;\n private readonly _entityTriggers: Map<string, Set<string>> = new Map();\n\n constructor(dispatcher?: ITriggerDispatcher) {\n this._dispatcher = dispatcher ?? new TriggerDispatcher();\n }\n\n get dispatcher(): ITriggerDispatcher {\n return this._dispatcher;\n }\n\n /**\n * @zh 为实体注册触发器\n * @en Register trigger for entity\n */\n registerForEntity(entityId: string, trigger: IBlueprintTrigger): void {\n this._dispatcher.registry.register(trigger);\n\n if (!this._entityTriggers.has(entityId)) {\n this._entityTriggers.set(entityId, new Set());\n }\n\n this._entityTriggers.get(entityId)!.add(trigger.id);\n }\n\n /**\n * @zh 注销实体的触发器\n * @en Unregister trigger from entity\n */\n unregisterFromEntity(entityId: string, triggerId: string): boolean {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return false;\n }\n\n if (!entitySet.has(triggerId)) {\n return false;\n }\n\n entitySet.delete(triggerId);\n return this._dispatcher.registry.unregister(triggerId);\n }\n\n /**\n * @zh 获取实体的所有触发器\n * @en Get all triggers for entity\n */\n getEntityTriggers(entityId: string): IBlueprintTrigger[] {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return [];\n }\n\n const triggers: IBlueprintTrigger[] = [];\n for (const triggerId of entitySet) {\n const trigger = this._dispatcher.registry.get(triggerId);\n if (trigger) {\n triggers.push(trigger);\n }\n }\n\n return triggers;\n }\n\n /**\n * @zh 清除实体的所有触发器\n * @en Clear all triggers for entity\n */\n clearEntityTriggers(entityId: string): void {\n const entitySet = this._entityTriggers.get(entityId);\n if (!entitySet) {\n return;\n }\n\n for (const triggerId of entitySet) {\n this._dispatcher.registry.unregister(triggerId);\n }\n\n this._entityTriggers.delete(entityId);\n }\n\n /**\n * @zh 调度触发器到实体\n * @en Dispatch trigger to entity\n */\n dispatchToEntity(entityId: string, context: ITriggerContext): DispatchResult {\n const entityTriggers = this.getEntityTriggers(entityId);\n const results: TriggerResult[] = [];\n let triggeredCount = 0;\n\n for (const trigger of entityTriggers) {\n if (trigger.shouldFire(context)) {\n try {\n trigger.fire(context);\n triggeredCount++;\n results.push({\n triggerId: trigger.id,\n success: true\n });\n } catch (error) {\n results.push({\n triggerId: trigger.id,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n }\n\n return {\n context,\n triggeredCount,\n results\n };\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建触发器调度器\n * @en Create trigger dispatcher\n */\nexport function createTriggerDispatcher(registry?: ITriggerRegistry): TriggerDispatcher {\n return new TriggerDispatcher(registry);\n}\n\n/**\n * @zh 创建实体触发器管理器\n * @en Create entity trigger manager\n */\nexport function createEntityTriggerManager(dispatcher?: ITriggerDispatcher): EntityTriggerManager {\n return new EntityTriggerManager(dispatcher);\n}\n","/**\n * @zh 蓝图片段接口和实现\n * @en Blueprint Fragment Interface and Implementation\n *\n * @zh 定义可重用的蓝图片段,用于组合系统\n * @en Defines reusable blueprint fragments for the composition system\n */\n\nimport type { BlueprintAsset } from '../types/blueprint';\nimport type { BlueprintPinType } from '../types/pins';\n\n// =============================================================================\n// 暴露引脚定义 | Exposed Pin Definition\n// =============================================================================\n\n/**\n * @zh 暴露引脚定义\n * @en Exposed pin definition\n *\n * @zh 片段对外暴露的引脚,可与其他片段连接\n * @en Pins exposed by the fragment that can be connected to other fragments\n */\nexport interface ExposedPin {\n /**\n * @zh 引脚名称\n * @en Pin name\n */\n readonly name: string;\n\n /**\n * @zh 显示名称\n * @en Display name\n */\n readonly displayName: string;\n\n /**\n * @zh 引脚类型\n * @en Pin type\n */\n readonly type: BlueprintPinType;\n\n /**\n * @zh 引脚方向\n * @en Pin direction\n */\n readonly direction: 'input' | 'output';\n\n /**\n * @zh 描述\n * @en Description\n */\n readonly description?: string;\n\n /**\n * @zh 默认值(仅输入引脚)\n * @en Default value (input pins only)\n */\n readonly defaultValue?: unknown;\n\n /**\n * @zh 关联的内部节点 ID\n * @en Associated internal node ID\n */\n readonly internalNodeId: string;\n\n /**\n * @zh 关联的内部引脚名称\n * @en Associated internal pin name\n */\n readonly internalPinName: string;\n}\n\n// =============================================================================\n// 蓝图片段接口 | Blueprint Fragment Interface\n// =============================================================================\n\n/**\n * @zh 蓝图片段接口\n * @en Blueprint fragment interface\n *\n * @zh 代表一个可重用的蓝图逻辑单元,如技能、卡牌效果等\n * @en Represents a reusable unit of blueprint logic, such as skills, card effects, etc.\n */\nexport interface IBlueprintFragment {\n /**\n * @zh 片段唯一标识\n * @en Fragment unique identifier\n */\n readonly id: string;\n\n /**\n * @zh 片段名称\n * @en Fragment name\n */\n readonly name: string;\n\n /**\n * @zh 片段描述\n * @en Fragment description\n */\n readonly description?: string;\n\n /**\n * @zh 片段分类\n * @en Fragment category\n */\n readonly category?: string;\n\n /**\n * @zh 片段标签\n * @en Fragment tags\n */\n readonly tags?: string[];\n\n /**\n * @zh 暴露的输入引脚\n * @en Exposed input pins\n */\n readonly inputs: ExposedPin[];\n\n /**\n * @zh 暴露的输出引脚\n * @en Exposed output pins\n */\n readonly outputs: ExposedPin[];\n\n /**\n * @zh 内部蓝图图\n * @en Internal blueprint graph\n */\n readonly graph: BlueprintAsset;\n\n /**\n * @zh 片段版本\n * @en Fragment version\n */\n readonly version?: string;\n\n /**\n * @zh 图标名称\n * @en Icon name\n */\n readonly icon?: string;\n\n /**\n * @zh 颜色(用于可视化)\n * @en Color (for visualization)\n */\n readonly color?: string;\n}\n\n// =============================================================================\n// 蓝图片段实现 | Blueprint Fragment Implementation\n// =============================================================================\n\n/**\n * @zh 蓝图片段配置\n * @en Blueprint fragment configuration\n */\nexport interface BlueprintFragmentConfig {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n inputs?: ExposedPin[];\n outputs?: ExposedPin[];\n graph: BlueprintAsset;\n version?: string;\n icon?: string;\n color?: string;\n}\n\n/**\n * @zh 蓝图片段实现\n * @en Blueprint fragment implementation\n */\nexport class BlueprintFragment implements IBlueprintFragment {\n readonly id: string;\n readonly name: string;\n readonly description?: string;\n readonly category?: string;\n readonly tags?: string[];\n readonly inputs: ExposedPin[];\n readonly outputs: ExposedPin[];\n readonly graph: BlueprintAsset;\n readonly version?: string;\n readonly icon?: string;\n readonly color?: string;\n\n constructor(config: BlueprintFragmentConfig) {\n this.id = config.id;\n this.name = config.name;\n this.description = config.description;\n this.category = config.category;\n this.tags = config.tags;\n this.inputs = config.inputs ?? [];\n this.outputs = config.outputs ?? [];\n this.graph = config.graph;\n this.version = config.version;\n this.icon = config.icon;\n this.color = config.color;\n }\n\n /**\n * @zh 获取所有暴露引脚\n * @en Get all exposed pins\n */\n getAllExposedPins(): ExposedPin[] {\n return [...this.inputs, ...this.outputs];\n }\n\n /**\n * @zh 通过名称查找输入引脚\n * @en Find input pin by name\n */\n findInput(name: string): ExposedPin | undefined {\n return this.inputs.find(p => p.name === name);\n }\n\n /**\n * @zh 通过名称查找输出引脚\n * @en Find output pin by name\n */\n findOutput(name: string): ExposedPin | undefined {\n return this.outputs.find(p => p.name === name);\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建暴露引脚\n * @en Create exposed pin\n */\nexport function createExposedPin(\n name: string,\n type: BlueprintPinType,\n direction: 'input' | 'output',\n internalNodeId: string,\n internalPinName: string,\n options?: {\n displayName?: string;\n description?: string;\n defaultValue?: unknown;\n }\n): ExposedPin {\n return {\n name,\n displayName: options?.displayName ?? name,\n type,\n direction,\n description: options?.description,\n defaultValue: options?.defaultValue,\n internalNodeId,\n internalPinName\n };\n}\n\n/**\n * @zh 创建蓝图片段\n * @en Create blueprint fragment\n */\nexport function createFragment(config: BlueprintFragmentConfig): IBlueprintFragment {\n return new BlueprintFragment(config);\n}\n\n// =============================================================================\n// 片段资产格式 | Fragment Asset Format\n// =============================================================================\n\n/**\n * @zh 蓝图片段资产格式\n * @en Blueprint fragment asset format\n *\n * @zh 用于序列化和反序列化片段\n * @en Used for serializing and deserializing fragments\n */\nexport interface BlueprintFragmentAsset {\n /**\n * @zh 格式版本\n * @en Format version\n */\n version: number;\n\n /**\n * @zh 资产类型标识\n * @en Asset type identifier\n */\n type: 'blueprint-fragment';\n\n /**\n * @zh 片段数据\n * @en Fragment data\n */\n fragment: {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n inputs: ExposedPin[];\n outputs: ExposedPin[];\n version?: string;\n icon?: string;\n color?: string;\n };\n\n /**\n * @zh 内部蓝图图\n * @en Internal blueprint graph\n */\n graph: BlueprintAsset;\n}\n\n/**\n * @zh 从资产创建片段\n * @en Create fragment from asset\n */\nexport function fragmentFromAsset(asset: BlueprintFragmentAsset): IBlueprintFragment {\n return new BlueprintFragment({\n ...asset.fragment,\n graph: asset.graph\n });\n}\n\n/**\n * @zh 将片段转为资产\n * @en Convert fragment to asset\n */\nexport function fragmentToAsset(fragment: IBlueprintFragment): BlueprintFragmentAsset {\n return {\n version: 1,\n type: 'blueprint-fragment',\n fragment: {\n id: fragment.id,\n name: fragment.name,\n description: fragment.description,\n category: fragment.category,\n tags: fragment.tags,\n inputs: fragment.inputs,\n outputs: fragment.outputs,\n version: fragment.version,\n icon: fragment.icon,\n color: fragment.color\n },\n graph: fragment.graph\n };\n}\n","/**\n * @zh 蓝图组合器接口和实现\n * @en Blueprint Composer Interface and Implementation\n *\n * @zh 将多个蓝图片段组合成一个完整的蓝图\n * @en Composes multiple blueprint fragments into a complete blueprint\n */\n\nimport type { BlueprintAsset, BlueprintVariable } from '../types/blueprint';\nimport type { BlueprintNode, BlueprintConnection } from '../types/nodes';\nimport type { IBlueprintFragment } from './BlueprintFragment';\n\n// =============================================================================\n// 槽位定义 | Slot Definition\n// =============================================================================\n\n/**\n * @zh 片段槽位\n * @en Fragment slot\n *\n * @zh 组合器中放置片段的位置\n * @en A position in the composer where a fragment is placed\n */\nexport interface FragmentSlot {\n /**\n * @zh 槽位 ID\n * @en Slot ID\n */\n readonly id: string;\n\n /**\n * @zh 槽位名称\n * @en Slot name\n */\n readonly name: string;\n\n /**\n * @zh 放置的片段\n * @en Placed fragment\n */\n readonly fragment: IBlueprintFragment;\n\n /**\n * @zh 在组合图中的位置偏移\n * @en Position offset in the composed graph\n */\n readonly position: { x: number; y: number };\n}\n\n/**\n * @zh 槽位间连接\n * @en Connection between slots\n */\nexport interface SlotConnection {\n /**\n * @zh 连接 ID\n * @en Connection ID\n */\n readonly id: string;\n\n /**\n * @zh 源槽位 ID\n * @en Source slot ID\n */\n readonly fromSlotId: string;\n\n /**\n * @zh 源引脚名称\n * @en Source pin name\n */\n readonly fromPin: string;\n\n /**\n * @zh 目标槽位 ID\n * @en Target slot ID\n */\n readonly toSlotId: string;\n\n /**\n * @zh 目标引脚名称\n * @en Target pin name\n */\n readonly toPin: string;\n}\n\n// =============================================================================\n// 组合器接口 | Composer Interface\n// =============================================================================\n\n/**\n * @zh 蓝图组合器接口\n * @en Blueprint composer interface\n *\n * @zh 用于将多个蓝图片段组合成一个完整蓝图\n * @en Used to compose multiple blueprint fragments into a complete blueprint\n */\nexport interface IBlueprintComposer {\n /**\n * @zh 组合器名称\n * @en Composer name\n */\n readonly name: string;\n\n /**\n * @zh 获取所有槽位\n * @en Get all slots\n */\n getSlots(): FragmentSlot[];\n\n /**\n * @zh 获取所有连接\n * @en Get all connections\n */\n getConnections(): SlotConnection[];\n\n /**\n * @zh 添加片段到槽位\n * @en Add fragment to slot\n *\n * @param fragment - @zh 蓝图片段 @en Blueprint fragment\n * @param slotId - @zh 槽位 ID @en Slot ID\n * @param options - @zh 选项 @en Options\n */\n addFragment(\n fragment: IBlueprintFragment,\n slotId: string,\n options?: {\n name?: string;\n position?: { x: number; y: number };\n }\n ): void;\n\n /**\n * @zh 移除槽位\n * @en Remove slot\n *\n * @param slotId - @zh 槽位 ID @en Slot ID\n */\n removeSlot(slotId: string): void;\n\n /**\n * @zh 连接两个槽位的引脚\n * @en Connect pins between two slots\n *\n * @param fromSlotId - @zh 源槽位 ID @en Source slot ID\n * @param fromPin - @zh 源引脚名称 @en Source pin name\n * @param toSlotId - @zh 目标槽位 ID @en Target slot ID\n * @param toPin - @zh 目标引脚名称 @en Target pin name\n */\n connect(\n fromSlotId: string,\n fromPin: string,\n toSlotId: string,\n toPin: string\n ): void;\n\n /**\n * @zh 断开连接\n * @en Disconnect\n *\n * @param connectionId - @zh 连接 ID @en Connection ID\n */\n disconnect(connectionId: string): void;\n\n /**\n * @zh 验证组合是否有效\n * @en Validate if the composition is valid\n */\n validate(): CompositionValidationResult;\n\n /**\n * @zh 编译成蓝图资产\n * @en Compile into blueprint asset\n */\n compile(): BlueprintAsset;\n\n /**\n * @zh 清空组合器\n * @en Clear the composer\n */\n clear(): void;\n}\n\n// =============================================================================\n// 验证结果 | Validation Result\n// =============================================================================\n\n/**\n * @zh 组合验证结果\n * @en Composition validation result\n */\nexport interface CompositionValidationResult {\n /**\n * @zh 是否有效\n * @en Whether valid\n */\n readonly isValid: boolean;\n\n /**\n * @zh 错误列表\n * @en Error list\n */\n readonly errors: CompositionError[];\n\n /**\n * @zh 警告列表\n * @en Warning list\n */\n readonly warnings: CompositionWarning[];\n}\n\n/**\n * @zh 组合错误\n * @en Composition error\n */\nexport interface CompositionError {\n readonly type: 'missing-connection' | 'type-mismatch' | 'cycle-detected' | 'invalid-slot';\n readonly message: string;\n readonly slotId?: string;\n readonly pinName?: string;\n}\n\n/**\n * @zh 组合警告\n * @en Composition warning\n */\nexport interface CompositionWarning {\n readonly type: 'unused-output' | 'unconnected-input';\n readonly message: string;\n readonly slotId?: string;\n readonly pinName?: string;\n}\n\n// =============================================================================\n// 组合器实现 | Composer Implementation\n// =============================================================================\n\n/**\n * @zh 蓝图组合器实现\n * @en Blueprint composer implementation\n */\nexport class BlueprintComposer implements IBlueprintComposer {\n readonly name: string;\n\n private slots: Map<string, FragmentSlot> = new Map();\n private connections: Map<string, SlotConnection> = new Map();\n private connectionIdCounter = 0;\n\n constructor(name: string) {\n this.name = name;\n }\n\n getSlots(): FragmentSlot[] {\n return Array.from(this.slots.values());\n }\n\n getConnections(): SlotConnection[] {\n return Array.from(this.connections.values());\n }\n\n addFragment(\n fragment: IBlueprintFragment,\n slotId: string,\n options?: {\n name?: string;\n position?: { x: number; y: number };\n }\n ): void {\n if (this.slots.has(slotId)) {\n throw new Error(`Slot '${slotId}' already exists`);\n }\n\n const slot: FragmentSlot = {\n id: slotId,\n name: options?.name ?? fragment.name,\n fragment,\n position: options?.position ?? { x: 0, y: 0 }\n };\n\n this.slots.set(slotId, slot);\n }\n\n removeSlot(slotId: string): void {\n if (!this.slots.has(slotId)) {\n return;\n }\n\n // Remove all connections involving this slot\n const toRemove: string[] = [];\n for (const [id, conn] of this.connections) {\n if (conn.fromSlotId === slotId || conn.toSlotId === slotId) {\n toRemove.push(id);\n }\n }\n for (const id of toRemove) {\n this.connections.delete(id);\n }\n\n this.slots.delete(slotId);\n }\n\n connect(\n fromSlotId: string,\n fromPin: string,\n toSlotId: string,\n toPin: string\n ): void {\n const fromSlot = this.slots.get(fromSlotId);\n const toSlot = this.slots.get(toSlotId);\n\n if (!fromSlot) {\n throw new Error(`Source slot '${fromSlotId}' not found`);\n }\n if (!toSlot) {\n throw new Error(`Target slot '${toSlotId}' not found`);\n }\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === toPin);\n\n if (!fromPinDef) {\n throw new Error(`Output pin '${fromPin}' not found in slot '${fromSlotId}'`);\n }\n if (!toPinDef) {\n throw new Error(`Input pin '${toPin}' not found in slot '${toSlotId}'`);\n }\n\n const connectionId = `conn_${++this.connectionIdCounter}`;\n\n const connection: SlotConnection = {\n id: connectionId,\n fromSlotId,\n fromPin,\n toSlotId,\n toPin\n };\n\n this.connections.set(connectionId, connection);\n }\n\n disconnect(connectionId: string): void {\n this.connections.delete(connectionId);\n }\n\n validate(): CompositionValidationResult {\n const errors: CompositionError[] = [];\n const warnings: CompositionWarning[] = [];\n\n // Check for required inputs without connections\n for (const slot of this.slots.values()) {\n for (const input of slot.fragment.inputs) {\n const hasConnection = Array.from(this.connections.values()).some(\n c => c.toSlotId === slot.id && c.toPin === input.name\n );\n\n if (!hasConnection && input.defaultValue === undefined) {\n warnings.push({\n type: 'unconnected-input',\n message: `Input '${input.name}' in slot '${slot.id}' is not connected`,\n slotId: slot.id,\n pinName: input.name\n });\n }\n }\n\n // Check for unused outputs\n for (const output of slot.fragment.outputs) {\n const hasConnection = Array.from(this.connections.values()).some(\n c => c.fromSlotId === slot.id && c.fromPin === output.name\n );\n\n if (!hasConnection) {\n warnings.push({\n type: 'unused-output',\n message: `Output '${output.name}' in slot '${slot.id}' is not connected`,\n slotId: slot.id,\n pinName: output.name\n });\n }\n }\n }\n\n // Check type compatibility\n for (const conn of this.connections.values()) {\n const fromSlot = this.slots.get(conn.fromSlotId);\n const toSlot = this.slots.get(conn.toSlotId);\n\n if (!fromSlot || !toSlot) {\n errors.push({\n type: 'invalid-slot',\n message: `Invalid slot reference in connection '${conn.id}'`\n });\n continue;\n }\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === conn.fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === conn.toPin);\n\n if (fromPinDef && toPinDef && fromPinDef.type !== toPinDef.type) {\n if (fromPinDef.type !== 'any' && toPinDef.type !== 'any') {\n errors.push({\n type: 'type-mismatch',\n message: `Type mismatch: '${fromPinDef.type}' -> '${toPinDef.type}' in connection '${conn.id}'`\n });\n }\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings\n };\n }\n\n compile(): BlueprintAsset {\n const nodes: BlueprintNode[] = [];\n const connections: BlueprintConnection[] = [];\n const variables: BlueprintVariable[] = [];\n\n const nodeIdMap = new Map<string, Map<string, string>>();\n\n // Copy nodes from each fragment with new IDs\n let nodeIdCounter = 0;\n for (const slot of this.slots.values()) {\n const slotNodeMap = new Map<string, string>();\n nodeIdMap.set(slot.id, slotNodeMap);\n\n for (const node of slot.fragment.graph.nodes) {\n const newNodeId = `node_${++nodeIdCounter}`;\n slotNodeMap.set(node.id, newNodeId);\n\n nodes.push({\n ...node,\n id: newNodeId,\n position: {\n x: node.position.x + slot.position.x,\n y: node.position.y + slot.position.y\n }\n });\n }\n\n // Copy internal connections\n for (const conn of slot.fragment.graph.connections) {\n const newFromId = slotNodeMap.get(conn.fromNodeId);\n const newToId = slotNodeMap.get(conn.toNodeId);\n\n if (newFromId && newToId) {\n connections.push({\n ...conn,\n id: `conn_internal_${connections.length}`,\n fromNodeId: newFromId,\n toNodeId: newToId\n });\n }\n }\n\n // Copy variables (with slot prefix to avoid conflicts)\n for (const variable of slot.fragment.graph.variables) {\n variables.push({\n ...variable,\n name: `${slot.id}_${variable.name}`\n });\n }\n }\n\n // Create connections between slots based on exposed pins\n for (const slotConn of this.connections.values()) {\n const fromSlot = this.slots.get(slotConn.fromSlotId);\n const toSlot = this.slots.get(slotConn.toSlotId);\n\n if (!fromSlot || !toSlot) continue;\n\n const fromPinDef = fromSlot.fragment.outputs.find(p => p.name === slotConn.fromPin);\n const toPinDef = toSlot.fragment.inputs.find(p => p.name === slotConn.toPin);\n\n if (!fromPinDef || !toPinDef) continue;\n\n const fromNodeMap = nodeIdMap.get(slotConn.fromSlotId);\n const toNodeMap = nodeIdMap.get(slotConn.toSlotId);\n\n if (!fromNodeMap || !toNodeMap) continue;\n\n const fromNodeId = fromNodeMap.get(fromPinDef.internalNodeId);\n const toNodeId = toNodeMap.get(toPinDef.internalNodeId);\n\n if (fromNodeId && toNodeId) {\n connections.push({\n id: `conn_slot_${connections.length}`,\n fromNodeId,\n fromPin: fromPinDef.internalPinName,\n toNodeId,\n toPin: toPinDef.internalPinName\n });\n }\n }\n\n return {\n version: 1,\n type: 'blueprint',\n metadata: {\n name: this.name,\n description: `Composed from ${this.slots.size} fragments`,\n createdAt: Date.now(),\n modifiedAt: Date.now()\n },\n variables,\n nodes,\n connections\n };\n }\n\n clear(): void {\n this.slots.clear();\n this.connections.clear();\n this.connectionIdCounter = 0;\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建蓝图组合器\n * @en Create blueprint composer\n */\nexport function createComposer(name: string): IBlueprintComposer {\n return new BlueprintComposer(name);\n}\n\n// =============================================================================\n// 组合资产格式 | Composition Asset Format\n// =============================================================================\n\n/**\n * @zh 蓝图组合资产格式\n * @en Blueprint composition asset format\n */\nexport interface BlueprintCompositionAsset {\n /**\n * @zh 格式版本\n * @en Format version\n */\n version: number;\n\n /**\n * @zh 资产类型标识\n * @en Asset type identifier\n */\n type: 'blueprint-composition';\n\n /**\n * @zh 组合名称\n * @en Composition name\n */\n name: string;\n\n /**\n * @zh 槽位数据\n * @en Slot data\n */\n slots: Array<{\n id: string;\n name: string;\n fragmentId: string;\n position: { x: number; y: number };\n }>;\n\n /**\n * @zh 连接数据\n * @en Connection data\n */\n connections: SlotConnection[];\n}\n","/**\n * @zh 片段注册表\n * @en Fragment Registry\n *\n * @zh 管理和查询蓝图片段\n * @en Manages and queries blueprint fragments\n */\n\nimport type { IBlueprintFragment } from './BlueprintFragment';\n\n// =============================================================================\n// 片段注册表接口 | Fragment Registry Interface\n// =============================================================================\n\n/**\n * @zh 片段过滤器\n * @en Fragment filter\n */\nexport interface FragmentFilter {\n /**\n * @zh 按分类过滤\n * @en Filter by category\n */\n category?: string;\n\n /**\n * @zh 按标签过滤(任意匹配)\n * @en Filter by tags (any match)\n */\n tags?: string[];\n\n /**\n * @zh 按名称搜索\n * @en Search by name\n */\n search?: string;\n}\n\n/**\n * @zh 片段注册表接口\n * @en Fragment registry interface\n */\nexport interface IFragmentRegistry {\n /**\n * @zh 注册片段\n * @en Register fragment\n */\n register(fragment: IBlueprintFragment): void;\n\n /**\n * @zh 注销片段\n * @en Unregister fragment\n */\n unregister(id: string): void;\n\n /**\n * @zh 获取片段\n * @en Get fragment\n */\n get(id: string): IBlueprintFragment | undefined;\n\n /**\n * @zh 检查片段是否存在\n * @en Check if fragment exists\n */\n has(id: string): boolean;\n\n /**\n * @zh 获取所有片段\n * @en Get all fragments\n */\n getAll(): IBlueprintFragment[];\n\n /**\n * @zh 按条件过滤片段\n * @en Filter fragments by criteria\n */\n filter(filter: FragmentFilter): IBlueprintFragment[];\n\n /**\n * @zh 获取所有分类\n * @en Get all categories\n */\n getCategories(): string[];\n\n /**\n * @zh 获取所有标签\n * @en Get all tags\n */\n getTags(): string[];\n\n /**\n * @zh 清空注册表\n * @en Clear registry\n */\n clear(): void;\n}\n\n// =============================================================================\n// 片段注册表实现 | Fragment Registry Implementation\n// =============================================================================\n\n/**\n * @zh 片段注册表实现\n * @en Fragment registry implementation\n */\nexport class FragmentRegistry implements IFragmentRegistry {\n private fragments: Map<string, IBlueprintFragment> = new Map();\n\n register(fragment: IBlueprintFragment): void {\n if (this.fragments.has(fragment.id)) {\n console.warn(`Fragment '${fragment.id}' already registered, overwriting`);\n }\n this.fragments.set(fragment.id, fragment);\n }\n\n unregister(id: string): void {\n this.fragments.delete(id);\n }\n\n get(id: string): IBlueprintFragment | undefined {\n return this.fragments.get(id);\n }\n\n has(id: string): boolean {\n return this.fragments.has(id);\n }\n\n getAll(): IBlueprintFragment[] {\n return Array.from(this.fragments.values());\n }\n\n filter(filter: FragmentFilter): IBlueprintFragment[] {\n let results = this.getAll();\n\n if (filter.category) {\n results = results.filter(f => f.category === filter.category);\n }\n\n if (filter.tags && filter.tags.length > 0) {\n results = results.filter(f =>\n f.tags && filter.tags!.some(t => f.tags!.includes(t))\n );\n }\n\n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n results = results.filter(f =>\n f.name.toLowerCase().includes(searchLower) ||\n f.description?.toLowerCase().includes(searchLower)\n );\n }\n\n return results;\n }\n\n getCategories(): string[] {\n const categories = new Set<string>();\n for (const fragment of this.fragments.values()) {\n if (fragment.category) {\n categories.add(fragment.category);\n }\n }\n return Array.from(categories).sort();\n }\n\n getTags(): string[] {\n const tags = new Set<string>();\n for (const fragment of this.fragments.values()) {\n if (fragment.tags) {\n for (const tag of fragment.tags) {\n tags.add(tag);\n }\n }\n }\n return Array.from(tags).sort();\n }\n\n clear(): void {\n this.fragments.clear();\n }\n\n /**\n * @zh 获取片段数量\n * @en Get fragment count\n */\n get size(): number {\n return this.fragments.size;\n }\n}\n\n// =============================================================================\n// 单例实例 | Singleton Instance\n// =============================================================================\n\n/**\n * @zh 默认片段注册表实例\n * @en Default fragment registry instance\n */\nexport const defaultFragmentRegistry = new FragmentRegistry();\n\n/**\n * @zh 创建片段注册表\n * @en Create fragment registry\n */\nexport function createFragmentRegistry(): IFragmentRegistry {\n return new FragmentRegistry();\n}\n","/**\n * Event Begin Play Node - Triggered when the blueprint starts\n * 开始播放事件节点 - 蓝图启动时触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventBeginPlay node template\n * EventBeginPlay 节点模板\n */\nexport const EventBeginPlayTemplate: BlueprintNodeTemplate = {\n type: 'EventBeginPlay',\n title: 'Event Begin Play',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered once when the blueprint starts executing (蓝图开始执行时触发一次)',\n keywords: ['start', 'begin', 'init', 'event', 'self'],\n menuPath: ['Events', 'Begin Play'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n }\n ]\n};\n\n/**\n * EventBeginPlay node executor\n * EventBeginPlay 节点执行器\n */\n@RegisterNode(EventBeginPlayTemplate)\nexport class EventBeginPlayExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity\n }\n };\n }\n}\n","/**\n * Event Tick Node - Triggered every frame\n * 每帧事件节点 - 每帧触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventTick node template\n * EventTick 节点模板\n */\nexport const EventTickTemplate: BlueprintNodeTemplate = {\n type: 'EventTick',\n title: 'Event Tick',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered every frame during execution (执行期间每帧触发)',\n keywords: ['update', 'frame', 'tick', 'event', 'self'],\n menuPath: ['Events', 'Tick'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n },\n {\n name: 'deltaTime',\n type: 'float',\n displayName: 'Delta Seconds'\n }\n ]\n};\n\n/**\n * EventTick node executor\n * EventTick 节点执行器\n */\n@RegisterNode(EventTickTemplate)\nexport class EventTickExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity,\n deltaTime: context.deltaTime\n }\n };\n }\n}\n","/**\n * Event End Play Node - Triggered when the blueprint stops\n * 结束播放事件节点 - 蓝图停止时触发\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * EventEndPlay node template\n * EventEndPlay 节点模板\n */\nexport const EventEndPlayTemplate: BlueprintNodeTemplate = {\n type: 'EventEndPlay',\n title: 'Event End Play',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered once when the blueprint stops executing (蓝图停止执行时触发一次)',\n keywords: ['stop', 'end', 'destroy', 'event', 'self'],\n menuPath: ['Events', 'End Play'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'self',\n type: 'entity',\n displayName: 'Self'\n }\n ]\n};\n\n/**\n * EventEndPlay node executor\n * EventEndPlay 节点执行器\n */\n@RegisterNode(EventEndPlayTemplate)\nexport class EventEndPlayExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n self: context.entity\n }\n };\n }\n}\n","/**\n * @zh ECS 实体操作节点\n * @en ECS Entity Operation Nodes\n *\n * @zh 提供蓝图中对 ECS 实体的完整操作支持\n * @en Provides complete ECS entity operations in blueprint\n */\n\nimport type { Entity } from '@esengine/ecs-framework';\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Self Entity | 自身实体\n// ============================================================================\n\nexport const GetSelfTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetSelf',\n title: 'Get Self',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the entity that owns this blueprint (获取拥有此蓝图的实体)',\n keywords: ['self', 'this', 'owner', 'entity', 'me'],\n menuPath: ['ECS', 'Entity', 'Get Self'],\n inputs: [],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Self' }\n ]\n};\n\n@RegisterNode(GetSelfTemplate)\nexport class GetSelfExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return { outputs: { entity: context.entity } };\n }\n}\n\n// ============================================================================\n// Create Entity | 创建实体\n// ============================================================================\n\nexport const CreateEntityTemplate: BlueprintNodeTemplate = {\n type: 'ECS_CreateEntity',\n title: 'Create Entity',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Creates a new entity in the scene (在场景中创建新实体)',\n keywords: ['entity', 'create', 'spawn', 'new', 'instantiate'],\n menuPath: ['ECS', 'Entity', 'Create Entity'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: 'NewEntity' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ]\n};\n\n@RegisterNode(CreateEntityTemplate)\nexport class CreateEntityExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const name = context.evaluateInput(node.id, 'name', 'NewEntity') as string;\n const entity = context.scene.createEntity(name);\n return { outputs: { entity }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Destroy Entity | 销毁实体\n// ============================================================================\n\nexport const DestroyEntityTemplate: BlueprintNodeTemplate = {\n type: 'ECS_DestroyEntity',\n title: 'Destroy Entity',\n category: 'entity',\n color: '#8b1e1e',\n description: 'Destroys an entity from the scene (从场景中销毁实体)',\n keywords: ['entity', 'destroy', 'remove', 'delete', 'kill'],\n menuPath: ['ECS', 'Entity', 'Destroy Entity'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(DestroyEntityTemplate)\nexport class DestroyEntityExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', null) as Entity | null;\n if (entity && !entity.isDestroyed) {\n entity.destroy();\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Destroy Self | 销毁自身\n// ============================================================================\n\nexport const DestroySelfTemplate: BlueprintNodeTemplate = {\n type: 'ECS_DestroySelf',\n title: 'Destroy Self',\n category: 'entity',\n color: '#8b1e1e',\n description: 'Destroys the entity that owns this blueprint (销毁拥有此蓝图的实体)',\n keywords: ['self', 'destroy', 'suicide', 'remove', 'delete'],\n menuPath: ['ECS', 'Entity', 'Destroy Self'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: []\n};\n\n@RegisterNode(DestroySelfTemplate)\nexport class DestroySelfExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (!context.entity.isDestroyed) {\n context.entity.destroy();\n }\n return { nextExec: null };\n }\n}\n\n// ============================================================================\n// Is Valid | 是否有效\n// ============================================================================\n\nexport const IsValidTemplate: BlueprintNodeTemplate = {\n type: 'ECS_IsValid',\n title: 'Is Valid',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Checks if an entity reference is valid and not destroyed (检查实体引用是否有效且未被销毁)',\n keywords: ['entity', 'valid', 'null', 'check', 'exists', 'alive'],\n menuPath: ['ECS', 'Entity', 'Is Valid'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'isValid', type: 'bool', displayName: 'Is Valid' }\n ]\n};\n\n@RegisterNode(IsValidTemplate)\nexport class IsValidExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', null) as Entity | null;\n const isValid = entity != null && !entity.isDestroyed;\n return { outputs: { isValid } };\n }\n}\n\n// ============================================================================\n// Get Entity Name | 获取实体名称\n// ============================================================================\n\nexport const GetEntityNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityName',\n title: 'Get Entity Name',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the name of an entity (获取实体的名称)',\n keywords: ['entity', 'name', 'get', 'string'],\n menuPath: ['ECS', 'Entity', 'Get Name'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'name', type: 'string', displayName: 'Name' }\n ]\n};\n\n@RegisterNode(GetEntityNameTemplate)\nexport class GetEntityNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { name: entity?.name ?? '' } };\n }\n}\n\n// ============================================================================\n// Set Entity Name | 设置实体名称\n// ============================================================================\n\nexport const SetEntityNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityName',\n title: 'Set Entity Name',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets the name of an entity (设置实体的名称)',\n keywords: ['entity', 'name', 'set', 'rename'],\n menuPath: ['ECS', 'Entity', 'Set Name'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityNameTemplate)\nexport class SetEntityNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const name = context.evaluateInput(node.id, 'name', '') as string;\n if (entity && !entity.isDestroyed) {\n entity.name = name;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Entity Tag | 获取实体标签\n// ============================================================================\n\nexport const GetEntityTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityTag',\n title: 'Get Entity Tag',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the tag of an entity (获取实体的标签)',\n keywords: ['entity', 'tag', 'get', 'category'],\n menuPath: ['ECS', 'Entity', 'Get Tag'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'tag', type: 'int', displayName: 'Tag' }\n ]\n};\n\n@RegisterNode(GetEntityTagTemplate)\nexport class GetEntityTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { tag: entity?.tag ?? 0 } };\n }\n}\n\n// ============================================================================\n// Set Entity Tag | 设置实体标签\n// ============================================================================\n\nexport const SetEntityTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityTag',\n title: 'Set Entity Tag',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets the tag of an entity (设置实体的标签)',\n keywords: ['entity', 'tag', 'set', 'category'],\n menuPath: ['ECS', 'Entity', 'Set Tag'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'tag', type: 'int', displayName: 'Tag', defaultValue: 0 }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityTagTemplate)\nexport class SetEntityTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const tag = context.evaluateInput(node.id, 'tag', 0) as number;\n if (entity && !entity.isDestroyed) {\n entity.tag = tag;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Set Entity Active | 设置实体激活状态\n// ============================================================================\n\nexport const SetEntityActiveTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetEntityActive',\n title: 'Set Active',\n category: 'entity',\n color: '#1e5a8b',\n description: 'Sets whether an entity is active (设置实体是否激活)',\n keywords: ['entity', 'active', 'enable', 'disable', 'visible'],\n menuPath: ['ECS', 'Entity', 'Set Active'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'active', type: 'bool', displayName: 'Active', defaultValue: true }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(SetEntityActiveTemplate)\nexport class SetEntityActiveExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const active = context.evaluateInput(node.id, 'active', true) as boolean;\n if (entity && !entity.isDestroyed) {\n entity.active = active;\n }\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Is Entity Active | 实体是否激活\n// ============================================================================\n\nexport const IsEntityActiveTemplate: BlueprintNodeTemplate = {\n type: 'ECS_IsEntityActive',\n title: 'Is Active',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Checks if an entity is active (检查实体是否激活)',\n keywords: ['entity', 'active', 'enabled', 'check'],\n menuPath: ['ECS', 'Entity', 'Is Active'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'isActive', type: 'bool', displayName: 'Is Active' }\n ]\n};\n\n@RegisterNode(IsEntityActiveTemplate)\nexport class IsEntityActiveExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { isActive: entity?.active ?? false } };\n }\n}\n\n// ============================================================================\n// Find Entity By Name | 按名称查找实体\n// ============================================================================\n\nexport const FindEntityByNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntityByName',\n title: 'Find Entity By Name',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds an entity by name in the scene (在场景中按名称查找实体)',\n keywords: ['entity', 'find', 'name', 'search', 'get', 'lookup'],\n menuPath: ['ECS', 'Entity', 'Find By Name'],\n inputs: [\n { name: 'name', type: 'string', displayName: 'Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(FindEntityByNameTemplate)\nexport class FindEntityByNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const name = context.evaluateInput(node.id, 'name', '') as string;\n const entity = context.scene.findEntity(name);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n\n// ============================================================================\n// Find Entities By Tag | 按标签查找实体\n// ============================================================================\n\nexport const FindEntitiesByTagTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntitiesByTag',\n title: 'Find Entities By Tag',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds all entities with a specific tag (查找所有具有特定标签的实体)',\n keywords: ['entity', 'find', 'tag', 'search', 'get', 'all'],\n menuPath: ['ECS', 'Entity', 'Find By Tag'],\n inputs: [\n { name: 'tag', type: 'int', displayName: 'Tag', defaultValue: 0 }\n ],\n outputs: [\n { name: 'entities', type: 'array', displayName: 'Entities', arrayType: 'entity' },\n { name: 'count', type: 'int', displayName: 'Count' }\n ]\n};\n\n@RegisterNode(FindEntitiesByTagTemplate)\nexport class FindEntitiesByTagExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const tag = context.evaluateInput(node.id, 'tag', 0) as number;\n const entities = context.scene.findEntitiesByTag(tag);\n return {\n outputs: {\n entities,\n count: entities.length\n }\n };\n }\n}\n\n// ============================================================================\n// Get Entity ID | 获取实体 ID\n// ============================================================================\n\nexport const GetEntityIdTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityId',\n title: 'Get Entity ID',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Gets the unique ID of an entity (获取实体的唯一ID)',\n keywords: ['entity', 'id', 'identifier', 'unique'],\n menuPath: ['ECS', 'Entity', 'Get ID'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'id', type: 'int', displayName: 'ID' }\n ]\n};\n\n@RegisterNode(GetEntityIdTemplate)\nexport class GetEntityIdExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n return { outputs: { id: entity?.id ?? -1 } };\n }\n}\n\n// ============================================================================\n// Find Entity By ID | 按 ID 查找实体\n// ============================================================================\n\nexport const FindEntityByIdTemplate: BlueprintNodeTemplate = {\n type: 'ECS_FindEntityById',\n title: 'Find Entity By ID',\n category: 'entity',\n color: '#1e5a8b',\n isPure: true,\n description: 'Finds an entity by its unique ID (通过唯一ID查找实体)',\n keywords: ['entity', 'find', 'id', 'identifier'],\n menuPath: ['ECS', 'Entity', 'Find By ID'],\n inputs: [\n { name: 'id', type: 'int', displayName: 'ID', defaultValue: 0 }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(FindEntityByIdTemplate)\nexport class FindEntityByIdExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const id = context.evaluateInput(node.id, 'id', 0) as number;\n const entity = context.scene.findEntityById(id);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n","/**\n * @zh ECS 组件操作节点\n * @en ECS Component Operation Nodes\n *\n * @zh 提供蓝图中对 ECS 组件的完整操作支持\n * @en Provides complete ECS component operations in blueprint\n */\n\nimport type { Entity, Component } from '@esengine/ecs-framework';\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Add Component (Generic) | 添加组件(通用)\n// ============================================================================\n\nexport const AddComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_AddComponent',\n title: 'Add Component',\n category: 'component',\n color: '#1e8b8b',\n description: 'Adds a component to an entity by type name (按类型名称为实体添加组件)',\n keywords: ['component', 'add', 'create', 'attach'],\n menuPath: ['ECS', 'Component', 'Add Component'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n};\n\n@RegisterNode(AddComponentTemplate)\nexport class AddComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n // Check if component already exists\n const existing = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n if (existing) {\n return { outputs: { component: existing, success: false }, nextExec: 'exec' };\n }\n\n // Try to create component from registry\n const ComponentClass = context.getComponentClass?.(componentType);\n if (!ComponentClass) {\n console.warn(`[Blueprint] Component type not found: ${componentType}`);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n\n try {\n const component = new ComponentClass();\n entity.addComponent(component);\n return { outputs: { component, success: true }, nextExec: 'exec' };\n } catch (error) {\n console.error(`[Blueprint] Failed to add component ${componentType}:`, error);\n return { outputs: { component: null, success: false }, nextExec: 'exec' };\n }\n }\n}\n\n// ============================================================================\n// Has Component | 是否有组件\n// ============================================================================\n\nexport const HasComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_HasComponent',\n title: 'Has Component',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Checks if an entity has a component of the specified type (检查实体是否拥有指定类型的组件)',\n keywords: ['component', 'has', 'check', 'exists', 'contains'],\n menuPath: ['ECS', 'Component', 'Has Component'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'hasComponent', type: 'bool', displayName: 'Has Component' }\n ]\n};\n\n@RegisterNode(HasComponentTemplate)\nexport class HasComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { hasComponent: false } };\n }\n\n const hasIt = entity.components.some(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n return { outputs: { hasComponent: hasIt } };\n }\n}\n\n// ============================================================================\n// Get Component | 获取组件\n// ============================================================================\n\nexport const GetComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponent',\n title: 'Get Component',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets a component from an entity by type name (按类型名称从实体获取组件)',\n keywords: ['component', 'get', 'find', 'access'],\n menuPath: ['ECS', 'Component', 'Get Component'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetComponentTemplate)\nexport class GetComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { component: null, found: false } };\n }\n\n const component = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n return {\n outputs: {\n component: component ?? null,\n found: component != null\n }\n };\n }\n}\n\n// ============================================================================\n// Get All Components | 获取所有组件\n// ============================================================================\n\nexport const GetAllComponentsTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetAllComponents',\n title: 'Get All Components',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets all components from an entity (获取实体的所有组件)',\n keywords: ['component', 'get', 'all', 'list'],\n menuPath: ['ECS', 'Component', 'Get All Components'],\n inputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' }\n ],\n outputs: [\n { name: 'components', type: 'array', displayName: 'Components', arrayType: 'component' },\n { name: 'count', type: 'int', displayName: 'Count' }\n ]\n};\n\n@RegisterNode(GetAllComponentsTemplate)\nexport class GetAllComponentsExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n\n if (!entity || entity.isDestroyed) {\n return { outputs: { components: [], count: 0 } };\n }\n\n const components = [...entity.components];\n return {\n outputs: {\n components,\n count: components.length\n }\n };\n }\n}\n\n// ============================================================================\n// Remove Component | 移除组件\n// ============================================================================\n\nexport const RemoveComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_RemoveComponent',\n title: 'Remove Component',\n category: 'component',\n color: '#8b1e1e',\n description: 'Removes a component from an entity (从实体移除组件)',\n keywords: ['component', 'remove', 'delete', 'destroy'],\n menuPath: ['ECS', 'Component', 'Remove Component'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'componentType', type: 'string', displayName: 'Component Type', defaultValue: '' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'removed', type: 'bool', displayName: 'Removed' }\n ]\n};\n\n@RegisterNode(RemoveComponentTemplate)\nexport class RemoveComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const entity = context.evaluateInput(node.id, 'entity', context.entity) as Entity;\n const componentType = context.evaluateInput(node.id, 'componentType', '') as string;\n\n if (!entity || entity.isDestroyed || !componentType) {\n return { outputs: { removed: false }, nextExec: 'exec' };\n }\n\n const component = entity.components.find(c =>\n c.constructor.name === componentType ||\n (c.constructor as any).__componentName__ === componentType\n );\n\n if (component) {\n entity.removeComponent(component);\n return { outputs: { removed: true }, nextExec: 'exec' };\n }\n\n return { outputs: { removed: false }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Component Property | 获取组件属性\n// ============================================================================\n\nexport const GetComponentPropertyTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponentProperty',\n title: 'Get Component Property',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets a property value from a component (从组件获取属性值)',\n keywords: ['component', 'property', 'get', 'value', 'field'],\n menuPath: ['ECS', 'Component', 'Get Property'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'propertyName', type: 'string', displayName: 'Property Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'any', displayName: 'Value' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetComponentPropertyTemplate)\nexport class GetComponentPropertyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const propertyName = context.evaluateInput(node.id, 'propertyName', '') as string;\n\n if (!component || !propertyName) {\n return { outputs: { value: null, found: false } };\n }\n\n if (propertyName in component) {\n return {\n outputs: {\n value: (component as any)[propertyName],\n found: true\n }\n };\n }\n\n return { outputs: { value: null, found: false } };\n }\n}\n\n// ============================================================================\n// Set Component Property | 设置组件属性\n// ============================================================================\n\nexport const SetComponentPropertyTemplate: BlueprintNodeTemplate = {\n type: 'ECS_SetComponentProperty',\n title: 'Set Component Property',\n category: 'component',\n color: '#1e8b8b',\n description: 'Sets a property value on a component (设置组件的属性值)',\n keywords: ['component', 'property', 'set', 'value', 'field', 'modify'],\n menuPath: ['ECS', 'Component', 'Set Property'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'component', type: 'component', displayName: 'Component' },\n { name: 'propertyName', type: 'string', displayName: 'Property Name', defaultValue: '' },\n { name: 'value', type: 'any', displayName: 'Value' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'success', type: 'bool', displayName: 'Success' }\n ]\n};\n\n@RegisterNode(SetComponentPropertyTemplate)\nexport class SetComponentPropertyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n const propertyName = context.evaluateInput(node.id, 'propertyName', '') as string;\n const value = context.evaluateInput(node.id, 'value', null);\n\n if (!component || !propertyName) {\n return { outputs: { success: false }, nextExec: 'exec' };\n }\n\n if (propertyName in component) {\n (component as any)[propertyName] = value;\n return { outputs: { success: true }, nextExec: 'exec' };\n }\n\n return { outputs: { success: false }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Component Type Name | 获取组件类型名称\n// ============================================================================\n\nexport const GetComponentTypeNameTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetComponentTypeName',\n title: 'Get Component Type',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets the type name of a component (获取组件的类型名称)',\n keywords: ['component', 'type', 'name', 'class'],\n menuPath: ['ECS', 'Component', 'Get Type Name'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' }\n ],\n outputs: [\n { name: 'typeName', type: 'string', displayName: 'Type Name' }\n ]\n};\n\n@RegisterNode(GetComponentTypeNameTemplate)\nexport class GetComponentTypeNameExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component) {\n return { outputs: { typeName: '' } };\n }\n\n const typeName = (component.constructor as any).__componentName__ ?? component.constructor.name;\n return { outputs: { typeName } };\n }\n}\n\n// ============================================================================\n// Get Entity From Component | 从组件获取实体\n// ============================================================================\n\nexport const GetEntityFromComponentTemplate: BlueprintNodeTemplate = {\n type: 'ECS_GetEntityFromComponent',\n title: 'Get Owner Entity',\n category: 'component',\n color: '#1e8b8b',\n isPure: true,\n description: 'Gets the entity that owns a component (获取拥有组件的实体)',\n keywords: ['component', 'entity', 'owner', 'parent'],\n menuPath: ['ECS', 'Component', 'Get Owner Entity'],\n inputs: [\n { name: 'component', type: 'component', displayName: 'Component' }\n ],\n outputs: [\n { name: 'entity', type: 'entity', displayName: 'Entity' },\n { name: 'found', type: 'bool', displayName: 'Found' }\n ]\n};\n\n@RegisterNode(GetEntityFromComponentTemplate)\nexport class GetEntityFromComponentExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const component = context.evaluateInput(node.id, 'component', null) as Component | null;\n\n if (!component || component.entityId == null) {\n return { outputs: { entity: null, found: false } };\n }\n\n const entity = context.scene.findEntityById(component.entityId);\n return {\n outputs: {\n entity: entity ?? null,\n found: entity != null\n }\n };\n }\n}\n","/**\n * @zh 流程控制节点\n * @en Flow Control Nodes\n *\n * @zh 提供蓝图中的流程控制支持(分支、循环等)\n * @en Provides flow control in blueprint (branch, loop, etc.)\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Branch | 分支\n// ============================================================================\n\nexport const BranchTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Branch',\n title: 'Branch',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes one of two paths based on a condition (根据条件执行两条路径之一)',\n keywords: ['if', 'branch', 'condition', 'switch', 'else'],\n menuPath: ['Flow', 'Branch'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'condition', type: 'bool', displayName: 'Condition', defaultValue: false }\n ],\n outputs: [\n { name: 'true', type: 'exec', displayName: 'True' },\n { name: 'false', type: 'exec', displayName: 'False' }\n ]\n};\n\n@RegisterNode(BranchTemplate)\nexport class BranchExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const condition = context.evaluateInput(node.id, 'condition', false) as boolean;\n return { nextExec: condition ? 'true' : 'false' };\n }\n}\n\n// ============================================================================\n// Sequence | 序列\n// ============================================================================\n\nexport const SequenceTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Sequence',\n title: 'Sequence',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes multiple outputs in order (按顺序执行多个输出)',\n keywords: ['sequence', 'order', 'serial', 'chain'],\n menuPath: ['Flow', 'Sequence'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: [\n { name: 'then0', type: 'exec', displayName: 'Then 0' },\n { name: 'then1', type: 'exec', displayName: 'Then 1' },\n { name: 'then2', type: 'exec', displayName: 'Then 2' },\n { name: 'then3', type: 'exec', displayName: 'Then 3' }\n ]\n};\n\n@RegisterNode(SequenceTemplate)\nexport class SequenceExecutor implements INodeExecutor {\n private currentIndex = 0;\n\n execute(_node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const outputs = ['then0', 'then1', 'then2', 'then3'];\n const nextPin = outputs[this.currentIndex];\n this.currentIndex = (this.currentIndex + 1) % outputs.length;\n\n if (this.currentIndex === 0) {\n return { nextExec: null };\n }\n\n return { nextExec: nextPin };\n }\n}\n\n// ============================================================================\n// Do Once | 只执行一次\n// ============================================================================\n\nexport const DoOnceTemplate: BlueprintNodeTemplate = {\n type: 'Flow_DoOnce',\n title: 'Do Once',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the output only once, subsequent calls are ignored (只执行一次,后续调用被忽略)',\n keywords: ['once', 'single', 'first', 'one'],\n menuPath: ['Flow', 'Do Once'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'reset', type: 'exec', displayName: 'Reset' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ]\n};\n\n@RegisterNode(DoOnceTemplate)\nexport class DoOnceExecutor implements INodeExecutor {\n private executed = false;\n\n execute(node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const inputPin = node.data._lastInputPin as string | undefined;\n\n if (inputPin === 'reset') {\n this.executed = false;\n return { nextExec: null };\n }\n\n if (this.executed) {\n return { nextExec: null };\n }\n\n this.executed = true;\n return { nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Flip Flop | 触发器\n// ============================================================================\n\nexport const FlipFlopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_FlipFlop',\n title: 'Flip Flop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Alternates between two outputs on each execution (每次执行时在两个输出之间交替)',\n keywords: ['flip', 'flop', 'toggle', 'alternate', 'switch'],\n menuPath: ['Flow', 'Flip Flop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' }\n ],\n outputs: [\n { name: 'a', type: 'exec', displayName: 'A' },\n { name: 'b', type: 'exec', displayName: 'B' },\n { name: 'isA', type: 'bool', displayName: 'Is A' }\n ]\n};\n\n@RegisterNode(FlipFlopTemplate)\nexport class FlipFlopExecutor implements INodeExecutor {\n private isA = true;\n\n execute(_node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n const currentIsA = this.isA;\n this.isA = !this.isA;\n\n return {\n outputs: { isA: currentIsA },\n nextExec: currentIsA ? 'a' : 'b'\n };\n }\n}\n\n// ============================================================================\n// Gate | 门\n// ============================================================================\n\nexport const GateTemplate: BlueprintNodeTemplate = {\n type: 'Flow_Gate',\n title: 'Gate',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Controls execution flow with open/close state (通过开/关状态控制执行流)',\n keywords: ['gate', 'open', 'close', 'block', 'allow'],\n menuPath: ['Flow', 'Gate'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: 'Enter' },\n { name: 'open', type: 'exec', displayName: 'Open' },\n { name: 'close', type: 'exec', displayName: 'Close' },\n { name: 'toggle', type: 'exec', displayName: 'Toggle' },\n { name: 'startOpen', type: 'bool', displayName: 'Start Open', defaultValue: true }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: 'Exit' }\n ]\n};\n\n@RegisterNode(GateTemplate)\nexport class GateExecutor implements INodeExecutor {\n private isOpen: boolean | null = null;\n\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (this.isOpen === null) {\n this.isOpen = context.evaluateInput(node.id, 'startOpen', true) as boolean;\n }\n\n const inputPin = node.data._lastInputPin as string | undefined;\n\n switch (inputPin) {\n case 'open':\n this.isOpen = true;\n return { nextExec: null };\n case 'close':\n this.isOpen = false;\n return { nextExec: null };\n case 'toggle':\n this.isOpen = !this.isOpen;\n return { nextExec: null };\n default:\n return { nextExec: this.isOpen ? 'exec' : null };\n }\n }\n}\n\n// ============================================================================\n// For Loop | For 循环\n// ============================================================================\n\nexport const ForLoopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_ForLoop',\n title: 'For Loop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the loop body for each index in range (对范围内的每个索引执行循环体)',\n keywords: ['for', 'loop', 'iterate', 'repeat', 'count'],\n menuPath: ['Flow', 'For Loop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'start', type: 'int', displayName: 'Start', defaultValue: 0 },\n { name: 'end', type: 'int', displayName: 'End', defaultValue: 10 }\n ],\n outputs: [\n { name: 'loopBody', type: 'exec', displayName: 'Loop Body' },\n { name: 'completed', type: 'exec', displayName: 'Completed' },\n { name: 'index', type: 'int', displayName: 'Index' }\n ]\n};\n\n@RegisterNode(ForLoopTemplate)\nexport class ForLoopExecutor implements INodeExecutor {\n private currentIndex = 0;\n private endIndex = 0;\n private isRunning = false;\n\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n if (!this.isRunning) {\n this.currentIndex = context.evaluateInput(node.id, 'start', 0) as number;\n this.endIndex = context.evaluateInput(node.id, 'end', 10) as number;\n this.isRunning = true;\n }\n\n if (this.currentIndex < this.endIndex) {\n const index = this.currentIndex;\n this.currentIndex++;\n\n return {\n outputs: { index },\n nextExec: 'loopBody'\n };\n }\n\n this.isRunning = false;\n return {\n outputs: { index: this.endIndex },\n nextExec: 'completed'\n };\n }\n}\n\n// ============================================================================\n// While Loop | While 循环\n// ============================================================================\n\nexport const WhileLoopTemplate: BlueprintNodeTemplate = {\n type: 'Flow_WhileLoop',\n title: 'While Loop',\n category: 'flow',\n color: '#4a4a4a',\n description: 'Executes the loop body while condition is true (当条件为真时执行循环体)',\n keywords: ['while', 'loop', 'repeat', 'condition'],\n menuPath: ['Flow', 'While Loop'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'condition', type: 'bool', displayName: 'Condition', defaultValue: true }\n ],\n outputs: [\n { name: 'loopBody', type: 'exec', displayName: 'Loop Body' },\n { name: 'completed', type: 'exec', displayName: 'Completed' }\n ]\n};\n\n@RegisterNode(WhileLoopTemplate)\nexport class WhileLoopExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const condition = context.evaluateInput(node.id, 'condition', true) as boolean;\n\n if (condition) {\n return { nextExec: 'loopBody' };\n }\n\n return { nextExec: 'completed' };\n }\n}\n","/**\n * @zh 变量节点 - 读取和设置蓝图变量\n * @en Variable Nodes - Get and set blueprint variables\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// ============================================================================\n// Get Variable | 获取变量\n// ============================================================================\n\nexport const GetVariableTemplate: BlueprintNodeTemplate = {\n type: 'GetVariable',\n title: 'Get Variable',\n category: 'variable',\n color: '#4a9c6d',\n isPure: true,\n description: 'Gets the value of a variable (获取变量的值)',\n keywords: ['variable', 'get', 'read', 'value'],\n menuPath: ['Variable', 'Get Variable'],\n inputs: [\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'any', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(GetVariableTemplate)\nexport class GetVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n\n if (!variableName) {\n return { outputs: { value: null } };\n }\n\n const value = context.getVariable(variableName);\n return { outputs: { value } };\n }\n}\n\n// ============================================================================\n// Set Variable | 设置变量\n// ============================================================================\n\nexport const SetVariableTemplate: BlueprintNodeTemplate = {\n type: 'SetVariable',\n title: 'Set Variable',\n category: 'variable',\n color: '#4a9c6d',\n description: 'Sets the value of a variable (设置变量的值)',\n keywords: ['variable', 'set', 'write', 'assign', 'value'],\n menuPath: ['Variable', 'Set Variable'],\n inputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' },\n { name: 'value', type: 'any', displayName: 'Value' }\n ],\n outputs: [\n { name: 'exec', type: 'exec', displayName: '' },\n { name: 'value', type: 'any', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(SetVariableTemplate)\nexport class SetVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n const value = context.evaluateInput(node.id, 'value', null);\n\n if (!variableName) {\n return { outputs: { value: null }, nextExec: 'exec' };\n }\n\n context.setVariable(variableName, value);\n return { outputs: { value }, nextExec: 'exec' };\n }\n}\n\n// ============================================================================\n// Get Variable By Name (typed variants) | 按名称获取变量(类型变体)\n// ============================================================================\n\nexport const GetBoolVariableTemplate: BlueprintNodeTemplate = {\n type: 'GetBoolVariable',\n title: 'Get Bool',\n category: 'variable',\n color: '#8b1e3f',\n isPure: true,\n description: 'Gets a boolean variable (获取布尔变量)',\n keywords: ['variable', 'get', 'bool', 'boolean'],\n menuPath: ['Variable', 'Get Bool'],\n inputs: [\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'bool', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(GetBoolVariableTemplate)\nexport class GetBoolVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n const value = context.getVariable(variableName);\n return { outputs: { value: Boolean(value) } };\n }\n}\n\nexport const GetFloatVariableTemplate: BlueprintNodeTemplate = {\n type: 'GetFloatVariable',\n title: 'Get Float',\n category: 'variable',\n color: '#39c5bb',\n isPure: true,\n description: 'Gets a float variable (获取浮点变量)',\n keywords: ['variable', 'get', 'float', 'number'],\n menuPath: ['Variable', 'Get Float'],\n inputs: [\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'float', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(GetFloatVariableTemplate)\nexport class GetFloatVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n const value = context.getVariable(variableName);\n return { outputs: { value: Number(value) || 0 } };\n }\n}\n\nexport const GetIntVariableTemplate: BlueprintNodeTemplate = {\n type: 'GetIntVariable',\n title: 'Get Int',\n category: 'variable',\n color: '#1c8b8b',\n isPure: true,\n description: 'Gets an integer variable (获取整数变量)',\n keywords: ['variable', 'get', 'int', 'integer', 'number'],\n menuPath: ['Variable', 'Get Int'],\n inputs: [\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'int', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(GetIntVariableTemplate)\nexport class GetIntVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n const value = context.getVariable(variableName);\n return { outputs: { value: Math.floor(Number(value) || 0) } };\n }\n}\n\nexport const GetStringVariableTemplate: BlueprintNodeTemplate = {\n type: 'GetStringVariable',\n title: 'Get String',\n category: 'variable',\n color: '#e91e8c',\n isPure: true,\n description: 'Gets a string variable (获取字符串变量)',\n keywords: ['variable', 'get', 'string', 'text'],\n menuPath: ['Variable', 'Get String'],\n inputs: [\n { name: 'variableName', type: 'string', displayName: 'Variable Name', defaultValue: '' }\n ],\n outputs: [\n { name: 'value', type: 'string', displayName: 'Value' }\n ]\n};\n\n@RegisterNode(GetStringVariableTemplate)\nexport class GetStringVariableExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const variableName = context.evaluateInput(node.id, 'variableName', '') as string;\n const value = context.getVariable(variableName);\n return { outputs: { value: String(value ?? '') } };\n }\n}\n","/**\n * Math Operation Nodes - Basic arithmetic operations\n * 数学运算节点 - 基础算术运算\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n// Add Node (加法节点)\nexport const AddTemplate: BlueprintNodeTemplate = {\n type: 'Add',\n title: 'Add',\n category: 'math',\n color: '#4CAF50',\n description: 'Adds two numbers together (将两个数字相加)',\n keywords: ['add', 'plus', 'sum', '+', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(AddTemplate)\nexport class AddExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 0));\n return { outputs: { result: a + b } };\n }\n}\n\n// Subtract Node (减法节点)\nexport const SubtractTemplate: BlueprintNodeTemplate = {\n type: 'Subtract',\n title: 'Subtract',\n category: 'math',\n color: '#4CAF50',\n description: 'Subtracts B from A (从 A 减去 B)',\n keywords: ['subtract', 'minus', '-', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 0 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(SubtractTemplate)\nexport class SubtractExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 0));\n return { outputs: { result: a - b } };\n }\n}\n\n// Multiply Node (乘法节点)\nexport const MultiplyTemplate: BlueprintNodeTemplate = {\n type: 'Multiply',\n title: 'Multiply',\n category: 'math',\n color: '#4CAF50',\n description: 'Multiplies two numbers (将两个数字相乘)',\n keywords: ['multiply', 'times', '*', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(MultiplyTemplate)\nexport class MultiplyExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 1));\n return { outputs: { result: a * b } };\n }\n}\n\n// Divide Node (除法节点)\nexport const DivideTemplate: BlueprintNodeTemplate = {\n type: 'Divide',\n title: 'Divide',\n category: 'math',\n color: '#4CAF50',\n description: 'Divides A by B (A 除以 B)',\n keywords: ['divide', '/', 'math'],\n isPure: true,\n inputs: [\n { name: 'a', type: 'float', displayName: 'A', defaultValue: 0 },\n { name: 'b', type: 'float', displayName: 'B', defaultValue: 1 }\n ],\n outputs: [\n { name: 'result', type: 'float', displayName: 'Result' }\n ]\n};\n\n@RegisterNode(DivideTemplate)\nexport class DivideExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const a = Number(context.evaluateInput(node.id, 'a', 0));\n const b = Number(context.evaluateInput(node.id, 'b', 1));\n\n // Prevent division by zero (防止除零)\n if (b === 0) {\n return { outputs: { result: 0 } };\n }\n\n return { outputs: { result: a / b } };\n }\n}\n","/**\n * Get Delta Time Node - Returns the time since last frame\n * 获取增量时间节点 - 返回上一帧以来的时间\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * GetDeltaTime node template\n * GetDeltaTime 节点模板\n */\nexport const GetDeltaTimeTemplate: BlueprintNodeTemplate = {\n type: 'GetDeltaTime',\n title: 'Get Delta Time',\n category: 'time',\n color: '#4FC3F7',\n description: 'Returns the time elapsed since the last frame in seconds (返回上一帧以来经过的时间,单位秒)',\n keywords: ['delta', 'time', 'frame', 'dt'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'deltaTime',\n type: 'float',\n displayName: 'Delta Seconds'\n }\n ]\n};\n\n/**\n * GetDeltaTime node executor\n * GetDeltaTime 节点执行器\n */\n@RegisterNode(GetDeltaTimeTemplate)\nexport class GetDeltaTimeExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n outputs: {\n deltaTime: context.deltaTime\n }\n };\n }\n}\n","/**\n * Get Time Node - Returns the total time since blueprint started\n * 获取时间节点 - 返回蓝图启动以来的总时间\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * GetTime node template\n * GetTime 节点模板\n */\nexport const GetTimeTemplate: BlueprintNodeTemplate = {\n type: 'GetTime',\n title: 'Get Game Time',\n category: 'time',\n color: '#4FC3F7',\n description: 'Returns the total time since the blueprint started in seconds (返回蓝图启动以来的总时间,单位秒)',\n keywords: ['time', 'total', 'elapsed', 'game'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'time',\n type: 'float',\n displayName: 'Seconds'\n }\n ]\n};\n\n/**\n * GetTime node executor\n * GetTime 节点执行器\n */\n@RegisterNode(GetTimeTemplate)\nexport class GetTimeExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n return {\n outputs: {\n time: context.time\n }\n };\n }\n}\n","/**\n * Delay Node - Pauses execution for a specified duration\n * 延迟节点 - 暂停执行指定的时长\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * Delay node template\n * Delay 节点模板\n */\nexport const DelayTemplate: BlueprintNodeTemplate = {\n type: 'Delay',\n title: 'Delay',\n category: 'flow',\n color: '#FFFFFF',\n description: 'Pauses execution for a specified number of seconds (暂停执行指定的秒数)',\n keywords: ['wait', 'delay', 'pause', 'sleep', 'timer'],\n inputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'duration',\n type: 'float',\n displayName: 'Duration',\n defaultValue: 1.0\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: 'Completed'\n }\n ]\n};\n\n/**\n * Delay node executor\n * Delay 节点执行器\n */\n@RegisterNode(DelayTemplate)\nexport class DelayExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const duration = context.evaluateInput(node.id, 'duration', 1.0) as number;\n\n return {\n nextExec: 'exec',\n delay: duration\n };\n }\n}\n","/**\n * Print Node - Outputs a message for debugging\n * 打印节点 - 输出调试消息\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * Print node template\n * Print 节点模板\n */\nexport const PrintTemplate: BlueprintNodeTemplate = {\n type: 'Print',\n title: 'Print String',\n category: 'debug',\n color: '#785EF0',\n description: 'Prints a message to the console for debugging (打印消息到控制台用于调试)',\n keywords: ['log', 'debug', 'console', 'output', 'print'],\n inputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'message',\n type: 'string',\n displayName: 'Message',\n defaultValue: 'Hello Blueprint!'\n },\n {\n name: 'printToScreen',\n type: 'bool',\n displayName: 'Print to Screen',\n defaultValue: true\n },\n {\n name: 'duration',\n type: 'float',\n displayName: 'Duration',\n defaultValue: 2.0\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n }\n ]\n};\n\n/**\n * Print node executor\n * Print 节点执行器\n */\n@RegisterNode(PrintTemplate)\nexport class PrintExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: ExecutionContext): ExecutionResult {\n const message = context.evaluateInput(node.id, 'message', 'Hello Blueprint!');\n const printToScreen = context.evaluateInput(node.id, 'printToScreen', true);\n const duration = context.evaluateInput(node.id, 'duration', 2.0);\n\n // Console output\n // 控制台输出\n console.log(`[Blueprint] ${message}`);\n\n // Screen output via event (handled by runtime)\n // 通过事件输出到屏幕(由运行时处理)\n if (printToScreen) {\n const event = new CustomEvent('blueprint:print', {\n detail: {\n message: String(message),\n duration: Number(duration),\n entityId: context.entity.id,\n entityName: context.entity.name\n }\n });\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(event);\n }\n }\n\n return {\n nextExec: 'exec'\n };\n }\n}\n","/**\n * @esengine/blueprint - Visual scripting system for ECS Framework\n *\n * @zh 蓝图可视化脚本系统 - 与 ECS 框架深度集成\n * @en Visual scripting system - Deep integration with ECS framework\n *\n * @zh 此包提供完整的可视化脚本功能:\n * - 内置 ECS 操作节点(Entity、Component、Flow)\n * - 组件自动节点生成(使用装饰器标记)\n * - 运行时蓝图执行\n *\n * @en This package provides complete visual scripting features:\n * - Built-in ECS operation nodes (Entity, Component, Flow)\n * - Auto component node generation (using decorators)\n * - Runtime blueprint execution\n *\n * @example 基础使用 | Basic Usage:\n * ```typescript\n * import { BlueprintSystem, BlueprintComponent } from '@esengine/blueprint';\n * import { Scene, Core } from '@esengine/ecs-framework';\n *\n * // 创建场景并添加蓝图系统\n * const scene = new Scene();\n * scene.addSystem(new BlueprintSystem());\n * Core.setScene(scene);\n *\n * // 为实体添加蓝图\n * const entity = scene.createEntity('Player');\n * const blueprint = new BlueprintComponent();\n * blueprint.blueprintAsset = await loadBlueprintAsset('player.bp');\n * entity.addComponent(blueprint);\n * ```\n *\n * @example 标记组件 | Mark Components:\n * ```typescript\n * import { BlueprintExpose, BlueprintProperty, BlueprintMethod } from '@esengine/blueprint';\n * import { Component, ECSComponent } from '@esengine/ecs-framework';\n *\n * @ECSComponent('Health')\n * @BlueprintExpose({ displayName: '生命值' })\n * export class HealthComponent extends Component {\n * @BlueprintProperty({ displayName: '当前生命值' })\n * current: number = 100;\n *\n * @BlueprintMethod({ displayName: '治疗' })\n * heal(amount: number): void {\n * this.current += amount;\n * }\n * }\n * ```\n *\n * @packageDocumentation\n */\n\n// Types\nexport * from './types';\n\n// Runtime\nexport * from './runtime';\n\n// Triggers\nexport * from './triggers';\n\n// Composition\nexport * from './composition';\n\n// Registry (decorators & auto-generation)\nexport * from './registry';\n\n// Nodes (import to register built-in nodes)\nimport './nodes';\n\n// Re-export commonly used items\nexport { NodeRegistry, RegisterNode } from './runtime/NodeRegistry';\nexport { BlueprintVM } from './runtime/BlueprintVM';\nexport { BlueprintComponent } from './runtime/BlueprintComponent';\nexport { BlueprintSystem } from './runtime/BlueprintSystem';\nexport { ExecutionContext } from './runtime/ExecutionContext';\nexport { createEmptyBlueprint, validateBlueprintAsset } from './types/blueprint';\n\n// Component registration helper\nimport { ExecutionContext } from './runtime/ExecutionContext';\nimport type { Component } from '@esengine/ecs-framework';\n\n/**\n * @zh 注册组件类以支持在蓝图中动态创建\n * @en Register a component class for dynamic creation in blueprints\n *\n * @example\n * ```typescript\n * import { registerComponentClass } from '@esengine/blueprint';\n * import { MyComponent } from './MyComponent';\n *\n * registerComponentClass('MyComponent', MyComponent);\n * ```\n */\nexport function registerComponentClass(typeName: string, componentClass: new () => Component): void {\n ExecutionContext.registerComponentClass(typeName, componentClass);\n}\n\n// Re-export registry for convenience\nexport {\n BlueprintExpose,\n BlueprintProperty,\n BlueprintMethod,\n registerAllComponentNodes,\n registerComponentNodes\n} from './registry';\n"],"mappings":"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","names":["getPinTypeColor","type","colors","exec","bool","int","float","string","vector2","vector3","color","entity","component","object","array","any","arePinTypesCompatible","from","to","numericTypes","includes","vectorTypes","getNodeCategoryColor","category","colors","event","flow","entity","component","math","logic","variable","input","physics","audio","time","debug","custom","createEmptyBlueprint","name","includeBeginPlay","nodes","push","id","type","position","x","y","data","version","metadata","createdAt","Date","now","modifiedAt","variables","connections","validateBlueprintAsset","asset","bp","Array","isArray","registeredComponents","Map","getRegisteredBlueprintComponents","getBlueprintMetadata","componentClass","get","clearRegisteredComponents","clear","getOrCreateMetadata","constructor","metadata","componentName","__componentName__","name","properties","methods","set","BlueprintExpose","options","target","Object","assign","BlueprintProperty","propertyKey","key","String","propMeta","displayName","description","pinType","type","readonly","defaultValue","existingIndex","findIndex","p","push","BlueprintMethod","descriptor","methodMeta","methodKey","isPure","params","returnType","m","inferPinType","typeName","typeMap","ExecutionContext","blueprint","entity","scene","deltaTime","time","_instanceVariables","Map","_localVariables","_outputCache","_connectionsByTarget","_connectionsBySource","variable","variables","scope","set","name","defaultValue","_buildConnectionMaps","conn","connections","targetKey","toNodeId","toPin","has","get","push","sourceKey","fromNodeId","fromPin","getNode","nodeId","nodes","find","n","id","getConnectionsToPin","pinName","getConnectionsFromPin","evaluateInput","length","node","data","cachedOutputs","setOutputs","outputs","getOutputs","clearOutputCache","clear","getVariable","_globalVariables","varDef","v","setVariable","value","getInstanceVariables","setInstanceVariables","clearGlobalVariables","getComponentClass","typeName","blueprintComponents","getRegisteredBlueprintComponents","componentClass","metadata","componentName","_componentRegistry","registerComponentClass","unregisterComponentClass","delete","getRegisteredComponentClasses","NodeRegistry","_nodes","Map","instance","_instance","register","template","executor","has","type","console","warn","set","get","getTemplate","getExecutor","getAllTemplates","Array","from","values","map","d","getTemplatesByCategory","category","filter","t","searchTemplates","keyword","lower","toLowerCase","title","includes","keywords","some","k","description","clear","RegisterNode","constructor","BlueprintVM","blueprint","entity","scene","_context","_pendingExecutions","_eventNodes","Map","_isRunning","_currentTime","_maxStepsPerFrame","debug","ExecutionContext","_cacheEventNodes","context","isRunning","node","nodes","type","startsWith","eventType","has","set","get","push","start","triggerEvent","stop","pause","resume","tick","deltaTime","time","_processPendingExecutions","data","eventNodes","_executeFromNode","triggerCustomEvent","eventName","startNode","startPin","eventData","clearOutputCache","setOutputs","id","currentNodeId","currentPin","steps","connections","getConnectionsFromPin","length","nextConn","result","_executeNode","toNodeId","error","console","delay","nodeId","execPin","nextExec","resumeTime","yield","warn","getNode","executor","NodeRegistry","instance","getExecutor","log","execute","outputs","stillPending","pending","getInstanceVariables","setInstanceVariables","variables","Component","ECSComponent","BlueprintComponent","Component","blueprintAsset","blueprintPath","autoStart","debug","vm","isStarted","initialize","entity","scene","BlueprintVM","start","stop","tick","deltaTime","cleanup","EntitySystem","Matcher","ECSSystem","Time","generateComponentNodes","componentClass","metadata","componentName","properties","methods","category","color","generateAddComponentNode","generateGetComponentNode","prop","generatePropertyGetNode","readonly","generatePropertySetNode","method","generateMethodCallNode","nodeType","displayName","propertyInputs","propertyDefaults","push","name","propertyKey","type","pinType","defaultValue","template","title","description","keywords","toLowerCase","menuPath","inputs","outputs","propertyKeys","filter","p","map","executor","execute","node","context","entity","evaluateInput","id","isDestroyed","component","success","nextExec","existing","components","find","c","__componentName__","key","value","undefined","addComponent","error","console","NodeRegistry","instance","register","isPure","found","subtitle","methodKey","params","returnType","paramNames","param","result","args","fn","warn","apply","registerAllComponentNodes","getRegisteredBlueprintComponents","log","length","size","registerComponentNodes","get","BlueprintSystem","EntitySystem","Matcher","all","BlueprintComponent","_componentsRegistered","onInitialize","registerAllComponentNodes","process","entities","dt","Time","deltaTime","entity","blueprint","getComponent","blueprintAsset","vm","initialize","scene","autoStart","isStarted","start","tick","onRemoved","cleanup","TriggerTypes","TICK","INPUT","COLLISION","MESSAGE","TIMER","STATE_ENTER","STATE_EXIT","CUSTOM","createTickContext","deltaTime","frameCount","sourceEntityId","type","timestamp","Date","now","createInputContext","action","value","options","pressed","released","createCollisionContext","otherEntityId","isEnter","isExit","point","normal","createMessageContext","messageName","payload","senderId","createTimerContext","timerId","isRepeating","timesFired","createStateContext","stateMachineId","currentState","previousState","createCustomContext","eventName","data","CompositeCondition","_conditions","_logic","type","evaluate","context","length","every","c","some","NotCondition","_condition","AlwaysTrueCondition","_context","AlwaysFalseCondition","TriggerTypeCondition","_allowedTypes","includes","EntityIdCondition","_entityId","_checkSource","sourceEntityId","FunctionCondition","_predicate","InputActionCondition","_action","_checkPressed","_checkReleased","inputContext","action","undefined","pressed","released","MessageNameCondition","_messageName","messageContext","messageName","StateNameCondition","_stateName","_checkCurrent","stateContext","currentState","previousState","TimerIdCondition","_timerId","timerContext","timerId","CollisionEntityCondition","_otherEntityId","_checkEnter","_checkExit","collisionContext","otherEntityId","isEnter","isExit","CustomEventCondition","_eventName","customContext","eventName","ConditionBuilder","and","or","ofType","types","push","fromEntity","entityId","onInput","options","onMessage","onState","stateName","checkCurrent","onTimer","onCollision","onCustomEvent","where","predicate","not","condition","build","_triggerId","generateTriggerId","BlueprintTrigger","config","id","type","condition","priority","enabled","_callback","_callbacks","Set","AlwaysTrueCondition","callback","shouldFire","context","evaluate","fire","addCallback","add","removeCallback","delete","clearCallbacks","clear","TriggerRegistry","_triggers","Map","_triggersByType","register","trigger","has","console","warn","set","get","unregister","triggerId","typeSet","getAll","Array","from","values","getByType","triggers","push","sort","a","b","count","size","createTrigger","createTickTrigger","options","createInputTrigger","createCollisionTrigger","createMessageTrigger","createTimerTrigger","createStateEnterTrigger","createStateExitTrigger","createCustomTrigger","TriggerDispatcher","registry","_registry","_typeSubscribers","Map","_globalSubscribers","Set","_isDispatching","_pendingContexts","TriggerRegistry","dispatch","context","push","triggeredCount","results","result","_doDispatch","length","pendingContext","shift","triggers","getByType","type","trigger","shouldFire","fire","triggerId","id","success","error","Error","message","String","_notifySubscribers","typeSubscribers","get","callback","console","dispatchAsync","Promise","resolve","queueMicrotask","subscribe","has","set","add","unsubscribe","subscribers","delete","subscribeAll","unsubscribeAll","clearSubscriptions","clear","EntityTriggerManager","dispatcher","_dispatcher","_entityTriggers","registerForEntity","entityId","register","unregisterFromEntity","entitySet","unregister","getEntityTriggers","clearEntityTriggers","dispatchToEntity","entityTriggers","createTriggerDispatcher","createEntityTriggerManager","BlueprintFragment","config","id","name","description","category","tags","inputs","outputs","graph","version","icon","color","getAllExposedPins","findInput","find","p","findOutput","createExposedPin","type","direction","internalNodeId","internalPinName","options","displayName","defaultValue","createFragment","fragmentFromAsset","asset","fragment","fragmentToAsset","BlueprintComposer","name","slots","Map","connections","connectionIdCounter","getSlots","Array","from","values","getConnections","addFragment","fragment","slotId","options","has","Error","slot","id","position","x","y","set","removeSlot","toRemove","conn","fromSlotId","toSlotId","push","delete","connect","fromPin","toPin","fromSlot","get","toSlot","fromPinDef","outputs","find","p","toPinDef","inputs","connectionId","connection","disconnect","validate","errors","warnings","input","hasConnection","some","c","defaultValue","undefined","type","message","pinName","output","isValid","length","compile","nodes","variables","nodeIdMap","nodeIdCounter","slotNodeMap","node","graph","newNodeId","newFromId","fromNodeId","newToId","toNodeId","variable","slotConn","fromNodeMap","toNodeMap","internalNodeId","internalPinName","version","metadata","description","size","createdAt","Date","now","modifiedAt","clear","createComposer","FragmentRegistry","fragments","Map","register","fragment","has","id","console","warn","set","unregister","delete","get","getAll","Array","from","values","filter","results","category","f","tags","length","some","t","includes","search","searchLower","toLowerCase","name","description","getCategories","categories","Set","add","sort","getTags","tag","clear","size","defaultFragmentRegistry","createFragmentRegistry","_ts_decorate","EventBeginPlayTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventBeginPlayExecutor","execute","_node","context","nextExec","self","entity","_ts_decorate","EventTickTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventTickExecutor","execute","_node","context","nextExec","self","entity","deltaTime","_ts_decorate","EventEndPlayTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventEndPlayExecutor","execute","_node","context","nextExec","self","entity","_ts_decorate","GetSelfTemplate","type","title","category","color","isPure","description","keywords","menuPath","inputs","outputs","name","displayName","GetSelfExecutor","execute","_node","context","entity","CreateEntityTemplate","defaultValue","CreateEntityExecutor","node","evaluateInput","id","scene","createEntity","nextExec","DestroyEntityTemplate","DestroyEntityExecutor","isDestroyed","destroy","DestroySelfTemplate","DestroySelfExecutor","IsValidTemplate","IsValidExecutor","isValid","GetEntityNameTemplate","GetEntityNameExecutor","SetEntityNameTemplate","SetEntityNameExecutor","GetEntityTagTemplate","GetEntityTagExecutor","tag","SetEntityTagTemplate","SetEntityTagExecutor","SetEntityActiveTemplate","SetEntityActiveExecutor","active","IsEntityActiveTemplate","IsEntityActiveExecutor","isActive","FindEntityByNameTemplate","FindEntityByNameExecutor","findEntity","found","FindEntitiesByTagTemplate","arrayType","FindEntitiesByTagExecutor","entities","findEntitiesByTag","count","length","GetEntityIdTemplate","GetEntityIdExecutor","FindEntityByIdTemplate","FindEntityByIdExecutor","findEntityById","_ts_decorate","AddComponentTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","AddComponentExecutor","execute","node","context","entity","evaluateInput","id","componentType","isDestroyed","component","success","nextExec","existing","components","find","c","__componentName__","ComponentClass","getComponentClass","console","warn","addComponent","error","HasComponentTemplate","isPure","HasComponentExecutor","hasComponent","hasIt","some","GetComponentTemplate","GetComponentExecutor","found","GetAllComponentsTemplate","arrayType","GetAllComponentsExecutor","count","length","RemoveComponentTemplate","RemoveComponentExecutor","removed","removeComponent","GetComponentPropertyTemplate","GetComponentPropertyExecutor","propertyName","value","SetComponentPropertyTemplate","SetComponentPropertyExecutor","GetComponentTypeNameTemplate","GetComponentTypeNameExecutor","typeName","GetEntityFromComponentTemplate","GetEntityFromComponentExecutor","entityId","scene","findEntityById","_ts_decorate","BranchTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","BranchExecutor","execute","node","context","condition","evaluateInput","id","nextExec","SequenceTemplate","SequenceExecutor","currentIndex","_node","_context","nextPin","length","DoOnceTemplate","DoOnceExecutor","executed","inputPin","data","_lastInputPin","FlipFlopTemplate","FlipFlopExecutor","isA","currentIsA","GateTemplate","GateExecutor","isOpen","ForLoopTemplate","ForLoopExecutor","endIndex","isRunning","index","WhileLoopTemplate","WhileLoopExecutor","_ts_decorate","GetVariableTemplate","type","title","category","color","isPure","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","GetVariableExecutor","execute","node","context","variableName","evaluateInput","id","value","getVariable","SetVariableTemplate","SetVariableExecutor","nextExec","setVariable","GetBoolVariableTemplate","GetBoolVariableExecutor","Boolean","GetFloatVariableTemplate","GetFloatVariableExecutor","Number","GetIntVariableTemplate","GetIntVariableExecutor","Math","floor","GetStringVariableTemplate","GetStringVariableExecutor","String","_ts_decorate","AddTemplate","type","title","category","color","description","keywords","isPure","inputs","name","displayName","defaultValue","outputs","AddExecutor","execute","node","context","a","Number","evaluateInput","id","b","result","SubtractTemplate","SubtractExecutor","MultiplyTemplate","MultiplyExecutor","DivideTemplate","DivideExecutor","_ts_decorate","GetDeltaTimeTemplate","type","title","category","color","description","keywords","isPure","inputs","outputs","name","displayName","GetDeltaTimeExecutor","execute","_node","context","deltaTime","_ts_decorate","GetTimeTemplate","type","title","category","color","description","keywords","isPure","inputs","outputs","name","displayName","GetTimeExecutor","execute","_node","context","time","_ts_decorate","DelayTemplate","type","title","category","color","description","keywords","inputs","name","displayName","defaultValue","outputs","DelayExecutor","execute","node","context","duration","evaluateInput","id","nextExec","delay","_ts_decorate","PrintTemplate","type","title","category","color","description","keywords","inputs","name","displayName","defaultValue","outputs","PrintExecutor","execute","node","context","message","evaluateInput","id","printToScreen","duration","console","log","event","CustomEvent","detail","String","Number","entityId","entity","entityName","window","dispatchEvent","nextExec","registerComponentClass","typeName","componentClass","ExecutionContext"]}