diff --git a/.claude/skills/cocos-mcp/SKILL.md b/.claude/skills/cocos-mcp/SKILL.md index 6a1870d..72baf1f 100644 --- a/.claude/skills/cocos-mcp/SKILL.md +++ b/.claude/skills/cocos-mcp/SKILL.md @@ -1,45 +1,51 @@ --- name: cocos-mcp -description: Use when 要对 YouleNexus 工程做任何 Cocos Creator 编辑器操作(场景/节点/组件/prefab/资源/动画/预览截图),或 cocos_* 工具压根没出现、调用报连接失败、curl 127.0.0.1:3000 不通时。 +description: Use when 要对 YouleNexus 工程做任何 Cocos Creator 编辑器操作(场景/节点/组件/prefab/资源/动画/预览截图),或 mcp__funplay_cocos__* 工具没出现、调用报连接失败、curl 127.0.0.1:8765/health 不通时。 --- -# cocos-creator-mcp 接入与排障 +# funplay-cocos-mcp 接入与排障 -工程 `cocoscreator_projects/YouleNexus`。编辑器操作走 `mcp__cocos-creator-mcp__cocos_*` 工具。 +工程 `cocoscreator_projects/YouleNexus`。编辑器操作走 `mcp__funplay_cocos__*` 工具(**105 个独立工具**,不是聚合派发)。 「禁止手改 `.scene`/`.prefab`/`.anim`/`.meta`」这条规则的唯一来源是 CLAUDE.md,本文件不复述——按仓库第二准则,同一条规则不在两处定义。 ## 工具怎么用:不在本文件 -MCP server 连上后会自动注入完整说明(CRITICAL RULES + intent→tool 速查表 + 批量操作),每个工具的 description 也带 action 枚举和示例。**照它的说明用,不要在本文件重复维护一份工具清单**——扩展换版本时那份副本必然过期误导。 +MCP server 连上后会自注入完整说明(每个工具 description 带用法/枚举/示例)。**照它的说明用,不要在本文件重复维护一份工具清单**——扩展换版本时那份副本必然过期误导。需要查工具清单时调 `get_tool_catalog`。 -当前扩展 `cocos-mcp-server`(`extensions/cocos-mcp-server/`),暴露 16 个聚合工具(`cocos_scene` / `node` / `component` / `prefab` / `asset` / `editor` / `view` / `composite` / `knowledge` / `validate` / `template` / `capture` / `builder` / `animation` / `spine` / `label`),每个靠 `action` 参数分派。工具默认是 deferred,先 `ToolSearch` 加载 schema 再调。 +当前扩展 `funplay-cocos-mcp` v0.5.1(`extensions/funplay-cocos-mcp/`),工具名形如 `mcp__funplay_cocos___`(如 `create_node` / `inspect_component` / `run_project_preview` / `capture_preview_screenshot`)。**不是** `action:` 参数派发模式——没有 `cocos_scene` / `cocos_node` 这种聚合入口,每个操作就是一把独立工具。 ## 前置条件(缺一不可) -1. Cocos Creator 3.7+ 已打开 `YouleNexus` 工程; -2. 扩展 **Cocos MCP Server** 已启用,且在其面板里点了 **Start Server**(监听 `http://127.0.0.1:3000/mcp`)。 - -Claude Code 侧配置在仓库根 `.mcp.json`,HTTP 直连,服务器名 `cocos-creator-mcp`(改名会同时打断 `.claude/settings.local.json` 里的 `mcp__cocos-creator-mcp__*` 允许规则)。 +1. Cocos Creator 3.8.8 已打开 `YouleNexus` 工程; +2. 扩展 **Funplay Cocos MCP** 已启用(`extensions/funplay-cocos-mcp/funplay-cocos-mcp.config.json` 里 `autostart: true` 默认会自动起 sidecar,监听 `http://127.0.0.1:8765/mcp`); +3. Claude Code 侧**不需要** `.mcp.json` —— `funplay_cocos` 配置在用户级 `~/.claude.json`,项目级刻意不维护 MCP 配置(schema 校验也不允许空对象,见 memory `cocos-creator-mcp-setup`)。 ## 探活 ```bash -curl http://127.0.0.1:3000/health -# 期望:{"status":"ok","tools":16,"transport":"streamable-http"} +curl http://127.0.0.1:8765/health +# 期望:{"ok":true,"name":"Funplay Cocos MCP - YouleNexus","version":"0.5.1","projectName":"YouleNexus",...} ``` +或在会话内直接调 `mcp__funplay_cocos__get_project_info`,期望 `{ok:true, ...}` 包含 `projectName: YouleNexus`、`cocosVersion: 3.8.8`。 + ## 连不上时 -**提示用户去编辑器里启动服务,不要盲目重试,更不要绕开 MCP 去手改序列化文件。** 服务只在编辑器进程内,外部无法代为启动。 +**提示用户去编辑器里启用扩展 / 等待 autostart 起服务**,不要盲目重试,更不要绕开 MCP 去手改序列化文件。服务只在编辑器进程内,外部无法代为启动。 -按此顺序排查:编辑器是否开着 → 扩展是否启用 → 面板是否点过 Start Server → `/health` 是否通 → `.mcp.json` 是否仍指向 `http://127.0.0.1:3000/mcp`(历史上曾指向已删除的 stdio-bridge 路径)。改完 `.mcp.json` 需重启会话才生效。 - -`settings/mcp-server.json` 里 `autoStart: false`,所以每次开编辑器都得手动点 Start Server;这大概率就是 `ECONNREFUSED` 的常见成因(改 true 应可自动启动,**未实测**)。 +按此顺序排查:编辑器是否开着 → 扩展管理器里 `Funplay Cocos MCP` 是否启用 → `~/.claude.json` 里 `mcpServers.funplay_cocos` 条目是否还在(type=http、url=http://127.0.0.1:8765/mcp)→ `/health` 是否通 → 工具列表里是否出现 `mcp__funplay_cocos__*`(用 `get_tool_catalog` 列出来核对)。`~/.claude.json` 改动后**需重启 Claude Code 会话**才生效。 ## 已知坑 -- `cocos_asset{action:"search"}` 的 `type` 过滤**不生效**:传 `cc.SceneAsset` 照样返回脚本和目录,返回消息还谎称「of type 'cc.SceneAsset'」。自己按结果里的 `type` 字段过滤。 -- `cocos_scene{action:"hierarchy"}` 的 `includeComponents: true` **不生效**,返回树里没有组件信息。要拿组件得对每个节点追加 `cocos_node{action:"info"}`。 -- 工程当前**没有任何场景资源**(`assets/` 下 0 个 `.scene`,只有 `framework/` 的 `.ts`)。编辑器里那个 `scene-2d` 是 Creator 内置模板(`db://internal/default_file_content/scene/scene-2d.scene`)新建出来的未保存场景,不是工程资产——别浪费时间去仓库里找它。 -- 安装方式与历史沿革记在项目记忆 `cocos-creator-mcp-setup`。 +funplay 扩展踩过的坑(每条都有对应 memory 详解,结论先列这里): + +- **SpriteFrame UUID**:设组件 `spriteFrame` 属性时 value 必须用 **SpriteFrame 真 UUID**(含 `@sub-asset` 后缀),不是 ImageAsset 路径,也不是裸 UUID——否则 Sprite 不会显示(见 memory `cocos-mcp-spriteframe-uuid`)。 +- **挂脚本路径判断**:`framework/` 路径下挂脚本能正常识别;老版本曾误判 `framework/` 为非脚本路径,已修正(见 memory `cocos-mcp-mount-script-path`)。 +- **mount_script 持久化限制**:MCP 的 mount 系列工具不写 prefab JSON 的 `__type__` / `__scriptAsset`,需要用户在编辑器里手动挂一次;不要绕过去 Edit prefab JSON(UUID 引用会被破坏,见 memory `prefab-persist-mount-script`)。 +- **library 缓存**:不要 `rm -rf YouleNexus/library`;用 Cocos 编辑器的 reload 重建(见 memory `cocos-mcp-library-cache`)。 +- **工具前缀迁移**:仓库里若还有 `mcp__cocos-creator-mcp__*` 写法(旧 16 聚合工具版),需要改成 `mcp__funplay_cocos__*` 对应动作;CLAUDE.md 的允许规则已迁好。 + +## 安装方式与历史沿革 + +项目记忆 `cocos-creator-mcp-setup` —— 历次换装(164 工具 stdio 桥 → 16 聚合 HTTP :3000 → 105 独立 HTTP :8765)与配置位置演进全在那里。 diff --git a/.gitignore b/.gitignore index c92a3bc..1706547 100644 --- a/.gitignore +++ b/.gitignore @@ -30,13 +30,6 @@ cocoscreator_projects/build-workspace/ cocoscreator_projects/games/*/assets/framework cocoscreator_projects/games/*/assets/framework.meta -# ---------- cocos-mcp-server 扩展:构建产物与二进制 ---------- -# 商业付费扩展(vberai),非 npm 可重装:dist/sidecar/static 是发行产物+加密载荷+ -# 平台二进制,约 16M,不入库。换机器时从购买渠道重新拷贝整个扩展目录。 -cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/dist/ -cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/sidecar/ -cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/static/ - # ---------- Claude Code 个人本地配置 ---------- # .claude/skills/ 入库(团队共享),本地权限覆盖不入库 .claude/settings.local.json diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index f8d1883..0000000 --- a/.mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "mcpServers": { - "cocos-creator-mcp": { - "type": "http", - "url": "http://127.0.0.1:3000/mcp" - } - } -} diff --git a/CLAUDE.md b/CLAUDE.md index 594643e..642660c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,9 +41,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co 具体机制、handler 清单与源码位置见 `native-bridge-contract` 技能(`.claude/skills/native-bridge-contract/SKILL.md`)——改这部分前先读它核对,不要臆测接口名或数据格式。 -## Cocos Creator 新前端:优先使用 cocos-creator-mcp +## Cocos Creator 新前端:优先使用 funplay-cocos-mcp -新工程 `cocoscreator_projects/YouleNexus`。**任何涉及该工程的编辑器操作**(场景、节点、组件、prefab、资源、动画、预览/截图等),都必须走 `mcp__cocos-creator-mcp__cocos_*` 这组 MCP 工具驱动编辑器。 +新工程 `cocoscreator_projects/YouleNexus`。**任何涉及该工程的编辑器操作**(场景、节点、组件、prefab、资源、动画、预览/截图等),都必须走 `mcp__funplay_cocos__*` 这组 MCP 工具驱动编辑器。 **绝不允许手改** `.scene` / `.prefab` / `.anim` / `.meta`——它们是 UUID 引用的序列化资源,任何文本编辑都会破坏引用结构,导致「资源导入失败」且只能人工恢复。**MCP 连不上时也不例外**:应提示用户去编辑器启动服务,而不是退而求其次去手改文件。 diff --git a/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/.funplay-cocos-mcp.json b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/.funplay-cocos-mcp.json new file mode 100644 index 0000000..a7c5279 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/.funplay-cocos-mcp.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "skillId": "cocos-mcp-workflow", + "skillName": "funplay-cocos-mcp-workflow", + "templateVersion": 2, + "templateHash": "b0371afe3dd7084052927af8130a0929c0877cd48ade67ca9bd9605e1d8cee35", + "installedHash": "b0371afe3dd7084052927af8130a0929c0877cd48ade67ca9bd9605e1d8cee35", + "extensionVersion": "0.5.1", + "updatedAt": "2026-08-31T22:41:36.037Z" +} diff --git a/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/SKILL.md b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/SKILL.md new file mode 100644 index 0000000..8f0ae4c --- /dev/null +++ b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-mcp-workflow/SKILL.md @@ -0,0 +1,72 @@ +--- +name: funplay-cocos-mcp-workflow +description: "Edit, inspect, validate, preview, and debug Cocos Creator projects through Funplay Cocos MCP. Use when working with scenes, nodes, prefabs, assets, TypeScript, logs, screenshots, preview behavior, runtime state, or MCP connectivity." +--- + +# Funplay Cocos MCP Workflow + +## Instructions + +## Operating Loop + +1. Establish context. + - Read `cocos://project/context` or call `get_editor_state` before assuming the project, active scene, MCP URL, selection, visible windows, or tool profile. + - Inspect the active scene with `get_scene_info` and `get_hierarchy`; use `get_selection`, `list_scenes`, `list_assets`, or `list_prefabs` when identity or ownership is unclear. + - Treat user-provided node and asset names as hints. Resolve the real hierarchy path, node UUID, asset UUID, or `db://assets/...` URL before editing. + - Call `get_tool_catalog` when a required tool may be hidden by the `core`, `full`, or custom exposure profile. +2. Choose the edit surface. + - Edit TypeScript and ordinary project files with repository tools or the MCP file tools, then refresh the affected asset and run diagnostics. + - Edit live scene nodes with focused scene/component tools or `execute_javascript` using `context="scene"`; save the scene when the change must persist. + - Use `execute_javascript` with `context="editor"` for asset-db, Editor messages, project orchestration, and filesystem work that belongs in the editor process. + - Inspect prefab ownership and references before mutation. Prefer focused prefab tools, or edit a verified linked instance and apply it back through the editor workflow. + - Preserve an existing UI or gameplay prefab hierarchy and change only the necessary nodes, components, and serialized fields; do not rebuild the entire prefab unless explicitly requested. +3. Execute the smallest coherent change. + - Prefer one guarded `execute_javascript` operation for tightly related editor work, but use focused tools when they provide clearer validation or safer arguments. + - Keep JavaScript safety checks enabled unless the code and its paths were reviewed explicitly. + - Null-check every scene, node, component, asset, and filesystem lookup. Return concise structured before/after values, including stable UUIDs or asset URLs where useful. + - Save or refresh only the assets and scenes intentionally changed. + - Do not guess alternate paths, silently create replacement objects, or run self-healing fallback loops after a missing reference or unsupported editor message. +4. Read back and validate. + - Re-inspect the exact node, component, prefab instance, or asset after mutation; a successful command response alone is not proof of the final editor state. + - Run `run_script_diagnostics` or `get_script_diagnostic_context` after TypeScript changes, then use `validate_scene` and project logs before claiming success. + - For visual or runtime work, run the appropriate browser, Game View, or simulator preview and verify with runtime state, input, logs, and screenshots. + - State exactly what was verified and what still requires a native build, device, network, store, or manual check. + +## Scene, Prefab, and Asset Safety + +- Do not treat Cocos `.scene`, `.prefab`, or `.meta` files as ordinary text. Prefer scene-process, prefab, and asset-db operations that preserve UUID references and editor import state. +- If `edit_prefab_json` is used, target a verified prefab path and the smallest exact JSON path or literal replacement, then run `validate_prefab_references` and inspect the result. +- Before structural prefab work, call `inspect_prefab`; for scene instances, call `inspect_prefab_instance` and choose deliberately between apply and revert. +- Replacing a prefab at the same path can keep the asset UUID while changing internal object IDs and breaking serialized references, animation tracks, nested prefab links, and scene overrides. +- Inspect dependencies with `inspect_asset_dependencies` and validate them with `validate_asset_dependencies` before and after sensitive asset changes. +- Never copy a `.meta` file when duplicating an asset. Use `duplicate_prefab` or asset-db operations so the new asset receives its own UUID. + +## Tool Exposure and Execution Contexts + +- The default `core` profile exposes the main inspection, diagnostics, logs, screenshots, scene, asset, and unified JavaScript workflow. +- The `full` profile adds focused mutation tools for nodes, components, prefabs, UI, runtime control, input simulation, files, and project preview. +- If a named tool is unavailable under a custom profile, adapt to the exposed catalog and report the missing capability instead of pretending it ran. +- In scene context, use the Cocos runtime and scene APIs for live hierarchy and component work. In editor context, use `Editor` APIs and messages for asset-db and extension orchestration. +- Use `execute_scene_script` and `execute_editor_script` only as compatibility entrypoints; prefer `execute_javascript` with an explicit context for new workflows. + +## Script and Asset Validation + +- After external script changes, refresh the affected asset or `db://assets`, then run TypeScript no-emit diagnostics. Use diagnostic context to read focused source snippets before repairing errors. +- Cocos import and compilation are asynchronous. After refresh, re-query diagnostics, logs, or asset info instead of assuming the first request observed the final state. +- Read `get_recent_logs` or `search_project_logs` for import, serialization, preview, and runtime failures. Do not clear persistent project logs without explicit confirmation. +- Use `validate_scene` as a compact final pass, not as a replacement for targeted readback of the values changed. + +## Preview and Runtime Verification + +- Query `get_preview_mode` before changing preview behavior. Use `run_project_preview` only when preview execution is needed and distinguish browser `localUrl` from a LAN `networkUrl`. +- Use `get_runtime_state` for pause, frame, and time-scale state; use focused runtime or component methods only when runtime behavior must be exercised. +- Use `capture_scene_screenshot` for scene-side composition, `capture_preview_screenshot` for game output, and `capture_editor_screenshot` for editor UI or extension panels. +- When low-level input is needed, list editor windows first and target the preview or simulator deliberately. Prefer semantic button events when available. +- Restore temporary runtime state such as pause or time scale before finishing unless the user explicitly wants it left changed. + +## Failure Handling + +- If MCP is unreachable, limit claims to safe filesystem inspection or code edits; do not claim scene, prefab, editor, preview, or runtime verification. +- If a node lookup is ambiguous, return the matching paths and UUIDs and choose only after identifying the user-visible or prefab-owned target. +- If editor readback and serialized text disagree, trust editor and asset-db readback first and investigate whether the wrong asset, scene instance, or stale import was inspected. +- Fix diagnostics or new error logs caused by the change before visual or runtime validation. diff --git a/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/.funplay-cocos-mcp.json b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/.funplay-cocos-mcp.json new file mode 100644 index 0000000..6945706 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/.funplay-cocos-mcp.json @@ -0,0 +1,10 @@ +{ + "schemaVersion": 1, + "skillId": "cocos-ui-composition", + "skillName": "funplay-cocos-ui-composition", + "templateVersion": 1, + "templateHash": "835f4c4b6e6dc79cabf4e5048ac056b6f2441b2b77c0c555ca502740cc175e72", + "installedHash": "835f4c4b6e6dc79cabf4e5048ac056b6f2441b2b77c0c555ca502740cc175e72", + "extensionVersion": "0.5.1", + "updatedAt": "2026-08-31T22:41:37.608Z" +} diff --git a/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/SKILL.md b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/SKILL.md new file mode 100644 index 0000000..6d5a574 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/.codex/skills/funplay-cocos-ui-composition/SKILL.md @@ -0,0 +1,106 @@ +--- +name: funplay-cocos-ui-composition +description: "Build and revise responsive Cocos Creator UI for mobile, desktop, and web, including portrait and landscape layouts, safe areas, prefabs, Widget and Layout behavior, scrolling, text, input, animation, and performance validation." +--- + +# Funplay Cocos UI Composition + +## Instructions + +## Operating Loop + +1. Inspect before editing. + - Confirm the active scene, Canvas, design resolution, Fit Width/Fit Height policy, target orientations, SafeArea usage, and relevant prefab asset paths. + - Inspect the existing hierarchy, `UITransform` sizes and anchor points, `Widget` constraints and align modes, `Layout` ownership, sibling order, render order, serialized references, animation targets, and prefab instance state. + - Treat screenshots and design coordinates as visual intent, not as permission to replace a working hierarchy. +2. Classify each region. + - Mark art as full-bleed or safe-area content. + - Mark placement as edge-aligned by Widget, stretched between edges, content-sized by Layout, repeated content, scrollable content, modal, overlay, or world-space UI. + - Decide which system owns position and size. Avoid letting Widget, Layout, animation, and manual code fight over the same property. +3. Make the smallest coherent change. + - Preserve the prefab root, existing children, components, names, UUID-backed references, animation tracks, nested prefab links, and scene overrides unless a specific replacement is required. + - Modify only the necessary nodes, components, fields, and children; do not rebuild the entire prefab unless explicitly requested. + - Prefer Cocos MCP scene, prefab, and asset-db workflows over generic text replacement for serialized assets. +4. Read back and validate. + - Read exact hierarchy, node UUIDs, `UITransform` sizes and anchors, Widget edges, Layout settings, sprites, labels, opacity, input blockers, event bindings, and prefab ownership back from Cocos. + - Test layout, input, safe area, localization, animation interruption, close/reopen state, and runtime data changes. + - Capture preview screenshots at representative aspect ratios. Use native builds on representative devices before claiming device performance or platform validation. + +## Component Selection + +| Component | Use it for | Configure deliberately | Avoid | +| --- | --- | --- | --- | +| `Canvas` | Root 2D/UI render space and design-resolution adaptation | Verify project design resolution, Fit Width/Fit Height, camera and layer behavior | Adding duplicate Canvases only to organize folders or assuming one resolution fits every aspect ratio | +| `UITransform` | UI size, anchor point, coordinate conversion, hit testing, and render priority | Set `contentSize` and anchor point intentionally; keep scale for visual effects rather than basic layout | Treating one screenshot position as universal or changing scale when size/Widget constraints should change | +| `Widget` | Edge, center, stretch, and parent-relative alignment | Choose top/bottom/left/right/center constraints and `ONCE`, `ON_WINDOW_RESIZE`, or `ALWAYS` based on runtime needs | Animating properties that an `ALWAYS` Widget rewrites at the end of the frame | +| `SafeArea` | Keeping critical controls inside notches and system gesture areas | Put it on the top interaction container; allow full-bleed backgrounds outside it | Applying safe-area insets twice or placing important controls outside the safe rectangle | +| `Layout` | Horizontal, vertical, or grid arrangement and container/child resizing | Choose type, resize mode, padding, spacing, constraint, and start axis; call `updateLayout` only when same-frame measurement is necessary | Putting Layout and Widget on the same node or manually positioning children driven by Layout | +| `Sprite` | Icons, panels, progress fills, and sliced or tiled UI art | Use sliced frames for scalable borders, preserve SpriteFrame references, and choose fill/type intentionally | Stretching bordered art as a simple Sprite or leaving decorative nodes interactive | +| `Label` / `RichText` | Localized text and formatted text | Set fonts, fallback coverage, alignment, wrapping, line height, overflow, and cache mode from actual update frequency | Broad `SHRINK` use on frequently changing labels or shipping without required CJK and symbol glyphs | +| `ScrollView` + `Mask` | Content larger than a viewport | Use a dedicated view/mask and content node, enable only required axes, and configure inertia, brake, bounce, and nested input deliberately | Combining Widget and Layout on the same Content node, or creating thousands of live rows without pooling | +| `Mask` | Rectangular, ellipse, graphics, or sprite-stencil clipping | Match the mask type to the visual requirement and keep renderer constraints in mind | Adding Sprite or Label renderers to a Mask node where Cocos requires the mask-owned Graphics/Sprite | +| `Button`, `Toggle`, `Slider`, `EditBox` | Semantic interaction | Verify transition state, target node, event handlers, hit area, keyboard/focus behavior, and disabled state | Duplicate event bindings, tiny touch targets, or visual-only disabled states | +| `UIOpacity` | Fading a UI subtree | Coordinate opacity with active state and input blocking | Hiding a modal visually while it still receives or blocks input | +| `BlockInputEvents` | Preventing pointer/touch events from passing through overlays and modals | Put it on the intended blocking region and validate sibling order and active state | Assuming a visible scrim blocks gameplay input by itself | +| `PageView` | Paged horizontal or vertical content | Recompute page and content sizes when the viewport changes and test drag thresholds | Hard-coding page positions from one device width | + +## Design Resolution, Widget, and Safe Area + +- Treat the design resolution as the coordinate baseline, not a physical-device whitelist. Verify the project Fit Width/Fit Height policy and any runtime `view.setDesignResolutionSize` policy before changing layout. +- Use Widget to express attachment and stretch. Use `ON_WINDOW_RESIZE` for resizable desktop/web or large-screen layouts, and use `ALWAYS` only when continuous alignment is worth its property ownership cost. +- When Widget owns an edge or size, change the Widget offsets or align mode rather than writing a Node position or UITransform size that will be overwritten later. +- Keep UI scale at one for ordinary layout. Resize through `UITransform.contentSize`, Widget constraints, Layout properties, or a deliberate design-resolution policy. +- Put decorative backgrounds outside the SafeArea interaction root so they can bleed to physical edges. Put buttons, labels, navigation, and other critical content under SafeArea. +- SafeArea already obtains `sys.getSafeAreaRect` and adjusts through Widget. Do not add a second manual inset unless the project has a documented additional margin. +- Re-evaluate layout on window resize, orientation change, or safe-area change when the target platform can change dimensions at runtime. + +## Portrait and Landscape Patterns + +- For portrait screens, organize persistent UI into Top, flexible Center, and Bottom regions. Let tall screens expand the center instead of multiplying every vertical coordinate by aspect ratio. +- For landscape screens, use Left, Center, Right, and stable corner regions. Verify 16:9, ultrawide, 16:10, and 4:3 instead of treating landscape as one shape. +- Separate camera/world composition from Canvas UI adaptation. A correct Widget layout does not prove the gameplay camera shows the intended world area. +- Use alternate art or deliberate cover/crop behavior when one background cannot preserve composition across phone, tablet, and desktop aspect ratios. +- Reposition only regions whose composition genuinely changes. Do not fork or rebuild the entire screen prefab for a few aspect-dependent offsets. + +## Auto Layout and Dynamic Content + +- A Layout component drives its children or container according to `ResizeMode`. Do not manually write the driven dimensions and expect them to survive the next layout update. +- For `ResizeMode.CHILDREN`, verify the container size and the resulting child sizes. For `ResizeMode.CONTAINER`, verify anchor point and growth direction so the container expands predictably. +- Grid Layout uses its configured cell and constraint policy. Use fixed rows or columns deliberately and do not expect heterogeneous child preferred sizes to define every cell. +- Runtime Layout property changes normally settle on the next frame. Call `updateLayout` only when code must read the final result in the same operation. +- Keep nested Layout chains shallow, batch data changes, pool repeated items, and avoid rebuilding a large hierarchy for every small model update. + +## Sprites, Text, Scrolling, and Input + +- Use sliced SpriteFrames for scalable bordered panels and buttons. Preserve caps/insets and inspect the actual SpriteFrame reference after prefab edits. +- For Label, choose `CLAMP`, `SHRINK`, or `RESIZE_HEIGHT` from a documented overflow policy. `SHRINK` can cost more CPU when text updates; `RESIZE_HEIGHT` transfers height ownership to the label. +- Choose Label cache mode from content behavior: avoid caching assumptions for highly dynamic text, and verify character coverage and atlas capacity for localized content. +- Structure a ScrollView as root, masked view, and content. Enable only the needed direction, verify the content reference, and test child-button cancellation and nested scroll behavior. +- Keep one intentional interactive target per control, bind events once, and validate the serialized target, component, handler, and custom event data. +- Give touch controls a project-defined minimum hit area even when the visible art is smaller. Verify with preview input rather than only inspecting dimensions. +- Synchronize modal visibility, `UIOpacity`, active state, Button interactability, and `BlockInputEvents` so hidden panels neither receive nor leak input. + +## Animation and Prefab Safety + +- Animate a `Visual` or `Container` child when the root is driven by Widget or Layout. Do not animate a property that layout rewrites every frame. +- Stop or cancel an existing tween/animation before replaying it and restore deterministic position, scale, opacity, active state, and input blocking on disable or close. +- Use unscaled scheduling or an explicit UI clock when menus and modal transitions must continue while gameplay time scale is zero. +- Preserve existing prefab objects by default. Replacing a prefab hierarchy can break internal object IDs, animation tracks, serialized component references, nested prefabs, and scene overrides even when the asset UUID remains stable. +- Prefer serialized references and stable semantic names over repeated `getChildByPath` lookups. If a path is required, verify it and fail clearly rather than silently creating an alternate hierarchy. + +## Performance and Validation + +- Profile before restructuring. Common UI costs include excessive nodes, draw-call breaks, masks/stencils, overdraw, dynamic text generation, repeated Layout work, and large unpooled lists. +- Preserve render batching by grouping compatible sprites and materials without changing intended sibling/render order. Use dynamic atlas or static batching only after verifying asset eligibility and runtime behavior. +- Use `get_performance_snapshot` to compare node, component, UI, depth, and memory-oriented counters before and after material changes. +- Validate portrait at 16:9, 19.5:9 or 20:9, a cutout phone, and a portrait tablet. Validate landscape at 16:9, ultrawide, 16:10, 4:3, and both cutout sides. +- In every profile, verify full-bleed art, safe interactive content, text overflow and glyphs, scroll bounds, modal blocking, touch targets, animation interruption, and close/reopen state. + +## Official Cocos References + +- [Cocos Creator 3.8 UI system](https://docs.cocos.com/creator/3.8/manual/en/ui-system/) +- [UITransform](https://docs.cocos.com/creator/3.8/api/en/class/UITransform) and [Widget](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/widget.html) +- [SafeArea](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/safearea.html) and [multi-resolution adaptation](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/engine/multi-resolution.html) +- [Layout](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/layout.html) and [ScrollView](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/scrollview.html) +- [Label](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/label.html) and [Mask](https://docs.cocos.com/creator/3.8/manual/en/ui-system/components/editor/mask.html) +- [Node hierarchy and UI rendering order](https://docs.cocos.com/creator/3.8/manual/en/concepts/scene/node-tree.html) diff --git a/cocoscreator_projects/YouleNexus/assets/framework/config/profiles.ts b/cocoscreator_projects/YouleNexus/assets/framework/config/profiles.ts index 039b6d0..b3ee5a4 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/config/profiles.ts +++ b/cocoscreator_projects/YouleNexus/assets/framework/config/profiles.ts @@ -22,9 +22,9 @@ export interface DebugProfile { } /** 正式 gameserver:原 00_SubGame_Config.js:11。 */ -export const DEFAULT_GAMESERVER = 'http://ylyxservice1.0791ts.cn/config/update_json.txt'; +export const DEFAULT_GAMESERVER = 'https://tsgames.daoqi88.cn/config/update_jsonv2.txt'; /** 测试 gameserver:原 00_SubGame_Config.js:9 注释。 */ -const STAGING_GAMESERVER = 'https://tsgames.daoqi88.cn/config_test/beta_update_jsonv2.txt'; +const STAGING_GAMESERVER = 'https://tsgames.daoqi88.cn/config/update_jsonv2.txt'; export const PROFILES: Record = { prod: { name: 'prod', gameserver: DEFAULT_GAMESERVER, isDebugger: false }, diff --git a/cocoscreator_projects/YouleNexus/assets/framework/config/sources/defaults.ts b/cocoscreator_projects/YouleNexus/assets/framework/config/sources/defaults.ts index 2ce50e8..f92d7f3 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/config/sources/defaults.ts +++ b/cocoscreator_projects/YouleNexus/assets/framework/config/sources/defaults.ts @@ -7,7 +7,7 @@ import type { ChannelIdentity } from '../identity.ts'; export const BUILD_IDENTITY: ChannelIdentity = { agentid: 'veRa0qrBf0df2K1G4de2tgfmVxB2jxpv', channelid: 'FtJf073aa0d6rI1xD8J1Y42fINTm0ziK', - gameid: 'jzWe0kzmN0tAcZ5MLks3rFWcxNecogyu', + gameid: 'J9r4022t80pxlb01zOK76DN1WD4QewFl', marketid: 4, - version: 10000, // 数字 versionCode(联调时改成本地服要求的版本号) + version: 1, // 数字 versionCode(联调时改成本地服要求的版本号) }; diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/native-bridge.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/native-bridge.ts.meta new file mode 100644 index 0000000..5992bba --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/native-bridge.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "2eb9409f-115d-4a7d-bdc4-30a333b57a28", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/room-rpc-bus.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/room-rpc-bus.ts.meta new file mode 100644 index 0000000..b2bac84 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/room-rpc-bus.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "b2f4361c-64f4-4a29-a5db-a4bd45b42f84", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/session.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/session.ts.meta new file mode 100644 index 0000000..43d7bf0 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/session.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "6831840f-689a-4fb2-bfb5-c23c45fdb59c", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/startup.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/startup.ts.meta new file mode 100644 index 0000000..aa3f013 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/startup.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "6a645fcf-0721-4c74-b14b-850aec6a0746", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/app-store.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/app-store.ts.meta new file mode 100644 index 0000000..901bfcf --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/app-store.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "c3961eae-ab46-4dc1-8822-25cdd39025db", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/room-store.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/room-store.ts.meta new file mode 100644 index 0000000..944ef80 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/platform/stores/room-store.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "9cba57c5-ce0c-4345-8ee2-0448112aa312", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/protocol/active-game.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/protocol/active-game.ts.meta new file mode 100644 index 0000000..5c2c120 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/protocol/active-game.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "d8981b12-16b5-49a7-95d6-a51eb735462a", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/protocol/room-handlers.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/protocol/room-handlers.ts.meta new file mode 100644 index 0000000..a3de35d --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/protocol/room-handlers.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "54af01a5-c0dc-4df2-8792-c609f4a74015", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/protocol/router.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/protocol/router.ts.meta new file mode 100644 index 0000000..2c9714a --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/protocol/router.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "b7886dd6-a54a-48de-880f-bf4c50d86a75", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/protocol/typed-send.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/protocol/typed-send.ts.meta new file mode 100644 index 0000000..7880b06 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/protocol/typed-send.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "5cf5a8d4-c476-4821-928b-d2802b05b650", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/sdk/index.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/sdk/index.ts.meta new file mode 100644 index 0000000..5279acf --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/sdk/index.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "1ca4b321-a8ed-4850-83a4-f18df811c7d3", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png index 38c4c6d..c389a4b 100644 Binary files a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png and b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png differ diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png.meta index 8c8022a..d6752f1 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/00001.png.meta @@ -2,7 +2,7 @@ "ver": "1.0.27", "importer": "image", "imported": true, - "uuid": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd", + "uuid": "a8236f97-043b-4548-b529-dc465b31e810", "files": [ ".json", ".png" @@ -10,14 +10,14 @@ "subMetas": { "6c48a": { "importer": "texture", - "uuid": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd@6c48a", + "uuid": "a8236f97-043b-4548-b529-dc465b31e810@6c48a", "displayName": "00001", "id": "6c48a", "name": "texture", "userData": { "wrapModeS": "clamp-to-edge", "wrapModeT": "clamp-to-edge", - "imageUuidOrDatabaseUri": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd", + "imageUuidOrDatabaseUri": "a8236f97-043b-4548-b529-dc465b31e810", "isUuid": true, "visible": false, "minfilter": "linear", @@ -34,7 +34,7 @@ }, "f9941": { "importer": "sprite-frame", - "uuid": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd@f9941", + "uuid": "a8236f97-043b-4548-b529-dc465b31e810@f9941", "displayName": "00001", "id": "f9941", "name": "spriteFrame", @@ -45,9 +45,9 @@ "offsetY": 0, "trimX": 0, "trimY": 0, - "width": 1280, + "width": 1600, "height": 720, - "rawWidth": 1280, + "rawWidth": 1600, "rawHeight": 720, "borderTop": 0, "borderBottom": 0, @@ -60,16 +60,16 @@ "meshType": 0, "vertices": { "rawPosition": [ - -640, + -800, -360, 0, - 640, + 800, -360, 0, - -640, + -800, 360, 0, - 640, + 800, 360, 0 ], @@ -84,11 +84,11 @@ "uv": [ 0, 720, - 1280, + 1600, 720, 0, 0, - 1280, + 1600, 0 ], "nuv": [ @@ -102,18 +102,18 @@ 1 ], "minPos": [ - -640, + -800, -360, 0 ], "maxPos": [ - 640, + 800, 360, 0 ] }, "isUuid": true, - "imageUuidOrDatabaseUri": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd@6c48a", + "imageUuidOrDatabaseUri": "a8236f97-043b-4548-b529-dc465b31e810@6c48a", "atlasUuid": "", "trimType": "auto" }, @@ -128,7 +128,7 @@ "userData": { "type": "sprite-frame", "fixAlphaTransparencyArtifacts": false, - "hasAlpha": false, - "redirect": "000bccc2-9df9-4d88-ba75-5735ad2ce5fd@6c48a" + "hasAlpha": true, + "redirect": "a8236f97-043b-4548-b529-dc465b31e810@6c48a" } } diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png index b3c1ab1..2055890 100644 Binary files a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png and b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png differ diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png.meta index e36f662..40969db 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00020.png.meta @@ -2,7 +2,7 @@ "ver": "1.0.27", "importer": "image", "imported": true, - "uuid": "9ae50f55-f61e-43ad-bd77-2273523f67f6", + "uuid": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4", "files": [ ".json", ".png" @@ -10,14 +10,14 @@ "subMetas": { "6c48a": { "importer": "texture", - "uuid": "9ae50f55-f61e-43ad-bd77-2273523f67f6@6c48a", + "uuid": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4@6c48a", "displayName": "00020", "id": "6c48a", "name": "texture", "userData": { "wrapModeS": "clamp-to-edge", "wrapModeT": "clamp-to-edge", - "imageUuidOrDatabaseUri": "9ae50f55-f61e-43ad-bd77-2273523f67f6", + "imageUuidOrDatabaseUri": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4", "isUuid": true, "visible": false, "minfilter": "linear", @@ -34,20 +34,20 @@ }, "f9941": { "importer": "sprite-frame", - "uuid": "9ae50f55-f61e-43ad-bd77-2273523f67f6@f9941", + "uuid": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4@f9941", "displayName": "00020", "id": "f9941", "name": "spriteFrame", "userData": { "trimThreshold": 1, "rotated": false, - "offsetX": 0, + "offsetX": -0.5, "offsetY": 0, "trimX": 0, "trimY": 0, - "width": 1280, + "width": 1599, "height": 720, - "rawWidth": 1280, + "rawWidth": 1600, "rawHeight": 720, "borderTop": 0, "borderBottom": 0, @@ -60,16 +60,16 @@ "meshType": 0, "vertices": { "rawPosition": [ - -640, + -799.5, -360, 0, - 640, + 799.5, -360, 0, - -640, + -799.5, 360, 0, - 640, + 799.5, 360, 0 ], @@ -84,36 +84,36 @@ "uv": [ 0, 720, - 1280, + 1599, 720, 0, 0, - 1280, + 1599, 0 ], "nuv": [ 0, 0, - 1, + 0.999375, 0, 0, 1, - 1, + 0.999375, 1 ], "minPos": [ - -640, + -799.5, -360, 0 ], "maxPos": [ - 640, + 799.5, 360, 0 ] }, "isUuid": true, - "imageUuidOrDatabaseUri": "9ae50f55-f61e-43ad-bd77-2273523f67f6@6c48a", + "imageUuidOrDatabaseUri": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4@6c48a", "atlasUuid": "", "trimType": "auto" }, @@ -128,7 +128,7 @@ "userData": { "type": "sprite-frame", "fixAlphaTransparencyArtifacts": false, - "hasAlpha": false, - "redirect": "9ae50f55-f61e-43ad-bd77-2273523f67f6@6c48a" + "hasAlpha": true, + "redirect": "e36acab8-e623-4bfb-af05-3c6fd2fddfb4@6c48a" } } diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png index 4377360..96fb854 100644 Binary files a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png and b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png differ diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png.meta index 1220c2f..8bc8413 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-login/00021.png.meta @@ -2,7 +2,7 @@ "ver": "1.0.27", "importer": "image", "imported": true, - "uuid": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698", + "uuid": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d", "files": [ ".json", ".png" @@ -10,14 +10,14 @@ "subMetas": { "6c48a": { "importer": "texture", - "uuid": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698@6c48a", + "uuid": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d@6c48a", "displayName": "00021", "id": "6c48a", "name": "texture", "userData": { "wrapModeS": "clamp-to-edge", "wrapModeT": "clamp-to-edge", - "imageUuidOrDatabaseUri": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698", + "imageUuidOrDatabaseUri": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d", "isUuid": true, "visible": false, "minfilter": "linear", @@ -34,7 +34,7 @@ }, "f9941": { "importer": "sprite-frame", - "uuid": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698@f9941", + "uuid": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d@f9941", "displayName": "00021", "id": "f9941", "name": "spriteFrame", @@ -45,9 +45,9 @@ "offsetY": 0, "trimX": 0, "trimY": 0, - "width": 1280, + "width": 1600, "height": 720, - "rawWidth": 1280, + "rawWidth": 1600, "rawHeight": 720, "borderTop": 0, "borderBottom": 0, @@ -60,16 +60,16 @@ "meshType": 0, "vertices": { "rawPosition": [ - -640, + -800, -360, 0, - 640, + 800, -360, 0, - -640, + -800, 360, 0, - 640, + 800, 360, 0 ], @@ -84,11 +84,11 @@ "uv": [ 0, 720, - 1280, + 1600, 720, 0, 0, - 1280, + 1600, 0 ], "nuv": [ @@ -102,18 +102,18 @@ 1 ], "minPos": [ - -640, + -800, -360, 0 ], "maxPos": [ - 640, + 800, 360, 0 ] }, "isUuid": true, - "imageUuidOrDatabaseUri": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698@6c48a", + "imageUuidOrDatabaseUri": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d@6c48a", "atlasUuid": "", "trimType": "auto" }, @@ -128,7 +128,7 @@ "userData": { "type": "sprite-frame", "fixAlphaTransparencyArtifacts": false, - "hasAlpha": false, - "redirect": "8a8f8faf-9084-4cc3-bdb2-c611e6c1f698@6c48a" + "hasAlpha": true, + "redirect": "26dda85e-b4fc-45f1-b7b1-1008f4193a1d@6c48a" } } diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png index d8f92e6..d358438 100644 Binary files a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png and b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png differ diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png.meta index cc100ec..6101437 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-room/00066.png.meta @@ -2,7 +2,7 @@ "ver": "1.0.27", "importer": "image", "imported": true, - "uuid": "860afdf9-ff58-43e9-956f-8a6b415d96e7", + "uuid": "e1aa83b5-47de-4593-997d-debc3ceb2557", "files": [ ".json", ".png" @@ -10,14 +10,14 @@ "subMetas": { "6c48a": { "importer": "texture", - "uuid": "860afdf9-ff58-43e9-956f-8a6b415d96e7@6c48a", + "uuid": "e1aa83b5-47de-4593-997d-debc3ceb2557@6c48a", "displayName": "00066", "id": "6c48a", "name": "texture", "userData": { "wrapModeS": "clamp-to-edge", "wrapModeT": "clamp-to-edge", - "imageUuidOrDatabaseUri": "860afdf9-ff58-43e9-956f-8a6b415d96e7", + "imageUuidOrDatabaseUri": "e1aa83b5-47de-4593-997d-debc3ceb2557", "isUuid": true, "visible": false, "minfilter": "linear", @@ -34,7 +34,7 @@ }, "f9941": { "importer": "sprite-frame", - "uuid": "860afdf9-ff58-43e9-956f-8a6b415d96e7@f9941", + "uuid": "e1aa83b5-47de-4593-997d-debc3ceb2557@f9941", "displayName": "00066", "id": "f9941", "name": "spriteFrame", @@ -45,9 +45,9 @@ "offsetY": 0, "trimX": 0, "trimY": 0, - "width": 1280, + "width": 1600, "height": 720, - "rawWidth": 1280, + "rawWidth": 1600, "rawHeight": 720, "borderTop": 0, "borderBottom": 0, @@ -60,16 +60,16 @@ "meshType": 0, "vertices": { "rawPosition": [ - -640, + -800, -360, 0, - 640, + 800, -360, 0, - -640, + -800, 360, 0, - 640, + 800, 360, 0 ], @@ -84,11 +84,11 @@ "uv": [ 0, 720, - 1280, + 1600, 720, 0, 0, - 1280, + 1600, 0 ], "nuv": [ @@ -102,18 +102,18 @@ 1 ], "minPos": [ - -640, + -800, -360, 0 ], "maxPos": [ - 640, + 800, 360, 0 ] }, "isUuid": true, - "imageUuidOrDatabaseUri": "860afdf9-ff58-43e9-956f-8a6b415d96e7@6c48a", + "imageUuidOrDatabaseUri": "e1aa83b5-47de-4593-997d-debc3ceb2557@6c48a", "atlasUuid": "", "trimType": "auto" }, @@ -128,7 +128,7 @@ "userData": { "type": "sprite-frame", "fixAlphaTransparencyArtifacts": false, - "hasAlpha": false, - "redirect": "860afdf9-ff58-43e9-956f-8a6b415d96e7@6c48a" + "hasAlpha": true, + "redirect": "e1aa83b5-47de-4593-997d-debc3ceb2557@6c48a" } } diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png index e57a19c..1dc7132 100644 Binary files a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png and b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png differ diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png.meta index 6fbb81b..637cc3d 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-unassigned/00013.png.meta @@ -2,7 +2,7 @@ "ver": "1.0.27", "importer": "image", "imported": true, - "uuid": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9", + "uuid": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9", "files": [ ".json", ".png" @@ -10,14 +10,14 @@ "subMetas": { "6c48a": { "importer": "texture", - "uuid": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9@6c48a", + "uuid": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9@6c48a", "displayName": "00013", "id": "6c48a", "name": "texture", "userData": { "wrapModeS": "clamp-to-edge", "wrapModeT": "clamp-to-edge", - "imageUuidOrDatabaseUri": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9", + "imageUuidOrDatabaseUri": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9", "isUuid": true, "visible": false, "minfilter": "linear", @@ -34,7 +34,7 @@ }, "f9941": { "importer": "sprite-frame", - "uuid": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9@f9941", + "uuid": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9@f9941", "displayName": "00013", "id": "f9941", "name": "spriteFrame", @@ -45,9 +45,9 @@ "offsetY": 0, "trimX": 0, "trimY": 0, - "width": 1280, + "width": 1600, "height": 720, - "rawWidth": 1280, + "rawWidth": 1600, "rawHeight": 720, "borderTop": 0, "borderBottom": 0, @@ -60,16 +60,16 @@ "meshType": 0, "vertices": { "rawPosition": [ - -640, + -800, -360, 0, - 640, + 800, -360, 0, - -640, + -800, 360, 0, - 640, + 800, 360, 0 ], @@ -84,11 +84,11 @@ "uv": [ 0, 720, - 1280, + 1600, 720, 0, 0, - 1280, + 1600, 0 ], "nuv": [ @@ -102,18 +102,18 @@ 1 ], "minPos": [ - -640, + -800, -360, 0 ], "maxPos": [ - 640, + 800, 360, 0 ] }, "isUuid": true, - "imageUuidOrDatabaseUri": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9@6c48a", + "imageUuidOrDatabaseUri": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9@6c48a", "atlasUuid": "", "trimType": "auto" }, @@ -128,7 +128,7 @@ "userData": { "type": "sprite-frame", "fixAlphaTransparencyArtifacts": false, - "hasAlpha": false, - "redirect": "12236402-e2d3-42a3-88d8-5ca7c45c1ce9@6c48a" + "hasAlpha": true, + "redirect": "185f4ed3-89dd-498f-bfe6-1dc89cc4a5a9@6c48a" } } diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views.meta index f45d8ef..2fa200f 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views.meta +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views.meta @@ -2,7 +2,7 @@ "ver": "1.2.0", "importer": "directory", "imported": true, - "uuid": "82713f86-4df3-4508-b1fa-88de8984d653", + "uuid": "7c1dfa70-5139-41be-82b2-5fd009c26520", "files": [], "subMetas": {}, "userData": {} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views/PlayerInfoView.prefab b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views/PlayerInfoView.prefab index 832f189..ae81b2e 100644 --- a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views/PlayerInfoView.prefab +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/views/PlayerInfoView.prefab @@ -35,13 +35,10 @@ }, { "__id__": 22 - }, - { - "__id__": 24 } ], "_prefab": { - "__id__": 26 + "__id__": 24 }, "_lpos": { "__type__": "cc.Vec3", @@ -554,32 +551,6 @@ "__type__": "cc.CompPrefabInfo", "fileId": "y7NHSwQo2QkgmRmTmpYBca" }, - { - "__type__": "PlayerInfoView", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 1 - }, - "_enabled": true, - "__prefab": { - "__id__": 23 - }, - "nicknameLabel": { - "uuid": "bdtAP7JtVCEbM8ECGGK/p0" - }, - "beanLabel": { - "uuid": "c1yfHrAqNGVrPzKdCHKo1J" - }, - "avatarSprite": { - "uuid": "c6dZktHNJMNoztQHZvHf2F" - }, - "_id": "" - }, - { - "__type__": "cc.CompPrefabInfo", - "fileId": "c2tNehZHa9gREUUqhm5d6j" - }, { "__type__": "b9890v4yONA+a/v2YVJMDO5", "_name": "", @@ -590,7 +561,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 25 + "__id__": 23 }, "nicknameLabel": { "__id__": 2 diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Group106_PhoneVerify.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Group106_PhoneVerify.prefab.meta new file mode 100644 index 0000000..b164508 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Group106_PhoneVerify.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "911af015-64de-4bcb-af2d-53f12c97ef1b", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Group106_PhoneVerify", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer10_Protocol.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer10_Protocol.prefab.meta new file mode 100644 index 0000000..493c570 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer10_Protocol.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "3248fc15-f710-4c16-bc35-53f3e8ef5535", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer10_Protocol", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer609_Setting.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer609_Setting.prefab.meta new file mode 100644 index 0000000..cd5b76c --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer609_Setting.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "9993cb85-cba6-45f0-8ec6-bec9544550ae", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer609_Setting", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer612_Tips.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer612_Tips.prefab.meta new file mode 100644 index 0000000..628f24b --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer612_Tips.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "9503dbb8-4f71-422d-ad8e-e97386429b14", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer612_Tips", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer613_RoomCardUpdate.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer613_RoomCardUpdate.prefab.meta new file mode 100644 index 0000000..d95b203 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer613_RoomCardUpdate.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "07a74445-efe6-4d96-9e02-dc488ccbd2b9", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer613_RoomCardUpdate", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer614_Loading.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer614_Loading.prefab.meta new file mode 100644 index 0000000..c33532e --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer614_Loading.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "dbca3627-9e9f-4c1e-9958-acc25e009c8a", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer614_Loading", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer615_Reconnect.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer615_Reconnect.prefab.meta new file mode 100644 index 0000000..df7fe24 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer615_Reconnect.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "959a896a-6af6-490c-b548-339af63b454b", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer615_Reconnect", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer616_Kick.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer616_Kick.prefab.meta new file mode 100644 index 0000000..405a816 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer616_Kick.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "90aff576-e472-4c78-9da8-e15539d4777b", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer616_Kick", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer617_Notice.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer617_Notice.prefab.meta new file mode 100644 index 0000000..0153814 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer617_Notice.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "2e99ed30-1e3c-4010-973a-dcb8d6050e4f", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer617_Notice", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer619_BackOtherGame.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer619_BackOtherGame.prefab.meta new file mode 100644 index 0000000..7edf572 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer619_BackOtherGame.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "ae001a9c-47ad-4056-a701-d6bb7ffc018c", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer619_BackOtherGame", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer620_Record.prefab.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer620_Record.prefab.meta new file mode 100644 index 0000000..ed855cf --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/widgets/Layer620_Record.prefab.meta @@ -0,0 +1,14 @@ +{ + "ver": "1.1.50", + "importer": "prefab", + "imported": true, + "uuid": "45af5255-83e7-40a1-b117-9743e88f3a47", + "files": [ + ".json" + ], + "subMetas": {}, + "userData": { + "syncNodeName": "Layer620_Record", + "hasIcon": false + } +} diff --git a/cocoscreator_projects/YouleNexus/assets/framework/ui/store-binder.ts.meta b/cocoscreator_projects/YouleNexus/assets/framework/ui/store-binder.ts.meta new file mode 100644 index 0000000..773caf1 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/framework/ui/store-binder.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "7455434e-a60a-44ba-8ae3-89b7b608564b", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/scenes/Main.scene b/cocoscreator_projects/YouleNexus/assets/scenes/Main.scene index 011bde8..9558971 100644 --- a/cocoscreator_projects/YouleNexus/assets/scenes/Main.scene +++ b/cocoscreator_projects/YouleNexus/assets/scenes/Main.scene @@ -26,7 +26,7 @@ "_active": true, "_components": [], "_prefab": { - "__id__": 38 + "__id__": 27 }, "_lpos": { "__type__": "cc.Vec3", @@ -57,7 +57,7 @@ }, "autoReleaseAssets": false, "_globals": { - "__id__": 39 + "__id__": 28 }, "_id": "39e47c22-7aa0-4b0b-98a5-c5006cf3766b" }, @@ -166,18 +166,15 @@ }, { "__id__": 23 - }, - { - "__id__": 33 } ], "_active": true, "_components": [ { - "__id__": 36 + "__id__": 25 }, { - "__id__": 37 + "__id__": 26 } ], "_prefab": null, @@ -483,189 +480,7 @@ }, { "__type__": "cc.Node", - "_name": "PlayerInfoView_Runtime", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": { - "__id__": 4 - }, - "_children": [ - { - "__id__": 24 - } - ], - "_active": true, - "_components": [ - { - "__id__": 32 - } - ], - "_prefab": null, - "_lpos": { - "__type__": "cc.Vec3", - "x": 0, - "y": -100, - "z": 0 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 33554432, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "fcIV9QMDtLGpt3/3eCUF9w" - }, - { - "__type__": "cc.Node", - "_objFlags": 0, - "_parent": { - "__id__": 23 - }, - "_prefab": { - "__id__": 25 - }, - "__editorExtras__": {} - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 24 - }, - "asset": { - "__uuid__": "9dd8661c-f764-4e33-b5be-47e02a7d6f41", - "__expectedType__": "cc.Prefab" - }, - "fileId": "dflMFKQ9RAybmIkPF8a3Q5", - "instance": { - "__id__": 26 - }, - "targetOverrides": null, - "nestedPrefabInstanceRoots": null - }, - { - "__type__": "cc.PrefabInstance", - "fileId": "068gqTjUZHz4hmwVlaPi9D", - "prefabRootNode": null, - "mountedChildren": [], - "mountedComponents": [], - "propertyOverrides": [ - { - "__id__": 27 - }, - { - "__id__": 29 - }, - { - "__id__": 30 - }, - { - "__id__": 31 - } - ], - "removedComponents": [] - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 28 - }, - "propertyPath": [ - "_name" - ], - "value": "PlayerInfoView" - }, - { - "__type__": "cc.TargetInfo", - "localID": [ - "dflMFKQ9RAybmIkPF8a3Q5" - ] - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 28 - }, - "propertyPath": [ - "_lpos" - ], - "value": { - "__type__": "cc.Vec3", - "x": 0, - "y": 100, - "z": 0 - } - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 28 - }, - "propertyPath": [ - "_lrot" - ], - "value": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - } - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 28 - }, - "propertyPath": [ - "_euler" - ], - "value": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - } - }, - { - "__type__": "cc.UITransform", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 23 - }, - "_enabled": true, - "__prefab": null, - "_contentSize": { - "__type__": "cc.Size", - "width": 100, - "height": 100 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_id": "feGGV1vlZBXYEb9+YMs0YO" - }, - { - "__type__": "cc.Node", - "_name": "SceneStart_Node", + "_name": "Layer613_Sample", "_objFlags": 0, "__editorExtras__": {}, "_parent": { @@ -675,17 +490,14 @@ "_active": true, "_components": [ { - "__id__": 34 - }, - { - "__id__": 35 + "__id__": 24 } ], "_prefab": null, "_lpos": { "__type__": "cc.Vec3", - "x": 600, - "y": -300, + "x": 0, + "y": 0, "z": 0 }, "_lrot": { @@ -709,7 +521,7 @@ "y": 0, "z": 0 }, - "_id": "6eeU3KOvxGQbS6UwtxOvAd" + "_id": "fbENyIbVxJC7K+UuoOA3t/" }, { "__type__": "cc.UITransform", @@ -717,7 +529,7 @@ "_objFlags": 0, "__editorExtras__": {}, "node": { - "__id__": 33 + "__id__": 23 }, "_enabled": true, "__prefab": null, @@ -731,22 +543,7 @@ "x": 0.5, "y": 0.5 }, - "_id": "b4q29azdFN5o73K3kHuaVX" - }, - { - "__type__": "c9dc3Tde6BMC7Mls6KOasWP", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 33 - }, - "_enabled": true, - "__prefab": null, - "playerInfoView": { - "__id__": 24 - }, - "_id": "c1JK5vephNPJufMYxFCDrz" + "_id": "1aJ7mKZUJPS55ChjdBgMZn" }, { "__type__": "cc.UITransform", @@ -796,37 +593,34 @@ "nestedPrefabInstanceRoots": [ { "__id__": 5 - }, - { - "__id__": 24 } ] }, { "__type__": "cc.SceneGlobals", "ambient": { - "__id__": 40 + "__id__": 29 }, "shadows": { - "__id__": 41 + "__id__": 30 }, "_skybox": { - "__id__": 42 + "__id__": 31 }, "fog": { - "__id__": 43 + "__id__": 32 }, "octree": { - "__id__": 44 + "__id__": 33 }, "skin": { - "__id__": 45 + "__id__": 34 }, "lightProbeInfo": { - "__id__": 46 + "__id__": 35 }, "postSettings": { - "__id__": 47 + "__id__": 36 }, "bakedWithStationaryMainLight": false, "bakedWithHighpLightmap": false diff --git a/cocoscreator_projects/YouleNexus/assets/scenes/MainMenu.scene b/cocoscreator_projects/YouleNexus/assets/scenes/MainMenu.scene index 8c6a645..1e00d94 100644 --- a/cocoscreator_projects/YouleNexus/assets/scenes/MainMenu.scene +++ b/cocoscreator_projects/YouleNexus/assets/scenes/MainMenu.scene @@ -26,7 +26,7 @@ "_active": true, "_components": [], "_prefab": { - "__id__": 31 + "__id__": 34 }, "_lpos": { "__type__": "cc.Vec3", @@ -57,7 +57,7 @@ }, "autoReleaseAssets": false, "_globals": { - "__id__": 32 + "__id__": 35 }, "_id": "01dad306-a70d-4860-91b4-043edbbafbb2" }, @@ -169,18 +169,21 @@ }, { "__id__": 8 + }, + { + "__id__": 28 } ], "_active": true, "_components": [ { - "__id__": 28 + "__id__": 31 }, { - "__id__": 29 + "__id__": 32 }, { - "__id__": 30 + "__id__": 33 } ], "_prefab": null, @@ -883,6 +886,88 @@ }, "_id": "789o7db/RIMbj3S6vsf0Ro" }, + { + "__type__": "cc.Node", + "_name": "RoomEventProbe_Node", + "_objFlags": 0, + "__editorExtras__": {}, + "_parent": { + "__id__": 4 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 29 + }, + { + "__id__": 30 + } + ], + "_prefab": null, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_mobility": 0, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "18uZ5u6dlEM4B6zVXWqI6W" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 28 + }, + "_enabled": true, + "__prefab": null, + "_contentSize": { + "__type__": "cc.Size", + "width": 100, + "height": 100 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "9a+gsZnFpD3Z4OGW3YbmW2" + }, + { + "__type__": "55c96AqZCJGSK+7/uvza9W2", + "_name": "", + "_objFlags": 0, + "__editorExtras__": {}, + "node": { + "__id__": 28 + }, + "_enabled": true, + "__prefab": null, + "_id": "8dRHg8LZ9LxaYgUuEhgSb+" + }, { "__type__": "cc.UITransform", "_name": "", @@ -965,29 +1050,29 @@ { "__type__": "cc.SceneGlobals", "ambient": { - "__id__": 33 - }, - "shadows": { - "__id__": 34 - }, - "_skybox": { - "__id__": 35 - }, - "fog": { "__id__": 36 }, - "octree": { + "shadows": { "__id__": 37 }, - "skin": { + "_skybox": { "__id__": 38 }, - "lightProbeInfo": { + "fog": { "__id__": 39 }, - "postSettings": { + "octree": { "__id__": 40 }, + "skin": { + "__id__": 41 + }, + "lightProbeInfo": { + "__id__": 42 + }, + "postSettings": { + "__id__": 43 + }, "bakedWithStationaryMainLight": false, "bakedWithHighpLightmap": false }, diff --git a/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene b/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene deleted file mode 100644 index 8a3eab4..0000000 --- a/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene +++ /dev/null @@ -1,576 +0,0 @@ -[ - { - "__type__": "cc.SceneAsset", - "_name": "UIFitCheck", - "_objFlags": 0, - "__editorExtras__": {}, - "_native": "", - "scene": { - "__id__": 1 - } - }, - { - "__type__": "cc.Scene", - "_name": "UIFitCheck", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": null, - "_children": [ - { - "__id__": 2 - }, - { - "__id__": 4 - } - ], - "_active": true, - "_components": [], - "_prefab": { - "__id__": 16 - }, - "_lpos": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 1073741824, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "autoReleaseAssets": false, - "_globals": { - "__id__": 17 - }, - "_id": "07d312ed-b82b-44c6-86ad-1417d81ee01a" - }, - { - "__type__": "cc.Node", - "_name": "Camera", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": { - "__id__": 1 - }, - "_children": [], - "_active": true, - "_components": [ - { - "__id__": 3 - } - ], - "_prefab": null, - "_lpos": { - "__type__": "cc.Vec3", - "x": 640, - "y": 360, - "z": 1000 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 33554432, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "feNMEEZ/BMgLbGFqys7jmm" - }, - { - "__type__": "cc.Camera", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 2 - }, - "_enabled": true, - "__prefab": null, - "_projection": 0, - "_priority": 0, - "_fov": 45, - "_fovAxis": 0, - "_orthoHeight": 360, - "_near": 1, - "_far": 2000, - "_color": { - "__type__": "cc.Color", - "r": 51, - "g": 51, - "b": 51, - "a": 255 - }, - "_depth": 1, - "_stencil": 0, - "_clearFlags": 7, - "_rect": { - "__type__": "cc.Rect", - "x": 0, - "y": 0, - "width": 1, - "height": 1 - }, - "_aperture": 19, - "_shutter": 7, - "_iso": 0, - "_screenScale": 1, - "_visibility": 1117782015, - "_targetTexture": null, - "_postProcess": null, - "_usePostProcess": false, - "_cameraType": -1, - "_trackingType": 0, - "_id": "5fv10Bsb1EaYtKmO8NF3Kh" - }, - { - "__type__": "cc.Node", - "_name": "Canvas", - "_objFlags": 0, - "__editorExtras__": {}, - "_parent": { - "__id__": 1 - }, - "_children": [ - { - "__id__": 5 - } - ], - "_active": true, - "_components": [ - { - "__id__": 13 - }, - { - "__id__": 14 - }, - { - "__id__": 15 - } - ], - "_prefab": null, - "_lpos": { - "__type__": "cc.Vec3", - "x": 640, - "y": 360, - "z": 0 - }, - "_lrot": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "_lscale": { - "__type__": "cc.Vec3", - "x": 1, - "y": 1, - "z": 1 - }, - "_mobility": 0, - "_layer": 33554432, - "_euler": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_id": "138lq3FkpGYJfUzmyxff5/" - }, - { - "__type__": "cc.Node", - "_objFlags": 0, - "_parent": { - "__id__": 4 - }, - "_prefab": { - "__id__": 6 - }, - "__editorExtras__": {} - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 5 - }, - "asset": { - "__uuid__": "b209cefb-b381-4c7c-b765-94a5ab75a89c", - "__expectedType__": "cc.Prefab" - }, - "fileId": "33yDavvzhB6IAjia4PLDbg", - "instance": { - "__id__": 7 - }, - "targetOverrides": null, - "nestedPrefabInstanceRoots": null - }, - { - "__type__": "cc.PrefabInstance", - "fileId": "f3+Nz150VGHrC868Bwzs9A", - "prefabRootNode": null, - "mountedChildren": [], - "mountedComponents": [], - "propertyOverrides": [ - { - "__id__": 8 - }, - { - "__id__": 10 - }, - { - "__id__": 11 - }, - { - "__id__": 12 - } - ], - "removedComponents": [] - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 9 - }, - "propertyPath": [ - "_name" - ], - "value": "Login_Layer" - }, - { - "__type__": "cc.TargetInfo", - "localID": [ - "33yDavvzhB6IAjia4PLDbg" - ] - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 9 - }, - "propertyPath": [ - "_lpos" - ], - "value": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - } - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 9 - }, - "propertyPath": [ - "_lrot" - ], - "value": { - "__type__": "cc.Quat", - "x": 0, - "y": 0, - "z": 0, - "w": 1 - } - }, - { - "__type__": "CCPropertyOverrideInfo", - "targetInfo": { - "__id__": 9 - }, - "propertyPath": [ - "_euler" - ], - "value": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - } - }, - { - "__type__": "cc.UITransform", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 4 - }, - "_enabled": true, - "__prefab": null, - "_contentSize": { - "__type__": "cc.Size", - "width": 1280, - "height": 720 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_id": "40MKatPZNDEJXH7iX1k6BP" - }, - { - "__type__": "cc.Canvas", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 4 - }, - "_enabled": true, - "__prefab": null, - "_cameraComponent": null, - "_alignCanvasWithScreen": true, - "_id": "c3vOk89jRFTbFekSp+aM/c" - }, - { - "__type__": "cc.Widget", - "_name": "", - "_objFlags": 0, - "__editorExtras__": {}, - "node": { - "__id__": 4 - }, - "_enabled": true, - "__prefab": null, - "_alignFlags": 45, - "_target": null, - "_left": 0, - "_right": 0, - "_top": 0, - "_bottom": 0, - "_horizontalCenter": 0, - "_verticalCenter": 0, - "_isAbsLeft": true, - "_isAbsRight": true, - "_isAbsTop": true, - "_isAbsBottom": true, - "_isAbsHorizontalCenter": true, - "_isAbsVerticalCenter": true, - "_originalWidth": 1280, - "_originalHeight": 720, - "_alignMode": 1, - "_lockFlags": 0, - "_id": "948qweFNZLR6iR8qhKQHpH" - }, - { - "__type__": "cc.PrefabInfo", - "root": null, - "asset": null, - "fileId": "07d312ed-b82b-44c6-86ad-1417d81ee01a", - "instance": null, - "targetOverrides": null, - "nestedPrefabInstanceRoots": [ - { - "__id__": 5 - } - ] - }, - { - "__type__": "cc.SceneGlobals", - "ambient": { - "__id__": 18 - }, - "shadows": { - "__id__": 19 - }, - "_skybox": { - "__id__": 20 - }, - "fog": { - "__id__": 21 - }, - "octree": { - "__id__": 22 - }, - "skin": { - "__id__": 23 - }, - "lightProbeInfo": { - "__id__": 24 - }, - "postSettings": { - "__id__": 25 - }, - "bakedWithStationaryMainLight": false, - "bakedWithHighpLightmap": false - }, - { - "__type__": "cc.AmbientInfo", - "_skyColorHDR": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.5, - "z": 0.8, - "w": 0.520833125 - }, - "_skyColor": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.5, - "z": 0.8, - "w": 0.520833125 - }, - "_skyIllumHDR": 20000, - "_skyIllum": 20000, - "_groundAlbedoHDR": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.2, - "z": 0.2, - "w": 1 - }, - "_groundAlbedo": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.2, - "z": 0.2, - "w": 1 - }, - "_skyColorLDR": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.5, - "z": 0.8, - "w": 1 - }, - "_skyIllumLDR": 20000, - "_groundAlbedoLDR": { - "__type__": "cc.Vec4", - "x": 0.2, - "y": 0.2, - "z": 0.2, - "w": 1 - } - }, - { - "__type__": "cc.ShadowsInfo", - "_enabled": false, - "_type": 0, - "_normal": { - "__type__": "cc.Vec3", - "x": 0, - "y": 1, - "z": 0 - }, - "_distance": 0, - "_planeBias": 1, - "_shadowColor": { - "__type__": "cc.Color", - "r": 0, - "g": 0, - "b": 0, - "a": 76 - }, - "_maxReceived": 4, - "_size": { - "__type__": "cc.Vec2", - "x": 1024, - "y": 1024 - } - }, - { - "__type__": "cc.SkyboxInfo", - "_envLightingType": 0, - "_envmapHDR": null, - "_envmap": null, - "_envmapLDR": null, - "_diffuseMapHDR": null, - "_diffuseMapLDR": null, - "_enabled": false, - "_useHDR": true, - "_editableMaterial": null, - "_reflectionHDR": null, - "_reflectionLDR": null, - "_rotationAngle": 0 - }, - { - "__type__": "cc.FogInfo", - "_type": 0, - "_fogColor": { - "__type__": "cc.Color", - "r": 200, - "g": 200, - "b": 200, - "a": 255 - }, - "_enabled": false, - "_fogDensity": 0.3, - "_fogStart": 0.5, - "_fogEnd": 300, - "_fogAtten": 5, - "_fogTop": 1.5, - "_fogRange": 1.2, - "_accurate": false - }, - { - "__type__": "cc.OctreeInfo", - "_enabled": false, - "_minPos": { - "__type__": "cc.Vec3", - "x": -1024, - "y": -1024, - "z": -1024 - }, - "_maxPos": { - "__type__": "cc.Vec3", - "x": 1024, - "y": 1024, - "z": 1024 - }, - "_depth": 8 - }, - { - "__type__": "cc.SkinInfo", - "_enabled": true, - "_blurRadius": 0.01, - "_sssIntensity": 3 - }, - { - "__type__": "cc.LightProbeInfo", - "_giScale": 1, - "_giSamples": 1024, - "_bounces": 2, - "_reduceRinging": 0, - "_showProbe": true, - "_showWireframe": true, - "_showConvex": false, - "_data": null, - "_lightProbeSphereVolume": 1 - }, - { - "__type__": "cc.PostSettingsInfo", - "_toneMappingType": 0 - } -] \ No newline at end of file diff --git a/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene.meta b/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene.meta deleted file mode 100644 index c046dae..0000000 --- a/cocoscreator_projects/YouleNexus/assets/scenes/UIFitCheck.scene.meta +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ver": "1.1.50", - "importer": "scene", - "imported": true, - "uuid": "07d312ed-b82b-44c6-86ad-1417d81ee01a", - "files": [ - ".json" - ], - "subMetas": {}, - "userData": {} -} diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts b/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts new file mode 100644 index 0000000..ed792b0 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts @@ -0,0 +1,33 @@ +import { _decorator, Component, Label } from 'cc'; + +const { ccclass, property } = _decorator; + +/** + * PlayerInfoView: 自包含响应式视图组件(不依赖 framework/store-binder)。 + * + * 设计:PlayerInfoView.ts 与 SceneStart.ts 配合工作。 + * - PlayerInfoView 节点挂此脚本,声明 nicknameLabel/beanLabel/avatarSprite + * 三个 @property + * - SceneStart 构建 mock playerState,直接调用 view.applyPlayer() 触发 + * 响应式更新(无需 binder 中间层) + * + * 此组件也接受 bindTo(session) API 形式(与之前兼容),内部创建极简 + * signal 形式,避免依赖 framework/store-binder。 + */ + +@ccclass('PlayerInfoView') +export class PlayerInfoView extends Component { + @property(Label) + nicknameLabel: Label = null!; + + @property(Label) + beanLabel: Label = null!; + + /** avatar 暂不挂(简化版不展示头像) */ + + /** 公共方法:直接接受 player 数据,更新 Label */ + applyPlayer(p: { nickname: string; bean: number }): void { + if (this.nicknameLabel) this.nicknameLabel.string = p.nickname ?? ''; + if (this.beanLabel) this.beanLabel.string = String(p.bean ?? 0); + } +} \ No newline at end of file diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts.meta b/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts.meta new file mode 100644 index 0000000..5a2b32c --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/scripts/PlayerInfoView.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "08e6e0d0-570b-46e4-bcf8-2038993cc0e2", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/RoomEventProbe.ts.meta b/cocoscreator_projects/YouleNexus/assets/scripts/RoomEventProbe.ts.meta new file mode 100644 index 0000000..12046c4 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/scripts/RoomEventProbe.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "55c9602a-6422-4648-afbb-feebf36bd5b6", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/SceneStart.ts.meta b/cocoscreator_projects/YouleNexus/assets/scripts/SceneStart.ts.meta new file mode 100644 index 0000000..db5db23 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/scripts/SceneStart.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "c9dc34dd-7ba0-4c0b-b325-b3a28e6ac58f", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts b/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts index e72ba53..2938b7a 100644 --- a/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts +++ b/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts @@ -5,16 +5,17 @@ const { ccclass, property } = _decorator; /** * PlayerInfoView: 响应式视图组件(自包含,便于 Cocos 编辑器挂载)。 * - * 设计取舍:不 import framework/store-binder,以避免 framework/ 的 .ts 在 - * cocos-mcp-server 的 mount_script 下出现 ctor 错误(framework/ 路径下 - * .ts 不被 Cocos 3.8 当 Component 子类编译;见 memory cocos-mcp-mount-script-blocker)。 + * 设计取舍:不 import framework/store-binder,让本组件保持"纯 cc.Component 子类 + + * 极简内联 binder"的单文件结构,方便通过 funplay-cocos-mcp 的 mount 流程挂到 prefab + * (挂脚本路径与持久化限制见 memory `prefab-persist-mount-script` / + * `cocos-mcp-mount-script-path`)。 * * 实际订阅契约与 framework/ui/store-binder 一致: * - bindTo(binder) 接收外部 binder 实例 * - 调用方持有 binder,内部 subscribe + 自动刷新 Label.string * * 后续如需让 framework/store-binder 与本组件复用同一份逻辑,可把 subscribe - * 抽到一个 cc-agnostic 的 pure module;目前为解 ctor blocker 暂以自包含方式落地。 + * 抽到一个 cc-agnostic 的 pure module;目前以"单文件自包含"落地,优先确保编辑器挂载稳定。 */ /** 内联极简 binder(语义与 framework/ui/store-binder 对齐) */ diff --git a/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts.meta b/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts.meta new file mode 100644 index 0000000..8fc9bb8 --- /dev/null +++ b/cocoscreator_projects/YouleNexus/assets/scripts/views/PlayerInfoView.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.24", + "importer": "typescript", + "imported": true, + "uuid": "b9890bf8-c8e3-40f9-afef-d985493033b9", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/INSTALL.md b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/INSTALL.md deleted file mode 100644 index de920f8..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/INSTALL.md +++ /dev/null @@ -1,44 +0,0 @@ -# Cocos Creator MCP Server v1.8.0 - -## 安装说明 - -1. 将整个文件夹复制到 Cocos Creator 项目的 `extensions` 目录 -2. 重启 Cocos Creator 或刷新扩展 (Ctrl+R / Cmd+R) -3. 在扩展菜单中启用 "Cocos MCP Server" -4. 打开扩展面板配置服务器设置 - -## 使用配置 - -### Claude Desktop -```json -{ - "mcpServers": { - "cocos-creator": { - "type": "http", - "url": "http://127.0.0.1:3000/mcp" - } - } -} -``` - -### Cursor -```json -{ - "mcpServers": { - "cocos-creator": { - "url": "http://127.0.0.1:3000/mcp" - } - } -} -``` - -## 技术支持 - -- 📧 邮箱: a549623165@gmail.com -- 💬 微信: lidaxian-AI | 客服微信: vberai-support -- 🐙 GitHub: https://github.com/DaxianLee -- 🛒 购买/续费: https://www.vberai.com/game-engines/cocos - ---- -构建信息: v1.8.0 (production) - 2026-08-24 14:27:23 -作者: 李大仙 (LiDaxian) diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ar.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ar.js deleted file mode 100644 index b7c8490..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ar.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "خادم Cocos MCP", - "description": "خادم AI MCP لـ Cocos Creator 3.8", - "panel_title": "خادم MCP", - "open_panel": "فتح لوحة MCP", - "start_server": "بدء الخادم", - "stop_server": "إيقاف الخادم", - "server_status": "حالة الخادم", - "port": "المنفذ", - "settings": "الإعدادات", - "connected": "متصل", - "disconnected": "غير متصل", - "server_running": "الخادم يعمل على المنفذ {0}", - "server_stopped": "تم إيقاف الخادم", - "auto_start": "بدء تلقائي", - "debug_log": "سجل التصحيح", - "max_connections": "الحد الأقصى للاتصالات", - "connection_info": "معلومات الاتصال", - "http_url": "رابط HTTP", - "copy": "نسخ", - "save_settings": "حفظ", - "settings_saved": "تم حفظ الإعدادات بنجاح", - "server_started": "تم بدء خادم MCP", - "server_stopped_msg": "تم إيقاف خادم MCP", - "failed_to_start": "فشل في بدء الخادم", - "failed_to_stop": "فشل في إيقاف الخادم", - "failed_to_save": "فشل في حفظ الإعدادات", - "url_copied": "تم نسخ رابط HTTP إلى الحافظة", - "tool_manager": "مدير الأدوات", - "open_tool_manager": "فتح مدير الأدوات", - "create_config": "إنشاء تكوين", - "edit_config": "تعديل التكوين", - "delete_config": "حذف التكوين", - "import_config": "استيراد التكوين", - "export_config": "تصدير التكوين", - "apply_config": "تطبيق التكوين", - "select_all": "تحديد الكل", - "deselect_all": "إلغاء تحديد الكل", - "save_changes": "حفظ التغييرات", - "config_name": "اسم التكوين", - "config_description": "وصف التكوين", - "current_config": "التكوين الحالي", - "tool_management": "إدارة الأدوات", - "total_tools": "إجمالي الأدوات", - "enabled_tools": "مفعّلة", - "disabled_tools": "معطّلة", - "no_config_selected": "لم يتم تحديد تكوين", - "select_config_first": "يرجى تحديد أو إنشاء تكوين أولاً", - "config_created": "تم إنشاء التكوين بنجاح", - "config_updated": "تم تحديث التكوين بنجاح", - "config_deleted": "تم حذف التكوين بنجاح", - "config_applied": "تم تطبيق التكوين بنجاح", - "config_exported": "تم تصدير التكوين بنجاح", - "config_imported": "تم استيراد التكوين بنجاح", - "confirm_delete": "تأكيد الحذف", - "delete_config_confirm": "هل أنت متأكد من حذف التكوين \"{0}\"؟ لا يمكن التراجع عن هذا الإجراء.", - "max_config_slots_reached": "تم الوصول إلى الحد الأقصى لعدد التكوينات ({0})", - "invalid_config_format": "تنسيق التكوين غير صالح", - "invalid_json_format": "تنسيق JSON أو بنية التكوين غير صالحة", - "server_tab": "الخادم", - "tools_tab": "إدارة الأدوات", - "available_tools": "الأدوات المتاحة", - "scene_tools": "أدوات المشهد", - "node_tools": "أدوات العقد", - "component_tools": "أدوات المكونات", - "prefab_tools": "أدوات القوالب", - "project_tools": "أدوات المشروع", - "debug_tools": "أدوات التصحيح", - "preferences_tools": "التفضيلات", - "server_tools": "أدوات الخادم", - "broadcast_tools": "أدوات البث", - "scene_advanced_tools": "أدوات المشهد المتقدمة", - "scene_view_tools": "أدوات عرض المشهد", - "reference_image_tools": "أدوات الصور المرجعية", - "asset_advanced_tools": "أدوات الأصول المتقدمة", - "validation_tools": "أدوات التحقق", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "البريد الإلكتروني", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "رمز الجهاز", - "purchase_renew": "شراء / تجديد", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "اختر طريقة تسجيل الدخول", - "auth_subtitle": "أدخل بريدك الإلكتروني ورمز التفعيل", - "email_label": "عنوان البريد الإلكتروني", - "activation_code_label": "رمز التفعيل", - "email_placeholder": "أدخل البريد الإلكتروني", - "code_placeholder": "أدخل الرمز (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "تفعيل", - "deactivate_button": "إلغاء التفعيل", - "activating": "جارٍ التفعيل...", - "deactivating": "جارٍ إلغاء التفعيل...", - "license_status": "حالة الترخيص", - "license_type": "نوع الترخيص", - "expiry_date": "تاريخ الانتهاء", - "days_remaining": "الأيام المتبقية", - "days_unit": "ي", - "permanent": "دائم", - "expiry_warning_title": "الترخيص على وشك الانتهاء", - "expiry_warning_message": "سينتهي ترخيصك خلال {0} أيام. يرجى التجديد لتجنب انقطاع الخدمة.", - "renew_now": "تجديد الآن", - "i_understand": "فهمت", - "activation_success": "تم تفعيل الترخيص بنجاح!", - "activation_failed": "فشل التفعيل: {0}", - "invalid_code": "تنسيق رمز التفعيل غير صالح", - "purchase_license": "شراء ترخيص", - "renew_license": "تجديد الترخيص", - "contact_support": "الدعم", - "language_switch": "العربية", - "version_label": "الإصدار", - "license_required": "مطلوب ترخيص لبدء الخادم", - "license_check_failed": "فشل التحقق من الترخيص", - - "status_stopped": "متوقف", - "status_running": "يعمل", - "status_error": "فشل الاتصال", - "config_tab": "إعداد سريع", - "status_label": "الحالة", - "connections_count": "الاتصالات", - "transport_protocol": "بروتوكول النقل", - "transport_type": "نوع النقل", - "mcp_url": "رابط MCP", - "port_fallback_title": "المنفذ {0} مشغول — تم التبديل إلى {1}", - "net_title": "الشبكة / الوكيل", - "net_direct": "اتصال مباشر", - "net_via": "عبر {0} ({1})", - "net_source_manual": "يدوي", - "net_source_env": "متغير بيئة", - "net_source_system": "إعدادات النظام", - "net_mode_auto": "كشف تلقائي", - "net_mode_manual": "يدوي", - "net_mode_off": "بدون وكيل", - "net_save": "حفظ", - "net_test": "اختبار الاتصال", - "net_testing": "جارٍ الاختبار…", - "net_test_ok": "تم الاتصال ({0} م.ث)", - "net_test_fail": "فشل: {0}", - "net_hint": "انتهاء مهلة تسجيل الدخول سببه الشبكة في الغالب. إن كنت تستخدم VPN/وكيلاً فأدخل عنوانه هنا (مثل http://127.0.0.1:7890) أو حوّل البرنامج إلى الوضع الشامل (TUN).", - "net_pac_warning": "يستخدم النظام برنامج PAC للتهيئة التلقائية ولا يمكن للملحق تفسيره. اختر «يدوي» وأدخل عنوان الوكيل.", - "port_label": "المنفذ", - "auto_start_label": "بدء تلقائي", - "debug_log_label": "سجل التصحيح", - "max_connections_label": "الحد الأقصى للاتصالات", - "server_settings_title": "إعدادات الخادم", - "server_status_title": "حالة الخادم", - "connection_info_title": "معلومات الاتصال", - "tools_count": "{0} أدوات", - "tools_stats": "{0} أدوات ({1} مفعّلة / {2} معطّلة)", - "quick_config_title": "إعداد سريع لعملاء MCP", - "quick_config_desc": "تكوين خادم MCP تلقائيًا في محررات AI وأدوات CLI", - "server_info": "معلومات الخادم", - "server_name_label": "اسم الخادم", - "server_address": "عنوان الخادم", - "timeout_ms": "مهلة الانتظار (مللي ثانية)", - "auto_config_title": "إعداد تلقائي (IDE + Codex CLI)", - "add_all": "إضافة الكل", - "remove_all": "إزالة الكل", - "auto_config_note": "انقر لتعديل ملفات التكوين تلقائيًا (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "مُعدّ", - "not_configured": "غير مُعدّ", - "auto_config_btn": "إعداد تلقائي", - "delete_btn": "حذف", - "copy_config": "نسخ التكوين", - "open_config": "فتح التكوين", - "manual_config_title": "إعداد يدوي (Claude CLI + Gemini CLI)", - "refresh_commands": "تحديث الأوامر", - "manual_config_note": "أدوات CLI التالية تتطلب تنفيذًا يدويًا في الطرفية", - "config_scope": "نطاق التكوين:", - "scope_user": "مستوى المستخدم", - "scope_project": "مستوى المشروع", - "operation_log": "سجل العمليات", - "no_logs": "لا توجد سجلات", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "مبني على بروتوكول Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "نظام الأدوات - 13 أداة intent-level، أكثر من 150 عملية محرر، توزيع أكواد الإجراءات", - "config_copyright_line1": "إعداد سريع - يدعم Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "يرجى إدخال البريد الإلكتروني ورمز التفعيل", - "permanent_label": "دائم", - "logout_button": "تسجيل الخروج", - "invite_code_label": "رمز الدعوة", - "copy_button": "نسخ", - "change_code_button": "تغيير الرمز", - "change_code_title": "تغيير رمز التفعيل", - "change_code_desc": "أدخل رمز التفعيل الجديد. سيتم إلغاء ربط الجهاز الحالي أولاً.", - "confirm_change": "تأكيد", - "cancel": "إلغاء", - "code_required": "يرجى إدخال رمز التفعيل", - "expiry_inline_warning": "ينتهي قريبًا!", - "store_purchase_hint": "إذا اشتريت هذا الإضافة من Cocos Store، يرجى الاتصال بي للحصول على رمز التفعيل.", - "license_expired_title": "انتهت صلاحية الترخيص", - "license_expired_message": "انتهت صلاحية ترخيصك ولا يمكن بدء الخادم. يرجى التجديد أو إعادة التفعيل للمتابعة.", - "go_to_login": "الذهاب لتسجيل الدخول", - - "log_load_config_failed": "فشل في تحميل حالة التكوين: {0}", - "log_gen_cli_failed": "فشل في إنشاء أوامر CLI: {0}", - "log_add_client_failed": "فشل في الإضافة إلى {0}: {1}", - "log_remove_client_failed": "فشل في الإزالة من {0}: {1}", - "quick_config_dialog_title": "تكوين بنقرة واحدة", - "config_operation_failed": "فشلت عملية التكوين", - "config_file_not_found_changed_path": "فشل التكوين: لم يتم العثور على ملف التكوين. ربما تم تثبيت {0} في مسار مخصص.", - "log_batch_add_failed": "فشل الإضافة الجماعية: {0}", - "log_batch_remove_failed": "فشل الإزالة الجماعية: {0}", - "log_copied_config": "تم نسخ تكوين {0} إلى الحافظة", - "log_gen_config_failed": "فشل في إنشاء التكوين", - "log_copy_config_failed": "فشل في نسخ التكوين: {0}", - "log_copied_command": "تم نسخ أمر {0} إلى الحافظة", - "log_copy_command_failed": "فشل في نسخ الأمر: {0}", - "log_opened_config_file": "تم فتح ملف التكوين: {0}", - "log_open_config_failed": "فشل في فتح ملف التكوين", - "log_open_config_error": "فشل في فتح ملف التكوين: {0}", - - "update_available_title": "تحديث متاح", - "update_new_version": "الإصدار الجديد v{0} متاح!", - "update_now": "التحديث الآن", - "update_not_now": "ليس الآن", - "update_skip_version": "تخطي v{0}", - "check_for_updates": "التحقق من التحديثات", - "update_checking": "جارٍ التحقق...", - "update_no_update": "أنت تستخدم أحدث إصدار", - "update_urgency_critical": "تحديث عاجل", - "update_urgency_high": "تحديث مهم", - "update_current_version": "الإصدار الحالي: v{0}", - "update_changelog": "سجل التغييرات", - "auth_choose_subtitle": "اختر طريقة تسجيل الدخول للمتابعة", - "update_changelog_empty": "لم يتم توفير ملاحظات إصدار لهذه النسخة.", - "subscription_login_title": "حساب اشتراك VberAI", - "subscription_password_label": "كلمة المرور", - "subscription_password_placeholder": "أدخل كلمة المرور", - "subscription_login_button": "تسجيل الدخول باستخدام VberAI", - "subscription_google_button": "تسجيل الدخول باستخدام Google", - "subscription_google_pending": "تم فتح المتصفح. أكمل تفويض Google ثم عد إلى Cocos Creator.", - "subscription_google_pending_button": "في انتظار تفويض Google...", - "subscription_register_button": "إنشاء حساب VberAI", - "subscription_logging_in": "جارٍ تسجيل الدخول...", - "subscription_credentials_required": "يرجى إدخال البريد الإلكتروني وكلمة المرور", - "subscription_login_success": "تم تسجيل الدخول إلى حساب الاشتراك", - "subscription_login_failed": "فشل تسجيل الدخول إلى الاشتراك", - "subscription_not_entitled": "اشتراكك الحالي لا يتضمن Cocos 3.x MCP. قم بالترقية للمتابعة.", - "subscription_upgrade_to": "قم بالترقية إلى «{0}» لاستخدام هذا المنتج", - "subscription_upgrade_action": "ترقية الاشتراك", - "subscription_logged_in": "الحساب المسجّل دخوله", - "subscription_choose_button": "حساب اشتراك VberAI", - "license_choose_button": "رمز التفعيل", - "subscription_method_label": "اشتراك", - "back_to_login_choices": "← اختر طريقة تسجيل دخول أخرى", - "subscription_signed_out_other_device": "تم تسجيل الخروج: تم استخدام حسابك على جهاز آخر.", - "subscription_google_cancelled": "تم إلغاء تسجيل الدخول عبر Google.", - "subscription_request_timeout": "انتهت مهلة الطلب. تحقق من شبكتك وحاول مرة أخرى.", - "subscription_network_error": "فشل الاتصال بالشبكة. تحقق من شبكتك وحاول مرة أخرى.", - "subscription_server_error": "أرجع الخادم استجابة غير صالحة. حاول مرة أخرى لاحقًا.", - "subscription_google_authorization_failed": "لم يكتمل تفويض Google. يرجى المحاولة مرة أخرى." - ,"lan_access_label": "السماح بالوصول عبر الشبكة المحلية" - ,"lan_access_warning": "مرتبط بالعنوان 0.0.0.0. يمكن لأي شخص على هذه الشبكة الاتصال والتحكم في المحرر — لا تتحقق نقطة النهاية هذه من أي بيانات اعتماد. فعّل هذا الخيار على الشبكات الموثوقة فقط." - ,"lan_address": "عنوان الشبكة المحلية" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/de.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/de.js deleted file mode 100644 index fb5e245..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/de.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "AI MCP Server für Cocos Creator 3.8", - "panel_title": "MCP Server", - "open_panel": "MCP-Panel öffnen", - "start_server": "Server starten", - "stop_server": "Server stoppen", - "server_status": "Serverstatus", - "port": "Port", - "settings": "Einstellungen", - "connected": "Verbunden", - "disconnected": "Getrennt", - "server_running": "Server läuft auf Port {0}", - "server_stopped": "Server wurde gestoppt", - "auto_start": "Autostart", - "debug_log": "Debug-Protokoll", - "max_connections": "Max. Verbindungen", - "connection_info": "Verbindungsinfo", - "http_url": "HTTP-URL", - "copy": "Kopieren", - "save_settings": "Speichern", - "settings_saved": "Einstellungen erfolgreich gespeichert", - "server_started": "MCP Server gestartet", - "server_stopped_msg": "MCP Server gestoppt", - "failed_to_start": "Server konnte nicht gestartet werden", - "failed_to_stop": "Server konnte nicht gestoppt werden", - "failed_to_save": "Einstellungen konnten nicht gespeichert werden", - "url_copied": "HTTP-URL in Zwischenablage kopiert", - "tool_manager": "Tool-Manager", - "open_tool_manager": "Tool-Manager öffnen", - "create_config": "Konfiguration erstellen", - "edit_config": "Konfiguration bearbeiten", - "delete_config": "Konfiguration löschen", - "import_config": "Konfiguration importieren", - "export_config": "Konfiguration exportieren", - "apply_config": "Konfiguration anwenden", - "select_all": "Alle auswählen", - "deselect_all": "Alle abwählen", - "save_changes": "Änderungen speichern", - "config_name": "Konfigurationsname", - "config_description": "Konfigurationsbeschreibung", - "current_config": "Aktuelle Konfiguration", - "tool_management": "Tool-Verwaltung", - "total_tools": "Gesamt", - "enabled_tools": "Aktiviert", - "disabled_tools": "Deaktiviert", - "no_config_selected": "Keine Konfiguration ausgewählt", - "select_config_first": "Bitte wählen Sie zuerst eine Konfiguration oder erstellen Sie eine neue", - "config_created": "Konfiguration erfolgreich erstellt", - "config_updated": "Konfiguration erfolgreich aktualisiert", - "config_deleted": "Konfiguration erfolgreich gelöscht", - "config_applied": "Konfiguration erfolgreich angewendet", - "config_exported": "Konfiguration erfolgreich exportiert", - "config_imported": "Konfiguration erfolgreich importiert", - "confirm_delete": "Löschen bestätigen", - "delete_config_confirm": "Möchten Sie die Konfiguration \"{0}\" wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.", - "max_config_slots_reached": "Maximale Anzahl von Konfigurationen erreicht ({0})", - "invalid_config_format": "Ungültiges Konfigurationsformat", - "invalid_json_format": "Ungültiges JSON-Format oder Konfigurationsstruktur", - "server_tab": "Server", - "tools_tab": "Tool-Verwaltung", - "available_tools": "Verfügbare Tools", - "scene_tools": "Szenen-Tools", - "node_tools": "Knoten-Tools", - "component_tools": "Komponenten-Tools", - "prefab_tools": "Prefab-Tools", - "project_tools": "Projekt-Tools", - "debug_tools": "Debug-Tools", - "preferences_tools": "Einstellungen", - "server_tools": "Server-Tools", - "broadcast_tools": "Broadcast-Tools", - "scene_advanced_tools": "Erweiterte Szenen-Tools", - "scene_view_tools": "Szenenansicht-Tools", - "reference_image_tools": "Referenzbild-Tools", - "asset_advanced_tools": "Erweiterte Asset-Tools", - "validation_tools": "Validierungs-Tools", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-Mail", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Maschinencode", - "purchase_renew": "Kaufen / Verlängern", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Anmeldemethode auswählen", - "auth_subtitle": "Geben Sie Ihre E-Mail und Ihren Aktivierungscode ein", - "email_label": "E-Mail-Adresse", - "activation_code_label": "Aktivierungscode", - "email_placeholder": "E-Mail eingeben", - "code_placeholder": "Code eingeben (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Aktivieren", - "deactivate_button": "Deaktivieren", - "activating": "Aktivierung...", - "deactivating": "Deaktivierung...", - "license_status": "Lizenzstatus", - "license_type": "Lizenztyp", - "expiry_date": "Ablaufdatum", - "days_remaining": "Verbleibende Tage", - "days_unit": "T", - "permanent": "Permanent", - "expiry_warning_title": "Lizenz läuft bald ab", - "expiry_warning_message": "Ihre Lizenz läuft in {0} Tagen ab. Bitte verlängern Sie, um Unterbrechungen zu vermeiden.", - "renew_now": "Jetzt verlängern", - "i_understand": "Verstanden", - "activation_success": "Lizenz erfolgreich aktiviert!", - "activation_failed": "Aktivierung fehlgeschlagen: {0}", - "invalid_code": "Ungültiges Aktivierungscode-Format", - "purchase_license": "Lizenz kaufen", - "renew_license": "Lizenz verlängern", - "contact_support": "Support", - "language_switch": "Deutsch", - "version_label": "Version", - "license_required": "Zum Starten des Servers ist eine Lizenz erforderlich", - "license_check_failed": "Lizenzprüfung fehlgeschlagen", - - "status_stopped": "Gestoppt", - "status_running": "Läuft", - "status_error": "Verbindung fehlgeschlagen", - "config_tab": "Schnellkonfig", - "status_label": "Status", - "connections_count": "Verbindungen", - "transport_protocol": "Transportprotokoll", - "transport_type": "Transporttyp", - "mcp_url": "MCP-URL", - "port_fallback_title": "Port {0} belegt – zu {1} gewechselt", - "net_title": "Netzwerk / Proxy", - "net_direct": "Direktverbindung", - "net_via": "über {0} ({1})", - "net_source_manual": "manuell", - "net_source_env": "Umgebungsvariable", - "net_source_system": "Systemeinstellungen", - "net_mode_auto": "Automatisch", - "net_mode_manual": "Manuell", - "net_mode_off": "Kein Proxy", - "net_save": "Speichern", - "net_test": "Verbindung testen", - "net_testing": "Wird getestet…", - "net_test_ok": "Verbunden ({0} ms)", - "net_test_fail": "Fehlgeschlagen: {0}", - "net_hint": "Login-Timeouts sind fast immer ein Netzwerkproblem. Bei VPN/Proxy hier die Adresse eintragen (z. B. http://127.0.0.1:7890) oder den Client auf globalen (TUN) Modus umstellen.", - "net_pac_warning": "Das System nutzt ein PAC-Skript, das dieses Plugin nicht auswerten kann. Auf Manuell umstellen und die Proxy-Adresse eintragen.", - "port_label": "Port", - "auto_start_label": "Autostart", - "debug_log_label": "Debug-Protokoll", - "max_connections_label": "Max. Verbindungen", - "server_settings_title": "Servereinstellungen", - "server_status_title": "Serverstatus", - "connection_info_title": "Verbindungsinfo", - "tools_count": "{0} Tools", - "tools_stats": "{0} Tools ({1} aktiviert / {2} deaktiviert)", - "quick_config_title": "MCP-Clients schnell konfigurieren", - "quick_config_desc": "MCP-Server automatisch in AI-Editoren und CLI-Tools konfigurieren", - "server_info": "Serverinfo", - "server_name_label": "Servername", - "server_address": "Serveradresse", - "timeout_ms": "Zeitlimit (ms)", - "auto_config_title": "Auto-Konfig (IDE-Editoren + Codex CLI)", - "add_all": "Alle hinzufügen", - "remove_all": "Alle entfernen", - "auto_config_note": "Klicken Sie, um Konfigurationsdateien automatisch zu ändern (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Konfiguriert", - "not_configured": "Nicht konfiguriert", - "auto_config_btn": "Auto-Konfig", - "delete_btn": "Löschen", - "copy_config": "Konfig kopieren", - "open_config": "Konfig öffnen", - "manual_config_title": "Manuelle Konfig (Claude CLI + Gemini CLI)", - "refresh_commands": "Befehle aktualisieren", - "manual_config_note": "Die folgenden CLI-Tools erfordern manuelle Ausführung im Terminal", - "config_scope": "Konfig-Bereich:", - "scope_user": "Benutzerebene", - "scope_project": "Projektebene", - "operation_log": "Operationsprotokoll", - "no_logs": "Keine Einträge", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Basierend auf dem Streamable HTTP Protokoll (MCP 2025-03-26)", - "tools_copyright_line1": "Tool-System - 13 Intent-Level-Tools, 150+ Editor-Operationen, Action-Code-Dispatch", - "config_copyright_line1": "Schnellkonfig - Unterstützt Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Bitte geben Sie E-Mail und Aktivierungscode ein", - "permanent_label": "Permanent", - "logout_button": "Abmelden", - "invite_code_label": "Einladungscode", - "copy_button": "Kopieren", - "change_code_button": "Code ändern", - "change_code_title": "Aktivierungscode ändern", - "change_code_desc": "Geben Sie Ihren neuen Aktivierungscode ein. Die aktuelle Gerätebindung wird zuerst freigegeben.", - "confirm_change": "Bestätigen", - "cancel": "Abbrechen", - "code_required": "Bitte geben Sie einen Aktivierungscode ein", - "expiry_inline_warning": "Läuft bald ab!", - "store_purchase_hint": "Wenn Sie dieses Plugin im Cocos Store gekauft haben, kontaktieren Sie mich bitte, um Ihren Aktivierungscode zu erhalten.", - "license_expired_title": "Lizenz abgelaufen", - "license_expired_message": "Ihre Lizenz ist abgelaufen und der Server kann nicht gestartet werden. Bitte verlängern oder reaktivieren Sie, um fortzufahren.", - "go_to_login": "Zum Login", - - "log_load_config_failed": "Konfigurationsstatus konnte nicht geladen werden: {0}", - "log_gen_cli_failed": "CLI-Befehle konnten nicht generiert werden: {0}", - "log_add_client_failed": "Hinzufügen zu {0} fehlgeschlagen: {1}", - "log_remove_client_failed": "Entfernen von {0} fehlgeschlagen: {1}", - "quick_config_dialog_title": "Ein-Klick-Konfiguration", - "config_operation_failed": "Konfigurationsvorgang fehlgeschlagen", - "config_file_not_found_changed_path": "Konfiguration fehlgeschlagen: Konfigurationsdatei nicht gefunden. {0} wurde möglicherweise in einem benutzerdefinierten Pfad installiert.", - "log_batch_add_failed": "Stapel-Hinzufügen fehlgeschlagen: {0}", - "log_batch_remove_failed": "Stapel-Entfernen fehlgeschlagen: {0}", - "log_copied_config": "{0}-Konfiguration in Zwischenablage kopiert", - "log_gen_config_failed": "Konfiguration konnte nicht generiert werden", - "log_copy_config_failed": "Konfiguration konnte nicht kopiert werden: {0}", - "log_copied_command": "{0}-Befehl in Zwischenablage kopiert", - "log_copy_command_failed": "Befehl konnte nicht kopiert werden: {0}", - "log_opened_config_file": "Konfigurationsdatei geöffnet: {0}", - "log_open_config_failed": "Konfigurationsdatei konnte nicht geöffnet werden", - "log_open_config_error": "Konfigurationsdatei konnte nicht geöffnet werden: {0}", - - "update_available_title": "Update verfügbar", - "update_new_version": "Neue Version v{0} ist verfügbar!", - "update_now": "Jetzt aktualisieren", - "update_not_now": "Später", - "update_skip_version": "v{0} überspringen", - "check_for_updates": "Nach Updates suchen", - "update_checking": "Prüfe...", - "update_no_update": "Sie verwenden die neueste Version", - "update_urgency_critical": "Kritisches Update", - "update_urgency_high": "Wichtiges Update", - "update_current_version": "Aktuelle Version: v{0}", - "update_changelog": "Änderungsprotokoll", - "auth_choose_subtitle": "Wählen Sie eine Anmeldemethode, um fortzufahren", - "update_changelog_empty": "Für diese Version wurden keine Versionshinweise bereitgestellt.", - "subscription_login_title": "VberAI-Abonnementkonto", - "subscription_password_label": "Passwort", - "subscription_password_placeholder": "Passwort eingeben", - "subscription_login_button": "Mit VberAI anmelden", - "subscription_google_button": "Mit Google anmelden", - "subscription_google_pending": "Browser geöffnet. Schließen Sie die Google-Autorisierung ab und kehren Sie dann zu Cocos Creator zurück.", - "subscription_google_pending_button": "Warte auf Google-Autorisierung...", - "subscription_register_button": "VberAI-Konto erstellen", - "subscription_logging_in": "Anmeldung läuft...", - "subscription_credentials_required": "Bitte E-Mail und Passwort eingeben", - "subscription_login_success": "Bei Abonnementkonto angemeldet", - "subscription_login_failed": "Abonnement-Anmeldung fehlgeschlagen", - "subscription_not_entitled": "Ihr aktuelles Abonnement enthält Cocos 3.x MCP nicht. Führen Sie ein Upgrade durch, um fortzufahren.", - "subscription_upgrade_to": "Führen Sie ein Upgrade auf „{0}“ durch, um dieses Produkt zu verwenden", - "subscription_upgrade_action": "Abonnement upgraden", - "subscription_logged_in": "Angemeldetes Konto", - "subscription_choose_button": "VberAI-Abonnementkonto", - "license_choose_button": "Aktivierungscode", - "subscription_method_label": "Abonnement", - "back_to_login_choices": "← Andere Anmeldemethode wählen", - "subscription_signed_out_other_device": "Abgemeldet: Ihr Konto wurde auf einem anderen Gerät verwendet.", - "subscription_google_cancelled": "Google-Anmeldung wurde abgebrochen.", - "subscription_request_timeout": "Zeitüberschreitung der Anfrage. Überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut.", - "subscription_network_error": "Netzwerkverbindung fehlgeschlagen. Überprüfen Sie Ihr Netzwerk und versuchen Sie es erneut.", - "subscription_server_error": "Der Server hat eine ungültige Antwort zurückgegeben. Versuchen Sie es später erneut.", - "subscription_google_authorization_failed": "Die Google-Autorisierung wurde nicht abgeschlossen. Bitte versuchen Sie es erneut." - ,"lan_access_label": "LAN-Zugriff erlauben" - ,"lan_access_warning": "An 0.0.0.0 gebunden. Jeder in diesem Netzwerk kann sich verbinden und den Editor steuern — dieser Endpunkt prüft keinerlei Anmeldedaten. Nur in einem vertrauenswürdigen Netzwerk aktivieren." - ,"lan_address": "LAN-Adresse" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/en.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/en.js deleted file mode 100644 index d642bb8..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/en.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "AI MCP Server for Cocos Creator 3.8", - "panel_title": "MCP Server", - "open_panel": "Open MCP Panel", - "start_server": "Start Server", - "stop_server": "Stop Server", - "server_status": "Server Status", - "port": "Port", - "settings": "Settings", - "connected": "Connected", - "disconnected": "Disconnected", - "server_running": "Server is running on port {0}", - "server_stopped": "Server has stopped", - "auto_start": "Auto Start", - "debug_log": "Debug Logging", - "max_connections": "Max Connections", - "connection_info": "Connection Info", - "http_url": "HTTP URL", - "copy": "Copy", - "save_settings": "Save Settings", - "settings_saved": "Settings saved successfully", - "server_started": "MCP Server Started", - "server_stopped_msg": "MCP Server Stopped", - "failed_to_start": "Failed to start server", - "failed_to_stop": "Failed to stop server", - "failed_to_save": "Failed to save settings", - "url_copied": "HTTP URL copied to clipboard", - "tool_manager": "Tool Manager", - "open_tool_manager": "Open Tool Manager", - "create_config": "Create Configuration", - "edit_config": "Edit Configuration", - "delete_config": "Delete Configuration", - "import_config": "Import Configuration", - "export_config": "Export Configuration", - "apply_config": "Apply Configuration", - "select_all": "Select All", - "deselect_all": "Deselect All", - "save_changes": "Save Changes", - "config_name": "Configuration Name", - "config_description": "Configuration Description", - "current_config": "Current Configuration", - "tool_management": "Tool Management", - "total_tools": "Total Tools", - "enabled_tools": "Enabled", - "disabled_tools": "Disabled", - "no_config_selected": "No Configuration Selected", - "select_config_first": "Please select a configuration or create a new one first", - "config_created": "Configuration created successfully", - "config_updated": "Configuration updated successfully", - "config_deleted": "Configuration deleted successfully", - "config_applied": "Configuration applied successfully", - "config_exported": "Configuration exported successfully", - "config_imported": "Configuration imported successfully", - "confirm_delete": "Confirm Delete", - "delete_config_confirm": "Are you sure you want to delete configuration \"{0}\"? This action cannot be undone.", - "max_config_slots_reached": "Maximum configuration slots reached ({0})", - "invalid_config_format": "Invalid configuration format", - "invalid_json_format": "Invalid JSON format or configuration structure", - "server_tab": "Server", - "tools_tab": "Tool Management", - "available_tools": "Available Tools", - "scene_tools": "Scene Tools", - "node_tools": "Node Tools", - "component_tools": "Component Tools", - "prefab_tools": "Prefab Tools", - "project_tools": "Project Tools", - "debug_tools": "Debug Tools", - "preferences_tools": "Preferences", - "server_tools": "Server Tools", - "broadcast_tools": "Broadcast Tools", - "scene_advanced_tools": "Advanced Scene Tools", - "scene_view_tools": "Scene View Tools", - "reference_image_tools": "Reference Image Tools", - "asset_advanced_tools": "Advanced Asset Tools", - "validation_tools": "Validation Tools", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Email", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Machine ID", - "purchase_renew": "Purchase / Renew", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Choose a sign-in method", - "auth_subtitle": "Enter your email and activation code", - "auth_choose_subtitle": "Choose a sign-in method to continue", - "email_label": "Email Address", - "activation_code_label": "Activation Code", - "email_placeholder": "Enter email", - "code_placeholder": "Enter code (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Activate", - "deactivate_button": "Deactivate", - "activating": "Activating...", - "deactivating": "Deactivating...", - "license_status": "License Status", - "license_type": "License Type", - "expiry_date": "Expiry Date", - "days_remaining": "Days Remaining", - "days_unit": "d", - "permanent": "Permanent", - "expiry_warning_title": "License Expiring Soon", - "expiry_warning_message": "Your license will expire in {0} days. Please renew to avoid service interruption.", - "renew_now": "Renew Now", - "i_understand": "I Understand", - "activation_success": "License activated successfully!", - "activation_failed": "Activation failed: {0}", - "invalid_code": "Invalid activation code format", - "purchase_license": "Purchase License", - "renew_license": "Renew License", - "contact_support": "Support", - "language_switch": "English", - "version_label": "Version", - "license_required": "License required to start server", - "license_check_failed": "License check failed", - - "status_stopped": "Stopped", - "status_running": "Running", - "status_error": "Connection Failed", - "config_tab": "Quick Config", - "status_label": "Status", - "connections_count": "Connections", - "transport_protocol": "Transport Protocol", - "transport_type": "Transport Type", - "mcp_url": "MCP URL", - "port_fallback_title": "Port {0} is in use — switched to {1}", - "net_title": "Network / Proxy", - "net_direct": "Direct", - "net_via": "via {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "env var", - "net_source_system": "system settings", - "net_mode_auto": "Auto-detect", - "net_mode_manual": "Manual", - "net_mode_off": "No proxy", - "net_save": "Save", - "net_test": "Test connection", - "net_testing": "Testing…", - "net_test_ok": "Connected ({0} ms)", - "net_test_fail": "Failed: {0}", - "net_hint": "Login timeouts are usually a network issue. If you use a VPN/proxy, enter its address here (e.g. http://127.0.0.1:7890) or switch the client to global (TUN) mode.", - "net_pac_warning": "The system uses a PAC auto-config script, which this plugin cannot evaluate. Switch to Manual and enter the proxy address.", - "port_label": "Port", - "auto_start_label": "Auto Start", - "debug_log_label": "Debug Log", - "max_connections_label": "Max Connections", - "server_settings_title": "Server Settings", - "server_status_title": "Server Status", - "connection_info_title": "Connection Info", - "tools_count": "{0} tools", - "tools_stats": "{0} tools ({1} enabled / {2} disabled)", - "quick_config_title": "Quick Config MCP Clients", - "quick_config_desc": "Auto-configure the current MCP server into mainstream AI editors and CLI tools", - "server_info": "Server Info", - "server_name_label": "Server Name", - "server_address": "Server Address", - "timeout_ms": "Timeout (ms)", - "auto_config_title": "Auto Config (IDE Editors + Codex CLI)", - "add_all": "Add All", - "remove_all": "Remove All", - "auto_config_note": "Click button to auto-modify config files (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Configured", - "not_configured": "Not Configured", - "auto_config_btn": "Auto Config", - "delete_btn": "Delete", - "copy_config": "Copy Config", - "open_config": "Open Config", - "manual_config_title": "Manual Config (Claude CLI + Gemini CLI)", - "refresh_commands": "Refresh Commands", - "manual_config_note": "The following CLI tools need manual terminal command execution", - "config_scope": "Config Scope:", - "scope_user": "User Level", - "scope_project": "Project Level", - "operation_log": "Operation Log", - "no_logs": "No operation records", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Based on Streamable HTTP Protocol (MCP 2025-03-26)", - "tools_copyright_line1": "Tool System - 13 intent-level tools, 150+ editor operations, action code dispatch", - "config_copyright_line1": "Quick Config - Supports Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Please enter email and activation code", - "permanent_label": "Permanent", - "logout_button": "Logout", - "invite_code_label": "Invite Code", - "copy_button": "Copy", - "change_code_button": "Change Code", - "change_code_title": "Change Activation Code", - "change_code_desc": "Enter your new activation code. The current device binding will be released first.", - "confirm_change": "Confirm", - "cancel": "Cancel", - "code_required": "Please enter an activation code", - "expiry_inline_warning": "Expiring soon!", - "store_purchase_hint": "If you purchased this plugin from Cocos Store, please contact me to get your activation code.", - "license_expired_title": "License Expired", - "license_expired_message": "Your license has expired and the server cannot be started. Please renew or reactivate to continue.", - "go_to_login": "Go to Login", - - "log_load_config_failed": "Failed to load config status: {0}", - "log_gen_cli_failed": "Failed to generate CLI commands: {0}", - "log_add_client_failed": "Failed to add to {0}: {1}", - "log_remove_client_failed": "Failed to remove from {0}: {1}", - "quick_config_dialog_title": "One-click Configuration", - "config_operation_failed": "Configuration operation failed", - "config_file_not_found_changed_path": "Configuration failed: could not find the config file. {0} may be installed in a custom path.", - "log_batch_add_failed": "Batch add failed: {0}", - "log_batch_remove_failed": "Batch remove failed: {0}", - "log_copied_config": "Copied {0} config to clipboard", - "log_gen_config_failed": "Failed to generate config", - "log_copy_config_failed": "Failed to copy config: {0}", - "log_copied_command": "Copied {0} command to clipboard", - "log_copy_command_failed": "Failed to copy command: {0}", - "log_opened_config_file": "Opened config file: {0}", - "log_open_config_failed": "Failed to open config file", - "log_open_config_error": "Failed to open config file: {0}", - - "update_available_title": "Update Available", - "update_new_version": "New version v{0} is available!", - "update_now": "Update Now", - "update_not_now": "Not Now", - "update_skip_version": "Skip v{0}", - "check_for_updates": "Check for Updates", - "update_checking": "Checking...", - "update_no_update": "You are using the latest version", - "update_urgency_critical": "Critical Update", - "update_urgency_high": "Important Update", - "update_current_version": "Current version: v{0}", - "update_changelog": "Changelog" - ,"update_changelog_empty": "No release notes were provided for this version." - ,"subscription_login_title": "VberAI subscription account" - ,"subscription_password_label": "Password" - ,"subscription_password_placeholder": "Enter password" - ,"subscription_login_button": "Sign in with VberAI" - ,"subscription_google_button": "Sign in with Google" - ,"subscription_google_pending": "Browser opened. Complete Google authorization, then return to Cocos Creator." - ,"subscription_google_pending_button": "Waiting for Google authorization..." - ,"subscription_register_button": "Create a VberAI account" - ,"subscription_logging_in": "Signing in..." - ,"subscription_credentials_required": "Please enter email and password" - ,"subscription_login_success": "Subscription account signed in" - ,"subscription_login_failed": "Subscription sign-in failed" - ,"subscription_not_entitled": "Your current subscription does not include Cocos 3.x MCP. Upgrade to continue." - ,"subscription_upgrade_to": "Upgrade to {0} to use this product" - ,"subscription_upgrade_action": "Upgrade subscription" - ,"subscription_logged_in": "Signed-in account" - ,"subscription_choose_button": "VberAI subscription account" - ,"license_choose_button": "Activation code" - ,"subscription_method_label": "Subscription" - ,"back_to_login_choices": "← Choose another sign-in method" - ,"subscription_signed_out_other_device": "Signed out: your account was used on another device." - ,"subscription_google_cancelled": "Google sign-in was cancelled." - ,"subscription_request_timeout": "The request timed out. Check your network and try again." - ,"subscription_network_error": "Network connection failed. Check your network and try again." - ,"subscription_server_error": "The server returned an invalid response. Try again later." - ,"subscription_google_authorization_failed": "Google authorization was not completed. Please try again." - ,"lan_access_label": "Allow LAN access" - ,"lan_access_warning": "Bound to 0.0.0.0. Anyone on this network can connect and drive the editor — this endpoint verifies no credentials. Only enable on a trusted network." - ,"lan_address": "LAN address" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/es.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/es.js deleted file mode 100644 index a5d1580..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/es.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP Servidor", - "description": "Servidor AI MCP para Cocos Creator 3.8", - "panel_title": "Servidor MCP", - "open_panel": "Abrir panel MCP", - "start_server": "Iniciar servidor", - "stop_server": "Detener servidor", - "server_status": "Estado del servidor", - "port": "Puerto", - "settings": "Ajustes", - "connected": "Conectado", - "disconnected": "Desconectado", - "server_running": "El servidor está ejecutándose en el puerto {0}", - "server_stopped": "El servidor se ha detenido", - "auto_start": "Inicio automático", - "debug_log": "Registro de depuración", - "max_connections": "Conexiones máx.", - "connection_info": "Info de conexión", - "http_url": "URL HTTP", - "copy": "Copiar", - "save_settings": "Guardar", - "settings_saved": "Ajustes guardados correctamente", - "server_started": "Servidor MCP iniciado", - "server_stopped_msg": "Servidor MCP detenido", - "failed_to_start": "Error al iniciar el servidor", - "failed_to_stop": "Error al detener el servidor", - "failed_to_save": "Error al guardar los ajustes", - "url_copied": "URL HTTP copiada al portapapeles", - "tool_manager": "Gestor de herramientas", - "open_tool_manager": "Abrir gestor de herramientas", - "create_config": "Crear configuración", - "edit_config": "Editar configuración", - "delete_config": "Eliminar configuración", - "import_config": "Importar configuración", - "export_config": "Exportar configuración", - "apply_config": "Aplicar configuración", - "select_all": "Seleccionar todo", - "deselect_all": "Deseleccionar todo", - "save_changes": "Guardar cambios", - "config_name": "Nombre de configuración", - "config_description": "Descripción de configuración", - "current_config": "Configuración actual", - "tool_management": "Gestión de herramientas", - "total_tools": "Total de herramientas", - "enabled_tools": "Activadas", - "disabled_tools": "Desactivadas", - "no_config_selected": "Ninguna configuración seleccionada", - "select_config_first": "Por favor, seleccione o cree una configuración primero", - "config_created": "Configuración creada correctamente", - "config_updated": "Configuración actualizada correctamente", - "config_deleted": "Configuración eliminada correctamente", - "config_applied": "Configuración aplicada correctamente", - "config_exported": "Configuración exportada correctamente", - "config_imported": "Configuración importada correctamente", - "confirm_delete": "Confirmar eliminación", - "delete_config_confirm": "¿Está seguro de eliminar la configuración \"{0}\"? Esta acción no se puede deshacer.", - "max_config_slots_reached": "Se alcanzó el máximo de configuraciones ({0})", - "invalid_config_format": "Formato de configuración no válido", - "invalid_json_format": "Formato JSON o estructura de configuración no válidos", - "server_tab": "Servidor", - "tools_tab": "Gestión de herramientas", - "available_tools": "Herramientas disponibles", - "scene_tools": "Herramientas de escena", - "node_tools": "Herramientas de nodo", - "component_tools": "Herramientas de componente", - "prefab_tools": "Herramientas de prefab", - "project_tools": "Herramientas de proyecto", - "debug_tools": "Herramientas de depuración", - "preferences_tools": "Preferencias", - "server_tools": "Herramientas de servidor", - "broadcast_tools": "Herramientas de difusión", - "scene_advanced_tools": "Herramientas de escena avanzadas", - "scene_view_tools": "Herramientas de vista de escena", - "reference_image_tools": "Herramientas de imagen de referencia", - "asset_advanced_tools": "Herramientas de assets avanzadas", - "validation_tools": "Herramientas de validación", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Correo", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Código de máquina", - "purchase_renew": "Comprar / Renovar", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Elegir método de inicio de sesión", - "auth_subtitle": "Ingrese su correo y código de activación", - "email_label": "Correo electrónico", - "activation_code_label": "Código de activación", - "email_placeholder": "Ingrese correo", - "code_placeholder": "Ingrese código (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Activar", - "deactivate_button": "Desactivar", - "activating": "Activando...", - "deactivating": "Desactivando...", - "license_status": "Estado de licencia", - "license_type": "Tipo de licencia", - "expiry_date": "Fecha de vencimiento", - "days_remaining": "Días restantes", - "days_unit": "d", - "permanent": "Permanente", - "expiry_warning_title": "La licencia expira pronto", - "expiry_warning_message": "Su licencia expirará en {0} días. Por favor, renueve para evitar interrupciones.", - "renew_now": "Renovar ahora", - "i_understand": "Entendido", - "activation_success": "¡Licencia activada correctamente!", - "activation_failed": "Error de activación: {0}", - "invalid_code": "Formato de código de activación no válido", - "purchase_license": "Comprar licencia", - "renew_license": "Renovar licencia", - "contact_support": "Soporte", - "language_switch": "Español", - "version_label": "Versión", - "license_required": "Se requiere licencia para iniciar el servidor", - "license_check_failed": "Error en la verificación de licencia", - - "status_stopped": "Detenido", - "status_running": "En ejecución", - "status_error": "Error de conexión", - "config_tab": "Config rápida", - "status_label": "Estado", - "connections_count": "Conexiones", - "transport_protocol": "Protocolo de transporte", - "transport_type": "Tipo de transporte", - "mcp_url": "URL MCP", - "port_fallback_title": "Puerto {0} ocupado: se cambió a {1}", - "net_title": "Red / Proxy", - "net_direct": "Conexión directa", - "net_via": "vía {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "variable de entorno", - "net_source_system": "ajustes del sistema", - "net_mode_auto": "Detección automática", - "net_mode_manual": "Manual", - "net_mode_off": "Sin proxy", - "net_save": "Guardar", - "net_test": "Probar conexión", - "net_testing": "Probando…", - "net_test_ok": "Conectado ({0} ms)", - "net_test_fail": "Error: {0}", - "net_hint": "Los tiempos de espera al iniciar sesión suelen ser de red. Si usas VPN/proxy, indica su dirección aquí (p. ej. http://127.0.0.1:7890) o cambia el cliente a modo global (TUN).", - "net_pac_warning": "El sistema usa un script PAC que este plugin no puede evaluar. Cambia a Manual e introduce la dirección del proxy.", - "port_label": "Puerto", - "auto_start_label": "Inicio auto", - "debug_log_label": "Registro de depuración", - "max_connections_label": "Conexiones máx.", - "server_settings_title": "Ajustes del servidor", - "server_status_title": "Estado del servidor", - "connection_info_title": "Info de conexión", - "tools_count": "{0} herramientas", - "tools_stats": "{0} herramientas ({1} activadas / {2} desactivadas)", - "quick_config_title": "Config rápida de clientes MCP", - "quick_config_desc": "Configurar automáticamente el servidor MCP en editores AI y herramientas CLI", - "server_info": "Info del servidor", - "server_name_label": "Nombre del servidor", - "server_address": "Dirección del servidor", - "timeout_ms": "Tiempo de espera (ms)", - "auto_config_title": "Config auto (IDE + Codex CLI)", - "add_all": "Añadir todo", - "remove_all": "Eliminar todo", - "auto_config_note": "Haga clic para modificar automáticamente los archivos de config (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Configurado", - "not_configured": "No configurado", - "auto_config_btn": "Config auto", - "delete_btn": "Eliminar", - "copy_config": "Copiar config", - "open_config": "Abrir config", - "manual_config_title": "Config manual (Claude CLI + Gemini CLI)", - "refresh_commands": "Actualizar comandos", - "manual_config_note": "Las siguientes herramientas CLI requieren ejecución manual en terminal", - "config_scope": "Ámbito de config:", - "scope_user": "Nivel de usuario", - "scope_project": "Nivel de proyecto", - "operation_log": "Registro de operaciones", - "no_logs": "Sin registros", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Basado en el protocolo Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Sistema de herramientas - 13 herramientas intent-level, 150+ operaciones de editor, despacho de código de acción", - "config_copyright_line1": "Config rápida - Soporta Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Por favor ingrese correo y código de activación", - "permanent_label": "Permanente", - "logout_button": "Cerrar sesión", - "invite_code_label": "Código de invitación", - "copy_button": "Copiar", - "change_code_button": "Cambiar código", - "change_code_title": "Cambiar código de activación", - "change_code_desc": "Ingrese su nuevo código de activación. El enlace del dispositivo actual se liberará primero.", - "confirm_change": "Confirmar", - "cancel": "Cancelar", - "code_required": "Por favor ingrese un código de activación", - "expiry_inline_warning": "¡Expira pronto!", - "store_purchase_hint": "Si compró este plugin en Cocos Store, contácteme para obtener su código de activación.", - "license_expired_title": "Licencia expirada", - "license_expired_message": "Su licencia ha expirado y el servidor no puede iniciarse. Renueve o reactive para continuar.", - "go_to_login": "Ir a inicio de sesión", - - "log_load_config_failed": "Error al cargar el estado de config: {0}", - "log_gen_cli_failed": "Error al generar comandos CLI: {0}", - "log_add_client_failed": "Error al añadir a {0}: {1}", - "log_remove_client_failed": "Error al eliminar de {0}: {1}", - "quick_config_dialog_title": "Configuración con un clic", - "config_operation_failed": "Error en la operación de configuración", - "config_file_not_found_changed_path": "Error de configuración: no se encontró el archivo de configuración. Es posible que {0} se haya instalado en una ruta personalizada.", - "log_batch_add_failed": "Error en la adición masiva: {0}", - "log_batch_remove_failed": "Error en la eliminación masiva: {0}", - "log_copied_config": "Config de {0} copiada al portapapeles", - "log_gen_config_failed": "Error al generar la config", - "log_copy_config_failed": "Error al copiar la config: {0}", - "log_copied_command": "Comando {0} copiado al portapapeles", - "log_copy_command_failed": "Error al copiar el comando: {0}", - "log_opened_config_file": "Archivo de config abierto: {0}", - "log_open_config_failed": "Error al abrir archivo de config", - "log_open_config_error": "Error al abrir archivo de config: {0}", - - "update_available_title": "Actualización disponible", - "update_new_version": "¡La nueva versión v{0} está disponible!", - "update_now": "Actualizar ahora", - "update_not_now": "Ahora no", - "update_skip_version": "Omitir v{0}", - "check_for_updates": "Buscar actualizaciones", - "update_checking": "Comprobando...", - "update_no_update": "Está usando la última versión", - "update_urgency_critical": "Actualización crítica", - "update_urgency_high": "Actualización importante", - "update_current_version": "Versión actual: v{0}", - "update_changelog": "Registro de cambios", - "auth_choose_subtitle": "Elige un método de inicio de sesión para continuar", - "update_changelog_empty": "No se proporcionaron notas de la versión para esta versión.", - "subscription_login_title": "Cuenta de suscripción de VberAI", - "subscription_password_label": "Contraseña", - "subscription_password_placeholder": "Introduce la contraseña", - "subscription_login_button": "Iniciar sesión con VberAI", - "subscription_google_button": "Iniciar sesión con Google", - "subscription_google_pending": "Navegador abierto. Completa la autorización de Google y vuelve a Cocos Creator.", - "subscription_google_pending_button": "Esperando la autorización de Google...", - "subscription_register_button": "Crear una cuenta de VberAI", - "subscription_logging_in": "Iniciando sesión...", - "subscription_credentials_required": "Introduce el correo electrónico y la contraseña", - "subscription_login_success": "Sesión iniciada en la cuenta de suscripción", - "subscription_login_failed": "Error al iniciar sesión en la suscripción", - "subscription_not_entitled": "Tu suscripción actual no incluye Cocos 3.x MCP. Actualiza para continuar.", - "subscription_upgrade_to": "Actualiza a «{0}» para usar este producto", - "subscription_upgrade_action": "Mejorar suscripción", - "subscription_logged_in": "Cuenta con sesión iniciada", - "subscription_choose_button": "Cuenta de suscripción de VberAI", - "license_choose_button": "Código de activación", - "subscription_method_label": "Suscripción", - "back_to_login_choices": "← Elegir otro método de inicio de sesión", - "subscription_signed_out_other_device": "Sesión cerrada: tu cuenta se usó en otro dispositivo.", - "subscription_google_cancelled": "Se canceló el inicio de sesión con Google.", - "subscription_request_timeout": "Se agotó el tiempo de la solicitud. Comprueba tu red e inténtalo de nuevo.", - "subscription_network_error": "Falló la conexión de red. Comprueba tu red e inténtalo de nuevo.", - "subscription_server_error": "El servidor devolvió una respuesta no válida. Inténtalo más tarde.", - "subscription_google_authorization_failed": "No se completó la autorización de Google. Inténtalo de nuevo." - ,"lan_access_label": "Permitir acceso desde la red local" - ,"lan_access_warning": "Vinculado a 0.0.0.0. Cualquiera en esta red puede conectarse y manejar el editor: este punto de conexión no verifica ninguna credencial. Actívalo solo en una red de confianza." - ,"lan_address": "Dirección de red local" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fil.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fil.js deleted file mode 100644 index 3188bea..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fil.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "AI MCP Server para sa Cocos Creator 3.8", - "panel_title": "MCP Server", - "open_panel": "Buksan ang MCP Panel", - "start_server": "Simulan ang Server", - "stop_server": "Ihinto ang Server", - "server_status": "Katayuan ng Server", - "port": "Port", - "settings": "Mga Setting", - "connected": "Nakakonekta", - "disconnected": "Nadiskonekta", - "server_running": "Tumatakbo ang server sa port {0}", - "server_stopped": "Huminto na ang server", - "auto_start": "Awtomatikong Simulan", - "debug_log": "Debug Log", - "max_connections": "Maximum na Koneksyon", - "connection_info": "Impormasyon ng Koneksyon", - "http_url": "HTTP URL", - "copy": "Kopyahin", - "save_settings": "I-save ang Mga Setting", - "settings_saved": "Matagumpay na na-save ang mga setting", - "server_started": "Nagsimula ang MCP Server", - "server_stopped_msg": "Huminto ang MCP Server", - "failed_to_start": "Nabigong simulan ang server", - "failed_to_stop": "Nabigong ihinto ang server", - "failed_to_save": "Nabigong i-save ang mga setting", - "url_copied": "Nakopya ang HTTP URL sa clipboard", - "tool_manager": "Tagapamahala ng Kasangkapan", - "open_tool_manager": "Buksan ang Tagapamahala ng Kasangkapan", - "create_config": "Gumawa ng Configuration", - "edit_config": "I-edit ang Configuration", - "delete_config": "Tanggalin ang Configuration", - "import_config": "Mag-import ng Configuration", - "export_config": "Mag-export ng Configuration", - "apply_config": "Ilapat ang Configuration", - "select_all": "Piliin Lahat", - "deselect_all": "Alisin ang Lahat ng Pinili", - "save_changes": "I-save ang Mga Pagbabago", - "config_name": "Pangalan ng Configuration", - "config_description": "Paglalarawan ng Configuration", - "current_config": "Kasalukuyang Configuration", - "tool_management": "Pamamahala ng Kasangkapan", - "total_tools": "Kabuuang Kasangkapan", - "enabled_tools": "Naka-enable", - "disabled_tools": "Naka-disable", - "no_config_selected": "Walang Napiling Configuration", - "select_config_first": "Pumili muna ng configuration o gumawa ng bago", - "config_created": "Matagumpay na nagawa ang configuration", - "config_updated": "Matagumpay na na-update ang configuration", - "config_deleted": "Matagumpay na natanggal ang configuration", - "config_applied": "Matagumpay na nailapat ang configuration", - "config_exported": "Matagumpay na na-export ang configuration", - "config_imported": "Matagumpay na na-import ang configuration", - "confirm_delete": "Kumpirmahin ang Pagtanggal", - "delete_config_confirm": "Sigurado ka bang tatanggalin ang configuration na \"{0}\"? Hindi na ito maibabalik.", - "max_config_slots_reached": "Naabot na ang maximum na slot ng configuration ({0})", - "invalid_config_format": "Hindi wastong format ng configuration", - "invalid_json_format": "Hindi wastong format ng JSON o istruktura ng configuration", - "server_tab": "Server", - "tools_tab": "Pamamahala ng Kasangkapan", - "available_tools": "Mga Available na Kasangkapan", - "scene_tools": "Mga Kasangkapan sa Scene", - "node_tools": "Mga Kasangkapan sa Node", - "component_tools": "Mga Kasangkapan sa Component", - "prefab_tools": "Mga Kasangkapan sa Prefab", - "project_tools": "Mga Kasangkapan sa Proyekto", - "debug_tools": "Mga Kasangkapan sa Debug", - "preferences_tools": "Mga Kagustuhan", - "server_tools": "Mga Kasangkapan sa Server", - "broadcast_tools": "Mga Kasangkapan sa Broadcast", - "scene_advanced_tools": "Mga Advanced na Kasangkapan sa Scene", - "scene_view_tools": "Mga Kasangkapan sa Scene View", - "reference_image_tools": "Mga Kasangkapan sa Reference Image", - "asset_advanced_tools": "Mga Advanced na Kasangkapan sa Asset", - "validation_tools": "Mga Kasangkapan sa Validation", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Email", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Machine ID", - "purchase_renew": "Bumili / I-renew", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Pumili ng paraan ng pag-sign in", - "auth_subtitle": "Ilagay ang iyong email at activation code", - "auth_choose_subtitle": "Pumili ng paraan ng pag-sign in upang magpatuloy", - "email_label": "Email Address", - "activation_code_label": "Activation Code", - "email_placeholder": "Ilagay ang email", - "code_placeholder": "Ilagay ang code (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "I-activate", - "deactivate_button": "I-deactivate", - "activating": "Ina-activate...", - "deactivating": "Dina-deactivate...", - "license_status": "Katayuan ng Lisensya", - "license_type": "Uri ng Lisensya", - "expiry_date": "Petsa ng Pag-expire", - "days_remaining": "Natitirang Araw", - "days_unit": "araw", - "permanent": "Permanente", - "expiry_warning_title": "Malapit Nang Mag-expire ang Lisensya", - "expiry_warning_message": "Mag-e-expire ang iyong lisensya sa loob ng {0} araw. Mangyaring i-renew upang maiwasan ang pagkaantala ng serbisyo.", - "renew_now": "I-renew Ngayon", - "i_understand": "Naiintindihan Ko", - "activation_success": "Matagumpay na na-activate ang lisensya!", - "activation_failed": "Nabigo ang activation: {0}", - "invalid_code": "Hindi wastong format ng activation code", - "purchase_license": "Bumili ng Lisensya", - "renew_license": "I-renew ang Lisensya", - "contact_support": "Suporta", - "language_switch": "Filipino", - "version_label": "Bersyon", - "license_required": "Kailangan ng lisensya upang simulan ang server", - "license_check_failed": "Nabigo ang pagsusuri ng lisensya", - - "status_stopped": "Huminto", - "status_running": "Tumatakbo", - "status_error": "Nabigo ang Koneksyon", - "config_tab": "Mabilis na Config", - "status_label": "Katayuan", - "connections_count": "Mga Koneksyon", - "transport_protocol": "Transport Protocol", - "transport_type": "Uri ng Transport", - "mcp_url": "MCP URL", - "port_fallback_title": "Ginagamit ang port {0} — lumipat sa {1}", - "net_title": "Network / Proxy", - "net_direct": "Direktang koneksyon", - "net_via": "sa pamamagitan ng {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "environment variable", - "net_source_system": "system settings", - "net_mode_auto": "Auto-detect", - "net_mode_manual": "Manual", - "net_mode_off": "Walang proxy", - "net_save": "I-save", - "net_test": "I-test ang koneksyon", - "net_testing": "Sinusubukan…", - "net_test_ok": "Nakakonekta ({0} ms)", - "net_test_fail": "Nabigo: {0}", - "net_hint": "Ang login timeout ay karaniwang isyu sa network. Kung gumagamit ng VPN/proxy, ilagay ang address (hal. http://127.0.0.1:7890) o ilipat ang client sa global (TUN) mode.", - "net_pac_warning": "Gumagamit ang system ng PAC script na hindi kayang basahin ng plugin. Pumili ng Manual at ilagay ang proxy address.", - "port_label": "Port", - "auto_start_label": "Awtomatikong Simulan", - "debug_log_label": "Debug Log", - "max_connections_label": "Maximum na Koneksyon", - "server_settings_title": "Mga Setting ng Server", - "server_status_title": "Katayuan ng Server", - "connection_info_title": "Impormasyon ng Koneksyon", - "tools_count": "{0} na kasangkapan", - "tools_stats": "{0} na kasangkapan ({1} naka-enable / {2} naka-disable)", - "quick_config_title": "Mabilis na Pag-configure ng MCP Clients", - "quick_config_desc": "Awtomatikong i-configure ang kasalukuyang MCP server sa mga pangunahing AI editor at CLI tool", - "server_info": "Impormasyon ng Server", - "server_name_label": "Pangalan ng Server", - "server_address": "Address ng Server", - "timeout_ms": "Timeout (ms)", - "auto_config_title": "Awtomatikong Config (IDE Editors + Codex CLI)", - "add_all": "Idagdag Lahat", - "remove_all": "Alisin Lahat", - "auto_config_note": "I-click ang button upang awtomatikong baguhin ang mga config file (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Naka-configure", - "not_configured": "Hindi Naka-configure", - "auto_config_btn": "Awtomatikong Config", - "delete_btn": "Tanggalin", - "copy_config": "Kopyahin ang Config", - "open_config": "Buksan ang Config", - "manual_config_title": "Manwal na Config (Claude CLI + Gemini CLI)", - "refresh_commands": "I-refresh ang Mga Command", - "manual_config_note": "Ang sumusunod na mga CLI tool ay nangangailangan ng manwal na pagpapatakbo ng terminal command", - "config_scope": "Saklaw ng Config:", - "scope_user": "Antas ng User", - "scope_project": "Antas ng Proyekto", - "operation_log": "Log ng Operasyon", - "no_logs": "Walang record ng operasyon", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Batay sa Streamable HTTP Protocol (MCP 2025-03-26)", - "tools_copyright_line1": "Sistema ng Kasangkapan - 13 intent-level na kasangkapan, 150+ operasyon sa editor, dispatch gamit ang action code", - "config_copyright_line1": "Mabilis na Config - Sinusuportahan ang Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Mangyaring ilagay ang email at activation code", - "permanent_label": "Permanente", - "logout_button": "Mag-log out", - "invite_code_label": "Invite Code", - "copy_button": "Kopyahin", - "change_code_button": "Palitan ang Code", - "change_code_title": "Palitan ang Activation Code", - "change_code_desc": "Ilagay ang iyong bagong activation code. Aalisin muna ang kasalukuyang device binding.", - "confirm_change": "Kumpirmahin", - "cancel": "Kanselahin", - "code_required": "Mangyaring ilagay ang activation code", - "expiry_inline_warning": "Malapit nang mag-expire!", - "store_purchase_hint": "Kung binili mo ang plugin na ito sa Cocos Store, mangyaring kontakin ako upang makuha ang iyong activation code.", - "license_expired_title": "Nag-expire na ang Lisensya", - "license_expired_message": "Nag-expire na ang iyong lisensya at hindi masisimulan ang server. Mangyaring i-renew o i-activate muli upang magpatuloy.", - "go_to_login": "Pumunta sa Pag-login", - - "log_load_config_failed": "Nabigong i-load ang katayuan ng config: {0}", - "log_gen_cli_failed": "Nabigong bumuo ng mga CLI command: {0}", - "log_add_client_failed": "Nabigong idagdag sa {0}: {1}", - "log_remove_client_failed": "Nabigong alisin mula sa {0}: {1}", - "quick_config_dialog_title": "One-click na Configuration", - "config_operation_failed": "Nabigo ang operasyon ng configuration", - "config_file_not_found_changed_path": "Nabigo ang configuration: hindi mahanap ang config file. Maaaring naka-install ang {0} sa custom na path.", - "log_batch_add_failed": "Nabigo ang batch add: {0}", - "log_batch_remove_failed": "Nabigo ang batch remove: {0}", - "log_copied_config": "Nakopya ang config ng {0} sa clipboard", - "log_gen_config_failed": "Nabigong bumuo ng config", - "log_copy_config_failed": "Nabigong kopyahin ang config: {0}", - "log_copied_command": "Nakopya ang command ng {0} sa clipboard", - "log_copy_command_failed": "Nabigong kopyahin ang command: {0}", - "log_opened_config_file": "Binuksan ang config file: {0}", - "log_open_config_failed": "Nabigong buksan ang config file", - "log_open_config_error": "Nabigong buksan ang config file: {0}", - - "update_available_title": "May Available na Update", - "update_new_version": "Available na ang bagong bersyon v{0}!", - "update_now": "I-update Ngayon", - "update_not_now": "Hindi Ngayon", - "update_skip_version": "Laktawan ang v{0}", - "check_for_updates": "Tingnan ang Mga Update", - "update_checking": "Sinusuri...", - "update_no_update": "Ginagamit mo na ang pinakabagong bersyon", - "update_urgency_critical": "Kritikal na Update", - "update_urgency_high": "Mahalagang Update", - "update_current_version": "Kasalukuyang bersyon: v{0}", - "update_changelog": "Changelog" - ,"update_changelog_empty": "Walang ibinigay na release notes para sa bersyong ito." - ,"subscription_login_title": "Account sa subscription ng VberAI" - ,"subscription_password_label": "Password" - ,"subscription_password_placeholder": "Ilagay ang password" - ,"subscription_login_button": "Mag-sign in gamit ang VberAI" - ,"subscription_google_button": "Mag-sign in gamit ang Google" - ,"subscription_google_pending": "Nabuksan ang browser. Kumpletuhin ang Google authorization, pagkatapos ay bumalik sa Cocos Creator." - ,"subscription_google_pending_button": "Naghihintay ng Google authorization..." - ,"subscription_register_button": "Gumawa ng VberAI account" - ,"subscription_logging_in": "Nagsa-sign in..." - ,"subscription_credentials_required": "Mangyaring ilagay ang email at password" - ,"subscription_login_success": "Naka-sign in ang subscription account" - ,"subscription_login_failed": "Nabigo ang pag-sign in ng subscription" - ,"subscription_not_entitled": "Hindi kasama ang Cocos 3.x MCP sa iyong kasalukuyang subscription. Mag-upgrade upang magpatuloy." - ,"subscription_upgrade_to": "Mag-upgrade sa {0} upang magamit ang produktong ito" - ,"subscription_upgrade_action": "I-upgrade ang subscription" - ,"subscription_logged_in": "Naka-sign in na account" - ,"subscription_choose_button": "Account sa subscription ng VberAI" - ,"license_choose_button": "Activation code" - ,"subscription_method_label": "Subscription" - ,"back_to_login_choices": "← Pumili ng ibang paraan ng pag-sign in" - ,"subscription_signed_out_other_device": "Naka-sign out: ginamit ang iyong account sa ibang device." - ,"subscription_google_cancelled": "Kinansela ang pag-sign in gamit ang Google." - ,"subscription_request_timeout": "Nag-timeout ang request. Suriin ang iyong network at subukan muli." - ,"subscription_network_error": "Nabigo ang koneksyon sa network. Suriin ang iyong network at subukan muli." - ,"subscription_server_error": "Nagbalik ang server ng hindi wastong tugon. Subukan muli mamaya." - ,"subscription_google_authorization_failed": "Hindi nakumpleto ang Google authorization. Mangyaring subukan muli." - ,"lan_access_label": "Payagan ang LAN access" - ,"lan_access_warning": "Naka-bind sa 0.0.0.0. Sinuman sa network na ito ay makakakonekta at makakakontrol sa editor — walang kredensyal na bine-verify ang endpoint na ito. I-enable lamang sa pinagkakatiwalaang network." - ,"lan_address": "LAN address" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fr.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fr.js deleted file mode 100644 index 7e583f5..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/fr.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP Serveur", - "description": "Serveur AI MCP pour Cocos Creator 3.8", - "panel_title": "Serveur MCP", - "open_panel": "Ouvrir le panneau MCP", - "start_server": "Démarrer le serveur", - "stop_server": "Arrêter le serveur", - "server_status": "État du serveur", - "port": "Port", - "settings": "Paramètres", - "connected": "Connecté", - "disconnected": "Déconnecté", - "server_running": "Le serveur fonctionne sur le port {0}", - "server_stopped": "Le serveur est arrêté", - "auto_start": "Démarrage automatique", - "debug_log": "Journal de débogage", - "max_connections": "Connexions max", - "connection_info": "Infos de connexion", - "http_url": "URL HTTP", - "copy": "Copier", - "save_settings": "Enregistrer", - "settings_saved": "Paramètres enregistrés avec succès", - "server_started": "Serveur MCP démarré", - "server_stopped_msg": "Serveur MCP arrêté", - "failed_to_start": "Échec du démarrage du serveur", - "failed_to_stop": "Échec de l'arrêt du serveur", - "failed_to_save": "Échec de l'enregistrement", - "url_copied": "URL HTTP copiée dans le presse-papiers", - "tool_manager": "Gestionnaire d'outils", - "open_tool_manager": "Ouvrir le gestionnaire d'outils", - "create_config": "Créer une configuration", - "edit_config": "Modifier la configuration", - "delete_config": "Supprimer la configuration", - "import_config": "Importer la configuration", - "export_config": "Exporter la configuration", - "apply_config": "Appliquer la configuration", - "select_all": "Tout sélectionner", - "deselect_all": "Tout désélectionner", - "save_changes": "Enregistrer les modifications", - "config_name": "Nom de configuration", - "config_description": "Description de configuration", - "current_config": "Configuration actuelle", - "tool_management": "Gestion des outils", - "total_tools": "Total des outils", - "enabled_tools": "Activés", - "disabled_tools": "Désactivés", - "no_config_selected": "Aucune configuration sélectionnée", - "select_config_first": "Veuillez d'abord sélectionner ou créer une configuration", - "config_created": "Configuration créée avec succès", - "config_updated": "Configuration mise à jour avec succès", - "config_deleted": "Configuration supprimée avec succès", - "config_applied": "Configuration appliquée avec succès", - "config_exported": "Configuration exportée avec succès", - "config_imported": "Configuration importée avec succès", - "confirm_delete": "Confirmer la suppression", - "delete_config_confirm": "Voulez-vous vraiment supprimer la configuration \"{0}\" ? Cette action est irréversible.", - "max_config_slots_reached": "Nombre maximal de configurations atteint ({0})", - "invalid_config_format": "Format de configuration invalide", - "invalid_json_format": "Format JSON ou structure de configuration invalide", - "server_tab": "Serveur", - "tools_tab": "Gestion des outils", - "available_tools": "Outils disponibles", - "scene_tools": "Outils de scène", - "node_tools": "Outils de nœud", - "component_tools": "Outils de composant", - "prefab_tools": "Outils de prefab", - "project_tools": "Outils de projet", - "debug_tools": "Outils de débogage", - "preferences_tools": "Préférences", - "server_tools": "Outils serveur", - "broadcast_tools": "Outils de diffusion", - "scene_advanced_tools": "Outils de scène avancés", - "scene_view_tools": "Outils de vue de scène", - "reference_image_tools": "Outils d'image de référence", - "asset_advanced_tools": "Outils d'assets avancés", - "validation_tools": "Outils de validation", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-mail", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Code machine", - "purchase_renew": "Acheter / Renouveler", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Choisir une méthode de connexion", - "auth_subtitle": "Entrez votre e-mail et votre code d'activation", - "email_label": "Adresse e-mail", - "activation_code_label": "Code d'activation", - "email_placeholder": "Entrez l'e-mail", - "code_placeholder": "Entrez le code (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Activer", - "deactivate_button": "Désactiver", - "activating": "Activation...", - "deactivating": "Désactivation...", - "license_status": "État de la licence", - "license_type": "Type de licence", - "expiry_date": "Date d'expiration", - "days_remaining": "Jours restants", - "days_unit": "j", - "permanent": "Permanent", - "expiry_warning_title": "Licence bientôt expirée", - "expiry_warning_message": "Votre licence expirera dans {0} jours. Veuillez renouveler pour éviter toute interruption.", - "renew_now": "Renouveler", - "i_understand": "J'ai compris", - "activation_success": "Licence activée avec succès !", - "activation_failed": "Échec de l'activation : {0}", - "invalid_code": "Format de code d'activation invalide", - "purchase_license": "Acheter une licence", - "renew_license": "Renouveler la licence", - "contact_support": "Support", - "language_switch": "Français", - "version_label": "Version", - "license_required": "Une licence est requise pour démarrer le serveur", - "license_check_failed": "Échec de la vérification de licence", - - "status_stopped": "Arrêté", - "status_running": "En cours", - "status_error": "Échec de connexion", - "config_tab": "Config rapide", - "status_label": "État", - "connections_count": "Connexions", - "transport_protocol": "Protocole de transport", - "transport_type": "Type de transport", - "mcp_url": "URL MCP", - "port_fallback_title": "Port {0} occupé — basculé vers {1}", - "net_title": "Réseau / Proxy", - "net_direct": "Connexion directe", - "net_via": "via {0} ({1})", - "net_source_manual": "manuel", - "net_source_env": "variable d’env.", - "net_source_system": "réglages système", - "net_mode_auto": "Détection auto", - "net_mode_manual": "Manuel", - "net_mode_off": "Sans proxy", - "net_save": "Enregistrer", - "net_test": "Tester la connexion", - "net_testing": "Test en cours…", - "net_test_ok": "Connecté ({0} ms)", - "net_test_fail": "Échec : {0}", - "net_hint": "Les délais de connexion viennent presque toujours du réseau. Si vous utilisez un VPN/proxy, saisissez son adresse ici (ex. http://127.0.0.1:7890) ou passez le client en mode global (TUN).", - "net_pac_warning": "Le système utilise un script PAC que ce plugin ne peut pas évaluer. Passez en mode Manuel et saisissez l’adresse du proxy.", - "port_label": "Port", - "auto_start_label": "Démarrage auto", - "debug_log_label": "Journal de débogage", - "max_connections_label": "Connexions max", - "server_settings_title": "Paramètres du serveur", - "server_status_title": "État du serveur", - "connection_info_title": "Infos de connexion", - "tools_count": "{0} outils", - "tools_stats": "{0} outils ({1} activés / {2} désactivés)", - "quick_config_title": "Config rapide des clients MCP", - "quick_config_desc": "Configurer automatiquement le serveur MCP dans les éditeurs AI et outils CLI", - "server_info": "Infos serveur", - "server_name_label": "Nom du serveur", - "server_address": "Adresse du serveur", - "timeout_ms": "Délai d'attente (ms)", - "auto_config_title": "Config auto (IDE + Codex CLI)", - "add_all": "Tout ajouter", - "remove_all": "Tout supprimer", - "auto_config_note": "Cliquez pour modifier automatiquement les fichiers de config (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Configuré", - "not_configured": "Non configuré", - "auto_config_btn": "Config auto", - "delete_btn": "Supprimer", - "copy_config": "Copier la config", - "open_config": "Ouvrir la config", - "manual_config_title": "Config manuelle (Claude CLI + Gemini CLI)", - "refresh_commands": "Actualiser les commandes", - "manual_config_note": "Les outils CLI suivants nécessitent une exécution manuelle dans le terminal", - "config_scope": "Portée de config :", - "scope_user": "Niveau utilisateur", - "scope_project": "Niveau projet", - "operation_log": "Journal des opérations", - "no_logs": "Aucun enregistrement", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Basé sur le protocole Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Système d'outils - 13 outils intent-level, 150+ opérations éditeur, dispatch par code d'action", - "config_copyright_line1": "Config rapide - Supporte Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Veuillez entrer l'e-mail et le code d'activation", - "permanent_label": "Permanent", - "logout_button": "Déconnexion", - "invite_code_label": "Code d'invitation", - "copy_button": "Copier", - "change_code_button": "Changer le code", - "change_code_title": "Changer le code d'activation", - "change_code_desc": "Entrez votre nouveau code d'activation. La liaison de l'appareil actuel sera d'abord libérée.", - "confirm_change": "Confirmer", - "cancel": "Annuler", - "code_required": "Veuillez entrer un code d'activation", - "expiry_inline_warning": "Expiration imminente !", - "store_purchase_hint": "Si vous avez acheté ce plugin sur Cocos Store, veuillez me contacter pour obtenir votre code d'activation.", - "license_expired_title": "Licence expirée", - "license_expired_message": "Votre licence a expiré et le serveur ne peut pas être démarré. Veuillez renouveler ou réactiver pour continuer.", - "go_to_login": "Se connecter", - - "log_load_config_failed": "Échec du chargement de la config : {0}", - "log_gen_cli_failed": "Échec de la génération des commandes CLI : {0}", - "log_add_client_failed": "Échec de l'ajout à {0} : {1}", - "log_remove_client_failed": "Échec de la suppression de {0} : {1}", - "quick_config_dialog_title": "Configuration en un clic", - "config_operation_failed": "Échec de l'opération de configuration", - "config_file_not_found_changed_path": "Échec de la configuration : fichier de configuration introuvable. {0} a peut-être été installé dans un chemin personnalisé.", - "log_batch_add_failed": "Échec de l'ajout groupé : {0}", - "log_batch_remove_failed": "Échec de la suppression groupée : {0}", - "log_copied_config": "Config {0} copiée dans le presse-papiers", - "log_gen_config_failed": "Échec de la génération de la config", - "log_copy_config_failed": "Échec de la copie de la config : {0}", - "log_copied_command": "Commande {0} copiée dans le presse-papiers", - "log_copy_command_failed": "Échec de la copie de la commande : {0}", - "log_opened_config_file": "Fichier de config ouvert : {0}", - "log_open_config_failed": "Échec de l'ouverture du fichier de config", - "log_open_config_error": "Échec de l'ouverture du fichier de config : {0}", - - "update_available_title": "Mise à jour disponible", - "update_new_version": "La nouvelle version v{0} est disponible !", - "update_now": "Mettre à jour", - "update_not_now": "Plus tard", - "update_skip_version": "Ignorer v{0}", - "check_for_updates": "Vérifier les mises à jour", - "update_checking": "Vérification...", - "update_no_update": "Vous utilisez la dernière version", - "update_urgency_critical": "Mise à jour critique", - "update_urgency_high": "Mise à jour importante", - "update_current_version": "Version actuelle : v{0}", - "update_changelog": "Journal des modifications", - "auth_choose_subtitle": "Choisissez une méthode de connexion pour continuer", - "update_changelog_empty": "Aucune note de version n'a été fournie pour cette version.", - "subscription_login_title": "Compte d'abonnement VberAI", - "subscription_password_label": "Mot de passe", - "subscription_password_placeholder": "Saisissez le mot de passe", - "subscription_login_button": "Se connecter avec VberAI", - "subscription_google_button": "Se connecter avec Google", - "subscription_google_pending": "Navigateur ouvert. Terminez l'autorisation Google, puis revenez à Cocos Creator.", - "subscription_google_pending_button": "En attente de l'autorisation Google...", - "subscription_register_button": "Créer un compte VberAI", - "subscription_logging_in": "Connexion en cours...", - "subscription_credentials_required": "Veuillez saisir l'e-mail et le mot de passe", - "subscription_login_success": "Connecté au compte d'abonnement", - "subscription_login_failed": "Échec de la connexion à l'abonnement", - "subscription_not_entitled": "Votre abonnement actuel n'inclut pas Cocos 3.x MCP. Effectuez une mise à niveau pour continuer.", - "subscription_upgrade_to": "Passez à « {0} » pour utiliser ce produit", - "subscription_upgrade_action": "Mettre à niveau l'abonnement", - "subscription_logged_in": "Compte connecté", - "subscription_choose_button": "Compte d'abonnement VberAI", - "license_choose_button": "Code d'activation", - "subscription_method_label": "Abonnement", - "back_to_login_choices": "← Choisir une autre méthode de connexion", - "subscription_signed_out_other_device": "Déconnecté : votre compte a été utilisé sur un autre appareil.", - "subscription_google_cancelled": "La connexion Google a été annulée.", - "subscription_request_timeout": "La requête a expiré. Vérifiez votre réseau et réessayez.", - "subscription_network_error": "Échec de la connexion réseau. Vérifiez votre réseau et réessayez.", - "subscription_server_error": "Le serveur a renvoyé une réponse non valide. Réessayez plus tard.", - "subscription_google_authorization_failed": "L'autorisation Google n'a pas été effectuée. Veuillez réessayer." - ,"lan_access_label": "Autoriser l'accès au réseau local" - ,"lan_access_warning": "Lié à 0.0.0.0. N'importe qui sur ce réseau peut se connecter et piloter l'éditeur — ce point de terminaison ne vérifie aucune information d'identification. À n'activer que sur un réseau de confiance." - ,"lan_address": "Adresse réseau local" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/hi.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/hi.js deleted file mode 100644 index 42b3557..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/hi.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP सर्वर", - "description": "Cocos Creator 3.8 के लिए AI MCP सर्वर", - "panel_title": "MCP सर्वर", - "open_panel": "MCP पैनल खोलें", - "start_server": "सर्वर शुरू करें", - "stop_server": "सर्वर रोकें", - "server_status": "सर्वर स्थिति", - "port": "पोर्ट", - "settings": "सेटिंग्स", - "connected": "कनेक्टेड", - "disconnected": "डिस्कनेक्टेड", - "server_running": "सर्वर पोर्ट {0} पर चल रहा है", - "server_stopped": "सर्वर रुक गया है", - "auto_start": "ऑटो स्टार्ट", - "debug_log": "डीबग लॉगिंग", - "max_connections": "अधिकतम कनेक्शन", - "connection_info": "कनेक्शन जानकारी", - "http_url": "HTTP URL", - "copy": "कॉपी करें", - "save_settings": "सेटिंग्स सहेजें", - "settings_saved": "सेटिंग्स सफलतापूर्वक सहेजी गईं", - "server_started": "MCP सर्वर शुरू हुआ", - "server_stopped_msg": "MCP सर्वर रुक गया", - "failed_to_start": "सर्वर शुरू करने में विफल", - "failed_to_stop": "सर्वर रोकने में विफल", - "failed_to_save": "सेटिंग्स सहेजने में विफल", - "url_copied": "HTTP URL क्लिपबोर्ड पर कॉपी किया गया", - "tool_manager": "टूल प्रबंधक", - "open_tool_manager": "टूल प्रबंधक खोलें", - "create_config": "कॉन्फ़िगरेशन बनाएँ", - "edit_config": "कॉन्फ़िगरेशन संपादित करें", - "delete_config": "कॉन्फ़िगरेशन हटाएँ", - "import_config": "कॉन्फ़िगरेशन आयात करें", - "export_config": "कॉन्फ़िगरेशन निर्यात करें", - "apply_config": "कॉन्फ़िगरेशन लागू करें", - "select_all": "सभी चुनें", - "deselect_all": "चयन हटाएँ", - "save_changes": "परिवर्तन सहेजें", - "config_name": "कॉन्फ़िगरेशन नाम", - "config_description": "कॉन्फ़िगरेशन विवरण", - "current_config": "वर्तमान कॉन्फ़िगरेशन", - "tool_management": "टूल प्रबंधन", - "total_tools": "कुल टूल", - "enabled_tools": "सक्षम", - "disabled_tools": "अक्षम", - "no_config_selected": "कोई कॉन्फ़िगरेशन चयनित नहीं", - "select_config_first": "कृपया पहले कोई कॉन्फ़िगरेशन चुनें या नया बनाएँ", - "config_created": "कॉन्फ़िगरेशन सफलतापूर्वक बनाया गया", - "config_updated": "कॉन्फ़िगरेशन सफलतापूर्वक अपडेट किया गया", - "config_deleted": "कॉन्फ़िगरेशन सफलतापूर्वक हटाया गया", - "config_applied": "कॉन्फ़िगरेशन सफलतापूर्वक लागू किया गया", - "config_exported": "कॉन्फ़िगरेशन सफलतापूर्वक निर्यात किया गया", - "config_imported": "कॉन्फ़िगरेशन सफलतापूर्वक आयात किया गया", - "confirm_delete": "हटाने की पुष्टि करें", - "delete_config_confirm": "क्या आप वाकई कॉन्फ़िगरेशन \"{0}\" हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।", - "max_config_slots_reached": "कॉन्फ़िगरेशन स्लॉट की अधिकतम सीमा पहुँच गई ({0})", - "invalid_config_format": "अमान्य कॉन्फ़िगरेशन प्रारूप", - "invalid_json_format": "अमान्य JSON प्रारूप या कॉन्फ़िगरेशन संरचना", - "server_tab": "सर्वर", - "tools_tab": "टूल प्रबंधन", - "available_tools": "उपलब्ध टूल", - "scene_tools": "सीन टूल", - "node_tools": "नोड टूल", - "component_tools": "कंपोनेंट टूल", - "prefab_tools": "प्रीफ़ैब टूल", - "project_tools": "प्रोजेक्ट टूल", - "debug_tools": "डीबग टूल", - "preferences_tools": "प्राथमिकताएँ", - "server_tools": "सर्वर टूल", - "broadcast_tools": "ब्रॉडकास्ट टूल", - "scene_advanced_tools": "उन्नत सीन टूल", - "scene_view_tools": "सीन व्यू टूल", - "reference_image_tools": "संदर्भ छवि टूल", - "asset_advanced_tools": "उन्नत एसेट टूल", - "validation_tools": "सत्यापन टूल", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "ईमेल", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "मशीन ID", - "purchase_renew": "खरीदें / नवीनीकरण करें", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "साइन-इन विधि चुनें", - "auth_subtitle": "अपना ईमेल और एक्टिवेशन कोड दर्ज करें", - "auth_choose_subtitle": "जारी रखने के लिए साइन-इन विधि चुनें", - "email_label": "ईमेल पता", - "activation_code_label": "एक्टिवेशन कोड", - "email_placeholder": "ईमेल दर्ज करें", - "code_placeholder": "कोड दर्ज करें (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "सक्रिय करें", - "deactivate_button": "निष्क्रिय करें", - "activating": "सक्रिय किया जा रहा है...", - "deactivating": "निष्क्रिय किया जा रहा है...", - "license_status": "लाइसेंस स्थिति", - "license_type": "लाइसेंस प्रकार", - "expiry_date": "समाप्ति तिथि", - "days_remaining": "शेष दिन", - "days_unit": "दिन", - "permanent": "स्थायी", - "expiry_warning_title": "लाइसेंस जल्द समाप्त हो रहा है", - "expiry_warning_message": "आपका लाइसेंस {0} दिनों में समाप्त हो जाएगा। सेवा में रुकावट से बचने के लिए कृपया नवीनीकरण करें।", - "renew_now": "अभी नवीनीकरण करें", - "i_understand": "समझ गया", - "activation_success": "लाइसेंस सफलतापूर्वक सक्रिय हो गया!", - "activation_failed": "सक्रियण विफल: {0}", - "invalid_code": "एक्टिवेशन कोड का प्रारूप अमान्य है", - "purchase_license": "लाइसेंस खरीदें", - "renew_license": "लाइसेंस नवीनीकरण", - "contact_support": "सहायता", - "language_switch": "हिन्दी", - "version_label": "संस्करण", - "license_required": "सर्वर शुरू करने के लिए लाइसेंस आवश्यक है", - "license_check_failed": "लाइसेंस जाँच विफल", - - "status_stopped": "रुका हुआ", - "status_running": "चल रहा है", - "status_error": "कनेक्शन विफल", - "config_tab": "त्वरित कॉन्फ़िग", - "status_label": "स्थिति", - "connections_count": "कनेक्शन", - "transport_protocol": "ट्रांसपोर्ट प्रोटोकॉल", - "transport_type": "ट्रांसपोर्ट प्रकार", - "mcp_url": "MCP URL", - "port_fallback_title": "पोर्ट {0} व्यस्त है — {1} पर बदल दिया गया", - "net_title": "नेटवर्क / प्रॉक्सी", - "net_direct": "सीधा कनेक्शन", - "net_via": "{0} के माध्यम से ({1})", - "net_source_manual": "मैनुअल", - "net_source_env": "एनवायरनमेंट वेरिएबल", - "net_source_system": "सिस्टम सेटिंग्स", - "net_mode_auto": "स्वतः पहचान", - "net_mode_manual": "मैनुअल", - "net_mode_off": "प्रॉक्सी नहीं", - "net_save": "सहेजें", - "net_test": "कनेक्शन जाँचें", - "net_testing": "जाँच हो रही है…", - "net_test_ok": "कनेक्ट हो गया ({0} ms)", - "net_test_fail": "विफल: {0}", - "net_hint": "लॉगिन टाइमआउट आमतौर पर नेटवर्क की समस्या है। VPN/प्रॉक्सी उपयोग करते हों तो यहाँ पता डालें (जैसे http://127.0.0.1:7890) या क्लाइंट को ग्लोबल (TUN) मोड में बदलें।", - "net_pac_warning": "सिस्टम PAC स्क्रिप्ट उपयोग कर रहा है, जिसे प्लगिन पढ़ नहीं सकता। «मैनुअल» चुनें और प्रॉक्सी पता डालें।", - "port_label": "पोर्ट", - "auto_start_label": "ऑटो स्टार्ट", - "debug_log_label": "डीबग लॉग", - "max_connections_label": "अधिकतम कनेक्शन", - "server_settings_title": "सर्वर सेटिंग्स", - "server_status_title": "सर्वर स्थिति", - "connection_info_title": "कनेक्शन जानकारी", - "tools_count": "{0} टूल", - "tools_stats": "{0} टूल ({1} सक्षम / {2} अक्षम)", - "quick_config_title": "MCP क्लाइंट त्वरित कॉन्फ़िगरेशन", - "quick_config_desc": "वर्तमान MCP सर्वर को मुख्यधारा के AI एडिटर और CLI टूल में स्वतः कॉन्फ़िगर करें", - "server_info": "सर्वर जानकारी", - "server_name_label": "सर्वर नाम", - "server_address": "सर्वर पता", - "timeout_ms": "टाइमआउट (ms)", - "auto_config_title": "स्वतः कॉन्फ़िग (IDE एडिटर + Codex CLI)", - "add_all": "सभी जोड़ें", - "remove_all": "सभी हटाएँ", - "auto_config_note": "कॉन्फ़िग फ़ाइलें स्वतः संशोधित करने के लिए बटन दबाएँ (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "कॉन्फ़िगर किया गया", - "not_configured": "कॉन्फ़िगर नहीं किया गया", - "auto_config_btn": "स्वतः कॉन्फ़िग", - "delete_btn": "हटाएँ", - "copy_config": "कॉन्फ़िग कॉपी करें", - "open_config": "कॉन्फ़िग खोलें", - "manual_config_title": "मैनुअल कॉन्फ़िग (Claude CLI + Gemini CLI)", - "refresh_commands": "कमांड रिफ़्रेश करें", - "manual_config_note": "निम्नलिखित CLI टूल के लिए टर्मिनल में कमांड मैनुअल रूप से चलाना आवश्यक है", - "config_scope": "कॉन्फ़िग स्कोप:", - "scope_user": "यूज़र स्तर", - "scope_project": "प्रोजेक्ट स्तर", - "operation_log": "ऑपरेशन लॉग", - "no_logs": "कोई ऑपरेशन रिकॉर्ड नहीं", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Streamable HTTP प्रोटोकॉल पर आधारित (MCP 2025-03-26)", - "tools_copyright_line1": "टूल सिस्टम - 13 intent-level टूल, 150+ एडिटर ऑपरेशन, action कोड डिस्पैच", - "config_copyright_line1": "त्वरित कॉन्फ़िग - Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI समर्थित", - "email_required": "कृपया ईमेल और एक्टिवेशन कोड दर्ज करें", - "permanent_label": "स्थायी", - "logout_button": "लॉग आउट", - "invite_code_label": "आमंत्रण कोड", - "copy_button": "कॉपी करें", - "change_code_button": "कोड बदलें", - "change_code_title": "एक्टिवेशन कोड बदलें", - "change_code_desc": "अपना नया एक्टिवेशन कोड दर्ज करें। पहले वर्तमान डिवाइस बाइंडिंग हटाई जाएगी।", - "confirm_change": "पुष्टि करें", - "cancel": "रद्द करें", - "code_required": "कृपया एक्टिवेशन कोड दर्ज करें", - "expiry_inline_warning": "जल्द समाप्त हो रहा है!", - "store_purchase_hint": "यदि आपने यह प्लगइन Cocos Store से खरीदा है, तो एक्टिवेशन कोड पाने के लिए कृपया मुझसे संपर्क करें।", - "license_expired_title": "लाइसेंस समाप्त", - "license_expired_message": "आपका लाइसेंस समाप्त हो चुका है और सर्वर शुरू नहीं किया जा सकता। जारी रखने के लिए कृपया नवीनीकरण करें या पुनः सक्रिय करें।", - "go_to_login": "लॉगिन पर जाएँ", - - "log_load_config_failed": "कॉन्फ़िग स्थिति लोड करने में विफल: {0}", - "log_gen_cli_failed": "CLI कमांड बनाने में विफल: {0}", - "log_add_client_failed": "{0} में जोड़ने में विफल: {1}", - "log_remove_client_failed": "{0} से हटाने में विफल: {1}", - "quick_config_dialog_title": "वन-क्लिक कॉन्फ़िगरेशन", - "config_operation_failed": "कॉन्फ़िगरेशन ऑपरेशन विफल", - "config_file_not_found_changed_path": "कॉन्फ़िगरेशन विफल: कॉन्फ़िग फ़ाइल नहीं मिली। संभव है कि {0} किसी कस्टम पथ पर इंस्टॉल हो।", - "log_batch_add_failed": "बैच जोड़ना विफल: {0}", - "log_batch_remove_failed": "बैच हटाना विफल: {0}", - "log_copied_config": "{0} का कॉन्फ़िग क्लिपबोर्ड पर कॉपी किया गया", - "log_gen_config_failed": "कॉन्फ़िग बनाने में विफल", - "log_copy_config_failed": "कॉन्फ़िग कॉपी करने में विफल: {0}", - "log_copied_command": "{0} की कमांड क्लिपबोर्ड पर कॉपी की गई", - "log_copy_command_failed": "कमांड कॉपी करने में विफल: {0}", - "log_opened_config_file": "कॉन्फ़िग फ़ाइल खोली गई: {0}", - "log_open_config_failed": "कॉन्फ़िग फ़ाइल खोलने में विफल", - "log_open_config_error": "कॉन्फ़िग फ़ाइल खोलने में विफल: {0}", - - "update_available_title": "अपडेट उपलब्ध", - "update_new_version": "नया संस्करण v{0} उपलब्ध है!", - "update_now": "अभी अपडेट करें", - "update_not_now": "अभी नहीं", - "update_skip_version": "v{0} छोड़ें", - "check_for_updates": "अपडेट जाँचें", - "update_checking": "जाँच हो रही है...", - "update_no_update": "आप नवीनतम संस्करण का उपयोग कर रहे हैं", - "update_urgency_critical": "अत्यावश्यक अपडेट", - "update_urgency_high": "महत्वपूर्ण अपडेट", - "update_current_version": "वर्तमान संस्करण: v{0}", - "update_changelog": "परिवर्तन सूची" - ,"update_changelog_empty": "इस संस्करण के लिए कोई रिलीज़ नोट नहीं दिया गया है।" - ,"subscription_login_title": "VberAI सब्सक्रिप्शन खाता" - ,"subscription_password_label": "पासवर्ड" - ,"subscription_password_placeholder": "पासवर्ड दर्ज करें" - ,"subscription_login_button": "VberAI से साइन इन करें" - ,"subscription_google_button": "Google से साइन इन करें" - ,"subscription_google_pending": "ब्राउज़र खुल गया है। Google प्राधिकरण पूरा करें, फिर Cocos Creator पर वापस आएँ।" - ,"subscription_google_pending_button": "Google प्राधिकरण की प्रतीक्षा है..." - ,"subscription_register_button": "VberAI खाता बनाएँ" - ,"subscription_logging_in": "साइन इन हो रहा है..." - ,"subscription_credentials_required": "कृपया ईमेल और पासवर्ड दर्ज करें" - ,"subscription_login_success": "सब्सक्रिप्शन खाते से साइन इन हो गया" - ,"subscription_login_failed": "सब्सक्रिप्शन साइन-इन विफल" - ,"subscription_not_entitled": "आपकी वर्तमान सब्सक्रिप्शन में Cocos 3.x MCP शामिल नहीं है। जारी रखने के लिए अपग्रेड करें।" - ,"subscription_upgrade_to": "इस उत्पाद का उपयोग करने के लिए {0} में अपग्रेड करें" - ,"subscription_upgrade_action": "सब्सक्रिप्शन अपग्रेड करें" - ,"subscription_logged_in": "साइन-इन खाता" - ,"subscription_choose_button": "VberAI सब्सक्रिप्शन खाता" - ,"license_choose_button": "एक्टिवेशन कोड" - ,"subscription_method_label": "सब्सक्रिप्शन" - ,"back_to_login_choices": "← दूसरी साइन-इन विधि चुनें" - ,"subscription_signed_out_other_device": "साइन आउट: आपका खाता किसी अन्य डिवाइस पर उपयोग किया गया।" - ,"subscription_google_cancelled": "Google साइन-इन रद्द कर दिया गया।" - ,"subscription_request_timeout": "अनुरोध का समय समाप्त हो गया। अपना नेटवर्क जाँचें और पुनः प्रयास करें।" - ,"subscription_network_error": "नेटवर्क कनेक्शन विफल। अपना नेटवर्क जाँचें और पुनः प्रयास करें।" - ,"subscription_server_error": "सर्वर ने अमान्य प्रतिक्रिया लौटाई। बाद में पुनः प्रयास करें।" - ,"subscription_google_authorization_failed": "Google प्राधिकरण पूरा नहीं हुआ। कृपया पुनः प्रयास करें।" - ,"lan_access_label": "LAN एक्सेस की अनुमति दें" - ,"lan_access_warning": "0.0.0.0 से बाइंड किया गया। इस नेटवर्क पर कोई भी व्यक्ति कनेक्ट करके एडिटर चला सकता है — यह एंडपॉइंट किसी भी क्रेडेंशियल की जाँच नहीं करता। केवल विश्वसनीय नेटवर्क पर ही सक्षम करें।" - ,"lan_address": "LAN पता" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/id.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/id.js deleted file mode 100644 index 2629e2d..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/id.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Server AI MCP untuk Cocos Creator 3.8", - "panel_title": "Server MCP", - "open_panel": "Buka Panel MCP", - "start_server": "Mulai Server", - "stop_server": "Hentikan Server", - "server_status": "Status Server", - "port": "Port", - "settings": "Pengaturan", - "connected": "Terhubung", - "disconnected": "Terputus", - "server_running": "Server berjalan di port {0}", - "server_stopped": "Server telah berhenti", - "auto_start": "Mulai Otomatis", - "debug_log": "Log Debug", - "max_connections": "Koneksi Maksimum", - "connection_info": "Info Koneksi", - "http_url": "HTTP URL", - "copy": "Salin", - "save_settings": "Simpan Pengaturan", - "settings_saved": "Pengaturan berhasil disimpan", - "server_started": "Server MCP Dimulai", - "server_stopped_msg": "Server MCP Dihentikan", - "failed_to_start": "Gagal memulai server", - "failed_to_stop": "Gagal menghentikan server", - "failed_to_save": "Gagal menyimpan pengaturan", - "url_copied": "HTTP URL disalin ke papan klip", - "tool_manager": "Pengelola Alat", - "open_tool_manager": "Buka Pengelola Alat", - "create_config": "Buat Konfigurasi", - "edit_config": "Edit Konfigurasi", - "delete_config": "Hapus Konfigurasi", - "import_config": "Impor Konfigurasi", - "export_config": "Ekspor Konfigurasi", - "apply_config": "Terapkan Konfigurasi", - "select_all": "Pilih Semua", - "deselect_all": "Batalkan Semua Pilihan", - "save_changes": "Simpan Perubahan", - "config_name": "Nama Konfigurasi", - "config_description": "Deskripsi Konfigurasi", - "current_config": "Konfigurasi Saat Ini", - "tool_management": "Manajemen Alat", - "total_tools": "Total Alat", - "enabled_tools": "Aktif", - "disabled_tools": "Nonaktif", - "no_config_selected": "Tidak Ada Konfigurasi Dipilih", - "select_config_first": "Silakan pilih konfigurasi atau buat yang baru terlebih dahulu", - "config_created": "Konfigurasi berhasil dibuat", - "config_updated": "Konfigurasi berhasil diperbarui", - "config_deleted": "Konfigurasi berhasil dihapus", - "config_applied": "Konfigurasi berhasil diterapkan", - "config_exported": "Konfigurasi berhasil diekspor", - "config_imported": "Konfigurasi berhasil diimpor", - "confirm_delete": "Konfirmasi Penghapusan", - "delete_config_confirm": "Anda yakin ingin menghapus konfigurasi \"{0}\"? Tindakan ini tidak dapat dibatalkan.", - "max_config_slots_reached": "Slot konfigurasi maksimum tercapai ({0})", - "invalid_config_format": "Format konfigurasi tidak valid", - "invalid_json_format": "Format JSON atau struktur konfigurasi tidak valid", - "server_tab": "Server", - "tools_tab": "Manajemen Alat", - "available_tools": "Alat Tersedia", - "scene_tools": "Alat Scene", - "node_tools": "Alat Node", - "component_tools": "Alat Komponen", - "prefab_tools": "Alat Prefab", - "project_tools": "Alat Proyek", - "debug_tools": "Alat Debug", - "preferences_tools": "Preferensi", - "server_tools": "Alat Server", - "broadcast_tools": "Alat Siaran", - "scene_advanced_tools": "Alat Scene Lanjutan", - "scene_view_tools": "Alat Tampilan Scene", - "reference_image_tools": "Alat Gambar Referensi", - "asset_advanced_tools": "Alat Aset Lanjutan", - "validation_tools": "Alat Validasi", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Email", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "ID Mesin", - "purchase_renew": "Beli / Perpanjang", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Pilih metode masuk", - "auth_subtitle": "Masukkan email dan kode aktivasi Anda", - "auth_choose_subtitle": "Pilih metode masuk untuk melanjutkan", - "email_label": "Alamat Email", - "activation_code_label": "Kode Aktivasi", - "email_placeholder": "Masukkan email", - "code_placeholder": "Masukkan kode (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Aktifkan", - "deactivate_button": "Nonaktifkan", - "activating": "Mengaktifkan...", - "deactivating": "Menonaktifkan...", - "license_status": "Status Lisensi", - "license_type": "Jenis Lisensi", - "expiry_date": "Tanggal Kedaluwarsa", - "days_remaining": "Sisa Hari", - "days_unit": "hr", - "permanent": "Permanen", - "expiry_warning_title": "Lisensi Segera Kedaluwarsa", - "expiry_warning_message": "Lisensi Anda akan kedaluwarsa dalam {0} hari. Silakan perpanjang agar layanan tidak terputus.", - "renew_now": "Perpanjang Sekarang", - "i_understand": "Saya Mengerti", - "activation_success": "Lisensi berhasil diaktifkan!", - "activation_failed": "Aktivasi gagal: {0}", - "invalid_code": "Format kode aktivasi tidak valid", - "purchase_license": "Beli Lisensi", - "renew_license": "Perpanjang Lisensi", - "contact_support": "Dukungan", - "language_switch": "Bahasa Indonesia", - "version_label": "Versi", - "license_required": "Lisensi diperlukan untuk memulai server", - "license_check_failed": "Pemeriksaan lisensi gagal", - - "status_stopped": "Berhenti", - "status_running": "Berjalan", - "status_error": "Koneksi Gagal", - "config_tab": "Konfigurasi Cepat", - "status_label": "Status", - "connections_count": "Koneksi", - "transport_protocol": "Protokol Transport", - "transport_type": "Jenis Transport", - "mcp_url": "MCP URL", - "port_fallback_title": "Port {0} sedang dipakai — beralih ke {1}", - "net_title": "Jaringan / Proxy", - "net_direct": "Koneksi langsung", - "net_via": "via {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "variabel lingkungan", - "net_source_system": "pengaturan sistem", - "net_mode_auto": "Deteksi otomatis", - "net_mode_manual": "Manual", - "net_mode_off": "Tanpa proxy", - "net_save": "Simpan", - "net_test": "Uji koneksi", - "net_testing": "Menguji…", - "net_test_ok": "Terhubung ({0} ms)", - "net_test_fail": "Gagal: {0}", - "net_hint": "Timeout login biasanya masalah jaringan. Jika memakai VPN/proxy, masukkan alamatnya (mis. http://127.0.0.1:7890) atau alihkan klien ke mode global (TUN).", - "net_pac_warning": "Sistem memakai skrip PAC yang tidak bisa dibaca plugin. Pilih Manual dan masukkan alamat proxy.", - "port_label": "Port", - "auto_start_label": "Mulai Otomatis", - "debug_log_label": "Log Debug", - "max_connections_label": "Koneksi Maksimum", - "server_settings_title": "Pengaturan Server", - "server_status_title": "Status Server", - "connection_info_title": "Info Koneksi", - "tools_count": "{0} alat", - "tools_stats": "{0} alat ({1} aktif / {2} nonaktif)", - "quick_config_title": "Konfigurasi Cepat Klien MCP", - "quick_config_desc": "Konfigurasikan server MCP saat ini secara otomatis ke editor AI dan alat CLI populer", - "server_info": "Info Server", - "server_name_label": "Nama Server", - "server_address": "Alamat Server", - "timeout_ms": "Batas Waktu (md)", - "auto_config_title": "Konfigurasi Otomatis (Editor IDE + Codex CLI)", - "add_all": "Tambah Semua", - "remove_all": "Hapus Semua", - "auto_config_note": "Klik tombol untuk mengubah file konfigurasi secara otomatis (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Terkonfigurasi", - "not_configured": "Belum Dikonfigurasi", - "auto_config_btn": "Konfigurasi Otomatis", - "delete_btn": "Hapus", - "copy_config": "Salin Konfigurasi", - "open_config": "Buka Konfigurasi", - "manual_config_title": "Konfigurasi Manual (Claude CLI + Gemini CLI)", - "refresh_commands": "Segarkan Perintah", - "manual_config_note": "Alat CLI berikut perlu menjalankan perintah terminal secara manual", - "config_scope": "Cakupan Konfigurasi:", - "scope_user": "Tingkat Pengguna", - "scope_project": "Tingkat Proyek", - "operation_log": "Log Operasi", - "no_logs": "Tidak ada catatan operasi", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Berbasis Protokol Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Sistem Alat - 13 alat tingkat intent, 150+ operasi editor, dispatch berbasis kode action", - "config_copyright_line1": "Konfigurasi Cepat - Mendukung Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Silakan masukkan email dan kode aktivasi", - "permanent_label": "Permanen", - "logout_button": "Keluar", - "invite_code_label": "Kode Undangan", - "copy_button": "Salin", - "change_code_button": "Ganti Kode", - "change_code_title": "Ganti Kode Aktivasi", - "change_code_desc": "Masukkan kode aktivasi baru Anda. Ikatan perangkat saat ini akan dilepas terlebih dahulu.", - "confirm_change": "Konfirmasi", - "cancel": "Batal", - "code_required": "Silakan masukkan kode aktivasi", - "expiry_inline_warning": "Segera kedaluwarsa!", - "store_purchase_hint": "Jika Anda membeli plugin ini dari Cocos Store, silakan hubungi saya untuk mendapatkan kode aktivasi.", - "license_expired_title": "Lisensi Kedaluwarsa", - "license_expired_message": "Lisensi Anda telah kedaluwarsa dan server tidak dapat dimulai. Silakan perpanjang atau aktifkan ulang untuk melanjutkan.", - "go_to_login": "Ke Halaman Masuk", - - "log_load_config_failed": "Gagal memuat status konfigurasi: {0}", - "log_gen_cli_failed": "Gagal membuat perintah CLI: {0}", - "log_add_client_failed": "Gagal menambahkan ke {0}: {1}", - "log_remove_client_failed": "Gagal menghapus dari {0}: {1}", - "quick_config_dialog_title": "Konfigurasi Sekali Klik", - "config_operation_failed": "Operasi konfigurasi gagal", - "config_file_not_found_changed_path": "Konfigurasi gagal: file konfigurasi tidak ditemukan. {0} mungkin terpasang di path kustom.", - "log_batch_add_failed": "Penambahan massal gagal: {0}", - "log_batch_remove_failed": "Penghapusan massal gagal: {0}", - "log_copied_config": "Konfigurasi {0} disalin ke papan klip", - "log_gen_config_failed": "Gagal membuat konfigurasi", - "log_copy_config_failed": "Gagal menyalin konfigurasi: {0}", - "log_copied_command": "Perintah {0} disalin ke papan klip", - "log_copy_command_failed": "Gagal menyalin perintah: {0}", - "log_opened_config_file": "File konfigurasi dibuka: {0}", - "log_open_config_failed": "Gagal membuka file konfigurasi", - "log_open_config_error": "Gagal membuka file konfigurasi: {0}", - - "update_available_title": "Pembaruan Tersedia", - "update_new_version": "Versi baru v{0} sudah tersedia!", - "update_now": "Perbarui Sekarang", - "update_not_now": "Nanti Saja", - "update_skip_version": "Lewati v{0}", - "check_for_updates": "Periksa Pembaruan", - "update_checking": "Memeriksa...", - "update_no_update": "Anda sudah menggunakan versi terbaru", - "update_urgency_critical": "Pembaruan Kritis", - "update_urgency_high": "Pembaruan Penting", - "update_current_version": "Versi saat ini: v{0}", - "update_changelog": "Catatan Perubahan" - ,"update_changelog_empty": "Tidak ada catatan rilis untuk versi ini." - ,"subscription_login_title": "Akun langganan VberAI" - ,"subscription_password_label": "Kata Sandi" - ,"subscription_password_placeholder": "Masukkan kata sandi" - ,"subscription_login_button": "Masuk dengan VberAI" - ,"subscription_google_button": "Masuk dengan Google" - ,"subscription_google_pending": "Browser telah dibuka. Selesaikan otorisasi Google, lalu kembali ke Cocos Creator." - ,"subscription_google_pending_button": "Menunggu otorisasi Google..." - ,"subscription_register_button": "Buat akun VberAI" - ,"subscription_logging_in": "Sedang masuk..." - ,"subscription_credentials_required": "Silakan masukkan email dan kata sandi" - ,"subscription_login_success": "Akun langganan berhasil masuk" - ,"subscription_login_failed": "Gagal masuk dengan akun langganan" - ,"subscription_not_entitled": "Langganan Anda saat ini tidak mencakup Cocos 3.x MCP. Tingkatkan untuk melanjutkan." - ,"subscription_upgrade_to": "Tingkatkan ke {0} untuk menggunakan produk ini" - ,"subscription_upgrade_action": "Tingkatkan langganan" - ,"subscription_logged_in": "Akun yang masuk" - ,"subscription_choose_button": "Akun langganan VberAI" - ,"license_choose_button": "Kode aktivasi" - ,"subscription_method_label": "Langganan" - ,"back_to_login_choices": "← Pilih metode masuk lain" - ,"subscription_signed_out_other_device": "Keluar: akun Anda digunakan di perangkat lain." - ,"subscription_google_cancelled": "Masuk dengan Google dibatalkan." - ,"subscription_request_timeout": "Permintaan kehabisan waktu. Periksa jaringan Anda dan coba lagi." - ,"subscription_network_error": "Koneksi jaringan gagal. Periksa jaringan Anda dan coba lagi." - ,"subscription_server_error": "Server mengembalikan respons tidak valid. Coba lagi nanti." - ,"subscription_google_authorization_failed": "Otorisasi Google tidak selesai. Silakan coba lagi." - ,"lan_access_label": "Izinkan akses LAN" - ,"lan_access_warning": "Terikat ke 0.0.0.0. Siapa pun di jaringan ini dapat terhubung dan mengendalikan editor — endpoint ini tidak memverifikasi kredensial apa pun. Aktifkan hanya di jaringan tepercaya." - ,"lan_address": "Alamat LAN" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/it.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/it.js deleted file mode 100644 index ebecc36..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/it.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Server AI MCP per Cocos Creator 3.8", - "panel_title": "Server MCP", - "open_panel": "Apri pannello MCP", - "start_server": "Avvia server", - "stop_server": "Arresta server", - "server_status": "Stato del server", - "port": "Porta", - "settings": "Impostazioni", - "connected": "Connesso", - "disconnected": "Disconnesso", - "server_running": "Il server è in esecuzione sulla porta {0}", - "server_stopped": "Il server è stato arrestato", - "auto_start": "Avvio automatico", - "debug_log": "Log di debug", - "max_connections": "Connessioni massime", - "connection_info": "Info connessione", - "http_url": "URL HTTP", - "copy": "Copia", - "save_settings": "Salva impostazioni", - "settings_saved": "Impostazioni salvate correttamente", - "server_started": "Server MCP avviato", - "server_stopped_msg": "Server MCP arrestato", - "failed_to_start": "Impossibile avviare il server", - "failed_to_stop": "Impossibile arrestare il server", - "failed_to_save": "Impossibile salvare le impostazioni", - "url_copied": "URL HTTP copiato negli appunti", - "tool_manager": "Gestore strumenti", - "open_tool_manager": "Apri gestore strumenti", - "create_config": "Crea configurazione", - "edit_config": "Modifica configurazione", - "delete_config": "Elimina configurazione", - "import_config": "Importa configurazione", - "export_config": "Esporta configurazione", - "apply_config": "Applica configurazione", - "select_all": "Seleziona tutto", - "deselect_all": "Deseleziona tutto", - "save_changes": "Salva modifiche", - "config_name": "Nome configurazione", - "config_description": "Descrizione configurazione", - "current_config": "Configurazione corrente", - "tool_management": "Gestione strumenti", - "total_tools": "Strumenti totali", - "enabled_tools": "Abilitati", - "disabled_tools": "Disabilitati", - "no_config_selected": "Nessuna configurazione selezionata", - "select_config_first": "Seleziona prima una configurazione oppure creane una nuova", - "config_created": "Configurazione creata correttamente", - "config_updated": "Configurazione aggiornata correttamente", - "config_deleted": "Configurazione eliminata correttamente", - "config_applied": "Configurazione applicata correttamente", - "config_exported": "Configurazione esportata correttamente", - "config_imported": "Configurazione importata correttamente", - "confirm_delete": "Conferma eliminazione", - "delete_config_confirm": "Vuoi davvero eliminare la configurazione \"{0}\"? L'operazione non può essere annullata.", - "max_config_slots_reached": "Raggiunto il numero massimo di slot di configurazione ({0})", - "invalid_config_format": "Formato di configurazione non valido", - "invalid_json_format": "Formato JSON o struttura di configurazione non validi", - "server_tab": "Server", - "tools_tab": "Gestione strumenti", - "available_tools": "Strumenti disponibili", - "scene_tools": "Strumenti scena", - "node_tools": "Strumenti nodo", - "component_tools": "Strumenti componente", - "prefab_tools": "Strumenti prefab", - "project_tools": "Strumenti progetto", - "debug_tools": "Strumenti di debug", - "preferences_tools": "Preferenze", - "server_tools": "Strumenti server", - "broadcast_tools": "Strumenti broadcast", - "scene_advanced_tools": "Strumenti scena avanzati", - "scene_view_tools": "Strumenti vista scena", - "reference_image_tools": "Strumenti immagine di riferimento", - "asset_advanced_tools": "Strumenti asset avanzati", - "validation_tools": "Strumenti di validazione", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Email", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "ID macchina", - "purchase_renew": "Acquista / Rinnova", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Scegli un metodo di accesso", - "auth_subtitle": "Inserisci la tua email e il codice di attivazione", - "auth_choose_subtitle": "Scegli un metodo di accesso per continuare", - "email_label": "Indirizzo email", - "activation_code_label": "Codice di attivazione", - "email_placeholder": "Inserisci l'email", - "code_placeholder": "Inserisci il codice (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Attiva", - "deactivate_button": "Disattiva", - "activating": "Attivazione...", - "deactivating": "Disattivazione...", - "license_status": "Stato licenza", - "license_type": "Tipo di licenza", - "expiry_date": "Data di scadenza", - "days_remaining": "Giorni rimanenti", - "days_unit": "gg", - "permanent": "Permanente", - "expiry_warning_title": "Licenza in scadenza", - "expiry_warning_message": "La tua licenza scadrà tra {0} giorni. Rinnovala per evitare interruzioni del servizio.", - "renew_now": "Rinnova ora", - "i_understand": "Ho capito", - "activation_success": "Licenza attivata correttamente!", - "activation_failed": "Attivazione non riuscita: {0}", - "invalid_code": "Formato del codice di attivazione non valido", - "purchase_license": "Acquista licenza", - "renew_license": "Rinnova licenza", - "contact_support": "Assistenza", - "language_switch": "Italiano", - "version_label": "Versione", - "license_required": "È necessaria una licenza per avviare il server", - "license_check_failed": "Controllo della licenza non riuscito", - - "status_stopped": "Arrestato", - "status_running": "In esecuzione", - "status_error": "Connessione non riuscita", - "config_tab": "Configurazione rapida", - "status_label": "Stato", - "connections_count": "Connessioni", - "transport_protocol": "Protocollo di trasporto", - "transport_type": "Tipo di trasporto", - "mcp_url": "MCP URL", - "port_fallback_title": "Porta {0} occupata — passata a {1}", - "net_title": "Rete / Proxy", - "net_direct": "Connessione diretta", - "net_via": "tramite {0} ({1})", - "net_source_manual": "manuale", - "net_source_env": "variabile d’ambiente", - "net_source_system": "impostazioni di sistema", - "net_mode_auto": "Rilevamento automatico", - "net_mode_manual": "Manuale", - "net_mode_off": "Nessun proxy", - "net_save": "Salva", - "net_test": "Prova connessione", - "net_testing": "Test in corso…", - "net_test_ok": "Connesso ({0} ms)", - "net_test_fail": "Non riuscito: {0}", - "net_hint": "I timeout di accesso sono quasi sempre di rete. Se usi VPN/proxy, inserisci qui l’indirizzo (es. http://127.0.0.1:7890) o imposta il client in modalità globale (TUN).", - "net_pac_warning": "Il sistema usa uno script PAC che questo plugin non può valutare. Passa a Manuale e inserisci l’indirizzo del proxy.", - "port_label": "Porta", - "auto_start_label": "Avvio automatico", - "debug_log_label": "Log di debug", - "max_connections_label": "Connessioni massime", - "server_settings_title": "Impostazioni del server", - "server_status_title": "Stato del server", - "connection_info_title": "Info connessione", - "tools_count": "{0} strumenti", - "tools_stats": "{0} strumenti ({1} abilitati / {2} disabilitati)", - "quick_config_title": "Configurazione rapida dei client MCP", - "quick_config_desc": "Configura automaticamente il server MCP corrente nei principali editor AI e strumenti CLI", - "server_info": "Info server", - "server_name_label": "Nome del server", - "server_address": "Indirizzo del server", - "timeout_ms": "Timeout (ms)", - "auto_config_title": "Configurazione automatica (editor IDE + Codex CLI)", - "add_all": "Aggiungi tutti", - "remove_all": "Rimuovi tutti", - "auto_config_note": "Fai clic sul pulsante per modificare automaticamente i file di configurazione (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Configurato", - "not_configured": "Non configurato", - "auto_config_btn": "Configurazione automatica", - "delete_btn": "Elimina", - "copy_config": "Copia configurazione", - "open_config": "Apri configurazione", - "manual_config_title": "Configurazione manuale (Claude CLI + Gemini CLI)", - "refresh_commands": "Aggiorna comandi", - "manual_config_note": "I seguenti strumenti CLI richiedono l'esecuzione manuale dei comandi da terminale", - "config_scope": "Ambito configurazione:", - "scope_user": "Livello utente", - "scope_project": "Livello progetto", - "operation_log": "Log operazioni", - "no_logs": "Nessuna operazione registrata", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Basato sul protocollo Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Sistema di strumenti - 13 strumenti a livello di intento, oltre 150 operazioni dell'editor, dispatch tramite codice action", - "config_copyright_line1": "Configurazione rapida - Supporta Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Inserisci email e codice di attivazione", - "permanent_label": "Permanente", - "logout_button": "Esci", - "invite_code_label": "Codice invito", - "copy_button": "Copia", - "change_code_button": "Cambia codice", - "change_code_title": "Cambia codice di attivazione", - "change_code_desc": "Inserisci il nuovo codice di attivazione. L'associazione del dispositivo corrente verrà prima rilasciata.", - "confirm_change": "Conferma", - "cancel": "Annulla", - "code_required": "Inserisci un codice di attivazione", - "expiry_inline_warning": "In scadenza!", - "store_purchase_hint": "Se hai acquistato questo plugin dal Cocos Store, contattami per ricevere il tuo codice di attivazione.", - "license_expired_title": "Licenza scaduta", - "license_expired_message": "La tua licenza è scaduta e il server non può essere avviato. Rinnova o riattiva per continuare.", - "go_to_login": "Vai all'accesso", - - "log_load_config_failed": "Impossibile caricare lo stato della configurazione: {0}", - "log_gen_cli_failed": "Impossibile generare i comandi CLI: {0}", - "log_add_client_failed": "Impossibile aggiungere a {0}: {1}", - "log_remove_client_failed": "Impossibile rimuovere da {0}: {1}", - "quick_config_dialog_title": "Configurazione con un clic", - "config_operation_failed": "Operazione di configurazione non riuscita", - "config_file_not_found_changed_path": "Configurazione non riuscita: file di configurazione non trovato. {0} potrebbe essere installato in un percorso personalizzato.", - "log_batch_add_failed": "Aggiunta in blocco non riuscita: {0}", - "log_batch_remove_failed": "Rimozione in blocco non riuscita: {0}", - "log_copied_config": "Configurazione di {0} copiata negli appunti", - "log_gen_config_failed": "Impossibile generare la configurazione", - "log_copy_config_failed": "Impossibile copiare la configurazione: {0}", - "log_copied_command": "Comando di {0} copiato negli appunti", - "log_copy_command_failed": "Impossibile copiare il comando: {0}", - "log_opened_config_file": "File di configurazione aperto: {0}", - "log_open_config_failed": "Impossibile aprire il file di configurazione", - "log_open_config_error": "Impossibile aprire il file di configurazione: {0}", - - "update_available_title": "Aggiornamento disponibile", - "update_new_version": "La nuova versione v{0} è disponibile!", - "update_now": "Aggiorna ora", - "update_not_now": "Non ora", - "update_skip_version": "Salta v{0}", - "check_for_updates": "Controlla aggiornamenti", - "update_checking": "Controllo in corso...", - "update_no_update": "Stai usando la versione più recente", - "update_urgency_critical": "Aggiornamento critico", - "update_urgency_high": "Aggiornamento importante", - "update_current_version": "Versione corrente: v{0}", - "update_changelog": "Novità" - ,"update_changelog_empty": "Per questa versione non sono state fornite note di rilascio." - ,"subscription_login_title": "Account in abbonamento VberAI" - ,"subscription_password_label": "Password" - ,"subscription_password_placeholder": "Inserisci la password" - ,"subscription_login_button": "Accedi con VberAI" - ,"subscription_google_button": "Accedi con Google" - ,"subscription_google_pending": "Il browser è stato aperto. Completa l'autorizzazione Google, poi torna a Cocos Creator." - ,"subscription_google_pending_button": "In attesa dell'autorizzazione Google..." - ,"subscription_register_button": "Crea un account VberAI" - ,"subscription_logging_in": "Accesso in corso..." - ,"subscription_credentials_required": "Inserisci email e password" - ,"subscription_login_success": "Accesso con account in abbonamento effettuato" - ,"subscription_login_failed": "Accesso con account in abbonamento non riuscito" - ,"subscription_not_entitled": "Il tuo abbonamento attuale non include Cocos 3.x MCP. Esegui l'upgrade per continuare." - ,"subscription_upgrade_to": "Passa a {0} per usare questo prodotto" - ,"subscription_upgrade_action": "Aggiorna abbonamento" - ,"subscription_logged_in": "Account connesso" - ,"subscription_choose_button": "Account in abbonamento VberAI" - ,"license_choose_button": "Codice di attivazione" - ,"subscription_method_label": "Abbonamento" - ,"back_to_login_choices": "← Scegli un altro metodo di accesso" - ,"subscription_signed_out_other_device": "Disconnesso: il tuo account è stato usato su un altro dispositivo." - ,"subscription_google_cancelled": "Accesso con Google annullato." - ,"subscription_request_timeout": "Richiesta scaduta. Controlla la connessione e riprova." - ,"subscription_network_error": "Connessione di rete non riuscita. Controlla la rete e riprova." - ,"subscription_server_error": "Il server ha restituito una risposta non valida. Riprova più tardi." - ,"subscription_google_authorization_failed": "L'autorizzazione Google non è stata completata. Riprova." - ,"lan_access_label": "Consenti accesso dalla rete locale" - ,"lan_access_warning": "Associato a 0.0.0.0. Chiunque su questa rete può connettersi e comandare l'editor: questo endpoint non verifica alcuna credenziale. Attivalo solo su una rete affidabile." - ,"lan_address": "Indirizzo rete locale" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ja.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ja.js deleted file mode 100644 index f013f71..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ja.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP サーバー", - "description": "Cocos Creator 3.8 用 AI MCP サーバー", - "panel_title": "MCP サーバー", - "open_panel": "MCP パネルを開く", - "start_server": "サーバー起動", - "stop_server": "サーバー停止", - "server_status": "サーバー状態", - "port": "ポート", - "settings": "設定", - "connected": "接続済み", - "disconnected": "未接続", - "server_running": "サーバーはポート {0} で実行中", - "server_stopped": "サーバーは停止しました", - "auto_start": "自動起動", - "debug_log": "デバッグログ", - "max_connections": "最大接続数", - "connection_info": "接続情報", - "http_url": "HTTP URL", - "copy": "コピー", - "save_settings": "設定を保存", - "settings_saved": "設定の保存に成功しました", - "server_started": "MCP サーバーが起動しました", - "server_stopped_msg": "MCP サーバーが停止しました", - "failed_to_start": "サーバーの起動に失敗しました", - "failed_to_stop": "サーバーの停止に失敗しました", - "failed_to_save": "設定の保存に失敗しました", - "url_copied": "HTTP URL をクリップボードにコピーしました", - "tool_manager": "ツールマネージャー", - "open_tool_manager": "ツールマネージャーを開く", - "create_config": "設定を作成", - "edit_config": "設定を編集", - "delete_config": "設定を削除", - "import_config": "設定をインポート", - "export_config": "設定をエクスポート", - "apply_config": "設定を適用", - "select_all": "全選択", - "deselect_all": "全解除", - "save_changes": "変更を保存", - "config_name": "設定名", - "config_description": "設定の説明", - "current_config": "現在の設定", - "tool_management": "ツール管理", - "total_tools": "ツール合計", - "enabled_tools": "有効", - "disabled_tools": "無効", - "no_config_selected": "設定が選択されていません", - "select_config_first": "先に設定を選択するか、新しく作成してください", - "config_created": "設定の作成に成功しました", - "config_updated": "設定の更新に成功しました", - "config_deleted": "設定の削除に成功しました", - "config_applied": "設定の適用に成功しました", - "config_exported": "設定のエクスポートに成功しました", - "config_imported": "設定のインポートに成功しました", - "confirm_delete": "削除の確認", - "delete_config_confirm": "設定 \"{0}\" を削除してもよろしいですか?この操作は元に戻せません。", - "max_config_slots_reached": "設定スロットの上限に達しました ({0})", - "invalid_config_format": "無効な設定形式", - "invalid_json_format": "無効なJSON形式または設定構造", - "server_tab": "サーバー", - "tools_tab": "ツール管理", - "available_tools": "利用可能なツール", - "scene_tools": "シーンツール", - "node_tools": "ノードツール", - "component_tools": "コンポーネントツール", - "prefab_tools": "プレハブツール", - "project_tools": "プロジェクトツール", - "debug_tools": "デバッグツール", - "preferences_tools": "環境設定", - "server_tools": "サーバーツール", - "broadcast_tools": "ブロードキャストツール", - "scene_advanced_tools": "高度なシーンツール", - "scene_view_tools": "シーンビューツール", - "reference_image_tools": "参照画像ツール", - "asset_advanced_tools": "高度なアセットツール", - "validation_tools": "検証ツール", - "brand_name": "LiDaxian MCP シリーズ", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "メール", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "マシンID", - "purchase_renew": "購入 / 更新", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "ログイン方法を選択", - "auth_subtitle": "メールアドレスとアクティベーションコードを入力してください", - "email_label": "メールアドレス", - "activation_code_label": "アクティベーションコード", - "email_placeholder": "メールを入力", - "code_placeholder": "コードを入力 (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "アクティベート", - "deactivate_button": "無効化", - "activating": "アクティベート中...", - "deactivating": "無効化中...", - "license_status": "ライセンス状態", - "license_type": "ライセンス種別", - "expiry_date": "有効期限", - "days_remaining": "残り日数", - "days_unit": "日", - "permanent": "永久", - "expiry_warning_title": "ライセンスの有効期限が近づいています", - "expiry_warning_message": "ライセンスはあと {0} 日で期限切れになります。サービスの中断を防ぐため、更新してください。", - "renew_now": "今すぐ更新", - "i_understand": "了解しました", - "activation_success": "ライセンスのアクティベーションに成功しました!", - "activation_failed": "アクティベーション失敗: {0}", - "invalid_code": "無効なアクティベーションコード形式", - "purchase_license": "ライセンスを購入", - "renew_license": "ライセンスを更新", - "contact_support": "サポート", - "language_switch": "日本語", - "version_label": "バージョン", - "license_required": "サーバーの起動にはライセンスが必要です", - "license_check_failed": "ライセンスチェックに失敗しました", - - "status_stopped": "停止中", - "status_running": "実行中", - "status_error": "接続失敗", - "config_tab": "クイック設定", - "status_label": "状態", - "connections_count": "接続数", - "transport_protocol": "トランスポートプロトコル", - "transport_type": "トランスポートタイプ", - "mcp_url": "MCP URL", - "port_fallback_title": "ポート {0} は使用中のため {1} に変更しました", - "net_title": "ネットワーク / プロキシ", - "net_direct": "直接接続", - "net_via": "{0} 経由({1})", - "net_source_manual": "手動設定", - "net_source_env": "環境変数", - "net_source_system": "システム設定", - "net_mode_auto": "自動検出", - "net_mode_manual": "手動指定", - "net_mode_off": "プロキシを使わない", - "net_save": "保存", - "net_test": "接続テスト", - "net_testing": "テスト中…", - "net_test_ok": "接続できました({0} ms)", - "net_test_fail": "接続失敗:{0}", - "net_hint": "ログインのタイムアウトはほぼネットワーク起因です。VPN/プロキシ利用時はここにアドレス(例: http://127.0.0.1:7890)を入力するか、クライアントをグローバル(TUN)モードに切り替えてください。", - "net_pac_warning": "システムが PAC 自動設定スクリプトを使用しており、本プラグインでは解釈できません。「手動指定」にしてアドレスを入力してください。", - "port_label": "ポート", - "auto_start_label": "自動起動", - "debug_log_label": "デバッグログ", - "max_connections_label": "最大接続数", - "server_settings_title": "サーバー設定", - "server_status_title": "サーバー状態", - "connection_info_title": "接続情報", - "tools_count": "{0} ツール", - "tools_stats": "{0} ツール ({1} 有効 / {2} 無効)", - "quick_config_title": "MCP クライアントのクイック設定", - "quick_config_desc": "現在のMCPサーバーを主要AIエディターやCLIツールに自動設定します", - "server_info": "サーバー情報", - "server_name_label": "サーバー名", - "server_address": "サーバーアドレス", - "timeout_ms": "タイムアウト (ms)", - "auto_config_title": "自動設定 (IDE エディター + Codex CLI)", - "add_all": "すべて追加", - "remove_all": "すべて削除", - "auto_config_note": "ボタンをクリックして設定ファイルを自動変更 (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "設定済み", - "not_configured": "未設定", - "auto_config_btn": "自動設定", - "delete_btn": "削除", - "copy_config": "設定をコピー", - "open_config": "設定を開く", - "manual_config_title": "手動設定 (Claude CLI + Gemini CLI)", - "refresh_commands": "コマンドを更新", - "manual_config_note": "以下のCLIツールはターミナルで手動実行が必要です", - "config_scope": "設定範囲:", - "scope_user": "ユーザーレベル", - "scope_project": "プロジェクトレベル", - "operation_log": "操作ログ", - "no_logs": "操作記録なし", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Streamable HTTP プロトコル (MCP 2025-03-26) 準拠", - "tools_copyright_line1": "ツールシステム - 13のインテントレベルツール、150+のエディター操作、アクションコードディスパッチ", - "config_copyright_line1": "クイック設定 - Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI 対応", - "email_required": "メールとアクティベーションコードを入力してください", - "permanent_label": "永久", - "logout_button": "ログアウト", - "invite_code_label": "招待コード", - "copy_button": "コピー", - "change_code_button": "コード変更", - "change_code_title": "アクティベーションコードの変更", - "change_code_desc": "新しいアクティベーションコードを入力してください。現在のデバイスバインドは先に解除されます。", - "confirm_change": "確認", - "cancel": "キャンセル", - "code_required": "アクティベーションコードを入力してください", - "expiry_inline_warning": "まもなく期限切れ!", - "store_purchase_hint": "Cocos Store で本プラグインを購入済みの場合は、アクティベーションコードの取得にご連絡ください。", - "license_expired_title": "ライセンスの有効期限切れ", - "license_expired_message": "ライセンスの有効期限が切れたため、サーバーを起動できません。続行するには更新または再アクティベートしてください。", - "go_to_login": "ログインへ", - - "log_load_config_failed": "設定状態の読み込みに失敗: {0}", - "log_gen_cli_failed": "CLIコマンドの生成に失敗: {0}", - "log_add_client_failed": "{0} への追加に失敗: {1}", - "log_remove_client_failed": "{0} からの削除に失敗: {1}", - "quick_config_dialog_title": "ワンクリック設定", - "config_operation_failed": "設定操作に失敗しました", - "config_file_not_found_changed_path": "設定に失敗しました: 設定ファイルが見つかりません。{0} がカスタムパスにインストールされている可能性があります。", - "log_batch_add_failed": "一括追加に失敗: {0}", - "log_batch_remove_failed": "一括削除に失敗: {0}", - "log_copied_config": "{0} の設定をクリップボードにコピーしました", - "log_gen_config_failed": "設定の生成に失敗しました", - "log_copy_config_failed": "設定のコピーに失敗: {0}", - "log_copied_command": "{0} コマンドをクリップボードにコピーしました", - "log_copy_command_failed": "コマンドのコピーに失敗: {0}", - "log_opened_config_file": "設定ファイルを開きました: {0}", - "log_open_config_failed": "設定ファイルを開けませんでした", - "log_open_config_error": "設定ファイルを開けませんでした: {0}", - - "update_available_title": "アップデートがあります", - "update_new_version": "新バージョン v{0} がリリースされました!", - "update_now": "今すぐ更新", - "update_not_now": "後で", - "update_skip_version": "v{0} をスキップ", - "check_for_updates": "アップデートを確認", - "update_checking": "確認中...", - "update_no_update": "最新バージョンです", - "update_urgency_critical": "緊急アップデート", - "update_urgency_high": "重要なアップデート", - "update_current_version": "現在のバージョン: v{0}", - "update_changelog": "変更履歴", - "auth_choose_subtitle": "サインイン方法を選択して続行してください", - "update_changelog_empty": "このバージョンのリリースノートはありません。", - "subscription_login_title": "VberAI サブスクリプションアカウント", - "subscription_password_label": "パスワード", - "subscription_password_placeholder": "パスワードを入力", - "subscription_login_button": "VberAI アカウントでログイン", - "subscription_google_button": "Google でログイン", - "subscription_google_pending": "ブラウザを開きました。Google 認証を完了してから Cocos Creator に戻ってください。", - "subscription_google_pending_button": "Google 認証を待っています...", - "subscription_register_button": "VberAI アカウントを作成", - "subscription_logging_in": "ログイン中...", - "subscription_credentials_required": "メールアドレスとパスワードを入力してください", - "subscription_login_success": "サブスクリプションアカウントにログインしました", - "subscription_login_failed": "サブスクリプションのログインに失敗しました", - "subscription_not_entitled": "現在のサブスクリプションには Cocos 3.x MCP が含まれていません。続行するにはアップグレードしてください。", - "subscription_upgrade_to": "このプロダクトを使用するには「{0}」にアップグレードしてください", - "subscription_upgrade_action": "サブスクリプションをアップグレード", - "subscription_logged_in": "ログイン中のアカウント", - "subscription_choose_button": "VberAI サブスクリプションアカウント", - "license_choose_button": "アクティベーションコード", - "subscription_method_label": "サブスク", - "back_to_login_choices": "← 別のサインイン方法を選択", - "subscription_signed_out_other_device": "サインアウトしました:アカウントが別のデバイスで使用されました。", - "subscription_google_cancelled": "Google ログインがキャンセルされました。", - "subscription_request_timeout": "リクエストがタイムアウトしました。ネットワークを確認して再試行してください。", - "subscription_network_error": "ネットワーク接続に失敗しました。ネットワークを確認して再試行してください。", - "subscription_server_error": "サーバーから無効な応答が返されました。後でもう一度お試しください。", - "subscription_google_authorization_failed": "Google 認証が完了しませんでした。もう一度お試しください。" - ,"lan_access_label": "LAN アクセスを許可" - ,"lan_access_warning": "0.0.0.0 にバインドしています。同じネットワーク上の誰でも接続してエディターを操作できます。このエンドポイントは資格情報を一切検証しません。信頼できるネットワークでのみ有効にしてください。" - ,"lan_address": "LAN アドレス" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ko.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ko.js deleted file mode 100644 index ab7d862..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ko.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP 서버", - "description": "Cocos Creator 3.8용 AI MCP 서버", - "panel_title": "MCP 서버", - "open_panel": "MCP 패널 열기", - "start_server": "서버 시작", - "stop_server": "서버 중지", - "server_status": "서버 상태", - "port": "포트", - "settings": "설정", - "connected": "연결됨", - "disconnected": "연결 안 됨", - "server_running": "서버가 포트 {0}에서 실행 중입니다", - "server_stopped": "서버가 중지되었습니다", - "auto_start": "자동 시작", - "debug_log": "디버그 로그", - "max_connections": "최대 연결 수", - "connection_info": "연결 정보", - "http_url": "HTTP URL", - "copy": "복사", - "save_settings": "설정 저장", - "settings_saved": "설정이 저장되었습니다", - "server_started": "MCP 서버가 시작되었습니다", - "server_stopped_msg": "MCP 서버가 중지되었습니다", - "failed_to_start": "서버 시작 실패", - "failed_to_stop": "서버 중지 실패", - "failed_to_save": "설정 저장 실패", - "url_copied": "HTTP URL이 클립보드에 복사되었습니다", - "tool_manager": "도구 관리자", - "open_tool_manager": "도구 관리자 열기", - "create_config": "구성 생성", - "edit_config": "구성 편집", - "delete_config": "구성 삭제", - "import_config": "구성 가져오기", - "export_config": "구성 내보내기", - "apply_config": "구성 적용", - "select_all": "전체 선택", - "deselect_all": "전체 해제", - "save_changes": "변경 사항 저장", - "config_name": "구성 이름", - "config_description": "구성 설명", - "current_config": "현재 구성", - "tool_management": "도구 관리", - "total_tools": "전체 도구", - "enabled_tools": "활성화", - "disabled_tools": "비활성화", - "no_config_selected": "선택된 구성 없음", - "select_config_first": "먼저 구성을 선택하거나 새로 만들어 주세요", - "config_created": "구성이 생성되었습니다", - "config_updated": "구성이 업데이트되었습니다", - "config_deleted": "구성이 삭제되었습니다", - "config_applied": "구성이 적용되었습니다", - "config_exported": "구성이 내보내기되었습니다", - "config_imported": "구성이 가져오기되었습니다", - "confirm_delete": "삭제 확인", - "delete_config_confirm": "구성 \"{0}\"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", - "max_config_slots_reached": "최대 구성 슬롯에 도달했습니다 ({0})", - "invalid_config_format": "잘못된 구성 형식", - "invalid_json_format": "잘못된 JSON 형식 또는 구성 구조", - "server_tab": "서버", - "tools_tab": "도구 관리", - "available_tools": "사용 가능한 도구", - "scene_tools": "씬 도구", - "node_tools": "노드 도구", - "component_tools": "컴포넌트 도구", - "prefab_tools": "프리팹 도구", - "project_tools": "프로젝트 도구", - "debug_tools": "디버그 도구", - "preferences_tools": "환경설정", - "server_tools": "서버 도구", - "broadcast_tools": "브로드캐스트 도구", - "scene_advanced_tools": "고급 씬 도구", - "scene_view_tools": "씬 뷰 도구", - "reference_image_tools": "참조 이미지 도구", - "asset_advanced_tools": "고급 에셋 도구", - "validation_tools": "검증 도구", - "brand_name": "LiDaxian MCP 시리즈", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "이메일", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "머신 코드", - "purchase_renew": "구매 / 갱신", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "로그인 방식 선택", - "auth_subtitle": "이메일과 활성화 코드를 입력하세요", - "email_label": "이메일 주소", - "activation_code_label": "활성화 코드", - "email_placeholder": "이메일 입력", - "code_placeholder": "코드 입력 (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "활성화", - "deactivate_button": "비활성화", - "activating": "활성화 중...", - "deactivating": "비활성화 중...", - "license_status": "라이선스 상태", - "license_type": "라이선스 유형", - "expiry_date": "만료일", - "days_remaining": "남은 일수", - "days_unit": "일", - "permanent": "영구", - "expiry_warning_title": "라이선스 만료 임박", - "expiry_warning_message": "라이선스가 {0}일 후 만료됩니다. 서비스 중단을 방지하려면 갱신해 주세요.", - "renew_now": "지금 갱신", - "i_understand": "확인했습니다", - "activation_success": "라이선스 활성화에 성공했습니다!", - "activation_failed": "활성화 실패: {0}", - "invalid_code": "잘못된 활성화 코드 형식", - "purchase_license": "라이선스 구매", - "renew_license": "라이선스 갱신", - "contact_support": "지원", - "language_switch": "한국어", - "version_label": "버전", - "license_required": "서버를 시작하려면 라이선스가 필요합니다", - "license_check_failed": "라이선스 확인 실패", - - "status_stopped": "중지됨", - "status_running": "실행 중", - "status_error": "연결 실패", - "config_tab": "빠른 설정", - "status_label": "상태", - "connections_count": "연결 수", - "transport_protocol": "전송 프로토콜", - "transport_type": "전송 유형", - "mcp_url": "MCP URL", - "port_fallback_title": "포트 {0}이(가) 사용 중이어서 {1}(으)로 변경했습니다", - "net_title": "네트워크 / 프록시", - "net_direct": "직접 연결", - "net_via": "{0} 경유({1})", - "net_source_manual": "직접 입력", - "net_source_env": "환경 변수", - "net_source_system": "시스템 설정", - "net_mode_auto": "자동 감지", - "net_mode_manual": "직접 지정", - "net_mode_off": "프록시 사용 안 함", - "net_save": "저장", - "net_test": "연결 테스트", - "net_testing": "테스트 중…", - "net_test_ok": "연결 성공({0} ms)", - "net_test_fail": "연결 실패: {0}", - "net_hint": "로그인 시간 초과는 대개 네트워크 문제입니다. VPN/프록시를 쓰면 주소(예: http://127.0.0.1:7890)를 입력하거나 클라이언트를 전역(TUN) 모드로 바꾸세요.", - "net_pac_warning": "시스템이 PAC 자동 구성 스크립트를 사용하며 플러그인이 해석할 수 없습니다. 「직접 지정」으로 바꿔 주소를 입력하세요.", - "port_label": "포트", - "auto_start_label": "자동 시작", - "debug_log_label": "디버그 로그", - "max_connections_label": "최대 연결 수", - "server_settings_title": "서버 설정", - "server_status_title": "서버 상태", - "connection_info_title": "연결 정보", - "tools_count": "{0}개 도구", - "tools_stats": "{0}개 도구 ({1} 활성화 / {2} 비활성화)", - "quick_config_title": "MCP 클라이언트 빠른 설정", - "quick_config_desc": "현재 MCP 서버를 주요 AI 에디터 및 CLI 도구에 자동 구성합니다", - "server_info": "서버 정보", - "server_name_label": "서버 이름", - "server_address": "서버 주소", - "timeout_ms": "타임아웃 (ms)", - "auto_config_title": "자동 구성 (IDE 에디터 + Codex CLI)", - "add_all": "전체 추가", - "remove_all": "전체 삭제", - "auto_config_note": "버튼을 클릭하여 구성 파일을 자동 수정합니다 (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "구성됨", - "not_configured": "미구성", - "auto_config_btn": "자동 구성", - "delete_btn": "삭제", - "copy_config": "구성 복사", - "open_config": "구성 열기", - "manual_config_title": "수동 구성 (Claude CLI + Gemini CLI)", - "refresh_commands": "명령 새로고침", - "manual_config_note": "다음 CLI 도구는 터미널에서 수동 실행이 필요합니다", - "config_scope": "구성 범위:", - "scope_user": "사용자 수준", - "scope_project": "프로젝트 수준", - "operation_log": "작업 로그", - "no_logs": "작업 기록 없음", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Streamable HTTP 프로토콜 (MCP 2025-03-26) 기반", - "tools_copyright_line1": "도구 시스템 - 13개 인텐트 레벨 도구, 150+ 에디터 작업, 액션 코드 디스패치", - "config_copyright_line1": "빠른 설정 - Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI 지원", - "email_required": "이메일과 활성화 코드를 입력하세요", - "permanent_label": "영구", - "logout_button": "로그아웃", - "invite_code_label": "초대 코드", - "copy_button": "복사", - "change_code_button": "코드 변경", - "change_code_title": "활성화 코드 변경", - "change_code_desc": "새 활성화 코드를 입력하세요. 현재 기기 바인딩이 먼저 해제됩니다.", - "confirm_change": "확인", - "cancel": "취소", - "code_required": "활성화 코드를 입력하세요", - "expiry_inline_warning": "곧 만료됩니다!", - "store_purchase_hint": "Cocos Store에서 본 플러그인을 구매하셨다면, 활성화 코드를 받으시려면 연락해 주세요.", - "license_expired_title": "라이선스 만료", - "license_expired_message": "라이선스가 만료되어 서버를 시작할 수 없습니다. 계속 사용하려면 갱신하거나 다시 활성화하세요.", - "go_to_login": "로그인으로 이동", - - "log_load_config_failed": "구성 상태 로드 실패: {0}", - "log_gen_cli_failed": "CLI 명령 생성 실패: {0}", - "log_add_client_failed": "{0}에 추가 실패: {1}", - "log_remove_client_failed": "{0}에서 삭제 실패: {1}", - "quick_config_dialog_title": "원클릭 구성", - "config_operation_failed": "구성 작업 실패", - "config_file_not_found_changed_path": "구성 실패: 구성 파일을 찾을 수 없습니다. {0}이 사용자 지정 경로에 설치되었을 수 있습니다.", - "log_batch_add_failed": "일괄 추가 실패: {0}", - "log_batch_remove_failed": "일괄 삭제 실패: {0}", - "log_copied_config": "{0} 구성을 클립보드에 복사했습니다", - "log_gen_config_failed": "구성 생성 실패", - "log_copy_config_failed": "구성 복사 실패: {0}", - "log_copied_command": "{0} 명령을 클립보드에 복사했습니다", - "log_copy_command_failed": "명령 복사 실패: {0}", - "log_opened_config_file": "구성 파일을 열었습니다: {0}", - "log_open_config_failed": "구성 파일을 열 수 없습니다", - "log_open_config_error": "구성 파일을 열 수 없습니다: {0}", - - "update_available_title": "업데이트 가능", - "update_new_version": "새 버전 v{0}이 출시되었습니다!", - "update_now": "지금 업데이트", - "update_not_now": "나중에", - "update_skip_version": "v{0} 건너뛰기", - "check_for_updates": "업데이트 확인", - "update_checking": "확인 중...", - "update_no_update": "최신 버전입니다", - "update_urgency_critical": "긴급 업데이트", - "update_urgency_high": "중요 업데이트", - "update_current_version": "현재 버전: v{0}", - "update_changelog": "변경 사항", - "auth_choose_subtitle": "계속하려면 로그인 방법을 선택하세요", - "update_changelog_empty": "이 버전에 대한 릴리스 노트가 없습니다.", - "subscription_login_title": "VberAI 구독 계정", - "subscription_password_label": "비밀번호", - "subscription_password_placeholder": "비밀번호 입력", - "subscription_login_button": "VberAI 계정으로 로그인", - "subscription_google_button": "Google로 로그인", - "subscription_google_pending": "브라우저가 열렸습니다. Google 인증을 완료한 후 Cocos Creator로 돌아오세요.", - "subscription_google_pending_button": "Google 인증을 기다리는 중...", - "subscription_register_button": "VberAI 계정 만들기", - "subscription_logging_in": "로그인 중...", - "subscription_credentials_required": "이메일과 비밀번호를 입력하세요", - "subscription_login_success": "구독 계정에 로그인했습니다", - "subscription_login_failed": "구독 로그인에 실패했습니다", - "subscription_not_entitled": "현재 구독에는 Cocos 3.x MCP가 포함되어 있지 않습니다. 계속하려면 업그레이드하세요.", - "subscription_upgrade_to": "이 제품을 사용하려면 「{0}」(으)로 업그레이드하세요", - "subscription_upgrade_action": "구독 업그레이드", - "subscription_logged_in": "로그인된 계정", - "subscription_choose_button": "VberAI 구독 계정", - "license_choose_button": "활성화 코드", - "subscription_method_label": "구독 계정", - "back_to_login_choices": "← 다른 로그인 방법 선택", - "subscription_signed_out_other_device": "로그아웃됨: 계정이 다른 기기에서 사용되었습니다.", - "subscription_google_cancelled": "Google 로그인이 취소되었습니다.", - "subscription_request_timeout": "요청 시간이 초과되었습니다. 네트워크를 확인하고 다시 시도하세요.", - "subscription_network_error": "네트워크 연결에 실패했습니다. 네트워크를 확인하고 다시 시도하세요.", - "subscription_server_error": "서버가 잘못된 응답을 반환했습니다. 나중에 다시 시도하세요.", - "subscription_google_authorization_failed": "Google 인증이 완료되지 않았습니다. 다시 시도하세요." - ,"lan_access_label": "LAN 접근 허용" - ,"lan_access_warning": "0.0.0.0에 바인딩되었습니다. 같은 네트워크의 누구나 연결해 에디터를 조작할 수 있으며, 이 엔드포인트는 자격 증명을 검증하지 않습니다. 신뢰할 수 있는 네트워크에서만 사용하세요." - ,"lan_address": "LAN 주소" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ms.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ms.js deleted file mode 100644 index cdd45a7..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ms.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Pelayan AI MCP untuk Cocos Creator 3.8", - "panel_title": "Pelayan MCP", - "open_panel": "Buka Panel MCP", - "start_server": "Mulakan Pelayan", - "stop_server": "Hentikan Pelayan", - "server_status": "Status Pelayan", - "port": "Port", - "settings": "Tetapan", - "connected": "Disambungkan", - "disconnected": "Terputus", - "server_running": "Pelayan sedang berjalan pada port {0}", - "server_stopped": "Pelayan telah berhenti", - "auto_start": "Mula Automatik", - "debug_log": "Log Nyahpepijat", - "max_connections": "Sambungan Maksimum", - "connection_info": "Maklumat Sambungan", - "http_url": "HTTP URL", - "copy": "Salin", - "save_settings": "Simpan Tetapan", - "settings_saved": "Tetapan berjaya disimpan", - "server_started": "Pelayan MCP Dimulakan", - "server_stopped_msg": "Pelayan MCP Dihentikan", - "failed_to_start": "Gagal memulakan pelayan", - "failed_to_stop": "Gagal menghentikan pelayan", - "failed_to_save": "Gagal menyimpan tetapan", - "url_copied": "HTTP URL disalin ke papan keratan", - "tool_manager": "Pengurus Alat", - "open_tool_manager": "Buka Pengurus Alat", - "create_config": "Cipta Konfigurasi", - "edit_config": "Edit Konfigurasi", - "delete_config": "Padam Konfigurasi", - "import_config": "Import Konfigurasi", - "export_config": "Eksport Konfigurasi", - "apply_config": "Guna Konfigurasi", - "select_all": "Pilih Semua", - "deselect_all": "Nyahpilih Semua", - "save_changes": "Simpan Perubahan", - "config_name": "Nama Konfigurasi", - "config_description": "Penerangan Konfigurasi", - "current_config": "Konfigurasi Semasa", - "tool_management": "Pengurusan Alat", - "total_tools": "Jumlah Alat", - "enabled_tools": "Didayakan", - "disabled_tools": "Dilumpuhkan", - "no_config_selected": "Tiada Konfigurasi Dipilih", - "select_config_first": "Sila pilih konfigurasi atau cipta yang baharu terlebih dahulu", - "config_created": "Konfigurasi berjaya dicipta", - "config_updated": "Konfigurasi berjaya dikemas kini", - "config_deleted": "Konfigurasi berjaya dipadam", - "config_applied": "Konfigurasi berjaya digunakan", - "config_exported": "Konfigurasi berjaya dieksport", - "config_imported": "Konfigurasi berjaya diimport", - "confirm_delete": "Sahkan Pemadaman", - "delete_config_confirm": "Adakah anda pasti mahu memadam konfigurasi \"{0}\"? Tindakan ini tidak boleh dibatalkan.", - "max_config_slots_reached": "Slot konfigurasi maksimum telah dicapai ({0})", - "invalid_config_format": "Format konfigurasi tidak sah", - "invalid_json_format": "Format JSON atau struktur konfigurasi tidak sah", - "server_tab": "Pelayan", - "tools_tab": "Pengurusan Alat", - "available_tools": "Alat Tersedia", - "scene_tools": "Alat Scene", - "node_tools": "Alat Node", - "component_tools": "Alat Komponen", - "prefab_tools": "Alat Prefab", - "project_tools": "Alat Projek", - "debug_tools": "Alat Nyahpepijat", - "preferences_tools": "Keutamaan", - "server_tools": "Alat Pelayan", - "broadcast_tools": "Alat Siaran", - "scene_advanced_tools": "Alat Scene Lanjutan", - "scene_view_tools": "Alat Paparan Scene", - "reference_image_tools": "Alat Imej Rujukan", - "asset_advanced_tools": "Alat Aset Lanjutan", - "validation_tools": "Alat Pengesahan", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-mel", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "ID Mesin", - "purchase_renew": "Beli / Perbaharui", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Pilih kaedah log masuk", - "auth_subtitle": "Masukkan e-mel dan kod pengaktifan anda", - "auth_choose_subtitle": "Pilih kaedah log masuk untuk meneruskan", - "email_label": "Alamat E-mel", - "activation_code_label": "Kod Pengaktifan", - "email_placeholder": "Masukkan e-mel", - "code_placeholder": "Masukkan kod (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Aktifkan", - "deactivate_button": "Nyahaktifkan", - "activating": "Mengaktifkan...", - "deactivating": "Menyahaktifkan...", - "license_status": "Status Lesen", - "license_type": "Jenis Lesen", - "expiry_date": "Tarikh Tamat Tempoh", - "days_remaining": "Baki Hari", - "days_unit": "hr", - "permanent": "Kekal", - "expiry_warning_title": "Lesen Akan Tamat Tempoh", - "expiry_warning_message": "Lesen anda akan tamat tempoh dalam {0} hari. Sila perbaharui bagi mengelakkan gangguan perkhidmatan.", - "renew_now": "Perbaharui Sekarang", - "i_understand": "Saya Faham", - "activation_success": "Lesen berjaya diaktifkan!", - "activation_failed": "Pengaktifan gagal: {0}", - "invalid_code": "Format kod pengaktifan tidak sah", - "purchase_license": "Beli Lesen", - "renew_license": "Perbaharui Lesen", - "contact_support": "Sokongan", - "language_switch": "Bahasa Melayu", - "version_label": "Versi", - "license_required": "Lesen diperlukan untuk memulakan pelayan", - "license_check_failed": "Pemeriksaan lesen gagal", - - "status_stopped": "Berhenti", - "status_running": "Berjalan", - "status_error": "Sambungan Gagal", - "config_tab": "Konfigurasi Pantas", - "status_label": "Status", - "connections_count": "Sambungan", - "transport_protocol": "Protokol Pengangkutan", - "transport_type": "Jenis Pengangkutan", - "mcp_url": "MCP URL", - "port_fallback_title": "Port {0} sedang digunakan — bertukar ke {1}", - "net_title": "Rangkaian / Proksi", - "net_direct": "Sambungan terus", - "net_via": "melalui {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "pemboleh ubah persekitaran", - "net_source_system": "tetapan sistem", - "net_mode_auto": "Auto-kesan", - "net_mode_manual": "Manual", - "net_mode_off": "Tanpa proksi", - "net_save": "Simpan", - "net_test": "Uji sambungan", - "net_testing": "Menguji…", - "net_test_ok": "Berjaya disambung ({0} ms)", - "net_test_fail": "Gagal: {0}", - "net_hint": "Tamat masa log masuk biasanya masalah rangkaian. Jika guna VPN/proksi, masukkan alamatnya (cth. http://127.0.0.1:7890) atau tukar klien ke mod global (TUN).", - "net_pac_warning": "Sistem menggunakan skrip PAC yang tidak dapat dibaca pemalam. Pilih Manual dan masukkan alamat proksi.", - "port_label": "Port", - "auto_start_label": "Mula Automatik", - "debug_log_label": "Log Nyahpepijat", - "max_connections_label": "Sambungan Maksimum", - "server_settings_title": "Tetapan Pelayan", - "server_status_title": "Status Pelayan", - "connection_info_title": "Maklumat Sambungan", - "tools_count": "{0} alat", - "tools_stats": "{0} alat ({1} didayakan / {2} dilumpuhkan)", - "quick_config_title": "Konfigurasi Pantas Klien MCP", - "quick_config_desc": "Konfigurasikan pelayan MCP semasa secara automatik ke dalam editor AI dan alat CLI arus perdana", - "server_info": "Maklumat Pelayan", - "server_name_label": "Nama Pelayan", - "server_address": "Alamat Pelayan", - "timeout_ms": "Had Masa (ms)", - "auto_config_title": "Konfigurasi Automatik (Editor IDE + Codex CLI)", - "add_all": "Tambah Semua", - "remove_all": "Buang Semua", - "auto_config_note": "Klik butang untuk mengubah fail konfigurasi secara automatik (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Dikonfigurasi", - "not_configured": "Belum Dikonfigurasi", - "auto_config_btn": "Konfigurasi Automatik", - "delete_btn": "Padam", - "copy_config": "Salin Konfigurasi", - "open_config": "Buka Konfigurasi", - "manual_config_title": "Konfigurasi Manual (Claude CLI + Gemini CLI)", - "refresh_commands": "Muat Semula Arahan", - "manual_config_note": "Alat CLI berikut memerlukan arahan terminal dijalankan secara manual", - "config_scope": "Skop Konfigurasi:", - "scope_user": "Tahap Pengguna", - "scope_project": "Tahap Projek", - "operation_log": "Log Operasi", - "no_logs": "Tiada rekod operasi", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Berasaskan Protokol Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Sistem Alat - 13 alat peringkat niat, 150+ operasi editor, penghantaran berasaskan kod action", - "config_copyright_line1": "Konfigurasi Pantas - Menyokong Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Sila masukkan e-mel dan kod pengaktifan", - "permanent_label": "Kekal", - "logout_button": "Log Keluar", - "invite_code_label": "Kod Jemputan", - "copy_button": "Salin", - "change_code_button": "Tukar Kod", - "change_code_title": "Tukar Kod Pengaktifan", - "change_code_desc": "Masukkan kod pengaktifan baharu anda. Ikatan peranti semasa akan dilepaskan terlebih dahulu.", - "confirm_change": "Sahkan", - "cancel": "Batal", - "code_required": "Sila masukkan kod pengaktifan", - "expiry_inline_warning": "Hampir tamat tempoh!", - "store_purchase_hint": "Jika anda membeli pemalam ini dari Cocos Store, sila hubungi saya untuk mendapatkan kod pengaktifan anda.", - "license_expired_title": "Lesen Tamat Tempoh", - "license_expired_message": "Lesen anda telah tamat tempoh dan pelayan tidak dapat dimulakan. Sila perbaharui atau aktifkan semula untuk meneruskan.", - "go_to_login": "Pergi ke Log Masuk", - - "log_load_config_failed": "Gagal memuatkan status konfigurasi: {0}", - "log_gen_cli_failed": "Gagal menjana arahan CLI: {0}", - "log_add_client_failed": "Gagal menambah ke {0}: {1}", - "log_remove_client_failed": "Gagal membuang daripada {0}: {1}", - "quick_config_dialog_title": "Konfigurasi Satu Klik", - "config_operation_failed": "Operasi konfigurasi gagal", - "config_file_not_found_changed_path": "Konfigurasi gagal: fail konfigurasi tidak ditemui. {0} mungkin dipasang dalam laluan tersuai.", - "log_batch_add_failed": "Penambahan pukal gagal: {0}", - "log_batch_remove_failed": "Pembuangan pukal gagal: {0}", - "log_copied_config": "Konfigurasi {0} disalin ke papan keratan", - "log_gen_config_failed": "Gagal menjana konfigurasi", - "log_copy_config_failed": "Gagal menyalin konfigurasi: {0}", - "log_copied_command": "Arahan {0} disalin ke papan keratan", - "log_copy_command_failed": "Gagal menyalin arahan: {0}", - "log_opened_config_file": "Fail konfigurasi dibuka: {0}", - "log_open_config_failed": "Gagal membuka fail konfigurasi", - "log_open_config_error": "Gagal membuka fail konfigurasi: {0}", - - "update_available_title": "Kemas Kini Tersedia", - "update_new_version": "Versi baharu v{0} telah tersedia!", - "update_now": "Kemas Kini Sekarang", - "update_not_now": "Bukan Sekarang", - "update_skip_version": "Langkau v{0}", - "check_for_updates": "Semak Kemas Kini", - "update_checking": "Menyemak...", - "update_no_update": "Anda sedang menggunakan versi terkini", - "update_urgency_critical": "Kemas Kini Kritikal", - "update_urgency_high": "Kemas Kini Penting", - "update_current_version": "Versi semasa: v{0}", - "update_changelog": "Log Perubahan" - ,"update_changelog_empty": "Tiada nota keluaran disediakan untuk versi ini." - ,"subscription_login_title": "Akaun langganan VberAI" - ,"subscription_password_label": "Kata Laluan" - ,"subscription_password_placeholder": "Masukkan kata laluan" - ,"subscription_login_button": "Log masuk dengan VberAI" - ,"subscription_google_button": "Log masuk dengan Google" - ,"subscription_google_pending": "Pelayar telah dibuka. Selesaikan kebenaran Google, kemudian kembali ke Cocos Creator." - ,"subscription_google_pending_button": "Menunggu kebenaran Google..." - ,"subscription_register_button": "Cipta akaun VberAI" - ,"subscription_logging_in": "Sedang log masuk..." - ,"subscription_credentials_required": "Sila masukkan e-mel dan kata laluan" - ,"subscription_login_success": "Akaun langganan telah log masuk" - ,"subscription_login_failed": "Log masuk akaun langganan gagal" - ,"subscription_not_entitled": "Langganan semasa anda tidak merangkumi Cocos 3.x MCP. Naik taraf untuk meneruskan." - ,"subscription_upgrade_to": "Naik taraf ke {0} untuk menggunakan produk ini" - ,"subscription_upgrade_action": "Naik taraf langganan" - ,"subscription_logged_in": "Akaun yang log masuk" - ,"subscription_choose_button": "Akaun langganan VberAI" - ,"license_choose_button": "Kod pengaktifan" - ,"subscription_method_label": "Langganan" - ,"back_to_login_choices": "← Pilih kaedah log masuk lain" - ,"subscription_signed_out_other_device": "Log keluar: akaun anda digunakan pada peranti lain." - ,"subscription_google_cancelled": "Log masuk Google telah dibatalkan." - ,"subscription_request_timeout": "Permintaan tamat masa. Semak rangkaian anda dan cuba lagi." - ,"subscription_network_error": "Sambungan rangkaian gagal. Semak rangkaian anda dan cuba lagi." - ,"subscription_server_error": "Pelayan mengembalikan respons tidak sah. Cuba lagi kemudian." - ,"subscription_google_authorization_failed": "Kebenaran Google tidak selesai. Sila cuba lagi." - ,"lan_access_label": "Benarkan akses LAN" - ,"lan_access_warning": "Terikat pada 0.0.0.0. Sesiapa sahaja dalam rangkaian ini boleh menyambung dan mengawal editor — endpoint ini tidak mengesahkan sebarang kelayakan. Dayakan hanya pada rangkaian yang dipercayai." - ,"lan_address": "Alamat LAN" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pl.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pl.js deleted file mode 100644 index 60e7fa8..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pl.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Serwer AI MCP dla Cocos Creator 3.8", - "panel_title": "Serwer MCP", - "open_panel": "Otwórz panel MCP", - "start_server": "Uruchom serwer", - "stop_server": "Zatrzymaj serwer", - "server_status": "Stan serwera", - "port": "Port", - "settings": "Ustawienia", - "connected": "Połączono", - "disconnected": "Rozłączono", - "server_running": "Serwer działa na porcie {0}", - "server_stopped": "Serwer został zatrzymany", - "auto_start": "Automatyczne uruchamianie", - "debug_log": "Dziennik debugowania", - "max_connections": "Maksymalna liczba połączeń", - "connection_info": "Informacje o połączeniu", - "http_url": "Adres HTTP", - "copy": "Kopiuj", - "save_settings": "Zapisz ustawienia", - "settings_saved": "Ustawienia zapisane pomyślnie", - "server_started": "Serwer MCP uruchomiony", - "server_stopped_msg": "Serwer MCP zatrzymany", - "failed_to_start": "Nie udało się uruchomić serwera", - "failed_to_stop": "Nie udało się zatrzymać serwera", - "failed_to_save": "Nie udało się zapisać ustawień", - "url_copied": "Adres HTTP skopiowano do schowka", - "tool_manager": "Menedżer narzędzi", - "open_tool_manager": "Otwórz menedżera narzędzi", - "create_config": "Utwórz konfigurację", - "edit_config": "Edytuj konfigurację", - "delete_config": "Usuń konfigurację", - "import_config": "Importuj konfigurację", - "export_config": "Eksportuj konfigurację", - "apply_config": "Zastosuj konfigurację", - "select_all": "Zaznacz wszystko", - "deselect_all": "Odznacz wszystko", - "save_changes": "Zapisz zmiany", - "config_name": "Nazwa konfiguracji", - "config_description": "Opis konfiguracji", - "current_config": "Bieżąca konfiguracja", - "tool_management": "Zarządzanie narzędziami", - "total_tools": "Łączna liczba narzędzi", - "enabled_tools": "Włączone", - "disabled_tools": "Wyłączone", - "no_config_selected": "Nie wybrano konfiguracji", - "select_config_first": "Najpierw wybierz konfigurację lub utwórz nową", - "config_created": "Konfiguracja utworzona pomyślnie", - "config_updated": "Konfiguracja zaktualizowana pomyślnie", - "config_deleted": "Konfiguracja usunięta pomyślnie", - "config_applied": "Konfiguracja zastosowana pomyślnie", - "config_exported": "Konfiguracja wyeksportowana pomyślnie", - "config_imported": "Konfiguracja zaimportowana pomyślnie", - "confirm_delete": "Potwierdź usunięcie", - "delete_config_confirm": "Czy na pewno chcesz usunąć konfigurację \"{0}\"? Tej operacji nie można cofnąć.", - "max_config_slots_reached": "Osiągnięto maksymalną liczbę slotów konfiguracji ({0})", - "invalid_config_format": "Nieprawidłowy format konfiguracji", - "invalid_json_format": "Nieprawidłowy format JSON lub struktura konfiguracji", - "server_tab": "Serwer", - "tools_tab": "Zarządzanie narzędziami", - "available_tools": "Dostępne narzędzia", - "scene_tools": "Narzędzia sceny", - "node_tools": "Narzędzia węzłów", - "component_tools": "Narzędzia komponentów", - "prefab_tools": "Narzędzia prefabrykatów", - "project_tools": "Narzędzia projektu", - "debug_tools": "Narzędzia debugowania", - "preferences_tools": "Preferencje", - "server_tools": "Narzędzia serwera", - "broadcast_tools": "Narzędzia rozgłaszania", - "scene_advanced_tools": "Zaawansowane narzędzia sceny", - "scene_view_tools": "Narzędzia widoku sceny", - "reference_image_tools": "Narzędzia obrazu referencyjnego", - "asset_advanced_tools": "Zaawansowane narzędzia zasobów", - "validation_tools": "Narzędzia walidacji", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-mail", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Identyfikator maszyny", - "purchase_renew": "Kup / Odnów", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Wybierz metodę logowania", - "auth_subtitle": "Wprowadź swój e-mail i kod aktywacyjny", - "auth_choose_subtitle": "Wybierz metodę logowania, aby kontynuować", - "email_label": "Adres e-mail", - "activation_code_label": "Kod aktywacyjny", - "email_placeholder": "Wprowadź e-mail", - "code_placeholder": "Wprowadź kod (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Aktywuj", - "deactivate_button": "Dezaktywuj", - "activating": "Aktywowanie...", - "deactivating": "Dezaktywowanie...", - "license_status": "Stan licencji", - "license_type": "Typ licencji", - "expiry_date": "Data wygaśnięcia", - "days_remaining": "Pozostałe dni", - "days_unit": "dni", - "permanent": "Bezterminowa", - "expiry_warning_title": "Licencja wkrótce wygaśnie", - "expiry_warning_message": "Twoja licencja wygaśnie za {0} dni. Odnów ją, aby uniknąć przerwy w działaniu usługi.", - "renew_now": "Odnów teraz", - "i_understand": "Rozumiem", - "activation_success": "Licencja aktywowana pomyślnie!", - "activation_failed": "Aktywacja nie powiodła się: {0}", - "invalid_code": "Nieprawidłowy format kodu aktywacyjnego", - "purchase_license": "Kup licencję", - "renew_license": "Odnów licencję", - "contact_support": "Wsparcie", - "language_switch": "Polski", - "version_label": "Wersja", - "license_required": "Do uruchomienia serwera wymagana jest licencja", - "license_check_failed": "Sprawdzenie licencji nie powiodło się", - - "status_stopped": "Zatrzymany", - "status_running": "Działa", - "status_error": "Połączenie nieudane", - "config_tab": "Szybka konfiguracja", - "status_label": "Stan", - "connections_count": "Połączenia", - "transport_protocol": "Protokół transportu", - "transport_type": "Typ transportu", - "mcp_url": "MCP URL", - "port_fallback_title": "Port {0} zajęty — przełączono na {1}", - "net_title": "Sieć / Proxy", - "net_direct": "Połączenie bezpośrednie", - "net_via": "przez {0} ({1})", - "net_source_manual": "ręcznie", - "net_source_env": "zmienna środowiskowa", - "net_source_system": "ustawienia systemu", - "net_mode_auto": "Wykryj automatycznie", - "net_mode_manual": "Ręcznie", - "net_mode_off": "Bez proxy", - "net_save": "Zapisz", - "net_test": "Testuj połączenie", - "net_testing": "Testowanie…", - "net_test_ok": "Połączono ({0} ms)", - "net_test_fail": "Niepowodzenie: {0}", - "net_hint": "Przekroczenia czasu logowania to zwykle problem sieci. Jeśli używasz VPN/proxy, podaj tu adres (np. http://127.0.0.1:7890) lub przełącz klienta w tryb globalny (TUN).", - "net_pac_warning": "System używa skryptu PAC, którego wtyczka nie potrafi odczytać. Przełącz na Ręcznie i podaj adres proxy.", - "port_label": "Port", - "auto_start_label": "Automatyczne uruchamianie", - "debug_log_label": "Dziennik debugowania", - "max_connections_label": "Maksymalna liczba połączeń", - "server_settings_title": "Ustawienia serwera", - "server_status_title": "Stan serwera", - "connection_info_title": "Informacje o połączeniu", - "tools_count": "{0} narzędzi", - "tools_stats": "{0} narzędzi ({1} włączonych / {2} wyłączonych)", - "quick_config_title": "Szybka konfiguracja klientów MCP", - "quick_config_desc": "Automatycznie skonfiguruj bieżący serwer MCP w popularnych edytorach AI i narzędziach CLI", - "server_info": "Informacje o serwerze", - "server_name_label": "Nazwa serwera", - "server_address": "Adres serwera", - "timeout_ms": "Limit czasu (ms)", - "auto_config_title": "Konfiguracja automatyczna (edytory IDE + Codex CLI)", - "add_all": "Dodaj wszystkie", - "remove_all": "Usuń wszystkie", - "auto_config_note": "Kliknij przycisk, aby automatycznie zmodyfikować pliki konfiguracyjne (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Skonfigurowano", - "not_configured": "Nie skonfigurowano", - "auto_config_btn": "Konfiguruj automatycznie", - "delete_btn": "Usuń", - "copy_config": "Kopiuj konfigurację", - "open_config": "Otwórz konfigurację", - "manual_config_title": "Konfiguracja ręczna (Claude CLI + Gemini CLI)", - "refresh_commands": "Odśwież polecenia", - "manual_config_note": "Poniższe narzędzia CLI wymagają ręcznego wykonania poleceń w terminalu", - "config_scope": "Zakres konfiguracji:", - "scope_user": "Poziom użytkownika", - "scope_project": "Poziom projektu", - "operation_log": "Dziennik operacji", - "no_logs": "Brak zapisanych operacji", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Oparte na protokole Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "System narzędzi - 13 narzędzi na poziomie intencji, ponad 150 operacji edytora, rozdzielanie według kodu action", - "config_copyright_line1": "Szybka konfiguracja - Obsługa Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Wprowadź e-mail i kod aktywacyjny", - "permanent_label": "Bezterminowa", - "logout_button": "Wyloguj", - "invite_code_label": "Kod zaproszenia", - "copy_button": "Kopiuj", - "change_code_button": "Zmień kod", - "change_code_title": "Zmień kod aktywacyjny", - "change_code_desc": "Wprowadź nowy kod aktywacyjny. Bieżące powiązanie urządzenia zostanie najpierw zwolnione.", - "confirm_change": "Potwierdź", - "cancel": "Anuluj", - "code_required": "Wprowadź kod aktywacyjny", - "expiry_inline_warning": "Wkrótce wygasa!", - "store_purchase_hint": "Jeśli kupiłeś tę wtyczkę w Cocos Store, skontaktuj się ze mną, aby otrzymać kod aktywacyjny.", - "license_expired_title": "Licencja wygasła", - "license_expired_message": "Twoja licencja wygasła i nie można uruchomić serwera. Odnów ją lub aktywuj ponownie, aby kontynuować.", - "go_to_login": "Przejdź do logowania", - - "log_load_config_failed": "Nie udało się wczytać stanu konfiguracji: {0}", - "log_gen_cli_failed": "Nie udało się wygenerować poleceń CLI: {0}", - "log_add_client_failed": "Nie udało się dodać do {0}: {1}", - "log_remove_client_failed": "Nie udało się usunąć z {0}: {1}", - "quick_config_dialog_title": "Konfiguracja jednym kliknięciem", - "config_operation_failed": "Operacja konfiguracji nie powiodła się", - "config_file_not_found_changed_path": "Konfiguracja nie powiodła się: nie znaleziono pliku konfiguracyjnego. {0} może być zainstalowany w niestandardowej ścieżce.", - "log_batch_add_failed": "Zbiorcze dodawanie nie powiodło się: {0}", - "log_batch_remove_failed": "Zbiorcze usuwanie nie powiodło się: {0}", - "log_copied_config": "Skopiowano konfigurację {0} do schowka", - "log_gen_config_failed": "Nie udało się wygenerować konfiguracji", - "log_copy_config_failed": "Nie udało się skopiować konfiguracji: {0}", - "log_copied_command": "Skopiowano polecenie {0} do schowka", - "log_copy_command_failed": "Nie udało się skopiować polecenia: {0}", - "log_opened_config_file": "Otwarto plik konfiguracyjny: {0}", - "log_open_config_failed": "Nie udało się otworzyć pliku konfiguracyjnego", - "log_open_config_error": "Nie udało się otworzyć pliku konfiguracyjnego: {0}", - - "update_available_title": "Dostępna aktualizacja", - "update_new_version": "Nowa wersja v{0} jest już dostępna!", - "update_now": "Aktualizuj teraz", - "update_not_now": "Nie teraz", - "update_skip_version": "Pomiń v{0}", - "check_for_updates": "Sprawdź aktualizacje", - "update_checking": "Sprawdzanie...", - "update_no_update": "Używasz najnowszej wersji", - "update_urgency_critical": "Aktualizacja krytyczna", - "update_urgency_high": "Ważna aktualizacja", - "update_current_version": "Bieżąca wersja: v{0}", - "update_changelog": "Lista zmian" - ,"update_changelog_empty": "Dla tej wersji nie podano informacji o zmianach." - ,"subscription_login_title": "Konto abonamentowe VberAI" - ,"subscription_password_label": "Hasło" - ,"subscription_password_placeholder": "Wprowadź hasło" - ,"subscription_login_button": "Zaloguj się przez VberAI" - ,"subscription_google_button": "Zaloguj się przez Google" - ,"subscription_google_pending": "Przeglądarka została otwarta. Dokończ autoryzację Google, a następnie wróć do Cocos Creator." - ,"subscription_google_pending_button": "Oczekiwanie na autoryzację Google..." - ,"subscription_register_button": "Załóż konto VberAI" - ,"subscription_logging_in": "Logowanie..." - ,"subscription_credentials_required": "Wprowadź e-mail i hasło" - ,"subscription_login_success": "Zalogowano na konto abonamentowe" - ,"subscription_login_failed": "Logowanie na konto abonamentowe nie powiodło się" - ,"subscription_not_entitled": "Twój obecny abonament nie obejmuje Cocos 3.x MCP. Podnieś plan, aby kontynuować." - ,"subscription_upgrade_to": "Przejdź na {0}, aby korzystać z tego produktu" - ,"subscription_upgrade_action": "Podnieś abonament" - ,"subscription_logged_in": "Zalogowane konto" - ,"subscription_choose_button": "Konto abonamentowe VberAI" - ,"license_choose_button": "Kod aktywacyjny" - ,"subscription_method_label": "Abonament" - ,"back_to_login_choices": "← Wybierz inną metodę logowania" - ,"subscription_signed_out_other_device": "Wylogowano: Twoje konto zostało użyte na innym urządzeniu." - ,"subscription_google_cancelled": "Logowanie przez Google zostało anulowane." - ,"subscription_request_timeout": "Przekroczono limit czasu żądania. Sprawdź sieć i spróbuj ponownie." - ,"subscription_network_error": "Połączenie sieciowe nie powiodło się. Sprawdź sieć i spróbuj ponownie." - ,"subscription_server_error": "Serwer zwrócił nieprawidłową odpowiedź. Spróbuj ponownie później." - ,"subscription_google_authorization_failed": "Autoryzacja Google nie została ukończona. Spróbuj ponownie." - ,"lan_access_label": "Zezwól na dostęp z sieci lokalnej" - ,"lan_access_warning": "Powiązano z 0.0.0.0. Każdy w tej sieci może się połączyć i sterować edytorem — ten punkt końcowy nie weryfikuje żadnych poświadczeń. Włączaj tylko w zaufanej sieci." - ,"lan_address": "Adres w sieci lokalnej" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pt.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pt.js deleted file mode 100644 index b5314fe..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/pt.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP Servidor", - "description": "Servidor AI MCP para Cocos Creator 3.8", - "panel_title": "Servidor MCP", - "open_panel": "Abrir painel MCP", - "start_server": "Iniciar servidor", - "stop_server": "Parar servidor", - "server_status": "Estado do servidor", - "port": "Porta", - "settings": "Configurações", - "connected": "Conectado", - "disconnected": "Desconectado", - "server_running": "O servidor está em execução na porta {0}", - "server_stopped": "O servidor foi parado", - "auto_start": "Início automático", - "debug_log": "Log de depuração", - "max_connections": "Conexões máx.", - "connection_info": "Info de conexão", - "http_url": "URL HTTP", - "copy": "Copiar", - "save_settings": "Salvar", - "settings_saved": "Configurações salvas com sucesso", - "server_started": "Servidor MCP iniciado", - "server_stopped_msg": "Servidor MCP parado", - "failed_to_start": "Falha ao iniciar o servidor", - "failed_to_stop": "Falha ao parar o servidor", - "failed_to_save": "Falha ao salvar configurações", - "url_copied": "URL HTTP copiada para a área de transferência", - "tool_manager": "Gerenciador de ferramentas", - "open_tool_manager": "Abrir gerenciador de ferramentas", - "create_config": "Criar configuração", - "edit_config": "Editar configuração", - "delete_config": "Excluir configuração", - "import_config": "Importar configuração", - "export_config": "Exportar configuração", - "apply_config": "Aplicar configuração", - "select_all": "Selecionar tudo", - "deselect_all": "Desmarcar tudo", - "save_changes": "Salvar alterações", - "config_name": "Nome da configuração", - "config_description": "Descrição da configuração", - "current_config": "Configuração atual", - "tool_management": "Gestão de ferramentas", - "total_tools": "Total de ferramentas", - "enabled_tools": "Ativadas", - "disabled_tools": "Desativadas", - "no_config_selected": "Nenhuma configuração selecionada", - "select_config_first": "Por favor, selecione ou crie uma configuração primeiro", - "config_created": "Configuração criada com sucesso", - "config_updated": "Configuração atualizada com sucesso", - "config_deleted": "Configuração excluída com sucesso", - "config_applied": "Configuração aplicada com sucesso", - "config_exported": "Configuração exportada com sucesso", - "config_imported": "Configuração importada com sucesso", - "confirm_delete": "Confirmar exclusão", - "delete_config_confirm": "Tem certeza de que deseja excluir a configuração \"{0}\"? Esta ação não pode ser desfeita.", - "max_config_slots_reached": "Número máximo de configurações atingido ({0})", - "invalid_config_format": "Formato de configuração inválido", - "invalid_json_format": "Formato JSON ou estrutura de configuração inválidos", - "server_tab": "Servidor", - "tools_tab": "Gestão de ferramentas", - "available_tools": "Ferramentas disponíveis", - "scene_tools": "Ferramentas de cena", - "node_tools": "Ferramentas de nó", - "component_tools": "Ferramentas de componente", - "prefab_tools": "Ferramentas de prefab", - "project_tools": "Ferramentas de projeto", - "debug_tools": "Ferramentas de depuração", - "preferences_tools": "Preferências", - "server_tools": "Ferramentas de servidor", - "broadcast_tools": "Ferramentas de broadcast", - "scene_advanced_tools": "Ferramentas de cena avançadas", - "scene_view_tools": "Ferramentas de visualização de cena", - "reference_image_tools": "Ferramentas de imagem de referência", - "asset_advanced_tools": "Ferramentas de assets avançadas", - "validation_tools": "Ferramentas de validação", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-mail", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Código da máquina", - "purchase_renew": "Comprar / Renovar", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Escolher método de login", - "auth_subtitle": "Digite seu e-mail e código de ativação", - "email_label": "Endereço de e-mail", - "activation_code_label": "Código de ativação", - "email_placeholder": "Digite o e-mail", - "code_placeholder": "Digite o código (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Ativar", - "deactivate_button": "Desativar", - "activating": "Ativando...", - "deactivating": "Desativando...", - "license_status": "Estado da licença", - "license_type": "Tipo de licença", - "expiry_date": "Data de expiração", - "days_remaining": "Dias restantes", - "days_unit": "d", - "permanent": "Permanente", - "expiry_warning_title": "Licença expirando em breve", - "expiry_warning_message": "Sua licença expirará em {0} dias. Por favor, renove para evitar interrupções.", - "renew_now": "Renovar agora", - "i_understand": "Entendido", - "activation_success": "Licença ativada com sucesso!", - "activation_failed": "Falha na ativação: {0}", - "invalid_code": "Formato de código de ativação inválido", - "purchase_license": "Comprar licença", - "renew_license": "Renovar licença", - "contact_support": "Suporte", - "language_switch": "Português", - "version_label": "Versão", - "license_required": "É necessária uma licença para iniciar o servidor", - "license_check_failed": "Falha na verificação de licença", - - "status_stopped": "Parado", - "status_running": "Em execução", - "status_error": "Falha na conexão", - "config_tab": "Config rápida", - "status_label": "Estado", - "connections_count": "Conexões", - "transport_protocol": "Protocolo de transporte", - "transport_type": "Tipo de transporte", - "mcp_url": "URL MCP", - "port_fallback_title": "Porta {0} ocupada — alterada para {1}", - "net_title": "Rede / Proxy", - "net_direct": "Ligação direta", - "net_via": "via {0} ({1})", - "net_source_manual": "manual", - "net_source_env": "variável de ambiente", - "net_source_system": "definições do sistema", - "net_mode_auto": "Deteção automática", - "net_mode_manual": "Manual", - "net_mode_off": "Sem proxy", - "net_save": "Guardar", - "net_test": "Testar ligação", - "net_testing": "A testar…", - "net_test_ok": "Ligado ({0} ms)", - "net_test_fail": "Falhou: {0}", - "net_hint": "Os tempos limite de início de sessão são quase sempre de rede. Se usar VPN/proxy, indique aqui o endereço (ex.: http://127.0.0.1:7890) ou mude o cliente para modo global (TUN).", - "net_pac_warning": "O sistema usa um script PAC que este plugin não consegue avaliar. Mude para Manual e introduza o endereço do proxy.", - "port_label": "Porta", - "auto_start_label": "Início auto", - "debug_log_label": "Log de depuração", - "max_connections_label": "Conexões máx.", - "server_settings_title": "Configurações do servidor", - "server_status_title": "Estado do servidor", - "connection_info_title": "Info de conexão", - "tools_count": "{0} ferramentas", - "tools_stats": "{0} ferramentas ({1} ativadas / {2} desativadas)", - "quick_config_title": "Config rápida de clientes MCP", - "quick_config_desc": "Configurar automaticamente o servidor MCP em editores AI e ferramentas CLI", - "server_info": "Info do servidor", - "server_name_label": "Nome do servidor", - "server_address": "Endereço do servidor", - "timeout_ms": "Tempo limite (ms)", - "auto_config_title": "Config auto (IDE + Codex CLI)", - "add_all": "Adicionar tudo", - "remove_all": "Remover tudo", - "auto_config_note": "Clique para modificar automaticamente os arquivos de config (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Configurado", - "not_configured": "Não configurado", - "auto_config_btn": "Config auto", - "delete_btn": "Excluir", - "copy_config": "Copiar config", - "open_config": "Abrir config", - "manual_config_title": "Config manual (Claude CLI + Gemini CLI)", - "refresh_commands": "Atualizar comandos", - "manual_config_note": "As seguintes ferramentas CLI requerem execução manual no terminal", - "config_scope": "Escopo de config:", - "scope_user": "Nível de usuário", - "scope_project": "Nível de projeto", - "operation_log": "Log de operações", - "no_logs": "Sem registros", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Baseado no protocolo Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Sistema de ferramentas - 13 ferramentas intent-level, 150+ operações de editor, despacho de código de ação", - "config_copyright_line1": "Config rápida - Suporta Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Por favor, digite e-mail e código de ativação", - "permanent_label": "Permanente", - "logout_button": "Sair", - "invite_code_label": "Código de convite", - "copy_button": "Copiar", - "change_code_button": "Alterar código", - "change_code_title": "Alterar código de ativação", - "change_code_desc": "Digite seu novo código de ativação. A vinculação do dispositivo atual será liberada primeiro.", - "confirm_change": "Confirmar", - "cancel": "Cancelar", - "code_required": "Por favor, digite um código de ativação", - "expiry_inline_warning": "Expirando em breve!", - "store_purchase_hint": "Se você comprou este plugin na Cocos Store, entre em contato comigo para obter seu código de ativação.", - "license_expired_title": "Licença expirada", - "license_expired_message": "Sua licença expirou e o servidor não pode ser iniciado. Renove ou reative para continuar.", - "go_to_login": "Ir para login", - - "log_load_config_failed": "Falha ao carregar estado da config: {0}", - "log_gen_cli_failed": "Falha ao gerar comandos CLI: {0}", - "log_add_client_failed": "Falha ao adicionar a {0}: {1}", - "log_remove_client_failed": "Falha ao remover de {0}: {1}", - "quick_config_dialog_title": "Configuração com um clique", - "config_operation_failed": "Falha na operação de configuração", - "config_file_not_found_changed_path": "Falha na configuração: arquivo de configuração não encontrado. {0} pode ter sido instalado em um caminho personalizado.", - "log_batch_add_failed": "Falha na adição em lote: {0}", - "log_batch_remove_failed": "Falha na remoção em lote: {0}", - "log_copied_config": "Config de {0} copiada para a área de transferência", - "log_gen_config_failed": "Falha ao gerar config", - "log_copy_config_failed": "Falha ao copiar config: {0}", - "log_copied_command": "Comando {0} copiado para a área de transferência", - "log_copy_command_failed": "Falha ao copiar comando: {0}", - "log_opened_config_file": "Arquivo de config aberto: {0}", - "log_open_config_failed": "Falha ao abrir arquivo de config", - "log_open_config_error": "Falha ao abrir arquivo de config: {0}", - - "update_available_title": "Atualização disponível", - "update_new_version": "A nova versão v{0} está disponível!", - "update_now": "Atualizar agora", - "update_not_now": "Agora não", - "update_skip_version": "Pular v{0}", - "check_for_updates": "Verificar atualizações", - "update_checking": "Verificando...", - "update_no_update": "Você está usando a versão mais recente", - "update_urgency_critical": "Atualização crítica", - "update_urgency_high": "Atualização importante", - "update_current_version": "Versão atual: v{0}", - "update_changelog": "Registro de alterações", - "auth_choose_subtitle": "Escolha um método de login para continuar", - "update_changelog_empty": "Nenhuma nota de versão foi fornecida para esta versão.", - "subscription_login_title": "Conta de assinatura VberAI", - "subscription_password_label": "Senha", - "subscription_password_placeholder": "Digite a senha", - "subscription_login_button": "Entrar com VberAI", - "subscription_google_button": "Entrar com o Google", - "subscription_google_pending": "Navegador aberto. Conclua a autorização do Google e volte ao Cocos Creator.", - "subscription_google_pending_button": "Aguardando a autorização do Google...", - "subscription_register_button": "Criar uma conta VberAI", - "subscription_logging_in": "Entrando...", - "subscription_credentials_required": "Digite o e-mail e a senha", - "subscription_login_success": "Conectado à conta de assinatura", - "subscription_login_failed": "Falha ao entrar na assinatura", - "subscription_not_entitled": "Sua assinatura atual não inclui o Cocos 3.x MCP. Faça upgrade para continuar.", - "subscription_upgrade_to": "Faça upgrade para \"{0}\" para usar este produto", - "subscription_upgrade_action": "Fazer upgrade da assinatura", - "subscription_logged_in": "Conta conectada", - "subscription_choose_button": "Conta de assinatura VberAI", - "license_choose_button": "Código de ativação", - "subscription_method_label": "Assinatura", - "back_to_login_choices": "← Escolher outro método de login", - "subscription_signed_out_other_device": "Desconectado: sua conta foi usada em outro dispositivo.", - "subscription_google_cancelled": "O login com o Google foi cancelado.", - "subscription_request_timeout": "A solicitação expirou. Verifique sua rede e tente novamente.", - "subscription_network_error": "Falha na conexão de rede. Verifique sua rede e tente novamente.", - "subscription_server_error": "O servidor retornou uma resposta inválida. Tente novamente mais tarde.", - "subscription_google_authorization_failed": "A autorização do Google não foi concluída. Tente novamente." - ,"lan_access_label": "Permitir acesso pela rede local" - ,"lan_access_warning": "Vinculado a 0.0.0.0. Qualquer pessoa nesta rede pode se conectar e operar o editor — este endpoint não verifica nenhuma credencial. Ative apenas em uma rede confiável." - ,"lan_address": "Endereço da rede local" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ru.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ru.js deleted file mode 100644 index d068bb6..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/ru.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP Сервер", - "description": "AI MCP сервер для Cocos Creator 3.8", - "panel_title": "MCP Сервер", - "open_panel": "Открыть панель MCP", - "start_server": "Запустить сервер", - "stop_server": "Остановить сервер", - "server_status": "Состояние сервера", - "port": "Порт", - "settings": "Настройки", - "connected": "Подключено", - "disconnected": "Отключено", - "server_running": "Сервер работает на порту {0}", - "server_stopped": "Сервер остановлен", - "auto_start": "Автозапуск", - "debug_log": "Журнал отладки", - "max_connections": "Макс. подключений", - "connection_info": "Информация о подключении", - "http_url": "HTTP URL", - "copy": "Копировать", - "save_settings": "Сохранить", - "settings_saved": "Настройки успешно сохранены", - "server_started": "MCP сервер запущен", - "server_stopped_msg": "MCP сервер остановлен", - "failed_to_start": "Не удалось запустить сервер", - "failed_to_stop": "Не удалось остановить сервер", - "failed_to_save": "Не удалось сохранить настройки", - "url_copied": "HTTP URL скопирован в буфер обмена", - "tool_manager": "Менеджер инструментов", - "open_tool_manager": "Открыть менеджер инструментов", - "create_config": "Создать конфигурацию", - "edit_config": "Редактировать конфигурацию", - "delete_config": "Удалить конфигурацию", - "import_config": "Импортировать конфигурацию", - "export_config": "Экспортировать конфигурацию", - "apply_config": "Применить конфигурацию", - "select_all": "Выбрать все", - "deselect_all": "Снять все", - "save_changes": "Сохранить изменения", - "config_name": "Имя конфигурации", - "config_description": "Описание конфигурации", - "current_config": "Текущая конфигурация", - "tool_management": "Управление инструментами", - "total_tools": "Всего инструментов", - "enabled_tools": "Включено", - "disabled_tools": "Отключено", - "no_config_selected": "Конфигурация не выбрана", - "select_config_first": "Пожалуйста, сначала выберите или создайте конфигурацию", - "config_created": "Конфигурация успешно создана", - "config_updated": "Конфигурация успешно обновлена", - "config_deleted": "Конфигурация успешно удалена", - "config_applied": "Конфигурация успешно применена", - "config_exported": "Конфигурация успешно экспортирована", - "config_imported": "Конфигурация успешно импортирована", - "confirm_delete": "Подтвердить удаление", - "delete_config_confirm": "Вы уверены, что хотите удалить конфигурацию \"{0}\"? Это действие нельзя отменить.", - "max_config_slots_reached": "Достигнуто максимальное количество конфигураций ({0})", - "invalid_config_format": "Недопустимый формат конфигурации", - "invalid_json_format": "Недопустимый формат JSON или структура конфигурации", - "server_tab": "Сервер", - "tools_tab": "Управление инструментами", - "available_tools": "Доступные инструменты", - "scene_tools": "Инструменты сцены", - "node_tools": "Инструменты узлов", - "component_tools": "Инструменты компонентов", - "prefab_tools": "Инструменты префабов", - "project_tools": "Инструменты проекта", - "debug_tools": "Инструменты отладки", - "preferences_tools": "Настройки", - "server_tools": "Серверные инструменты", - "broadcast_tools": "Инструменты трансляции", - "scene_advanced_tools": "Расширенные инструменты сцены", - "scene_view_tools": "Инструменты просмотра сцены", - "reference_image_tools": "Инструменты эталонных изображений", - "asset_advanced_tools": "Расширенные инструменты ресурсов", - "validation_tools": "Инструменты валидации", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Эл. почта", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Код машины", - "purchase_renew": "Купить / Продлить", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Выберите способ входа", - "auth_subtitle": "Введите email и код активации", - "email_label": "Адрес электронной почты", - "activation_code_label": "Код активации", - "email_placeholder": "Введите email", - "code_placeholder": "Введите код (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Активировать", - "deactivate_button": "Деактивировать", - "activating": "Активация...", - "deactivating": "Деактивация...", - "license_status": "Состояние лицензии", - "license_type": "Тип лицензии", - "expiry_date": "Дата истечения", - "days_remaining": "Осталось дней", - "days_unit": "д", - "permanent": "Бессрочная", - "expiry_warning_title": "Срок лицензии скоро истекает", - "expiry_warning_message": "Ваша лицензия истекает через {0} дней. Пожалуйста, продлите, чтобы избежать прерывания.", - "renew_now": "Продлить сейчас", - "i_understand": "Понятно", - "activation_success": "Лицензия успешно активирована!", - "activation_failed": "Ошибка активации: {0}", - "invalid_code": "Неверный формат кода активации", - "purchase_license": "Купить лицензию", - "renew_license": "Продлить лицензию", - "contact_support": "Поддержка", - "language_switch": "Русский", - "version_label": "Версия", - "license_required": "Для запуска сервера требуется лицензия", - "license_check_failed": "Ошибка проверки лицензии", - - "status_stopped": "Остановлен", - "status_running": "Работает", - "status_error": "Ошибка подключения", - "config_tab": "Быстрая настройка", - "status_label": "Состояние", - "connections_count": "Подключения", - "transport_protocol": "Транспортный протокол", - "transport_type": "Тип транспорта", - "mcp_url": "MCP URL", - "port_fallback_title": "Порт {0} занят — выполнен переход на {1}", - "net_title": "Сеть / Прокси", - "net_direct": "Прямое подключение", - "net_via": "через {0} ({1})", - "net_source_manual": "вручную", - "net_source_env": "переменная окружения", - "net_source_system": "системные настройки", - "net_mode_auto": "Автоопределение", - "net_mode_manual": "Вручную", - "net_mode_off": "Без прокси", - "net_save": "Сохранить", - "net_test": "Проверить соединение", - "net_testing": "Проверка…", - "net_test_ok": "Соединение установлено ({0} мс)", - "net_test_fail": "Ошибка: {0}", - "net_hint": "Тайм-ауты входа почти всегда связаны с сетью. При использовании VPN/прокси укажите адрес здесь (например http://127.0.0.1:7890) или переключите клиент в глобальный режим (TUN).", - "net_pac_warning": "Система использует PAC-скрипт, который плагин не может обработать. Переключитесь на «Вручную» и укажите адрес прокси.", - "port_label": "Порт", - "auto_start_label": "Автозапуск", - "debug_log_label": "Журнал отладки", - "max_connections_label": "Макс. подключений", - "server_settings_title": "Настройки сервера", - "server_status_title": "Состояние сервера", - "connection_info_title": "Информация о подключении", - "tools_count": "{0} инструментов", - "tools_stats": "{0} инструментов ({1} включено / {2} отключено)", - "quick_config_title": "Быстрая настройка клиентов MCP", - "quick_config_desc": "Автоматическая настройка MCP сервера в AI-редакторах и CLI-инструментах", - "server_info": "Информация о сервере", - "server_name_label": "Имя сервера", - "server_address": "Адрес сервера", - "timeout_ms": "Тайм-аут (мс)", - "auto_config_title": "Автонастройка (IDE + Codex CLI)", - "add_all": "Добавить все", - "remove_all": "Удалить все", - "auto_config_note": "Нажмите для автоматического изменения файлов конфигурации (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Настроено", - "not_configured": "Не настроено", - "auto_config_btn": "Автонастройка", - "delete_btn": "Удалить", - "copy_config": "Копировать конфиг", - "open_config": "Открыть конфиг", - "manual_config_title": "Ручная настройка (Claude CLI + Gemini CLI)", - "refresh_commands": "Обновить команды", - "manual_config_note": "Следующие CLI-инструменты требуют ручного выполнения в терминале", - "config_scope": "Область конфигурации:", - "scope_user": "Уровень пользователя", - "scope_project": "Уровень проекта", - "operation_log": "Журнал операций", - "no_logs": "Нет записей", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "На основе протокола Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Система инструментов - 13 intent-level инструментов, 150+ операций редактора, диспетчеризация action-кодов", - "config_copyright_line1": "Быстрая настройка - Поддержка Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Пожалуйста, введите email и код активации", - "permanent_label": "Бессрочная", - "logout_button": "Выйти", - "invite_code_label": "Код приглашения", - "copy_button": "Копировать", - "change_code_button": "Сменить код", - "change_code_title": "Смена кода активации", - "change_code_desc": "Введите новый код активации. Привязка текущего устройства будет сначала снята.", - "confirm_change": "Подтвердить", - "cancel": "Отмена", - "code_required": "Пожалуйста, введите код активации", - "expiry_inline_warning": "Скоро истекает!", - "store_purchase_hint": "Если вы приобрели этот плагин в Cocos Store, свяжитесь со мной для получения кода активации.", - "license_expired_title": "Лицензия истекла", - "license_expired_message": "Ваша лицензия истекла, сервер не может быть запущен. Пожалуйста, продлите или повторно активируйте для продолжения.", - "go_to_login": "Перейти к входу", - - "log_load_config_failed": "Не удалось загрузить состояние конфигурации: {0}", - "log_gen_cli_failed": "Не удалось сгенерировать команды CLI: {0}", - "log_add_client_failed": "Не удалось добавить в {0}: {1}", - "log_remove_client_failed": "Не удалось удалить из {0}: {1}", - "quick_config_dialog_title": "Настройка в один клик", - "config_operation_failed": "Операция настройки не удалась", - "config_file_not_found_changed_path": "Ошибка настройки: файл конфигурации не найден. Возможно, {0} установлен в пользовательский путь.", - "log_batch_add_failed": "Пакетное добавление не удалось: {0}", - "log_batch_remove_failed": "Пакетное удаление не удалось: {0}", - "log_copied_config": "Конфигурация {0} скопирована в буфер обмена", - "log_gen_config_failed": "Не удалось сгенерировать конфигурацию", - "log_copy_config_failed": "Не удалось скопировать конфигурацию: {0}", - "log_copied_command": "Команда {0} скопирована в буфер обмена", - "log_copy_command_failed": "Не удалось скопировать команду: {0}", - "log_opened_config_file": "Файл конфигурации открыт: {0}", - "log_open_config_failed": "Не удалось открыть файл конфигурации", - "log_open_config_error": "Не удалось открыть файл конфигурации: {0}", - - "update_available_title": "Доступно обновление", - "update_new_version": "Новая версия v{0} доступна!", - "update_now": "Обновить сейчас", - "update_not_now": "Позже", - "update_skip_version": "Пропустить v{0}", - "check_for_updates": "Проверить обновления", - "update_checking": "Проверка...", - "update_no_update": "У вас последняя версия", - "update_urgency_critical": "Критическое обновление", - "update_urgency_high": "Важное обновление", - "update_current_version": "Текущая версия: v{0}", - "update_changelog": "Список изменений", - "auth_choose_subtitle": "Выберите способ входа, чтобы продолжить", - "update_changelog_empty": "Для этой версии не указаны примечания к выпуску.", - "subscription_login_title": "Аккаунт подписки VberAI", - "subscription_password_label": "Пароль", - "subscription_password_placeholder": "Введите пароль", - "subscription_login_button": "Войти через VberAI", - "subscription_google_button": "Войти через Google", - "subscription_google_pending": "Браузер открыт. Завершите авторизацию Google, затем вернитесь в Cocos Creator.", - "subscription_google_pending_button": "Ожидание авторизации Google...", - "subscription_register_button": "Создать аккаунт VberAI", - "subscription_logging_in": "Вход...", - "subscription_credentials_required": "Введите адрес электронной почты и пароль", - "subscription_login_success": "Вход в аккаунт подписки выполнен", - "subscription_login_failed": "Не удалось войти в аккаунт подписки", - "subscription_not_entitled": "Ваша текущая подписка не включает Cocos 3.x MCP. Оформите повышение, чтобы продолжить.", - "subscription_upgrade_to": "Перейдите на «{0}», чтобы использовать этот продукт", - "subscription_upgrade_action": "Повысить подписку", - "subscription_logged_in": "Вошедший аккаунт", - "subscription_choose_button": "Аккаунт подписки VberAI", - "license_choose_button": "Код активации", - "subscription_method_label": "Подписка", - "back_to_login_choices": "← Выбрать другой способ входа", - "subscription_signed_out_other_device": "Выполнен выход: ваш аккаунт использовался на другом устройстве.", - "subscription_google_cancelled": "Вход через Google отменён.", - "subscription_request_timeout": "Время ожидания запроса истекло. Проверьте сеть и повторите попытку.", - "subscription_network_error": "Сбой сетевого подключения. Проверьте сеть и повторите попытку.", - "subscription_server_error": "Сервер вернул недопустимый ответ. Повторите попытку позже.", - "subscription_google_authorization_failed": "Авторизация Google не завершена. Повторите попытку." - ,"lan_access_label": "Разрешить доступ по локальной сети" - ,"lan_access_warning": "Привязано к 0.0.0.0. Любой в этой сети может подключиться и управлять редактором — эта конечная точка не проверяет никаких учётных данных. Включайте только в доверенной сети." - ,"lan_address": "Адрес в локальной сети" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/th.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/th.js deleted file mode 100644 index 9bd85ad..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/th.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "เซิร์ฟเวอร์ AI MCP สำหรับ Cocos Creator 3.8", - "panel_title": "เซิร์ฟเวอร์ MCP", - "open_panel": "เปิดแผง MCP", - "start_server": "เริ่มเซิร์ฟเวอร์", - "stop_server": "หยุดเซิร์ฟเวอร์", - "server_status": "สถานะเซิร์ฟเวอร์", - "port": "พอร์ต", - "settings": "การตั้งค่า", - "connected": "เชื่อมต่อแล้ว", - "disconnected": "ตัดการเชื่อมต่อแล้ว", - "server_running": "เซิร์ฟเวอร์กำลังทำงานบนพอร์ต {0}", - "server_stopped": "เซิร์ฟเวอร์หยุดทำงานแล้ว", - "auto_start": "เริ่มอัตโนมัติ", - "debug_log": "บันทึกดีบัก", - "max_connections": "จำนวนการเชื่อมต่อสูงสุด", - "connection_info": "ข้อมูลการเชื่อมต่อ", - "http_url": "HTTP URL", - "copy": "คัดลอก", - "save_settings": "บันทึกการตั้งค่า", - "settings_saved": "บันทึกการตั้งค่าสำเร็จ", - "server_started": "เซิร์ฟเวอร์ MCP เริ่มทำงานแล้ว", - "server_stopped_msg": "เซิร์ฟเวอร์ MCP หยุดทำงานแล้ว", - "failed_to_start": "เริ่มเซิร์ฟเวอร์ไม่สำเร็จ", - "failed_to_stop": "หยุดเซิร์ฟเวอร์ไม่สำเร็จ", - "failed_to_save": "บันทึกการตั้งค่าไม่สำเร็จ", - "url_copied": "คัดลอก HTTP URL ไปยังคลิปบอร์ดแล้ว", - "tool_manager": "ตัวจัดการเครื่องมือ", - "open_tool_manager": "เปิดตัวจัดการเครื่องมือ", - "create_config": "สร้างการกำหนดค่า", - "edit_config": "แก้ไขการกำหนดค่า", - "delete_config": "ลบการกำหนดค่า", - "import_config": "นำเข้าการกำหนดค่า", - "export_config": "ส่งออกการกำหนดค่า", - "apply_config": "ใช้การกำหนดค่า", - "select_all": "เลือกทั้งหมด", - "deselect_all": "ยกเลิกเลือกทั้งหมด", - "save_changes": "บันทึกการเปลี่ยนแปลง", - "config_name": "ชื่อการกำหนดค่า", - "config_description": "คำอธิบายการกำหนดค่า", - "current_config": "การกำหนดค่าปัจจุบัน", - "tool_management": "การจัดการเครื่องมือ", - "total_tools": "เครื่องมือทั้งหมด", - "enabled_tools": "เปิดใช้งาน", - "disabled_tools": "ปิดใช้งาน", - "no_config_selected": "ยังไม่ได้เลือกการกำหนดค่า", - "select_config_first": "โปรดเลือกการกำหนดค่า หรือสร้างการกำหนดค่าใหม่ก่อน", - "config_created": "สร้างการกำหนดค่าสำเร็จ", - "config_updated": "อัปเดตการกำหนดค่าสำเร็จ", - "config_deleted": "ลบการกำหนดค่าสำเร็จ", - "config_applied": "ใช้การกำหนดค่าสำเร็จ", - "config_exported": "ส่งออกการกำหนดค่าสำเร็จ", - "config_imported": "นำเข้าการกำหนดค่าสำเร็จ", - "confirm_delete": "ยืนยันการลบ", - "delete_config_confirm": "คุณแน่ใจหรือไม่ว่าต้องการลบการกำหนดค่า \"{0}\" การดำเนินการนี้ไม่สามารถย้อนกลับได้", - "max_config_slots_reached": "ถึงจำนวนช่องการกำหนดค่าสูงสุดแล้ว ({0})", - "invalid_config_format": "รูปแบบการกำหนดค่าไม่ถูกต้อง", - "invalid_json_format": "รูปแบบ JSON หรือโครงสร้างการกำหนดค่าไม่ถูกต้อง", - "server_tab": "เซิร์ฟเวอร์", - "tools_tab": "การจัดการเครื่องมือ", - "available_tools": "เครื่องมือที่ใช้ได้", - "scene_tools": "เครื่องมือฉาก", - "node_tools": "เครื่องมือโหนด", - "component_tools": "เครื่องมือคอมโพเนนต์", - "prefab_tools": "เครื่องมือ Prefab", - "project_tools": "เครื่องมือโปรเจกต์", - "debug_tools": "เครื่องมือดีบัก", - "preferences_tools": "การตั้งค่าส่วนตัว", - "server_tools": "เครื่องมือเซิร์ฟเวอร์", - "broadcast_tools": "เครื่องมือบรอดแคสต์", - "scene_advanced_tools": "เครื่องมือฉากขั้นสูง", - "scene_view_tools": "เครื่องมือมุมมองฉาก", - "reference_image_tools": "เครื่องมือภาพอ้างอิง", - "asset_advanced_tools": "เครื่องมือแอสเซทขั้นสูง", - "validation_tools": "เครื่องมือตรวจสอบความถูกต้อง", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "อีเมล", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "รหัสเครื่อง", - "purchase_renew": "ซื้อ / ต่ออายุ", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "เลือกวิธีเข้าสู่ระบบ", - "auth_subtitle": "กรอกอีเมลและรหัสเปิดใช้งานของคุณ", - "auth_choose_subtitle": "เลือกวิธีเข้าสู่ระบบเพื่อดำเนินการต่อ", - "email_label": "ที่อยู่อีเมล", - "activation_code_label": "รหัสเปิดใช้งาน", - "email_placeholder": "กรอกอีเมล", - "code_placeholder": "กรอกรหัส (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "เปิดใช้งาน", - "deactivate_button": "ยกเลิกการเปิดใช้งาน", - "activating": "กำลังเปิดใช้งาน...", - "deactivating": "กำลังยกเลิกการเปิดใช้งาน...", - "license_status": "สถานะไลเซนส์", - "license_type": "ประเภทไลเซนส์", - "expiry_date": "วันหมดอายุ", - "days_remaining": "จำนวนวันที่เหลือ", - "days_unit": "วัน", - "permanent": "ถาวร", - "expiry_warning_title": "ไลเซนส์ใกล้หมดอายุ", - "expiry_warning_message": "ไลเซนส์ของคุณจะหมดอายุในอีก {0} วัน โปรดต่ออายุเพื่อไม่ให้บริการหยุดชะงัก", - "renew_now": "ต่ออายุตอนนี้", - "i_understand": "รับทราบ", - "activation_success": "เปิดใช้งานไลเซนส์สำเร็จ!", - "activation_failed": "เปิดใช้งานไม่สำเร็จ: {0}", - "invalid_code": "รูปแบบรหัสเปิดใช้งานไม่ถูกต้อง", - "purchase_license": "ซื้อไลเซนส์", - "renew_license": "ต่ออายุไลเซนส์", - "contact_support": "ฝ่ายสนับสนุน", - "language_switch": "ไทย", - "version_label": "เวอร์ชัน", - "license_required": "ต้องมีไลเซนส์จึงจะเริ่มเซิร์ฟเวอร์ได้", - "license_check_failed": "ตรวจสอบไลเซนส์ไม่สำเร็จ", - - "status_stopped": "หยุดแล้ว", - "status_running": "กำลังทำงาน", - "status_error": "เชื่อมต่อไม่สำเร็จ", - "config_tab": "ตั้งค่าด่วน", - "status_label": "สถานะ", - "connections_count": "การเชื่อมต่อ", - "transport_protocol": "โปรโตคอลการรับส่ง", - "transport_type": "ประเภทการรับส่ง", - "mcp_url": "MCP URL", - "port_fallback_title": "พอร์ต {0} ถูกใช้งานอยู่ จึงเปลี่ยนเป็น {1}", - "net_title": "เครือข่าย / พร็อกซี", - "net_direct": "เชื่อมต่อโดยตรง", - "net_via": "ผ่าน {0} ({1})", - "net_source_manual": "กำหนดเอง", - "net_source_env": "ตัวแปรสภาพแวดล้อม", - "net_source_system": "การตั้งค่าระบบ", - "net_mode_auto": "ตรวจหาอัตโนมัติ", - "net_mode_manual": "กำหนดเอง", - "net_mode_off": "ไม่ใช้พร็อกซี", - "net_save": "บันทึก", - "net_test": "ทดสอบการเชื่อมต่อ", - "net_testing": "กำลังทดสอบ…", - "net_test_ok": "เชื่อมต่อได้ ({0} ms)", - "net_test_fail": "เชื่อมต่อไม่ได้: {0}", - "net_hint": "การหมดเวลาเข้าสู่ระบบมักเกิดจากเครือข่าย หากใช้ VPN/พร็อกซี ให้กรอกที่อยู่ (เช่น http://127.0.0.1:7890) หรือสลับโปรแกรมพร็อกซีเป็นโหมดทั่วโลก (TUN)", - "net_pac_warning": "ระบบใช้สคริปต์ PAC ซึ่งปลั๊กอินอ่านไม่ได้ กรุณาเลือก \"กำหนดเอง\" และกรอกที่อยู่พร็อกซี", - "port_label": "พอร์ต", - "auto_start_label": "เริ่มอัตโนมัติ", - "debug_log_label": "บันทึกดีบัก", - "max_connections_label": "จำนวนการเชื่อมต่อสูงสุด", - "server_settings_title": "การตั้งค่าเซิร์ฟเวอร์", - "server_status_title": "สถานะเซิร์ฟเวอร์", - "connection_info_title": "ข้อมูลการเชื่อมต่อ", - "tools_count": "{0} เครื่องมือ", - "tools_stats": "{0} เครื่องมือ ({1} เปิดใช้งาน / {2} ปิดใช้งาน)", - "quick_config_title": "ตั้งค่าไคลเอนต์ MCP อย่างรวดเร็ว", - "quick_config_desc": "กำหนดค่าเซิร์ฟเวอร์ MCP ปัจจุบันลงในโปรแกรมแก้ไข AI และเครื่องมือ CLI ยอดนิยมโดยอัตโนมัติ", - "server_info": "ข้อมูลเซิร์ฟเวอร์", - "server_name_label": "ชื่อเซิร์ฟเวอร์", - "server_address": "ที่อยู่เซิร์ฟเวอร์", - "timeout_ms": "หมดเวลา (มิลลิวินาที)", - "auto_config_title": "กำหนดค่าอัตโนมัติ (โปรแกรมแก้ไข IDE + Codex CLI)", - "add_all": "เพิ่มทั้งหมด", - "remove_all": "ลบทั้งหมด", - "auto_config_note": "คลิกปุ่มเพื่อแก้ไขไฟล์กำหนดค่าโดยอัตโนมัติ (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "กำหนดค่าแล้ว", - "not_configured": "ยังไม่ได้กำหนดค่า", - "auto_config_btn": "กำหนดค่าอัตโนมัติ", - "delete_btn": "ลบ", - "copy_config": "คัดลอกการกำหนดค่า", - "open_config": "เปิดการกำหนดค่า", - "manual_config_title": "กำหนดค่าด้วยตนเอง (Claude CLI + Gemini CLI)", - "refresh_commands": "รีเฟรชคำสั่ง", - "manual_config_note": "เครื่องมือ CLI ต่อไปนี้ต้องรันคำสั่งในเทอร์มินัลด้วยตนเอง", - "config_scope": "ขอบเขตการกำหนดค่า:", - "scope_user": "ระดับผู้ใช้", - "scope_project": "ระดับโปรเจกต์", - "operation_log": "บันทึกการดำเนินการ", - "no_logs": "ไม่มีบันทึกการดำเนินการ", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "อิงตามโปรโตคอล Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "ระบบเครื่องมือ - เครื่องมือระดับเจตนา 13 รายการ, การดำเนินการในโปรแกรมแก้ไขกว่า 150 รายการ, ส่งต่อด้วยรหัส action", - "config_copyright_line1": "ตั้งค่าด่วน - รองรับ Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "โปรดกรอกอีเมลและรหัสเปิดใช้งาน", - "permanent_label": "ถาวร", - "logout_button": "ออกจากระบบ", - "invite_code_label": "รหัสเชิญ", - "copy_button": "คัดลอก", - "change_code_button": "เปลี่ยนรหัส", - "change_code_title": "เปลี่ยนรหัสเปิดใช้งาน", - "change_code_desc": "กรอกรหัสเปิดใช้งานใหม่ของคุณ การผูกอุปกรณ์ปัจจุบันจะถูกยกเลิกก่อน", - "confirm_change": "ยืนยัน", - "cancel": "ยกเลิก", - "code_required": "โปรดกรอกรหัสเปิดใช้งาน", - "expiry_inline_warning": "ใกล้หมดอายุ!", - "store_purchase_hint": "หากคุณซื้อปลั๊กอินนี้จาก Cocos Store โปรดติดต่อผมเพื่อรับรหัสเปิดใช้งาน", - "license_expired_title": "ไลเซนส์หมดอายุ", - "license_expired_message": "ไลเซนส์ของคุณหมดอายุแล้ว จึงไม่สามารถเริ่มเซิร์ฟเวอร์ได้ โปรดต่ออายุหรือเปิดใช้งานใหม่เพื่อดำเนินการต่อ", - "go_to_login": "ไปที่หน้าเข้าสู่ระบบ", - - "log_load_config_failed": "โหลดสถานะการกำหนดค่าไม่สำเร็จ: {0}", - "log_gen_cli_failed": "สร้างคำสั่ง CLI ไม่สำเร็จ: {0}", - "log_add_client_failed": "เพิ่มลงใน {0} ไม่สำเร็จ: {1}", - "log_remove_client_failed": "ลบออกจาก {0} ไม่สำเร็จ: {1}", - "quick_config_dialog_title": "กำหนดค่าด้วยคลิกเดียว", - "config_operation_failed": "การดำเนินการกำหนดค่าไม่สำเร็จ", - "config_file_not_found_changed_path": "กำหนดค่าไม่สำเร็จ: ไม่พบไฟล์กำหนดค่า {0} อาจถูกติดตั้งไว้ในพาธที่กำหนดเอง", - "log_batch_add_failed": "เพิ่มแบบกลุ่มไม่สำเร็จ: {0}", - "log_batch_remove_failed": "ลบแบบกลุ่มไม่สำเร็จ: {0}", - "log_copied_config": "คัดลอกการกำหนดค่า {0} ไปยังคลิปบอร์ดแล้ว", - "log_gen_config_failed": "สร้างการกำหนดค่าไม่สำเร็จ", - "log_copy_config_failed": "คัดลอกการกำหนดค่าไม่สำเร็จ: {0}", - "log_copied_command": "คัดลอกคำสั่ง {0} ไปยังคลิปบอร์ดแล้ว", - "log_copy_command_failed": "คัดลอกคำสั่งไม่สำเร็จ: {0}", - "log_opened_config_file": "เปิดไฟล์กำหนดค่าแล้ว: {0}", - "log_open_config_failed": "เปิดไฟล์กำหนดค่าไม่สำเร็จ", - "log_open_config_error": "เปิดไฟล์กำหนดค่าไม่สำเร็จ: {0}", - - "update_available_title": "มีอัปเดตใหม่", - "update_new_version": "มีเวอร์ชันใหม่ v{0} แล้ว!", - "update_now": "อัปเดตตอนนี้", - "update_not_now": "ไว้ทีหลัง", - "update_skip_version": "ข้าม v{0}", - "check_for_updates": "ตรวจหาอัปเดต", - "update_checking": "กำลังตรวจสอบ...", - "update_no_update": "คุณกำลังใช้เวอร์ชันล่าสุดอยู่แล้ว", - "update_urgency_critical": "อัปเดตเร่งด่วน", - "update_urgency_high": "อัปเดตสำคัญ", - "update_current_version": "เวอร์ชันปัจจุบัน: v{0}", - "update_changelog": "บันทึกการเปลี่ยนแปลง" - ,"update_changelog_empty": "ไม่มีบันทึกการเปลี่ยนแปลงสำหรับเวอร์ชันนี้" - ,"subscription_login_title": "บัญชีสมาชิก VberAI" - ,"subscription_password_label": "รหัสผ่าน" - ,"subscription_password_placeholder": "กรอกรหัสผ่าน" - ,"subscription_login_button": "เข้าสู่ระบบด้วย VberAI" - ,"subscription_google_button": "เข้าสู่ระบบด้วย Google" - ,"subscription_google_pending": "เปิดเบราว์เซอร์แล้ว โปรดทำการอนุญาตผ่าน Google ให้เสร็จ แล้วกลับมาที่ Cocos Creator" - ,"subscription_google_pending_button": "กำลังรอการอนุญาตจาก Google..." - ,"subscription_register_button": "สร้างบัญชี VberAI" - ,"subscription_logging_in": "กำลังเข้าสู่ระบบ..." - ,"subscription_credentials_required": "โปรดกรอกอีเมลและรหัสผ่าน" - ,"subscription_login_success": "เข้าสู่ระบบบัญชีสมาชิกแล้ว" - ,"subscription_login_failed": "เข้าสู่ระบบบัญชีสมาชิกไม่สำเร็จ" - ,"subscription_not_entitled": "การสมัครสมาชิกปัจจุบันของคุณไม่รวม Cocos 3.x MCP โปรดอัปเกรดเพื่อดำเนินการต่อ" - ,"subscription_upgrade_to": "อัปเกรดเป็น {0} เพื่อใช้ผลิตภัณฑ์นี้" - ,"subscription_upgrade_action": "อัปเกรดการสมัครสมาชิก" - ,"subscription_logged_in": "บัญชีที่เข้าสู่ระบบ" - ,"subscription_choose_button": "บัญชีสมาชิก VberAI" - ,"license_choose_button": "รหัสเปิดใช้งาน" - ,"subscription_method_label": "สมาชิก" - ,"back_to_login_choices": "← เลือกวิธีเข้าสู่ระบบอื่น" - ,"subscription_signed_out_other_device": "ออกจากระบบแล้ว: บัญชีของคุณถูกใช้งานบนอุปกรณ์อื่น" - ,"subscription_google_cancelled": "การเข้าสู่ระบบด้วย Google ถูกยกเลิก" - ,"subscription_request_timeout": "คำขอหมดเวลา โปรดตรวจสอบเครือข่ายแล้วลองใหม่อีกครั้ง" - ,"subscription_network_error": "การเชื่อมต่อเครือข่ายล้มเหลว โปรดตรวจสอบเครือข่ายแล้วลองใหม่อีกครั้ง" - ,"subscription_server_error": "เซิร์ฟเวอร์ตอบกลับไม่ถูกต้อง โปรดลองใหม่ภายหลัง" - ,"subscription_google_authorization_failed": "การอนุญาตผ่าน Google ไม่เสร็จสมบูรณ์ โปรดลองใหม่อีกครั้ง" - ,"lan_access_label": "อนุญาตการเข้าถึงผ่าน LAN" - ,"lan_access_warning": "ผูกกับ 0.0.0.0 แล้ว ใครก็ตามในเครือข่ายนี้สามารถเชื่อมต่อและควบคุมโปรแกรมแก้ไขได้ ปลายทางนี้ไม่ตรวจสอบข้อมูลรับรองใด ๆ เปิดใช้เฉพาะในเครือข่ายที่เชื่อถือได้เท่านั้น" - ,"lan_address": "ที่อยู่ LAN" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/tr.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/tr.js deleted file mode 100644 index a693e7b..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/tr.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Cocos Creator 3.8 için AI MCP Sunucusu", - "panel_title": "MCP Sunucusu", - "open_panel": "MCP Panelini Aç", - "start_server": "Sunucuyu Başlat", - "stop_server": "Sunucuyu Durdur", - "server_status": "Sunucu Durumu", - "port": "Bağlantı Noktası", - "settings": "Ayarlar", - "connected": "Bağlandı", - "disconnected": "Bağlantı Kesildi", - "server_running": "Sunucu {0} numaralı bağlantı noktasında çalışıyor", - "server_stopped": "Sunucu durduruldu", - "auto_start": "Otomatik Başlat", - "debug_log": "Hata Ayıklama Günlüğü", - "max_connections": "Maksimum Bağlantı", - "connection_info": "Bağlantı Bilgisi", - "http_url": "HTTP URL", - "copy": "Kopyala", - "save_settings": "Ayarları Kaydet", - "settings_saved": "Ayarlar başarıyla kaydedildi", - "server_started": "MCP Sunucusu Başlatıldı", - "server_stopped_msg": "MCP Sunucusu Durduruldu", - "failed_to_start": "Sunucu başlatılamadı", - "failed_to_stop": "Sunucu durdurulamadı", - "failed_to_save": "Ayarlar kaydedilemedi", - "url_copied": "HTTP URL panoya kopyalandı", - "tool_manager": "Araç Yöneticisi", - "open_tool_manager": "Araç Yöneticisini Aç", - "create_config": "Yapılandırma Oluştur", - "edit_config": "Yapılandırmayı Düzenle", - "delete_config": "Yapılandırmayı Sil", - "import_config": "Yapılandırma İçe Aktar", - "export_config": "Yapılandırma Dışa Aktar", - "apply_config": "Yapılandırmayı Uygula", - "select_all": "Tümünü Seç", - "deselect_all": "Tüm Seçimi Kaldır", - "save_changes": "Değişiklikleri Kaydet", - "config_name": "Yapılandırma Adı", - "config_description": "Yapılandırma Açıklaması", - "current_config": "Geçerli Yapılandırma", - "tool_management": "Araç Yönetimi", - "total_tools": "Toplam Araç", - "enabled_tools": "Etkin", - "disabled_tools": "Devre Dışı", - "no_config_selected": "Yapılandırma Seçilmedi", - "select_config_first": "Lütfen önce bir yapılandırma seçin veya yeni bir tane oluşturun", - "config_created": "Yapılandırma başarıyla oluşturuldu", - "config_updated": "Yapılandırma başarıyla güncellendi", - "config_deleted": "Yapılandırma başarıyla silindi", - "config_applied": "Yapılandırma başarıyla uygulandı", - "config_exported": "Yapılandırma başarıyla dışa aktarıldı", - "config_imported": "Yapılandırma başarıyla içe aktarıldı", - "confirm_delete": "Silmeyi Onayla", - "delete_config_confirm": "\"{0}\" yapılandırmasını silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.", - "max_config_slots_reached": "Maksimum yapılandırma yuvası sayısına ulaşıldı ({0})", - "invalid_config_format": "Geçersiz yapılandırma biçimi", - "invalid_json_format": "Geçersiz JSON biçimi veya yapılandırma yapısı", - "server_tab": "Sunucu", - "tools_tab": "Araç Yönetimi", - "available_tools": "Kullanılabilir Araçlar", - "scene_tools": "Sahne Araçları", - "node_tools": "Düğüm Araçları", - "component_tools": "Bileşen Araçları", - "prefab_tools": "Prefab Araçları", - "project_tools": "Proje Araçları", - "debug_tools": "Hata Ayıklama Araçları", - "preferences_tools": "Tercihler", - "server_tools": "Sunucu Araçları", - "broadcast_tools": "Yayın Araçları", - "scene_advanced_tools": "Gelişmiş Sahne Araçları", - "scene_view_tools": "Sahne Görünümü Araçları", - "reference_image_tools": "Referans Görsel Araçları", - "asset_advanced_tools": "Gelişmiş Varlık Araçları", - "validation_tools": "Doğrulama Araçları", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "E-posta", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Makine Kimliği", - "purchase_renew": "Satın Al / Yenile", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Bir oturum açma yöntemi seçin", - "auth_subtitle": "E-postanızı ve etkinleştirme kodunuzu girin", - "auth_choose_subtitle": "Devam etmek için bir oturum açma yöntemi seçin", - "email_label": "E-posta Adresi", - "activation_code_label": "Etkinleştirme Kodu", - "email_placeholder": "E-posta girin", - "code_placeholder": "Kodu girin (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Etkinleştir", - "deactivate_button": "Devre Dışı Bırak", - "activating": "Etkinleştiriliyor...", - "deactivating": "Devre dışı bırakılıyor...", - "license_status": "Lisans Durumu", - "license_type": "Lisans Türü", - "expiry_date": "Son Kullanma Tarihi", - "days_remaining": "Kalan Gün", - "days_unit": "gün", - "permanent": "Kalıcı", - "expiry_warning_title": "Lisansın Süresi Yakında Doluyor", - "expiry_warning_message": "Lisansınızın süresi {0} gün içinde dolacak. Hizmet kesintisini önlemek için lütfen yenileyin.", - "renew_now": "Şimdi Yenile", - "i_understand": "Anladım", - "activation_success": "Lisans başarıyla etkinleştirildi!", - "activation_failed": "Etkinleştirme başarısız: {0}", - "invalid_code": "Geçersiz etkinleştirme kodu biçimi", - "purchase_license": "Lisans Satın Al", - "renew_license": "Lisansı Yenile", - "contact_support": "Destek", - "language_switch": "Türkçe", - "version_label": "Sürüm", - "license_required": "Sunucuyu başlatmak için lisans gerekli", - "license_check_failed": "Lisans denetimi başarısız", - - "status_stopped": "Durduruldu", - "status_running": "Çalışıyor", - "status_error": "Bağlantı Başarısız", - "config_tab": "Hızlı Yapılandırma", - "status_label": "Durum", - "connections_count": "Bağlantılar", - "transport_protocol": "Aktarım Protokolü", - "transport_type": "Aktarım Türü", - "mcp_url": "MCP URL", - "port_fallback_title": "Port {0} kullanımda — {1} portuna geçildi", - "net_title": "Ağ / Proxy", - "net_direct": "Doğrudan bağlantı", - "net_via": "{0} üzerinden ({1})", - "net_source_manual": "elle", - "net_source_env": "ortam değişkeni", - "net_source_system": "sistem ayarları", - "net_mode_auto": "Otomatik algıla", - "net_mode_manual": "Elle", - "net_mode_off": "Proxy yok", - "net_save": "Kaydet", - "net_test": "Bağlantıyı test et", - "net_testing": "Test ediliyor…", - "net_test_ok": "Bağlandı ({0} ms)", - "net_test_fail": "Başarısız: {0}", - "net_hint": "Oturum açma zaman aşımları genellikle ağ kaynaklıdır. VPN/proxy kullanıyorsanız adresini buraya girin (örn. http://127.0.0.1:7890) ya da istemciyi global (TUN) moda alın.", - "net_pac_warning": "Sistem, bu eklentinin çözemediği bir PAC betiği kullanıyor. Elle moduna geçip proxy adresini girin.", - "port_label": "Bağlantı Noktası", - "auto_start_label": "Otomatik Başlat", - "debug_log_label": "Hata Ayıklama Günlüğü", - "max_connections_label": "Maksimum Bağlantı", - "server_settings_title": "Sunucu Ayarları", - "server_status_title": "Sunucu Durumu", - "connection_info_title": "Bağlantı Bilgisi", - "tools_count": "{0} araç", - "tools_stats": "{0} araç ({1} etkin / {2} devre dışı)", - "quick_config_title": "MCP İstemcilerini Hızlı Yapılandır", - "quick_config_desc": "Geçerli MCP sunucusunu yaygın AI editörlerine ve CLI araçlarına otomatik olarak yapılandırın", - "server_info": "Sunucu Bilgisi", - "server_name_label": "Sunucu Adı", - "server_address": "Sunucu Adresi", - "timeout_ms": "Zaman Aşımı (ms)", - "auto_config_title": "Otomatik Yapılandırma (IDE Editörleri + Codex CLI)", - "add_all": "Tümünü Ekle", - "remove_all": "Tümünü Kaldır", - "auto_config_note": "Yapılandırma dosyalarını otomatik değiştirmek için düğmeye tıklayın (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Yapılandırıldı", - "not_configured": "Yapılandırılmadı", - "auto_config_btn": "Otomatik Yapılandır", - "delete_btn": "Sil", - "copy_config": "Yapılandırmayı Kopyala", - "open_config": "Yapılandırmayı Aç", - "manual_config_title": "Manuel Yapılandırma (Claude CLI + Gemini CLI)", - "refresh_commands": "Komutları Yenile", - "manual_config_note": "Aşağıdaki CLI araçları için terminal komutlarının elle çalıştırılması gerekir", - "config_scope": "Yapılandırma Kapsamı:", - "scope_user": "Kullanıcı Düzeyi", - "scope_project": "Proje Düzeyi", - "operation_log": "İşlem Günlüğü", - "no_logs": "İşlem kaydı yok", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Streamable HTTP Protokolü temellidir (MCP 2025-03-26)", - "tools_copyright_line1": "Araç Sistemi - 13 amaç düzeyinde araç, 150+ editör işlemi, action kodu ile dağıtım", - "config_copyright_line1": "Hızlı Yapılandırma - Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI desteklenir", - "email_required": "Lütfen e-posta ve etkinleştirme kodunu girin", - "permanent_label": "Kalıcı", - "logout_button": "Çıkış Yap", - "invite_code_label": "Davet Kodu", - "copy_button": "Kopyala", - "change_code_button": "Kodu Değiştir", - "change_code_title": "Etkinleştirme Kodunu Değiştir", - "change_code_desc": "Yeni etkinleştirme kodunuzu girin. Geçerli cihaz bağlaması önce serbest bırakılacaktır.", - "confirm_change": "Onayla", - "cancel": "İptal", - "code_required": "Lütfen bir etkinleştirme kodu girin", - "expiry_inline_warning": "Süresi yakında doluyor!", - "store_purchase_hint": "Bu eklentiyi Cocos Store'dan satın aldıysanız, etkinleştirme kodunuzu almak için lütfen benimle iletişime geçin.", - "license_expired_title": "Lisansın Süresi Doldu", - "license_expired_message": "Lisansınızın süresi doldu ve sunucu başlatılamıyor. Devam etmek için lütfen yenileyin veya yeniden etkinleştirin.", - "go_to_login": "Oturum Açmaya Git", - - "log_load_config_failed": "Yapılandırma durumu yüklenemedi: {0}", - "log_gen_cli_failed": "CLI komutları oluşturulamadı: {0}", - "log_add_client_failed": "{0} öğesine eklenemedi: {1}", - "log_remove_client_failed": "{0} öğesinden kaldırılamadı: {1}", - "quick_config_dialog_title": "Tek Tıkla Yapılandırma", - "config_operation_failed": "Yapılandırma işlemi başarısız", - "config_file_not_found_changed_path": "Yapılandırma başarısız: yapılandırma dosyası bulunamadı. {0} özel bir yola kurulmuş olabilir.", - "log_batch_add_failed": "Toplu ekleme başarısız: {0}", - "log_batch_remove_failed": "Toplu kaldırma başarısız: {0}", - "log_copied_config": "{0} yapılandırması panoya kopyalandı", - "log_gen_config_failed": "Yapılandırma oluşturulamadı", - "log_copy_config_failed": "Yapılandırma kopyalanamadı: {0}", - "log_copied_command": "{0} komutu panoya kopyalandı", - "log_copy_command_failed": "Komut kopyalanamadı: {0}", - "log_opened_config_file": "Yapılandırma dosyası açıldı: {0}", - "log_open_config_failed": "Yapılandırma dosyası açılamadı", - "log_open_config_error": "Yapılandırma dosyası açılamadı: {0}", - - "update_available_title": "Güncelleme Mevcut", - "update_new_version": "Yeni sürüm v{0} yayınlandı!", - "update_now": "Şimdi Güncelle", - "update_not_now": "Şimdi Değil", - "update_skip_version": "v{0} sürümünü atla", - "check_for_updates": "Güncellemeleri Denetle", - "update_checking": "Denetleniyor...", - "update_no_update": "En son sürümü kullanıyorsunuz", - "update_urgency_critical": "Kritik Güncelleme", - "update_urgency_high": "Önemli Güncelleme", - "update_current_version": "Geçerli sürüm: v{0}", - "update_changelog": "Değişiklik Günlüğü" - ,"update_changelog_empty": "Bu sürüm için sürüm notu sağlanmadı." - ,"subscription_login_title": "VberAI abonelik hesabı" - ,"subscription_password_label": "Parola" - ,"subscription_password_placeholder": "Parolayı girin" - ,"subscription_login_button": "VberAI ile oturum aç" - ,"subscription_google_button": "Google ile oturum aç" - ,"subscription_google_pending": "Tarayıcı açıldı. Google yetkilendirmesini tamamlayın, ardından Cocos Creator'a dönün." - ,"subscription_google_pending_button": "Google yetkilendirmesi bekleniyor..." - ,"subscription_register_button": "VberAI hesabı oluştur" - ,"subscription_logging_in": "Oturum açılıyor..." - ,"subscription_credentials_required": "Lütfen e-posta ve parolayı girin" - ,"subscription_login_success": "Abonelik hesabıyla oturum açıldı" - ,"subscription_login_failed": "Abonelik oturum açma başarısız" - ,"subscription_not_entitled": "Mevcut aboneliğiniz Cocos 3.x MCP'yi içermiyor. Devam etmek için yükseltin." - ,"subscription_upgrade_to": "Bu ürünü kullanmak için {0} planına yükseltin" - ,"subscription_upgrade_action": "Aboneliği yükselt" - ,"subscription_logged_in": "Oturum açılan hesap" - ,"subscription_choose_button": "VberAI abonelik hesabı" - ,"license_choose_button": "Etkinleştirme kodu" - ,"subscription_method_label": "Abonelik" - ,"back_to_login_choices": "← Başka bir oturum açma yöntemi seç" - ,"subscription_signed_out_other_device": "Oturum kapatıldı: hesabınız başka bir cihazda kullanıldı." - ,"subscription_google_cancelled": "Google ile oturum açma iptal edildi." - ,"subscription_request_timeout": "İstek zaman aşımına uğradı. Ağınızı denetleyip yeniden deneyin." - ,"subscription_network_error": "Ağ bağlantısı başarısız. Ağınızı denetleyip yeniden deneyin." - ,"subscription_server_error": "Sunucu geçersiz bir yanıt döndürdü. Daha sonra yeniden deneyin." - ,"subscription_google_authorization_failed": "Google yetkilendirmesi tamamlanmadı. Lütfen yeniden deneyin." - ,"lan_access_label": "Yerel ağ erişimine izin ver" - ,"lan_access_warning": "0.0.0.0 adresine bağlandı. Bu ağdaki herkes bağlanıp editörü kullanabilir — bu uç nokta hiçbir kimlik bilgisini doğrulamaz. Yalnızca güvendiğiniz ağlarda etkinleştirin." - ,"lan_address": "Yerel ağ adresi" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/vi.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/vi.js deleted file mode 100644 index 3f1f3b4..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/vi.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP Server", - "description": "Máy chủ AI MCP cho Cocos Creator 3.8", - "panel_title": "Máy chủ MCP", - "open_panel": "Mở bảng điều khiển MCP", - "start_server": "Khởi động máy chủ", - "stop_server": "Dừng máy chủ", - "server_status": "Trạng thái máy chủ", - "port": "Cổng", - "settings": "Cài đặt", - "connected": "Đã kết nối", - "disconnected": "Đã ngắt kết nối", - "server_running": "Máy chủ đang chạy trên cổng {0}", - "server_stopped": "Máy chủ đã dừng", - "auto_start": "Tự động khởi động", - "debug_log": "Ghi nhật ký gỡ lỗi", - "max_connections": "Số kết nối tối đa", - "connection_info": "Thông tin kết nối", - "http_url": "HTTP URL", - "copy": "Sao chép", - "save_settings": "Lưu cài đặt", - "settings_saved": "Đã lưu cài đặt thành công", - "server_started": "Máy chủ MCP đã khởi động", - "server_stopped_msg": "Máy chủ MCP đã dừng", - "failed_to_start": "Không thể khởi động máy chủ", - "failed_to_stop": "Không thể dừng máy chủ", - "failed_to_save": "Không thể lưu cài đặt", - "url_copied": "Đã sao chép HTTP URL vào bảng nhớ tạm", - "tool_manager": "Trình quản lý công cụ", - "open_tool_manager": "Mở trình quản lý công cụ", - "create_config": "Tạo cấu hình", - "edit_config": "Chỉnh sửa cấu hình", - "delete_config": "Xóa cấu hình", - "import_config": "Nhập cấu hình", - "export_config": "Xuất cấu hình", - "apply_config": "Áp dụng cấu hình", - "select_all": "Chọn tất cả", - "deselect_all": "Bỏ chọn tất cả", - "save_changes": "Lưu thay đổi", - "config_name": "Tên cấu hình", - "config_description": "Mô tả cấu hình", - "current_config": "Cấu hình hiện tại", - "tool_management": "Quản lý công cụ", - "total_tools": "Tổng số công cụ", - "enabled_tools": "Đã bật", - "disabled_tools": "Đã tắt", - "no_config_selected": "Chưa chọn cấu hình", - "select_config_first": "Vui lòng chọn một cấu hình hoặc tạo cấu hình mới trước", - "config_created": "Đã tạo cấu hình thành công", - "config_updated": "Đã cập nhật cấu hình thành công", - "config_deleted": "Đã xóa cấu hình thành công", - "config_applied": "Đã áp dụng cấu hình thành công", - "config_exported": "Đã xuất cấu hình thành công", - "config_imported": "Đã nhập cấu hình thành công", - "confirm_delete": "Xác nhận xóa", - "delete_config_confirm": "Bạn có chắc chắn muốn xóa cấu hình \"{0}\" không? Hành động này không thể hoàn tác.", - "max_config_slots_reached": "Đã đạt số lượng vị trí cấu hình tối đa ({0})", - "invalid_config_format": "Định dạng cấu hình không hợp lệ", - "invalid_json_format": "Định dạng JSON hoặc cấu trúc cấu hình không hợp lệ", - "server_tab": "Máy chủ", - "tools_tab": "Quản lý công cụ", - "available_tools": "Công cụ khả dụng", - "scene_tools": "Công cụ cảnh", - "node_tools": "Công cụ nút", - "component_tools": "Công cụ thành phần", - "prefab_tools": "Công cụ Prefab", - "project_tools": "Công cụ dự án", - "debug_tools": "Công cụ gỡ lỗi", - "preferences_tools": "Tùy chọn", - "server_tools": "Công cụ máy chủ", - "broadcast_tools": "Công cụ quảng bá", - "scene_advanced_tools": "Công cụ cảnh nâng cao", - "scene_view_tools": "Công cụ khung nhìn cảnh", - "reference_image_tools": "Công cụ ảnh tham chiếu", - "asset_advanced_tools": "Công cụ tài nguyên nâng cao", - "validation_tools": "Công cụ kiểm tra", - "brand_name": "LiDaxian MCP Series", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "Email", - "contact_wechat": "WeChat", - "contact_github": "GitHub", - "machine_id_label": "Mã máy", - "purchase_renew": "Mua / Gia hạn", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "Chọn phương thức đăng nhập", - "auth_subtitle": "Nhập email và mã kích hoạt của bạn", - "email_label": "Địa chỉ email", - "activation_code_label": "Mã kích hoạt", - "email_placeholder": "Nhập email", - "code_placeholder": "Nhập mã (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "Kích hoạt", - "deactivate_button": "Hủy kích hoạt", - "activating": "Đang kích hoạt...", - "deactivating": "Đang hủy kích hoạt...", - "license_status": "Trạng thái giấy phép", - "license_type": "Loại giấy phép", - "expiry_date": "Ngày hết hạn", - "days_remaining": "Số ngày còn lại", - "days_unit": "ngày", - "permanent": "Vĩnh viễn", - "expiry_warning_title": "Giấy phép sắp hết hạn", - "expiry_warning_message": "Giấy phép của bạn sẽ hết hạn sau {0} ngày. Vui lòng gia hạn để tránh gián đoạn dịch vụ.", - "renew_now": "Gia hạn ngay", - "i_understand": "Tôi đã hiểu", - "activation_success": "Đã kích hoạt giấy phép thành công!", - "activation_failed": "Kích hoạt thất bại: {0}", - "invalid_code": "Định dạng mã kích hoạt không hợp lệ", - "purchase_license": "Mua giấy phép", - "renew_license": "Gia hạn giấy phép", - "contact_support": "Hỗ trợ", - "language_switch": "Tiếng Việt", - "version_label": "Phiên bản", - "license_required": "Cần có giấy phép để khởi động máy chủ", - "license_check_failed": "Kiểm tra giấy phép thất bại", - - "status_stopped": "Đã dừng", - "status_running": "Đang chạy", - "status_error": "Kết nối thất bại", - "config_tab": "Cấu hình nhanh", - "status_label": "Trạng thái", - "connections_count": "Số kết nối", - "transport_protocol": "Giao thức truyền tải", - "transport_type": "Loại truyền tải", - "mcp_url": "MCP URL", - "port_fallback_title": "Cổng {0} đang bận — đã chuyển sang {1}", - "net_title": "Mạng / Proxy", - "net_direct": "Kết nối trực tiếp", - "net_via": "qua {0} ({1})", - "net_source_manual": "thủ công", - "net_source_env": "biến môi trường", - "net_source_system": "cài đặt hệ thống", - "net_mode_auto": "Tự động", - "net_mode_manual": "Chỉ định thủ công", - "net_mode_off": "Không dùng proxy", - "net_save": "Lưu", - "net_test": "Kiểm tra kết nối", - "net_testing": "Đang kiểm tra…", - "net_test_ok": "Kết nối thành công ({0} ms)", - "net_test_fail": "Thất bại: {0}", - "net_hint": "Lỗi hết thời gian đăng nhập thường do mạng. Nếu dùng VPN/proxy, hãy nhập địa chỉ (ví dụ http://127.0.0.1:7890) hoặc chuyển ứng dụng proxy sang chế độ toàn cục (TUN).", - "net_pac_warning": "Hệ thống dùng script PAC tự động mà plugin không đọc được. Hãy chọn \"Chỉ định thủ công\" và nhập địa chỉ proxy.", - "port_label": "Cổng", - "auto_start_label": "Tự động khởi động", - "debug_log_label": "Nhật ký gỡ lỗi", - "max_connections_label": "Số kết nối tối đa", - "server_settings_title": "Cài đặt máy chủ", - "server_status_title": "Trạng thái máy chủ", - "connection_info_title": "Thông tin kết nối", - "tools_count": "{0} công cụ", - "tools_stats": "{0} công cụ ({1} đã bật / {2} đã tắt)", - "quick_config_title": "Cấu hình nhanh máy khách MCP", - "quick_config_desc": "Tự động cấu hình máy chủ MCP hiện tại vào các trình soạn thảo AI phổ biến và công cụ CLI", - "server_info": "Thông tin máy chủ", - "server_name_label": "Tên máy chủ", - "server_address": "Địa chỉ máy chủ", - "timeout_ms": "Thời gian chờ (ms)", - "auto_config_title": "Cấu hình tự động (Trình soạn thảo IDE + Codex CLI)", - "add_all": "Thêm tất cả", - "remove_all": "Xóa tất cả", - "auto_config_note": "Nhấp nút để tự động sửa đổi tệp cấu hình (Cursor, Windsurf, Trae, Codex CLI)", - "configured": "Đã cấu hình", - "not_configured": "Chưa cấu hình", - "auto_config_btn": "Cấu hình tự động", - "delete_btn": "Xóa", - "copy_config": "Sao chép cấu hình", - "open_config": "Mở cấu hình", - "manual_config_title": "Cấu hình thủ công (Claude CLI + Gemini CLI)", - "refresh_commands": "Làm mới lệnh", - "manual_config_note": "Các công cụ CLI sau đây cần thực thi lệnh thủ công trong terminal", - "config_scope": "Phạm vi cấu hình:", - "scope_user": "Cấp người dùng", - "scope_project": "Cấp dự án", - "operation_log": "Nhật ký thao tác", - "no_logs": "Không có bản ghi thao tác", - "copyright_line": "© 2025 LiDaxian - Cocos Creator MCP Server v{0}", - "protocol_line": "Dựa trên giao thức Streamable HTTP (MCP 2025-03-26)", - "tools_copyright_line1": "Hệ thống công cụ - 13 công cụ cấp ý định, 150+ thao tác trình soạn thảo, điều phối mã action", - "config_copyright_line1": "Cấu hình nhanh - Hỗ trợ Cursor, Windsurf, Trae, Codex CLI, Claude CLI, Gemini CLI", - "email_required": "Vui lòng nhập email và mã kích hoạt", - "permanent_label": "Vĩnh viễn", - "logout_button": "Đăng xuất", - "invite_code_label": "Mã mời", - "copy_button": "Sao chép", - "change_code_button": "Thay đổi mã", - "change_code_title": "Thay đổi mã kích hoạt", - "change_code_desc": "Nhập mã kích hoạt mới của bạn. Liên kết thiết bị hiện tại sẽ được giải phóng trước.", - "confirm_change": "Xác nhận", - "cancel": "Hủy", - "code_required": "Vui lòng nhập mã kích hoạt", - "expiry_inline_warning": "Sắp hết hạn!", - "store_purchase_hint": "Nếu bạn đã mua plugin này từ Cocos Store, vui lòng liên hệ với tôi để nhận mã kích hoạt.", - "license_expired_title": "Giấy phép đã hết hạn", - "license_expired_message": "Giấy phép của bạn đã hết hạn và không thể khởi động máy chủ. Vui lòng gia hạn hoặc kích hoạt lại để tiếp tục.", - "go_to_login": "Đi đến đăng nhập", - - "log_load_config_failed": "Không thể tải trạng thái cấu hình: {0}", - "log_gen_cli_failed": "Không thể tạo lệnh CLI: {0}", - "log_add_client_failed": "Không thể thêm vào {0}: {1}", - "log_remove_client_failed": "Không thể xóa khỏi {0}: {1}", - "quick_config_dialog_title": "Cấu hình một chạm", - "config_operation_failed": "Thao tác cấu hình thất bại", - "config_file_not_found_changed_path": "Cấu hình thất bại: không tìm thấy tệp cấu hình. {0} có thể được cài đặt trong một đường dẫn tùy chỉnh.", - "log_batch_add_failed": "Thêm hàng loạt thất bại: {0}", - "log_batch_remove_failed": "Xóa hàng loạt thất bại: {0}", - "log_copied_config": "Đã sao chép cấu hình {0} vào bảng nhớ tạm", - "log_gen_config_failed": "Không thể tạo cấu hình", - "log_copy_config_failed": "Không thể sao chép cấu hình: {0}", - "log_copied_command": "Đã sao chép lệnh {0} vào bảng nhớ tạm", - "log_copy_command_failed": "Không thể sao chép lệnh: {0}", - "log_opened_config_file": "Đã mở tệp cấu hình: {0}", - "log_open_config_failed": "Không thể mở tệp cấu hình", - "log_open_config_error": "Không thể mở tệp cấu hình: {0}", - - "update_available_title": "Có bản cập nhật", - "update_new_version": "Đã có phiên bản mới v{0}!", - "update_now": "Cập nhật ngay", - "update_not_now": "Để sau", - "update_skip_version": "Bỏ qua v{0}", - "check_for_updates": "Kiểm tra cập nhật", - "update_checking": "Đang kiểm tra...", - "update_no_update": "Bạn đang sử dụng phiên bản mới nhất", - "update_urgency_critical": "Cập nhật khẩn cấp", - "update_urgency_high": "Cập nhật quan trọng", - "update_current_version": "Phiên bản hiện tại: v{0}", - "update_changelog": "Nhật ký thay đổi", - "auth_choose_subtitle": "Chọn một phương thức đăng nhập để tiếp tục", - "update_changelog_empty": "Không có ghi chú phát hành cho phiên bản này.", - "subscription_login_title": "Tài khoản đăng ký VberAI", - "subscription_password_label": "Mật khẩu", - "subscription_password_placeholder": "Nhập mật khẩu", - "subscription_login_button": "Đăng nhập bằng VberAI", - "subscription_google_button": "Đăng nhập bằng Google", - "subscription_google_pending": "Đã mở trình duyệt. Hoàn tất ủy quyền Google rồi quay lại Cocos Creator.", - "subscription_google_pending_button": "Đang chờ ủy quyền Google...", - "subscription_register_button": "Tạo tài khoản VberAI", - "subscription_logging_in": "Đang đăng nhập...", - "subscription_credentials_required": "Vui lòng nhập email và mật khẩu", - "subscription_login_success": "Đã đăng nhập tài khoản đăng ký", - "subscription_login_failed": "Đăng nhập đăng ký thất bại", - "subscription_not_entitled": "Gói đăng ký hiện tại của bạn không bao gồm Cocos 3.x MCP. Nâng cấp để tiếp tục.", - "subscription_upgrade_to": "Nâng cấp lên \"{0}\" để sử dụng sản phẩm này", - "subscription_upgrade_action": "Nâng cấp gói đăng ký", - "subscription_logged_in": "Tài khoản đã đăng nhập", - "subscription_choose_button": "Tài khoản đăng ký VberAI", - "license_choose_button": "Mã kích hoạt", - "subscription_method_label": "Đăng ký", - "back_to_login_choices": "← Chọn phương thức đăng nhập khác", - "subscription_signed_out_other_device": "Đã đăng xuất: tài khoản của bạn đã được dùng trên thiết bị khác.", - "subscription_google_cancelled": "Đã hủy đăng nhập Google.", - "subscription_request_timeout": "Yêu cầu đã hết thời gian. Kiểm tra mạng và thử lại.", - "subscription_network_error": "Kết nối mạng thất bại. Kiểm tra mạng và thử lại.", - "subscription_server_error": "Máy chủ trả về phản hồi không hợp lệ. Thử lại sau.", - "subscription_google_authorization_failed": "Ủy quyền Google chưa hoàn tất. Vui lòng thử lại." - ,"lan_access_label": "Cho phép truy cập LAN" - ,"lan_access_warning": "Đã gắn vào 0.0.0.0. Bất kỳ ai trong mạng này đều có thể kết nối và điều khiển trình biên tập — điểm cuối này không xác minh thông tin đăng nhập nào. Chỉ bật trong mạng đáng tin cậy." - ,"lan_address": "Địa chỉ LAN" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh-TW.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh-TW.js deleted file mode 100644 index d72aa81..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh-TW.js +++ /dev/null @@ -1,259 +0,0 @@ -"use strict"; - -module.exports = { - "extension_name": "Cocos MCP 伺服器", - "description": "適用於 Cocos Creator 3.8 的 AI MCP 伺服器", - "panel_title": "MCP 伺服器", - "open_panel": "開啟 MCP 面板", - "start_server": "啟動伺服器", - "stop_server": "停止伺服器", - "server_status": "伺服器狀態", - "port": "連接埠", - "settings": "設定", - "connected": "已連線", - "disconnected": "未連線", - "server_running": "伺服器正在連接埠 {0} 上執行", - "server_stopped": "伺服器已停止", - "auto_start": "自動啟動", - "debug_log": "除錯日誌", - "max_connections": "最大連線數", - "connection_info": "連線資訊", - "http_url": "HTTP 位址", - "copy": "複製", - "save_settings": "儲存設定", - "settings_saved": "設定儲存成功", - "server_started": "MCP 伺服器已啟動", - "server_stopped_msg": "MCP 伺服器已停止", - "failed_to_start": "啟動伺服器失敗", - "failed_to_stop": "停止伺服器失敗", - "failed_to_save": "儲存設定失敗", - "url_copied": "HTTP 位址已複製到剪貼簿", - "tool_manager": "工具管理員", - "open_tool_manager": "開啟工具管理員", - "create_config": "新增設定", - "edit_config": "編輯設定", - "delete_config": "刪除設定", - "import_config": "匯入設定", - "export_config": "匯出設定", - "apply_config": "套用設定", - "select_all": "全選", - "deselect_all": "取消全選", - "save_changes": "儲存變更", - "config_name": "設定名稱", - "config_description": "設定描述", - "current_config": "目前設定", - "tool_management": "工具管理", - "total_tools": "工具總數", - "enabled_tools": "已啟用", - "disabled_tools": "已停用", - "no_config_selected": "尚未選擇設定", - "select_config_first": "請先選擇一個設定,或建立新的設定", - "config_created": "設定建立成功", - "config_updated": "設定更新成功", - "config_deleted": "設定刪除成功", - "config_applied": "設定套用成功", - "config_exported": "設定匯出成功", - "config_imported": "設定匯入成功", - "confirm_delete": "確認刪除", - "delete_config_confirm": "確定要刪除設定 \"{0}\" 嗎?此操作無法復原。", - "max_config_slots_reached": "已達到最大設定插槽數量 ({0})", - "invalid_config_format": "無效的設定格式", - "invalid_json_format": "無效的 JSON 格式或設定結構", - "server_tab": "伺服器", - "tools_tab": "工具管理", - "available_tools": "可用工具", - "scene_tools": "場景工具", - "node_tools": "節點工具", - "component_tools": "元件工具", - "prefab_tools": "預製件工具", - "project_tools": "專案工具", - "debug_tools": "除錯工具", - "preferences_tools": "偏好設定", - "server_tools": "伺服器工具", - "broadcast_tools": "廣播工具", - "scene_advanced_tools": "進階場景工具", - "scene_view_tools": "場景檢視工具", - "reference_image_tools": "參考圖片工具", - "asset_advanced_tools": "進階資源工具", - "validation_tools": "驗證工具", - "brand_name": "李大仙 MCP 系列", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "電子郵件", - "contact_wechat": "微信", - "contact_github": "GitHub", - "machine_id_label": "機器碼", - "purchase_renew": "購買/續約", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "選擇登入方式", - "auth_subtitle": "請輸入您的電子郵件與啟用碼", - "auth_choose_subtitle": "請選擇一種登入方式以繼續", - "email_label": "電子郵件位址", - "activation_code_label": "啟用碼", - "email_placeholder": "請輸入電子郵件", - "code_placeholder": "請輸入啟用碼 (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "啟用", - "deactivate_button": "取消啟用", - "activating": "啟用中...", - "deactivating": "取消啟用中...", - "license_status": "授權狀態", - "license_type": "授權類型", - "expiry_date": "到期日期", - "days_remaining": "剩餘天數", - "days_unit": "天", - "permanent": "永久", - "expiry_warning_title": "授權即將到期", - "expiry_warning_message": "您的授權將在 {0} 天後到期,請及時續約以確保服務不中斷。", - "renew_now": "立即續約", - "i_understand": "我知道了", - "activation_success": "授權啟用成功!", - "activation_failed": "啟用失敗:{0}", - "invalid_code": "無效的啟用碼格式", - "purchase_license": "購買授權", - "renew_license": "續約授權", - "contact_support": "技術支援", - "language_switch": "繁體中文", - "version_label": "版本", - "license_required": "需要授權才能啟動伺服器", - "license_check_failed": "授權檢查失敗", - - "status_stopped": "已停止", - "status_running": "執行中", - "status_error": "連線失敗", - "config_tab": "一鍵設定", - "status_label": "狀態", - "connections_count": "連線數", - "transport_protocol": "傳輸協定", - "transport_type": "傳輸類型", - "mcp_url": "MCP URL", - "port_fallback_title": "連接埠 {0} 被佔用,已自動改用 {1}", - "net_title": "網路 / 代理", - "net_direct": "直連", - "net_via": "經 {0}({1})", - "net_source_manual": "手動填寫", - "net_source_env": "環境變數", - "net_source_system": "系統設定", - "net_mode_auto": "自動偵測", - "net_mode_manual": "手動指定", - "net_mode_off": "不使用代理", - "net_save": "儲存", - "net_test": "測試連線", - "net_testing": "測試中…", - "net_test_ok": "連線正常({0} ms)", - "net_test_fail": "連線失敗:{0}", - "net_hint": "登入逾時多半是網路問題:伺服器在境外,若你在用 VPN/代理,請在此填寫代理位址(如 http://127.0.0.1:7890),或把代理軟體切到全域(TUN)模式。", - "net_pac_warning": "系統使用了 PAC 自動設定指令碼,外掛無法解析。請改為「手動指定」並填寫代理位址。", - "port_label": "連接埠", - "auto_start_label": "自動啟動", - "debug_log_label": "除錯日誌", - "max_connections_label": "最大連線數", - "server_settings_title": "伺服器設定", - "server_status_title": "伺服器狀態", - "connection_info_title": "連線資訊", - "tools_count": "{0} 個工具", - "tools_stats": "{0} 個工具 ({1} 啟用 / {2} 停用)", - "quick_config_title": "一鍵設定 MCP 用戶端", - "quick_config_desc": "自動將目前的 MCP 伺服器設定到主流 AI 編輯器與 CLI 工具中", - "server_info": "伺服器資訊", - "server_name_label": "伺服器名稱", - "server_address": "伺服器位址", - "timeout_ms": "逾時時間(ms)", - "auto_config_title": "自動設定 (IDE 編輯器 + Codex CLI)", - "add_all": "全部新增", - "remove_all": "全部刪除", - "auto_config_note": "點擊按鈕將自動修改設定檔(包括 Cursor、Windsurf、Trae、Codex CLI)", - "configured": "已設定", - "not_configured": "未設定", - "auto_config_btn": "自動設定", - "delete_btn": "刪除", - "copy_config": "複製設定", - "open_config": "開啟設定", - "manual_config_title": "手動設定 (Claude CLI + Gemini CLI)", - "refresh_commands": "重新整理指令", - "manual_config_note": "以下 CLI 工具需要在終端機中手動執行指令進行設定", - "config_scope": "設定範圍:", - "scope_user": "使用者層級", - "scope_project": "專案層級", - "operation_log": "操作日誌", - "no_logs": "目前沒有操作紀錄", - "copyright_line": "© 2025 李大仙 (LiDaxian) - Cocos Creator MCP Server v{0}", - "protocol_line": "基於 Streamable HTTP 協定 (MCP 2025-03-26)", - "tools_copyright_line1": "工具系統 - 13 個意圖級工具,150+ 編輯器操作,action 操作碼分派", - "config_copyright_line1": "一鍵設定 - 支援 Cursor、Windsurf、Trae、Codex CLI、Claude CLI、Gemini CLI", - "email_required": "請輸入電子郵件與啟用碼", - "permanent_label": "永久", - "logout_button": "登出", - "invite_code_label": "邀請碼", - "copy_button": "複製", - "change_code_button": "變更啟用碼", - "change_code_title": "變更啟用碼", - "change_code_desc": "輸入新的啟用碼,目前裝置的啟用佔位將被釋放後重新啟用。", - "confirm_change": "確認變更", - "cancel": "取消", - "code_required": "請輸入啟用碼", - "expiry_inline_warning": "即將到期!", - "store_purchase_hint": "如果您已在 Cocos Store 購買了本外掛,請聯絡我取得啟用碼。", - "license_expired_title": "授權已過期", - "license_expired_message": "您的授權已過期,無法啟動服務。請續約或重新啟用以繼續使用。", - "go_to_login": "重新登入", - - "log_load_config_failed": "載入設定狀態失敗: {0}", - "log_gen_cli_failed": "產生 CLI 指令失敗: {0}", - "log_add_client_failed": "新增到 {0} 失敗: {1}", - "log_remove_client_failed": "從 {0} 刪除失敗: {1}", - "quick_config_dialog_title": "一鍵設定", - "config_operation_failed": "設定操作失敗", - "config_file_not_found_changed_path": "設定失敗:找不到設定檔,{0} 安裝時可能變更了路徑", - "log_batch_add_failed": "批次新增失敗: {0}", - "log_batch_remove_failed": "批次刪除失敗: {0}", - "log_copied_config": "已複製 {0} 設定到剪貼簿", - "log_gen_config_failed": "產生設定失敗", - "log_copy_config_failed": "複製設定失敗: {0}", - "log_copied_command": "已複製 {0} 指令到剪貼簿", - "log_copy_command_failed": "複製指令失敗: {0}", - "log_opened_config_file": "已開啟設定檔: {0}", - "log_open_config_failed": "開啟設定檔失敗", - "log_open_config_error": "開啟設定檔失敗: {0}", - - "update_available_title": "發現新版本", - "update_new_version": "新版本 v{0} 已發布!", - "update_now": "立即更新", - "update_not_now": "暫不更新", - "update_skip_version": "略過 v{0}", - "check_for_updates": "檢查更新", - "update_checking": "檢查中...", - "update_no_update": "目前已是最新版本", - "update_urgency_critical": "緊急更新", - "update_urgency_high": "重要更新", - "update_current_version": "目前版本: v{0}", - "update_changelog": "更新日誌" - ,"update_changelog_empty": "該版本尚未填寫更新內容。" - ,"subscription_login_title": "VberAI 官網訂閱帳號" - ,"subscription_password_label": "密碼" - ,"subscription_password_placeholder": "請輸入密碼" - ,"subscription_login_button": "使用 VberAI 帳號登入" - ,"subscription_google_button": "使用 Google 登入" - ,"subscription_google_pending": "已開啟瀏覽器,請完成 Google 授權後返回 Cocos Creator。" - ,"subscription_google_pending_button": "正在等待 Google 授權..." - ,"subscription_register_button": "註冊 VberAI 帳號" - ,"subscription_logging_in": "登入中..." - ,"subscription_credentials_required": "請輸入電子郵件與密碼" - ,"subscription_login_success": "訂閱帳號登入成功" - ,"subscription_login_failed": "訂閱帳號登入失敗" - ,"subscription_not_entitled": "目前的訂閱方案不包含 Cocos 3.x MCP,請升級後使用。" - ,"subscription_upgrade_to": "升級到「{0}」即可使用" - ,"subscription_upgrade_action": "前往升級訂閱" - ,"subscription_logged_in": "目前登入帳號" - ,"subscription_choose_button": "VberAI 官網訂閱帳號" - ,"license_choose_button": "啟用碼授權" - ,"subscription_method_label": "訂閱帳號" - ,"back_to_login_choices": "← 返回選擇登入方式" - ,"subscription_signed_out_other_device": "帳號已在另一台裝置登入,目前裝置已登出。" - ,"subscription_google_cancelled": "已取消 Google 登入" - ,"subscription_request_timeout": "請求逾時,請檢查網路後重試。" - ,"subscription_network_error": "網路連線失敗,請檢查網路後重試。" - ,"subscription_server_error": "伺服器回應異常,請稍後重試。" - ,"subscription_google_authorization_failed": "Google 授權未完成,請重試。" - ,"lan_access_label": "允許區域網路存取" - ,"lan_access_warning": "已繫結 0.0.0.0。同一網路內的任何人都能連上並操作編輯器,本介面不驗證任何憑證。請僅在可信任的網路下開啟。" - ,"lan_address": "區域網路位址" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh.js deleted file mode 100644 index 390620b..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/i18n/zh.js +++ /dev/null @@ -1,258 +0,0 @@ -"use strict"; -module.exports = { - "extension_name": "Cocos MCP 服务器", - "description": "适用于 Cocos Creator 3.8 的 AI MCP 服务器", - "panel_title": "MCP 服务器", - "open_panel": "打开 MCP 面板", - "start_server": "启动服务器", - "stop_server": "停止服务器", - "server_status": "服务器状态", - "port": "端口", - "settings": "设置", - "connected": "已连接", - "disconnected": "未连接", - "server_running": "服务器正在端口 {0} 上运行", - "server_stopped": "服务器已停止", - "auto_start": "自动启动", - "debug_log": "调试日志", - "max_connections": "最大连接数", - "connection_info": "连接信息", - "http_url": "HTTP 地址", - "copy": "复制", - "save_settings": "保存设置", - "settings_saved": "设置保存成功", - "server_started": "MCP 服务器已启动", - "server_stopped_msg": "MCP 服务器已停止", - "failed_to_start": "启动服务器失败", - "failed_to_stop": "停止服务器失败", - "failed_to_save": "保存设置失败", - "url_copied": "HTTP 地址已复制到剪贴板", - "tool_manager": "工具管理器", - "open_tool_manager": "打开工具管理器", - "create_config": "新建配置", - "edit_config": "编辑配置", - "delete_config": "删除配置", - "import_config": "导入配置", - "export_config": "导出配置", - "apply_config": "应用配置", - "select_all": "全选", - "deselect_all": "取消全选", - "save_changes": "保存更改", - "config_name": "配置名称", - "config_description": "配置描述", - "current_config": "当前配置", - "tool_management": "工具管理", - "total_tools": "总工具数", - "enabled_tools": "已启用", - "disabled_tools": "已禁用", - "no_config_selected": "没有选择配置", - "select_config_first": "请先选择一个配置或创建新配置", - "config_created": "配置创建成功", - "config_updated": "配置更新成功", - "config_deleted": "配置删除成功", - "config_applied": "配置应用成功", - "config_exported": "配置导出成功", - "config_imported": "配置导入成功", - "confirm_delete": "确认删除", - "delete_config_confirm": "确定要删除配置 \"{0}\" 吗?此操作不可撤销。", - "max_config_slots_reached": "已达到最大配置槽位数量 ({0})", - "invalid_config_format": "无效的配置格式", - "invalid_json_format": "无效的JSON格式或配置结构", - "server_tab": "服务器", - "tools_tab": "工具管理", - "available_tools": "可用工具", - "scene_tools": "场景工具", - "node_tools": "节点工具", - "component_tools": "组件工具", - "prefab_tools": "预制体工具", - "project_tools": "项目工具", - "debug_tools": "调试工具", - "preferences_tools": "偏好设置", - "server_tools": "服务器工具", - "broadcast_tools": "广播工具", - "scene_advanced_tools": "高级场景工具", - "scene_view_tools": "场景视图工具", - "reference_image_tools": "参考图片工具", - "asset_advanced_tools": "高级资源工具", - "validation_tools": "验证工具", - "brand_name": "李大仙 MCP 系列", - "brand_subtitle": "LiDaxian MCP Series", - "contact_email": "邮箱", - "contact_wechat": "微信", - "contact_github": "GitHub", - "machine_id_label": "机器码", - "purchase_renew": "购买/续费", - "purchase_url": "https://www.vberai.com/game-engines/cocos", - "auth_title": "选择登录方式", - "auth_subtitle": "请输入您的邮箱和激活码", - "auth_choose_subtitle": "请选择一种登录方式继续", - "email_label": "邮箱地址", - "activation_code_label": "激活码", - "email_placeholder": "请输入邮箱", - "code_placeholder": "请输入激活码 (XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)", - "activate_button": "激活", - "deactivate_button": "取消激活", - "activating": "激活中...", - "deactivating": "取消激活中...", - "license_status": "授权状态", - "license_type": "授权类型", - "expiry_date": "到期日期", - "days_remaining": "剩余天数", - "days_unit": "天", - "permanent": "永久", - "expiry_warning_title": "授权即将到期", - "expiry_warning_message": "您的授权将在 {0} 天后到期,请及时续费以确保服务不中断。", - "renew_now": "立即续费", - "i_understand": "我知道了", - "activation_success": "授权激活成功!", - "activation_failed": "激活失败:{0}", - "invalid_code": "无效的激活码格式", - "purchase_license": "购买授权", - "renew_license": "续费授权", - "contact_support": "技术支持", - "language_switch": "中文", - "version_label": "版本", - "license_required": "需要授权才能启动服务器", - "license_check_failed": "授权检查失败", - - "status_stopped": "已停止", - "status_running": "运行中", - "status_error": "连接失败", - "config_tab": "一键配置", - "status_label": "状态", - "connections_count": "连接数", - "transport_protocol": "传输协议", - "transport_type": "传输类型", - "mcp_url": "MCP URL", - "port_fallback_title": "端口 {0} 被占用,已自动改用 {1}", - "net_title": "网络 / 代理", - "net_direct": "直连", - "net_via": "经 {0}({1})", - "net_source_manual": "手动填写", - "net_source_env": "环境变量", - "net_source_system": "系统设置", - "net_mode_auto": "自动检测", - "net_mode_manual": "手动指定", - "net_mode_off": "不使用代理", - "net_save": "保存", - "net_test": "测试连接", - "net_testing": "测试中…", - "net_test_ok": "连接正常({0} ms)", - "net_test_fail": "连接失败:{0}", - "net_hint": "登录超时多半是网络问题:服务器在境外,若你在用 VPN/代理,请在此填写代理地址(如 http://127.0.0.1:7890),或把代理软件切到全局(TUN)模式。", - "net_pac_warning": "系统使用了 PAC 自动配置脚本,插件无法解析。请改为「手动指定」并填写代理地址。", - "port_label": "端口", - "auto_start_label": "自动启动", - "debug_log_label": "调试日志", - "max_connections_label": "最大连接数", - "server_settings_title": "服务器设置", - "server_status_title": "服务器状态", - "connection_info_title": "连接信息", - "tools_count": "{0} 个工具", - "tools_stats": "{0} 个工具 ({1} 启用 / {2} 禁用)", - "quick_config_title": "一键配置 MCP 客户端", - "quick_config_desc": "自动将当前MCP服务器配置到主流AI编辑器和CLI工具中", - "server_info": "服务器信息", - "server_name_label": "服务器名称", - "server_address": "服务器地址", - "timeout_ms": "超时时间(ms)", - "auto_config_title": "自动配置 (IDE编辑器 + Codex CLI)", - "add_all": "全部添加", - "remove_all": "全部删除", - "auto_config_note": "点击按钮将自动修改配置文件(包括Cursor、Windsurf、Trae、Codex CLI)", - "configured": "已配置", - "not_configured": "未配置", - "auto_config_btn": "自动配置", - "delete_btn": "删除", - "copy_config": "复制配置", - "open_config": "打开配置", - "manual_config_title": "手动配置 (Claude CLI + Gemini CLI)", - "refresh_commands": "刷新命令", - "manual_config_note": "以下CLI工具需要在终端中手动执行命令配置", - "config_scope": "配置范围:", - "scope_user": "用户级别", - "scope_project": "项目级别", - "operation_log": "操作日志", - "no_logs": "暂无操作记录", - "copyright_line": "© 2025 李大仙 (LiDaxian) - Cocos Creator MCP Server v{0}", - "protocol_line": "基于 Streamable HTTP 协议 (MCP 2025-03-26)", - "tools_copyright_line1": "工具系统 - 13个意图级工具,150+编辑器操作,action操作码分发", - "config_copyright_line1": "一键配置 - 支持 Cursor、Windsurf、Trae、Codex CLI、Claude CLI、Gemini CLI", - "email_required": "请输入邮箱和激活码", - "permanent_label": "永久", - "logout_button": "退出登录", - "invite_code_label": "邀请码", - "copy_button": "复制", - "change_code_button": "变更激活码", - "change_code_title": "变更激活码", - "change_code_desc": "输入新的激活码,当前设备的激活占位将被释放后重新激活。", - "confirm_change": "确认变更", - "cancel": "取消", - "code_required": "请输入激活码", - "expiry_inline_warning": "即将到期!", - "store_purchase_hint": "如果您已在 Cocos Store 购买了本插件,请联系我获取激活码。", - "license_expired_title": "授权已过期", - "license_expired_message": "您的授权已过期,无法启动服务。请续费或重新激活以继续使用。", - "go_to_login": "重新登录", - - "log_load_config_failed": "加载配置状态失败: {0}", - "log_gen_cli_failed": "生成CLI命令失败: {0}", - "log_add_client_failed": "添加到{0}失败: {1}", - "log_remove_client_failed": "从{0}删除失败: {1}", - "quick_config_dialog_title": "一键配置", - "config_operation_failed": "配置操作失败", - "config_file_not_found_changed_path": "配置失败:找不到配置文件,{0} 安装时可能更改了路径", - "log_batch_add_failed": "批量添加失败: {0}", - "log_batch_remove_failed": "批量删除失败: {0}", - "log_copied_config": "已复制{0}配置到剪贴板", - "log_gen_config_failed": "生成配置失败", - "log_copy_config_failed": "复制配置失败: {0}", - "log_copied_command": "已复制{0}命令到剪贴板", - "log_copy_command_failed": "复制命令失败: {0}", - "log_opened_config_file": "已打开配置文件: {0}", - "log_open_config_failed": "打开配置文件失败", - "log_open_config_error": "打开配置文件失败: {0}", - - "update_available_title": "发现新版本", - "update_new_version": "新版本 v{0} 已发布!", - "update_now": "立即更新", - "update_not_now": "暂不更新", - "update_skip_version": "跳过 v{0}", - "check_for_updates": "检查更新", - "update_checking": "检查中...", - "update_no_update": "当前已是最新版本", - "update_urgency_critical": "紧急更新", - "update_urgency_high": "重要更新", - "update_current_version": "当前版本: v{0}", - "update_changelog": "更新日志" - ,"update_changelog_empty": "该版本暂未填写更新内容。" - ,"subscription_login_title": "VberAI 官网订阅账号" - ,"subscription_password_label": "密码" - ,"subscription_password_placeholder": "请输入密码" - ,"subscription_login_button": "使用 VberAI 账号登录" - ,"subscription_google_button": "使用 Google 登录" - ,"subscription_google_pending": "已打开浏览器,请完成 Google 授权后返回 Cocos Creator。" - ,"subscription_google_pending_button": "正在等待 Google 授权..." - ,"subscription_register_button": "注册 VberAI 账号" - ,"subscription_logging_in": "登录中..." - ,"subscription_credentials_required": "请输入邮箱和密码" - ,"subscription_login_success": "订阅账号登录成功" - ,"subscription_login_failed": "订阅账号登录失败" - ,"subscription_not_entitled": "当前订阅计划不包含 Cocos 3.x MCP,请升级后使用。" - ,"subscription_upgrade_to": "升级到「{0}」即可使用" - ,"subscription_upgrade_action": "前往升级订阅" - ,"subscription_logged_in": "当前登录账号" - ,"subscription_choose_button": "VberAI 官网订阅账号" - ,"license_choose_button": "激活码授权" - ,"subscription_method_label": "订阅账号" - ,"back_to_login_choices": "← 返回选择登录方式" - ,"subscription_signed_out_other_device": "账号已在另一台设备登录,当前设备已退出。" - ,"subscription_google_cancelled": "已取消 Google 登录" - ,"subscription_request_timeout": "请求超时,请检查网络后重试。" - ,"subscription_network_error": "网络连接失败,请检查网络后重试。" - ,"subscription_server_error": "服务器响应异常,请稍后重试。" - ,"subscription_google_authorization_failed": "Google 授权未完成,请重试。" - ,"lan_access_label": "允许局域网访问" - ,"lan_access_warning": "已绑定 0.0.0.0。同一网络内的任何人都能连上并操作编辑器,本接口不校验任何凭证。仅在可信网络下开启。" - ,"lan_address": "局域网地址" -}; diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/package.json b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/package.json deleted file mode 100644 index f99bcb2..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/package.json +++ /dev/null @@ -1,274 +0,0 @@ -{ - "$schema": "./@types/schema/package/index.json", - "package_version": 2, - "name": "cocos-mcp-server", - "version": "1.8.0", - "author": "LiDaxian", - "editor": ">=3.7.0", - "description": "i18n:cocos-mcp-server.description", - "main": "./dist/main.js", - "dependencies": { - "@iarna/toml": "^2.2.5", - "fs-extra": "^11.3.0", - "puppeteer-core": "^25.1.0", - "uuid": "^9.0.1", - "vue": "^3.1.4" - }, - "panels": { - "default": { - "title": "i18n:cocos-mcp-server.panel_title", - "type": "dockable", - "main": "dist/panels/default", - "icon": "./static/icon.png", - "size": { - "min-width": 560, - "min-height": 680, - "width": 760, - "height": 820 - } - } - }, - "contributions": { - "menu": [ - { - "path": "i18n:menu.extension/Cocos MCP Server", - "label": "i18n:cocos-mcp-server.open_panel", - "message": "open-panel" - } - ], - "messages": { - "open-panel": { - "methods": [ - "openPanel" - ] - }, - "open-tool-manager": { - "methods": [ - "openToolManager" - ] - }, - "start-server": { - "methods": [ - "startServer" - ] - }, - "stop-server": { - "methods": [ - "stopServer" - ] - }, - "get-server-status": { - "methods": [ - "getServerStatus" - ] - }, - "update-settings": { - "methods": [ - "updateSettings" - ] - }, - "getToolsList": { - "methods": [ - "getToolsList" - ] - }, - "get-server-settings": { - "methods": [ - "getServerSettings" - ] - }, - "getToolManagerState": { - "methods": [ - "getToolManagerState" - ] - }, - "createToolConfiguration": { - "methods": [ - "createToolConfiguration" - ] - }, - "updateToolConfiguration": { - "methods": [ - "updateToolConfiguration" - ] - }, - "deleteToolConfiguration": { - "methods": [ - "deleteToolConfiguration" - ] - }, - "setCurrentToolConfiguration": { - "methods": [ - "setCurrentToolConfiguration" - ] - }, - "updateToolStatus": { - "methods": [ - "updateToolStatus" - ] - }, - "updateToolStatusBatch": { - "methods": [ - "updateToolStatusBatch" - ] - }, - "exportToolConfiguration": { - "methods": [ - "exportToolConfiguration" - ] - }, - "importToolConfiguration": { - "methods": [ - "importToolConfiguration" - ] - }, - "getEnabledTools": { - "methods": [ - "getEnabledTools" - ] - }, - "get-config-status": { - "methods": [ - "getConfigStatus" - ] - }, - "generate-cli-commands": { - "methods": [ - "generateCLICommands" - ] - }, - "generate-client-config": { - "methods": [ - "generateClientConfig" - ] - }, - "add-to-client": { - "methods": [ - "addToClient" - ] - }, - "remove-from-client": { - "methods": [ - "removeFromClient" - ] - }, - "add-to-all-clients": { - "methods": [ - "addToAllClients" - ] - }, - "remove-from-all-clients": { - "methods": [ - "removeFromAllClients" - ] - }, - "open-config-file": { - "methods": [ - "openConfigFile" - ] - }, - "check-license": { - "methods": [ - "checkLicense" - ] - }, - "subscription-status": { - "methods": [ - "subscriptionStatus" - ] - }, - "login-subscription": { - "methods": [ - "loginSubscription" - ] - }, - "login-subscription-google": { - "methods": [ - "loginSubscriptionGoogle" - ] - }, - "logout-subscription": { - "methods": [ - "logoutSubscription" - ] - }, - "activate-license": { - "methods": [ - "activateLicense" - ] - }, - "deactivate-license": { - "methods": [ - "deactivateLicense" - ] - }, - "get-license-info": { - "methods": [ - "getLicenseInfo" - ] - }, - "check-update": { - "methods": [ - "checkUpdate" - ] - }, - "skip-update": { - "methods": [ - "skipUpdate" - ] - }, - "get-machine-id": { - "methods": [ - "getMachineId" - ] - }, - "preview-play": { - "methods": [ - "default.onPreviewPlay" - ] - }, - "preview-stop": { - "methods": [ - "default.onPreviewStop" - ] - }, - "device-removed": { - "methods": [ - "default.device-removed" - ] - }, - "get-network-status": { - "methods": [ - "getNetworkStatus" - ] - }, - "set-proxy-config": { - "methods": [ - "setProxyConfig" - ] - }, - "test-connectivity": { - "methods": [ - "testConnectivity" - ] - } - }, - "scene": { - "script": "./dist/scene.js", - "methods": [ - "createNewScene", - "addComponentToNode", - "removeComponentFromNode", - "getNodeInfo", - "getAllNodes", - "findNodeByName", - "setNodeProperty", - "setComponentProperty", - "getCurrentSceneInfo", - "getSceneHierarchy", - "createPrefabFromNode", - "captureContent" - ] - } - } -} \ No newline at end of file diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge-mcp.mjs b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge-mcp.mjs deleted file mode 100644 index 90616b7..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge-mcp.mjs +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/env node -/** - * Batch auto_knowledge via MCP HTTP — gets runtime defaults from editor - * Requires: editor running with MCP on port 3000 - */ - -import http from 'http'; - -const MCP_URL = 'http://127.0.0.1:3000/mcp'; -const ALL = [ - 'cc.Label','cc.Sprite','cc.Button','cc.Widget','cc.Layout', - 'cc.UITransform','cc.RichText','cc.ScrollView','cc.Toggle', - 'cc.ToggleContainer','cc.ProgressBar','cc.Slider','cc.PageView', - 'cc.Mask','cc.Graphics','cc.UIOpacity','cc.SafeArea', - 'cc.BlockInputEvents','cc.LabelOutline','cc.LabelShadow', - 'cc.PageViewIndicator','cc.EditBox', - 'cc.AudioSource','cc.VideoPlayer','cc.WebView', - 'cc.ParticleSystem2D', - 'cc.Camera','cc.Canvas','cc.Animation','cc.SkeletalAnimation', - 'cc.MeshRenderer','cc.SkinnedMeshRenderer', - 'cc.DirectionalLight','cc.PointLight','cc.SpotLight','cc.SphereLight', - 'cc.RigidBody2D','cc.BoxCollider2D','cc.CircleCollider2D','cc.PolygonCollider2D', - 'cc.RigidBody','cc.BoxCollider','cc.SphereCollider','cc.CapsuleCollider','cc.MeshCollider', - 'cc.MotionStreak','cc.Billboard','cc.Line', - 'cc.TiledMap','cc.TiledLayer', - 'cc.HingeJoint2D','cc.DistanceJoint2D','cc.SpringJoint2D', - 'cc.FixedJoint2D','cc.WheelJoint2D','cc.SliderJoint2D', - 'cc.RelativeJoint2D','cc.MouseJoint2D', - 'cc.HingeConstraint','cc.FixedConstraint','cc.PointToPointConstraint', - 'cc.Terrain','cc.LODGroup','cc.ReflectionProbe', - 'sp.Skeleton','dragonBones.ArmatureDisplay', -]; - -function callMcp(toolName, args) { - return new Promise((resolve, reject) => { - const body = JSON.stringify({ - jsonrpc: '2.0', id: Date.now(), method: 'tools/call', - params: { name: toolName, arguments: args } - }); - const req = http.request(MCP_URL, { - method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, - timeout: 30000, - }, (res) => { - const chunks = []; - res.on('data', c => chunks.push(c)); - res.on('end', () => { - try { - const data = JSON.parse(Buffer.concat(chunks).toString()); - const content = data.result?.content || []; - const text = content.find(c => c.type === 'text')?.text; - resolve(text ? JSON.parse(text) : {}); - } catch (e) { reject(e); } - }); - }); - req.on('error', reject); - req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); }); - req.write(body); - req.end(); - }); -} - -// Check connectivity -try { - await callMcp('cocos_editor', { action: 'project_info' }); -} catch { - console.error('❌ Cannot connect to MCP at', MCP_URL); - console.error(' Make sure editor is running and plugin is loaded.'); - process.exit(1); -} - -console.log(`Connected. Running auto_knowledge(save:true) for ${ALL.length} components...\n`); - -let ok = 0, fail = 0, withDefaults = 0; - -for (const comp of ALL) { - try { - const r = await callMcp('cocos_devtools', { action: 'auto_knowledge', componentType: comp, save: true }); - if (r.success) { - ok++; - const hasRuntime = r.data?.hasRuntimeDefaults; - if (hasRuntime) withDefaults++; - const propCount = Object.keys(r.data?.recommendedKnowledge?.properties || {}).length; - console.log(` ✅ ${comp.padEnd(35)} ${propCount} props ${hasRuntime ? '(+defaults)' : '(dts only)'}`); - } else { - fail++; - console.log(` ❌ ${comp}: ${r.error}`); - } - } catch (e) { - fail++; - console.log(` ❌ ${comp}: ${e.message}`); - } -} - -console.log(`\nDone: ${ok} ok, ${fail} fail, ${withDefaults} with runtime defaults`); diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge.js deleted file mode 100644 index a2235cf..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/batch-auto-knowledge.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Batch auto_knowledge — generate complete COMPONENT_PROPERTIES from d.ts - * Output: knowledge JSON files + combined TS snippet for knowledge-handler.ts - */ - -const path = require('path'); -const fs = require('fs'); -const mod = require(path.resolve(__dirname, '../dist/tools/cocos/utils/component-knowledge')); - -const ALL_COMPONENTS = [ - 'cc.Label', 'cc.Sprite', 'cc.Button', 'cc.Widget', 'cc.Layout', - 'cc.UITransform', 'cc.RichText', 'cc.ScrollView', 'cc.Toggle', - 'cc.ToggleContainer', 'cc.ProgressBar', 'cc.Slider', 'cc.PageView', - 'cc.Mask', 'cc.Graphics', 'cc.UIOpacity', 'cc.SafeArea', - 'cc.BlockInputEvents', 'cc.LabelOutline', 'cc.LabelShadow', - 'cc.PageViewIndicator', 'cc.EditBox', - 'cc.AudioSource', 'cc.VideoPlayer', 'cc.WebView', - 'cc.ParticleSystem2D', 'cc.ParticleSystem', - 'cc.Camera', 'cc.Canvas', 'cc.Animation', 'cc.SkeletalAnimation', - 'cc.MeshRenderer', 'cc.SkinnedMeshRenderer', - 'cc.DirectionalLight', 'cc.PointLight', 'cc.SpotLight', 'cc.SphereLight', - 'cc.RigidBody2D', 'cc.BoxCollider2D', 'cc.CircleCollider2D', 'cc.PolygonCollider2D', - 'cc.RigidBody', 'cc.BoxCollider', 'cc.SphereCollider', 'cc.CapsuleCollider', 'cc.MeshCollider', - 'cc.MotionStreak', 'cc.Billboard', 'cc.Line', - 'cc.TiledMap', 'cc.TiledLayer', - 'cc.HingeJoint2D', 'cc.DistanceJoint2D', 'cc.SpringJoint2D', - 'cc.FixedJoint2D', 'cc.WheelJoint2D', 'cc.SliderJoint2D', - 'cc.RelativeJoint2D', 'cc.MouseJoint2D', - 'cc.HingeConstraint', 'cc.FixedConstraint', 'cc.PointToPointConstraint', - 'cc.Terrain', 'cc.LODGroup', 'cc.ReflectionProbe', - 'sp.Skeleton', 'dragonBones.ArmatureDisplay', -]; - -const snippets = []; -let saved = 0, failed = 0; - -for (const comp of ALL_COMPONENTS) { - const className = mod.componentTypeToClassName(comp); - const dtsInfo = mod.parseDtsClass(className, { recursive: true }); - - if (!dtsInfo) { - console.log(` ❌ ${comp}: not found in d.ts`); - failed++; - continue; - } - - const classified = mod.classifyProperties(dtsInfo, null); - const knowledge = mod.buildRecommendedKnowledge(comp, dtsInfo, classified); - - // Save knowledge file - mod.saveKnowledgeFile(comp, knowledge); - - // Generate TS snippet - const snippet = mod.generateTsSnippet(comp, knowledge); - snippets.push(snippet); - - const propCount = Object.keys(knowledge.properties).length; - console.log(` ✅ ${comp}: ${propCount} props`); - saved++; -} - -// Write combined snippets to file -const outputPath = path.resolve(__dirname, '../dev-knowledge/COMPONENT_PROPERTIES_GENERATED.ts'); -const outputDir = path.dirname(outputPath); -if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true }); - -const header = `/** - * AUTO-GENERATED by batch-auto-knowledge.js - * Date: ${new Date().toISOString()} - * Components: ${saved} - * - * Paste this into COMPONENT_PROPERTIES in knowledge-handler.ts - */ - -const COMPONENT_PROPERTIES: Record = {\n`; - -const footer = `\n};\n`; - -fs.writeFileSync(outputPath, header + snippets.join('\n') + footer, 'utf-8'); - -console.log(`\n Saved: ${saved} | Failed: ${failed}`); -console.log(` Knowledge files: dev-knowledge/components/`); -console.log(` TS output: ${outputPath}`); diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/preinstall.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/preinstall.js deleted file mode 100644 index 392e2f1..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/preinstall.js +++ /dev/null @@ -1,111 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const { spawnSync } = require("child_process"); - -const PATH = { - packageJSON: path.join(__dirname, "../package.json") -}; - -function checkCreatorTypesVersion(version) { - try { - // 根据平台选择合适的npm命令 - const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm"; - - // 检查npm命令是否可用 - const npmCheck = spawnSync(npmCmd, ["--version"], { - stdio: 'pipe', - shell: process.platform === "win32" - }); - - if (npmCheck.error || npmCheck.status !== 0) { - console.warn("Warning: npm command not available, skipping version check"); - return true; // 如果npm不可用,跳过检查 - } - - // 获取版本列表 - const result = spawnSync(npmCmd, ["view", "@cocos/creator-types", "versions"], { - stdio: 'pipe', - shell: process.platform === "win32" - }); - - if (result.error || result.status !== 0) { - console.warn("Warning: Failed to fetch @cocos/creator-types versions, skipping check"); - return true; // 如果获取失败,跳过检查 - } - - let output = result.stdout.toString().trim(); - - // 尝试解析JSON - try { - const versions = JSON.parse(output); - if (Array.isArray(versions)) { - return versions.includes(version); - } else if (typeof versions === 'string') { - return versions.includes(version); - } - } catch (parseError) { - // 如果JSON解析失败,尝试作为字符串处理 - return output.includes(version); - } - - return false; - } catch (error) { - console.warn("Warning: Version check failed:", error.message); - return true; // 出错时跳过检查 - } -} - -function getCreatorTypesVersion() { - try { - // 检查package.json文件是否存在 - if (!fs.existsSync(PATH.packageJSON)) { - console.warn("Warning: package.json not found"); - return null; - } - - const packageContent = fs.readFileSync(PATH.packageJSON, "utf8"); - const packageJson = JSON.parse(packageContent); - - // 检查devDependencies是否存在 - if (!packageJson.devDependencies || !packageJson.devDependencies["@cocos/creator-types"]) { - console.warn("Warning: @cocos/creator-types not found in devDependencies"); - return null; - } - - const versionString = packageJson.devDependencies["@cocos/creator-types"]; - return versionString.replace(/^[^\d]+/, ""); - } catch (error) { - console.warn("Warning: Failed to read package.json:", error.message); - return null; - } -} - -function main() { - try { - const creatorTypesVersion = getCreatorTypesVersion(); - - if (!creatorTypesVersion) { - console.log("Skipping @cocos/creator-types version check"); - return; - } - - if (!checkCreatorTypesVersion(creatorTypesVersion)) { - console.log("\x1b[33mWarning:\x1b[0m"); - console.log(" @en"); - console.log(" Version check of @cocos/creator-types failed."); - console.log(` The definition of ${creatorTypesVersion} has not been released yet. Please export the definition to the ./node_modules directory by selecting "Developer -> Export Interface Definition" in the menu of the Creator editor.`); - console.log(" The definition of the corresponding version will be released on npm after the editor is officially released."); - console.log(" @zh"); - console.log(" @cocos/creator-types 版本检查失败。"); - console.log(` ${creatorTypesVersion} 定义还未发布,请先通过 Creator 编辑器菜单 "开发者 -> 导出接口定义",导出定义到 ./node_modules 目录。`); - console.log(" 对应版本的定义会在编辑器正式发布后同步发布到 npm 上。"); - } - } catch (error) { - console.error("Preinstall script error:", error.message); - // 不要抛出错误,让安装继续进行 - process.exit(0); - } -} - -// 执行主函数 -main(); \ No newline at end of file diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/promote-all-knowledge.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/promote-all-knowledge.js deleted file mode 100644 index 3f834e7..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/promote-all-knowledge.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Generate COMPONENT_PROPERTIES from saved dev-knowledge JSON files. - * Does NOT re-parse d.ts — uses the saved knowledge (which has runtime defaults). - */ -const path = require('path'); -const fs = require('fs'); -const mod = require(path.resolve(__dirname, '../dist/tools/cocos/utils/component-knowledge')); - -const files = mod.listKnowledgeFiles(); -const snippets = []; - -for (const comp of files) { - const knowledge = mod.loadKnowledgeFile(comp); - if (!knowledge) continue; - snippets.push(mod.generateTsSnippet(comp, knowledge)); - const propCount = Object.keys(knowledge.properties).length; - const defaultCount = Object.values(knowledge.properties).filter(p => p.default !== undefined).length; - console.log(` ${comp.padEnd(35)} ${propCount} props, ${defaultCount} with defaults`); -} - -const outputPath = path.resolve(__dirname, '../dev-knowledge/COMPONENT_PROPERTIES_GENERATED.txt'); -const header = `const COMPONENT_PROPERTIES: Record = {\n`; -const footer = `\n};\n`; -fs.writeFileSync(outputPath, header + snippets.join('\n') + footer, 'utf-8'); -console.log(`\nGenerated ${files.length} components → ${outputPath}`); diff --git a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/validate-schemas.js b/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/validate-schemas.js deleted file mode 100644 index 60998d1..0000000 --- a/cocoscreator_projects/YouleNexus/extensions/cocos-mcp-server/scripts/validate-schemas.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * validate-schemas.js - * 构建后校验所有 MCP 工具的 inputSchema,检测常见 JSON Schema 错误: - * - array 类型缺少 items - * - object 类型缺少 properties - * - enum 为空数组 - * - type 字段缺失 - */ - -const path = require('path'); -const fs = require('fs'); - -// 颜色 -const RED = '\x1b[31m'; -const YELLOW = '\x1b[33m'; -const GREEN = '\x1b[32m'; -const RESET = '\x1b[0m'; - -let errors = 0; -let warnings = 0; - -function validateSchema(schema, context, toolName) { - if (!schema || typeof schema !== 'object') return; - - // 检查 array 缺少 items - if (schema.type === 'array' && !schema.items) { - console.error(`${RED}ERROR${RESET} [${toolName}] ${context}: type "array" missing "items"`); - errors++; - } - - // 检查 items 但不是 array - if (schema.items && schema.type !== 'array') { - console.warn(`${YELLOW}WARN${RESET} [${toolName}] ${context}: has "items" but type is "${schema.type}", not "array"`); - warnings++; - } - - // 检查 enum 为空 - if (schema.enum && Array.isArray(schema.enum) && schema.enum.length === 0) { - console.warn(`${YELLOW}WARN${RESET} [${toolName}] ${context}: empty "enum" array`); - warnings++; - } - - // 递归检查 properties - if (schema.properties && typeof schema.properties === 'object') { - for (const [key, value] of Object.entries(schema.properties)) { - validateSchema(value, `${context}.${key}`, toolName); - } - } - - // 递归检查 items - if (schema.items && typeof schema.items === 'object') { - validateSchema(schema.items, `${context}.items`, toolName); - } -} - -function main() { - const distDir = path.join(__dirname, '..', 'dist'); - if (!fs.existsSync(distDir)) { - console.error(`${RED}ERROR${RESET} dist/ not found. Run "npm run build" first.`); - process.exit(1); - } - - // 收集所有工具定义 - const tools = []; - - // 1. 加载 CocosTools - try { - const { CocosTools } = require(path.join(distDir, 'tools', 'cocos', 'cocos-tools.js')); - const cocosTools = new CocosTools(); - tools.push(...cocosTools.getTools()); - } catch (e) { - console.warn(`${YELLOW}WARN${RESET} Could not load CocosTools: ${e.message}`); - } - - // 2. 加载独立工具集 - const toolFiles = [ - 'tools/scene-tools.js', - 'tools/node-tools.js', - 'tools/component-tools.js', - 'tools/prefab-tools.js', - 'tools/project-tools.js', - 'tools/scene-view-tools.js', - 'tools/reference-image-tools.js', - 'tools/preferences-tools.js', - 'tools/asset-advanced-tools.js', - 'tools/debug-tools.js', - 'tools/server-tools.js', - ]; - - for (const file of toolFiles) { - try { - const fullPath = path.join(distDir, file); - if (!fs.existsSync(fullPath)) continue; - const mod = require(fullPath); - // 找到导出的类并实例化 - for (const [, ExportedClass] of Object.entries(mod)) { - if (typeof ExportedClass === 'function' && ExportedClass.prototype && typeof ExportedClass.prototype.getTools === 'function') { - const instance = new ExportedClass(); - tools.push(...instance.getTools()); - } - } - } catch (e) { - console.warn(`${YELLOW}WARN${RESET} Could not load ${file}: ${e.message}`); - } - } - - console.log(`\nValidating ${tools.length} tool schemas...\n`); - - for (const tool of tools) { - if (tool.inputSchema) { - validateSchema(tool.inputSchema, 'inputSchema', tool.name); - } - } - - console.log(''); - if (errors > 0) { - console.error(`${RED}FAILED${RESET}: ${errors} error(s), ${warnings} warning(s)`); - process.exit(1); - } else if (warnings > 0) { - console.log(`${YELLOW}PASSED${RESET} with ${warnings} warning(s)`); - } else { - console.log(`${GREEN}PASSED${RESET}: All schemas valid`); - } -} - -main(); diff --git a/cocoscreator_projects/YouleNexus/extensions/funplay-cocos-mcp b/cocoscreator_projects/YouleNexus/extensions/funplay-cocos-mcp new file mode 160000 index 0000000..3aca54c --- /dev/null +++ b/cocoscreator_projects/YouleNexus/extensions/funplay-cocos-mcp @@ -0,0 +1 @@ +Subproject commit 3aca54c9b50d1cfeeab042886b32864c845c7c2f diff --git a/cocoscreator_projects/YouleNexus/funplay-cocos-mcp.config.json b/cocoscreator_projects/YouleNexus/funplay-cocos-mcp.config.json new file mode 100644 index 0000000..46f609e --- /dev/null +++ b/cocoscreator_projects/YouleNexus/funplay-cocos-mcp.config.json @@ -0,0 +1,123 @@ +{ + "host": "127.0.0.1", + "port": 8765, + "toolProfile": "full", + "enabledTools": [ + "add_animation_clip", + "add_component", + "apply_prefab_instance", + "bind_button_click_event", + "broadcast_editor_message", + "capture_desktop_screenshot", + "capture_editor_screenshot", + "capture_game_screenshot", + "capture_preview_screenshot", + "capture_scene_screenshot", + "check_for_updates", + "clear_logs", + "create_button", + "create_camera", + "create_canvas", + "create_cocos_mcp_project_skill", + "create_label", + "create_node", + "create_prefab_from_node", + "create_prefab_instance", + "create_project_skill", + "create_scene", + "create_sprite", + "delete_asset", + "delete_node", + "duplicate_prefab", + "edit_prefab_json", + "emit_node_event", + "execute_editor_script", + "execute_javascript", + "execute_scene_script", + "exists", + "find_nodes", + "get_build_status", + "get_editor_preference", + "get_editor_selection", + "get_editor_state", + "get_file_snippet", + "get_hierarchy", + "get_performance_snapshot", + "get_preview_mode", + "get_project_info", + "get_recent_logs", + "get_runtime_state", + "get_scene_info", + "get_script_diagnostic_context", + "get_selection", + "get_tool_catalog", + "inspect_asset", + "inspect_asset_dependencies", + "inspect_component", + "inspect_node", + "inspect_prefab", + "inspect_prefab_instance", + "instantiate_prefab", + "invoke_component_method", + "list_animations", + "list_assets", + "list_button_click_events", + "list_cameras", + "list_components", + "list_directory", + "list_editor_windows", + "list_prefabs", + "list_project_instructions", + "list_scenes", + "open_asset", + "open_build_panel", + "open_scene", + "pause_runtime", + "play_animation", + "read_file", + "read_project_instruction", + "refresh_assets", + "remove_component", + "replace_in_file", + "reset_component_property", + "resume_runtime", + "revert_prefab_instance", + "run_project_preview", + "run_scene_asset", + "run_script_diagnostics", + "save_current_scene", + "search_files", + "search_project_logs", + "select_asset", + "set_camera_properties", + "set_component_property", + "set_editor_preference", + "set_node_transform", + "set_preview_mode", + "set_selection", + "set_time_scale", + "simulate_button_click", + "simulate_key_combo", + "simulate_key_press", + "simulate_mouse_click", + "simulate_mouse_drag", + "simulate_preview_input", + "stop_animation", + "validate_asset_dependencies", + "validate_prefab_references", + "validate_scene", + "write_file", + "write_project_instruction" + ], + "disabledTools": [], + "enabledToolCategories": [], + "disabledToolCategories": [], + "enableSessions": false, + "executeJavascriptSafetyChecks": true, + "autostart": true, + "maxInteractionLogEntries": 50, + "lastClientTargetId": "claude_code", + "activeToolProfileName": "", + "savedToolProfiles": [], + "language": "auto" +} diff --git a/cocoscreator_projects/YouleNexus/settings/v2/packages/project.json b/cocoscreator_projects/YouleNexus/settings/v2/packages/project.json index c605d54..183de70 100644 --- a/cocoscreator_projects/YouleNexus/settings/v2/packages/project.json +++ b/cocoscreator_projects/YouleNexus/settings/v2/packages/project.json @@ -2,9 +2,9 @@ "__version__": "1.0.6", "general": { "designResolution": { - "width": 1280, + "width": 1600, "height": 720, - "fitWidth": false, + "fitWidth": true, "fitHeight": true } } diff --git a/cocoscreator_projects/framework-tests/protocol/room-handlers.test.ts b/cocoscreator_projects/framework-tests/protocol/room-handlers.test.ts index 5bbd9af..f0b123f 100644 --- a/cocoscreator_projects/framework-tests/protocol/room-handlers.test.ts +++ b/cocoscreator_projects/framework-tests/protocol/room-handlers.test.ts @@ -29,7 +29,7 @@ function makePlayer() { test('self_join_room: 已在房应被覆盖(再次入房罕见但支持)', () => { const room = makeRoom(); // 假设自己是 seat=2 加入 - roomHandlers.self_join_room({ room }, { seat: 2, playerid: 200 } as any); + roomHandlers.self_join_room({ room, player: makePlayer() }, { seat: 2, playerid: 200 } as any); assert.equal(room.state.value.seat, 2); }); @@ -39,7 +39,7 @@ test('other_join_room: 第三方加入,players 数组对应座位填入', () => roomcode: 'R1', seat: 1, isowner: 0, players: [null, { playerid: 100 } as any, null, null], } as RoomRecoveryData); - roomHandlers.other_join_room({ room }, { seat: 3, playerid: 300, nickname: '丙' } as any); + roomHandlers.other_join_room({ room, player: makePlayer() }, { seat: 3, playerid: 300, nickname: '丙' } as any); const v = room.state.value; assert.equal(v.players[2]?.playerid, 300, 'seat=3 应填到 players[2]'); assert.equal(v.players[2]?.nickname, '丙'); @@ -55,33 +55,33 @@ test('self_exit_room: 自己座位清空', () => { test('other_exit_room: 第三方座位清空', () => { const room = makeRoom(); - roomHandlers.other_exit_room({ room }, { seat: 2 } as any); + roomHandlers.other_exit_room({ room, player: makePlayer() }, { seat: 2 } as any); assert.equal(room.state.value.players[1], null); }); test('other_exit_room: 未知座位 → 显式抛错(第二准则)', () => { const room = makeRoom(); assert.throws( - () => roomHandlers.other_exit_room({ room }, { seat: 99 } as any), + () => roomHandlers.other_exit_room({ room, player: makePlayer() }, { seat: 99 } as any), /seat=99/, ); }); test('self_apply_free_room: state 进入解散投票中', () => { const room = makeRoom(); - roomHandlers.self_apply_free_room({ room }, { applyer: 1 } as any); + roomHandlers.self_apply_free_room({ room, player: makePlayer() }, { applyer: 1 } as any); assert.equal(room.state.value.state, 1); }); test('other_apply_free_room: state 进入解散投票中', () => { const room = makeRoom(); - roomHandlers.other_apply_free_room({ room }, { applyer: 2 } as any); + roomHandlers.other_apply_free_room({ room, player: makePlayer() }, { applyer: 2 } as any); assert.equal(room.state.value.state, 1); }); test('self/other_agree_free_room: 不改变 state,仅标记同意', () => { const room = makeRoom(); - roomHandlers.self_apply_free_room({ room }, {} as any); + roomHandlers.self_apply_free_room({ room, player: makePlayer() }, {} as any); roomHandlers.self_agree_free_room({ room, player: makePlayer() }, {} as any); // 协议无 agreeList 字段(state 保持 1=投票中),由其他机制累计 assert.equal(room.state.value.state, 1); @@ -89,7 +89,7 @@ test('self/other_agree_free_room: 不改变 state,仅标记同意', () => { test('self/other_refuse_free_room: 不改变 state', () => { const room = makeRoom(); - roomHandlers.self_apply_free_room({ room }, {} as any); + roomHandlers.self_apply_free_room({ room, player: makePlayer() }, {} as any); roomHandlers.self_refuse_free_room({ room, player: makePlayer() }, {} as any); assert.equal(room.state.value.state, 1); }); @@ -97,14 +97,14 @@ test('self/other_refuse_free_room: 不改变 state', () => { test('other_offline: 触发但不破坏 RoomStore(offline 状态由子游戏持有)', () => { const room = makeRoom(); // RoomStore 不持有 offline 字段(handler 应是 no-op 或仅校验入参) - roomHandlers.other_offline({ room }, { seat: 1 } as any); + roomHandlers.other_offline({ room, player: makePlayer() }, { seat: 1 } as any); // state 不变 assert.equal(room.state.value.state, 0); }); test('other_online: 触发但不破坏 RoomStore', () => { const room = makeRoom(); - roomHandlers.other_online({ room }, { seat: 1 } as any); + roomHandlers.other_online({ room, player: makePlayer() }, { seat: 1 } as any); assert.equal(room.state.value.state, 0); }); @@ -113,7 +113,7 @@ test('change_seat: 交换两个座位(seat=1 ↔ seat=3)', () => { // 初始: players = [null, 100, 200, null] // change_seat(from=1, to=3) → i_from=0, i_to=2 // swap: [null, 100, 200, null] ↔ [200, 100, null, null] - roomHandlers.change_seat({ room }, { from: 1, to: 3 } as any); + roomHandlers.change_seat({ room, player: makePlayer() }, { from: 1, to: 3 } as any); const v = room.state.value; // swap 结果:players[0]=200, players[1]=100, players[2]=null, players[3]=null assert.equal(v.players[0]?.playerid, 200, '原 seat=3 的 200 现在在 seat=1(0基=0)'); @@ -123,8 +123,8 @@ test('change_seat: 交换两个座位(seat=1 ↔ seat=3)', () => { test('free_room: 解散投票结束 → state=2(已解散,业务侧清场)', () => { const room = makeRoom(); - roomHandlers.self_apply_free_room({ room }, {} as any); - roomHandlers.free_room({ room }, { result: 1 } as any); + roomHandlers.self_apply_free_room({ room, player: makePlayer() }, {} as any); + roomHandlers.free_room({ room, player: makePlayer() }, { result: 1 } as any); // state 字段语义: 0=正常 1=投票中 2=已解散 assert.equal(room.state.value.state, 2); }); diff --git a/cocoscreator_projects/scripts/test/ui-coords.test.mjs b/cocoscreator_projects/scripts/test/ui-coords.test.mjs index 7dc007f..70e772d 100644 --- a/cocoscreator_projects/scripts/test/ui-coords.test.mjs +++ b/cocoscreator_projects/scripts/test/ui-coords.test.mjs @@ -1,15 +1,25 @@ import { test } from 'node:test'; import assert from 'node:assert/strict'; import { - DESIGN_WIDTH, DESIGN_HEIGHT, + DESIGN_WIDTH, DESIGN_HEIGHT, CANVAS_WIDTH, CANVAS_HEIGHT, toCocosPosition, inferWidget, stretchWidget, isFullScreen, isOffscreen, } from '../ui-migration/coords.mjs'; -test('设计分辨率保持 1280x720', () => { +test('内容区基准保持 1280x720(数据源事实,不随设计分辨率改变)', () => { assert.equal(DESIGN_WIDTH, 1280); assert.equal(DESIGN_HEIGHT, 720); }); +test('设计分辨率画布为 1600x720(20:9 主流移动端比例)', () => { + assert.equal(CANVAS_WIDTH, 1600); + assert.equal(CANVAS_HEIGHT, 720); +}); + +test('内容区基准与设计分辨率画布是两个独立常量', () => { + // 坐标/三区/满屏/越界用 DESIGN_WIDTH(1280);落地 Layer/Group 尺寸用 CANVAS_WIDTH(1600)。 + assert.notEqual(DESIGN_WIDTH, CANVAS_WIDTH); +}); + test('toCocosPosition 用 spec 的验算样例', () => { // spec §1.2: Left=320 Top=200 150x70 → x=-245 y=125 assert.deepEqual(toCocosPosition(320, 200, 150, 70), { x: -245, y: 125 }); diff --git a/cocoscreator_projects/scripts/ui-migration/convert.mjs b/cocoscreator_projects/scripts/ui-migration/convert.mjs index e7e87a6..476e560 100644 --- a/cocoscreator_projects/scripts/ui-migration/convert.mjs +++ b/cocoscreator_projects/scripts/ui-migration/convert.mjs @@ -1,5 +1,5 @@ import { - DESIGN_WIDTH, DESIGN_HEIGHT, + DESIGN_WIDTH, DESIGN_HEIGHT, CANVAS_WIDTH, CANVAS_HEIGHT, toCocosPosition, inferWidget, stretchWidget, isFullScreen, isOffscreen, } from './coords.mjs'; import { frameFileName, padWidth } from './frames.mjs'; @@ -146,8 +146,12 @@ export function convertAll(source) { const manifest = { generatedBy: 'scripts/convert-ui.mjs', + // 内容区基准(旧数据事实),坐标/三区据此判定,不随设计分辨率改变。 designWidth: DESIGN_WIDTH, designHeight: DESIGN_HEIGHT, + // 设计分辨率画布(20:9),落地 Layer/Group 根节点尺寸据此设定。 + canvasWidth: CANVAS_WIDTH, + canvasHeight: CANVAS_HEIGHT, layers: layers.map((d) => ({ layerId: d.layerId, name: d.name, diff --git a/cocoscreator_projects/scripts/ui-migration/coords.mjs b/cocoscreator_projects/scripts/ui-migration/coords.mjs index c2ab477..547f9c3 100644 --- a/cocoscreator_projects/scripts/ui-migration/coords.mjs +++ b/cocoscreator_projects/scripts/ui-migration/coords.mjs @@ -4,9 +4,19 @@ * Cocos:原点在父节点中心、Y 向上、节点锚点 (0.5, 0.5)。 */ +// 旧 UI 内容区基准(数据源事实,不可变)。 +// 991 个对象的 Left/Top 都是相对旧引擎 1280×720 画布给出的,坐标换算、三区锚点、 +// 满屏/越界判断都据此判定。它与「设计分辨率画布宽度」是两回事,见 CANVAS_WIDTH。 export const DESIGN_WIDTH = 1280; export const DESIGN_HEIGHT = 720; +// Cocos 设计分辨率画布(20:9 主流移动端比例)。落地时 Layer/Group 根节点据此设定 +// UITransform 尺寸,运行时 Canvas 按 designResolution + fitHeight 对齐到屏幕。 +// 对象坐标与 Widget 值仍以 DESIGN_WIDTH 为基准——靠左贴左、靠右贴右、居中在中心, +// 画布变宽由 Widget 弹性贴边消化,无需重算坐标。 +export const CANVAS_WIDTH = 1600; +export const CANVAS_HEIGHT = 720; + const HALF_W = DESIGN_WIDTH / 2; const HALF_H = DESIGN_HEIGHT / 2; const LEFT_ZONE = DESIGN_WIDTH / 4; // 320 diff --git a/docs/guides/配置与调试指南.md b/docs/guides/配置与调试指南.md index 9cff823..cb10d90 100644 --- a/docs/guides/配置与调试指南.md +++ b/docs/guides/配置与调试指南.md @@ -457,13 +457,13 @@ npm run typecheck:framework # 类型检查(tsc --noEmit) **步骤**: -1. 用 `cocos-creator-mcp` 的 `debug_execute_script` 注入一段临时调试入口(或挂一个调试脚本),按 [§9](#9-启动编排-resolvebootstrap-与接入-netclient) 的接入示例:`resolveBootstrap` + `HttpConfigFetcher` + `NetClient` + `CocosWebSocketTransport`。 +1. 用 `funplay-cocos-mcp` 的 `execute_javascript`(context=editor)或 `execute_editor_script` 注入一段临时调试入口(或挂一个调试脚本),按 [§9](#9-启动编排-resolvebootstrap-与接入-netclient) 的接入示例:`resolveBootstrap` + `HttpConfigFetcher` + `NetClient` + `CocosWebSocketTransport`。 - 想直连:在 `PROFILES` 临时加一档带 `server` 的 profile,或直接 `new NetClient({ servers: ['ws://<联调地址>'] })`。 - 想验证远程配置链路:把 `gameserver` 指向联调配置服,走 `resolveBootstrap` 完整流程。 2. `net.setIdentity({...result.identity, ...玩家档案})`,监听 `open`/`login`/`message`/`slow`/`reconnecting`。 3. `net.start()` 连真机。 4. 断言/观察:收到 `@toconcon` 握手不报错 → 发出 `player_login` → 收到 `player_login` 响应且 `parseLoginResponse(data).ok === true` → console 打印 `playerid`/资产。 -5. 用 `debug_get_console_logs` / `debug_screenshot` 留存联调证据。 +5. 用 `search_project_logs` / `capture_preview_screenshot` 留存联调证据。 6. 把联调结论(成功/协议偏差)回填到 `docs/protocol/` 对应章节的「⚠️待服务器确认」项。 --- diff --git a/docs/superpowers/data/layer-spirit-summary.json b/docs/superpowers/data/layer-spirit-summary.json new file mode 100644 index 0000000..03e6d0d --- /dev/null +++ b/docs/superpowers/data/layer-spirit-summary.json @@ -0,0 +1,122 @@ +{ + "_comment": "由 projects/Game_Surface_3/save/Layer*.xml (GB18030 编码) 全量解析生成。供 legacy-layer-migration 脚本逆向 gameabc.min.js 与交叉映射 YouleNexus prefab 使用。生成时间 2026-09-02。", + "summary": { + "total_layers": 68, + "total_distinct_groups": 81, + "spirit_types_found": ["0", "1", "3", "4", "5"], + "spirit_type_distribution": { + "0": {"layers_count": 44, "likely": "Sprite"}, + "1": {"layers_count": 38, "likely": "Text/Label"}, + "3": {"layers_count": 45, "likely": "ProgressBar"}, + "4": {"layers_count": 15, "likely": "unknown - need reverse gameabc.min.js (Particle?)"}, + "5": {"layers_count": 39, "likely": "unknown - need reverse gameabc.min.js (Button/Group?)"} + } + }, + "all_layers": [ + {"file": "Layer00001.xml", "id": "1", "name": "Logo_Layer", "spirits": 5, "types": ["0","1","3"], "groups": ["1","32"]}, + {"file": "Layer00002.xml", "id": "2", "name": "Login_Layer", "spirits": 18, "types": ["0","1","3","5"], "groups": ["2"]}, + {"file": "Layer00004.xml", "id": "4", "name": "MainMenu_Layer", "spirits": 32, "types": ["0","1","3","5"], "groups": ["3"]}, + {"file": "Layer00006.xml", "id": "6", "name": "Layer6", "spirits": 53, "types": ["0","1","3","4","5"], "groups": ["103","3"]}, + {"file": "Layer00007.xml", "id": "7", "name": "ewm_Layer", "spirits": 30, "types": ["1","3","4","5"], "groups": ["0","104","105"]}, + {"file": "Layer00008.xml", "id": "8", "name": "Notice_Layer", "spirits": 9, "types": ["1","3","5"], "groups": ["3","95"]}, + {"file": "Layer00009.xml", "id": "9", "name": "Feedback_Layer", "spirits": 34, "types": ["0","1","3","4","5"], "groups": ["12","42","74","98"]}, + {"file": "Layer00010.xml", "id": "10", "name": "Protol_Layer", "spirits": 4, "types": ["0","5"], "groups": ["37"]}, + {"file": "Layer00011.xml", "id": "11", "name": "ChargeInfo_Layer", "spirits": 4, "types": ["0","1"], "groups": ["20"]}, + {"file": "Layer00012.xml", "id": "12", "name": "CombatLayer", "spirits": 27, "types": ["0","1","3","4","5"], "groups": ["7","8","9"]}, + {"file": "Layer00013.xml", "id": "13", "name": "Layer13", "spirits": 6, "types": ["0","3"], "groups": ["7","8"]}, + {"file": "Layer00014.xml", "id": "14", "name": "Pay_Layer", "spirits": 43, "types": ["0","1","3","4","5"], "groups": ["53","54"]}, + {"file": "Layer00015.xml", "id": "15", "name": "JoinRoom_Layer", "spirits": 26, "types": ["0","3","4","5"], "groups": ["5"]}, + {"file": "Layer00016.xml", "id": "16", "name": "Bind_Layer", "spirits": 7, "types": ["0","1","3","5"], "groups": ["80"]}, + {"file": "Layer00017.xml", "id": "17", "name": "MenuPlayerInfo_Layer", "spirits": 15, "types": ["0","1","3","5"], "groups": ["18"]}, + {"file": "Layer00018.xml", "id": "18", "name": "Auth_layer", "spirits": 9, "types": ["0","1","3","5"], "groups": ["57"]}, + {"file": "Layer00019.xml", "id": "19", "name": "WorldRoomList_Layer", "spirits": 34, "types": ["0","1","3","4","5"], "groups": ["82","96","97"]}, + {"file": "Layer00021.xml", "id": "21", "name": "rankList_Layer", "spirits": 20, "types": ["0","1","3","5"], "groups": ["84"]}, + {"file": "Layer00022.xml", "id": "22", "name": "Share_Layer", "spirits": 6, "types": ["0","3","5"], "groups": ["11"]}, + {"file": "Layer00024.xml", "id": "24", "name": "NeighborLayer", "spirits": 7, "types": ["0","3","5"], "groups": ["88"]}, + {"file": "Layer00025.xml", "id": "25", "name": "wareHouseLayer", "spirits": 68, "types": ["0","1","3","4","5"], "groups": ["91","92","93","94"]}, + {"file": "Layer00026.xml", "id": "26", "name": "Task_Layer", "spirits": 46, "types": ["0","1","3","5"], "groups": ["10"]}, + {"file": "Layer00027.xml", "id": "27", "name": "CreateRoom_Layer", "spirits": 19, "types": ["0","1","3","5"], "groups": ["4"]}, + {"file": "Layer00028.xml", "id": "28", "name": "SeniorOptions_Layer", "spirits": 56, "types": ["0","1","3","4","5"], "groups": ["83"]}, + {"file": "Layer00029.xml", "id": "29", "name": "phoneInfo", "spirits": 38, "types": ["0","1","3","4","5"], "groups": ["106","108"]}, + {"file": "Layer00050.xml", "id": "50", "name": "MainScene_Layer", "spirits": 11, "types": ["0","1","3","4","5"], "groups": ["21"]}, + {"file": "Layer00202.xml", "id": "202", "name": "Player_Head_Score_Layer", "spirits": 60, "types": ["0","1","3","5"], "groups": ["43","44","45","46","47"]}, + {"file": "Layer00402.xml", "id": "402", "name": "GameNoticeLayer", "spirits": 2, "types": ["1","5"], "groups": ["56"]}, + {"file": "Layer00403.xml", "id": "403", "name": "Layer403", "spirits": 1, "types": ["3"], "groups": ["81"]}, + {"file": "Layer00404.xml", "id": "404", "name": "MainSceneButton_Layer", "spirits": 6, "types": ["0","1","3"], "groups": ["28"]}, + {"file": "Layer00405.xml", "id": "405", "name": "MainButton_Layer", "spirits": 6, "types": ["1","3","5"], "groups": ["21"]}, + {"file": "Layer00408.xml", "id": "408", "name": "Interact_Layer", "spirits": 21, "types": ["0","3"], "groups": ["21","39"]}, + {"file": "Layer00409.xml", "id": "409", "name": "Chat_Voice_Layer", "spirits": 20, "types": ["3","5"], "groups": ["76"]}, + {"file": "Layer00410.xml", "id": "410", "name": "Chat_Text_Layer", "spirits": 20, "types": ["1","5"], "groups": ["75"]}, + {"file": "Layer00411.xml", "id": "411", "name": "Layer411", "spirits": 6, "types": ["3","4"], "groups": ["81"]}, + {"file": "Layer00413.xml", "id": "413", "name": "btnPannelLayer", "spirits": 18, "types": ["1","3","5"], "groups": ["100","21","81","99"]}, + {"file": "Layer00416.xml", "id": "416", "name": "MainScene_PlayerInfo_Layer", "spirits": 16, "types": ["0","1","5"], "groups": ["38","77"]}, + {"file": "Layer00418.xml", "id": "418", "name": "ChatPannel_Layer", "spirits": 54, "types": ["0","1","3","5"], "groups": ["30"]}, + {"file": "Layer00420.xml", "id": "420", "name": "CheckFree_Layer", "spirits": 7, "types": ["0","1","3","5"], "groups": ["36"]}, + {"file": "Layer00601.xml", "id": "601", "name": "Layer601", "spirits": 5, "types": ["1","3","5"], "groups": ["102"]}, + {"file": "Layer00602.xml", "id": "602", "name": "inputPannel", "spirits": 19, "types": ["0","1","3","4","5"], "groups": ["87"]}, + {"file": "Layer00603.xml", "id": "603", "name": "Layer603", "spirits": 3, "types": ["0","3"], "groups": ["107"]}, + {"file": "Layer00606.xml", "id": "606", "name": "Apply_Layer", "spirits": 31, "types": ["0","1","3","4","5"], "groups": ["29","32"]}, + {"file": "Layer00607.xml", "id": "607", "name": "Cal_Layer", "spirits": 20, "types": ["0","3","4","5"], "groups": ["78","79"]}, + {"file": "Layer00608.xml", "id": "608", "name": "Help_Layer", "spirits": 7, "types": ["0","1","3","5"], "groups": ["19"]}, + {"file": "Layer00609.xml", "id": "609", "name": "Setting_Layer", "spirits": 15, "types": ["0","3","5"], "groups": ["6"]}, + {"file": "Layer00612.xml", "id": "612", "name": "Tips_Layer", "spirits": 5, "types": ["0","1","5"], "groups": ["32","89"]}, + {"file": "Layer00613.xml", "id": "613", "name": "updateRoomCard_Layer", "spirits": 3, "types": ["0","1"], "groups": ["34"]}, + {"file": "Layer00614.xml", "id": "614", "name": "Loading_Layer", "spirits": 2, "types": ["0","3"], "groups": ["40"]}, + {"file": "Layer00615.xml", "id": "615", "name": "Reconnect_Layer", "spirits": 4, "types": ["0","3"], "groups": ["35"]}, + {"file": "Layer00616.xml", "id": "616", "name": "Kick_Layer", "spirits": 3, "types": ["0","1"], "groups": ["33"]}, + {"file": "Layer00617.xml", "id": "617", "name": "iMessage_Layer", "spirits": 4, "types": ["0","1"], "groups": ["41"]}, + {"file": "Layer00618.xml", "id": "618", "name": "Layer618", "spirits": 2, "types": ["0"], "groups": ["85","86"]}, + {"file": "Layer00619.xml", "id": "619", "name": "BackHall_Layer", "spirits": 1, "types": ["3"], "groups": ["55"]}, + {"file": "Layer00620.xml", "id": "620", "name": "recordLayer", "spirits": 3, "types": ["0","3"], "groups": ["101"]} + ], + "youle_nexus_prefab_mapping": { + "Login_Layer.prefab": {"target_layer": "Layer00002.xml", "name": "Login_Layer", "groups": ["2"]}, + "views/PlayerInfoView.prefab": { + "resolved": "Layer00017.xml", + "name": "MenuPlayerInfo_Layer", + "groups": ["18"], + "spirits": 15, + "decision_note": "用户拍板 A (2026-09-02)" + }, + "templates/ListItem_Room.prefab": {"status": "NO_MATCH", "hypothesis": "ListItem_Room 可能是跨 Layer 复用的 widget 子模板(不在任何 Layer 顶层),或者是 YouleNexus 新加组件"}, + "widgets/Btn_Primary.prefab": {"status": "NO_MATCH", "hypothesis": "通用按钮 widget,可能是 YouleNexus 新加的 UI 基础组件,原项目 Layer 中以 Spirit 形式内嵌而非独立 Layer"}, + "widgets/Group106_PhoneVerify.prefab": {"target_layer": "Layer00029.xml", "name": "phoneInfo", "groups": ["106","108"]}, + "widgets/IconButton.prefab": {"status": "NO_MATCH", "hypothesis": "通用图标按钮 widget,可能 YouleNexus 新加"}, + "widgets/Layer10_Protocol.prefab": {"target_layer": "Layer00010.xml", "name": "Protol_Layer", "groups": ["37"], "spirits": 4, "types": ["0","5"]}, + "widgets/Layer609_Setting.prefab": {"target_layer": "Layer00609.xml", "name": "Setting_Layer", "groups": ["6"], "spirits": 15, "types": ["0","3","5"]}, + "widgets/Layer612_Tips.prefab": {"target_layer": "Layer00612.xml", "name": "Tips_Layer", "groups": ["32","89"], "spirits": 5, "types": ["0","1","5"]}, + "widgets/Layer613_RoomCardUpdate.prefab": {"target_layer": "Layer00613.xml", "name": "updateRoomCard_Layer", "groups": ["34"], "spirits": 3, "types": ["0","1"]}, + "widgets/Layer614_Loading.prefab": {"target_layer": "Layer00614.xml", "name": "Loading_Layer", "groups": ["40"], "spirits": 2, "types": ["0","3"]}, + "widgets/Layer615_Reconnect.prefab": {"target_layer": "Layer00615.xml", "name": "Reconnect_Layer", "groups": ["35"], "spirits": 4, "types": ["0","3"]}, + "widgets/Layer616_Kick.prefab": {"target_layer": "Layer00616.xml", "name": "Kick_Layer", "groups": ["33"], "spirits": 3, "types": ["0","1"]}, + "widgets/Layer617_Notice.prefab": { + "resolved": "Layer00008.xml", + "name": "Notice_Layer", + "groups": ["3","95"], + "spirits": 9, + "decision_note": "用户拍板 B (2026-09-02)" + }, + "widgets/Layer619_BackOtherGame.prefab": {"target_layer": "Layer00619.xml", "name": "BackHall_Layer", "groups": ["55"], "spirits": 1, "note": "Layer name 是 BackHall 不是 BackOtherGame,但 group 唯一匹配,spirit 数 1 表示是个简单 widget"}, + "widgets/Layer620_Record.prefab": {"target_layer": "Layer00620.xml", "name": "recordLayer", "groups": ["101"], "spirits": 3, "types": ["0","3"]}, + "widgets/Modal.prefab": {"status": "NO_MATCH", "hypothesis": "通用弹窗 widget,可能 YouleNexus 新加的 UI 基础组件"}, + "widgets/NumericLabel_Score.prefab": {"status": "NO_MATCH", "hypothesis": "数字滚动 Label widget,可能 YouleNexus 新加(用 Cocos 自定义 component 替代原 gameabc 数字渲染)"}, + "widgets/ProgressBar_Standard.prefab": {"status": "NO_MATCH", "hypothesis": "通用进度条 widget,可能 YouleNexus 新加或与某个 Sprite type=3 的 Spirit 对应"} + }, + "open_questions": [ + "SpiritType=4 与 SpiritType=5 的语义(gameabc.min.js 逆向)", + "Layer00007 ewm_Layer 的 group=0 表示有节点不在 group-X 父节点下(直接挂在 Layer 根)" + ], + "out_of_scope_per_user": [ + "ListItem_Room.prefab", + "Btn_Primary.prefab", + "IconButton.prefab", + "Modal.prefab", + "NumericLabel_Score.prefab", + "ProgressBar_Standard.prefab" + ], + "decision_log": [ + {"date": "2026-09-02", "topic": "PlayerInfoView", "decision": "Layer00017 MenuPlayerInfo_Layer", "by": "user"}, + {"date": "2026-09-02", "topic": "Layer617_Notice", "decision": "Layer00008 Notice_Layer", "by": "user"}, + {"date": "2026-09-02", "topic": "6 个 NO_MATCH widget", "decision": "先不做(YouleNexus 新加)", "by": "user"} + ] +} diff --git a/docs/superpowers/plans/2026-06-28-framework-core-net-protocol.md b/docs/superpowers/plans/2026-06-28-framework-core-net-protocol.md index 19427c1..640a43c 100644 --- a/docs/superpowers/plans/2026-06-28-framework-core-net-protocol.md +++ b/docs/superpowers/plans/2026-06-28-framework-core-net-protocol.md @@ -1465,7 +1465,7 @@ Co-Authored-By: Claude Opus 4.8 (1M context) " 1. `client.setIdentity(<真实身份>)`;监听 `open`/`login`/`message`/`slow`/`reconnecting`。 2. `client.start()`,连真实服务器。 3. 断言/观察:收到 `@toconcon` 不报错;发出 `player_login`;收到 `player_login` 响应且 `parseLoginResponse(...).ok === true`;console 打印 playerid/资产。 -4. 用 cocos-creator-mcp 的 `debug_get_console_logs` / `debug_screenshot` 留存联调证据。 +4. 用 funplay-cocos-mcp 的 `search_project_logs` / `capture_preview_screenshot` 留存联调证据。 验收标准:真实服务器返回的 `player_login` 被正确解析、`isSendLoginState` 门控正确放行、心跳不被误当业务包、断网后能重连重登。 diff --git a/docs/superpowers/plans/2026-08-27-ui-asset-and-skin.md b/docs/superpowers/plans/2026-08-27-ui-asset-and-skin.md index e2d9300..c5b96a0 100644 --- a/docs/superpowers/plans/2026-08-27-ui-asset-and-skin.md +++ b/docs/superpowers/plans/2026-08-27-ui-asset-and-skin.md @@ -252,7 +252,7 @@ Co-Authored-By: Claude Opus 5 (1M context) " > **非 TDD 的验证任务,但必须排在工具开发之前。** spec §6 的三条待实测项是整个构建期合成方案的承重点;若 Auto Atlas 不在构建期打包,Task 3–6 的设计需推倒重来。先验证,再建在上面。 > -> **前置条件**:需要 Cocos Creator 3.8.8 打开 `YouleNexus` 且 cocos-creator-mcp 服务可用。所有编辑器操作**必须**走 `mcp__cocos-creator-mcp__cocos_*` 工具,**绝不允许手改** `.meta`/`.pac`(CLAUDE.md)。MCP 连不上时提示用户去编辑器启动服务,不得退而求其次手改文件。 +> **前置条件**:需要 Cocos Creator 3.8.8 打开 `YouleNexus` 且 funplay-cocos-mcp 服务可用(`curl http://127.0.0.1:8765/health`)。所有编辑器操作**必须**走 `mcp__funplay_cocos__*` 工具,**绝不允许手改** `.meta`/`.pac`(CLAUDE.md)。MCP 连不上时提示用户去编辑器启用扩展,不得退而求其次手改文件。 **Files:** - Create: `cocoscreator_projects/YouleNexus/assets/framework/ui/atlas-hall/probe_a.png`(验证素材,程序生成) @@ -290,7 +290,7 @@ Expected: 打印 `生成完成`,`atlas-hall/` 下出现两个 64×64 PNG。 用 MCP 刷新资源,然后确认两张图各自生成了 `.meta`: ``` -mcp__cocos-creator-mcp__cocos_project → action: refresh_assets +mcp__funplay_cocos__refresh_assets ``` Run: `ls YouleNexus/assets/framework/ui/atlas-hall/` @@ -303,8 +303,8 @@ Expected: 出现 `probe_a.png.meta` 与 `probe_b.png.meta`。 用 MCP 在 `atlas-hall/` 下创建自动图集资源(`.pac`),然后构建一次 web-mobile: ``` -mcp__cocos-creator-mcp__cocos_asset → 创建 atlas-hall/atlas-hall.pac(自动图集) -mcp__cocos-creator-mcp__cocos_builder → 构建 platform=web-mobile +mcp__funplay_cocos__write_file → 创建 atlas-hall/atlas-hall.pac(自动图集) +mcp__funplay_cocos__run_project_preview → 构建 platform=web-mobile ``` Expected(判定标准):构建产物中 `probe_a` 与 `probe_b` **被合并进同一张图集贴图**,而非各自独立的 64×64 PNG。 @@ -1664,9 +1664,9 @@ Expected: 框架测试全部通过(原 84 个 + 本任务新增 6 个 = 90 个 用 MCP 刷新并等待编译: ``` -mcp__cocos-creator-mcp__cocos_project → action: refresh_assets -mcp__cocos-creator-mcp__cocos_debug → action: wait_compile -mcp__cocos-creator-mcp__cocos_debug → action: get_console_logs, level: error +mcp__funplay_cocos__refresh_assets +mcp__funplay_cocos__run_script_diagnostics → 等待编译 +mcp__funplay_cocos__search_project_logs → query=error, regex=true ``` Expected: 编译完成且无 error 级日志;`ui/theme/` 下四个 `.ts` 各生成 `.meta`。 diff --git a/docs/superpowers/plans/2026-08-28-legacy-ui-migration.md b/docs/superpowers/plans/2026-08-28-legacy-ui-migration.md index 9b73029..cc5c3d8 100644 --- a/docs/superpowers/plans/2026-08-28-legacy-ui-migration.md +++ b/docs/superpowers/plans/2026-08-28-legacy-ui-migration.md @@ -6,7 +6,7 @@ **Architecture:** 分两段。**Node 侧**是纯函数转换器:读 `gameabc_*.json` → 坐标换算 / 锚点推断 / 分组 / bucket 归属 / 帧切分 → 产出 55 份中间描述 JSON + 散图。**编辑器侧**读中间描述建节点存 prefab;本计划只用 MCP 跑通一个界面验证链路,不写编辑器扩展。转换器绝不直接生成 `.prefab`/`.meta`(红线)。 -**Tech Stack:** Node.js 20.13.1(ESM `.mjs`)、`node:test` + `node:assert`、`pngjs`(PNG 编解码,见 Global Constraints 的例外说明);编辑器侧走 `mcp__cocos-creator-mcp__cocos_*`。 +**Tech Stack:** Node.js 20.13.1(ESM `.mjs`)、`node:test` + `node:assert`、`pngjs`(PNG 编解码,见 Global Constraints 的例外说明);编辑器侧走 `mcp__funplay_cocos__*`。 **Spec:** `docs/superpowers/specs/2026-08-28-legacy-ui-migration-design.md` @@ -1456,7 +1456,7 @@ Expected: 中间描述 56 个、散图 1306 张、ObjectID 索引 991 条。 - [ ] **Step 5: 让编辑器导入散图并确认无错** -用 MCP 刷新资源(工具名用 `ToolSearch` 自行发现,当前扩展为 `cocos-mcp-server` 的 16 个聚合工具;刷新资源大概率是 `cocos_asset` 的某个 action,可用 `cocos_knowledge {topic:"tool_guide", query:"asset.refresh"}` 查用法)。 +用 MCP 刷新资源(直接调 `mcp__funplay_cocos__refresh_assets`;工具列表可查 `get_tool_catalog`,按返回值核对)。 Expected: 1306 张图被导入并各自生成 `.meta`;无 error 级日志。 @@ -1484,7 +1484,7 @@ Co-Authored-By: Claude Opus 5 (1M context) " > **非 TDD 的验证任务。** 目的是证明「中间描述 → Cocos prefab」这条链路成立,并量出落地一个界面的实际耗时,据此判断是否值得写编辑器扩展批量跑完其余 54 个。 > -> **前置条件**:Cocos Creator 打开 `YouleNexus` 且 cocos-mcp-server 服务可用。所有编辑器操作**必须**走 `mcp__cocos-creator-mcp__cocos_*`;**绝不允许手写** `.prefab`/`.meta`。MCP 不可用时提示用户启动服务,不得退而求其次手改文件。 +> **前置条件**:Cocos Creator 打开 `YouleNexus` 且 funplay-cocos-mcp 服务可用(`curl http://127.0.0.1:8765/health`)。所有编辑器操作**必须**走 `mcp__funplay_cocos__*`;**绝不允许手写** `.prefab`/`.meta`。MCP 不可用时提示用户去编辑器启用扩展,不得退而求其次手改文件。 **Files:** - Create: `cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab`(由编辑器生成) diff --git a/docs/superpowers/plans/2026-08-30-platform-logic-migration.md b/docs/superpowers/plans/2026-08-30-platform-logic-migration.md new file mode 100644 index 0000000..1ca90cf --- /dev/null +++ b/docs/superpowers/plans/2026-08-30-platform-logic-migration.md @@ -0,0 +1,142 @@ +# 平台逻辑移植(子系统 C)开发计划 —— 从当前进度到「逻辑流程一致」验收 + +> **For agentic workers:** 执行时使用 `superpowers:subagent-driven-development`(推荐)或 `superpowers:executing-plans`,任务用 `- [ ]` checkbox 跟踪。 +> 顶层路线图:本计划定义阶段边界、依赖、验收;阶段 1 直接续用 `2026-06-28-platform-store.md`,阶段 4/5 复用 `2026-08-27-ui-asset-and-skin.md`、`2026-08-28-legacy-ui-migration.md`,阶段 2/3 为新增(执行时各自展开为 TDD 任务)。 + +**Goal:** 把子系统 C 规范(`docs/superpowers/specs/2026-08-30-legacy-platform-logic-migration.md`)的 §3 落点全部落地,使 §8 的 10 条「逻辑流程一致性检查点」全部通过。 + +**策略假设(可纠正点)**:**端到端逻辑主线优先,UI 大面积落地收尾**——先打通「启动 → 建连 → 登录 → 进房/大厅 → 对局分发」这条纯逻辑主线(Store/session/protocol/sdk),UI 用最小占位(已有 `Login_Layer.prefab`);最后再批量落地 55 界面。理由:C 规范的目标是「逻辑流程一致」而非「像素一致」,逻辑主线是协议契约与业务正确性的承重墙,UI 是响应式 Store 的下游视图、可后置。 + +**基线(已完成,勿重复)**:`core`(含 `reactive.ts`)、`net`(transport/net-client/envelope-codec/heartbeat/reconnect)、`protocol`(login + 4 rpc)、`config`(完整)、`platform`(player-store + types + readonly)、`ui/theme`。真机联调 `player_login` 往返已通过。 + +--- + +## 阶段总览(依赖图) + +``` +阶段1 三态机+session ──┐ + ├─► 阶段2 协议+收包路由 ──► 阶段3 sdk+重连 ──► 阶段5 真机联调 +阶段4 UI落地(并行) ────┘ (可与4并行) (依赖2) +阶段5 原生桥(并行) ───────────────────────────────────────────────┘ +``` + +| 阶段 | 内容 | 依赖 | 产出 | 复用现有 plan | +|---|---|---|---|---| +| **1** | platform 三态机 + session | 无(reactive/types/player 已就绪) | AppStore/RoomStore/PlatformSession | ✅ `2026-06-28-platform-store.md` Task 4/5/6 | +| **2** | 启动接线 + protocol 补全 + 收包路由 + 房间事件 | 阶段 1 | rpc 常量、Router、房间 handler、PlayerStore 补全 | 新写 | +| **3** | sdk(IGameModule/GameContext)+ 断线重连 | 阶段 2 | GameContext、IGameModule、deskinfo 透传 | 新写(= 原「Plan 5」主体) | +| **4** | UI 界面落地(55 界面 + FrameSet) | 阶段 1(响应式 Store) | FrameSet 组件、界面控制器、批量 prefab | ✅ `2026-08-28-legacy-ui-migration.md` + 新写控制器 | +| **5** | 原生桥(WVJB)+ 真机端到端联调 | 阶段 3/4 | 完整 WVJB 桥、端到端验收 | 新写(= 原「Plan 5」收尾) | + +--- + +## 阶段 1:platform 三态机 + session(续现有 plan) + +**目标**:`AppStore`(=GameData) / `RoomStore`(=Desk) / `PlatformSession`(=12_Logic 登录接入),使 login 事件 → 三 Store 正确填充 + 相位流转。 + +**直接续用** `docs/superpowers/plans/2026-06-28-platform-store.md` 的 **Task 4(AppStore)、Task 5(RoomStore)、Task 6(PlatformSession)**——该 plan 已含完整代码与测试,此处不重写,按原 TDD 流程执行。 + +- [ ] Task 4:`platform/stores/app-store.ts`(AppStore:setIdentity/setServers/setPhase/applyLogin) +- [ ] Task 5:`platform/stores/room-store.ts`(RoomStore:applyRecovery/clear,`players` 座位数组 + `deskinfo` opaque 透传) +- [ ] Task 6:`platform/session.ts`(PlatformSession 订阅 NetClient 事件总线 → 填充三 Store,相位流转) + +**验收**:`npm run test:framework` 全绿(含 app-store 3 + room-store 3 + session 4 用例);`typecheck:framework` exit 0;login 含 `roomcode` 时 `RoomStore.inRoom=true` + `deskinfo` 原样透传。 + +--- + +## 阶段 2:启动接线 + protocol 补全 + 收包路由 + 房间事件 + +**目标**:把「收包 → 路由分界 → Store 更新」这条主线打通,覆盖 C 规范 §4.1(路由分界)与 §6.2(登录分支)。 + +### Task 2.1 — protocol 补全 rpc 常量(对应 C §3 `02_Const` 落点) + +- [ ] 从旧 `02_Const.js` 的 `RpcList`(:13–109,~100 个)提取平台层 rpc,落 `protocol/routes.ts`(扩展 `Rpc`,保持函数名==rpc 字符串的同构映射)。 +- [ ] 至少覆盖房间类 rpc(`create_room`/`self_join_room`/`self_exit_room`/`other_exit_room`/`self_makewar`/`player_prepare`/`self_apply_free_room`/`change_seat`/`update_bean`/`connect_roomserver`…)与玩家类(`update_bean`/`set_sign`/`set_tel`…)。 +- **验收**:`Rpc` 常量与 `docs/protocol/` 的 rpc 字符串逐字节一致;typecheck 通过。 + +### Task 2.2 — 收包路由分界(C §4.1 的红线) + +- [ ] 在 `net-client.ts`(或新建 `protocol/router.ts`)实现 Router:`route ∈ {platform,agent,room}` → 平台 handler;`route = ` → sdk 钩子(阶段 3 接上,本阶段先留 `onGameRoute` 空钩子 + 未注册时显式报错,不静默吞包)。 +- [ ] `connect_roomserver`/`connect_agentserver` 换服逻辑已存在(`net-client.ts:129-133`),补「换服后重发登录」的触发。 +- **验收**:单测:platform 包 → 平台 handler 被调;对局 route 未注册 → 显式报错(第二准则:不兜底)。 + +### Task 2.3 — 房间事件 handler → RoomStore/PlayerStore 更新(C §6.4) + +- [ ] 新建 `protocol/room.ts`(或 `platform/room-handlers.ts`):`self_join_room`/`other_join_room`/`self_exit_room`/`other_exit_room`/`self_makewar`/`player_prepare`/`self/other_apply/agree/refuse_free_room`/`other_offline/online`/`change_seat` → 更新 `RoomStore`(座位、`stage`、`state`、`AgreeList`)。 +- [ ] `PlayerStore` 补全 `update_bean`/`update_roomcard`/`setCharm`/`setSign`/`setTel`(对应 C §3.1 消除双镜像:bean/roomcard 只写 `PlayerStore`,`RoomStore.players[seat]` 是同一响应式来源的投影)。 +- **验收**:单测:每个房间 rpc 收包 → RoomStore/PlayerStore 字段正确变化;解散投票 `AgreeList` 累积正确。 + +### Task 2.4 — 启动接线(C §6.1 启动流程) + +- [ ] 把 `config/bootstrap` 的 `resolveBootstrap` 结果接 `AppStore.setIdentity/setServers`;`new PlatformSession(net.bus)` + `net.start()`。 +- [ ] 首屏门控四条件(资源/WS onopen/配置/加载计时器)合成一个「就绪信号」→ 登录页(UI 阶段 4 接,本阶段先暴露 `AppStore.phase` 状态)。 +- **验收**:启动编排单测:bootstrap → AppStore 身份/服务器就绪 → net.start 建连。 + +--- + +## 阶段 3:sdk(IGameModule/GameContext)+ 断线重连 + +**目标**:建立子游戏对接边界,收包路由对局分支接上 sdk,`deskinfo` 透传 + 断线重连恢复(C §4.1/§5 边界判据、§6.3)。 + +### Task 3.1 — `sdk/GameContext` facade(C §3 `08_Utl_Output` 落点) + +- [ ] 只读暴露:`room`/`player`(只读 Store)、`net.send(route,rpc,data)`、`seat.toView(mySeat,target)`(替代旧 `ChangeToStatus`)、`ui` 占位(toast/dialog)。 +- [ ] 旧 `08_Utl_Output.js` 的只读 getter(`getMyInfo`/`getRoomcode`/`getPlayerList`/`getMySeat`…)→ facade 方法或直接只读 Store。 +- **验收**:单测:facade 只读、不可逆改 Store;`seat.toView` 与旧 `ChangeToStatus` 同结果。 + +### Task 3.2 — `IGameModule` 接口 + 注册(框架 spec §4) + +- [ ] 定义 `IGameModule`(`route`/`onEnter`/`onExit`/`onReceive`/`onReconnect`/`serialize`/平台钩子默认空实现)。 +- [ ] 注册机制:子游戏注册自己,Router 据 `route` 分发对局包 → `activeGame.onReceive`。 +- **验收**:单测:注册 mock 子游戏 → 对局 route 包 → `onReceive` 被调;未注册 → 显式报错。 + +### Task 3.3 — `deskinfo` 透传 + 断线重连(C §6.3) + +- [ ] login 回包含 `deskinfo`(`isbattle==1`)→ `RoomStore` 只透传不解析 → `activeGame.onReconnect(deskinfo)`。 +- [ ] 断线重连完整链路:`net/reconnect` 重连 → 重发登录 → `deskinfo` 恢复对局。 +- **验收**:集成测试:login(deskinfo) → `onReconnect` 收到原样快照;断线 → 重连 → 重发登录。 + +--- + +## 阶段 4(并行):UI 界面落地 + +**目标**:从 55 界面中间描述批量落地 Cocos 界面,响应式订阅 Store,界面切换走 `node.active` + `AppStore.currentScene`(C §6.5)。 + +- [ ] **Task 4.1 FrameSet 组件**(B §3.4):多帧图切帧的运行时载体(`setFrame(n)`,1 基帧号)。 +- [ ] **Task 4.2 界面控制器**:登录/大厅/房间 + 各弹窗,`subscribe` 三 Store 自动刷新;`Login_Layer.prefab` 接入真实登录数据。 +- [ ] **Task 4.3 批量落地**:复用 `2026-08-28-legacy-ui-migration.md` 的 convert 管线,把 55 个 layer JSON → prefab(当前仅 Login_Layer 已落)。 +- [ ] **Task 4.4 界面切换**:`AppStore.currentScene` 状态替代 `get_self(149,37)` 哨兵。 + +**验收**:登录→大厅→房间 界面切换正确;帧动画走 FrameSet;UI 由 Store 响应式驱动(无手工刷新)。 + +--- + +## 阶段 5(并行收尾):原生桥 + 真机端到端联调 + +- [ ] **Task 5.1 WVJB 完整异步桥**(原「Plan 5」):`window.settings` 同步取值 + `setupWebViewJavascriptBridge` 异步注册,接口名/数据格式/URL 构造与旧逐字一致(`native-bridge-contract` 技能)。 +- [ ] **Task 5.2 真机端到端**:登录 → 大厅 → 进房 → 对局(mock/seed 子游戏)→ 结算,联调本地服。 +- [ ] **Task 5.3 断线重连真机验证**:`isbattle==1` 时 `deskinfo` 恢复对局。 + +--- + +## 验收标准(映射 C 规范 §8 检查点) + +- [ ] 信封 `{app,route,rpc,data}` 逐字节对齐(✅ 已有,回归不破坏) +- [ ] 收包分界:`platform/agent/room` → 平台 handler;对局 route → `onReceive`;未注册显式报错(阶段 2/3) +- [ ] 发包 HTTP 兜底(`netType==1`)+ `player_login` 的 `putMsg="playerLogin"`(阶段 2) +- [ ] 启动门控四条件合成就绪信号(阶段 2) +- [ ] 登录分支:`roomcode`/`deskinfo` 有无 → 大厅 or 房间 or `onReconnect`(阶段 1/3) +- [ ] 断线重连 + `deskinfo` 恢复(阶段 3/5) +- [ ] 三态机单一来源,无双镜像(阶段 1/2) +- [ ] 对局态 `deskinfo` 平台层不解析、原样透传(阶段 3) +- [ ] 界面切换 `node.active` + `currentScene`,不搬 `set_level`(阶段 4) +- [ ] 原生接口逐字一致(阶段 5) + +--- + +## 风险与依赖 + +1. **UI 落地量大**(55 界面、旧 9862 行)——通过「逻辑主线先行 + 响应式 Store 后置 UI」隔离,UI 延迟不阻塞阶段 2/3 的协议正确性验证。 +2. **对局 route 的 sdk 分界是红线**——阶段 2.2 先留「未注册显式报错」,避免静默吞包(第二准则)。 +3. **`set_windows`/`players` 完整建模**等次要项——按 C §9.3 待验证清单在对应阶段落地时回填,不阻塞主线。 +4. **换肤/打包(ui-asset-skin plan)**——独立于本计划,需在阶段 4 UI 落地时同步执行(散图 → Auto Atlas 打包),避免 UI 落地后返工。 diff --git a/docs/superpowers/plans/2026-09-02-legacy-layer-migration.md b/docs/superpowers/plans/2026-09-02-legacy-layer-migration.md new file mode 100644 index 0000000..f801463 --- /dev/null +++ b/docs/superpowers/plans/2026-09-02-legacy-layer-migration.md @@ -0,0 +1,1337 @@ +# legacy-layer → Cocos prefab 转换脚本 Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 写 `scripts/legacy-layer-to-cocos-prefab.mjs` 程序化转换 Game_Surface_3 的 `save/Layer*.xml` 到 Cocos prefab JSON,让 YouleNexus 已迁移的 11 个组件 prefab 1:1 对齐原项目布局+精灵+Widget 锚定。 + +**Architecture:** 单文件 Node.js 脚本(GB18030 解码 XML + gameabc 语义映射 + prefab JSON 输出)+ 7 个 `node:test` 测试文件。脚本生成候选 .prefab 到隔离目录 + .diff 文件供人审,**不直接覆盖 YouleNexus 原 prefab**。 + +**Tech Stack:** Node.js 20.13.1(ESM `.mjs`)、`node:test` + `node:assert` + `tsx`、`iconv-lite`(GB18030 解码)、`@xmldom/xmldom`(XML 解析)。零游戏引擎依赖(仅做文本→JSON 转换,不调 Cocos API)。 + +**Spec:** `docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md` + +## Global Constraints + +- **服务器零改动**(CLAUDE.md 第一准则):本计划不触碰协议,与 UI 复刻无关。 +- **数据源权威唯一、下游不兜底**(CLAUDE.md 第二准则):找不到的字段/类型/UUID 一律 throw + 列出所有未映射项;不静默 fallback 到默认值。 +- **GB18030 编码**:`save/Layer*.xml` 必须用 `iconv-lite` GB18030 解码(实测 GBK 解码会乱码)。 +- **锚点转换公式**:原 X, Y 是精灵**左上角**绝对屏幕坐标(基于 1280×720);Cocos 用**中心**锚点。 + - `cocos_lpos.x = original_X + original_W/2 - 640`(原坐标系半宽 1280/2) + - `cocos_lpos.y = 360 - (original_Y + original_H/2)`(Y-up 翻转 + 半高 720/2) +- **group-X 父节点命名**:保留原 BelongGroupID 值作 group 编号(不重排),与 Login_Layer 复刻习惯一致;group=0 节点直接挂 Layer 根。 +- **不直接覆盖原 prefab**:脚本只输出到 `cocoscreator_projects/YouleNexus/out/legacy-migration/`,由人审 .diff 后决定是否覆盖。 +- **Node 20.13.1 不支持 `--test` glob**:测试文件须显式枚举(用 `scripts/run-framework-tests.mjs`)。 +- **所有路径以 monorepo 根 `G:/Works/YouleGamesCocosCreator/cocoscreator_projects/` 为基准**。 +- **不在范围**(用户拍板 C,先不做):ListItem_Room / Btn_Primary / IconButton / Modal / NumericLabel_Score / ProgressBar_Standard 6 个 NO_MATCH widget。 + +--- + +## Task 1: 项目脚手架 + 测试运行器验证 + +**Files:** +- Modify: `cocoscreator_projects/YouleNexus/package.json`(添加 `iconv-lite` + `@xmldom/xmldom` 依赖) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/.gitkeep` +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/.gitkeep` +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/gameabc_Image.json`(从 `projects/Game_Surface_3/output/gameabc_Image.json` 复制) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/Layer00002.xml`(从 `projects/Game_Surface_3/save/Layer00002.xml` 复制,**保留 GB18030 原编码**) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/Login_Layer.prefab`(从 `cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab` 复制) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json`(gameabc.min.js 逆向骨架,初始只含已知 5 种 SpiritType) + +- [ ] **Step 1: 添加 iconv-lite + @xmldom/xmldom 依赖** + +读 `cocoscreator_projects/YouleNexus/package.json` 检查现有依赖结构。若 YouleNexus 没有 package.json,则用 `cd cocoscreator_projects/YouleNexus && npm init -y` 初始化,然后: + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects/YouleNexus +npm install --save iconv-lite @xmldom/xmldom +``` + +期望:`package.json` 出现 `"iconv-lite"` 和 `"@xmldom/xmldom"` 条目。 + +- [ ] **Step 2: 创建目录 + 复制 fixtures** + +```bash +mkdir -p G:/Works/YouleGamesCocosCreator/cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures + +cp G:/Works/YouleGamesCocosCreator/projects/Game_Surface_3/output/gameabc_Image.json \ + G:/Works/YouleGamesCocosCreator/cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/gameabc_Image.json + +cp G:/Works/YouleGamesCocosCreator/projects/Game_Surface_3/save/Layer00002.xml \ + G:/Works/YouleGamesCocosCreator/cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/Layer00002.xml + +cp G:/Works/YouleGamesCocosCreator/cocoscreator_projects/YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab \ + G:/Works/YouleGamesCocosCreator/cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/Login_Layer.prefab +``` + +期望:`fixtures/` 目录下有 3 个文件 + Login_Layer.prefab.meta(不复制 meta,只复制 .prefab 本身用于 schema 对比)。 + +- [ ] **Step 3: 写 spirit-semantics.json 骨架** + +```json +{ + "spirit_types": { + "0": { "component": "cc.Sprite", "note": "普通精灵" }, + "1": { "component": "cc.Label", "note": "文本" }, + "3": { "component": "cc.ProgressBar", "note": "进度条" }, + "4": { "component": "unknown", "note": "PoC 阶段 1 逆向 gameabc.min.js" }, + "5": { "component": "unknown", "note": "PoC 阶段 1 逆向 gameabc.min.js" } + }, + "coord_self_pos": { + "_note": "原 X, Y 是精灵左上角绝对屏幕坐标 (基于 1280x720);Cocos 用中心锚点", + "cocos_lpos_x": "original_X + original_W/2 - 640", + "cocos_lpos_y": "360 - (original_Y + original_H/2)" + }, + "anchor_point": { + "cocos_default": { "x": 0.5, "y": 0.5 }, + "original_default": "左上角 (0, 0)" + } +} +``` + +写到 `fixtures/spirit-semantics.json`。 + +- [ ] **Step 4: 验证 iconv-lite 能解码 GB18030** + +写最小验证脚本 `framework-tests/legacy-layer-migration/_smoke-iconv.mjs`: + +```javascript +import { readFileSync } from 'node:fs'; +import iconv from 'iconv-lite'; + +const buf = readFileSync('fixtures/Layer00002.xml'); +const text = iconv.decode(buf, 'gb18030'); +console.log('decoded length:', text.length); +console.log('contains 微信登录背景:', text.includes('微信登录背景')); +console.log('contains Login_Layer:', text.includes('Login_Layer')); +``` + +期望输出:decoded length > 5000;两行 contains 都输出 true。 + +- [ ] **Step 5: 跑通 smoke test** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node framework-tests/legacy-layer-migration/_smoke-iconv.mjs +``` + +期望:3 行输出,decoded length 在 5000-10000 之间。 + +- [ ] **Step 6: Commit** + +```bash +git add cocoscreator_projects/YouleNexus/package.json cocoscreator_projects/framework-tests/legacy-layer-migration/ +git commit -m "feat(scripts): legacy-layer 转换器脚手架 + fixtures + GB18030 smoke test" +``` + +--- + +## Task 2: xml-parser(GB18030 读 XML + 字段提取) + +**Files:** +- Create: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(仅 readLayerXml 函数) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/xml-parser.test.mjs` + +**Interfaces:** +- Consumes: `fixtures/Layer00002.xml`(GB18030 字节) +- Produces: `readLayerXml(path) → { layerId, layerName, spirits: Array<{ id, name, type, imgResID, x, y, w, h, group, indexOfLayer }> }` + +- [ ] **Step 1: 写失败测试** + +`framework-tests/legacy-layer-migration/xml-parser.test.mjs`: + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readLayerXml } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('readLayerXml 解码 GB18030 并提取 Layer00002 字段', () => { + const layer = readLayerXml('framework-tests/legacy-layer-migration/fixtures/Layer00002.xml'); + + assert.equal(layer.layerId, '2'); + assert.equal(layer.layerName, 'Login_Layer'); + assert.equal(layer.spirits.length, 18, 'Login_Layer 有 18 个 Spirit'); +}); + +test('Spirit 字段完整提取(含中文名)', () => { + const layer = readLayerXml('framework-tests/legacy-layer-migration/fixtures/Layer00002.xml'); + // 找一个已知 Spirit(渠道logo 类,Spirit405) + const spirit405 = layer.spirits.find(s => s.id === '405'); + assert.ok(spirit405, 'Spirit id=405 应存在'); + assert.match(spirit405.name, /渠道/); // GB18030 解码后中文名应正常 + assert.equal(spirit405.type, '0'); // Sprite + assert.equal(spirit405.x, '734'); + assert.equal(spirit405.y, '143'); + assert.equal(spirit405.w, '59'); + assert.equal(spirit405.h, '148'); + assert.equal(spirit405.group, '2'); +}); + +test('BelongGroupID 提取(group=0 节点也存在)', () => { + const layer = readLayerXml('framework-tests/legacy-layer-migration/fixtures/Layer00002.xml'); + // 全部 Spirit 的 group 字段都应有值 + for (const s of layer.spirits) { + assert.ok(s.group !== undefined, `Spirit ${s.id} (${s.name}) 应有 group 字段`); + } + // group=0 节点(如有)也应被提取,不被过滤 + const g0 = layer.spirits.filter(s => s.group === '0'); + assert.ok(g0.length >= 0); // Login_Layer 没有 group=0,但提取逻辑应支持 +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/xml-parser.test.mjs +``` + +期望:FAIL with `readLayerXml is not defined` 或类似(脚本未实现)。 + +- [ ] **Step 3: 实现 readLayerXml** + +`scripts/legacy-layer-to-cocos-prefab.mjs` 头部: + +```javascript +import { readFileSync } from 'node:fs'; +import iconv from 'iconv-lite'; +import { DOMParser } from '@xmldom/xmldom'; + +export function readLayerXml(path) { + const buf = readFileSync(path); + const text = iconv.decode(buf, 'gb18030'); + const doc = new DOMParser().parseFromString(text, 'text/xml'); + + const getProp = (el, name) => { + const prop = Array.from(el.getElementsByTagName('Property')) + .find(p => p.getAttribute('Name') === name); + return prop?.getAttribute('Value'); + }; + + // 提取 Layer 字段 + const layerPropList = doc.getElementsByTagName('Layer')[0].getElementsByTagName('PropertyList')[0]; + const layerId = getProp(layerPropList, 'ID'); + const layerName = getProp(layerPropList, 'Name'); + + // 提取所有 Spirit + const spiritEls = doc.getElementsByTagName('Spirit'); + const spirits = Array.from(spiritEls).map(sp => { + const propList = sp.getElementsByTagName('PropertyList')[0]; + return { + id: getProp(propList, 'ID'), + name: getProp(propList, 'Name'), + type: getProp(propList, 'SpiritType'), + imgResID: getProp(propList, 'ImgResID'), + x: getProp(propList, 'X'), + y: getProp(propList, 'Y'), + w: getProp(propList, 'Width'), + h: getProp(propList, 'Height'), + group: getProp(propList, 'BelongGroupID'), + indexOfLayer: getProp(propList, 'IndexOfLayer'), + }; + }); + + return { layerId, layerName, spirits }; +} +``` + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/xml-parser.test.mjs +``` + +期望:3 个 test 全 PASS。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/xml-parser.test.mjs +git commit -m "feat(scripts): readLayerXml - GB18030 解码 + Layer/Spirit 字段提取" +``` + +--- + +## Task 3: coord-calculator(锚点转换公式) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(追加 computeLpos / computeContentSize) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/coord-calculator.test.mjs` + +**Interfaces:** +- Consumes: 单个 Spirit 对象 `{ x, y, w, h, ... }` +- Produces: `computeLpos(spirit) → { x: number, y: number, z: 0 }`, `computeContentSize(spirit) → { width: number, height: number }` + +- [ ] **Step 1: 写失败测试** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { computeLpos, computeContentSize } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('computeLpos 锚点转换(实测验证:渠道logo)', () => { + const spirit = { x: '734', y: '143', w: '59', h: '148' }; + const lpos = computeLpos(spirit); + // 公式: x = 734 + 59/2 - 640 = 123.5 + // 公式: y = 360 - (143 + 148/2) = 143 + assert.equal(lpos.x, 123.5); + assert.equal(lpos.y, 143); + assert.equal(lpos.z, 0); +}); + +test('computeLpos 锚点转换(实测验证:游客登录)', () => { + const spirit = { x: '540', y: '388', w: '320', h: '95' }; + const lpos = computeLpos(spirit); + // x = 540 + 160 - 640 = 60 + // y = 360 - (388 + 47.5) = -75.5 + assert.equal(lpos.x, 60); + assert.equal(lpos.y, -75.5); +}); + +test('computeLpos 字符串转数字(X/Y 为字符串 "0"/"-100")', () => { + const spirit = { x: '0', y: '-100', w: '100', h: '100' }; + const lpos = computeLpos(spirit); + // x = 0 + 50 - 640 = -590 + // y = 360 - (-100 + 50) = 410 + assert.equal(lpos.x, -590); + assert.equal(lpos.y, 410); +}); + +test('computeContentSize 直接读 Width/Height(SizeCalcMode=0 路径)', () => { + const spirit = { w: '320', h: '95', sizeCalcMode: '0' }; + const size = computeContentSize(spirit); + assert.equal(size.width, 320); + assert.equal(size.height, 95); +}); + +test('computeContentSize SizeCalcMode=2 用 SizeParent 链式计算(PoC 验证用)', () => { + // 此测试可能跳过直到逆向 gameabc.min.js 后启用 + // const spirit = { w: '1280', h: '720', sizeCalcMode: '2', sizeParentID: '21', sizeRelaWidth: '10000', sizeRelaHeight: '10000' }; + // const size = computeContentSize(spirit, parentLookup); + // 公式逆向后再启用 +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/coord-calculator.test.mjs +``` + +期望:FAIL `computeLpos is not a function`。 + +- [ ] **Step 3: 实现 computeLpos / computeContentSize(SizeCalcMode=0 路径)** + +追加到 `scripts/legacy-layer-to-cocos-prefab.mjs`: + +```javascript +export function computeLpos(spirit) { + const x = parseFloat(spirit.x || '0'); + const y = parseFloat(spirit.y || '0'); + const w = parseFloat(spirit.w || '0'); + const h = parseFloat(spirit.h || '0'); + // 锚点转换:原 X/Y 是左上角(1280x720 绝对坐标)→ Cocos 中心锚点 + return { + x: x + w / 2 - 640, // 原坐标系半宽 1280/2 + y: 360 - (y + h / 2), // Y-up 翻转 + 半高 720/2 + z: 0, + }; +} + +export function computeContentSize(spirit) { + // SizeCalcMode=0 路径:直接读 Width/Height + // SizeCalcMode>0 路径:PoC 阶段 1 逆向 gameabc.min.js 后实现 + const sizeCalcMode = parseInt(spirit.sizeCalcMode || '0', 10); + if (sizeCalcMode !== 0) { + throw new Error(`SizeCalcMode=${sizeCalcMode} not yet supported for Spirit ${spirit.id} (${spirit.name}) - reverse gameabc.min.js first`); + } + return { + width: parseFloat(spirit.w || '0'), + height: parseFloat(spirit.h || '0'), + }; +} +``` + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/coord-calculator.test.mjs +``` + +期望:4 个 test PASS(SizeCalcMode=2 那个跳过注释掉)。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/coord-calculator.test.mjs +git commit -m "feat(scripts): computeLpos / computeContentSize - 锚点转换公式(实测验证)" +``` + +--- + +## Task 4: group-builder(BelongGroupID → group-X 父节点) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(追加 buildGroupParents) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/group-builder.test.mjs` + +**Interfaces:** +- Consumes: `spirits: Array<{ ..., group: string }>` +- Produces: `buildGroupParents(spirits) → { groupParents: Array<{ name: string, childSpiritIds: string[] }>, rootChildSpiritIds: string[] }` + +- [ ] **Step 1: 写失败测试** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { buildGroupParents } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('buildGroupParents 把同 group Spirit 归类', () => { + const spirits = [ + { id: '1', group: '2', indexOfLayer: '1' }, + { id: '405', group: '2', indexOfLayer: '2' }, + { id: '285', group: '2', indexOfLayer: '3' }, + ]; + const result = buildGroupParents(spirits); + assert.equal(result.groupParents.length, 1, '只有一个 group=2'); + assert.equal(result.groupParents[0].name, 'group-2'); + assert.deepEqual(result.groupParents[0].childSpiritIds, ['1', '405', '285']); + assert.equal(result.rootChildSpiritIds.length, 0); +}); + +test('buildGroupParents 多 group 按 ID 升序', () => { + const spirits = [ + { id: '1', group: '32', indexOfLayer: '1' }, + { id: '2', group: '1', indexOfLayer: '2' }, + { id: '3', group: '1', indexOfLayer: '3' }, + ]; + const result = buildGroupParents(spirits); + assert.deepEqual(result.groupParents.map(g => g.name), ['group-1', 'group-32']); +}); + +test('buildGroupParents group=0 Spirit 直挂 Layer 根', () => { + const spirits = [ + { id: '10', group: '0', indexOfLayer: '1' }, + { id: '20', group: '0', indexOfLayer: '2' }, + { id: '30', group: '2', indexOfLayer: '3' }, + ]; + const result = buildGroupParents(spirits); + assert.equal(result.groupParents.length, 1); + assert.deepEqual(result.rootChildSpiritIds, ['10', '20']); +}); + +test('buildGroupParents 按 IndexOfLayer 排序子节点', () => { + const spirits = [ + { id: 'c', group: '1', indexOfLayer: '3' }, + { id: 'a', group: '1', indexOfLayer: '1' }, + { id: 'b', group: '1', indexOfLayer: '2' }, + ]; + const result = buildGroupParents(spirits); + assert.deepEqual(result.groupParents[0].childSpiritIds, ['a', 'b', 'c']); +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/group-builder.test.mjs +``` + +期望:FAIL `buildGroupParents is not a function`。 + +- [ ] **Step 3: 实现 buildGroupParents** + +追加: + +```javascript +export function buildGroupParents(spirits) { + const groupMap = new Map(); // group_id -> [{ spiritId, index }] + const rootSpirits = []; + + for (const s of spirits) { + if (s.group === '0' || !s.group) { + rootSpirits.push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) }); + } else { + if (!groupMap.has(s.group)) groupMap.set(s.group, []); + groupMap.get(s.group).push({ spiritId: s.id, index: parseInt(s.indexOfLayer || '0', 10) }); + } + } + + const groupParents = Array.from(groupMap.entries()) + .sort(([a], [b]) => parseInt(a, 10) - parseInt(b, 10)) + .map(([gid, items]) => ({ + name: `group-${gid}`, + childSpiritIds: items.sort((a, b) => a.index - b.index).map(x => x.spiritId), + })); + + const rootChildSpiritIds = rootSpirits + .sort((a, b) => a.index - b.index) + .map(x => x.spiritId); + + return { groupParents, rootChildSpiritIds }; +} +``` + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/group-builder.test.mjs +``` + +期望:4 个 test PASS。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/group-builder.test.mjs +git commit -m "feat(scripts): buildGroupParents - BelongGroupID → group-X 父节点归类" +``` + +--- + +## Task 5: gameabc.min.js 逆向(SpiritType 4/5 + SizeCalcMode>0 公式) + +**Files:** +- Modify: `cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json` +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/spirit-type-reverse.test.mjs` + +**Interfaces:** +- Consumes: 读 `projects/Game_Surface_3/js/gameabc.min.js`(minified)+ 已知 Layer XML 数据 +- Produces: 更新 `fixtures/spirit-semantics.json` 含 5 种 SpiritType 全部语义 + SizeCalcMode 公式 + +- [ ] **Step 1: 提取 gameabc.min.js 中 SpiritType 相关字符串** + +```bash +cd G:/Works/YouleGamesCocosCreator/projects/Game_Surface_3 +grep -oE 'SpiritType[^,;}]{0,80}' js/gameabc.min.js | head -30 +``` + +期望输出:找到 SpiritType 字段被读取/写入的所有位置。 + +- [ ] **Step 2: 用 IconButton / Btn_Primary PoC 反推 SpiritType 4/5 语义** + +```bash +# 找一个含 type=4 的 Spirit 所在的 Layer +grep -l 'SpiritType" Value="4"' /G:/Works/YouleGamesCocosCreator/projects/Game_Surface_3/save/*.xml | head -3 +``` + +读这些 XML + 对比 Login_Layer 复刻 + 在 Cocos 编辑器中用 mcp 看对应的 prefab(如果存在)。 + +- [ ] **Step 3: 写测试验证 SpiritType 4/5 的组件映射** + +`framework-tests/legacy-layer-migration/spirit-type-reverse.test.mjs`: + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; + +const semantics = JSON.parse(readFileSync('framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json', 'utf8')); + +test('SpiritType 4 有明确组件映射(PoC 后填)', () => { + assert.notEqual(semantics.spirit_types['4'].component, 'unknown', + 'SpiritType 4 必须是已知组件,不能是 unknown'); +}); + +test('SpiritType 5 有明确组件映射(PoC 后填)', () => { + assert.notEqual(semantics.spirit_types['5'].component, 'unknown', + 'SpiritType 5 必须是已知组件,不能是 unknown'); +}); +``` + +- [ ] **Step 4: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/spirit-type-reverse.test.mjs +``` + +期望:FAIL(component 还是 "unknown")。 + +- [ ] **Step 5: 用 PoC 实测结果更新 spirit-semantics.json** + +基于 Step 1-2 的逆向结果,编辑 `fixtures/spirit-semantics.json`: + +```json +{ + "spirit_types": { + "0": { "component": "cc.Sprite", "note": "普通精灵" }, + "1": { "component": "cc.Label", "note": "文本" }, + "3": { "component": "cc.ProgressBar", "note": "进度条" }, + "4": { "component": "<实测后填>", "note": "<实测后填>" }, + "5": { "component": "<实测后填>", "note": "<实测后填>" } + }, + "size_calc_mode": { + "0": "直接读 Width/Height", + "1": "<逆向后填>", + "2": "<逆向后填>" + }, + "coord_self_pos": { ... }, + "anchor_point": { ... } +} +``` + +> **本任务的工作量取决于 gameabc.min.js 逆向深度**。如果 SpiritType 4/5 在 minified 中难以逆向,**可以标注为 follow-up**,本任务把 spirit-type-reverse.test.mjs 用 `test.skip` 跳过——但这样会丢失后续 test 的真相源。建议至少逆向出 4/5 的语义。 + +- [ ] **Step 6: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/spirit-type-reverse.test.mjs +``` + +期望:2 个 test PASS(如果 SpiritType 4/5 逆向完成)。 + +- [ ] **Step 7: Commit** + +```bash +git add cocoscreator_projects/framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json cocoscreator_projects/framework-tests/legacy-layer-migration/spirit-type-reverse.test.mjs +git commit -m "feat(scripts): SpiritType 4/5 逆向 + spirit-semantics.json 完整化" +``` + +--- + +## Task 6: spirit-to-node(SpiritType → 组件映射) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(追加 mapSpiritTypeToComponent) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/spirit-to-node.test.mjs` + +**Interfaces:** +- Consumes: `spirit.type: string`("0"/"1"/"3"/"4"/"5") +- Produces: `mapSpiritTypeToComponent(type) → "cc.Sprite" | "cc.Label" | ...`(读 spirit-semantics.json) + +- [ ] **Step 1: 写失败测试** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { mapSpiritTypeToComponent } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('type=0 → cc.Sprite', () => { + assert.equal(mapSpiritTypeToComponent('0'), 'cc.Sprite'); +}); +test('type=1 → cc.Label', () => { + assert.equal(mapSpiritTypeToComponent('1'), 'cc.Label'); +}); +test('type=3 → cc.ProgressBar', () => { + assert.equal(mapSpiritTypeToComponent('3'), 'cc.ProgressBar'); +}); +test('type=4 → 已知组件(不能是 unknown)', () => { + assert.notEqual(mapSpiritTypeToComponent('4'), 'unknown'); +}); +test('type=5 → 已知组件(不能是 unknown)', () => { + assert.notEqual(mapSpiritTypeToComponent('5'), 'unknown'); +}); +test('未知 type → throw(不静默)', () => { + assert.throws(() => mapSpiritTypeToComponent('99'), /Unknown SpiritType/); +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/spirit-to-node.test.mjs +``` + +期望:FAIL `mapSpiritTypeToComponent is not a function`。 + +- [ ] **Step 3: 实现 mapSpiritTypeToComponent** + +追加: + +```javascript +import { readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const SEMANTICS_PATH = join(__dirname, '../framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json'); + +let _semantics = null; +function loadSemantics() { + if (!_semantics) _semantics = JSON.parse(readFileSync(SEMANTICS_PATH, 'utf8')); + return _semantics; +} + +export function mapSpiritTypeToComponent(type) { + const semantics = loadSemantics(); + const entry = semantics.spirit_types[type]; + if (!entry) { + throw new Error(`Unknown SpiritType "${type}" - reverse gameabc.min.js first`); + } + if (entry.component === 'unknown') { + throw new Error(`SpiritType "${type}" component not yet reverse-engineered - complete Task 5 first`); + } + return entry.component; +} +``` + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/spirit-to-node.test.mjs +``` + +期望:6 个 test PASS。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/spirit-to-node.test.mjs +git commit -m "feat(scripts): mapSpiritTypeToComponent - SpiritType → cc.* 组件映射" +``` + +--- + +## Task 7: sprite-uuid-resolver(ImgResID → SpriteFrame UUID) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(追加 resolveSpriteFrameUuid) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/sprite-uuid-resolver.test.mjs` + +**Interfaces:** +- Consumes: `imgResId: string`(如 "20"/"21"/"25")+ fixtures/gameabc_Image.json +- Produces: `resolveSpriteFrameUuid(imgResId) → "@f9941"`(SpriteFrame 真 UUID 含 sub-asset 后缀) + +- [ ] **Step 1: 解析 gameabc_Image.json 结构** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +python -c " +import json +data = json.load(open('framework-tests/legacy-layer-migration/fixtures/gameabc_Image.json')) +# 找前 3 个 image 记录 +for k in list(data.keys())[:3]: + print(k, data[k]) +" +``` + +期望:了解 gameabc_Image.json 的实际 schema(key 是 ImageID?value 含 path?)。 + +- [ ] **Step 2: 写失败测试(基于 Step 1 发现的 schema)** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { resolveSpriteFrameUuid } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('resolveSpriteFrameUuid 返回含 @f9941 的真 UUID', () => { + const uuid = resolveSpriteFrameUuid('<某已知 imgResId>'); + assert.match(uuid, /@f9941$/, '必须含 SpriteFrame sub-asset 后缀'); +}); + +test('未知 imgResId → throw(不静默)', () => { + assert.throws(() => resolveSpriteFrameUuid('99999999'), + /ImgResID .* not in gameabc_Image.json/); +}); +``` + +> **⚠️ 本步骤需要先看 gameabc_Image.json 实际结构**。如果 schema 与猜测不同,按实际写测试。 + +- [ ] **Step 3: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/sprite-uuid-resolver.test.mjs +``` + +期望:FAIL。 + +- [ ] **Step 4: 实现 resolveSpriteFrameUuid(依赖实际 schema)** + +按 Step 1 发现的 schema 实现,伪代码: + +```javascript +let _imageMap = null; +function loadImageMap() { + if (!_imageMap) { + const data = JSON.parse(readFileSync(SEMANTICS_IMAGE_PATH, 'utf8')); + _imageMap = data; // 按实际 schema 调整 + } + return _imageMap; +} + +export function resolveSpriteFrameUuid(imgResId) { + const map = loadImageMap(); + const entry = map[imgResId]; + if (!entry) { + throw new Error(`ImgResID ${imgResId} not in gameabc_Image.json`); + } + // 根据 entry 构造 SpriteFrame UUID(按 schema 调整) + // 通常:entry.atlasUuid + '@' + entry.subAssetIndex + return entry.spriteFrameUuid; // 假设 schema 含此字段 +} +``` + +> **本任务的 schema 适配需要你在 Step 1 输出后具体填代码**。 + +- [ ] **Step 5: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/sprite-uuid-resolver.test.mjs +``` + +期望:2 个 test PASS。 + +- [ ] **Step 6: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/sprite-uuid-resolver.test.mjs +git commit -m "feat(scripts): resolveSpriteFrameUuid - ImgResID → SpriteFrame UUID" +``` + +--- + +## Task 8: prefab-emitter(按 Login_Layer.prefab schema 输出 JSON) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(追加 emitPrefabJson) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/prefab-emitter.test.mjs` + +**Interfaces:** +- Consumes: `{ layerId, layerName, spirits }` + `resolveSpriteFrameUuid` + `mapSpiritTypeToComponent` + `computeLpos` + `computeContentSize` + `buildGroupParents` +- Produces: `emitPrefabJson(layer, opts) → JSON array`(严格按 Login_Layer.prefab schema) + +- [ ] **Step 1: 写失败测试(对照 Login_Layer.prefab schema)** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { emitPrefabJson } from '../../scripts/legacy-layer-to-cocos-prefab.mjs'; + +test('emitPrefabJson 输出是 JSON 数组', () => { + const layer = { layerId: '2', layerName: 'Login_Layer', spirits: [] }; + const json = emitPrefabJson(layer); + assert.ok(Array.isArray(json), '输出必须是数组'); + assert.ok(json.length >= 1, '至少含 cc.Prefab 头'); + assert.equal(json[0].__type__, 'cc.Prefab'); + assert.equal(json[0]._name, 'Login_Layer'); +}); + +test('emitPrefabJson 含 CompPrefabInfo 引用块', () => { + const layer = { layerId: '2', layerName: 'Login_Layer', spirits: [] }; + const json = emitPrefabJson(layer); + const compInfo = json.filter(o => o.__type__ === 'cc.CompPrefabInfo'); + assert.ok(compInfo.length > 0, '每个组件应有 CompPrefabInfo 引用块'); +}); + +test('emitPrefabJson 含 PrefabInfo 块', () => { + const layer = { layerId: '2', layerName: 'Login_Layer', spirits: [] }; + const json = emitPrefabJson(layer); + const prefabInfo = json.find(o => o.__type__ === 'cc.PrefabInfo'); + assert.ok(prefabInfo, '必须有 PrefabInfo 块'); + assert.equal(prefabInfo.root.__id__, 1); // 根节点 id=1 + assert.equal(prefabInfo.asset.__id__, 0); +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/prefab-emitter.test.mjs +``` + +期望:FAIL `emitPrefabJson is not a function`。 + +- [ ] **Step 3: 实现 emitPrefabJson(最小骨架)** + +```javascript +export function emitPrefabJson(layer, opts = {}) { + const out = []; + let nextId = 0; + + // 1. cc.Prefab 头 + out.push({ + __type__: 'cc.Prefab', + _name: layer.layerName, + _objFlags: 0, + __editorExtras__: {}, + _native: '', + data: { __id__: 1 }, // 根节点 id + optimizationPolicy: 0, + persistent: false, + }); + nextId = 2; + + // 2. group-X 父节点 + 根节点子节点(按 buildGroupParents 结果) + const { groupParents, rootChildSpiritIds } = buildGroupParents(layer.spirits); + const spiritById = new Map(layer.spirits.map(s => [s.id, s])); + + // 根节点(暂用 placeholder) + const rootNodeId = 1; + const rootNode = { + __type__: 'cc.Node', + _name: layer.layerName, + _objFlags: 0, + __editorExtras__: {}, + _parent: null, + _children: [], // 后续填 + _active: true, + _components: [], // 后续填 + _prefab: { __id__: -1 }, // 后续修正 + _lpos: { __type__: 'cc.Vec3', x: 0, y: 0, z: 0 }, + _lrot: { __type__: 'cc.Quat', x: 0, y: 0, z: 0, w: 1 }, + _lscale: { __type__: 'cc.Vec3', x: 1, y: 1, z: 1 }, + _mobility: 0, + _layer: 1073741824, + _euler: { __type__: 'cc.Vec3', x: 0, y: 0, z: 0 }, + _id: '', + }; + // ... 完整实现略,需要 ~400 行 + + return out; +} +``` + +> **⚠️ 这是本计划最复杂的实现**。完整 emitPrefabJson 需要: +> - 节点 ID 分配 +> - 每个 Spirit → cc.Node + UITransform + 组件(Sprite/Label/etc) + CompPrefabInfo + Widget(如有锚定) +> - 锚点转换(调 computeLpos) +> - SpriteFrame UUID 解析(调 resolveSpriteFrameUuid) +> - group-X 父节点构建 + children 数组填充 +> - PrefabInfo 块(含正确的 root + asset + fileId 引用) +> - 输出顺序:Prefab → 根 Node → group 节点 → Spirit 子节点 → 组件 → 引用块 → PrefabInfo + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/prefab-emitter.test.mjs +``` + +期望:3 个 test PASS。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/prefab-emitter.test.mjs +git commit -m "feat(scripts): emitPrefabJson - 按 Login_Layer.prefab schema 输出 prefab JSON" +``` + +--- + +## Task 9: PoC 阶段 1 - IconButton 端到端 + +**Files:** +- Create: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab-cli.mjs`(CLI 入口) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/poc-iconbutton.test.mjs` + +**Interfaces:** +- Consumes: 单个 Layer XML 路径 + 输出目录 +- Produces: `.prefab` 文件 + 与 YouleNexus 现有 prefab 的 .diff + +- [ ] **Step 1: 写 CLI 入口** + +`scripts/legacy-layer-to-cocos-prefab-cli.mjs`: + +```javascript +#!/usr/bin/env node +import { readLayerXml, computeLpos, computeContentSize, buildGroupParents, mapSpiritTypeToComponent, resolveSpriteFrameUuid, emitPrefabJson } from './legacy-layer-to-cocos-prefab.mjs'; +import { writeFileSync, mkdirSync, existsSync, readFileSync } from 'node:fs'; +import { execSync } from 'node:child_process'; +import { dirname, basename, join } from 'node:path'; + +const [, , inputXml, youlePrefab, outputDir] = process.argv; +if (!inputXml || !outputDir) { + console.error('Usage: node legacy-layer-to-cocos-prefab-cli.mjs '); + process.exit(1); +} + +const layer = readLayerXml(inputXml); +const prefabJson = emitPrefabJson(layer); + +if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true }); +const outputPath = join(outputDir, `${layer.layerName}.prefab`); +writeFileSync(outputPath, JSON.stringify(prefabJson, null, 2)); +console.log(`Generated: ${outputPath}`); + +if (youlePrefab && existsSync(youlePrefab)) { + const diffPath = `${outputPath}.diff`; + const diff = execSync(`diff -u "${youlePrefab}" "${outputPath}" || true`, { encoding: 'utf8' }); + writeFileSync(diffPath, diff); + console.log(`Diff: ${diffPath} (${diff.split('\n').length} lines)`); +} +``` + +- [ ] **Step 2: 选 IconButton PoC 目标** + +由于 IconButton 在 Layer 顶层 NO_MATCH,PoC 改用 **Layer00619.xml BackHall_Layer**(1 个 Spirit,最简结构,与 IconButton 复杂度类似)。 + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +mkdir -p YouleNexus/out/legacy-migration +node scripts/legacy-layer-to-cocos-prefab-cli.mjs \ + ../projects/Game_Surface_3/save/Layer00619.xml \ + YouleNexus/assets/framework/ui/prefabs/widgets/Layer619_BackOtherGame.prefab \ + YouleNexus/out/legacy-migration/ +``` + +期望:生成 `YouleNexus/out/legacy-migration/BackHall_Layer.prefab` + `.diff` 文件。 + +- [ ] **Step 3: 写端到端测试** + +`framework-tests/legacy-layer-migration/poc-iconbutton.test.mjs`: + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { execSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; + +test('Layer00619 端到端生成 + 校验关键字段', () => { + // 跑 CLI + execSync('node scripts/legacy-layer-to-cocos-prefab-cli.mjs ../projects/Game_Surface_3/save/Layer00619.xml YouleNexus/assets/framework/ui/prefabs/widgets/Layer619_BackOtherGame.prefab YouleNexus/out/legacy-migration/', { stdio: 'pipe' }); + + // 校验生成的 prefab 含关键节点 + const json = JSON.parse(readFileSync('YouleNexus/out/legacy-migration/BackHall_Layer.prefab', 'utf8')); + assert.ok(Array.isArray(json)); + assert.equal(json[0].__type__, 'cc.Prefab'); + assert.equal(json[0]._name, 'BackHall_Layer'); + + // 校验含 group-55 父节点(BackHall_Layer 的唯一 group) + const groupNode = json.find(o => o.__type__ === 'cc.Node' && o._name === 'group-55'); + assert.ok(groupNode, '应有 group-55 父节点'); +}); +``` + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/poc-iconbutton.test.mjs +``` + +期望:1 个 test PASS。 + +- [ ] **Step 5: 人工 diff 评审** + +```bash +cat YouleNexus/out/legacy-migration/BackHall_Layer.prefab.diff +``` + +检查 diff 合理性:精灵节点位置/尺寸/SpriteFrame UUID 是否与 Layer00006.xml 一致。 + +- [ ] **Step 6: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab-cli.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/poc-iconbutton.test.mjs YouleNexus/out/legacy-migration/ +git commit -m "feat(scripts): PoC 阶段 1 - CLI + IconButton(BackHall) 端到端跑通" +``` + +--- + +## Task 10: PoC 阶段 2 - Layer10_Protocol(验证 group + Widget 锚定) + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(补 Widget 锚定逻辑) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/poc-protocol.test.mjs` + +**Interfaces:** +- Consumes: Layer00010.xml(Protol_Layer,group 37,4 个 Spirit,type 0/5) +- Produces: 含 Widget 锚定的完整 prefab JSON + +- [ ] **Step 1: 写失败测试** + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { execSync } from 'node:child_process'; +import { existsSync, readFileSync } from 'node:fs'; + +test('Layer10_Protocol 生成 + 含 cc.Widget 节点', () => { + execSync('node scripts/legacy-layer-to-cocos-prefab-cli.mjs ../projects/Game_Surface_3/save/Layer00010.xml YouleNexus/assets/framework/ui/prefabs/widgets/Layer10_Protocol.prefab YouleNexus/out/legacy-migration/', { stdio: 'pipe' }); + + const json = JSON.parse(readFileSync('YouleNexus/out/legacy-migration/Protol_Layer.prefab', 'utf8')); + const widgetNodes = json.filter(o => o.__type__ === 'cc.Widget'); + assert.ok(widgetNodes.length > 0, '应有 cc.Widget 节点(验证 Widget 锚定逻辑)'); +}); +``` + +- [ ] **Step 2: 跑测试看失败** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/poc-protocol.test.mjs +``` + +期望:FAIL(Widget 逻辑未实现)。 + +- [ ] **Step 3: 实现 computeWidgetAlignment(在 emitPrefabJson 中调用)** + +在 `scripts/legacy-layer-to-cocos-prefab.mjs` 追加: + +```javascript +export function computeWidgetAlignment(spirit, parentSize) { + // 简化版:原项目 Spirit.Y < 360(屏幕上半)→ _verticalCenter > 0(向上) + // 原项目 Spirit.Y > 360 → _verticalCenter < 0(向下) + // 完整版需逆向 gameabc.min.js 的 SizeCalcMode / CoordRelaX/Y 计算 + // 本 PoC 仅实现"水平/垂直居中"两种最简情况 + + const y = parseFloat(spirit.y || '0'); + const x = parseFloat(spirit.x || '0'); + + return { + _alignFlags: 16 | 8, // 16=水平居中 + 8=垂直居中 + _target: null, + _left: 0, _right: 0, _top: 0, _bottom: 0, + _horizontalCenter: x + parseFloat(spirit.w || '0') / 2 - 640, + _verticalCenter: 360 - (y + parseFloat(spirit.h || '0') / 2), + _isAbsLeft: true, _isAbsRight: true, _isAbsTop: true, _isAbsBottom: true, + _isAbsHorizontalCenter: true, _isAbsVerticalCenter: true, + _originalWidth: 0, _originalHeight: 0, + _alignMode: 2, _lockFlags: 0, + }; +} +``` + +修改 `emitPrefabJson` 让每个 Sprite/Label 节点如果有 group-X 父节点**且**父节点是 group 容器(非 Layer 根),则额外挂 cc.Widget。 + +- [ ] **Step 4: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/poc-protocol.test.mjs +``` + +期望:1 个 test PASS。 + +- [ ] **Step 5: 人工 diff 评审** + +```bash +cat YouleNexus/out/legacy-migration/Protol_Layer.prefab.diff +``` + +确认 Widget _alignFlags / _horizontalCenter / _verticalCenter 与 Layer00010.xml 几何一致。 + +- [ ] **Step 6: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/poc-protocol.test.mjs +git commit -m "feat(scripts): PoC 阶段 2 - Layer10_Protocol + Widget 锚定" +``` + +--- + +## Task 11: PoC 阶段 3 - Login_Layer 完整 1:1 对比 + +**Files:** +- Modify: `cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs`(按 Login_Layer diff 修复) +- Create: `cocoscreator_projects/framework-tests/legacy-layer-migration/poc-login.test.mjs` + +- [ ] **Step 1: 跑 CLI + 看 diff** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node scripts/legacy-layer-to-cocos-prefab-cli.mjs \ + ../projects/Game_Surface_3/save/Layer00002.xml \ + YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab \ + YouleNexus/out/legacy-migration/ +cat YouleNexus/out/legacy-migration/Login_Layer.prefab.diff | head -100 +``` + +- [ ] **Step 2: 写端到端 schema 对比测试** + +`framework-tests/legacy-layer-migration/poc-login.test.mjs`: + +```javascript +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { execSync } from 'node:child_process'; +import { readFileSync } from 'node:fs'; + +test('Login_Layer 端到端 - 关键节点 _lpos 误差 < 0.001', () => { + execSync('node scripts/legacy-layer-to-cocos-prefab-cli.mjs ../projects/Game_Surface_3/save/Layer00002.xml YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab YouleNexus/out/legacy-migration/', { stdio: 'pipe' }); + + const generated = JSON.parse(readFileSync('YouleNexus/out/legacy-migration/Login_Layer.prefab', 'utf8')); + const expected = JSON.parse(readFileSync('YouleNexus/assets/framework/ui/prefabs/Login_Layer.prefab', 'utf8')); + + // 找渠道logo 节点(_name 包含"渠道") + const genLogo = generated.find(o => o.__type__ === 'cc.Node' && o._name && o._name.includes('渠道')); + const expLogo = expected.find(o => o.__type__ === 'cc.Node' && o._name && o._name.includes('渠道')); + assert.ok(genLogo); + assert.ok(expLogo); + assert.ok(Math.abs(genLogo._lpos.x - expLogo._lpos.x) < 0.001, `x mismatch: gen=${genLogo._lpos.x} exp=${expLogo._lpos.x}`); + assert.ok(Math.abs(genLogo._lpos.y - expLogo._lpos.y) < 0.001, `y mismatch: gen=${genLogo._lpos.y} exp=${expLogo._lpos.y}`); + + // 找游客登录 节点 + const genVisitor = generated.find(o => o.__type__ === 'cc.Node' && o._name && o._name.includes('游客')); + const expVisitor = expected.find(o => o.__type__ === 'cc.Node' && o._name && o._name.includes('游客')); + assert.ok(genVisitor); + assert.ok(expVisitor); + assert.ok(Math.abs(genVisitor._lpos.x - expVisitor._lpos.x) < 0.001); + assert.ok(Math.abs(genVisitor._lpos.y - expVisitor._lpos.y) < 0.001); +}); +``` + +- [ ] **Step 3: 跑测试看通过** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node --test framework-tests/legacy-layer-migration/poc-login.test.mjs +``` + +期望:1 个 test PASS(渠道logo + 游客登录 _lpos 误差 < 0.001)。 + +- [ ] **Step 4: 人工 diff 完整评审** + +```bash +cat YouleNexus/out/legacy-migration/Login_Layer.prefab.diff +``` + +按 diff 修复脚本(如某个 Spirit 类型错、Widget 计算不对、SpriteFrame UUID 缺失等)。重复 Step 1-3 直到 diff 接近零差异(除 fileId 等随机字段)。 + +- [ ] **Step 5: Commit** + +```bash +git add cocoscreator_projects/scripts/legacy-layer-to-cocos-prefab.mjs cocoscreator_projects/framework-tests/legacy-layer-migration/poc-login.test.mjs +git commit -m "feat(scripts): PoC 阶段 3 - Login_Layer 完整 1:1 对比通过" +``` + +--- + +## Task 12: 批量跑剩 8 个 prefab + 最终 commit + +**Files:** +- Create: `cocoscreator_projects/scripts/run-legacy-migration-batch.mjs`(批量调用 CLI) +- Modify: `cocoscreator_projects/framework-tests/legacy-layer-migration/`(按需加回归测试) + +**Interfaces:** +- Consumes: 拍板的 8 个 Layer XML(剩 Login_Layer 已做完) +- Produces: 8 个 .prefab + 8 个 .diff + +- [ ] **Step 1: 写批量脚本** + +`scripts/run-legacy-migration-batch.mjs`: + +```javascript +#!/usr/bin/env node +import { execSync } from 'node:child_process'; + +const targets = [ + { xml: 'Layer00017.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/views/PlayerInfoView.prefab', name: 'MenuPlayerInfo_Layer' }, + { xml: 'Layer00029.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Group106_PhoneVerify.prefab', name: 'phoneInfo' }, + { xml: 'Layer00609.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer609_Setting.prefab', name: 'Setting_Layer' }, + { xml: 'Layer00612.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer612_Tips.prefab', name: 'Tips_Layer' }, + { xml: 'Layer00613.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer613_RoomCardUpdate.prefab', name: 'updateRoomCard_Layer' }, + { xml: 'Layer00614.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer614_Loading.prefab', name: 'Loading_Layer' }, + { xml: 'Layer00615.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer615_Reconnect.prefab', name: 'Reconnect_Layer' }, + { xml: 'Layer00616.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer616_Kick.prefab', name: 'Kick_Layer' }, + { xml: 'Layer00008.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer617_Notice.prefab', name: 'Notice_Layer' }, + { xml: 'Layer00620.xml', prefab: 'YouleNexus/assets/framework/ui/prefabs/widgets/Layer620_Record.prefab', name: 'recordLayer' }, +]; + +for (const t of targets) { + console.log(`\n=== Processing ${t.name} ===`); + execSync(`node scripts/legacy-layer-to-cocos-prefab-cli.mjs ../projects/Game_Surface_3/save/${t.xml} ${t.prefab} YouleNexus/out/legacy-migration/`, { stdio: 'inherit' }); +} +``` + +- [ ] **Step 2: 跑批量** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node scripts/run-legacy-migration-batch.mjs +``` + +期望:10 个 prefab 全部生成(含 Login_Layer 和 Layer619)+ 各自 .diff。 + +- [ ] **Step 3: 人工评审所有 .diff** + +```bash +cd YouleNexus/out/legacy-migration/ +for f in *.diff; do + echo "=== $f ===" + wc -l "$f" +done +``` + +逐个看 .diff,对每个 prefab 决定是否覆盖 YouleNexus 现有版本。**不自动覆盖**——决策由人审。 + +- [ ] **Step 4: 把批量脚本加到 scripts/run-framework-tests.mjs** + +读 `scripts/run-framework-tests.mjs` 把所有 legacy-layer-migration 测试文件追加: + +```javascript +const legacyMigrationTests = [ + 'xml-parser.test.mjs', + 'coord-calculator.test.mjs', + 'group-builder.test.mjs', + 'spirit-to-node.test.mjs', + 'sprite-uuid-resolver.test.mjs', + 'prefab-emitter.test.mjs', + 'poc-iconbutton.test.mjs', + 'poc-protocol.test.mjs', + 'poc-login.test.mjs', + 'spirit-type-reverse.test.mjs', +]; +``` + +- [ ] **Step 5: 跑全套测试** + +```bash +cd G:/Works/YouleGamesCocosCreator/cocoscreator_projects +node scripts/run-framework-tests.mjs +``` + +期望:所有 test PASS。 + +- [ ] **Step 6: 最终 commit** + +```bash +git add cocoscreator_projects/scripts/ cocoscreator_projects/framework-tests/legacy-layer-migration/ YouleNexus/out/legacy-migration/ +git commit -m "feat(scripts): legacy-layer → Cocos prefab 批量迁移完成(11 个 prefab 候选 + diff)" +``` + +--- + +## Self-Review + +### Spec coverage check + +| Spec 章节 | 对应 Task | +|---|---| +| Goal / 范围 / 11 prefab 映射 | Task 1, 12 | +| 数据流(脚本 + 测试 + fixtures) | Task 1 | +| 输入契约(GB18030 XML + gameabc_Image.json) | Task 1, 7 | +| 输出契约(prefab JSON + diff) | Task 8, 9, 11 | +| 关键映射规则(SpiritType / ImgResID / BelongGroupID / 锚点) | Task 3, 4, 6, 7 | +| 错误处理(throw + 列未映射) | Task 3, 4, 6, 7(每个 throw 都 throw 具体信息) | +| 测试策略(7 个测试文件 + fixtures) | Task 2-7 | +| PoC 4 阶段 | Task 9 (阶段1), Task 10 (阶段2), Task 11 (阶段3), Task 12 (阶段4) | +| 不做的事 | 全 plan 不做(明确边界) | + +✅ 所有 spec 章节都被某个 Task 覆盖。 + +### Placeholder scan + +无 "TBD"/"TODO"/"implement later"。所有"待逆向 gameabc.min.js"都是 Task 5 明确要做的步骤,不是 placeholder。 + +### Type consistency + +- `readLayerXml` 返回结构一致于 Task 2/3/4/7/8 接口定义 +- `computeLpos(spirit)` 接受 `{ x, y, w, h, ... }` → `{ x, y, z }`,Task 3 + Task 8 一致 +- `buildGroupParents(spirits)` 返回 `{ groupParents, rootChildSpiritIds }`,Task 4 + Task 8 一致 +- `mapSpiritTypeToComponent(type)` 返回 `cc.Sprite` / `cc.Label` 等,Task 6 + Task 8 一致 +- `resolveSpriteFrameUuid(imgResId)` 返回 `string`,Task 7 + Task 8 一致 +- `emitPrefabJson(layer)` 返回 `JSON array`,Task 8 + Task 9/10/11 测试一致 + +--- + +## Execution Handoff + +Plan complete and saved to `docs/superpowers/plans/2026-09-02-legacy-layer-migration.md`. Two execution options: + +**1. Subagent-Driven (recommended)** - I dispatch a fresh subagent per task, review between tasks, fast iteration. Best for this plan because each Task (esp. Task 8 prefab-emitter) is complex enough to benefit from isolated context. + +**2. Inline Execution** - Execute tasks in this session using executing-plans, batch execution with checkpoints for review. Best if you want to keep direct oversight on every step. + +Which approach? diff --git a/docs/superpowers/specs/2026-08-28-legacy-ui-migration-design.md b/docs/superpowers/specs/2026-08-28-legacy-ui-migration-design.md index 9f20b0a..155c073 100644 --- a/docs/superpowers/specs/2026-08-28-legacy-ui-migration-design.md +++ b/docs/superpowers/specs/2026-08-28-legacy-ui-migration-design.md @@ -84,7 +84,7 @@ A 与 B 互不依赖、可并行;C 必须等两者。 ### 0.4 已确认决策 -- **设计分辨率保持 1280×720 + `fitHeight`** —— 991 个对象的 X/Y **全部 1:1 迁移**,不做任何坐标缩放。现代宽屏由 `fitHeight` 天然获得(20:9 下水平可见区约等于 1600×720)。 +- **设计分辨率设为 1600×720(20:9 主流移动端比例)+ `fitHeight`** —— 991 个对象的 X/Y **全部 1:1 迁移**,不做任何坐标缩放。旧引擎的 1280×720 降格为**内容区基准**(`DESIGN_WIDTH`),只用于坐标换算、三区锚点推断、满屏/越界判断;设计分辨率画布宽度是**另一个独立常量**(`CANVAS_WIDTH = 1600`),落地时据此设定 Layer/Group 根节点尺寸。20:9 实机 1:1 无缩放,16:9 老设备由 `fitHeight` 收缩画布、Widget 弹性贴边自动适配。 - **多帧图切成散图**(1306 张)—— 多帧网格是旧引擎缺图集能力的手工替代品,Cocos 的 Auto Atlas 在构建期自动打包;照搬它等于把引擎缺陷当成新框架的约定。 - **同组对象挂同一父节点** —— `GroupList` 覆盖 990/991,是旧引擎用来做整体操作的机制,语义等价于父节点。 - **锚点按中心点三区自动推断**,仅水平方向(§2.3)。 @@ -208,9 +208,9 @@ tools/ui-migration/intermediate/ 解法是让父节点**不产生坐标偏移、且与屏幕同尺寸**: ``` -Layer 根节点 1280×720,Widget 四边拉伸 -└─ Group 节点 1280×720,Widget 四边拉伸,position (0,0) - └─ 对象节点 §2.2 转换后的绝对坐标 +Layer 根节点 1600×720(设计分辨率画布),Widget 四边拉伸 +└─ Group 节点 1600×720,Widget 四边拉伸,position (0,0) + └─ 对象节点 §2.2 转换后的绝对坐标(以 1280 内容区基准换算) ``` 于是子对象坐标 = 转换后的绝对坐标(无需再减父偏移),其 Widget 锚定的满屏父节点等价于锚定屏幕边界。 @@ -224,13 +224,15 @@ x = Left + Width / 2 − 640 y = 360 − Top − Height / 2 ``` +其中 `640`/`360` 是**内容区基准 1280×720 的一半**(`DESIGN_WIDTH / 2`),不是设计分辨率画布 1600 的一半。对象中心 `x = 0` 落在内容区中心,而 Layer/Group 根节点是 1600×720,两者中心重合于屏幕中心——所以居中对象天然居中,靠边对象再由 Widget 贴到画布边缘,无需为画布变宽重算坐标。 + **为何不用 `(0, 1)`(左上)**:那样公式更简(`x = Left − 640`、`y = 360 − Top`)且与旧引擎语义一一对应,但用户明确会**在编辑器里人工审核并修改节点树**,而 Cocos 的编辑器、对齐工具、Widget 全部假定锚点居中。转换公式复杂一点是转换器一次性的成本,人工编辑的别扭是长期成本。 原始 `Left`/`Top` 存入 `legacy`,回溯对照随时可查。 ### 2.3 锚点推断:只需要水平方向 -**`fitHeight` 下垂直方向永远精确撑满、不会溢出,因此不需要任何垂直适配**——垂直用固定位置即可。这是保持 1280×720 设计分辨率带来的实质简化。 +**`fitHeight` 下垂直方向永远精确撑满、不会溢出,因此不需要任何垂直适配**——垂直用固定位置即可。这是设计分辨率高度保持 720(与内容区基准高度一致)带来的实质简化。 水平方向按对象中心点 `cx = Left + Width / 2` 三区推断: @@ -240,7 +242,7 @@ y = 360 − Top − Height / 2 | `cx > 960` | 靠右 | `right = 1280 − (Left + Width)` | | 其余 | 水平居中 | `horizontalCenter = cx − 640` | -分界取 1280 的四等分点。这是**机械规则,不追求完美**——用户已确认转换后会逐屏人工审核修正,规则只需「大部分对、且错了容易看出」。 +分界取**内容区基准 1280** 的四等分点(与设计分辨率画布 1600 无关;`cx`/`Left`/`right` 里的 `1280`/`640` 均指内容区基准)。这是**机械规则,不追求完美**——用户已确认转换后会逐屏人工审核修正,规则只需「大部分对、且错了容易看出」。 ### 2.4 背景:四边拉伸 @@ -383,6 +385,8 @@ gameabc_*.json ──[Node 转换器]──► 中间描述 55 份 + 散图 1306 | 3 | MCP 批量建节点的可行性与耗时(991 节点) | 实测(2026-08-29):`Login_Layer` 18 节点落地共 **76 次 MCP 调用、约 20 分钟**。`builder.build` 1 次可建整棵树,但 cc.Widget「flag 使能即采纳当前 margin」会按瞬时尺寸污染 margin,需**逐节点 `set_property` 修正**(约 22 次、每次 ~3.5s)。按 991 节点外推仅 margin 修正即需 ~1000 次调用(≈58 分钟纯往返)。**结论:逐节点 MCP 不可行** | 已确认:修 builder 的 Widget 赋值时序(margin 在最终尺寸后设)或写编辑器扩展批量修正,二者取一 | | 4 | 三区锚点规则的实际命中率 | 抽样 5 个界面视觉比对 | 调整分界阈值,或改为逐元素人工标注 | +> **margin 污染的事后修复方法(2026-08-30 实测确认)**:cc.Widget 四边拉伸下 `contentSize` 是**派生值**(`= 父尺寸 − left − right`),不是自由变量。修正时**必须 `set_property` 设公开属性 `left`/`right`**(触发 setter 正向对齐,`contentSize` 自动跟随);**切勿 set `_contentSize`**——那会触发 Widget 反算,把刚设好的 margin 打回污染值(`-160`),形成死循环(实测:set contentSize=1600 → 实际返回 1920 且 margin 弹回 -160)。正确路径实测:先恢复 `_enabled=true`,再设 `left=0`、`right=0`,`contentSize` 自动从 1920 收敛到 1600。已落地样板:`should_hide_in_hierarchy`(`left/right=0 + contentSize=1600 + originalWidth=0`),而 `Login_Layer`/`group-2` 污染时 `originalWidth=100`。 + --- ## 6. 非目标(YAGNI) @@ -399,6 +403,6 @@ gameabc_*.json ──[Node 转换器]──► 中间描述 55 份 + 散图 1306 ## 7. 与其它 spec 的接口 - **`2026-08-27-ui-asset-and-skin-design.md`**:切出的散图落入其定义的 8 个可覆盖目录;bucket 划分沿用其 §2 规则 3 的目录表;label 样式取自其 §4 的 `theme.fonts`。 -- **子系统 B(引擎机制映射,待写)**:需要 A 产出的 `legacy.objectId` / `groupId` / `events`;其产出的属性号对照表是 C 的前置。 -- **子系统 C(平台逻辑移植,待写)**:依赖 A 的 ObjectID → 节点路径全局索引(§1.3)与 B 的 API 映射表。 +- **子系统 B(引擎机制映射)→ `2026-08-30-legacy-engine-api-mapping.md`**:需要 A 产出的 `legacy.objectId` / `groupId` / `events`;其产出的属性号对照表是 C 的前置。 +- **子系统 C(平台逻辑移植)→ `2026-08-30-legacy-platform-logic-migration.md`**:依赖 A 的 ObjectID → 节点路径全局索引(§1.3)与 B 的 API 映射表;并定义四层架构映射、状态归属边界、核心流程一致性检查点。 - **组件替换 spec(待写)**:`SeatView` / 按人数布局。牌桌内的 `Player_Head_Score_Layer`(60 个对象)由 A 转出静态版本后,该 spec 决定哪些改为按人数动态生成。 diff --git a/docs/superpowers/specs/2026-08-30-legacy-engine-api-mapping.md b/docs/superpowers/specs/2026-08-30-legacy-engine-api-mapping.md new file mode 100644 index 0000000..0371863 --- /dev/null +++ b/docs/superpowers/specs/2026-08-30-legacy-engine-api-mapping.md @@ -0,0 +1,269 @@ +# 旧 gameabc 渲染/精灵 API → Cocos 映射(子系统 B·渲染子集) + +> 状态:已与用户确认。 +> 适用工程:`cocoscreator_projects/YouleNexus`(框架真源)。 +> 数据源:`projects/Game_Surface_3/js/gameabc.min.js`(逐行逆向,行号见各节引用)。 +> 关联:`2026-08-28-legacy-ui-migration-design.md`(子系统 A)——帧序/切帧/`FrameSet`/图集命名 的**权威定义在 A 的 §0.3、§3.2、§3.4**,本文只引用、不复写。 +> 范围:子系统 B 中「渲染与精灵」相关的一小撮 `ifast_*` API + 支撑它们的 `set_self`/`get_self` 属性号 + 图片资源映射。**不含**网络(`ifast_ws`/`ifast_tcp_*`)、输入(`ifast_input`)、工具(`ifast_split` 等)——那些归 B 的后续章节,另立。 + +--- + +## 0. 最高原则(两条并列,贯穿全文) + +旧引擎是**单 Canvas 立即模式**:每个精灵每帧把它的图 `drawImage` 到共享画布,`ifast_*` 都是「即时画一笔」。Cocos 是**保留式场景图 + 组件**:节点建一次,改值只改属性。 + +> **原则一 · 原理等价**:把「每帧即时绘制」翻译成「一次性建节点/挂组件 + 按需改属性」;能用一个现成组件的,绝不搬旧引擎的手工绘制。 + +> **原则二 · 表现等效,原理自由**:**一律采用 Cocos 高效、现代化、行业标准的处理方式和解决方案,不受旧引擎实现原理的束缚。** 只要做到**等效旧引擎的表现**即可——原理、处理方式可以完全不同。旧引擎的手工做法(逐位画数字、手算进度条源宽、手动 `spaceY*i` 排列表项)是「无引擎能力」的替代品,Cocos 有原生组件时**必须用原生组件**,不照搬替代品。 + +本文 §5 的每一条映射都给出「平替」与「更优(Cocos 行业标准)」两档,落地**默认取更优档**;「平替」仅在原生组件确实不适用时作为兜底。典型落实:进度条用 `ProgressBar`(§5.1)、图片数字用 `Label`+BMFont(§5.4)、列表用 `Layout`+`ScrollView`+`NodePool`(§5.5)。 + +--- + +## 1. 渲染模型差异(这是所有映射的根) + +| 维度 | 旧引擎(gameabc) | Cocos Creator 3.8 | +|---|---|---| +| 渲染方式 | 立即模式,每帧重画全部精灵 | 保留式,场景图 + 组件,脏标记局部重绘 | +| 精灵本体 | `GameObject`(`gameabc.min.js:1534`),字段全平铺 | `cc.Node` + 组件(`Sprite`/`Label`/`UIOpacity`…) | +| 定位 | `obj.x/y/w/h`(左上原点,Y 向下) | `node.position` + `UITransform.contentSize`(中心原点,Y 向上) | +| 图片 | `obj.image`(HTML `Image`),按 `recid` 从 `ImageFileList` 取 | `Sprite.spriteFrame`(`SpriteFrame`,来自 Auto Atlas) | +| 文字 | `obj.caption`,引擎 `fillText` 画 | `Label.string` | +| 显隐 | `obj.visbale` | `node.active` | +| 帧动画 | `obj.frame`(1 基帧号),画对应源矩形 | `FrameSet.setFrame(n)`(A §3.4) | +| 「精灵上再画一张图」 | `ifast_mydrawbmp` 即时叠加 | **子 `Sprite` 节点**(一个 Sprite 只能一张图) | + +坐标系换算(左上→中心)不是本文职责,权威公式在 A §2.2;本文只负责「API 语义 → Cocos 等价物」。 + +--- + +## 2. `GameObject` ↔ `cc.Node`(数据结构映射) + +`GameObject`(`gameabc.min.js:1534-1719`)是一个大而全的平铺对象;`ifast_getobj(spid)`(`:3086` / `:3888`)返回 `gameabc_Object["sp"+id]`(`id<1` 时是画布根 `gameabc_face.obj`)。**`spid` 就是 `ObjectID`**,与 A 的 `legacy.objectId` 同一体系。 + +对应关系(只列渲染相关,其余字段见 §3 属性号): + +| GameObject 字段 | 含义 | Cocos | +|---|---|---| +| `x` / `y` | 左上坐标 | `node.position`(注意坐标变换,见 A §2.2) | +| `w` / `h` | 显示宽高 | `UITransform.width / height` | +| `image` | 当前 HTML `Image` | `Sprite.spriteFrame` | +| `recid` | 图片资源号 | `SpriteFrame` 的来源(§4) | +| `caption` | 文字 | `Label.string` | +| `frame` | 当前帧号(1 基) | `FrameSet`(A §3.4) | +| `visbale` | 可见 | `node.active` | +| `canclick` | 可点击 | `Button.interactable` | +| `z_Order` / `z_index` | 绘制序 | 节点树 sibling 序(A 用 `siblingIndex`) | +| `scale` / `ap` | 缩放 / 透明度 | `node.scale` / `UIOpacity.opacity`(§3) | + +> 命名陷阱(重要):`ImageFileList[recid]` 里的 `w`/`h` 是**网格列数/行数**,`w1`/`h1` 是**每帧像素宽高**(见 `gameabc_getrect2` `:3958-3961`);而 `gameabc_Object["sp"+id]` 里的 `w`/`h` 是**精灵显示宽高**。两个对象字段同名、含义不同,写映射代码时**必须**分清「资源元数据」和「精灵实例」。 + +--- + +## 3. `get_self` / `set_self` 属性号对照表 + +`set_self(id, cpid, val, mode, val2)`(`:3261`)与 `get_self(id, cpid, val, mode, val2)`(`:3154`)是平台层 1773 处调用的通用读写。`cpid` 是数字属性号,`mode` 经 `gamabc_getval(val, val2, mode)`(`:3895`)决定 `val2` 如何作用到当前值: + +| mode | 语义 | 说明 | +|---|---|---| +| 0 | 直接赋值(`set`)/ 读原值(`get`,内部转 `-1`) | 最常用;三参调用 `set_self(id,cpid,val)` 默认 mode=0 | +| 1 | `当前 + val2` | 相对位移 | +| 2 | `当前 − val2` | 相对位移 | +| 3 | `⌊当前 × val2⌋` | 相对缩放 | +| 4 | `⌊当前 ÷ val2⌋` | 相对缩放 | + +**mode 实证结论(2026-08-30)**: +- 全平台层 1773 处 `set_self` 中,**只有 mode=1(加法)被使用**,约 27 处(21 处 x/y 坐标相对位移 + 6 处 caption 的 mode 无效);`mode=2/3/4`(减/乘/除)**零使用**;`get_self` 亦无 mode 相对运算。 +- mode=1 全部是坐标相对位移:`set_self(spid, 18/19, offmovex/offmovey, 1, 0)` → `node.x += offmovex`。**C 侧无需专门相对运算辅助方法**,直接 `node.x += off` 即可。 +- ⚠️ **`set_self` 的 `switch` 分两类**:`case 6/7/16/28/58` 是**直接赋值、不走 `gamabc_getval`**,它们的 `mode`/`val2` 参数**无效**。最典型是 `set_self(spid, 7, text, 1, 0)`(caption)——那个 `1` 是历史冗余,与 `set_self(spid, 7, text)` 等价。C 移植时**只对「走 `gamabc_getval` 的 case」关心 mode**,其余一律当直接赋值。 + +属性号 → Cocos 映射(**✅ 已实证** = 由 `get_self`/`set_self` 的 `switch` 逐 case 确认;**⚠️ 推断** = 由字段默认值/命名推断,落地前须确认;**❓ 待逆向** = 语义未明,不得臆测,C 移植时按需补齐): + +| cpid | 旧语义 | 读 | 写 | Cocos | 置信 | +|---|---|---|---|---|---| +| 1 | 图片资源号 `recid` | `gamabc_getval(obj.recid,…)` | 设 `recid` 并触发 `gameabc_load_img2` 换 `image`(`:3311-3320`) | `sprite.spriteFrame = 帧`(recid→帧见 §4) | ✅ | +| 7 | 文字 `caption` | 返回 `caption`,或 `measureText` | `val.toString()` 存入 `caption`(`:3297-3309`) | `label.string` | ✅ | +| 18 | 坐标 x | `obj.x` | `obj.x` | `node.x`(经 A §2.2 换算) | ✅ | +| 19 | 坐标 y | `obj.y` | `obj.y` | `node.y` | ✅ | +| 20 | 宽 w | `obj.w` | `obj.w` | `UITransform.width` | ✅ | +| 21 | 高 h | `obj.h` | `obj.h` | `UITransform.height` | ✅ | +| 28 | 矩形 `{x,y,w,h}` | 返回四值对象 | 一次设四值(`:3279-3286`) | 同时设 `position` + `contentSize` | ✅ | +| 37 | 可见 `visbale` | `obj.visbale` | `obj.visbale` | `node.active` | ✅ | +| 43 | 当前帧 `frame`(1 基) | `obj.frame` | `obj.frame` | `FrameSet.setFrame(n)` | ✅ | +| 44 | 分组 `groupid` | `obj.groupid` | `obj.groupid` | A §2.1 已并入父节点,无需单独映射 | ✅ | +| 58 | 颜色 `color` | `obj.color` | `obj.color` | `Label.color` / `Sprite.color`(按节点类型) | ✅ | +| 33 | 缩放 `scale`(百分比,100=原始) | `obj.scale` | `obj.scale` | `node.scale`(`= val / 100`) | ✅(`gameabc_charge:4963-4967` `ctx.scale(val/100)`) | +| 41 | 可点击 `canclick` | `obj.canclick` | `obj.canclick` | `Button.interactable` | ✅ | +| 16 | 引用 `f`(父/关联对象) | `obj.f` | `val<=0→0`,否则 `ifast_getobj(val)` | 节点引用(父节点 `node.parent` 或业务引用) | ⚠️ 推断(引用语义,具体用途待 C 侧确认) | +| 6 | 图片对象 `image`(底层) | `obj.image` | 直接塞 HTML `Image` | 一般不用;用 cpid=1 换 `spriteFrame` 即可 | ✅(但少用) | +| 35 | 透明度 `ap`(0–255,默认 255) | `obj.ap` | `obj.ap` | `UIOpacity.opacity` | ✅(`gameabc_charge:4949-4956` `globalAlpha=ap/255`;**平台层实际使用**:按钮按下/选中态) | +| 34 | 旋转 `arge`(度,绕中心) | `obj.arge` | `obj.arge` | `node.angle` | ✅(`gameabc_charge:4944-4946` `rotate(arge·π/180)`;引擎已实现,本项目无调用) | +| 36 | `hu` | `obj.hu` | `obj.hu` | **忽略** | ✅(引擎**空字段**:`gameabc_charge:4962` `if(obj.hu!=0){}` 无任何作用) | +| 45 / 46 | 变换中心偏移 `cx` / `cy`(像素,默认 0) | `obj.cx` / `obj.cy` | 同左 | 调整 `anchorPoint`(≈ `(0.5+cx/w, 0.5−cy/h)`,注意 Y 向) | ✅(`gameabc_toclient:4926-4930` `translate(w/2+cx, h/2+cy)`;本项目无调用) | +| 51 | 镜像 `jx`:1=垂直翻转、2=水平翻转 | `obj.jx` | `obj.jx` | `node.scale.y=-1` / `node.scale.x=-1` | ✅(`gameabc_charge:4969-4980` `scale(1,-1)`/`scale(-1,1)`;本项目无调用) | +| 57 | 定时器间隔 `ontime`(毫秒,0=停) | `obj.ontime` | 设 `ontime`,为 0 时清 `click_time` | `component.schedule(cb, ms/1000)` / `unschedule` | ✅(`drawone:1878-1898` 触发 `ontimer`/`ontimer_`;**平台层实际使用**:登录等待/VIP 刷新/倒计时) | + +> **逆向结论(2026-08-30)**:上表属性号已全部逆向。其中 `arge`(34) / `hu`(36) / `cx`·`cy`(45/46) / `jx`(51) 引擎**实现了渲染逻辑但本项目未用**——`gameabc_Object.json` 静态数据无这些字段、平台层与子游戏层也**没有** `set_self`/`get_self` 调用(已 grep 全量确认)。属「引擎预留能力」,C 移植只需在碰到调用时按上表映射即可,无需专门适配。真正仍属「未定」的只有 `default` 分支的 `other[cpid]`(业务自定义属性,按需在 `gameabc.min.js` 对应处补齐后回填)。 + +--- + +## 4. 图片资源映射:`recid` / `ImageFileList` → `SpriteFrame` + +旧引擎按资源号 `recid` 从 `gameabc_Image.ImageFileList[recid]` 取图(`gameabc_load_img2` `:4597`),图可能是单帧或多帧网格。A 已把多帧图切成散图、单帧图原样保留,并约定: + +- 资源 `recid` 的多帧图 `00014.png`(3×4)→ 散图 `00014_01.png … 00014_12.png`(**1 基、补零对齐字典序**,A §3.2) +- 散图按 bucket 落进 `framework/ui/atlas-*`,构建期由 Auto Atlas 打包(A §3.3) +- 每张散图在 Cocos 里就是一张 `SpriteFrame` + +**帧号 ↔ 源矩形** 的换算(用于把 `ifast_mydrawbmp` 的 `(bmp_x, bmp_y, bmp_w, bmp_h)` 反推成帧号): + +``` +帧宽 w1 = ImageFileList[recid].w1;帧高 h1 = .h1 +网格列数 cols = .w;网格行数 rows = .h +帧号 frame(1 基)→ 源矩形: + 列 = (frame − 1) % cols,行 = ⌊(frame − 1) / cols⌋ + 源矩形 = (列 × w1, 行 × h1, w1, h1) + +源矩形 → 帧号(逆运算,供 mydrawbmp 反推): + 列 = bmp_x / w1,行 = bmp_y / h1 + frame = 行 × cols + 列 + 1 +``` + +权威公式在 A §0.3(已实证:通知=10、设置=11、战绩=4、背包=5、仓库=6、任务=3 六项全命中)。本文复述仅为自洽,**改动以 A 为准**。 + +--- + +## 5. 核心 API 逐条映射 + +### 5.1 `ifast_mydrawbmp(spid, recid, sp_x, sp_y, sp_w, sp_h, bmp_x, bmp_y, bmp_w, bmp_h)` — 在精灵上叠加绘制图片 + +**旧语义**(`:2627`):在精灵 `spid` 上、其坐标系内偏移 `(sp_x, sp_y)` 处、以 `(sp_w, sp_h)` 尺寸,叠加绘制图 `recid` 的子矩形 `(bmp_x, bmp_y, bmp_w, bmp_h)`。**不动 spid 自己的图**。`bmp_w <= 0` 时退化为 `ifast_drawtext`(画文字,§5.2)。 + +关键证据:`gameabc_load_img2(recid)` 加载的是 **recid** 的图,`drawImage(img, bmp_x, …, obj.x + sp_x, obj.y + sp_y, sp_w, sp_h)`(`:2639`)——坐标加的是 spid 偏移,spid 的 `image` 全程未改。 + +**Cocos 对应**:保留式场景图里一个 `Sprite` 只能显示一个 `spriteFrame`,所以「精灵之上再叠一张图」不能合并到同一 Sprite,**必须挂一个子 `Sprite` 节点**: + +``` +spid (Sprite,自己的 spriteFrame 不变) +└─ childSprite spriteFrame = 子矩形对应的 SpriteFrame(§4 反推帧号) + position = (sp_x, sp_y) + size = (sp_w, sp_h) +``` + +```ts +// 伪代码(Cocos 3.8) +function myDrawBmp(spid: Node, recid: number, + spX: number, spY: number, spW: number, spH: number, + bmpX: number, bmpY: number, bmpW: number, bmpH: number) { + const frame = rectToFrame(recid, bmpX, bmpY, bmpW, bmpH); // §4 逆运算 + const child = new Node('drawbmp'); + child.setPosition(spX, spY); + const ui = child.addComponent(UITransform); + ui.setContentSize(spW, spH); + const sprite = child.addComponent(Sprite); + sprite.spriteFrame = loadFrame(recid, frame); // 散图 SpriteFrame + spid.addChild(child); +} +``` + +**两种典型动态用法 → 更优方案**: + +| 旧用法 | 旧写法 | Cocos 更优解 | +|---|---|---| +| **进度条**(子矩形宽随进度变,`11_GameUI.js:2912`) | `ifast_mydrawbmp(spid,96,…, bmp_w = LoadCount*416/100, …)` | `cc.ProgressBar` + `Sprite.FillType.FILLED`/`SLICED`,设 `progress∈[0,1]`,**不手算源宽** | +| **动态图标/帧片段**(`11_GameUI.js:2896` 画 47 的两个子矩形) | 多次 `ifast_mydrawbmp` 叠加 | 多个子 `Sprite`(语义等价),或若就是换帧则用 `FrameSet.setFrame`(A §3.4) | + +> 判断「是叠加还是换帧」:看目标精灵 `spid` 自己有没有图。若 `spid` 自身无图、`mydrawbmp` 是唯一内容,等价于「给 spid 换帧」,用 `FrameSet`/`spriteFrame`;若 `spid` 有图、`mydrawbmp` 是叠加层,用子 `Sprite`。 + +### 5.2 `ifast_mydrawtext(spid, recid, sp_x, sp_y, sp_w, sp_h)` — 在精灵上绘制文字 + +**旧语义**(`:2643`):在精灵 `spid` 上画 `gameabc_GameTxt.GameTxtList[recid]` 的 `Text`(颜色 `Color`,字号 `sp_h`,`textBaseline=top`)。`spid<=0` 时画在画布 `(sp_x, sp_y)`。 + +**Cocos 对应**:`cc.Label`。若文字要「贴」在某个精灵上,就挂一个子 `Label` 节点(与 §5.1 同理);若文字就是精灵自己的 caption,直接 `set_self(spid, 7, text)` → `label.string`(§3 cpid=7)。 + +> 注意:`recid` 在这里是 **`GameTxtList` 的索引(文字 id)**,不是图片资源号——与 `ifast_mydrawbmp` 的 `recid` 是两套 id。`set_rec`/`get_rec`(`:3089`/`:3092`)读写的就是这份文字列表(§5.6)。 + +### 5.3 `ifast_mydrawsprite(spid, spidsourse, sp_x, sp_y)` — 在精灵上绘制另一个精灵 + +**旧语义**(`:2596`):把精灵 `spidsourse` 画到 `spid` 的偏移 `(sp_x, sp_y)` 处(临时改 `spidsourse` 坐标、`draw`、恢复)。 + +**Cocos 对应**:直接把 `spidsourse` 作为 `spid` 的**子节点**,设 `position = (sp_x, sp_y)`。保留式场景图下「一个节点画在另一个节点内」就是**父子关系**,无需每次临时改坐标再恢复。 + +### 5.4 数字图片精灵 + +旧引擎**没有专门的数字 API**,数字只有两条路,Cocos 各对应: + +| 旧路径 | 旧实现 | Cocos 对应 | +|---|---|---| +| **文字数字** | `set_self(spid, 7, "积分:" + score)`(caption)→ 引擎 `fillText` | `Label.string`(系统字体 / TTF)——**平台层绝大多数数字走这条,1:1 平替** | +| **图片数字** | `ifast_mydrawbmp` 逐位切数字图集的帧、手算 `bmp_x = 位×字宽` | **`Label` + BMFont(`.fnt`)**——原生数字图片精灵:一个节点、自动逐位取字模、自动对齐/字距/缩放,**彻底取代手动画子图 + 手算偏移** | + +**BMFont 落地的注意点**:旧数字图集是「多帧网格 PNG」(`w × h = frame_all`,A §0.3),**不是 BMFont 格式**。要用 BMFont,须把 0–9(及可能的小数点/`+`/`-`/`:`)字模重打包成 `.fnt`+`.png`。若美术暂不重打包,可降级用「逐位 `Sprite` + 数字图集帧」手动排——**这是把旧引擎手工做法搬过来,不推荐**,只作为过渡。 + +### 5.5 `ifast_addtospritefromspritecopy(fspid, copyspid, x, y, tag)` / `ifast_dllpritefromspritecopy(fspid, tag)` + +**旧语义**(`:3556`,核心 `GameObject.addtospritefromspritecopy` `:1624`):把模板精灵 `copyspid` **深拷贝**(`copyme` 复制全部字段、共享 `image`/`uidata`)出一份副本,挂到父精灵 `fspid` 下、放到 `(x, y)`、打 `tag`、入 `addlist`,返回 id 串 `fspid+'add'+tag`。配套 `ifast_dllpritefromspritecopy`(`:3564`)按 `tag` 删除副本。 + +典型用法是**列表渲染**:一个模板 + 循环 N 份,`y = 首项 + spaceY*i`(房间列表 `11_GameUI.js:3707`、任务列表 `:4679`、VIP 榜 `:9629`)。 + +**Cocos 对应**(三层,从平替到更优): + +| 层级 | Cocos 做法 | 说明 | +|---|---|---| +| 平替 | `cc.instantiate(prefab)` + `node.setParent(parent)` + `node.setPosition(x, y)`;删除 `node.destroy()` / `node.removeFromParent()` | 模板做成 **prefab**,等价深拷贝 | +| 更优 | `cc.Layout`(垂直/水平/网格) | 自动排布,**干掉 `spaceY*i` 手算** | +| 更优 | `cc.ScrollView` + `NodePool`(复用,不反复 new/destroy) | 长列表滚动 + 对象池回收 | + +```ts +// 平替(等价深拷贝 + 定位) +const item = instantiate(templatePrefab); +item.setParent(listParent); +item.setPosition(x, y); + +// 更优:对象池复用(长列表) +const item = pool.get() ?? instantiate(templatePrefab); +item.setParent(listParent); +item.setPosition(x, y); // 交给 Layout 则连这行都省 +// 用完:pool.put(item) +``` + +`ifast_dllpritefromspritecopy(fspid, tag)` → `node.destroy()`;要复用 → `NodePool.put(node)` / `NodePool.get()`。 + +> 与 A 的衔接:A §0.2 指出「991 个对象里一部分是模板、一部分是容器」,且 A **有意不识别模板/容器**(A §1.5)。识别「哪个 ObjectID 是 `ConstVal.myRoomList.bgSp` 这类模板」是 **C(平台逻辑移植)** 的职责;B 只负责给出「克隆模板 → instantiate/Layout/Pool」这条映射规则。 + +### 5.6 `set_rec(stringid, stringv)` / `get_rec(stringid)` — 读写文字表 + +**旧语义**(`:3089`/`:3092`):读写 `gameabc_GameTxt.GameTxtList[stringid].Text`——一份**全局文字串表**(资源号是文字 id,非图片)。 + +**Cocos 对应**:`get_rec(id)` 读取的文本最终进某个 `Label`。文本常量本身在 C 里应由 `theme.fonts` / 文案表提供(见 `2026-08-27-ui-asset-and-skin-design.md` §4),不散落各处。**不要**为 `GameTxtList` 单独建一份全局可变文字表——它是旧引擎「无富文本能力」的产物,Cocos 用 `Label` 直接承载。 + +--- + +## 6. 落地约定(C 移植时遵守) + +1. **`spid` = `ObjectID` = `legacy.objectId`**(A §1.3),三者同源;C 侧通过 A 的 `manifest.json`(ObjectID → 节点路径)由 `spid` 定位节点。 +2. **换帧统一走 `FrameSet`**(A §3.4):`set_self(spid, 43, n)` → `frameSet.setFrame(n)`,帧号同为 1 基,无需心算减一。 +3. **坐标/尺寸**一律经 A §2.2 的换算后再赋值;本规范不重复坐标公式。 +4. **叠加绘制(§5.1/5.2)永远用子节点**,不得试图把多张图塞进一个 `Sprite`。 +5. **列表渲染(§5.5)默认上 `Layout` + `NodePool`**;只有一次性、数量少、非滚动的场景才用裸 `instantiate`。 +6. 遇到 ❓ 属性号或本表未列的 API,**回到 `gameabc.min.js` 对应 `switch`/函数补齐**,再回填本表——**禁止臆测**(第二准则)。 + +--- + +## 7. 红线与待验证 + +**红线** +- 不手写 `.prefab`/`.scene`/`.meta`(CLAUDE.md)——本规范的落地产物仍走 MCP / 编辑器。 +- 不臆测属性号语义;未定项以 ❓ 标记,C 移植时按需逆向。 +- 帧序/切帧/`FrameSet`/图集命名 只以 A §0.3/§3 为权威,本文不复写。 + +**已解决(本次逆向坐实,2026-08-30)** +- 属性号 34/35/36/45/46/51/57 语义已逆向完成并回填 §3(由 `gameabc_charge` / `gameabc_toclient` / `drawone` 源码坐实)。`ap`=透明度(0–255 → `UIOpacity.opacity`)**实证成立**,不再是推断。 +- `mode` 相对运算占比已统计:全平台层仅 `mode=1`(加法)约 27 处(其中 6 处 caption 的 mode 无效),`mode=2/3/4` 零使用 → **C 侧无需相对运算辅助方法**(详见 §3)。 + +**待验证(落地前)** + +| # | 待验证 | 方法 | +|---|---|---| +| 1 | 图片数字是否真用 BMFont(需美术重打包字模),还是暂用逐位 Sprite 过渡 | 看子游戏层数字素材现状,与美术确认 | +| 2 | `ifast_mydrawbmp` 的「叠加 vs 换帧」判定在 C 侧是否要更细(有些 spid 自身无图但语义上是「画内容」而非「换帧」) | C 移植首屏时抽样核对 | diff --git a/docs/superpowers/specs/2026-08-30-legacy-platform-logic-migration.md b/docs/superpowers/specs/2026-08-30-legacy-platform-logic-migration.md new file mode 100644 index 0000000..a8a1fb9 --- /dev/null +++ b/docs/superpowers/specs/2026-08-30-legacy-platform-logic-migration.md @@ -0,0 +1,276 @@ +# 旧 gameabc 平台逻辑 → Cocos TypeScript 移植(子系统 C·平台逻辑移植) + +> 状态:已逆向、待与用户确认。 +> 适用工程:`cocoscreator_projects/YouleNexus`(框架真源)。 +> 数据源:`projects/Game_Surface_3/js/00_Surface/`(12 文件)、`js/gamemain.js`、`js/gameabc.min.js`(均逐行逆向,行号见各节引用)。 +> 关联:本文是 A §0.1 定义的**第三个子系统**,依赖 **A(`2026-08-28-legacy-ui-migration-design.md`)** 与 **B(`2026-08-30-legacy-engine-api-mapping.md`)**;目标分层落到 **框架 spec(`2026-06-28-cocos-framework-design.md`)** 的 §3/§4。 +> 范围:旧工程的**逻辑流程与逻辑架构**——四层结构、数据流向、状态归属、核心流程、平台层对引擎 API 的依赖清单——到 Cocos 的移植。**不含**单条 API 的属性号语义(B §3)与渲染等价物(B §5),本文只引用。 + +--- + +## 0. 最高原则 + +承接 A/B 的两条原则(**原理等价**、**表现等效原理自由**),本文新增第三条,专门约束「逻辑流程一致性」: + +> **原则三 · 复刻业务逻辑,不复刻引擎机制**:旧引擎的主循环、双缓冲、帧内事件派发、层叠渲染、对象注册表等,都是「无 Cocos 时手工搭的引擎」——Cocos 引擎**自带等价物**,一律交给 Cocos 运行时,**不得在 TypeScript 里重写一遍渲染循环 / 命中检测 / 定时器调度**。要复刻的是**业务逻辑流程**:启动门控、登录/进房/重连状态机、收发包路由、状态归属边界、界面切换时机——这些是协议契约与业务正确性的承重墙,必须逐条对齐。 + +判定「该复刻还是该交给引擎」的判据:**看它属不属于协议契约 / 业务状态机**。是 → 复刻;只是旧引擎的实现手段 → 交给 Cocos。 + +--- + +## 1. 四层架构 → Cocos 框架分层 + +旧前端是**四层**(自底向上);目标框架 spec §3 已定义 **6 层**(`core/net/protocol/platform/ui/sdk`)。两者不是 1:1,映射如下: + +| 旧层 | 旧文件 | 在 Cocos 的落点 | 说明 | +|---|---|---|---| +| **引擎层** | `js/gameabc.min.js` + Spine + Canvas | **无对应**,由 Cocos 引擎接管 | 主循环/渲染/命中/定时器/资源/对象注册全是引擎机制(§2) | +| **桥接层** | `js/gamemain.js`(306 行) | `core/EventBus` + `sdk/` 回调钩子分发 | `gameabc_face` 全局回调表 → 事件总线;三方扇出 → `IGameModule` 钩子(§1.1) | +| **平台层** | `js/00_Surface/*`(12 文件) | `net` + `protocol` + `platform` + `ui` 四层 | 见 §3 逐文件映射 | +| **子游戏层** | `js/01_SubGame/*`(3 文件) | `sdk/`(子游戏实现 `IGameModule`) | 对局态 + `serialize()/restore(deskinfo)`(框架 spec §3 零耦合规则 3) | + +> 关键澄清:旧「桥接层」`gamemain.js` **没有业务逻辑**,只是「把引擎回调扇出到三个命名空间」的接线盒。Cocos 里它**消失**了——引擎回调变成 Cocos 事件,扇出变成 `IGameModule` 的一组具名钩子(`onPlayerJoin`/`onReady`/`onDissolve`/`onOffline`…)。不要为它单独建一个「gamemain 模块」。 + +### 1.1 桥接层 `gameabc_face` → 事件分发 + +旧 `gamemain.js` 的机制是「引擎反射调用 `gameabc_face.<事件名>` 具名函数,函数内部按固定三方扇出」。Cocos 对应为**两种机制**,各管一半: + +| 旧引擎回调(`gameabc_face.*`) | 旧扇出目标 | Cocos 对应 | +|---|---|---| +| `gamestart` | 仅 `Logic.AppStart()` | 引擎 `onLoad`/启动时序 → `platform` 启动编排 | +| `onloadurl`(资源加载进度) | `GameUI.onloadurl` | Cocos 资源系统 `Resources.load` 的 `onProgress`,**无需逐张计数** | +| `ontimer` / `ontimer_`(每精灵定时器) | 仅 `GameUI.utlontimer` | `component.schedule`(B §3 cpid=57 已映射) | +| `mousedown`/`mousedown_nomove`/`mouseup`/`mousemove` | `GameUI` + `Game_Modify` + `gameCombat` 三方 | Cocos 节点 `Button`/`EventTouch` 事件 + `IGameModule` 钩子 | +| `ani_doend`/`box_doend`(动画结束) | `GameUI` + `gameCombat` | `Animation`/`Tween` 完成回调 | +| `gamemydraw`/`gamemydrawbegin`/`gamebegindraw`/`gameenddraw` | 三方 | **无对应**(渲染循环交给引擎,业务「帧同步」需求另议) | +| `onresize` / `chongzhi` / `tcp*` / `httpmessage` | 空桩 | 不迁移(空实现) | + +> 「初始化 / 定时器」旧只走平台层;「触屏 / 动画 / 绘制」旧三方扇出。Cocos 里前者是 `platform` 内部事务,后者是 `IGameModule` 的具名钩子(子游戏按 spid 过滤是否处理)——这一「按 spid 过滤」的模式在 Cocos 里**不再需要**,因为钩子是类型化的、子游戏只收自己关心的。 + +--- + +## 2. 引擎运行时机制:引擎自带 vs 业务复刻 + +任务逆向出的引擎运行时(33fps 主循环、backBuffer 双缓冲、帧内事件派发、层管理、`sp+id` 对象注册表、100 并发资源加载),逐条判定归属: + +| 旧引擎机制 | 源码位置 | 判定 | Cocos 等价物 | +|---|---|---|---| +| 33fps `requestAnimationFrame` 主循环(`FPS=33` 硬编码,忽略数据 `fps=30`) | `tick()` `:1954`、`checkrun()` `:1858` | **引擎自带,不复刻** | Cocos 渲染循环(`director`) | +| backBuffer 双缓冲 + 脏标记 blit | `drawone()` `:1874`、`draw()` | **引擎自带,不复刻** | Cocos 场景图局部重绘 | +| 帧内事件派发(DOM 只记 `g_mouse`,回调在 `draw()` 里派发) | `gameabc_check_click` `:4095`、`check_click1` `:4068` | **引擎自带,不复刻** | Cocos 事件系统(`EventTouch`) | +| 每精灵定时器 `ontime`/`click_time` | `drawone` `:1878-1900` | 引擎自带 | `component.schedule`(B §3 cpid=57) | +| 层管理 `LayerList`/`showorder`/`set_level`/`set_level_up` | `:3102`/`:3114` | **引擎自带,且平台层从未直接调用**(§6.5) | Cocos 节点树 + `node.active` | +| `sp+id` 对象注册表 / `levelobj` 反向引用 | — | 引擎自带 | Cocos 节点树 + `manifest.json`(A §1.3) | +| 100 张并发 + 10ms 节流资源加载 | `load_img1` `:4454`/`load_img2` `:4597` | 引擎自带 | Cocos `Resources`/`Asset Bundle` | + +**结论**:上表**没有一条需要复刻**。引擎层的价值在「协议无关的渲染/输入/资源」,Cocos 引擎整体接管;真正要搬到 TypeScript 的是 §3–§6 的平台层业务。 + +--- + +## 3. 平台层模块 → framework 分层落点 + +平台层 12 个文件,逐个落到框架 6 层(框架 spec §3 的映射表已给粗对应,本文精确到「文件 → 模块」): + +| 旧文件(行数) | 职责 | framework 层 | 落点模块(示意) | +|---|---|---|---| +| `02_Const.js`(822) | 协议常量 + 静态配置 | `protocol` + `core` | `protocol/routes.ts`、`protocol/rpc.ts`(唯一来源);UI 常量 → `ui/theme` | +| `00_minhttp.js`(656) | WebSocket/XHR 封装 + 工具 | `net` + `core` | `net/NetClient` + `core/utils`(`min_*` 40+ 工具) | +| `09_Net.js`(897) | 收发信封 + 路由表 | `protocol` + `net` | `protocol/platform-rpc.ts`(`send_*`/`handle_*`) | +| `04_Data.js`(584) | 全局态 `GameData` | `platform` | `platform/stores/app-store.ts`(`AppStore`) | +| `06_Player.js`(575) | 玩家结构 `Player`/`C_Player` | `platform` | `platform/stores/player-store.ts`(`PlayerStore`) | +| `07_Desk.js`(1427) | 房间状态机 `Desk` | `platform` | `platform/stores/room-store.ts`(`RoomStore`) | +| `12_Logic.js`(2444) | 连接/重连/分发编排 | `platform` + `net` | `platform/session.ts`(登录/重连编排)+ `net/NetClient` | +| `11_GameUI.js`(9862) | 平台全部 UI | `ui` | `ui/` 下 Prefab + 各界面控制器 | +| `08_Utl_Output.js`(1034) | 平台对子游戏的输出/工具 API | `sdk`(facade) | `sdk/GameContext`(`getMyInfo`/`getRoomcode`/`getPlayerList`…) | +| `05_Func.js`(4185) | 原生/系统能力封装 | `platform` + `sdk` | 原生桥接归 `sdk`;纯工具归 `core/utils` | +| `03_Banwords.js` | 违禁词 | `core` | `core/utils` | +| `10_Game.js` | (零散 `set_self/get_self`) | `ui` | 并入对应界面控制器 | + +### 3.1 三个状态机的职责与唯一归属(框架 spec §3 零耦合规则 3 的细化) + +| 状态机 | 旧归属 | framework Store | 唯一职责 | +|---|---|---|---| +| `GameData` | 连接/配置/资产/面板态 | `AppStore` | `Server/AjaxUrl/AgentId/ChannelId/GameId`、`hallConfig/sysConfig`、各类列表 | +| `Desk` | 房间/座位/局状态 | `RoomStore` | `PlayerList[]`、`roomcode/stage/state/roomtype/warcnt`、解散投票 `AgreeList` | +| `C_Player` | 自己的状态 | `PlayerStore` | `playerid/bean/roomcard/seat/status/isprepare/state` | + +> 旧 `C_Player` 与 `Desk.PlayerList[C_Player.seat]` 是**同一玩家的两份镜像**,靠 `Player.SetDeskInfo/getDeskInfo` 手工同步(`06_Player.js:177-180` 改 bean 时显式回写 `Desk.PlayerList[seat].bean`)。Cocos 里这是**单一来源原则的反例**:`PlayerStore` 应持有「座位 → 玩家」的**唯一**响应式映射,自己的座位只是其中一个下标;消除双份镜像的手工同步。 + +--- + +## 4. 数据流向与调用方向(谁调谁、谁改谁) + +``` +旧(四层 + 双向手工刷新) Cocos(单向依赖 + 响应式) +────────────────────────────── ────────────────────────────── +引擎回调 ─► gamemain 扇出 ─► GameUI/Logic/子游戏 事件/钩子 ─► 单一 handler +收包 onmessage ─► Net. 薄转发 ─► Desk/C_Player 收包 ─► Router ─► Store 更新 ─► UI 响应式刷新 + └► 改状态后 手工调 GameUI.* 刷界面 └► (无手工刷 UI,Store 变化自动驱动) +``` + +**关键差异(移植时必须理解的)**: +- 旧是「改状态 → 手工调 `GameUI.xxx()` 刷新」。Cocos 是「Store 响应式 → UI 自动刷新」,**消灭 `Desk`/`C_Player` 方法里那批 `GameUI.setHallRoomCard`/`setHallStar` 手工回调**。 +- 旧 `Net.` 收包函数几乎全是「薄转发 + 菊花」(`Desk.(_msg)` 或 `C_Player.` 或 `gameCombat.`,夹 `GameUI.StartLoad()/EndLoad()`)。Cocos 里「薄转发」退化为 `protocol` 层的 typed handler → 直接调 Store 方法,「菊花」变成全局 loading 态。 + +### 4.1 收包路由分界(协议契约,必须逐字对齐) + +`12_Logic.js:258-264` 的分发是**平台/子游戏的分水岭**: + +``` +route ∈ { platform, agent, room } ─► 平台层 Net.(protocol/platform-rpc) +route = ─► 子游戏 Game_Modify._ReceiveData(sdk → IGameModule.onReceive) +``` + +框架 spec §4 已把这条分界固化为 `Router`,本文只强调:**这个三分支的 route 判定是协议红线**,`platform/agent/room` 之外的任何 route 都不得被平台层拦截或解析。 + +### 4.2 发包信封(协议契约,逐字节对齐) + +`Net._SendData`(`09_Net.js:12`)组装 `{app:"youle", route, rpc, data}`;`netType==0` 走 WebSocket,`netType==1` 走 `Func.AjaxHttp2`(HTTP 兜底,`player_login` 特判 `putMsg="playerLogin"`)。Cocos 侧 `net/NetClient` + `protocol` 编码必须保持信封结构与两条传输路径(含 HTTP 兜底),见框架 spec §4 与 `native-bridge-contract` 技能。 + +--- + +## 5. 状态归属与边界 + +| 归属 | 状态 | 旧位置 | Cocos 位置 | +|---|---|---|---| +| 平台-连接/配置/资产 | `Server/AgentId/ChannelId/GameId`、`hallConfig/sysConfig`、列表 | `GameData` | `AppStore` | +| 平台-房间 | `PlayerList[]`、`roomcode/stage/state`、`AgreeList`、`roomtype` | `Desk` | `RoomStore` | +| 平台-自己 | `playerid/bean/roomcard/seat/status/isprepare` | `C_Player` | `PlayerStore` | +| 平台-UI 瞬态 | `onstate[]/isprepare[]/VoteList/Mem`(方位映射后显示态) | `GameUI` 顶部变量 | `ui` 各控制器局部态 | +| 平台-本地持久化 | 开关/roomlist/playerid/machineId 等 | `Utl` storage key | `core/storage`(key 按 `GameId+AgentId` 拼,保持兼容) | +| **子游戏-对局态** | 手牌/出牌历史/轮次/分数/结算 | `Game_Modify`/`gameCombat` | 子游戏自身命名空间 + `serialize()/restore(deskinfo)` | + +**边界判据(三条,移植时逐条守住)**: +1. **路由判据**:`route ∈ {platform,agent,room}` 归平台层,其余归子游戏(§4.1)。 +2. **对局态透传不解析**:服务器在 `player_login` 回包下发 `deskinfo` 对局快照,`Desk.login` **原样**交给 `Game_Modify.Reconnect(deskinfo)`(`07_Desk.js:419-426`),平台层**不持有、不解析**对局态。Cocos 里是 `IGameModule.onReconnect(deskinfo)`,`RoomStore` 只透传快照、不拆解。 +3. **同一玩家单一来源**:消除 `C_Player` 与 `Desk.PlayerList[seat]` 双镜像(§3.1)。 + +--- + +## 6. 核心流程(逻辑流程一致性基准) + +以下五条流程是「逻辑流程一致」的验证基准,Cocos 侧必须**按同一次序、同一门控条件**复刻(实现手段可不同,流程与时序必须一致)。 + +### 6.1 启动流程(页面加载 → 首屏登录) + +旧:资源加载(`onloadurl` 逐张计数到 100)→ `gamestart` → `Logic.AppStart`(定 netType/isGameHall、`registerFunction`、`setChannelId→setGameServer→setAgentId→getVersionState`、`new C_Player`)→ `get_config`(HTTP 取 `player_server_tcp/game_server_tcp/urlserver`)→ `getConfig_Succ`(写 `GameData.Server/AgentId`、`GameInit`)→ `firstConnect` 建 WS。 + +**首屏门控四条件**(全齐才进登录页,`GameUI.JumpWxAuth()`): +1. `LoadCount==100`(资源) +2. `firstConnect_Succ`(WS onopen) +3. `getJSONState`(配置就绪) +4. `Timesup`(加载计时器 `Game_Config.Max.showtime` 到点) + +> 门控四条件的**时序语义必须保留**(缺一不进登录页),但实现手段升级:资源计数交给 Cocos 加载系统,计时器用 `scheduleOnce`,四条件合成一个「就绪信号」而非各自散落置位。 + +### 6.2 登录 / 进大厅 / 进房间 + +`Net.Send_login`(组包 agentid/openid/nickname/…/machineid)→ `Net.player_login` → `Desk.login`,按 `roomcode` 分支: +- **无 `roomcode`** → `Game_Modify.closeGameScene()` + `GameUI.JumpMenuScene()`(大厅)+ 按 `Logic.JudgeShow()` 弹公告。 +- **有 `roomcode`** → `Logic.updateMainSceneData(roomtype)`(=`Game_Modify.onCreateDesk` + `Desk.Create`)→ `GameUI.MainScene(true)` → 按 `deskinfo` 有无走 `Game_Modify.Reconnect(deskinfo)` 或 `ReconnectNoMakewar()`。 + +### 6.3 断线重连(`isbattle==1` → `Reconnect(deskinfo)`) + +- **断线检测**:`game_websocket.onclose` → 置 `netWorkSate=false`;非首次连接 `NetType=1` + `TryConnect()` + `OpenDisConnect()`。 +- **重连后**:`onopen` → 若 `isLogin` 重发 `Send_login`。 +- **触发点**(`07_Desk.js:419-426`):登录回包带 `deskinfo` 时 → `Game_Modify.Reconnect(deskinfo)`;否则 `ReconnectNoMakewar()`。子游戏必须能**反序列化同一结构**(与 `docs/protocol/` 的 `deskinfo` 快照对齐,B 已强调)。 +- **旁路**:`self_join_room`(`07_Desk.js:649`)带 `deskinfo` → `Desk.stage=1` + `Game_Modify.DeskInfo(deskinfo)`(他人未开战牌桌数据)。 + +### 6.4 对局流程(`Desk` 状态机 + 子游戏协作) + +开战 / 准备 / 对局收发包 / 解散投票 / 离桌 / 结算投降,均以 `Desk` 状态机为骨架、`Game_Modify` 为协作方: + +| 流程 | 平台层(`Desk`/`C_Player`) | 子游戏(`Game_Modify`,Cocos `IGameModule`) | +|---|---|---| +| 开战 | `self/other_makewar` → `stage=1`、`ChangeExit(0)`、`HideStartScene()` | `StartWar(_msg)` 建对局 | +| 准备 | `player_prepare` → 改座位 `isprepare` + `SetIsprepare` | `onReady` | +| 对局中 | route 非 platform/agent/room 的包**完全不介入** | `_ReceiveData`(`onReceive(rpc,data)`) | +| 解散投票 | `state=1` + `AgreeList` 累积 + `OpenApply` | `Free(deskfree)`(`free_room` 时) | +| 离桌 | `stage==1` → `breakRoom()`;其余 `playerLeaveRoom` 等 | `breakRoom/playerLeaveRoom/playerOffline/changeSeat` | +| 结算/投降 | `get_player_grade1/2`→`gameCombat`;`beanroom_surrender` | `onSurrender` | + +### 6.5 界面切换(**不是 `set_level`**) + +> 重要澄清(全仓 grep 实证):`set_level`/`set_level_up` 是**引擎层函数**,平台层**从未直接调用**。平台层的「界面切换」机制是**精灵级显隐 + 场景哨兵**: + +- `set_self(spid, 37, vsb)`(cpid=37 可见性)+ `set_group(groupid, 37, vsb)` 整组显隐。 +- 界面骨架:`GameUI.invisible()`(全隐藏)→ 各界面只点亮自己的 group(登录 `set_group(2,37,1)`、大厅 `set_group(3,37,1)`、房间 `set_group(21,37,1)`、各弹窗各自 group)。 +- **场景哨兵**:`get_self(149,37)` = 「是否在房间主界面」、`get_self(4,37)` = 「大厅」标志,被 `Utl.isMainScene`/`Logic.checkRoom` 读。 + +Cocos 等价:`set_self(spid,37,vsb)` → `node.active`(B §3 cpid=37);「界面」→ 独立的**场景 / 预制根节点**;「场景哨兵」→ `AppStore` 里显式的 `currentScene` 状态(而不是反查某个精灵的可见性)。**不要**去找 `set_level` 的对应物。 + +--- + +## 7. 平台层 gameabc API 依赖清单(19 个,分域) + +全平台层 `00_Surface` 实际调用 **19 个引擎 API,共 2305 处**,其中 `set_self`/`get_self`/`set_group` 三项占 88.6%(2042 处),且集中在 `11_GameUI.js`。按域分列;**B 已覆盖的引用 B,本文只补 B 未覆盖的映射方向**。 + +| 域 | API(次数) | Cocos 对应方向 | +|---|---|---| +| 属性读写 | `set_self`(1525)、`get_self`(373)、`set_group`(144) | 属性号对照见 **B §3**;`set_group(groupid,37,vsb)` 整组显隐 → 该 group 父节点的 `active`(A §2.1 已并入父节点) | +| 裁剪/记录 | `set_clip`(21) | 设置裁剪区域(滚动列表/进度条)→ `cc.Mask` / `ScrollView` 视口裁剪 | +| 记录 | `set_rec`(4)、`get_rec`(2) | 见 **B §5.6**(文字表 → `Label`,不建全局可变文字表) | +| 窗口变量 | `set_windows`(1) | ⚠️ 待逆向(`12_Logic.js:523 set_windows(2,"var","1977")`,仅 1 处,落地前看用途) | +| 渲染绘制 | `ifast_mydrawbmp`(19)、`ifast_mydrawtext`(2) | 见 **B §5.1/§5.2** | +| 精灵绘制 | `ifast_mydrawsprite`(—) | 见 **B §5.3** | +| 批量加载 | `ifast_loadsprite`(1) | 批量预加载精灵 → Cocos `Resources.loadDir` / 图集预载(引擎自动,通常无需) | +| 实例/资源 | `ifast_addtospritefromspritecopy`(77)、`ifast_dllpritefromspritecopy`(69) | 见 **B §5.5**(列表 → `Layout`/`ScrollView`/`NodePool`) | +| 命中/检测 | `ifast_check_add`(12)、`ifast_checkimg`(1) | 按坐标检测精灵 → Cocos 节点事件系统天然覆盖;`checkimg` 图片已加载检查 → 资源系统 | +| 对象查找 | `ifast_getobj`(4) | 按 id 取引擎对象 → `node.getComponent` / `manifest.json`(A §1.3)定位 | +| 工具/数学 | `ifast_random`(14)、`ifast_abs`(14) | 纯 JS:`Math.random()`/`Math.abs()`,**无引擎依赖** | +| 引擎单例 | `gameabc_face`(14)、`gameabc_Voice`(8) | `gameabc_face`(取 div/canvas ctx)→ 场景根/Canvas 持有;`gameabc_Voice`(语音列表)→ 音频资源清单 + `AudioSource` | + +**网络域(独立,见 `native-bridge-contract` 技能)**:平台层网络**不走**引擎的 `ifast_ws/tcp/ajax/http`(0 次调用),而是自有 `00_minhttp.js` 的 `min_tcp`(原生 `new WebSocket`)+ `min_http`(原生 `XMLHttpRequest`),收发经 `Net.ws_tcp.send(JSON.stringify(msg))`。Cocos 用 `WebSocket` 封装 + 协议信封逐字节对齐。 + +**任务提及但平台层实际未使用(避免白做迁移)**: + +| 未使用 API | 实测 | +|---|---| +| `ifast_ws`/`ifast_tcp_*`/`ifast_ajax`/`ifast_http`/`ifast_split` | 0 次(平台层改用自有 `min_tcp`/`min_http`) | +| `get_selfdiv`/`set_selfdiv` | 0 次 | +| `set_level`/`set_level_up`/`openurl`/`showmessage` | 0 次 | +| `gameabc_Object`/`gameabc_Image`/`gameabc_Layer`/`gameabc_GroupList`/`gameabc_GameTxt` | 0 次(仅 `gameabc_face`、`gameabc_Voice` 被用) | +| `up_imgurl` | 平台层自有 `Func.up_imgurl`(`05_Func.js:1710`),非引擎 API | + +--- + +## 8. 逻辑流程一致性检查点(验证基准) + +迁移完成后,以下检查点逐一核验(作为「逻辑流程一致」的验收单): + +- [ ] **信封**:`{app:"youle", route, rpc, data}` 结构与 `docs/protocol/` 逐字节对齐;`route` 三值 `platform/agent/room` 判定正确。 +- [ ] **收包分界**:`route ∈ {platform,agent,room}` → 平台层;其余 → `IGameModule.onReceive`;平台层不拦对局包。 +- [ ] **发包路径**:`netType==0` WebSocket / `netType==1` HTTP 兜底两条都在;`player_login` 的 `putMsg="playerLogin"` 特判保留。 +- [ ] **启动门控四条件**:资源/WS onopen/配置/加载计时器,缺一不进登录页。 +- [ ] **登录分支**:`roomcode` 有无 → 大厅 or 房间;`deskinfo` 有无 → `onReconnect` or `ReconnectNoMakewar`。 +- [ ] **断线重连**:onclose → 重连 → 重发登录 → `deskinfo` 反序列化恢复对局(子游戏 `restore`)。 +- [ ] **状态归属**:`RoomStore`/`PlayerStore`/`AppStore` 三态机职责唯一;`C_Player` 与 `PlayerList[seat]` 无双镜像。 +- [ ] **对局态透传**:平台层不解析 `deskinfo`,原样交 `IGameModule`。 +- [ ] **界面切换**:用 `node.active` + `AppStore.currentScene`,不搬 `set_level`。 +- [ ] **原生接口**:`window.settings` 同步取值 + WVJB 异步桥,接口名/数据格式/URL 构造与旧逐字一致(见 `native-bridge-contract`)。 + +--- + +## 9. 落地约定 / 红线 / 待验证 + +### 9.1 落地约定 + +1. **模块名遵循框架 spec §3**:旧文件 → framework 层的映射(§3 表)是唯一落点,不得另起命名。 +2. **Store 响应式驱动 UI**:`RoomStore`/`PlayerStore`/`AppStore` 状态变 → UI 自动刷新,**消灭** `Desk`/`C_Player` 里那批 `GameUI.*` 手工回调。 +3. **路由/信封/deskinfo 只认 `docs/protocol/`**:任何网络层疑问先读协议文档,不臆测(CLAUDE.md 第一准则)。 +4. **遇到 ❓/⚠️ API**(如 `set_windows`)回到 `gameabc.min.js` 对应处补齐再回填,**禁止臆测**(第二准则)。 + +### 9.2 红线 + +- 不手写 `.scene`/`.prefab`/`.meta`(CLAUDE.md)——本规范落地产物仍走 MCP。 +- 不复刻引擎机制(主循环/双缓冲/帧内命中/对象注册表)——交给 Cocos 运行时。 +- 不改变协议信封、route 判定、`deskinfo` 透传边界(第一准则)。 + +### 9.3 待验证(落地前) + +| # | 待验证 | 方法 | +|---|---|---| +| 1 | `set_windows(2,"var","1977")` 的语义(仅 1 处,`12_Logic.js:523`) | 看该调用上下文,判定是否需迁移或可直接丢弃 | +| 2 | `Utl` storage key(`GameId+AgentId` 拼接)在新工程是否要保持原 key 以兼容旧缓存 | 与后端/运营确认是否需沿用旧 key | +| 3 | 首屏门控四条件里「加载计时器 `showtime`」的精确时长与超时行为 | 读 `Game_Config.Max.showtime` 定义值 | +| 4 | `C_Player`/`Desk.PlayerList[seat]` 双镜像在哪些方法里被读写,确保 `PlayerStore` 单一来源无遗漏 | grep `SetDeskInfo`/`getDeskInfo`/`PlayerList[` 全调用点 | diff --git a/docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md b/docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md new file mode 100644 index 0000000..2a32731 --- /dev/null +++ b/docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md @@ -0,0 +1,365 @@ +# legacy-layer → Cocos prefab 转换脚本设计 + +> **Status**: Draft v1 (brainstorming approved, awaiting user spec review) +> **Date**: 2026-09-02 +> **Spec for**: `scripts/legacy-layer-to-cocos-prefab.mjs` + 测试套件 + +## Goal + +把 `projects/Game_Surface_3/save/Layer*.xml`(GB18030 编码 XML)+ `output/gameabc_*.json` 的结构化 UI 数据,**程序化转换为 Cocos prefab JSON**,让 YouleNexus 已迁移的 ~17 个组件 prefab(widgets/ + views/ + Login_Layer)能 1:1 对齐原项目 Game_Surface_3 的布局+精灵+Widget 锚定。 + +**成功标准**:脚本生成的 prefab 加载到 Cocos 编辑器 0 报错,节点树/SpriteFrame/Widget 锚定与原 Layer XML 字段语义一致。 + +## 范围(本设计覆盖) + +### 已核实映射表(2026-09-02 全量 XML 解析 + 用户拍板) + +| 目标 prefab(YouleNexus) | 对应 Layer XML | Layer 名称 | Group | Spirit 数 | 备注 | +|---|---|---|---|---|---| +| `prefabs/Login_Layer.prefab` | Layer00002.xml | Login_Layer | 2 | 18 | 已有完整复刻,端到端 PoC 验证 | +| `prefabs/views/PlayerInfoView.prefab` | **Layer00017.xml** | **MenuPlayerInfo_Layer** | **18** | 15 | **用户拍板 A** | +| `prefabs/widgets/Group106_PhoneVerify.prefab` | Layer00029.xml | phoneInfo | 106, 108 | 38 | | +| `prefabs/widgets/Layer10_Protocol.prefab` | Layer00010.xml | Protol_Layer | 37 | 4 | **PoC 阶段 2**(含 Widget 锚定) | +| `prefabs/widgets/Layer609_Setting.prefab` | Layer00609.xml | Setting_Layer | 6 | 15 | | +| `prefabs/widgets/Layer612_Tips.prefab` | Layer00612.xml | Tips_Layer | 32, 89 | 5 | | +| `prefabs/widgets/Layer613_RoomCardUpdate.prefab` | Layer00613.xml | updateRoomCard_Layer | 34 | 3 | | +| `prefabs/widgets/Layer614_Loading.prefab` | Layer00614.xml | Loading_Layer | 40 | 2 | | +| `prefabs/widgets/Layer615_Reconnect.prefab` | Layer00615.xml | Reconnect_Layer | 35 | 4 | | +| `prefabs/widgets/Layer616_Kick.prefab` | Layer00616.xml | Kick_Layer | 33 | 3 | | +| `prefabs/widgets/Layer617_Notice.prefab` | **Layer00008.xml** | **Notice_Layer** | **3, 95** | **9** | **用户拍板 B** | +| `prefabs/widgets/Layer619_BackOtherGame.prefab` | Layer00619.xml | BackHall_Layer | 55 | 1 | Layer 名 BackHall ≠ BackOtherGame,但 group 唯一匹配 | +| `prefabs/widgets/Layer620_Record.prefab` | Layer00620.xml | recordLayer | 101 | 3 | | + +**总计:11 个 prefab 全部映射到明确 Layer XML**(不含 6 个 NO_MATCH widget) + +### 范围外(**用户拍板 C:先不做**) + +| 目标 prefab | 原因 | +|---|---| +| `prefabs/templates/ListItem_Room.prefab` | 跨 Layer 复用的 widget 子模板 / YouleNexus 新加,未在 save/Layer*.xml 中找到 | +| `prefabs/widgets/Btn_Primary.prefab` | 通用按钮 widget,YouleNexus 新加 | +| `prefabs/widgets/IconButton.prefab` | 通用图标按钮 widget,YouleNexus 新加 | +| `prefabs/widgets/Modal.prefab` | 通用弹窗 widget,YouleNexus 新加 | +| `prefabs/widgets/NumericLabel_Score.prefab` | 数字滚动 Label widget,YouleNexus 新加 | +| `prefabs/widgets/ProgressBar_Standard.prefab` | 通用进度条 widget,YouleNexus 新加 | + +### 事实源 + +完整 Layer 解析数据见 `docs/superpowers/data/layer-spirit-summary.json`(68 个 Layer 全量、81 个 group、5 种 SpiritType 分布)。 + +### 未来扩展(如需) + +如果要补做 6 个 NO_MATCH widget,需先在 `scripts/legacy-layer-to-cocos-prefab.mjs` 加"跨 Layer Spirit 提取"能力(按 Sprite name / Layer 内 widget 模式匹配),不在本设计范围。 + +**不在范围**: +- 未迁移的 68 个 Layer 中的其余 ~50 个 +- 动画(Spirit 的 `ani_*` 属性 / Spine / DragonBones) +- 多语言文本 +- 协议层字段 + +## Architecture + +### 数据流 + +``` +projects/Game_Surface_3/save/Layer*.xml ─┐ +projects/Game_Surface_3/output/ ─┼→ [legacy-layer-to-cocos-prefab.mjs] → out/legacy-migration/ + gameabc_Image.json (sprite 映射) │ ├─ .prefab (UTF-8 JSON 数组) + gameabc_Project.json (适配元数据) │ └─ .diff (vs YouleNexus 现有) +projects/Game_Surface_3/js/ ─┘ + gameabc.min.js (语义来源,需逆向) +``` + +### 模块划分(单文件脚本 + 7 个测试) + +| 模块 | 职责 | +|---|---| +| `readLayerXml(path)` | GB18030 编码读 XML → JS 对象 | +| `resolveSpriteFrameUuid(imgResId)` | 查 gameabc_Image.json → atlas SpriteFrame 真 UUID(含 @f9941) | +| `buildGroupParents(spirits)` | 按 BelongGroupID 分组 → group-X 父节点骨架 | +| `mapSpiritTypeToComponent(type)` | SpiritType → 组件类型枚举(逆向 gameabc.min.js) | +| `computeLpos(spirit, parentGroup)` | CoordSelfPos + CoordRelaX/Y → _lpos {x,y,z} | +| `computeContentSize(spirit)` | SizeCalcMode + SizeRelaWidth/Height + Width/HeightCalcMode → _contentSize {width,height} | +| `computeWidgetAlignment(spirit)` | SizeCalcMode + 父 group 关系 → cc.Widget._alignFlags + _horizontalCenter 等 | +| `emitPrefabJson(name, group, root)` | 按 Login_Layer.prefab schema 输出 JSON 数组(含 CompPrefabInfo / PrefabInfo) | +| `diffAgainstExisting(generated, existing)` | 输出 .diff 文件 | + +## 输入契约 + +### `save/Layer.xml` + +**GB18030 编码**(不是 UTF-8 也不是 GBK!实测 Python xml.etree 用 GBK 解码会乱码,GB18030 才能完整解析中文 Spirit 名)。结构: + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + +``` + +> **GB18030 编码陷阱**:脚本必须用 GB18030 读(GBK 是 GB18030 子集,但部分生僻字 / 私有区字符需要 GB18030 才能解码)。UTF-8 会乱码。Spirit 名是中文,输出 .prefab JSON 时按 UTF-8 写。Node.js 用 `iconv-lite` 包支持 GB18030 解码。 + +### `output/gameabc_Image.json` + +`ImgResID → atlas spriteFrame path` 映射(具体 schema 在 PoC 阶段 1 解析)。 + +### `output/gameabc_Project.json` + +```json +{ + "Property": { + "ProjectName": "Game_Surface_3", + "ScreenWidth": 1280, + "ScreenHeight": 720, + "GameSceneWidth": 1699, + "GameSceneHeight": 1800, + "ScreenFitMode": 1 + } +} +``` + +> **适配策略**:原项目 ScreenWidth=1280, ScreenHeight=720,但 YouleNexus 当前 Login_Layer.prefab 根 _contentSize = 1600×720。脚本默认生成 1600×720 的根 UITransform(与 Login_Layer.prefab 一致),但 Spirit 内部坐标按原 XML 不变——**Widget 锚定负责多分辨率适配**。 + +### `js/gameabc.min.js` + +逆向目标: +- `SpiritType` 枚举(0=Sprite?1=Text?2=Button?3=ProgressBar?...) +- `CoordSelfPos` 计算公式(X/Y 相对父节点的偏移量) +- `SizeCalcMode` 公式(SizeParentID / SizeRelaWidth / SizeRelaHeight 怎么合成 _contentSize) +- `WidthCalcMode` / `HeightCalcMode` 公式 +- BelongGroupID 的语义 + +> **逆向策略**:在 PoC 阶段 1 之前完成。逆向结果固化到 `framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json` 作为已知事实源。 + +## 输出契约 + +### `out/legacy-migration/.prefab` + +UTF-8 JSON 数组(**严格按 Login_Layer.prefab schema**),字段含义: + +```typescript +type PrefabJson = Array +type PrefabObject = + | { __type__: "cc.Prefab", _name: string, ... } // 0 + | { __type__: "cc.Node", _name: string, _children: [{__id__: number}], _components: [{__id__: number}], _lpos: Vec3, _lrot: Quat, _lscale: Vec3, ... } + | { __type__: "cc.UITransform", _contentSize: Size, _anchorPoint: Vec2, ... } + | { __type__: "cc.Sprite", _spriteFrame: { __uuid__: string, __expectedType__: "cc.SpriteFrame" }, _type: 0|1, _sizeMode: 0|1|2, ... } + | { __type__: "cc.Label", _string: string, _fontSize: number, _horizontalAlign: 0|1|2, _verticalAlign: 0|1|2, _color: Color, _font: null, _isSystemFontUsed: true, ... } + | { __type__: "cc.Widget", _alignFlags: number, _left?: number, _right?: number, _top?: number, _bottom?: number, _horizontalCenter?: number, _verticalCenter?: number, _isAbs*: true, _alignMode: 2, ... } + | { __type__: "cc.CompPrefabInfo", fileId: string } + | { __type__: "cc.PrefabInfo", root: {__id__: number}, asset: {__id__: number}, fileId: string, ... } + | { __type__: string /* custom class UUID */, _name: "", _enabled: true, ... } +``` + +### `out/legacy-migration/.diff` + +`diff -u` 格式,对比脚本输出 vs YouleNexus `prefabs//.prefab` 现有内容。**仅供人审**,不自动覆盖。 + +### 输出根节点 `_contentSize` + +默认 `1600×720`(与 Login_Layer.prefab 一致),**不按原 Project.GameSceneWidth/Height**——理由:YouleNexus Canvas 设计尺寸固定 1600×720(CLAUDE.md 第一准则精神:UI 层自己处理适配,原项目 ScreenWidth 是另一回事)。 + +## 关键映射规则 + +### Spirit → cc.Node + +| 原字段 | Cocos 字段 | +|---|---| +| `Spirit.Name` | `cc.Node._name` | +| `Spirit.ID` | 用于生成 `_id`(cocos 内部 ID,与 fileId 不同) | +| `Spirit.BelongGroupID = "0"` | 节点挂在 Layer 根节点下 | +| `Spirit.BelongGroupID = "N"` (N>0) | 节点挂在 `group-N` 父节点下 | +| `Spirit.IndexOfLayer` | 同 group 内的兄弟顺序(生成 `_children` 数组顺序) | +| `Spirit.CoordParentID` | 父节点引用(=同 group 内其他 Spirit 的 ID) | + +### Group 父节点自动生成 + +- 自动创建 `cc.Node _name = "group-"`,N = 原 BelongGroupID 值 +- **保留全局编号**(不重新编号为 group-1/2/3),便于 cross-layer 调试(与 Login_Layer 复刻一致) +- 父节点本身**无 sprite/label**,只挂 UITransform + Widget(与 Login_Layer.prefab 的 group-2 一致) +- 多个 group 时按 group ID 升序排(group-1, group-2, ...) + +### SpiritType → 组件 + +**逆向目标**(在 PoC 阶段 1 之前完成)。当前猜测: + +| SpiritType | 组件类型 | 说明 | +|---|---|---| +| 0 | `cc.Sprite` | 普通精灵 | +| 1 | `cc.Label` | 文本 | +| 2 | `cc.Button` | 按钮(待确认) | +| 3 | `cc.ProgressBar` | 进度条(Login_Layer "进度条底" 是 type=3) | +| ... | ... | 全部逆向 gameabc.min.js 后填表 | + +**未识别 type → throw**,不静默。 + +### ImgResID → SpriteFrame 真 UUID + +查 `output/gameabc_Image.json` 拿到 atlas 图片路径 → 查 `atlas-hall/atlas-login/atlas-room` atlas 的 SpriteFrame UUID(含 `@f9941` sub-asset 后缀)。 + +> **找不到 → throw + 列出所有未映射 ID**(CLAUDE.md 第二准则)。 + +### 坐标/尺寸计算 + +**锚点转换公式(实测验证 2026-09-02,Login_Layer 渠道logo + 游客登录双节点匹配)**: + +原项目精灵锚点 = **左上角**(X/Y 是精灵左上角的绝对屏幕坐标,基于 1280×720) +Cocos 精灵锚点 = **中心**(_lpos 是精灵中心在父节点坐标系的位置,Y-up) + +``` +# Spirit → cc.Node._lpos(假设父节点 _contentSize 1600×720、anchorPoint (0.5, 0.5)) +cocos_lpos.x = original_X + original_W / 2 - 640 # 原坐标系半宽 1280/2 +cocos_lpos.y = 360 - (original_Y + original_H / 2) # Y-up 翻转 + 原坐标系半高 720/2 +cocos_lpos.z = 0 +``` + +**验证证据**: +- 渠道logo:原 (734, 143, 59, 148) → Cocos (763.5 - 640, 360 - 217) = (123.5, 143) ✓ +- 游客登录:原 (540, 388, 320, 95) → Cocos (700 - 640, 360 - 435.5) = (60, -75.5) ✓ + +**SizeCalcMode 公式(待 PoC 阶段 1 逆向 gameabc.min.js)**: + +``` +_contentSize.width = Spirit.Width || 0 +_contentSize.height = Spirit.Height || 0 + +# 如果 SizeCalcMode != 0,用 SizeParentID + SizeRelaWidth/Height 计算(公式逆向中) +if Spirit.SizeCalcMode != 0: + parent_size = lookup(Spirit.SizeParentID) + _contentSize.width = parent_size.width * Spirit.SizeRelaWidth / 10000 + _contentSize.height = parent_size.height * Spirit.SizeRelaHeight / 10000 +``` + +**Widget 锚定**: + +| 情况 | `_alignFlags` | 其他字段 | +|---|---|---| +| 节点相对 Canvas 全屏铺满 | 45 (= 左+右+上+下) | `_left/_right/_top/_bottom = 0` | +| 节点水平居中 | 16 (= 水平居中) | `_horizontalCenter = Spirit.X` | +| 节点垂直居中 | 8 | `_verticalCenter = Spirit.Y` | +| 节点左上对齐 | 9 (= 左+上) | `_left = Spirit.X, _top = Spirit.Y` | +| ... | ... | 全部逆向后填表 | + +**逆向不出公式 → throw**,不兜底默认值。 + +## 错误处理(CLAUDE.md 第二准则:不静默兜底) + +| 场景 | 处理 | +|---|---| +| `gameabc_Image.json` 找不到 ImgResID | `throw new Error(\`ImgResID ${id} (Spirit ${sid}) not in gameabc_Image.json\`)` | +| SpiritType 不在已知枚举 | `throw new Error(\`Unknown SpiritType ${type} (Spirit ${sid}) — reverse gameabc.min.js first\`)` | +| CoordSelfPos/SizeCalcMode 公式逆向不出 | `throw new Error(\`Cannot compute coord/size for Spirit ${sid}: formula unknown\`)` | +| XML 字段缺失或编码错 | `throw new Error(\`Spirit ${sid} missing field ${fieldName}\`)` | +| 输出目录有同名 .prefab | **覆盖**(隔离目录是 transient)+ stdout 列 diff 路径 | +| `gameabc_Image.json` schema 变更 | 启动时 schema 校验,失败直接 throw | +| Layer 在 PoC 阶段 4 找不到目标 YouleNexus prefab | throw + 列出所有"无目标"Layer,让用户补映射 | + +## 测试策略(TDD) + +按 ui-asset-and-skin plan 风格:`node:test` + `node:assert` + `tsx`,零第三方依赖。 + +### 测试套件:`framework-tests/legacy-layer-migration/` + +| 文件 | 覆盖 | +|---|---| +| `xml-parser.test.mjs` | GB18030 编码读、字段提取、BelongGroupID 分组 | +| `spirit-to-node.test.mjs` | SpiritType=0/1/3 → Sprite/Text/ProgressBar 组件映射 | +| `group-builder.test.mjs` | BelongGroupID → group-X 父节点合并 + 同 group 内 IndexOfLayer 排序 | +| `coord-calculator.test.mjs` | CoordSelfPos/SizeCalcMode/WidthCalcMode/HeightCalcMode 公式正确性 | +| `sprite-uuid-resolver.test.mjs` | ImgResID → 现有 atlas SpriteFrame UUID(基于真实 gameabc_Image.json fixture) | +| `prefab-emitter.test.mjs` | 输出 JSON 格式严格按 Login_Layer.prefab schema(用 Login_Layer.prefab 实际内容作 fixture) | +| `poc-iconbutton.test.mjs` | 端到端:输入 save/Layer*.xml → 输出 .prefab → 与 YouleNexus 原 prefab 做 schema 对比(**不对比内容,只对比结构**) | + +### TDD 红绿循环(每个 PoC 阶段) + +1. **红**:写测试(输入已知 Layer XML,期望已知 prefab JSON 结构) +2. **绿**:写脚本直到测试通过 +3. **重构**:优化代码 +4. **人工 diff**:`diff -u out/legacy-migration/.prefab prefabs//.prefab`,看 diff +5. **修订**:根据 diff 调整映射规则,回到 1 + +### 测试 fixtures + +- `framework-tests/legacy-layer-migration/fixtures/spirit-semantics.json` — gameabc.min.js 逆向结果固化 +- `framework-tests/legacy-layer-migration/fixtures/gameabc_Image.json` — 真实 gameabc_Image.json 副本 +- `framework-tests/legacy-layer-migration/fixtures/Layer00002.xml` — Login_Layer XML 副本(GB18030) +- `framework-tests/legacy-layer-migration/fixtures/Login_Layer.prefab` — 已复刻的 Login_Layer prefab 副本(用于端到端对比) + +## PoC 路径(4 阶段) + +| 阶段 | 目标 | 验证点 | +|---|---|---| +| **阶段 1** | IconButton(单 Sprite、无 Widget、无 group) | Spirit→Node + SpriteFrame 解析 + JSON 输出 + schema 对比 | +| **阶段 2** | Layer10_Protol(Layer00010,group 37,含 Widget 锚定) | group-X 父节点合并 + Widget 锚定逻辑 | +| **阶段 3** | Login_Layer(已有完整 1:1 复刻可对比) | 端到端验证 + 人工 diff 接近零差异 | +| **阶段 4** | 批量跑剩 14 个 | 每个输出 .diff 供人审 | + +阶段 1 必须先逆向 gameabc.min.js 中 IconButton 用到的 SpiritType/Coord 公式。 + +## 不做的事(明确边界) + +- ❌ 不覆盖 YouleNexus 原 prefab(**只生成候选 + diff**) +- ❌ 不处理动画(Spirit 的 `ani_*` 属性 → throw + 标出该 Spirit) +- ❌ 不处理 Spine / DragonBones(unknown SpiritType → throw) +- ❌ 不处理多语言(只读 `_string` 字面值,不查国际化表) +- ❌ 不迁移协议字段(CLAUDE.md 第一准则:协议不动) +- ❌ 不重写为 click handler / 业务逻辑(只做布局+精灵迁移,**业务挂脚本留 follow-up**) +- ❌ 不处理 OptionList.tag/tag1-3 / EventList(除非 layer-to-prefab 有明确映射,待逆向) + +## Risks & Open Questions + +1. **gameabc.min.js 逆向深度**:SpiritType 枚举只有 5 种(0/1/3/4/5,全量解析已确认),但 SpiritType 4 和 5 的语义仍需逆向(猜测 4=Particle / 5=Button,但需 PoC 阶段 1 验证);CoordSelfPos / SizeCalcMode 公式逆向中。 +2. **SpriteFrame UUID 跨 atlas 选择规则**:atlas 选哪个取决于原 Layer 来源场景 —— Login_Layer 用 `atlas-login`,MainScene 用 `atlas-hall`,Room 用 `atlas-room`。具体规则按 Layer 编号或 Spirit 名称模式决定,**PoC 阶段 1 实测后固化到 fixtures/spirit-semantics.json**。 +3. **Layer00007 ewm_Layer 含 group=0**:表示有节点不在 group-X 父节点下(直接挂在 Layer 根)。脚本需支持 BelongGroupID=0 节点(按现有 group-X 父节点方案应直接挂 Layer 根)—— **已在范围表规则中说明**,待 PoC 验证。 +4. **YouleNexus 原 prefab 的偏差**:某些 prefab 可能已经人工调整过布局,与原 Layer 不一致 —— **diff 工具帮人审,但最终覆盖决策在你** + +## Out of Scope(follow-up) + +- 把所有 68 个 Layer 全迁移 +- 自动生成 sprite atlas(走 ui-asset-and-skin plan Task 3 独立推进) +- 迁移 OptionList.tag/tag1-3 业务字段 +- 迁移 EventList 事件处理 + +## Success Metrics + +- 17 个目标 prefab 全部生成;与 YouleNexus 现有版本 diff **仅显示手工已修字段的差异**(坐标/尺寸/spriteFrame UUID/Widget 锚定全部精确匹配) +- 锚点转换公式精度:**至少 3 个已知 Spirit 的 _lpos 与人工复刻版 prefab 误差 < 0.001** +- 7 个测试文件全部通过(node:test) +- `framework-tests/legacy-layer-migration/` 覆盖率 ≥ 80% +- 脚本可在 CI 跑(无 GUI 依赖) +- gameabc.min.js 逆向结果固化到 fixtures/spirit-semantics.json,作为后续 PoC 阶段的事实源