@esengine/blueprint 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.ts +2298 -0
- package/dist/index.js +3196 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/pins.ts","../src/types/nodes.ts","../src/types/blueprint.ts","../src/runtime/ExecutionContext.ts","../src/runtime/NodeRegistry.ts","../src/runtime/BlueprintVM.ts","../src/runtime/BlueprintComponent.ts","../src/runtime/BlueprintSystem.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/events/EventInput.ts","../src/nodes/events/EventCollision.ts","../src/nodes/events/EventMessage.ts","../src/nodes/events/EventTimer.ts","../src/nodes/events/EventState.ts","../src/nodes/debug/Print.ts","../src/nodes/time/GetDeltaTime.ts","../src/nodes/time/GetTime.ts","../src/nodes/time/Delay.ts","../src/nodes/math/MathOperations.ts","../src/BlueprintPlugin.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\n * 创建空的蓝图资产\n */\nexport function createEmptyBlueprint(name: string): BlueprintAsset {\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 * Execution Context - Runtime context for blueprint execution\n * 执行上下文 - 蓝图执行的运行时上下文\n */\n\nimport type { Entity, IScene } from '@esengine/ecs-framework';\nimport { BlueprintNode, BlueprintConnection } from '../types/nodes';\nimport { BlueprintAsset } from '../types/blueprint';\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 /** 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 * 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 * Blueprint Component - Attaches a blueprint to an entity\n * 蓝图组件 - 将蓝图附加到实体\n */\n\nimport type { Entity, IScene } from '@esengine/ecs-framework';\nimport { BlueprintAsset } from '../types/blueprint';\nimport { BlueprintVM } from './BlueprintVM';\n\n/**\n * Component interface for ECS integration\n * 用于 ECS 集成的组件接口\n */\nexport interface IBlueprintComponent {\n /** Entity ID this component belongs to (此组件所属的实体ID) */\n entityId: number | null;\n\n /** Blueprint asset reference (蓝图资产引用) */\n blueprintAsset: BlueprintAsset | null;\n\n /** Blueprint asset path for serialization (用于序列化的蓝图资产路径) */\n blueprintPath: string;\n\n /** Auto-start execution when entity is created (实体创建时自动开始执行) */\n autoStart: boolean;\n\n /** Enable debug mode for VM (启用 VM 调试模式) */\n debug: boolean;\n\n /** Runtime VM instance (运行时 VM 实例) */\n vm: BlueprintVM | null;\n\n /** Whether the blueprint has started (蓝图是否已启动) */\n isStarted: boolean;\n}\n\n/**\n * Creates a blueprint component data object\n * 创建蓝图组件数据对象\n */\nexport function createBlueprintComponentData(): IBlueprintComponent {\n return {\n entityId: null,\n blueprintAsset: null,\n blueprintPath: '',\n autoStart: true,\n debug: false,\n vm: null,\n isStarted: false\n };\n}\n\n/**\n * Initialize the VM for a blueprint component\n * 为蓝图组件初始化 VM\n */\nexport function initializeBlueprintVM(\n component: IBlueprintComponent,\n entity: Entity,\n scene: IScene\n): void {\n if (!component.blueprintAsset) {\n return;\n }\n\n // Create VM instance\n // 创建 VM 实例\n component.vm = new BlueprintVM(component.blueprintAsset, entity, scene);\n component.vm.debug = component.debug;\n}\n\n/**\n * Start blueprint execution\n * 开始蓝图执行\n */\nexport function startBlueprint(component: IBlueprintComponent): void {\n if (component.vm && !component.isStarted) {\n component.vm.start();\n component.isStarted = true;\n }\n}\n\n/**\n * Stop blueprint execution\n * 停止蓝图执行\n */\nexport function stopBlueprint(component: IBlueprintComponent): void {\n if (component.vm && component.isStarted) {\n component.vm.stop();\n component.isStarted = false;\n }\n}\n\n/**\n * Update blueprint execution\n * 更新蓝图执行\n */\nexport function tickBlueprint(component: IBlueprintComponent, deltaTime: number): void {\n if (component.vm && component.isStarted) {\n component.vm.tick(deltaTime);\n }\n}\n\n/**\n * Clean up blueprint resources\n * 清理蓝图资源\n */\nexport function cleanupBlueprint(component: IBlueprintComponent): void {\n if (component.vm) {\n if (component.isStarted) {\n component.vm.stop();\n }\n component.vm = null;\n component.isStarted = false;\n }\n}\n","/**\n * Blueprint Execution System - Manages blueprint lifecycle and execution\n * 蓝图执行系统 - 管理蓝图生命周期和执行\n */\n\nimport type { Entity, IScene } from '@esengine/ecs-framework';\nimport {\n IBlueprintComponent,\n initializeBlueprintVM,\n startBlueprint,\n tickBlueprint,\n cleanupBlueprint\n} from './BlueprintComponent';\n\n/**\n * Blueprint system interface for engine integration\n * 用于引擎集成的蓝图系统接口\n */\nexport interface IBlueprintSystem {\n /** Process entities with blueprint components (处理带有蓝图组件的实体) */\n process(entities: IBlueprintEntity[], deltaTime: number): void;\n\n /** Called when entity is added to system (实体添加到系统时调用) */\n onEntityAdded(entity: IBlueprintEntity): void;\n\n /** Called when entity is removed from system (实体从系统移除时调用) */\n onEntityRemoved(entity: IBlueprintEntity): void;\n}\n\n/**\n * Entity with blueprint component\n * 带有蓝图组件的实体\n */\nexport interface IBlueprintEntity extends Entity {\n /** Blueprint component data (蓝图组件数据) */\n blueprintComponent: IBlueprintComponent;\n}\n\n/**\n * Creates a blueprint execution system\n * 创建蓝图执行系统\n */\nexport function createBlueprintSystem(scene: IScene): IBlueprintSystem {\n return {\n process(entities: IBlueprintEntity[], deltaTime: number): void {\n for (const entity of entities) {\n const component = entity.blueprintComponent;\n\n // Skip if no blueprint asset loaded\n // 如果没有加载蓝图资产则跳过\n if (!component.blueprintAsset) {\n continue;\n }\n\n // Initialize VM if needed\n // 如果需要则初始化 VM\n if (!component.vm) {\n initializeBlueprintVM(component, entity, scene);\n }\n\n // Auto-start if enabled\n // 如果启用则自动启动\n if (component.autoStart && !component.isStarted) {\n startBlueprint(component);\n }\n\n // Tick the blueprint\n // 更新蓝图\n tickBlueprint(component, deltaTime);\n }\n },\n\n onEntityAdded(entity: IBlueprintEntity): void {\n const component = entity.blueprintComponent;\n\n if (component.blueprintAsset) {\n initializeBlueprintVM(component, entity, scene);\n\n if (component.autoStart) {\n startBlueprint(component);\n }\n }\n },\n\n onEntityRemoved(entity: IBlueprintEntity): void {\n cleanupBlueprint(entity.blueprintComponent);\n }\n };\n}\n\n/**\n * Utility to manually trigger blueprint events\n * 手动触发蓝图事件的工具\n */\nexport function triggerBlueprintEvent(\n entity: IBlueprintEntity,\n eventType: string,\n data?: Record<string, unknown>\n): void {\n const vm = entity.blueprintComponent.vm;\n\n if (vm && entity.blueprintComponent.isStarted) {\n vm.triggerEvent(eventType, data);\n }\n}\n\n/**\n * Utility to trigger custom events by name\n * 按名称触发自定义事件的工具\n */\nexport function triggerCustomBlueprintEvent(\n entity: IBlueprintEntity,\n eventName: string,\n data?: Record<string, unknown>\n): void {\n const vm = entity.blueprintComponent.vm;\n\n if (vm && entity.blueprintComponent.isStarted) {\n vm.triggerCustomEvent(eventName, data);\n }\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'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\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 // Event nodes just trigger execution flow\n // 事件节点只触发执行流\n return {\n nextExec: 'exec'\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'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\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 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'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\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 };\n }\n}\n","/**\n * @zh 输入事件节点 - 输入触发时触发\n * @en Event Input Node - Triggered on input events\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionContext, ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * @zh EventInput 节点模板\n * @en EventInput node template\n */\nexport const EventInputTemplate: BlueprintNodeTemplate = {\n type: 'EventInput',\n title: 'Event Input',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when input action occurs / 输入动作发生时触发',\n keywords: ['input', 'key', 'button', 'action', 'event'],\n menuPath: ['Event', 'Input'],\n inputs: [\n {\n name: 'action',\n type: 'string',\n displayName: 'Action',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'action',\n type: 'string',\n displayName: 'Action'\n },\n {\n name: 'value',\n type: 'float',\n displayName: 'Value'\n },\n {\n name: 'pressed',\n type: 'bool',\n displayName: 'Pressed'\n },\n {\n name: 'released',\n type: 'bool',\n displayName: 'Released'\n }\n ]\n};\n\n/**\n * @zh EventInput 节点执行器\n * @en EventInput node executor\n *\n * @zh 注意:事件节点的输出由 VM 在触发时通过 setOutputs 设置\n * @en Note: Event node outputs are set by VM via setOutputs when triggered\n */\n@RegisterNode(EventInputTemplate)\nexport class EventInputExecutor implements INodeExecutor {\n execute(node: BlueprintNode, _context: ExecutionContext): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n action: node.data?.action ?? '',\n value: 0,\n pressed: false,\n released: false\n }\n };\n }\n}\n","/**\n * @zh 碰撞事件节点 - 碰撞发生时触发\n * @en Event Collision Node - Triggered on collision events\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * @zh EventCollisionEnter 节点模板\n * @en EventCollisionEnter node template\n */\nexport const EventCollisionEnterTemplate: BlueprintNodeTemplate = {\n type: 'EventCollisionEnter',\n title: 'Event Collision Enter',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when collision starts / 碰撞开始时触发',\n keywords: ['collision', 'enter', 'hit', 'overlap', 'event'],\n menuPath: ['Event', 'Collision', 'Enter'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'otherEntityId',\n type: 'string',\n displayName: 'Other Entity'\n },\n {\n name: 'pointX',\n type: 'float',\n displayName: 'Point X'\n },\n {\n name: 'pointY',\n type: 'float',\n displayName: 'Point Y'\n },\n {\n name: 'normalX',\n type: 'float',\n displayName: 'Normal X'\n },\n {\n name: 'normalY',\n type: 'float',\n displayName: 'Normal Y'\n }\n ]\n};\n\n/**\n * @zh EventCollisionEnter 节点执行器\n * @en EventCollisionEnter node executor\n */\n@RegisterNode(EventCollisionEnterTemplate)\nexport class EventCollisionEnterExecutor implements INodeExecutor {\n execute(_node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n otherEntityId: '',\n pointX: 0,\n pointY: 0,\n normalX: 0,\n normalY: 0\n }\n };\n }\n}\n\n/**\n * @zh EventCollisionExit 节点模板\n * @en EventCollisionExit node template\n */\nexport const EventCollisionExitTemplate: BlueprintNodeTemplate = {\n type: 'EventCollisionExit',\n title: 'Event Collision Exit',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when collision ends / 碰撞结束时触发',\n keywords: ['collision', 'exit', 'end', 'separate', 'event'],\n menuPath: ['Event', 'Collision', 'Exit'],\n inputs: [],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'otherEntityId',\n type: 'string',\n displayName: 'Other Entity'\n }\n ]\n};\n\n/**\n * @zh EventCollisionExit 节点执行器\n * @en EventCollisionExit node executor\n */\n@RegisterNode(EventCollisionExitTemplate)\nexport class EventCollisionExitExecutor implements INodeExecutor {\n execute(_node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n otherEntityId: ''\n }\n };\n }\n}\n","/**\n * @zh 消息事件节点 - 接收消息时触发\n * @en Event Message Node - Triggered when message is received\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * @zh EventMessage 节点模板\n * @en EventMessage node template\n */\nexport const EventMessageTemplate: BlueprintNodeTemplate = {\n type: 'EventMessage',\n title: 'Event Message',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when a message is received / 接收到消息时触发',\n keywords: ['message', 'receive', 'broadcast', 'event', 'signal'],\n menuPath: ['Event', 'Message'],\n inputs: [\n {\n name: 'messageName',\n type: 'string',\n displayName: 'Message Name',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'messageName',\n type: 'string',\n displayName: 'Message'\n },\n {\n name: 'senderId',\n type: 'string',\n displayName: 'Sender ID'\n },\n {\n name: 'payload',\n type: 'any',\n displayName: 'Payload'\n }\n ]\n};\n\n/**\n * @zh EventMessage 节点执行器\n * @en EventMessage node executor\n */\n@RegisterNode(EventMessageTemplate)\nexport class EventMessageExecutor implements INodeExecutor {\n execute(node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n messageName: node.data?.messageName ?? '',\n senderId: '',\n payload: null\n }\n };\n }\n}\n","/**\n * @zh 定时器事件节点 - 定时器触发时调用\n * @en Event Timer Node - Triggered when timer fires\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * @zh EventTimer 节点模板\n * @en EventTimer node template\n */\nexport const EventTimerTemplate: BlueprintNodeTemplate = {\n type: 'EventTimer',\n title: 'Event Timer',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when a timer fires / 定时器触发时执行',\n keywords: ['timer', 'delay', 'schedule', 'event', 'interval'],\n menuPath: ['Event', 'Timer'],\n inputs: [\n {\n name: 'timerId',\n type: 'string',\n displayName: 'Timer ID',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'timerId',\n type: 'string',\n displayName: 'Timer ID'\n },\n {\n name: 'isRepeating',\n type: 'bool',\n displayName: 'Is Repeating'\n },\n {\n name: 'timesFired',\n type: 'int',\n displayName: 'Times Fired'\n }\n ]\n};\n\n/**\n * @zh EventTimer 节点执行器\n * @en EventTimer node executor\n */\n@RegisterNode(EventTimerTemplate)\nexport class EventTimerExecutor implements INodeExecutor {\n execute(node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n timerId: node.data?.timerId ?? '',\n isRepeating: false,\n timesFired: 0\n }\n };\n }\n}\n","/**\n * @zh 状态事件节点 - 状态机状态变化时触发\n * @en Event State Node - Triggered on state machine state changes\n */\n\nimport { BlueprintNodeTemplate, BlueprintNode } from '../../types/nodes';\nimport { ExecutionResult } from '../../runtime/ExecutionContext';\nimport { INodeExecutor, RegisterNode } from '../../runtime/NodeRegistry';\n\n/**\n * @zh EventStateEnter 节点模板\n * @en EventStateEnter node template\n */\nexport const EventStateEnterTemplate: BlueprintNodeTemplate = {\n type: 'EventStateEnter',\n title: 'Event State Enter',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when entering a state / 进入状态时触发',\n keywords: ['state', 'enter', 'fsm', 'machine', 'event'],\n menuPath: ['Event', 'State', 'Enter'],\n inputs: [\n {\n name: 'stateName',\n type: 'string',\n displayName: 'State Name',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'stateMachineId',\n type: 'string',\n displayName: 'State Machine'\n },\n {\n name: 'currentState',\n type: 'string',\n displayName: 'Current State'\n },\n {\n name: 'previousState',\n type: 'string',\n displayName: 'Previous State'\n }\n ]\n};\n\n/**\n * @zh EventStateEnter 节点执行器\n * @en EventStateEnter node executor\n */\n@RegisterNode(EventStateEnterTemplate)\nexport class EventStateEnterExecutor implements INodeExecutor {\n execute(node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n stateMachineId: '',\n currentState: node.data?.stateName ?? '',\n previousState: ''\n }\n };\n }\n}\n\n/**\n * @zh EventStateExit 节点模板\n * @en EventStateExit node template\n */\nexport const EventStateExitTemplate: BlueprintNodeTemplate = {\n type: 'EventStateExit',\n title: 'Event State Exit',\n category: 'event',\n color: '#CC0000',\n description: 'Triggered when exiting a state / 退出状态时触发',\n keywords: ['state', 'exit', 'leave', 'fsm', 'machine', 'event'],\n menuPath: ['Event', 'State', 'Exit'],\n inputs: [\n {\n name: 'stateName',\n type: 'string',\n displayName: 'State Name',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n type: 'exec',\n displayName: ''\n },\n {\n name: 'stateMachineId',\n type: 'string',\n displayName: 'State Machine'\n },\n {\n name: 'currentState',\n type: 'string',\n displayName: 'Current State'\n },\n {\n name: 'previousState',\n type: 'string',\n displayName: 'Previous State'\n }\n ]\n};\n\n/**\n * @zh EventStateExit 节点执行器\n * @en EventStateExit node executor\n */\n@RegisterNode(EventStateExitTemplate)\nexport class EventStateExitExecutor implements INodeExecutor {\n execute(node: BlueprintNode): ExecutionResult {\n return {\n nextExec: 'exec',\n outputs: {\n stateMachineId: '',\n currentState: '',\n previousState: node.data?.stateName ?? ''\n }\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 * 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 * 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 * Blueprint Plugin for ES Engine.\n * ES引擎的蓝图插件。\n *\n * Provides visual scripting runtime support.\n * 提供可视化脚本运行时支持。\n */\n\nimport type { IRuntimePlugin, ModuleManifest, IRuntimeModule } from '@esengine/engine-core';\n\n/**\n * Blueprint Runtime Module.\n * 蓝图运行时模块。\n *\n * Note: Blueprint uses a custom system (IBlueprintSystem) instead of EntitySystem,\n * so createSystems is not implemented here. Blueprint systems should be created\n * manually using createBlueprintSystem(scene).\n */\nclass BlueprintRuntimeModule implements IRuntimeModule {\n async onInitialize(): Promise<void> {\n // Blueprint system initialization\n // Blueprint uses IBlueprintSystem which is different from EntitySystem\n }\n\n onDestroy(): void {\n // Cleanup\n }\n}\n\n/**\n * Plugin manifest for Blueprint.\n * 蓝图的插件清单。\n */\nconst manifest: ModuleManifest = {\n id: 'blueprint',\n name: '@esengine/blueprint',\n displayName: 'Blueprint',\n version: '1.0.0',\n description: '可视化脚本系统',\n category: 'AI',\n icon: 'Workflow',\n isCore: false,\n defaultEnabled: false,\n isEngineModule: true,\n dependencies: ['core'],\n exports: {\n components: ['BlueprintComponent'],\n systems: ['BlueprintSystem']\n },\n requiresWasm: false\n};\n\n/**\n * Blueprint Plugin.\n * 蓝图插件。\n */\nexport const BlueprintPlugin: IRuntimePlugin = {\n manifest,\n runtimeModule: new BlueprintRuntimeModule()\n};\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","version","type","metadata","createdAt","Date","now","modifiedAt","variables","nodes","connections","validateBlueprintAsset","asset","bp","Array","isArray","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","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","createBlueprintComponentData","entityId","blueprintAsset","blueprintPath","autoStart","debug","vm","isStarted","initializeBlueprintVM","component","entity","scene","BlueprintVM","startBlueprint","start","stopBlueprint","stop","tickBlueprint","deltaTime","tick","cleanupBlueprint","createBlueprintSystem","scene","process","entities","deltaTime","entity","component","blueprintComponent","blueprintAsset","vm","initializeBlueprintVM","autoStart","isStarted","startBlueprint","tickBlueprint","onEntityAdded","onEntityRemoved","cleanupBlueprint","triggerBlueprintEvent","eventType","data","triggerEvent","triggerCustomBlueprintEvent","eventName","triggerCustomEvent","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","EventBeginPlayTemplate","type","title","category","color","description","keywords","inputs","outputs","name","displayName","EventBeginPlayExecutor","execute","_node","_context","nextExec","_ts_decorate","EventTickTemplate","type","title","category","color","description","keywords","inputs","outputs","name","displayName","EventTickExecutor","execute","_node","context","nextExec","deltaTime","_ts_decorate","EventEndPlayTemplate","type","title","category","color","description","keywords","inputs","outputs","name","displayName","EventEndPlayExecutor","execute","_node","_context","nextExec","_ts_decorate","EventInputTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","EventInputExecutor","execute","node","_context","nextExec","action","data","value","pressed","released","_ts_decorate","EventCollisionEnterTemplate","type","title","category","color","description","keywords","menuPath","inputs","outputs","name","displayName","EventCollisionEnterExecutor","execute","_node","nextExec","otherEntityId","pointX","pointY","normalX","normalY","EventCollisionExitTemplate","EventCollisionExitExecutor","_ts_decorate","EventMessageTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","EventMessageExecutor","execute","node","nextExec","messageName","data","senderId","payload","_ts_decorate","EventTimerTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","EventTimerExecutor","execute","node","nextExec","timerId","data","isRepeating","timesFired","_ts_decorate","EventStateEnterTemplate","type","title","category","color","description","keywords","menuPath","inputs","name","displayName","defaultValue","outputs","EventStateEnterExecutor","execute","node","nextExec","stateMachineId","currentState","data","stateName","previousState","EventStateExitTemplate","EventStateExitExecutor","_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","_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","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","BlueprintRuntimeModule","onInitialize","onDestroy","manifest","id","name","displayName","version","description","category","icon","isCore","defaultEnabled","isEngineModule","dependencies","exports","components","systems","requiresWasm","BlueprintPlugin","runtimeModule"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@esengine/blueprint",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Visual scripting system for ECS Framework",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"ecs",
|
|
20
|
+
"blueprint",
|
|
21
|
+
"visual-scripting",
|
|
22
|
+
"game-engine"
|
|
23
|
+
],
|
|
24
|
+
"author": "yhh",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^20.19.17",
|
|
28
|
+
"rimraf": "^5.0.0",
|
|
29
|
+
"tsup": "^8.0.0",
|
|
30
|
+
"typescript": "^5.8.3",
|
|
31
|
+
"@esengine/ecs-framework": "2.4.2",
|
|
32
|
+
"@esengine/engine-core": "1.0.0",
|
|
33
|
+
"@esengine/build-config": "1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"tslib": "^2.8.1"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public",
|
|
40
|
+
"registry": "https://registry.npmjs.org/"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/esengine/esengine.git",
|
|
45
|
+
"directory": "packages/blueprint"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
49
|
+
"build": "tsup",
|
|
50
|
+
"build:watch": "tsup --watch",
|
|
51
|
+
"type-check": "tsc --noEmit"
|
|
52
|
+
}
|
|
53
|
+
}
|