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.
Files changed (477) hide show
  1. package/README.md +2 -0
  2. package/dist/canvas-public/app.js +509 -5999
  3. package/dist/canvas-public/assets/presets/catalog.json +47 -0
  4. package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
  5. package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
  6. package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
  7. package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
  8. package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
  9. package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
  10. package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
  11. package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
  12. package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
  13. package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
  14. package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
  15. package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
  16. package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
  17. package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
  18. package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
  19. package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
  20. package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
  21. package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
  22. package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
  23. package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
  24. package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
  25. package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
  26. package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
  27. package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
  28. package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
  29. package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
  30. package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
  31. package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
  32. package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
  33. package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
  34. package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
  35. package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
  36. package/dist/canvas-public/canvas/actions.js +144 -0
  37. package/dist/canvas-public/canvas/camera.js +28 -0
  38. package/dist/canvas-public/canvas/chrome.js +14 -0
  39. package/dist/canvas-public/canvas/data.js +123 -0
  40. package/dist/canvas-public/canvas/dependencies.js +19 -0
  41. package/dist/canvas-public/canvas/interactions.js +544 -0
  42. package/dist/canvas-public/canvas/panel-resize.js +5 -0
  43. package/dist/canvas-public/canvas/renderer.js +297 -0
  44. package/dist/canvas-public/canvas/selection.js +62 -0
  45. package/dist/canvas-public/canvas/serialization.js +118 -0
  46. package/dist/canvas-public/canvas/sync.js +202 -0
  47. package/dist/canvas-public/core/api.js +32 -0
  48. package/dist/canvas-public/core/feature-registry.js +29 -0
  49. package/dist/canvas-public/core/feature-state.js +228 -0
  50. package/dist/canvas-public/core/layout.js +133 -0
  51. package/dist/canvas-public/core/operations.js +38 -0
  52. package/dist/canvas-public/core/project.js +203 -0
  53. package/dist/canvas-public/core/state.js +27 -0
  54. package/dist/canvas-public/dialogs/context-menu.js +118 -0
  55. package/dist/canvas-public/elements/base.js +100 -0
  56. package/dist/canvas-public/elements/connections.js +105 -0
  57. package/dist/canvas-public/elements/drag.js +53 -0
  58. package/dist/canvas-public/elements/image.js +259 -0
  59. package/dist/canvas-public/elements/loading-recovery.js +5 -0
  60. package/dist/canvas-public/elements/loading.js +21 -0
  61. package/dist/canvas-public/elements/map.js +64 -0
  62. package/dist/canvas-public/elements/registry.js +58 -0
  63. package/dist/canvas-public/elements/replacement.js +78 -0
  64. package/dist/canvas-public/elements/resize.js +210 -0
  65. package/dist/canvas-public/elements/task-pipeline.js +235 -0
  66. package/dist/canvas-public/elements/types.js +21 -0
  67. package/dist/canvas-public/elements/ui.js +14 -0
  68. package/dist/canvas-public/elements/video.js +64 -0
  69. package/dist/canvas-public/features/assets/local-assets.js +72 -0
  70. package/dist/canvas-public/features/assets/official-assets.js +539 -0
  71. package/dist/canvas-public/features/editing/canvas-size.js +532 -0
  72. package/dist/canvas-public/features/editing/color-key.js +471 -0
  73. package/dist/canvas-public/features/editing/cutout.js +20 -0
  74. package/dist/canvas-public/features/editing/interactive-image-editing.js +982 -0
  75. package/dist/canvas-public/features/editing/layer-decomposition.js +45 -0
  76. package/dist/canvas-public/features/editing/manual-split.js +115 -0
  77. package/dist/canvas-public/features/editing/perfect-pixel.js +299 -0
  78. package/dist/canvas-public/features/editing/scroll-preview.js +130 -0
  79. package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
  80. package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
  81. package/dist/canvas-public/features/editing/smart-split.js +49 -0
  82. package/dist/canvas-public/features/editing/source-preview.js +43 -0
  83. package/dist/canvas-public/features/editing/video-cycle.js +49 -0
  84. package/dist/canvas-public/features/editing/video-frames.js +35 -0
  85. package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
  86. package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
  87. package/dist/canvas-public/features/frame-editor/playback.js +83 -0
  88. package/dist/canvas-public/features/frame-editor/preview.js +151 -0
  89. package/dist/canvas-public/features/generation/animation.js +272 -0
  90. package/dist/canvas-public/features/generation/asset-batch.js +102 -0
  91. package/dist/canvas-public/features/generation/direction.js +163 -0
  92. package/dist/canvas-public/features/generation/fields.js +73 -0
  93. package/dist/canvas-public/features/generation/game-ui.js +64 -0
  94. package/dist/canvas-public/features/generation/image.js +96 -0
  95. package/dist/canvas-public/features/generation/scroll-image.js +157 -0
  96. package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
  97. package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
  98. package/dist/canvas-public/features/generation/video.js +105 -0
  99. package/dist/canvas-public/features/map/creation.js +73 -0
  100. package/dist/canvas-public/features/map/tile-map-editor.js +2520 -0
  101. package/dist/canvas-public/features/registry.js +59 -0
  102. package/dist/canvas-public/index.html +84 -259
  103. package/dist/canvas-public/inspector/controls.js +49 -0
  104. package/dist/canvas-public/inspector/frame-preview.js +11 -0
  105. package/dist/canvas-public/inspector/inspector.js +190 -0
  106. package/dist/canvas-public/inspector/media-inspector.js +517 -0
  107. package/dist/canvas-public/inspector/media-preview.js +56 -0
  108. package/dist/canvas-public/inspector/number-stepper.js +96 -0
  109. package/dist/canvas-public/inspector/resize.js +88 -0
  110. package/dist/canvas-public/inspector/scroll-preview.js +11 -0
  111. package/dist/canvas-public/inspector/ui-inspector.js +14 -0
  112. package/dist/canvas-public/language/en-US.js +1059 -0
  113. package/dist/canvas-public/language/index.js +91 -0
  114. package/dist/canvas-public/language/zh-CN.js +1059 -0
  115. package/dist/canvas-public/map/export.js +10 -0
  116. package/dist/canvas-public/map/inspector.js +8 -0
  117. package/dist/canvas-public/map/model.js +409 -0
  118. package/dist/canvas-public/map/tile-map-editor.js +2 -0
  119. package/dist/canvas-public/media/metadata.js +183 -0
  120. package/dist/canvas-public/media/support.js +183 -0
  121. package/dist/canvas-public/styles/base.css +49 -0
  122. package/dist/canvas-public/styles/canvas.css +127 -0
  123. package/dist/canvas-public/styles/controls.css +203 -0
  124. package/dist/canvas-public/styles/dialogs.css +521 -0
  125. package/dist/canvas-public/styles/feature-form.css +409 -0
  126. package/dist/canvas-public/styles/inspector.css +441 -0
  127. package/dist/canvas-public/styles/layout.css +344 -0
  128. package/dist/canvas-public/styles/map.css +11 -0
  129. package/dist/canvas-public/styles/nodes.css +636 -0
  130. package/dist/canvas-public/styles.css +9 -2247
  131. package/dist/canvas-public/ui/controls.js +222 -0
  132. package/dist/canvas-public/ui/elements.js +9 -0
  133. package/dist/canvas-public/ui/feature-controller.js +296 -0
  134. package/dist/canvas-public/ui/feature-form.js +402 -0
  135. package/dist/canvas-public/ui/settings.js +84 -0
  136. package/dist/canvas-public/ui/toolbar.js +55 -0
  137. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  138. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  139. package/dist/canvas-public/workers/color-key-worker.js +289 -0
  140. package/dist/image-workers/perfect-pixel/perfect-pixel-core.js +441 -0
  141. package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
  142. package/dist/index.js +46710 -12400
  143. package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
  144. package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
  145. package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +203 -0
  146. package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
  147. package/dist/skills/en-US/evomeme-cover/SKILL.md +131 -0
  148. package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
  149. package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
  150. package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
  151. package/dist/skills/en-US/evomeme-login/SKILL.md +97 -0
  152. package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
  153. package/dist/skills/en-US/evomeme-mcp/SKILL.md +71 -0
  154. package/dist/skills/en-US/evomeme-mcp/agents/openai.yaml +7 -0
  155. package/dist/skills/en-US/evomeme-mcp/references/troubleshooting.md +55 -0
  156. package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
  157. package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
  158. package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
  159. package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
  160. package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
  161. package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
  162. package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
  163. package/dist/skills/en-US/game-art/SKILL.md +121 -0
  164. package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
  165. package/dist/skills/en-US/game-asset-align/SKILL.md +47 -0
  166. package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
  167. package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
  168. package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +35 -0
  169. package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
  170. package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
  171. package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +34 -0
  172. package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
  173. package/dist/skills/en-US/game-asset-align/references/tool-contract.md +69 -0
  174. package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
  175. package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
  176. package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
  177. package/dist/skills/en-US/game-asset-image-generator/SKILL.md +86 -0
  178. package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
  179. package/dist/skills/en-US/game-asset-image-generator/references/background.md +34 -0
  180. package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
  181. package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +35 -0
  182. package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
  183. package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +313 -0
  184. package/dist/skills/en-US/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  185. package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  186. package/dist/skills/en-US/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  187. package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  188. package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +67 -0
  189. package/dist/skills/en-US/game-audio/SKILL.md +121 -0
  190. package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
  191. package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +7 -11
  192. package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +6 -4
  193. package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
  194. package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -0
  195. package/dist/skills/en-US/game-demo/SKILL.md +103 -0
  196. package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
  197. package/dist/skills/en-US/game-image-layer-decomposer/SKILL.md +99 -0
  198. package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
  199. package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
  200. package/dist/skills/en-US/game-image-splitter/agents/openai.yaml +7 -0
  201. package/dist/skills/en-US/game-maker/SKILL.md +111 -0
  202. package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
  203. package/dist/skills/en-US/game-perfect-pixel/SKILL.md +123 -0
  204. package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
  205. package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
  206. package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -0
  207. package/dist/skills/en-US/game-test/SKILL.md +58 -0
  208. package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
  209. package/dist/skills/en-US/game-tile-generator/SKILL.md +152 -0
  210. package/dist/skills/en-US/game-tile-generator/agents/openai.yaml +7 -0
  211. package/dist/skills/en-US/game-ui/SKILL.md +177 -0
  212. package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
  213. package/dist/skills/en-US/game-ui-generator/SKILL.md +82 -0
  214. package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
  215. package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
  216. package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
  217. package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
  218. package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
  219. package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
  220. package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
  221. package/dist/skills/en-US/godot-3d-game/SKILL.md +41 -0
  222. package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
  223. package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
  224. package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +54 -0
  225. package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
  226. package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  227. package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  228. package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
  229. package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
  230. package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
  231. package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
  232. package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
  233. package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
  234. package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
  235. package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
  236. package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
  237. package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
  238. package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
  239. package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
  240. package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
  241. package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
  242. package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
  243. package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  244. package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
  245. package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
  246. package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
  247. package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
  248. package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
  249. package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
  250. package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
  251. package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
  252. package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +33 -6
  253. package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +7 -8
  254. package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
  255. package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +5 -0
  256. package/dist/skills/zh-CN/evomeme-mcp/SKILL.md +71 -0
  257. package/dist/skills/zh-CN/evomeme-mcp/agents/openai.yaml +7 -0
  258. package/dist/skills/zh-CN/evomeme-mcp/references/troubleshooting.md +55 -0
  259. package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
  260. package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
  261. package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
  262. package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
  263. package/dist/skills/zh-CN/game-asset-align/SKILL.md +47 -0
  264. package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
  265. package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
  266. package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +35 -0
  267. package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
  268. package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
  269. package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +34 -0
  270. package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
  271. package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +69 -0
  272. package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
  273. package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
  274. package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
  275. package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +86 -0
  276. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +3 -1
  277. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +2 -2
  278. package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +35 -0
  279. package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
  280. package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +313 -0
  281. package/dist/skills/zh-CN/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  282. package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  283. package/dist/skills/zh-CN/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  284. package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  285. package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +67 -0
  286. package/dist/skills/zh-CN/game-audio/SKILL.md +121 -0
  287. package/dist/skills/zh-CN/game-audio/agents/openai.yaml +4 -0
  288. package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +123 -0
  289. package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +79 -0
  290. package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
  291. package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
  292. package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
  293. package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
  294. package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
  295. package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
  296. package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
  297. package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
  298. package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
  299. package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
  300. package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
  301. package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
  302. package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -0
  303. package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
  304. package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
  305. package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
  306. package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
  307. package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
  308. package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
  309. package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
  310. package/dist/skills/zh-CN/game-ui-generator/SKILL.md +82 -0
  311. package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
  312. package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
  313. package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
  314. package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
  315. package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
  316. package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
  317. package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
  318. package/dist/skills/zh-CN/godot-3d-game/SKILL.md +41 -0
  319. package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
  320. package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
  321. package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +54 -0
  322. package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
  323. package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  324. package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  325. package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
  326. package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
  327. package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
  328. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  329. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  330. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  331. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
  332. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
  333. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
  334. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
  335. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
  336. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
  337. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
  338. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
  339. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
  340. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
  341. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
  342. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
  343. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
  344. package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
  345. package/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  346. package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +6 -6
  347. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  348. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  349. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  350. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
  351. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
  352. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
  353. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
  354. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
  355. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
  356. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
  357. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
  358. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
  359. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
  360. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
  361. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
  362. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
  363. package/dist/stage-blender/bake_materials.py +102 -0
  364. package/dist/stage-blender/export_scene.py +275 -0
  365. package/dist/stage-blender/preview_camera.py +90 -0
  366. package/dist/stage-blender/repair_mesh.py +112 -0
  367. package/dist/stage-public/app.js +759 -0
  368. package/dist/stage-public/baked/bakePilot.js +44 -0
  369. package/dist/stage-public/baked/bakedScene.js +129 -0
  370. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  371. package/dist/stage-public/baked/sceneCamera.js +45 -0
  372. package/dist/stage-public/comparison-contract.js +28 -0
  373. package/dist/stage-public/delivery.html +4 -0
  374. package/dist/stage-public/delivery.js +17 -0
  375. package/dist/stage-public/godot/appearance.gd +170 -0
  376. package/dist/stage-public/godot/preview.gd +79 -0
  377. package/dist/stage-public/index.html +141 -0
  378. package/dist/stage-public/review-app.js +289 -0
  379. package/dist/stage-public/review-runtime.js +63 -0
  380. package/dist/stage-public/review.css +24 -0
  381. package/dist/stage-public/review.html +47 -0
  382. package/dist/stage-public/scene-runtime.js +212 -0
  383. package/dist/stage-public/sceneContractRuntime.js +235 -0
  384. package/dist/stage-public/styles.css +328 -0
  385. package/dist/stage-public/three-appearance.js +104 -0
  386. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  387. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  388. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  389. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  390. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  391. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  392. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  393. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  394. package/dist/tile-transition-mask.svg +40 -0
  395. package/package.json +24 -8
  396. package/dist/canvas-public/cycle-detect.js +0 -166
  397. package/dist/canvas-public/smart-split.js +0 -185
  398. package/skills/game-asset-image-generator/SKILL.md +0 -104
  399. package/skills/game-audio/SKILL.md +0 -82
  400. package/skills/game-audio/agents/openai.yaml +0 -4
  401. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +0 -116
  402. /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
  403. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
  404. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
  405. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
  406. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
  407. /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
  408. /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
  409. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  410. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  411. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  412. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
  413. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  414. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
  415. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
  416. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  417. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
  418. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
  419. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
  420. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
  421. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
  422. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
  423. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
  424. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
  425. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  426. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  427. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  428. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
  429. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
  430. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
  431. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  432. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
  433. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  434. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
  435. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
  436. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
  437. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
  438. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
  439. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
  440. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
  441. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
  442. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
  443. /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
  444. /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
  445. /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
  446. /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
  447. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
  448. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
  449. /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
  450. /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
  451. /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
  452. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
  453. /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
  454. /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
  455. /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
  456. /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
  457. /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
  458. /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
  459. /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
  460. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
  461. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
  462. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
  463. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
  464. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
  465. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
  466. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
  467. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
  468. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
  469. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
  470. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
  471. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
  472. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
  473. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
  474. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
  475. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
  476. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
  477. /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
