evomeme 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas-public/app.js +509 -5999
- package/dist/canvas-public/assets/presets/catalog.json +47 -0
- package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
- package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
- package/dist/canvas-public/canvas/actions.js +143 -0
- package/dist/canvas-public/canvas/camera.js +28 -0
- package/dist/canvas-public/canvas/chrome.js +13 -0
- package/dist/canvas-public/canvas/data.js +123 -0
- package/dist/canvas-public/canvas/dependencies.js +19 -0
- package/dist/canvas-public/canvas/interactions.js +544 -0
- package/dist/canvas-public/canvas/panel-resize.js +5 -0
- package/dist/canvas-public/canvas/renderer.js +297 -0
- package/dist/canvas-public/canvas/selection.js +62 -0
- package/dist/canvas-public/canvas/serialization.js +118 -0
- package/dist/canvas-public/canvas/sync.js +202 -0
- package/dist/canvas-public/core/api.js +27 -0
- package/dist/canvas-public/core/feature-registry.js +29 -0
- package/dist/canvas-public/core/feature-state.js +228 -0
- package/dist/canvas-public/core/layout.js +133 -0
- package/dist/canvas-public/core/operations.js +38 -0
- package/dist/canvas-public/core/project.js +203 -0
- package/dist/canvas-public/core/state.js +27 -0
- package/dist/canvas-public/dialogs/context-menu.js +118 -0
- package/dist/canvas-public/elements/base.js +100 -0
- package/dist/canvas-public/elements/connections.js +105 -0
- package/dist/canvas-public/elements/drag.js +53 -0
- package/dist/canvas-public/elements/image.js +259 -0
- package/dist/canvas-public/elements/loading-recovery.js +5 -0
- package/dist/canvas-public/elements/loading.js +21 -0
- package/dist/canvas-public/elements/map.js +64 -0
- package/dist/canvas-public/elements/registry.js +58 -0
- package/dist/canvas-public/elements/replacement.js +78 -0
- package/dist/canvas-public/elements/resize.js +210 -0
- package/dist/canvas-public/elements/task-pipeline.js +234 -0
- package/dist/canvas-public/elements/types.js +21 -0
- package/dist/canvas-public/elements/ui.js +14 -0
- package/dist/canvas-public/elements/video.js +64 -0
- package/dist/canvas-public/features/assets/local-assets.js +72 -0
- package/dist/canvas-public/features/assets/official-assets.js +538 -0
- package/dist/canvas-public/features/editing/canvas-size.js +532 -0
- package/dist/canvas-public/features/editing/color-key.js +469 -0
- package/dist/canvas-public/features/editing/cutout.js +20 -0
- package/dist/canvas-public/features/editing/interactive-image-editing.js +981 -0
- package/dist/canvas-public/features/editing/layer-decomposition.js +44 -0
- package/dist/canvas-public/features/editing/manual-split.js +114 -0
- package/dist/canvas-public/features/editing/perfect-pixel.js +336 -0
- package/dist/canvas-public/features/editing/scroll-preview.js +129 -0
- package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
- package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
- package/dist/canvas-public/features/editing/smart-split.js +48 -0
- package/dist/canvas-public/features/editing/source-preview.js +43 -0
- package/dist/canvas-public/features/editing/video-cycle.js +49 -0
- package/dist/canvas-public/features/editing/video-frames.js +35 -0
- package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
- package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
- package/dist/canvas-public/features/frame-editor/playback.js +83 -0
- package/dist/canvas-public/features/frame-editor/preview.js +149 -0
- package/dist/canvas-public/features/generation/animation.js +272 -0
- package/dist/canvas-public/features/generation/asset-batch.js +102 -0
- package/dist/canvas-public/features/generation/direction.js +163 -0
- package/dist/canvas-public/features/generation/fields.js +73 -0
- package/dist/canvas-public/features/generation/game-ui.js +64 -0
- package/dist/canvas-public/features/generation/image.js +83 -0
- package/dist/canvas-public/features/generation/scroll-image.js +157 -0
- package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
- package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
- package/dist/canvas-public/features/generation/video.js +105 -0
- package/dist/canvas-public/features/map/creation.js +73 -0
- package/dist/canvas-public/features/map/tile-map-editor.js +2518 -0
- package/dist/canvas-public/features/registry.js +59 -0
- package/dist/canvas-public/index.html +84 -259
- package/dist/canvas-public/inspector/controls.js +49 -0
- package/dist/canvas-public/inspector/frame-preview.js +11 -0
- package/dist/canvas-public/inspector/inspector.js +190 -0
- package/dist/canvas-public/inspector/media-inspector.js +517 -0
- package/dist/canvas-public/inspector/media-preview.js +56 -0
- package/dist/canvas-public/inspector/number-stepper.js +96 -0
- package/dist/canvas-public/inspector/resize.js +88 -0
- package/dist/canvas-public/inspector/scroll-preview.js +11 -0
- package/dist/canvas-public/inspector/ui-inspector.js +14 -0
- package/dist/canvas-public/language/en-US.js +1059 -0
- package/dist/canvas-public/language/index.js +79 -0
- package/dist/canvas-public/language/zh-CN.js +1059 -0
- package/dist/canvas-public/map/export.js +9 -0
- package/dist/canvas-public/map/inspector.js +8 -0
- package/dist/canvas-public/map/model.js +409 -0
- package/dist/canvas-public/map/tile-map-editor.js +2 -0
- package/dist/canvas-public/media/metadata.js +183 -0
- package/dist/canvas-public/media/support.js +183 -0
- package/dist/canvas-public/styles/base.css +49 -0
- package/dist/canvas-public/styles/canvas.css +127 -0
- package/dist/canvas-public/styles/controls.css +203 -0
- package/dist/canvas-public/styles/dialogs.css +521 -0
- package/dist/canvas-public/styles/feature-form.css +409 -0
- package/dist/canvas-public/styles/inspector.css +441 -0
- package/dist/canvas-public/styles/layout.css +344 -0
- package/dist/canvas-public/styles/map.css +11 -0
- package/dist/canvas-public/styles/nodes.css +636 -0
- package/dist/canvas-public/styles.css +9 -2247
- package/dist/canvas-public/ui/controls.js +222 -0
- package/dist/canvas-public/ui/elements.js +9 -0
- package/dist/canvas-public/ui/feature-controller.js +296 -0
- package/dist/canvas-public/ui/feature-form.js +401 -0
- package/dist/canvas-public/ui/settings.js +83 -0
- package/dist/canvas-public/ui/toolbar.js +55 -0
- package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
- package/dist/canvas-public/vendor/pixi.min.js +2340 -0
- package/dist/canvas-public/workers/color-key-worker.js +289 -0
- package/dist/canvas-public/workers/perfect-pixel-worker.js +510 -0
- package/dist/index.js +42236 -13382
- package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
- package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +176 -0
- package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cover/SKILL.md +132 -0
- package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
- package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
- package/dist/skills/en-US/evomeme-login/SKILL.md +92 -0
- package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
- package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
- package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
- package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
- package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
- package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
- package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
- package/dist/skills/en-US/game-art/SKILL.md +121 -0
- package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
- package/dist/skills/en-US/game-asset-align/SKILL.md +45 -0
- package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
- package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
- package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +45 -0
- package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
- package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
- package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +32 -0
- package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
- package/dist/skills/en-US/game-asset-align/references/tool-contract.md +39 -0
- package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/en-US/game-asset-image-generator/SKILL.md +104 -0
- package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-image-generator/references/background.md +32 -0
- package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
- package/dist/skills/en-US/game-audio/SKILL.md +82 -0
- package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
- package/dist/skills/en-US/game-demo/SKILL.md +103 -0
- package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-maker/SKILL.md +111 -0
- package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
- package/dist/skills/en-US/game-test/SKILL.md +58 -0
- package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-ui/SKILL.md +177 -0
- package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
- package/dist/skills/en-US/godot-3d-game/SKILL.md +39 -0
- package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
- package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
- package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +52 -0
- package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
- package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
- package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
- package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
- package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
- package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
- package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
- package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
- package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
- package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
- package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
- package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
- package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
- package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +153 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
- package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
- package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
- package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
- package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
- package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +4 -4
- package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +1 -1
- package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
- package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
- package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
- package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
- package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
- package/dist/skills/zh-CN/game-asset-align/SKILL.md +45 -0
- package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
- package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
- package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +45 -0
- package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
- package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
- package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +32 -0
- package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
- package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +39 -0
- package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/SKILL.md +1 -1
- package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +127 -0
- package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +77 -0
- package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
- package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
- package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
- package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
- package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
- package/dist/skills/zh-CN/godot-3d-game/SKILL.md +39 -0
- package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
- package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
- package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +52 -0
- package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
- package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
- package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
- package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
- package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
- package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
- package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
- package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
- package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-asset-pipeline.md +52 -15
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
- package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
- package/dist/stage-blender/bake_materials.py +102 -0
- package/dist/stage-blender/export_scene.py +275 -0
- package/dist/stage-blender/preview_camera.py +90 -0
- package/dist/stage-blender/repair_mesh.py +112 -0
- package/dist/stage-public/app.js +759 -0
- package/dist/stage-public/baked/bakePilot.js +44 -0
- package/dist/stage-public/baked/bakedScene.js +129 -0
- package/dist/stage-public/baked/sceneAppearance.js +225 -0
- package/dist/stage-public/baked/sceneCamera.js +45 -0
- package/dist/stage-public/comparison-contract.js +28 -0
- package/dist/stage-public/delivery.html +4 -0
- package/dist/stage-public/delivery.js +17 -0
- package/dist/stage-public/godot/appearance.gd +170 -0
- package/dist/stage-public/godot/preview.gd +79 -0
- package/dist/stage-public/index.html +141 -0
- package/dist/stage-public/review-app.js +289 -0
- package/dist/stage-public/review-runtime.js +63 -0
- package/dist/stage-public/review.css +24 -0
- package/dist/stage-public/review.html +47 -0
- package/dist/stage-public/scene-runtime.js +212 -0
- package/dist/stage-public/sceneContractRuntime.js +235 -0
- package/dist/stage-public/styles.css +328 -0
- package/dist/stage-public/three-appearance.js +104 -0
- package/dist/stage-public/vendor/three170/LICENSE +21 -0
- package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
- package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
- package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
- package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
- package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
- package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
- package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
- package/dist/tile-transition-mask.svg +40 -0
- package/package.json +21 -7
- package/dist/canvas-public/cycle-detect.js +0 -166
- package/dist/canvas-public/smart-split.js +0 -185
- /package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +0 -0
- /package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +0 -0
- /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
- /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
- /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-audio/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-audio/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +0 -0
- /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { t } from '../language/index.js'
|
|
2
|
+
import { getMountedTileMapView } from './tile-map-editor.js'
|
|
3
|
+
|
|
4
|
+
export async function exportTileMapPng(id) {
|
|
5
|
+
const view = getMountedTileMapView(id)
|
|
6
|
+
if (!view) throw new Error(t("map.export.text001"))
|
|
7
|
+
await view.exportPng()
|
|
8
|
+
if (view.selectedStatus) view.selectedStatus.textContent = t("map.export.text002")
|
|
9
|
+
}
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { t } from '../language/index.js'
|
|
2
|
+
export const TILE_MAP_NODE_WIDTH = 820
|
|
3
|
+
export const TILE_MAP_FOOTER_HEIGHT = 22
|
|
4
|
+
export const TILE_MAP_NODE_HEIGHT = 637
|
|
5
|
+
export const TILE_MAP_NODE_MIN_WIDTH = 620
|
|
6
|
+
export const TILE_MAP_NODE_MIN_HEIGHT = 487
|
|
7
|
+
|
|
8
|
+
export const MAP_VERSION = 1
|
|
9
|
+
export const DEFAULT_COLUMNS = 16
|
|
10
|
+
export const DEFAULT_ROWS = 12
|
|
11
|
+
export const DEFAULT_CELL_SIZE = 128
|
|
12
|
+
export const MAX_GRID_SIDE = 256
|
|
13
|
+
export const MAX_EXPORT_SIDE = 16384
|
|
14
|
+
export const GRID_BLOCK_SIZE = 4
|
|
15
|
+
export const MIN_MINOR_GRID_CELL_SCREEN_SIZE = 8
|
|
16
|
+
export const MINOR_GRID_SCREEN_WIDTH = 1.25
|
|
17
|
+
export const MAJOR_GRID_SCREEN_WIDTH = 2.5
|
|
18
|
+
export const ATLAS_COLUMNS = 8
|
|
19
|
+
export const ATLAS_MIN_ROWS = 8
|
|
20
|
+
// Keep every atlas tile at 128px internally so the 8-column preview remains sharp when zoomed.
|
|
21
|
+
export const ATLAS_CELL_SIZE = 128
|
|
22
|
+
export const MIN_ATLAS_ZOOM = 0.5
|
|
23
|
+
export const MAX_ATLAS_ZOOM = 4
|
|
24
|
+
export const TILE_DRAG_TYPE = 'application/x-canvas-image'
|
|
25
|
+
export const AUTO_TERRAIN_ATLAS_SIDE = 4
|
|
26
|
+
// SVG atlas order for the four quarter-cells: top-left, top-right, bottom-left, bottom-right.
|
|
27
|
+
export const AUTO_TERRAIN_TILE_INDEX_BY_MASK = [12, 13, 0, 3, 8, 1, 14, 5, 15, 4, 11, 2, 9, 10, 7, 6]
|
|
28
|
+
export function reorderLayersByVisualDrop(layers, draggedLayerId, targetLayerId, placeAfter = false) {
|
|
29
|
+
const original = Array.isArray(layers) ? layers : []
|
|
30
|
+
if (!draggedLayerId || !targetLayerId || draggedLayerId === targetLayerId) return original
|
|
31
|
+
|
|
32
|
+
// Layers are painted bottom-to-top, while the inspector lists them top-to-bottom.
|
|
33
|
+
const visualOrder = [...original].reverse()
|
|
34
|
+
const draggedIndex = visualOrder.findIndex((layer) => layer.id === draggedLayerId)
|
|
35
|
+
const targetExists = visualOrder.some((layer) => layer.id === targetLayerId)
|
|
36
|
+
if (draggedIndex < 0 || !targetExists) return original
|
|
37
|
+
|
|
38
|
+
const [draggedLayer] = visualOrder.splice(draggedIndex, 1)
|
|
39
|
+
const targetIndex = visualOrder.findIndex((layer) => layer.id === targetLayerId)
|
|
40
|
+
visualOrder.splice(targetIndex + (placeAfter ? 1 : 0), 0, draggedLayer)
|
|
41
|
+
return visualOrder.reverse()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function clampInteger(value, minimum, maximum, fallback) {
|
|
45
|
+
const parsed = Math.round(Number(value))
|
|
46
|
+
if (!Number.isFinite(parsed)) return fallback
|
|
47
|
+
return Math.min(maximum, Math.max(minimum, parsed))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function safeName(value, fallback) {
|
|
51
|
+
const text = String(value || '').trim()
|
|
52
|
+
return text || fallback
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function normalizeSource(value) {
|
|
56
|
+
if (!value || typeof value !== 'object') return null
|
|
57
|
+
const assetId = String(value.assetId || '').trim()
|
|
58
|
+
const id = String(value.id || '').trim()
|
|
59
|
+
if (!assetId || !id) return null
|
|
60
|
+
const naturalWidth = clampInteger(value.naturalWidth, 1, 32768, 1)
|
|
61
|
+
const naturalHeight = clampInteger(value.naturalHeight, 1, 32768, 1)
|
|
62
|
+
const columns = clampInteger(value.columns, 1, 256, 1)
|
|
63
|
+
const rows = clampInteger(value.rows, 1, 256, 1)
|
|
64
|
+
const marginX = clampInteger(value.marginX, 0, naturalWidth - 1, 0)
|
|
65
|
+
const marginY = clampInteger(value.marginY, 0, naturalHeight - 1, 0)
|
|
66
|
+
const spacingX = clampInteger(value.spacingX, 0, naturalWidth - 1, 0)
|
|
67
|
+
const spacingY = clampInteger(value.spacingY, 0, naturalHeight - 1, 0)
|
|
68
|
+
const availableWidth = naturalWidth - marginX * 2 - spacingX * (columns - 1)
|
|
69
|
+
const availableHeight = naturalHeight - marginY * 2 - spacingY * (rows - 1)
|
|
70
|
+
const tileWidth = clampInteger(value.tileWidth, 1, naturalWidth, Math.max(1, Math.floor(availableWidth / columns)))
|
|
71
|
+
const tileHeight = clampInteger(value.tileHeight, 1, naturalHeight, Math.max(1, Math.floor(availableHeight / rows)))
|
|
72
|
+
return {
|
|
73
|
+
id,
|
|
74
|
+
assetId,
|
|
75
|
+
name: safeName(value.name, t("map.model.text001")),
|
|
76
|
+
naturalWidth,
|
|
77
|
+
naturalHeight,
|
|
78
|
+
columns,
|
|
79
|
+
rows,
|
|
80
|
+
marginX,
|
|
81
|
+
marginY,
|
|
82
|
+
spacingX,
|
|
83
|
+
spacingY,
|
|
84
|
+
tileWidth,
|
|
85
|
+
tileHeight,
|
|
86
|
+
paletteHidden: value.paletteHidden === true,
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function normalizeBrush(value, sources) {
|
|
91
|
+
if (!value || typeof value !== 'object') return null
|
|
92
|
+
if (Array.isArray(value.tiles) && value.tiles.length) {
|
|
93
|
+
const sourceMap = new Map(sources.map((source) => [source.id, source]))
|
|
94
|
+
const columns = clampInteger(value.columns, 1, ATLAS_COLUMNS, 1)
|
|
95
|
+
const rows = clampInteger(value.rows, 1, MAX_GRID_SIDE, 1)
|
|
96
|
+
const tiles = value.tiles.slice(0, columns * rows).map((tile) => {
|
|
97
|
+
if (!tile || typeof tile !== 'object') return null
|
|
98
|
+
const source = sourceMap.get(String(tile.sourceId || ''))
|
|
99
|
+
if (!source) return null
|
|
100
|
+
return {
|
|
101
|
+
sourceId: source.id,
|
|
102
|
+
tileIndex: clampInteger(tile.tileIndex, 0, source.columns * source.rows - 1, 0),
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
while (tiles.length < columns * rows) tiles.push(null)
|
|
106
|
+
const firstTile = tiles.find(Boolean)
|
|
107
|
+
if (firstTile) {
|
|
108
|
+
return {
|
|
109
|
+
sourceId: firstTile.sourceId,
|
|
110
|
+
tileIndex: firstTile.tileIndex,
|
|
111
|
+
columns,
|
|
112
|
+
rows,
|
|
113
|
+
atlasIndex: Number.isFinite(Number(value.atlasIndex))
|
|
114
|
+
? clampInteger(value.atlasIndex, 0, Number.MAX_SAFE_INTEGER, 0)
|
|
115
|
+
: null,
|
|
116
|
+
tiles,
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const source = sources.find((candidate) => candidate.id === value.sourceId)
|
|
121
|
+
if (!source) return null
|
|
122
|
+
const tileIndex = clampInteger(value.tileIndex, 0, source.columns * source.rows - 1, 0)
|
|
123
|
+
const startColumn = tileIndex % source.columns
|
|
124
|
+
const startRow = Math.floor(tileIndex / source.columns)
|
|
125
|
+
const columns = clampInteger(value.columns, 1, source.columns - startColumn, 1)
|
|
126
|
+
const rows = clampInteger(value.rows, 1, source.rows - startRow, 1)
|
|
127
|
+
return { sourceId: source.id, tileIndex, columns, rows }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function normalizeCells(value, columns, rows, sources) {
|
|
131
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return {}
|
|
132
|
+
const sourceMap = new Map(sources.map((source) => [source.id, source]))
|
|
133
|
+
const cells = {}
|
|
134
|
+
for (const [key, cell] of Object.entries(value)) {
|
|
135
|
+
const match = /^(\d+),(\d+)$/.exec(key)
|
|
136
|
+
if (!match || !cell || typeof cell !== 'object') continue
|
|
137
|
+
const x = Number(match[1])
|
|
138
|
+
const y = Number(match[2])
|
|
139
|
+
if (x < 0 || y < 0 || x >= columns || y >= rows) continue
|
|
140
|
+
const source = sourceMap.get(String(cell.sourceId || ''))
|
|
141
|
+
if (!source) continue
|
|
142
|
+
const tileIndex = clampInteger(cell.tileIndex, 0, source.columns * source.rows - 1, 0)
|
|
143
|
+
cells[`${x},${y}`] = { sourceId: source.id, tileIndex }
|
|
144
|
+
}
|
|
145
|
+
return cells
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function autoTerrainTileIndex(mask) {
|
|
149
|
+
return AUTO_TERRAIN_TILE_INDEX_BY_MASK[clampInteger(mask, 0, 15, 0)]
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function autoTerrainMaskAt(occupiedCells, x, y) {
|
|
153
|
+
const matches = (cellX, cellY) => occupiedCells?.has?.(`${cellX},${cellY}`) || occupiedCells?.[`${cellX},${cellY}`] === true
|
|
154
|
+
if (matches(x, y)) return 15
|
|
155
|
+
const north = matches(x, y - 1)
|
|
156
|
+
const east = matches(x + 1, y)
|
|
157
|
+
const south = matches(x, y + 1)
|
|
158
|
+
const west = matches(x - 1, y)
|
|
159
|
+
return (north || west || matches(x - 1, y - 1) ? 8 : 0) |
|
|
160
|
+
(north || east || matches(x + 1, y - 1) ? 4 : 0) |
|
|
161
|
+
(south || west || matches(x - 1, y + 1) ? 2 : 0) |
|
|
162
|
+
(south || east || matches(x + 1, y + 1) ? 1 : 0)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function createLayerId() {
|
|
166
|
+
return `layer_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function normalizeLayers(value, legacyCells, columns, rows, sources) {
|
|
170
|
+
const rawLayers = Array.isArray(value) ? value : []
|
|
171
|
+
const seenIds = new Set()
|
|
172
|
+
const layers = rawLayers.map((rawLayer, index) => {
|
|
173
|
+
if (!rawLayer || typeof rawLayer !== 'object') return null
|
|
174
|
+
let id = String(rawLayer.id || `layer-${index + 1}`).trim()
|
|
175
|
+
if (!id || seenIds.has(id)) id = createLayerId()
|
|
176
|
+
seenIds.add(id)
|
|
177
|
+
return {
|
|
178
|
+
id,
|
|
179
|
+
name: safeName(rawLayer.name, `${t("map.model.text002")}${index + 1}`),
|
|
180
|
+
cells: normalizeCells(rawLayer.cells, columns, rows, sources),
|
|
181
|
+
}
|
|
182
|
+
}).filter(Boolean)
|
|
183
|
+
if (layers.length) return layers
|
|
184
|
+
return [{
|
|
185
|
+
id: 'layer-1',
|
|
186
|
+
name: t("map.model.text003"),
|
|
187
|
+
cells: normalizeCells(legacyCells, columns, rows, sources),
|
|
188
|
+
}]
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function paintedCellCount(map) {
|
|
192
|
+
return map.layers.reduce((count, layer) => count + Object.keys(layer.cells).length, 0)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function createPaletteFromSources(sources, brushImages = [], cellSize = DEFAULT_CELL_SIZE) {
|
|
196
|
+
const cells = {}
|
|
197
|
+
const sourceMap = new Map(sources.map((source) => [source.id, source]))
|
|
198
|
+
const placedSourceIds = new Set()
|
|
199
|
+
let cursorX = 0
|
|
200
|
+
let cursorY = 0
|
|
201
|
+
let shelfHeight = 0
|
|
202
|
+
|
|
203
|
+
const placeRectangle = (columns, rows, tiles) => {
|
|
204
|
+
if (cursorX > 0 && cursorX + columns > ATLAS_COLUMNS) {
|
|
205
|
+
cursorX = 0
|
|
206
|
+
cursorY += shelfHeight
|
|
207
|
+
shelfHeight = 0
|
|
208
|
+
}
|
|
209
|
+
for (let row = 0; row < rows; row += 1) {
|
|
210
|
+
for (let column = 0; column < columns; column += 1) {
|
|
211
|
+
const tile = tiles[row * columns + column]
|
|
212
|
+
if (!tile) continue
|
|
213
|
+
cells[`${cursorX + column},${cursorY + row}`] = tile
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
cursorX += columns
|
|
217
|
+
shelfHeight = Math.max(shelfHeight, rows)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
for (const brushImage of brushImages) {
|
|
221
|
+
const tiles = brushImage.tileSourceIds.map((sourceId) => {
|
|
222
|
+
const source = sourceMap.get(sourceId)
|
|
223
|
+
placedSourceIds.add(sourceId)
|
|
224
|
+
if (!source || source.paletteHidden) return null
|
|
225
|
+
return { sourceId, tileIndex: 0 }
|
|
226
|
+
})
|
|
227
|
+
placeRectangle(brushImage.columns, brushImage.rows, tiles)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
for (const source of sources) {
|
|
231
|
+
if (placedSourceIds.has(source.id) || source.paletteHidden) continue
|
|
232
|
+
const tiles = []
|
|
233
|
+
for (let tileIndex = 0; tileIndex < source.columns * source.rows; tileIndex += 1) {
|
|
234
|
+
tiles.push({ sourceId: source.id, tileIndex })
|
|
235
|
+
}
|
|
236
|
+
placeRectangle(Math.min(source.columns, ATLAS_COLUMNS), source.rows, tiles)
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
version: 1,
|
|
240
|
+
layout: 'brush-images',
|
|
241
|
+
columns: ATLAS_COLUMNS,
|
|
242
|
+
rows: Math.max(ATLAS_MIN_ROWS, cursorY + shelfHeight),
|
|
243
|
+
cellSize,
|
|
244
|
+
cells,
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function normalizePalette(value, sources, brushImages, cellSize) {
|
|
249
|
+
if (!value || typeof value !== 'object' || value.layout !== 'brush-images') {
|
|
250
|
+
return createPaletteFromSources(sources, brushImages, cellSize)
|
|
251
|
+
}
|
|
252
|
+
const rows = clampInteger(value.rows, ATLAS_MIN_ROWS, 65535, ATLAS_MIN_ROWS)
|
|
253
|
+
return {
|
|
254
|
+
version: 1,
|
|
255
|
+
layout: 'brush-images',
|
|
256
|
+
columns: ATLAS_COLUMNS,
|
|
257
|
+
rows,
|
|
258
|
+
cellSize,
|
|
259
|
+
cells: normalizeCells(value.cells, ATLAS_COLUMNS, rows, sources),
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function normalizeBrushImage(value) {
|
|
264
|
+
if (!value || typeof value !== 'object') return null
|
|
265
|
+
const assetId = String(value.assetId || '').trim()
|
|
266
|
+
const sourceAssetId = String(value.sourceAssetId || '').trim()
|
|
267
|
+
const tileSourceIds = Array.isArray(value.tileSourceIds)
|
|
268
|
+
? value.tileSourceIds.map(String).filter(Boolean)
|
|
269
|
+
: []
|
|
270
|
+
if (!assetId || !tileSourceIds.length) return null
|
|
271
|
+
return {
|
|
272
|
+
type: 'map_brush_image',
|
|
273
|
+
id: String(value.id || assetId),
|
|
274
|
+
assetId,
|
|
275
|
+
sourceAssetId,
|
|
276
|
+
name: safeName(value.name, t("map.model.text004")),
|
|
277
|
+
columns: clampInteger(value.columns, 1, 8, 1),
|
|
278
|
+
rows: clampInteger(value.rows, 1, 8, 1),
|
|
279
|
+
marginX: clampInteger(value.marginX, 0, 32767, 0),
|
|
280
|
+
marginY: clampInteger(value.marginY, 0, 32767, 0),
|
|
281
|
+
spacingX: clampInteger(value.spacingX, 0, 32767, 0),
|
|
282
|
+
spacingY: clampInteger(value.spacingY, 0, 32767, 0),
|
|
283
|
+
tileSourceIds,
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export function normalizeTileMapData(value) {
|
|
288
|
+
const source = value && typeof value === 'object' ? value : {}
|
|
289
|
+
const columns = clampInteger(source.columns, 1, MAX_GRID_SIDE, DEFAULT_COLUMNS)
|
|
290
|
+
const rows = clampInteger(source.rows, 1, MAX_GRID_SIDE, DEFAULT_ROWS)
|
|
291
|
+
const cellSize = clampInteger(source.cellSize, 8, 512, DEFAULT_CELL_SIZE)
|
|
292
|
+
const sources = Array.isArray(source.sources)
|
|
293
|
+
? source.sources.map(normalizeSource).filter(Boolean)
|
|
294
|
+
: []
|
|
295
|
+
const rawBrushImages = Array.isArray(source.brushImages) && source.brushImages.length
|
|
296
|
+
? source.brushImages
|
|
297
|
+
: source.tilesets
|
|
298
|
+
const brushImages = Array.isArray(rawBrushImages)
|
|
299
|
+
? rawBrushImages.map(normalizeBrushImage).filter(Boolean)
|
|
300
|
+
: []
|
|
301
|
+
const activeBrush = normalizeBrush(source.activeBrush, sources)
|
|
302
|
+
const layers = normalizeLayers(source.layers, source.cells, columns, rows, sources)
|
|
303
|
+
const requestedLayerId = String(source.activeLayerId || '')
|
|
304
|
+
const activeLayerId = layers.some((layer) => layer.id === requestedLayerId)
|
|
305
|
+
? requestedLayerId
|
|
306
|
+
: layers[layers.length - 1].id
|
|
307
|
+
return {
|
|
308
|
+
version: MAP_VERSION,
|
|
309
|
+
columns,
|
|
310
|
+
rows,
|
|
311
|
+
cellSize,
|
|
312
|
+
activeTool: ['brush', 'terrain', 'eraser'].includes(source.activeTool) ? source.activeTool : 'brush',
|
|
313
|
+
activeBrush: activeBrush || (sources[0] ? { sourceId: sources[0].id, tileIndex: 0 } : null),
|
|
314
|
+
activeTerrainBrushId: brushImages.some((brushImage) => (
|
|
315
|
+
brushImage.id === source.activeTerrainBrushId &&
|
|
316
|
+
brushImage.columns === AUTO_TERRAIN_ATLAS_SIDE &&
|
|
317
|
+
brushImage.rows === AUTO_TERRAIN_ATLAS_SIDE
|
|
318
|
+
)) ? source.activeTerrainBrushId : null,
|
|
319
|
+
sources,
|
|
320
|
+
brushImages,
|
|
321
|
+
palette: normalizePalette(source.palette, sources, brushImages, cellSize),
|
|
322
|
+
layers,
|
|
323
|
+
activeLayerId,
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export function createTileMapItem({ id, x, y, name = t("map.model.text005"), folderName = t("map.model.text005"), cellSize = DEFAULT_CELL_SIZE }) {
|
|
328
|
+
return {
|
|
329
|
+
id,
|
|
330
|
+
type: 'tile_map',
|
|
331
|
+
name: safeName(name, t("map.model.text005")),
|
|
332
|
+
folderName: safeName(folderName, t("map.model.text005")),
|
|
333
|
+
x: Number(x) - TILE_MAP_NODE_WIDTH / 2,
|
|
334
|
+
y: Number(y) - 18,
|
|
335
|
+
width: TILE_MAP_NODE_WIDTH,
|
|
336
|
+
height: TILE_MAP_NODE_HEIGHT,
|
|
337
|
+
tileMap: normalizeTileMapData({ cellSize }),
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export function tileMapContentAspectRatio(item) {
|
|
342
|
+
const map = item?.tileMap || item || {}
|
|
343
|
+
const columns = clampInteger(map.columns, 1, MAX_GRID_SIDE, DEFAULT_COLUMNS)
|
|
344
|
+
const rows = clampInteger(map.rows, 1, MAX_GRID_SIDE, DEFAULT_ROWS)
|
|
345
|
+
return columns / rows
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function tileMapNodeHeightForWidth(item, width) {
|
|
349
|
+
const safeWidth = Math.max(1, Number(width) || TILE_MAP_NODE_WIDTH)
|
|
350
|
+
return Math.round(safeWidth / tileMapContentAspectRatio(item) + TILE_MAP_FOOTER_HEIGHT)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
export function isTileMapItem(item) {
|
|
354
|
+
return Boolean(item && item.type === 'tile_map')
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export function normalizeTileMapItem(item, index = 0) {
|
|
358
|
+
const fileParts = String(item?.tileMapFile || '').replace(/\\/g, '/').split('/').filter(Boolean)
|
|
359
|
+
const fileFolderName = fileParts.length > 1 ? fileParts[fileParts.length - 2] : ''
|
|
360
|
+
const tileMap = normalizeTileMapData(item?.tileMap)
|
|
361
|
+
const width = Math.max(TILE_MAP_NODE_MIN_WIDTH, Number(item?.width) || TILE_MAP_NODE_WIDTH)
|
|
362
|
+
return {
|
|
363
|
+
...item,
|
|
364
|
+
type: 'tile_map',
|
|
365
|
+
name: safeName(item?.name, t("map.model.text005")),
|
|
366
|
+
folderName: safeName(item?.folderName || fileFolderName, t("map.model.text005")),
|
|
367
|
+
x: Number.isFinite(Number(item?.x)) ? Number(item.x) : 60 + (index % 3) * 860,
|
|
368
|
+
y: Number.isFinite(Number(item?.y)) ? Number(item.y) : 60 + Math.floor(index / 3) * 660,
|
|
369
|
+
width,
|
|
370
|
+
height: tileMapNodeHeightForWidth(tileMap, width),
|
|
371
|
+
tileMap,
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export function serializeTileMapItem(item) {
|
|
376
|
+
const normalized = normalizeTileMapItem(item)
|
|
377
|
+
return {
|
|
378
|
+
id: normalized.id,
|
|
379
|
+
type: 'tile_map',
|
|
380
|
+
name: normalized.name,
|
|
381
|
+
x: normalized.x,
|
|
382
|
+
y: normalized.y,
|
|
383
|
+
width: normalized.width,
|
|
384
|
+
height: normalized.height,
|
|
385
|
+
...(normalized.tileMapFile ? { tileMapFile: normalized.tileMapFile } : {}),
|
|
386
|
+
...(normalized.tileMapMetaFile ? { tileMapMetaFile: normalized.tileMapMetaFile } : {}),
|
|
387
|
+
folderName: normalized.folderName,
|
|
388
|
+
references: (
|
|
389
|
+
normalized.tileMap.brushImages.length
|
|
390
|
+
? normalized.tileMap.brushImages.map((brushImage) => brushImage.sourceAssetId)
|
|
391
|
+
: normalized.tileMap.sources.map((source) => source.assetId)
|
|
392
|
+
).filter((id, index, ids) => id && ids.indexOf(id) === index).map((id) => ({
|
|
393
|
+
id,
|
|
394
|
+
role: 'map-brush-image',
|
|
395
|
+
})),
|
|
396
|
+
tileMap: normalized.tileMap,
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export function tileMapSummary(item) {
|
|
401
|
+
const map = normalizeTileMapData(item?.tileMap)
|
|
402
|
+
return {
|
|
403
|
+
dimensions: `${map.columns}${t("map.model.text006.part1")}${map.rows}${t("map.model.text006.part2")}`,
|
|
404
|
+
outputSize: `${map.columns * map.cellSize} × ${map.rows * map.cellSize} px`,
|
|
405
|
+
sources: String(map.sources.length),
|
|
406
|
+
paintedCells: String(paintedCellCount(map)),
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { t } from '../language/index.js'
|
|
2
|
+
export function createMediaMetadata({ imageName }) {
|
|
3
|
+
function normalizeGenMeta(gen) {
|
|
4
|
+
if (!gen || typeof gen !== 'object') return null
|
|
5
|
+
const refs = Array.isArray(gen.references)
|
|
6
|
+
? gen.references
|
|
7
|
+
.filter((r) => r && r.id)
|
|
8
|
+
.map((r) => ({
|
|
9
|
+
id: r.id,
|
|
10
|
+
name: r.name || r.id,
|
|
11
|
+
role: r.role || undefined,
|
|
12
|
+
kind: r.kind || undefined,
|
|
13
|
+
}))
|
|
14
|
+
: []
|
|
15
|
+
return {
|
|
16
|
+
kind: gen.kind === 'video' ? 'video' : 'image',
|
|
17
|
+
prompt: String(gen.prompt || ''),
|
|
18
|
+
model: gen.model || '',
|
|
19
|
+
size: gen.size || '',
|
|
20
|
+
ratio: gen.ratio || '',
|
|
21
|
+
duration: gen.duration ?? null,
|
|
22
|
+
resolution: gen.resolution || '',
|
|
23
|
+
generateAudio: gen.generateAudio === true,
|
|
24
|
+
seed: gen.seed === '' || gen.seed == null ? null : gen.seed,
|
|
25
|
+
references: refs,
|
|
26
|
+
createdAt: gen.createdAt || null,
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function buildImageGenMeta({ prompt, model, size, references }) {
|
|
31
|
+
return normalizeGenMeta({
|
|
32
|
+
kind: 'image',
|
|
33
|
+
prompt,
|
|
34
|
+
model,
|
|
35
|
+
size,
|
|
36
|
+
references: (references || []).map((r) => ({
|
|
37
|
+
id: r.id,
|
|
38
|
+
name: r.name || imageName(r.id) || r.id,
|
|
39
|
+
})),
|
|
40
|
+
createdAt: new Date().toISOString(),
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function buildVideoGenMeta({
|
|
45
|
+
prompt,
|
|
46
|
+
model,
|
|
47
|
+
ratio,
|
|
48
|
+
duration,
|
|
49
|
+
resolution,
|
|
50
|
+
generateAudio,
|
|
51
|
+
seed,
|
|
52
|
+
references,
|
|
53
|
+
}) {
|
|
54
|
+
return normalizeGenMeta({
|
|
55
|
+
kind: 'video',
|
|
56
|
+
prompt,
|
|
57
|
+
model: model || 'seedance',
|
|
58
|
+
ratio,
|
|
59
|
+
duration,
|
|
60
|
+
resolution,
|
|
61
|
+
generateAudio,
|
|
62
|
+
seed,
|
|
63
|
+
references: (references || []).map((r) => ({
|
|
64
|
+
id: r.id,
|
|
65
|
+
name: r.name || imageName(r.id) || r.id,
|
|
66
|
+
role: r.role,
|
|
67
|
+
kind: r.kind,
|
|
68
|
+
})),
|
|
69
|
+
createdAt: new Date().toISOString(),
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function formatGenRefList(refs) {
|
|
74
|
+
if (!refs?.length) return t("media.metadata.text001")
|
|
75
|
+
return refs
|
|
76
|
+
.map((r) => {
|
|
77
|
+
const name = r.name || r.id
|
|
78
|
+
if (r.role) {
|
|
79
|
+
const roleLabel =
|
|
80
|
+
{
|
|
81
|
+
reference_image: t("media.metadata.text002"),
|
|
82
|
+
first_frame: t("media.metadata.text003"),
|
|
83
|
+
last_frame: t("media.metadata.text004"),
|
|
84
|
+
reference_video: t("media.metadata.text005"),
|
|
85
|
+
reference_audio: t("media.metadata.text006"),
|
|
86
|
+
}[r.role] || r.role
|
|
87
|
+
return `${name}(${roleLabel})`
|
|
88
|
+
}
|
|
89
|
+
return name
|
|
90
|
+
})
|
|
91
|
+
.join('\n')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function formatGenTime(iso) {
|
|
95
|
+
if (!iso) return ''
|
|
96
|
+
const d = new Date(iso)
|
|
97
|
+
if (Number.isNaN(d.getTime())) return String(iso)
|
|
98
|
+
const pad = (n) => String(n).padStart(2, '0')
|
|
99
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function formatOriginTime(sec) {
|
|
103
|
+
const s = Math.max(0, Number(sec) || 0)
|
|
104
|
+
return `${s.toFixed(3)}s`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function formatPerfectPixelSourceArea(pixelSizeX, pixelSizeY) {
|
|
108
|
+
const x = Number(pixelSizeX)
|
|
109
|
+
const y = Number(pixelSizeY)
|
|
110
|
+
if (!Number.isFinite(x) || !Number.isFinite(y) || x <= 0 || y <= 0) return '—'
|
|
111
|
+
const format = (value) => String(Math.round(value * 100) / 100)
|
|
112
|
+
return `${format(x)}${t("media.metadata.text007.part1")}${format(y)}${t("media.metadata.text007.part2")}`
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function normalizeOrigin(origin) {
|
|
116
|
+
if (!origin || typeof origin !== 'object') return null
|
|
117
|
+
const kind = String(origin.kind || '')
|
|
118
|
+
const parentId = origin.parentId || origin.sourceId || null
|
|
119
|
+
if (!parentId && kind !== 'ai_generate') return null
|
|
120
|
+
|
|
121
|
+
if (kind === 'video_cycle') {
|
|
122
|
+
const start = Number(origin.start)
|
|
123
|
+
const end = Number(origin.end)
|
|
124
|
+
if (!Number.isFinite(start) || !Number.isFinite(end)) return null
|
|
125
|
+
return {
|
|
126
|
+
kind,
|
|
127
|
+
parentId,
|
|
128
|
+
parentName: origin.parentName || null,
|
|
129
|
+
start,
|
|
130
|
+
end,
|
|
131
|
+
score: origin.score != null && Number.isFinite(Number(origin.score)) ? Number(origin.score) : null,
|
|
132
|
+
threshold:
|
|
133
|
+
origin.threshold != null && Number.isFinite(Number(origin.threshold))
|
|
134
|
+
? Number(origin.threshold)
|
|
135
|
+
: null,
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (kind === 'smart_split') {
|
|
139
|
+
return {
|
|
140
|
+
kind,
|
|
141
|
+
parentId,
|
|
142
|
+
parentName: origin.parentName || null,
|
|
143
|
+
resultIndex: Math.max(0, Math.round(Number(origin.resultIndex) || 0)),
|
|
144
|
+
resultCount: Math.max(
|
|
145
|
+
0,
|
|
146
|
+
Math.round(Number(origin.resultCount ?? origin.frameCount) || 0),
|
|
147
|
+
),
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return null
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function buildOrigin(kind, fields = {}) {
|
|
154
|
+
return normalizeOrigin({ kind, ...fields })
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function resolveItemOrigin(item) {
|
|
158
|
+
if (!item) return null
|
|
159
|
+
return normalizeOrigin(item.origin)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function originParentLabel(origin) {
|
|
163
|
+
if (!origin?.parentId) return '—'
|
|
164
|
+
return origin.parentName || imageName(origin.parentId) || origin.parentId
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
buildImageGenMeta,
|
|
169
|
+
buildOrigin,
|
|
170
|
+
buildVideoGenMeta,
|
|
171
|
+
formatGenRefList,
|
|
172
|
+
formatGenTime,
|
|
173
|
+
formatOriginTime,
|
|
174
|
+
formatPerfectPixelSourceArea,
|
|
175
|
+
normalizeGenMeta,
|
|
176
|
+
normalizeOrigin,
|
|
177
|
+
originParentLabel,
|
|
178
|
+
resolveItemOrigin,
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|