evomeme 0.1.9 → 0.1.10-beta.13
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/README.md +2 -0
- 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 +144 -0
- package/dist/canvas-public/canvas/camera.js +28 -0
- package/dist/canvas-public/canvas/chrome.js +14 -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 +32 -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 +235 -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 +539 -0
- package/dist/canvas-public/features/editing/canvas-size.js +532 -0
- package/dist/canvas-public/features/editing/color-key.js +471 -0
- package/dist/canvas-public/features/editing/cutout.js +20 -0
- package/dist/canvas-public/features/editing/interactive-image-editing.js +982 -0
- package/dist/canvas-public/features/editing/layer-decomposition.js +45 -0
- package/dist/canvas-public/features/editing/manual-split.js +115 -0
- package/dist/canvas-public/features/editing/perfect-pixel.js +299 -0
- package/dist/canvas-public/features/editing/scroll-preview.js +130 -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 +49 -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 +151 -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 +96 -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 +2520 -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 +91 -0
- package/dist/canvas-public/language/zh-CN.js +1059 -0
- package/dist/canvas-public/map/export.js +10 -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 +402 -0
- package/dist/canvas-public/ui/settings.js +84 -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/image-workers/perfect-pixel/perfect-pixel-core.js +441 -0
- package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
- package/dist/index.js +46710 -12400
- 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 +203 -0
- package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-cover/SKILL.md +131 -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 +97 -0
- package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-mcp/SKILL.md +71 -0
- package/dist/skills/en-US/evomeme-mcp/agents/openai.yaml +7 -0
- package/dist/skills/en-US/evomeme-mcp/references/troubleshooting.md +55 -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 +47 -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 +35 -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 +34 -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 +69 -0
- package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
- package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-image-generator/SKILL.md +86 -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 +34 -0
- package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
- package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +35 -0
- package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +313 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/generation-contracts.md +131 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
- package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +67 -0
- package/dist/skills/en-US/game-audio/SKILL.md +121 -0
- package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
- package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +7 -11
- package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +6 -4
- package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
- package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -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-image-layer-decomposer/SKILL.md +99 -0
- package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
- package/dist/skills/en-US/game-image-splitter/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-perfect-pixel/SKILL.md +123 -0
- package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
- package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -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-tile-generator/SKILL.md +152 -0
- package/dist/skills/en-US/game-tile-generator/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/game-ui-generator/SKILL.md +82 -0
- package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
- package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
- package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
- package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
- package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
- package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
- package/dist/skills/en-US/godot-3d-game/SKILL.md +41 -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 +54 -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 +155 -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 +33 -6
- package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +7 -8
- package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
- package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +5 -0
- package/dist/skills/zh-CN/evomeme-mcp/SKILL.md +71 -0
- package/dist/skills/zh-CN/evomeme-mcp/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/evomeme-mcp/references/troubleshooting.md +55 -0
- 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 +47 -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 +35 -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 +34 -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 +69 -0
- package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
- package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
- package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +86 -0
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +3 -1
- package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +2 -2
- package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +35 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +313 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/generation-contracts.md +131 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
- package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +67 -0
- package/dist/skills/zh-CN/game-audio/SKILL.md +121 -0
- package/dist/skills/zh-CN/game-audio/agents/openai.yaml +4 -0
- package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +123 -0
- package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +79 -0
- package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
- package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
- package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
- package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
- package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
- package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
- package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
- package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -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/game-ui-generator/SKILL.md +82 -0
- package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
- package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
- package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
- package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
- package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
- package/dist/skills/zh-CN/godot-3d-game/SKILL.md +41 -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 +54 -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/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
- package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +6 -6
- 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 +24 -8
- package/dist/canvas-public/cycle-detect.js +0 -166
- package/dist/canvas-public/smart-split.js +0 -185
- package/skills/game-asset-image-generator/SKILL.md +0 -104
- package/skills/game-audio/SKILL.md +0 -82
- package/skills/game-audio/agents/openai.yaml +0 -4
- package/skills/threejs-3d-game/references/engine-asset-pipeline.md +0 -116
- /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/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-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/agents/openai.yaml +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Engine: Performance
|
|
2
|
+
|
|
3
|
+
Load this when there is stutter, frame drops, or spawn spikes.
|
|
4
|
+
|
|
5
|
+
## Priority Items
|
|
6
|
+
|
|
7
|
+
1. **Object pools**: bullets, enemies, floating text, short-lived particle carriers — see `engine-physics.md`
|
|
8
|
+
2. **Atlases**: keep on-screen assets in the same atlas where possible to reduce texture switching
|
|
9
|
+
3. **Fewer collision pairs**: attach only needed collider/overlap pairs; disable offscreen bodies
|
|
10
|
+
4. **No allocations in update**: do not create `{}` / `new Vector2` every frame; reuse temporary vectors
|
|
11
|
+
5. **Use delta for time**: `delta/1000`; AI/pathfinding can run at a lower frequency
|
|
12
|
+
|
|
13
|
+
## Physics
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// Offscreen bodies can be disabled
|
|
17
|
+
enemy.body.enable = cam.worldView.contains(enemy.x, enemy.y);
|
|
18
|
+
|
|
19
|
+
// Circular collision is often cheaper than a large rectangle
|
|
20
|
+
sprite.body.setCircle(16);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
With many dynamic bodies, evaluate `arcade.useTree` / `maxEntries`; consider disabling the tree only after >5000 bodies (based on measurement).
|
|
24
|
+
|
|
25
|
+
## Rendering
|
|
26
|
+
|
|
27
|
+
- Use `tileSprite` or a static image for backgrounds; do not redraw large images every frame
|
|
28
|
+
- Use ADD/MULTIPLY and similar blending cautiously (they can easily split batches)
|
|
29
|
+
- Set particle `maxParticles` / `frequency`
|
|
30
|
+
- Sprites outside the camera are culled by default; fixed UI with `scrollFactor 0` on Canvas must be intentional (production HUD still uses DOM)
|
|
31
|
+
|
|
32
|
+
## Memory and Scene Switching
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
shutdown() {
|
|
36
|
+
this.enemies?.clear(true, true);
|
|
37
|
+
// this.textures.remove('only-this-level') as needed;
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
When changing levels, unload only this level's large images/tilemap; shared atlases can stay.
|
|
42
|
+
|
|
43
|
+
## Reduce Frequency of Expensive Logic
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
if (time - this.lastAiAt > 100) {
|
|
47
|
+
this.lastAiAt = time;
|
|
48
|
+
this.updateEnemyAi(); // Can also be on the System side
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Movement/camera runs every frame; AI, pathfinding, and cleanup scans can run at 5-10Hz.
|
|
53
|
+
|
|
54
|
+
## Quick Check Table
|
|
55
|
+
|
|
56
|
+
| Symptom | Common Cause | Handling |
|
|
57
|
+
| --- | --- | --- |
|
|
58
|
+
| Slower over time | Leak not destroyed | Check pools and shutdown |
|
|
59
|
+
| Periodic stutter | GC | Pool, reduce update allocations |
|
|
60
|
+
| Constant low FPS | Too many objects/draws | Cull, atlas, reduce particles |
|
|
61
|
+
| Spawn spike | Create on the spot | Pre-pool |
|
|
62
|
+
| Collision stutter | Check pair-count explosion | Reduce pairs, simplify shape |
|
|
63
|
+
|
|
64
|
+
During development, you can inspect `this.game.loop.actualFps`; for release, turn off physics debug and dense FPS text (or keep only a DOM debug toggle).
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Engine: Arcade Physics and Object Pools
|
|
2
|
+
|
|
3
|
+
Gameplay values still belong to System / `config.json`; this file only covers Phaser physics APIs and common pitfalls.
|
|
4
|
+
|
|
5
|
+
Load this when modifying collisions, platforms, bullet pools, knockback, or one-way platforms.
|
|
6
|
+
|
|
7
|
+
## World Config (Excerpt)
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
physics: {
|
|
11
|
+
default: 'arcade',
|
|
12
|
+
arcade: {
|
|
13
|
+
gravity: { x: 0, y: 300 }, // Can be multiplied by config gravity_scale
|
|
14
|
+
debug: false, // Turn off for release
|
|
15
|
+
fps: 60,
|
|
16
|
+
overlapBias: 4,
|
|
17
|
+
tileBias: 16,
|
|
18
|
+
useTree: true, // Re-evaluate false only with extremely many dynamic bodies
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Body Types
|
|
24
|
+
|
|
25
|
+
- **Dynamic**: velocity, gravity, collision response (player, enemies, bullets).
|
|
26
|
+
- **Static**: unmoving platforms; call `refreshBody()` / group `refresh()` after changing scale/position.
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
const player = this.physics.add.sprite(100, 100, 'player');
|
|
30
|
+
player.body.setCollideWorldBounds(true);
|
|
31
|
+
player.body.setSize(24, 40, true);
|
|
32
|
+
player.body.setOffset(4, 8);
|
|
33
|
+
player.body.setMaxVelocity(300, 400);
|
|
34
|
+
player.body.setDrag(100, 0);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Circle body: `setCircle(radius, offsetX, offsetY)`. The visual mesh can be larger than the body; **do not** use an entire large image as the collision box.
|
|
38
|
+
|
|
39
|
+
## Collider vs Overlap
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
// Physical separation
|
|
43
|
+
this.physics.add.collider(player, platforms);
|
|
44
|
+
this.physics.add.collider(player, enemies, onHit, processCb, this);
|
|
45
|
+
|
|
46
|
+
// Detect overlap only (pickup, trigger)
|
|
47
|
+
this.physics.add.overlap(player, coins, onCollect, undefined, this);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
A `process` callback can return `false` to skip this collision (invulnerability frames, one-way platforms).
|
|
51
|
+
|
|
52
|
+
### Grounded / Wall Contact
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
if (player.body.blocked.down) { /* grounded */ }
|
|
56
|
+
if (player.body.touching.down) { /* standing on a body */ }
|
|
57
|
+
if (player.body.wasTouching.down && !player.body.touching.down) { /* just left the ground */ }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### World Bounds
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
this.physics.world.setBounds(0, 0, mapWidth, mapHeight);
|
|
64
|
+
this.cameras.main.setBounds(0, 0, mapWidth, mapHeight);
|
|
65
|
+
this.cameras.main.startFollow(player, true, 0.08, 0.08);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Object Pools (Required for High-Frequency Spawning)
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
this.bullets = this.physics.add.group({
|
|
72
|
+
defaultKey: 'bullet',
|
|
73
|
+
maxSize: 100,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
function fire(x: number, y: number, vx: number, vy: number) {
|
|
77
|
+
const b = this.bullets.get(x, y);
|
|
78
|
+
if (!b) return;
|
|
79
|
+
b.setActive(true).setVisible(true);
|
|
80
|
+
b.body.enable = true;
|
|
81
|
+
b.body.reset(x, y);
|
|
82
|
+
b.setVelocity(vx, vy);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function kill(b: Phaser.Physics.Arcade.Sprite) {
|
|
86
|
+
b.setActive(false).setVisible(false);
|
|
87
|
+
b.body.enable = false;
|
|
88
|
+
b.body.stop();
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
It is forbidden to `new` / `destroy` bullets and particle carriers every frame on hot paths.
|
|
93
|
+
|
|
94
|
+
## Common Patterns
|
|
95
|
+
|
|
96
|
+
### Platform Jump
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
if (jumpPressed && player.body.blocked.down) {
|
|
100
|
+
player.setVelocityY(-330); // Height uses config
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Acceleration Movement
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
player.body.setMaxVelocity(maxSpeed);
|
|
108
|
+
player.body.setDrag(drag, 0);
|
|
109
|
+
player.body.setAccelerationX(left ? -accel : right ? accel : 0);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### One-Way Platform
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
function oneWay(
|
|
116
|
+
player: Phaser.Physics.Arcade.Sprite,
|
|
117
|
+
platform: Phaser.Physics.Arcade.Sprite,
|
|
118
|
+
) {
|
|
119
|
+
return (
|
|
120
|
+
player.body.velocity.y > 0 &&
|
|
121
|
+
player.body.bottom <= platform.body.top + 10
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
this.physics.add.collider(player, platforms, undefined, oneWay, this);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Knockback
|
|
128
|
+
|
|
129
|
+
After changing velocity, System records invulnerability; Scene only plays feedback. The `setVelocity` direction is determined by relative position.
|
|
130
|
+
|
|
131
|
+
## Layering with System
|
|
132
|
+
|
|
133
|
+
- In collision callbacks: hand the event to System **first** (damage, pickup), then modify the view (white flash, disable sprite).
|
|
134
|
+
- Do not scatter duplicate win/loss rules inside callbacks.
|
|
135
|
+
- `debug: true` is development-only; turn it off before release and screenshots.
|
|
136
|
+
|
|
137
|
+
## Matter?
|
|
138
|
+
|
|
139
|
+
Only when Arcade AABB is insufficient (complex polygons, joints, ragdolls). Do not enable physics for menus/cards. For detailed requirements, consult the Phaser Matter docs; keep Arcade as the default path.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Engine Runtime (Phaser 3)
|
|
2
|
+
|
|
3
|
+
**System holds rules truth, Scene only handles the view, and production HUD uses DOM**. Directories and config follow `file-structure.md`.
|
|
4
|
+
|
|
5
|
+
Load this file when writing/modifying scene lifecycle, scaling, frame loops, or scene switching.
|
|
6
|
+
|
|
7
|
+
## Mapping to This Project's Layers
|
|
8
|
+
|
|
9
|
+
| Phaser Concept | Location in This Project |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| Boot / preload | Boot Scene: read `config.json`, preload according to manifest |
|
|
12
|
+
| Gameplay Scene | Read System state -> sprites/camera/effects; send input intents back to System |
|
|
13
|
+
| Production HUD / menu | React DOM overlay (not dense Canvas text UI) |
|
|
14
|
+
| Optional parallel Scene | Debug only / extremely lightweight in-world indicators; does not replace production HUD |
|
|
15
|
+
| Adjustable values | `public/config.json`; scattered magic numbers are forbidden |
|
|
16
|
+
|
|
17
|
+
## Scene Structure (Recommended)
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
scenes/
|
|
21
|
+
├── BootScene.ts # Config and asset preloading, progress
|
|
22
|
+
├── MenuScene.ts # Shell layer (can be very thin; complex menus can still use DOM)
|
|
23
|
+
├── GameScene.ts # Main-loop view
|
|
24
|
+
└── (optional)DebugScene # Parallel debugging; do not stuff production HUD into it
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Switching:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
this.scene.start('GameScene', { level: 1 }); // Stop current, start new
|
|
31
|
+
this.scene.launch('DebugScene'); // Parallel
|
|
32
|
+
this.scene.pause('GameScene');
|
|
33
|
+
this.scene.stop('DebugScene');
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Use **init data / registry / System facade** for state between scenes; it is forbidden to attach mutable globals to `window`.
|
|
37
|
+
|
|
38
|
+
## Scene Lifecycle
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
class GameScene extends Phaser.Scene {
|
|
42
|
+
init(data: unknown) {} // Receive data from the previous scene
|
|
43
|
+
preload() {} // Load only; production projects should prefer centralized Boot loading
|
|
44
|
+
create() {} // Objects, physics, input binding; connect to System
|
|
45
|
+
update(time: number, delta: number) {} // delta unit is ms
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Rules:
|
|
50
|
+
|
|
51
|
+
- Assets belong in `preload` / Boot; do not start `load` only in `create` and then immediately reference the asset.
|
|
52
|
+
- `update` **maps** System results and samples input; core rules belong in System, avoiding a "giant Scene god class."
|
|
53
|
+
- Animation/sprite state is derived from System; do not use random sprite flags as truth.
|
|
54
|
+
|
|
55
|
+
## Frame-Rate-Independent Movement
|
|
56
|
+
|
|
57
|
+
Phaser `update` `delta` is **milliseconds**:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
// Correct
|
|
61
|
+
this.viewX += speedPxPerSec * (delta / 1000);
|
|
62
|
+
|
|
63
|
+
// Wrong: tied to frame rate
|
|
64
|
+
this.viewX += speedPxPerSec;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Physics bodies should prefer Arcade `setVelocity` / acceleration; manual displacement must multiply by `delta/1000`.
|
|
68
|
+
|
|
69
|
+
## Viewport Scaling (Scale Manager Is the Only Correct Path)
|
|
70
|
+
|
|
71
|
+
**You must use Phaser Scale Manager**; using CSS/`transform`/hand-written `resize` to scale the canvas is forbidden (it breaks coordinates, input, and physics).
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const config: Phaser.Types.Core.GameConfig = {
|
|
75
|
+
type: Phaser.AUTO,
|
|
76
|
+
width: 720,
|
|
77
|
+
height: 1280,
|
|
78
|
+
scale: {
|
|
79
|
+
mode: Phaser.Scale.FIT,
|
|
80
|
+
autoCenter: Phaser.Scale.CENTER_BOTH,
|
|
81
|
+
parent: 'game-container',
|
|
82
|
+
width: 720,
|
|
83
|
+
height: 1280,
|
|
84
|
+
},
|
|
85
|
+
// physics / scene ...
|
|
86
|
+
};
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Mode | When to Use |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| `FIT` | Default: preserve aspect ratio; may have margins |
|
|
92
|
+
| `ENVELOP` | Fill and crop (cropped edges must be acceptable) |
|
|
93
|
+
| `RESIZE` | Layout changes with viewport (you must relayout world/UI yourself) |
|
|
94
|
+
| `NONE` | Fixed desktop size |
|
|
95
|
+
|
|
96
|
+
Response:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
this.scale.on('resize', (gameSize: Phaser.Structs.Size) => {
|
|
100
|
+
// Adjust camera / world bounds as needed; production HUD is responsive through DOM itself
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Anti-Pattern (Forbidden)
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
// Forbidden
|
|
108
|
+
canvas.style.width = '75%';
|
|
109
|
+
canvas.style.transform = 'scale(0.75)';
|
|
110
|
+
window.addEventListener('resize', () => { /* Hand-edit container pixels to "simulate" scaling */ });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Physics System Selection (Decide Early)
|
|
114
|
+
|
|
115
|
+
Default to **Arcade**; Matter is only for rigid-body/joint scenarios; menus/cards can avoid enabling physics. See `engine-physics.md` for selection, collisions, and object pools.
|
|
116
|
+
|
|
117
|
+
## Engine Anti-Patterns
|
|
118
|
+
|
|
119
|
+
| Anti-Pattern | Problem | Practice |
|
|
120
|
+
| --- | --- | --- |
|
|
121
|
+
| Hand-written CSS scaling for Canvas | Input/physics mismatch | Scale Manager |
|
|
122
|
+
| All rules written in `update` | Hard to test, hard to reuse | System + Scene mapping |
|
|
123
|
+
| `window` global state | Breaks scene switching | registry / System |
|
|
124
|
+
| Load in `create` and use immediately | Asset not ready | Boot / preload |
|
|
125
|
+
| Count frames as time | Speed changes when frames drop | `delta/1000` |
|
|
126
|
+
| Matter for simple collisions | Too heavy | Arcade |
|
|
127
|
+
| Stuff production HUD into Scene dense text | Hard to adapt to portrait/safe areas | DOM overlay |
|
|
128
|
+
| Magic numbers | Hard to tune balance | `config.json` |
|
|
129
|
+
| Bullets/enemies constantly create/destroy | GC stutter | Object pools (see physics / performance) |
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Engine: Spritesheets and Atlases
|
|
2
|
+
|
|
3
|
+
**Read this file before loading any spritesheet.** Frame dimensions that are off by a few pixels will silently misalign, and everything after that breaks.
|
|
4
|
+
|
|
5
|
+
Production HUD defaults to DOM (`game-ui`); nine-slice Canvas panels are used only when truly needed for in-world / pixel-art panels.
|
|
6
|
+
|
|
7
|
+
## Mandatory: Measure Before Writing the Loader
|
|
8
|
+
|
|
9
|
+
1. Open the image and note the total width and height
|
|
10
|
+
2. Count rows and columns clearly
|
|
11
|
+
3. Measure the true width and height of one cell (pixel ruler)
|
|
12
|
+
4. Check whether there is a gap between cells -> `spacing`
|
|
13
|
+
5. Check whether there is padding around the outer edge of the whole image -> `margin`
|
|
14
|
+
6. Verify divisibility with the formula
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
imageWidth = frameWidth × cols + spacing × (cols - 1) + margin × 2
|
|
18
|
+
imageHeight = frameHeight × rows + spacing × (rows - 1) + margin × 2
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Try Square Character Frames First
|
|
22
|
+
|
|
23
|
+
After calculating `frameWidth`, **try `frameHeight = frameWidth` first**, then check whether the height divides evenly. Do not blindly divide by "same row/column count" from the start.
|
|
24
|
+
|
|
25
|
+
### Different Animations May Have Different Frame Sizes
|
|
26
|
+
|
|
27
|
+
A single character's idle / run / attack animations often each have **their own sheet and their own frame size** (running poses are wider, slashes are wider). **Measure each sheet independently**; copying idle fw/fh to attack is forbidden.
|
|
28
|
+
|
|
29
|
+
## Loader Example
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
this.load.spritesheet('player-idle', urlFromManifest, {
|
|
33
|
+
frameWidth: 64,
|
|
34
|
+
frameHeight: 64,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
this.load.spritesheet('ui-wood', url, {
|
|
38
|
+
frameWidth: 144,
|
|
39
|
+
frameHeight: 144,
|
|
40
|
+
spacing: 8,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
this.load.spritesheet('icons', url, {
|
|
44
|
+
frameWidth: 32,
|
|
45
|
+
frameHeight: 32,
|
|
46
|
+
margin: 4,
|
|
47
|
+
spacing: 2,
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Asset URLs go through the manifest / `config.json`; do not hardcode scattered paths in business code.
|
|
52
|
+
|
|
53
|
+
## Red Flags
|
|
54
|
+
|
|
55
|
+
- Width or height cannot be divided evenly by the frame count / produces a fractional result
|
|
56
|
+
- A visible gap exists but `spacing` is not set (the first frame is correct, all later frames drift)
|
|
57
|
+
- Character animation forces non-square frames without verification
|
|
58
|
+
- Assumes row and column counts are the same
|
|
59
|
+
|
|
60
|
+
## Debug: Lay Out Frames First
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
for (let i = 0; i < frameCount; i++) {
|
|
64
|
+
const col = i % 3;
|
|
65
|
+
const row = Math.floor(i / 3);
|
|
66
|
+
this.add.image(100 + col * 120, 100 + row * 120, key, i);
|
|
67
|
+
this.add.text(100 + col * 120, 150 + row * 120, String(i)).setOrigin(0.5);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If a single frame is already wrong -> fix the loader before entering gameplay. For multi-animation characters, use a temporary AnimTest Scene / `?debug=anims` and switch with left/right keys to verify.
|
|
72
|
+
|
|
73
|
+
## Texture Atlas
|
|
74
|
+
|
|
75
|
+
Merge multiple sprites into an atlas to reduce draw calls and requests:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
this.load.atlas('sprites', atlasPngUrl, atlasJsonUrl);
|
|
79
|
+
this.add.sprite(x, y, 'sprites', 'player-idle-1');
|
|
80
|
+
this.anims.create({
|
|
81
|
+
key: 'walk',
|
|
82
|
+
frames: this.anims.generateFrameNames('sprites', {
|
|
83
|
+
prefix: 'player-walk-',
|
|
84
|
+
start: 1,
|
|
85
|
+
end: 8,
|
|
86
|
+
zeroPad: 2,
|
|
87
|
+
}),
|
|
88
|
+
frameRate: 10,
|
|
89
|
+
repeat: -1,
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Nine-Slice / Three-Segment Strips (Only When Canvas UI Needs Them)
|
|
94
|
+
|
|
95
|
+
- 3x3: corners do not stretch, edges stretch on one axis, center stretches on both axes; transparent edges need a base color and overlap to prevent seams.
|
|
96
|
+
- Ribbons/banners are often **left cap + middle segment + right cap**; do not stretch the whole image.
|
|
97
|
+
- Configure parameters per asset; do not hardcode one set.
|
|
98
|
+
|
|
99
|
+
In-world decoration may use this; **main menus/settings/complex HUDs still prefer DOM**.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Engine: Tilemap (Tiled -> Phaser)
|
|
2
|
+
|
|
3
|
+
Load this when side-scrolling/top-down maps, collision layers, or object-layer enemy spawning are used.
|
|
4
|
+
|
|
5
|
+
## Suggested Tiled Layers (Top to Bottom)
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
Foreground # Decoration that covers the player
|
|
9
|
+
Objects # Spawn points, enemies, pickups, triggers (Object Layer)
|
|
10
|
+
Ground # Main collision Tile Layer
|
|
11
|
+
Background # Non-collision decoration / parallax
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Export **JSON** (recommended). For Tilesets, pay attention to `margin` / `spacing`; extruded tilesets can prevent color bleeding.
|
|
15
|
+
|
|
16
|
+
## Loading and Creation
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
// preload / Boot
|
|
20
|
+
this.load.tilemapTiledJSON('level1', mapUrl);
|
|
21
|
+
this.load.image('tiles', tilesetUrl);
|
|
22
|
+
|
|
23
|
+
// create
|
|
24
|
+
const map = this.make.tilemap({ key: 'level1' });
|
|
25
|
+
const tileset = map.addTilesetImage('terrain', 'tiles'); // Name matches Tiled
|
|
26
|
+
const ground = map.createLayer('Ground', tileset, 0, 0);
|
|
27
|
+
const fg = map.createLayer('Foreground', tileset, 0, 0);
|
|
28
|
+
|
|
29
|
+
ground?.setCollisionByProperty({ collides: true });
|
|
30
|
+
// Or setCollisionByExclusion([-1]) / by index
|
|
31
|
+
|
|
32
|
+
this.physics.add.collider(player, ground!);
|
|
33
|
+
this.cameras.main.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
|
|
34
|
+
this.physics.world.setBounds(0, 0, map.widthInPixels, map.heightInPixels);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Multiple tilesets: call `addTilesetImage` for each one, and pass an array to `createLayer`.
|
|
38
|
+
|
|
39
|
+
## GID Essentials
|
|
40
|
+
|
|
41
|
+
- `0` = empty
|
|
42
|
+
- Multiple tilesets rely on `firstgid`; local id = `gid - firstgid`
|
|
43
|
+
- Flips exist as high-bit flags; clear `0xF0000000` first when parsing manually
|
|
44
|
+
|
|
45
|
+
Generally prefer Phaser API and hand-parse GID less.
|
|
46
|
+
|
|
47
|
+
## Spawning Entities from Object Layers
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
const objs = map.getObjectLayer('Objects');
|
|
51
|
+
objs?.objects.forEach((obj) => {
|
|
52
|
+
if (obj.type === 'spawn' || obj.name === 'player') {
|
|
53
|
+
// Hand logical position to System; Scene only creates the view
|
|
54
|
+
}
|
|
55
|
+
if (obj.type === 'coin') {
|
|
56
|
+
// overlap group / pool
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Map Tiled custom properties to config / content data and avoid hardcoding level values in Scene.
|
|
62
|
+
|
|
63
|
+
## Parallax
|
|
64
|
+
|
|
65
|
+
Set `parallaxx` / `parallaxy` on layers in Tiled, or use `setScrollFactor` on the Phaser side. Distant-view factor < 1.
|
|
66
|
+
|
|
67
|
+
## Common Pitfalls
|
|
68
|
+
|
|
69
|
+
| Symptom | Handling |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| Seam color bleeding | tileset extrude; check spacing/margin |
|
|
72
|
+
| Collision mismatch | Confirm layer name, tileset name, and `setCollision*` after scaling |
|
|
73
|
+
| Object coordinates offset | Pay attention to Tiled origin and Phaser origin; tile object vs point |
|
|
74
|
+
| CSV map | Must declare tileWidth/Height in `make.tilemap`; prefer JSON |
|
|
75
|
+
|
|
76
|
+
## With This Specification
|
|
77
|
+
|
|
78
|
+
- Map JSON / tile URLs go into manifest or config; do not hardcode paths in multiple places.
|
|
79
|
+
- Collision results -> System events; Scene does not hold level-progress truth.
|
|
80
|
+
- For large maps, ensure camera bounds and world bounds match.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# H5 Game File Structure Specification
|
|
2
|
+
|
|
3
|
+
This document defines the standard file structure for mobile H5 games. The project is a Vite + React + Phaser application: the game view is managed by Phaser, and DOM UI is managed by React. **This is the only normative source for all 2D code structure and configuration files in this plugin**; `game-director`, `game-designer`, `game-art`, and `game-asset-image-generator` must follow this file when dealing with config or directory structure for 2D projects. For 3D projects, see `../threejs-3d-game/references/file-structure.md`.
|
|
4
|
+
|
|
5
|
+
## `/public/config.json` Rules
|
|
6
|
+
|
|
7
|
+
`/public/config.json` is an external configuration file for game runtime and is output unchanged as `/dist/config.json` after build.
|
|
8
|
+
|
|
9
|
+
### Storage Rules
|
|
10
|
+
|
|
11
|
+
1. All user-adjustable colors, gameplay parameters, balance values, and resource URLs must be written to `/public/config.json`; hardcoding them in business code is forbidden.
|
|
12
|
+
2. Game code must read config through `fetch("./config.json")` (relative path); using the absolute path `/config.json` is forbidden; directly `import config.json` from the `src` directory is forbidden.
|
|
13
|
+
3. The same user-adjustable value must not be hardcoded repeatedly in React, Phaser, or CSS.
|
|
14
|
+
|
|
15
|
+
### Structure Requirement: Must Be Strictly Flat
|
|
16
|
+
|
|
17
|
+
config **must be a flat top-level object**, with every parameter as a direct top-level key; grouping by `assets`, `images`, `gameplay`, `colors`, `params`, and similar keys is **forbidden**:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
// Correct -- flat
|
|
21
|
+
{ "image_background": { ... }, "gravity_scale": { ... } }
|
|
22
|
+
|
|
23
|
+
// Wrong -- nested grouping is forbidden
|
|
24
|
+
{ "assets": { "background": { ... } }, "gameplay": { "gravity": { ... } } }
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Each key is one of two types:
|
|
28
|
+
|
|
29
|
+
- **Visible parameter** (key does not start with `_`): exposed for user editing and must use the standard schema below.
|
|
30
|
+
- **Invisible parameter** (key starts with `_`): internal field (such as `_game_name`, `_config_version`), raw value is enough, and the schema is not used.
|
|
31
|
+
|
|
32
|
+
### Visible Parameter Schema
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
"key_name": {
|
|
36
|
+
"value": <actual value>,
|
|
37
|
+
"type": "int" | "float" | "color" | "bool" | "string" | "audio" | "image" | "video",
|
|
38
|
+
"label": "<user-language label, <=10 characters>",
|
|
39
|
+
"min": <number>,
|
|
40
|
+
"max": <number>
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
|
|
46
|
+
- `type` can only be `int`, `float`, `color`, `bool`, `string`, `audio`, `image`, or `video`.
|
|
47
|
+
- `label` uses the user's language and must be no longer than 10 characters.
|
|
48
|
+
- `min`/`max` appear only for `int`/`float`, and both must be provided together.
|
|
49
|
+
- `type: "color"` uses a hexadecimal color string.
|
|
50
|
+
- `type: "image"` must additionally declare `"image_type": "Asset"` and `"size": "widthxheight"` (such as `"1440x2560"`), to judge display size when the true image dimensions cannot be read.
|
|
51
|
+
- The `value` of `audio`/`image`/`video` must be a real accessible external `http(s)` URL; local relative paths are forbidden. Images are generated asynchronously upstream; a brief 404 for the URL does not mean the asset is invalid, and the asset must not be rewritten, replaced, or deleted because of that.
|
|
52
|
+
|
|
53
|
+
### Example
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"_game_name": "Example Game",
|
|
58
|
+
"_config_version": 1,
|
|
59
|
+
"move_speed": { "value": 220, "type": "int", "label": "Move Speed", "min": 50, "max": 400 },
|
|
60
|
+
"gravity_scale": { "value": 1.2, "type": "float", "label": "Gravity", "min": 0.2, "max": 3 },
|
|
61
|
+
"theme_background_color": { "value": "#10131f", "type": "color", "label": "Bg Color" },
|
|
62
|
+
"enable_shake": { "value": true, "type": "bool", "label": "Shake" },
|
|
63
|
+
"start_button_text": { "value": "Start Game", "type": "string", "label": "Start Text" },
|
|
64
|
+
"bgm_main": { "value": "https://example.com/bgm.mp3", "type": "audio", "label": "BGM" },
|
|
65
|
+
"image_background": {
|
|
66
|
+
"value": "https://example.com/background.png",
|
|
67
|
+
"type": "image",
|
|
68
|
+
"image_type": "Asset",
|
|
69
|
+
"size": "1440x2560",
|
|
70
|
+
"label": "Bg Image"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## `/user_upload` Directory Rules
|
|
76
|
+
|
|
77
|
+
`/user_upload` is a virtual directory for user-uploaded assets; files under it are not real asset files and only store asset links or metadata.
|
|
78
|
+
|
|
79
|
+
1. When user-uploaded assets need to be used, first read the corresponding file under `/user_upload` and extract the real URL.
|
|
80
|
+
2. Do not treat `/user_upload/...` as a local asset path; the final code must reference the extracted real URL.
|
|
81
|
+
|
|
82
|
+
## Deployment and Path Rules
|
|
83
|
+
|
|
84
|
+
1. The final deployment artifact is fixed as `/dist`, deployed as a static site, and runtime resources must be directly accessible through the browser.
|
|
85
|
+
2. `/dist` must be able to run independently from the source directory: all runtime code, resources, chunks, CSS, audio, images, and config can only reference files inside `/dist` or external `http(s)` links, must use relative paths or build-output internal paths, and runtime references pointing to the source directory are strictly forbidden.
|
|
86
|
+
3. `vite.config.js` must set `base: './'`, making build output use relative paths (`./assets/...`) and ensuring it can run when deployed under any subpath.
|
|
87
|
+
4. All runtime string paths (`fetch`, `Audio`, dynamic `import`, CSS `url()`) must use `./` relative paths; absolute paths beginning with `/` are forbidden.
|
|
88
|
+
|
|
89
|
+
## Required Files at the Project Root
|
|
90
|
+
|
|
91
|
+
- `/project.md`: the only source of game requirements (design document); all subsequent development is based on this file.
|
|
92
|
+
- `/public/config.json`: runtime configuration and asset binding contract.
|
|
93
|
+
- `/src`: Vite + React + Phaser source code.
|
|
94
|
+
- `/dist`: build output, deliverable.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: phaser-2d-graphics-builder
|
|
3
|
+
description: Upgrade Phaser 2D games from basic/prototype visuals to high-quality graphics. Covers art direction review, 2D scene paradigms, sprite/world kits, MCP image generation, camera/parallax/composition polish, event effects, performance budgets, and visual-score gating. Use when portrait or browser Phaser games need measurable visual quality improvement beyond placeholder color blocks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Phaser 2D Graphics Builder
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Own the production graphics pass for Phaser games. Convert basic screenshots into authored, layered, performance-aware visual experiences—without treating particles and glow as a substitute for real art.
|
|
11
|
+
|
|
12
|
+
## Use When
|
|
13
|
+
|
|
14
|
+
Screenshots still look basic, heroes/enemies are SVG placeholders or flat shapes, worlds are sparse or single flat backgrounds, UI/world art feels generic, or the user asks for premium, high-fidelity, showcase, exquisite/high-end visuals, or less-basic 2D graphics.
|
|
15
|
+
|
|
16
|
+
## Required References
|
|
17
|
+
|
|
18
|
+
These references are required phase-entry gates, not optional reading:
|
|
19
|
+
|
|
20
|
+
- Load `../game-art/references/scene-profiles.md` and select a `scene_profile_id` before world kit, compose polish, or any claim that World/environment is authored. Read only the **World + 2D · Compose + Entities + Reject** sections for that profile; this skill executes the production pass against it.
|
|
21
|
+
- Load `../game-art/references/advanced-art-styles.md` when the user asked for exquisite/high-end/premium visuals and a premium style has not yet been locked; otherwise keep the existing `art-styles.md` choice.
|
|
22
|
+
- Load `references/visual-scorecard.md` before scoring, judging completion, or making any premium/showcase claim. **View** `assets/scorecard-anchors/scene-1.jpeg`, `scene-2.jpeg`, and `scene-3.jpg` when scoring World, Hero, Sprite fidelity, Compose, or VFX—or before any premium/showcase claim.
|
|
23
|
+
- Load `references/implementation-blueprint.md` before changing graphics architecture, sprite factories, VFX, compose systems, diagnostics, or broad visual systems.
|
|
24
|
+
- Load `references/sprite-recipes.md` before building or upgrading hero/player, obstacle, enemy, pickup, world-kit, or prop sprites.
|
|
25
|
+
- Load `references/compose-recipes.md` before changing camera, parallax, tint/overlay, depth sorting, vignette, or screen-space compose.
|
|
26
|
+
- Load `references/technical-art.md` before premium/showcase graphics work, atlas/texture strategy, particle/VFX systems, or visual changes that could affect mobile performance.
|
|
27
|
+
- Load `references/vfx-recipes.md` before adding particles, trails, flashes, hitstop-linked FX, or event-driven juice.
|
|
28
|
+
- Load `references/checklists/premium-game-quality-gate.md` and `references/checklists/visual-scorecard.md` before declaring a game premium, showcase, complete, release-ready, or less basic.
|
|
29
|
+
- Load the relevant checklist before focused work: `references/checklists/sprite-quality.md`, `references/checklists/compose-quality.md`, `references/checklists/performance-safe-visual-detail.md`, or `references/checklists/technical-art-quality.md`.
|
|
30
|
+
- Load `references/graphics-prompt-templates.md` only when the user asks for reusable prompts, a graphics-pass prompt, or a task template.
|
|
31
|
+
|
|
32
|
+
For broad "still looks basic", premium, showcase, high-fidelity, or less-basic graphics work, load the scene-profiles paradigm (2D Compose rail) plus all five core references (`visual-scorecard`, `implementation-blueprint`, `sprite-recipes`, `compose-recipes`, `technical-art`) as the first action in the phase. Track them in a reference ledger with yes/no, path, and failure reason. Do not mark the graphics phase complete while any required reference is skipped.
|
|
33
|
+
|
|
34
|
+
External asset sourcing gate:
|
|
35
|
+
|
|
36
|
+
- For premium/showcase/high-fidelity/less-basic graphics with a hero/player, character, creature, boss, vehicle, weapon, signature prop, complex pickup, background, or parallax layer, load `../game-asset-image-generator/SKILL.md` before deciding SVG/CSS placeholders or procedural shapes are enough.
|
|
37
|
+
- Prefer MCP `evomeme_generate_game_image` (and `evomeme_cutout_game_image` when needed) via `game-asset-image-generator`; bind URLs in `public/config.json` per `../phaser-2d-game/references/file-structure.md`.
|
|
38
|
+
- Create an asset sourcing ledger for each high-value surface: mcp-image / hybrid / user-provided / procedural, plus outputs or skip reason.
|
|
39
|
+
- `not-needed` is valid only after the relevant path was considered and the ledger explains why generation would not improve a non-hero support surface, or why an attempted MCP call shows a real blocker.
|
|
40
|
+
- For premium hero surfaces and main backgrounds, procedural/SVG-only is not an allowed final answer unless there is real blocker evidence. At least one high-value surface must show an MCP `asset_url` (or user-provided path) written into `public/config.json`.
|
|
41
|
+
|
|
42
|
+
## Workflow
|
|
43
|
+
|
|
44
|
+
1. Capture or inspect active mobile (and desktop if in scope) screenshots of gameplay—not only the title screen.
|
|
45
|
+
2. Confirm or select a `scene_profile_id` from `../game-art/references/scene-profiles.md` (World / 2D · Compose / Entities). If missing, write it before upgrading surfaces.
|
|
46
|
+
3. Score visuals across art direction, hero/player, obstacles, rewards, world, sprite fidelity, compose, VFX, UI, and performance evidence—**after** comparing the active-play screenshot to `assets/scorecard-anchors/` (`scene-1` / `scene-2` / `scene-3`).
|
|
47
|
+
4. Add missing graphics architecture: sprite factories / world prop kit, depth/layer contract, tint/compose helpers, VFX system, technical-art budget, diagnostics.
|
|
48
|
+
5. Fill the external asset sourcing ledger per surface; generate/bind missing hero, hazard, reward, background, and parallax assets through `game-asset-image-generator`.
|
|
49
|
+
6. Upgrade every weak visible surface, not only one hero sprite. World layers must match the chosen scene-profiles paradigm (Play / Near / Mid / Far / Motion).
|
|
50
|
+
7. Add camera/parallax/tint/compose polish after authored sprites and backgrounds exist, following `references/compose-recipes.md`.
|
|
51
|
+
8. Add event-driven VFX tied to gameplay state per `references/vfx-recipes.md`—after forms and compose are readable. Management/sim genres may use status bubbles, progress rings, and day-night cues as primary readability FX when particle bursts would hurt clarity.
|
|
52
|
+
9. Re-score screenshots against the same anchors. Continue until every premium category is at least 2/3 or report exact blockers.
|
|
53
|
+
10. Run the fresh-eyes review per `references/visual-scorecard.md` before finalizing premium/showcase claims.
|
|
54
|
+
11. Verify Phaser/display budgets against `references/technical-art.md`, mobile screenshots, console/page errors, and playability. Engine constraints: `../phaser-2d-game/references/engine-performance.md` and `../phaser-2d-game/references/engine-spritesheets.md`.
|
|
55
|
+
|
|
56
|
+
## Core Rule
|
|
57
|
+
|
|
58
|
+
Do not make placeholders look premium by adding glow, bloom-like overlays, or ambient particles. First author silhouettes and layered world art, then compose (depth/parallax/tint), then event-driven effects.
|
|
59
|
+
|
|
60
|
+
## Boundaries
|
|
61
|
+
|
|
62
|
+
- Domains owned here: world/sprite visual production pass, compose, in-world VFX readability, graphics budgets, scorecard.
|
|
63
|
+
- Not owned here: core gameplay rules (`game-designer`), DOM HUD/menu design (`game-ui`), audio binding (`game-audio`), Phaser architecture basics (`phaser-2d-game`), art-direction selection alone (`game-art`—this skill consumes its outputs and runs the upgrade pass).
|
|
64
|
+
- Formal HUD remains DOM overlay; do not move dense UI into Canvas to “look fancy”.
|
|
65
|
+
|
|
66
|
+
## Final Response
|
|
67
|
+
|
|
68
|
+
Report the reference ledger, external asset sourcing ledger, technical art brief, score before/after (cite which anchor each weak/strong category resembled), production surfaces upgraded, files changed, screenshots/artifacts, display/texture budget notes, VFX readability tradeoffs, and remaining blockers. For premium/showcase claims, include the filled visual scorecard exactly as defined in `references/visual-scorecard.md`, including average and automatic failures remaining.
|