@@ -0,0 +1,441 @@
1
+ export function workerError(messageKey, messageVariables = null) {
2
+ const error = new Error(messageKey)
3
+ error.messageKey = messageKey
4
+ error.messageVariables = messageVariables
5
+ return error
6
+ }
7
+
8
+ export function normalizeSettings(value) {
9
+ const settings = value && typeof value === 'object' ? value : {}
10
+ const sampleMethod = ['majority', 'median', 'center'].includes(settings.sampleMethod)
11
+ ? settings.sampleMethod
12
+ : 'median'
13
+ const alphaMode = settings.alphaMode === 'preserve' ? 'preserve' : 'hard'
14
+ return {
15
+ autoGrid: settings.autoGrid !== false,
16
+ pixelSize: clampInteger(settings.pixelSize, 2, 256, 8),
17
+ sampleMethod,
18
+ exportScale: clampInteger(settings.exportScale, 1, 16, 4),
19
+ alphaMode,
20
+ alphaThreshold: clampInteger(settings.alphaThreshold, 0, 255, 128),
21
+ }
22
+ }
23
+
24
+ function clampInteger(value, min, max, fallback) {
25
+ const number = Math.round(Number(value))
26
+ return Number.isFinite(number) ? Math.max(min, Math.min(max, number)) : fallback
27
+ }
28
+
29
+ export function restorePixelGrid(image, settings) {
30
+ const width = image.width
31
+ const height = image.height
32
+ if (!width || !height) throw workerError('workers.perfectPixel.invalidSourceSize')
33
+
34
+ const projections = buildAlphaAwareGradientProjections(image.data, width, height)
35
+ let pixelSizeX = settings.pixelSize
36
+ let pixelSizeY = settings.pixelSize
37
+ let gridWidth = Math.ceil(width / settings.pixelSize)
38
+ let gridHeight = Math.ceil(height / settings.pixelSize)
39
+ let confidence = 1
40
+
41
+ if (settings.autoGrid) {
42
+ const detectedX = detectPixelPeriod(projections.x)
43
+ const detectedY = detectPixelPeriod(projections.y)
44
+ if (!detectedX && !detectedY) {
45
+ throw workerError('workers.perfectPixel.gridDetectionFailed')
46
+ }
47
+ let squarePixelSize
48
+ if (detectedX && detectedY) {
49
+ const ratio = Math.max(detectedX.period, detectedY.period) / Math.min(detectedX.period, detectedY.period)
50
+ if (ratio <= 1.5) {
51
+ const totalConfidence = Math.max(1e-6, detectedX.confidence + detectedY.confidence)
52
+ squarePixelSize = (
53
+ detectedX.period * detectedX.confidence +
54
+ detectedY.period * detectedY.confidence
55
+ ) / totalConfidence
56
+ } else {
57
+ // Pixel-art cells are square. If one axis is dominated by illustration
58
+ // content instead of the grid, trust the stronger axis for both directions.
59
+ squarePixelSize = detectedX.confidence >= detectedY.confidence
60
+ ? detectedX.period
61
+ : detectedY.period
62
+ }
63
+ confidence = Math.min(detectedX.confidence, detectedY.confidence)
64
+ } else {
65
+ const detected = detectedX || detectedY
66
+ squarePixelSize = detected.period
67
+ // A single reliable axis is enough for square pixels, but report that the
68
+ // estimate had less supporting evidence than a two-axis match.
69
+ confidence = detected.confidence * 0.78
70
+ }
71
+ pixelSizeX = squarePixelSize
72
+ pixelSizeY = squarePixelSize
73
+ gridWidth = Math.max(1, Math.round(width / pixelSizeX))
74
+ gridHeight = Math.max(1, Math.round(height / pixelSizeY))
75
+ pixelSizeX = width / gridWidth
76
+ pixelSizeY = height / gridHeight
77
+ }
78
+
79
+ const xCoordinates = settings.autoGrid
80
+ ? refineGridCoordinates(width, gridWidth, projections.x)
81
+ : fixedGridCoordinates(width, settings.pixelSize)
82
+ const yCoordinates = settings.autoGrid
83
+ ? refineGridCoordinates(height, gridHeight, projections.y)
84
+ : fixedGridCoordinates(height, settings.pixelSize)
85
+ const outputWidth = xCoordinates.length - 1
86
+ const outputHeight = yCoordinates.length - 1
87
+ if (outputWidth < 1 || outputHeight < 1) {
88
+ throw workerError('workers.perfectPixel.emptyGrid')
89
+ }
90
+ if (outputWidth * outputHeight > 4_194_304) {
91
+ throw workerError('workers.perfectPixel.gridTooLarge')
92
+ }
93
+
94
+ const pixels = sampleGrid(
95
+ image.data,
96
+ width,
97
+ height,
98
+ xCoordinates,
99
+ yCoordinates,
100
+ settings,
101
+ )
102
+ return {
103
+ pixels,
104
+ width: outputWidth,
105
+ height: outputHeight,
106
+ pixelSizeX,
107
+ pixelSizeY,
108
+ confidence,
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Transparent pixels may contain arbitrary hidden RGB values. Work in premultiplied
114
+ * RGB and add the alpha edge itself to the signal, so those hidden colors can never
115
+ * create a fake grid while dark opaque sprites remain detectable.
116
+ */
117
+ function buildAlphaAwareGradientProjections(source, width, height) {
118
+ const x = new Float64Array(width)
119
+ const y = new Float64Array(height)
120
+ for (let row = 0; row < height; row += 1) {
121
+ for (let column = 0; column < width; column += 1) {
122
+ const offset = (row * width + column) * 4
123
+ const alpha = source[offset + 3] / 255
124
+ const red = source[offset] * alpha
125
+ const green = source[offset + 1] * alpha
126
+ const blue = source[offset + 2] * alpha
127
+
128
+ if (column > 0) {
129
+ const previous = offset - 4
130
+ const previousAlpha = source[previous + 3] / 255
131
+ const delta =
132
+ Math.abs(red - source[previous] * previousAlpha) +
133
+ Math.abs(green - source[previous + 1] * previousAlpha) +
134
+ Math.abs(blue - source[previous + 2] * previousAlpha) +
135
+ Math.abs(alpha - previousAlpha) * 255
136
+ x[column] += delta
137
+ }
138
+ if (row > 0) {
139
+ const previous = offset - width * 4
140
+ const previousAlpha = source[previous + 3] / 255
141
+ const delta =
142
+ Math.abs(red - source[previous] * previousAlpha) +
143
+ Math.abs(green - source[previous + 1] * previousAlpha) +
144
+ Math.abs(blue - source[previous + 2] * previousAlpha) +
145
+ Math.abs(alpha - previousAlpha) * 255
146
+ y[row] += delta
147
+ }
148
+ }
149
+ }
150
+ return { x, y }
151
+ }
152
+
153
+ /**
154
+ * Grid edges share one residue modulo the source pixel-block size. Scoring that
155
+ * concentration together with short-lag autocorrelation recovers the same periodic
156
+ * grid targeted by Perfect Pixel's FFT/gradient stages without shipping OpenCV.
157
+ */
158
+ function detectPixelPeriod(projection) {
159
+ const length = projection.length
160
+ if (length < 4) return null
161
+ const maximum = Math.min(64, Math.max(2, Math.floor(length / 3)))
162
+ let total = 0
163
+ for (let i = 1; i < length; i += 1) total += projection[i]
164
+ if (total <= 1e-6) return null
165
+
166
+ let best = null
167
+ for (let period = 2; period <= maximum; period += 1) {
168
+ const bins = new Float64Array(period)
169
+ for (let i = 1; i < length; i += 1) bins[i % period] += projection[i]
170
+ let maximumBin = 0
171
+ for (const value of bins) maximumBin = Math.max(maximumBin, value)
172
+ const concentration = (maximumBin - total / period) / total
173
+
174
+ let numerator = 0
175
+ let leftEnergy = 0
176
+ let rightEnergy = 0
177
+ for (let i = 1; i + period < length; i += 1) {
178
+ const left = projection[i]
179
+ const right = projection[i + period]
180
+ numerator += left * right
181
+ leftEnergy += left * left
182
+ rightEnergy += right * right
183
+ }
184
+ const correlation = numerator / Math.sqrt(Math.max(1e-12, leftEnergy * rightEnergy))
185
+ const score = concentration * 0.78 + correlation * 0.22
186
+ if (!best || score > best.score) best = { period, score, concentration, correlation }
187
+ }
188
+
189
+ const phaseResult = best && best.score >= 0.025 && best.concentration >= 0.01
190
+ ? {
191
+ period: best.period,
192
+ confidence: Math.max(0, Math.min(1, best.score * 2.5)),
193
+ }
194
+ : null
195
+ const peakResult = detectPixelPeriodFromGradientPeaks(projection)
196
+
197
+ if (!phaseResult) return peakResult
198
+ if (!peakResult) return phaseResult
199
+ const ratio = Math.max(phaseResult.period, peakResult.period) /
200
+ Math.min(phaseResult.period, peakResult.period)
201
+ if (ratio <= 1.2) {
202
+ return phaseResult.confidence >= peakResult.confidence ? phaseResult : peakResult
203
+ }
204
+ return phaseResult.confidence >= peakResult.confidence * 1.2 ? phaseResult : peakResult
205
+ }
206
+
207
+ function detectPixelPeriodFromGradientPeaks(projection) {
208
+ let maximum = 0
209
+ for (const value of projection) maximum = Math.max(maximum, value)
210
+ if (maximum <= 1e-6) return null
211
+ const thresholds = [0.2, 0.12, 0.07]
212
+ for (const relativeThreshold of thresholds) {
213
+ const threshold = maximum * relativeThreshold
214
+ const peaks = []
215
+ for (let index = 1; index < projection.length - 1; index += 1) {
216
+ if (
217
+ projection[index] >= threshold &&
218
+ projection[index] > projection[index - 1] &&
219
+ projection[index] >= projection[index + 1]
220
+ ) {
221
+ const previous = peaks[peaks.length - 1]
222
+ if (previous == null || index - previous >= 2) peaks.push(index)
223
+ else if (projection[index] > projection[previous]) peaks[peaks.length - 1] = index
224
+ }
225
+ }
226
+ if (peaks.length < 3) continue
227
+ const intervals = []
228
+ for (let index = 1; index < peaks.length; index += 1) {
229
+ const interval = peaks[index] - peaks[index - 1]
230
+ if (interval >= 2 && interval <= 128) intervals.push(interval)
231
+ }
232
+ if (intervals.length < 2) continue
233
+ const period = median(intervals)
234
+ if (period < 2 || period > 128) continue
235
+ const deviations = intervals.map((interval) => {
236
+ const multiple = Math.max(1, Math.round(interval / period))
237
+ return Math.abs(interval - multiple * period) / period
238
+ })
239
+ const meanDeviation = deviations.reduce((sum, value) => sum + value, 0) / deviations.length
240
+ const support = Math.min(1, intervals.length / 10)
241
+ const confidence = Math.max(0.08, Math.min(0.9, (1 - meanDeviation) * (0.45 + support * 0.45)))
242
+ return { period, confidence }
243
+ }
244
+ return null
245
+ }
246
+
247
+ function refineGridCoordinates(length, gridCount, projection, intensity = 0.25) {
248
+ const count = Math.max(1, Math.min(length, Math.round(gridCount)))
249
+ const cellSize = length / count
250
+ const coordinates = new Int32Array(count + 1)
251
+ coordinates[0] = 0
252
+ coordinates[count] = length
253
+
254
+ for (let index = 1; index < count; index += 1) {
255
+ const expected = index * cellSize
256
+ const radius = Math.max(1, Math.round(cellSize * intensity))
257
+ const minimum = Math.max(coordinates[index - 1] + 1, Math.round(expected) - radius)
258
+ const maximum = Math.min(length - (count - index), Math.round(expected) + radius)
259
+ let best = Math.max(minimum, Math.min(maximum, Math.round(expected)))
260
+ let bestValue = projection[best] || 0
261
+ for (let position = minimum; position <= maximum; position += 1) {
262
+ const value = projection[position] || 0
263
+ if (value > bestValue) {
264
+ best = position
265
+ bestValue = value
266
+ }
267
+ }
268
+ coordinates[index] = best
269
+ }
270
+ return coordinates
271
+ }
272
+
273
+ function fixedGridCoordinates(length, pixelSize) {
274
+ const size = Math.max(2, Math.round(pixelSize))
275
+ const coordinates = []
276
+ for (let position = 0; position < length; position += size) coordinates.push(position)
277
+ if (coordinates[coordinates.length - 1] !== length) coordinates.push(length)
278
+ return Int32Array.from(coordinates)
279
+ }
280
+
281
+ function sampleGrid(source, width, height, xCoordinates, yCoordinates, settings) {
282
+ const outputWidth = xCoordinates.length - 1
283
+ const outputHeight = yCoordinates.length - 1
284
+ const output = new Uint8ClampedArray(outputWidth * outputHeight * 4)
285
+ for (let outputY = 0; outputY < outputHeight; outputY += 1) {
286
+ const y0 = Math.max(0, Math.min(height - 1, yCoordinates[outputY]))
287
+ const y1 = Math.max(y0 + 1, Math.min(height, yCoordinates[outputY + 1]))
288
+ for (let outputX = 0; outputX < outputWidth; outputX += 1) {
289
+ const x0 = Math.max(0, Math.min(width - 1, xCoordinates[outputX]))
290
+ const x1 = Math.max(x0 + 1, Math.min(width, xCoordinates[outputX + 1]))
291
+ const color = sampleCell(source, width, x0, y0, x1, y1, settings)
292
+ const outputOffset = (outputY * outputWidth + outputX) * 4
293
+ output[outputOffset] = color[0]
294
+ output[outputOffset + 1] = color[1]
295
+ output[outputOffset + 2] = color[2]
296
+ output[outputOffset + 3] = color[3]
297
+ }
298
+ }
299
+ return output
300
+ }
301
+
302
+ function sampleCell(source, width, x0, y0, x1, y1, settings) {
303
+ const pixelCount = Math.max(1, (x1 - x0) * (y1 - y0))
304
+ const sampleStep = Math.max(1, Math.ceil(pixelCount / 128))
305
+ const samples = []
306
+ const alphaSamples = []
307
+ let alphaSum = 0
308
+ let sampleIndex = 0
309
+ let centerSample = null
310
+ const centerX = Math.min(x1 - 1, Math.floor((x0 + x1) / 2))
311
+ const centerY = Math.min(y1 - 1, Math.floor((y0 + y1) / 2))
312
+
313
+ for (let y = y0; y < y1; y += 1) {
314
+ for (let x = x0; x < x1; x += 1) {
315
+ const offset = (y * width + x) * 4
316
+ const alpha = source[offset + 3]
317
+ alphaSum += alpha
318
+ if (x === centerX && y === centerY) {
319
+ centerSample = [source[offset], source[offset + 1], source[offset + 2], alpha]
320
+ }
321
+ if (sampleIndex % sampleStep === 0) {
322
+ alphaSamples.push(alpha)
323
+ if (alpha > 4) {
324
+ samples.push([source[offset], source[offset + 1], source[offset + 2], alpha])
325
+ }
326
+ }
327
+ sampleIndex += 1
328
+ }
329
+ }
330
+
331
+ let outputAlpha
332
+ if (settings.alphaMode === 'preserve') {
333
+ outputAlpha = alphaSamples.length ? median(alphaSamples) : 0
334
+ } else {
335
+ const coverageAlpha = alphaSum / pixelCount
336
+ outputAlpha = coverageAlpha >= settings.alphaThreshold ? 255 : 0
337
+ }
338
+ if (outputAlpha <= 0 || !samples.length) return [0, 0, 0, 0]
339
+
340
+ let rgb
341
+ if (settings.sampleMethod === 'center' && centerSample?.[3] > 4) {
342
+ rgb = centerSample.slice(0, 3)
343
+ } else if (settings.sampleMethod === 'median') {
344
+ rgb = weightedMedianColor(samples)
345
+ } else if (settings.sampleMethod === 'center') {
346
+ rgb = weightedMeanColor(samples)
347
+ } else {
348
+ rgb = majorityClusterColor(samples)
349
+ }
350
+ return [rgb[0], rgb[1], rgb[2], Math.round(outputAlpha)]
351
+ }
352
+
353
+ function sampleWeight(sample) {
354
+ const alpha = sample[3] / 255
355
+ return alpha * alpha
356
+ }
357
+
358
+ function weightedMeanColor(samples) {
359
+ let red = 0
360
+ let green = 0
361
+ let blue = 0
362
+ let weightSum = 0
363
+ for (const sample of samples) {
364
+ const weight = sampleWeight(sample)
365
+ red += sample[0] * weight
366
+ green += sample[1] * weight
367
+ blue += sample[2] * weight
368
+ weightSum += weight
369
+ }
370
+ if (weightSum <= 1e-8) return [0, 0, 0]
371
+ return [Math.round(red / weightSum), Math.round(green / weightSum), Math.round(blue / weightSum)]
372
+ }
373
+
374
+ function weightedMedianColor(samples) {
375
+ const channelMedian = (channel) => {
376
+ const values = samples
377
+ .map((sample) => ({ value: sample[channel], weight: sampleWeight(sample) }))
378
+ .sort((left, right) => left.value - right.value)
379
+ const total = values.reduce((sum, item) => sum + item.weight, 0)
380
+ let accumulated = 0
381
+ for (const item of values) {
382
+ accumulated += item.weight
383
+ if (accumulated >= total / 2) return item.value
384
+ }
385
+ return values[values.length - 1]?.value || 0
386
+ }
387
+ return [channelMedian(0), channelMedian(1), channelMedian(2)]
388
+ }
389
+
390
+ function majorityClusterColor(samples) {
391
+ if (samples.length === 1) return samples[0].slice(0, 3)
392
+ let first = samples[0].slice(0, 3)
393
+ let second = first
394
+ let farthestDistance = -1
395
+ for (const sample of samples) {
396
+ const distance = colorDistanceSquared(sample, first)
397
+ if (distance > farthestDistance) {
398
+ farthestDistance = distance
399
+ second = sample.slice(0, 3)
400
+ }
401
+ }
402
+ if (farthestDistance <= 0) return first
403
+
404
+ let firstWeight = 0
405
+ let secondWeight = 0
406
+ for (let iteration = 0; iteration < 6; iteration += 1) {
407
+ const firstSum = [0, 0, 0]
408
+ const secondSum = [0, 0, 0]
409
+ firstWeight = 0
410
+ secondWeight = 0
411
+ for (const sample of samples) {
412
+ const weight = sampleWeight(sample)
413
+ const useSecond = colorDistanceSquared(sample, second) < colorDistanceSquared(sample, first)
414
+ const sum = useSecond ? secondSum : firstSum
415
+ sum[0] += sample[0] * weight
416
+ sum[1] += sample[1] * weight
417
+ sum[2] += sample[2] * weight
418
+ if (useSecond) secondWeight += weight
419
+ else firstWeight += weight
420
+ }
421
+ if (firstWeight > 0) first = firstSum.map((value) => value / firstWeight)
422
+ if (secondWeight > 0) second = secondSum.map((value) => value / secondWeight)
423
+ }
424
+ const result = secondWeight >= firstWeight ? second : first
425
+ return result.map((value) => Math.max(0, Math.min(255, Math.round(value))))
426
+ }
427
+
428
+ function colorDistanceSquared(sample, color) {
429
+ const red = sample[0] - color[0]
430
+ const green = sample[1] - color[1]
431
+ const blue = sample[2] - color[2]
432
+ return red * red + green * green + blue * blue
433
+ }
434
+
435
+ function median(values) {
436
+ const sorted = [...values].sort((left, right) => left - right)
437
+ const middle = Math.floor(sorted.length / 2)
438
+ return sorted.length % 2
439
+ ? sorted[middle]
440
+ : (sorted[middle - 1] + sorted[middle]) / 2
441
+ }
@@ -0,0 +1,10 @@
1
+ // Node background thread. The browser never loads this entry or the pixel algorithm.
2
+ const { parentPort, workerData } = require('node:worker_threads');
3
+
4
+ import('./perfect-pixel-core.js').then(({ normalizeSettings, restorePixelGrid }) => {
5
+ const settings = normalizeSettings(workerData.settings);
6
+ const result = restorePixelGrid(workerData.image, settings);
7
+ parentPort.postMessage({ result, settings }, [result.pixels.buffer]);
8
+ }).catch(error => {
9
+ parentPort.postMessage({ error: { message: error.message, messageKey: error.messageKey } });
10
+ });