@nice2dev/ui-graphics 1.3.14 → 1.3.16

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 (294) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/animation/AnimatedPerson.js +470 -143
  3. package/dist/cjs/animation/AnimationEditor.js +289 -101
  4. package/dist/cjs/animation/Audience.js +83 -61
  5. package/dist/cjs/animation/BodyRenderer.js +69 -28
  6. package/dist/cjs/animation/animationHelper.js +281 -288
  7. package/dist/cjs/animation/characterTypes.js +200 -203
  8. package/dist/cjs/animation/choreoDSL.js +205 -219
  9. package/dist/cjs/animation/choreography.js +4 -32
  10. package/dist/cjs/animation/karaokeIntegration.js +68 -77
  11. package/dist/cjs/animation/lottieExport.js +108 -114
  12. package/dist/cjs/animation/motionPath.js +225 -248
  13. package/dist/cjs/animation/physics.js +227 -254
  14. package/dist/cjs/animation/rig/RigPlayer.js +53 -56
  15. package/dist/cjs/animation/rig/RiggedBody.js +71 -26
  16. package/dist/cjs/animation/rig/choreoRigBridge.js +72 -77
  17. package/dist/cjs/animation/rig/ik.js +13 -18
  18. package/dist/cjs/animation/rig/poseOps.js +34 -41
  19. package/dist/cjs/animation/rig/presets.js +64 -72
  20. package/dist/cjs/animation/rig/rigMath.js +25 -32
  21. package/dist/cjs/animation/rig/rigTypes.js +59 -63
  22. package/dist/cjs/animation/shapes/arms.js +31 -13
  23. package/dist/cjs/animation/shapes/eyes.js +129 -47
  24. package/dist/cjs/animation/shapes/hair.js +72 -45
  25. package/dist/cjs/animation/shapes/heads.js +131 -57
  26. package/dist/cjs/animation/shapes/headwear.js +47 -38
  27. package/dist/cjs/animation/shapes/legs.js +31 -13
  28. package/dist/cjs/animation/shapes/mouths.js +120 -44
  29. package/dist/cjs/animation/shapes/noses.js +80 -25
  30. package/dist/cjs/animation/shapes/outfits.js +101 -39
  31. package/dist/cjs/animation/shapes/torsos.js +15 -11
  32. package/dist/cjs/animation/spineExport.js +103 -121
  33. package/dist/cjs/core/LocalUI.js +108 -43
  34. package/dist/cjs/core/NiceBrushEngine.js +758 -552
  35. package/dist/cjs/core/collaboration.js +249 -251
  36. package/dist/cjs/core/colorBlindness.js +100 -115
  37. package/dist/cjs/core/dragDrop.js +155 -158
  38. package/dist/cjs/core/editorAsk.js +51 -41
  39. package/dist/cjs/core/fixes.js +140 -171
  40. package/dist/cjs/core/gridGuides.js +166 -201
  41. package/dist/cjs/core/historyVisual.js +156 -135
  42. package/dist/cjs/core/i18n.js +13 -14
  43. package/dist/cjs/core/integrations.js +238 -249
  44. package/dist/cjs/core/minimap.js +149 -151
  45. package/dist/cjs/core/plugins.js +98 -113
  46. package/dist/cjs/core/rtl.js +71 -83
  47. package/dist/cjs/core/shortcuts.js +196 -225
  48. package/dist/cjs/core/theme.js +142 -149
  49. package/dist/cjs/core/yjsCollaboration.js +232 -293
  50. package/dist/cjs/design/design-tools.js +12 -22
  51. package/dist/cjs/font/NiceFontEditor.js +877 -316
  52. package/dist/cjs/font/fontFormatUtils.js +388 -448
  53. package/dist/cjs/game/GameAsset2dEditor.js +1201 -392
  54. package/dist/cjs/game/GameAsset2dEditor.module.css.js +146 -5
  55. package/dist/cjs/game/gameAssetTypes.js +7 -16
  56. package/dist/cjs/game/gameAssetUtils.js +390 -413
  57. package/dist/cjs/game/useGameAssetEditor.js +820 -763
  58. package/dist/cjs/index.js +81 -84
  59. package/dist/cjs/nice2dev-ui-graphics.css +1 -1
  60. package/dist/cjs/node_modules/lib0/array.js +8 -70
  61. package/dist/cjs/node_modules/lib0/binary.js +3 -20
  62. package/dist/cjs/node_modules/lib0/broadcastchannel.js +24 -86
  63. package/dist/cjs/node_modules/lib0/buffer.js +15 -82
  64. package/dist/cjs/node_modules/lib0/conditions.js +3 -16
  65. package/dist/cjs/node_modules/lib0/decoding.js +108 -287
  66. package/dist/cjs/node_modules/lib0/dom.js +14 -44
  67. package/dist/cjs/node_modules/lib0/encoding.js +68 -418
  68. package/dist/cjs/node_modules/lib0/environment.js +26 -92
  69. package/dist/cjs/node_modules/lib0/error.js +5 -29
  70. package/dist/cjs/node_modules/lib0/function.js +27 -66
  71. package/dist/cjs/node_modules/lib0/iterator.js +8 -33
  72. package/dist/cjs/node_modules/lib0/logging.common.js +12 -22
  73. package/dist/cjs/node_modules/lib0/logging.js +32 -71
  74. package/dist/cjs/node_modules/lib0/map.js +16 -86
  75. package/dist/cjs/node_modules/lib0/math.js +3 -32
  76. package/dist/cjs/node_modules/lib0/number.js +4 -15
  77. package/dist/cjs/node_modules/lib0/object.js +14 -88
  78. package/dist/cjs/node_modules/lib0/observable.js +38 -78
  79. package/dist/cjs/node_modules/lib0/pair.js +3 -20
  80. package/dist/cjs/node_modules/lib0/prng.js +8 -77
  81. package/dist/cjs/node_modules/lib0/promise.js +6 -30
  82. package/dist/cjs/node_modules/lib0/random.js +8 -23
  83. package/dist/cjs/node_modules/lib0/schema.js +313 -687
  84. package/dist/cjs/node_modules/lib0/set.js +3 -10
  85. package/dist/cjs/node_modules/lib0/storage.js +20 -55
  86. package/dist/cjs/node_modules/lib0/string.js +17 -72
  87. package/dist/cjs/node_modules/lib0/symbol.js +2 -12
  88. package/dist/cjs/node_modules/lib0/time.js +2 -15
  89. package/dist/cjs/node_modules/lib0/trait/equality.js +3 -28
  90. package/dist/cjs/node_modules/lib0/url.js +4 -18
  91. package/dist/cjs/node_modules/lib0/webcrypto.js +2 -5
  92. package/dist/cjs/node_modules/y-protocols/auth.js +5 -19
  93. package/dist/cjs/node_modules/y-protocols/awareness.js +53 -116
  94. package/dist/cjs/node_modules/y-protocols/sync.js +16 -103
  95. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js +77 -219
  96. package/dist/cjs/node_modules/yjs/dist/yjs.js +2128 -4868
  97. package/dist/cjs/photo/FilterThumb.js +37 -25
  98. package/dist/cjs/photo/NiceAITools.js +679 -467
  99. package/dist/cjs/photo/PhotoEditor.js +34 -20
  100. package/dist/cjs/photo/PhotoEditor.module.css.js +296 -5
  101. package/dist/cjs/photo/PhotoEditorCanvas.js +250 -91
  102. package/dist/cjs/photo/PhotoEditorLeftPanel.js +1086 -224
  103. package/dist/cjs/photo/PhotoEditorToolbar.js +135 -19
  104. package/dist/cjs/photo/photoEditorActions.js +89 -72
  105. package/dist/cjs/photo/photoEditorTypes.js +29 -32
  106. package/dist/cjs/photo/photoFilters.js +959 -985
  107. package/dist/cjs/photo/photoOverlays.js +899 -945
  108. package/dist/cjs/photo/photoSelection.js +427 -499
  109. package/dist/cjs/photo/usePhotoEditor.js +739 -741
  110. package/dist/cjs/pixel/HSVPicker.js +191 -175
  111. package/dist/cjs/pixel/PixelEditor.js +159 -48
  112. package/dist/cjs/pixel/PixelEditor.module.css.js +209 -5
  113. package/dist/cjs/pixel/PixelEditorCanvas.js +29 -16
  114. package/dist/cjs/pixel/PixelEditorMenuBar.js +160 -162
  115. package/dist/cjs/pixel/PixelEditorRightPanel.js +377 -45
  116. package/dist/cjs/pixel/PixelEditorStatusBar.js +47 -20
  117. package/dist/cjs/pixel/PixelEditorTimeline.js +106 -23
  118. package/dist/cjs/pixel/PixelEditorToolbar.js +99 -21
  119. package/dist/cjs/pixel/SpriteGeneratorPanel.js +483 -303
  120. package/dist/cjs/pixel/animalGeneratorPresets.js +776 -601
  121. package/dist/cjs/pixel/asepriteFormat.js +511 -560
  122. package/dist/cjs/pixel/buildingGeneratorPresets.js +693 -520
  123. package/dist/cjs/pixel/characterGeneratorPresets.js +644 -544
  124. package/dist/cjs/pixel/pixel-pro.js +52 -63
  125. package/dist/cjs/pixel/pixelEditorExports.js +388 -428
  126. package/dist/cjs/pixel/pixelEditorTypes.js +91 -108
  127. package/dist/cjs/pixel/pixelEditorUtils.js +519 -561
  128. package/dist/cjs/pixel/spriteGeneratorCore.js +206 -257
  129. package/dist/cjs/pixel/usePixelEditor.js +1321 -1343
  130. package/dist/cjs/texture/Nice3DTexturePainter.js +707 -440
  131. package/dist/cjs/ui/NiceUIDesigner.js +954 -527
  132. package/dist/cjs/vector/NiceSvgToCode.js +586 -446
  133. package/dist/cjs/vector/VectorEditor.js +290 -117
  134. package/dist/cjs/vector/VectorEditor.module.css.js +86 -5
  135. package/dist/cjs/vector/VectorEditorMenuBar.js +333 -275
  136. package/dist/cjs/vector/VectorEditorRightPanel.js +1094 -371
  137. package/dist/cjs/vector/VectorEditorShapeRenderer.js +198 -60
  138. package/dist/cjs/vector/VectorEditorStatusBar.js +39 -13
  139. package/dist/cjs/vector/useVectorEditor.js +848 -889
  140. package/dist/cjs/vector/vectorAnimation.js +110 -137
  141. package/dist/cjs/vector/vectorBooleanOps.js +398 -485
  142. package/dist/cjs/vector/vectorEditorExport.js +201 -203
  143. package/dist/cjs/vector/vectorEditorImport.js +173 -189
  144. package/dist/cjs/vector/vectorEditorTypes.js +42 -49
  145. package/dist/cjs/vector/vectorGradients.js +151 -174
  146. package/dist/cjs/vector/vectorIconExport.js +52 -59
  147. package/dist/cjs/vector/vectorIconImport.js +169 -219
  148. package/dist/esm/animation/AnimatedPerson.js +470 -141
  149. package/dist/esm/animation/AnimationEditor.js +290 -100
  150. package/dist/esm/animation/Audience.js +83 -59
  151. package/dist/esm/animation/BodyRenderer.js +71 -25
  152. package/dist/esm/animation/animationHelper.js +284 -287
  153. package/dist/esm/animation/characterTypes.js +204 -202
  154. package/dist/esm/animation/choreoDSL.js +212 -218
  155. package/dist/esm/animation/choreography.js +8 -31
  156. package/dist/esm/animation/karaokeIntegration.js +74 -76
  157. package/dist/esm/animation/lottieExport.js +112 -113
  158. package/dist/esm/animation/motionPath.js +235 -247
  159. package/dist/esm/animation/physics.js +235 -253
  160. package/dist/esm/animation/rig/RigPlayer.js +53 -54
  161. package/dist/esm/animation/rig/RiggedBody.js +71 -24
  162. package/dist/esm/animation/rig/choreoRigBridge.js +74 -76
  163. package/dist/esm/animation/rig/ik.js +14 -17
  164. package/dist/esm/animation/rig/poseOps.js +37 -40
  165. package/dist/esm/animation/rig/presets.js +70 -71
  166. package/dist/esm/animation/rig/rigMath.js +28 -31
  167. package/dist/esm/animation/rig/rigTypes.js +62 -62
  168. package/dist/esm/animation/shapes/arms.js +32 -12
  169. package/dist/esm/animation/shapes/eyes.js +135 -46
  170. package/dist/esm/animation/shapes/hair.js +80 -44
  171. package/dist/esm/animation/shapes/heads.js +140 -56
  172. package/dist/esm/animation/shapes/headwear.js +54 -37
  173. package/dist/esm/animation/shapes/legs.js +32 -12
  174. package/dist/esm/animation/shapes/mouths.js +127 -43
  175. package/dist/esm/animation/shapes/noses.js +87 -24
  176. package/dist/esm/animation/shapes/outfits.js +106 -38
  177. package/dist/esm/animation/shapes/torsos.js +16 -10
  178. package/dist/esm/animation/spineExport.js +106 -120
  179. package/dist/esm/core/LocalUI.js +111 -42
  180. package/dist/esm/core/NiceBrushEngine.js +761 -551
  181. package/dist/esm/core/collaboration.js +255 -250
  182. package/dist/esm/core/colorBlindness.js +106 -114
  183. package/dist/esm/core/dragDrop.js +157 -157
  184. package/dist/esm/core/editorAsk.js +53 -40
  185. package/dist/esm/core/fixes.js +145 -170
  186. package/dist/esm/core/gridGuides.js +178 -200
  187. package/dist/esm/core/historyVisual.js +158 -134
  188. package/dist/esm/core/i18n.js +15 -13
  189. package/dist/esm/core/integrations.js +244 -248
  190. package/dist/esm/core/minimap.js +151 -150
  191. package/dist/esm/core/plugins.js +102 -112
  192. package/dist/esm/core/rtl.js +77 -82
  193. package/dist/esm/core/shortcuts.js +200 -224
  194. package/dist/esm/core/theme.js +150 -148
  195. package/dist/esm/core/yjsCollaboration.js +240 -292
  196. package/dist/esm/design/design-tools.js +13 -21
  197. package/dist/esm/font/NiceFontEditor.js +880 -315
  198. package/dist/esm/font/fontFormatUtils.js +394 -447
  199. package/dist/esm/game/GameAsset2dEditor.js +1202 -391
  200. package/dist/esm/game/GameAsset2dEditor.module.css.js +146 -3
  201. package/dist/esm/game/gameAssetTypes.js +8 -15
  202. package/dist/esm/game/gameAssetUtils.js +408 -412
  203. package/dist/esm/game/useGameAssetEditor.js +821 -762
  204. package/dist/esm/index.js +332 -69
  205. package/dist/esm/nice2dev-ui-graphics.css +1 -1
  206. package/dist/esm/node_modules/lib0/array.js +15 -69
  207. package/dist/esm/node_modules/lib0/binary.js +14 -19
  208. package/dist/esm/node_modules/lib0/broadcastchannel.js +27 -85
  209. package/dist/esm/node_modules/lib0/buffer.js +20 -80
  210. package/dist/esm/node_modules/lib0/conditions.js +4 -15
  211. package/dist/esm/node_modules/lib0/decoding.js +128 -286
  212. package/dist/esm/node_modules/lib0/dom.js +20 -43
  213. package/dist/esm/node_modules/lib0/encoding.js +90 -415
  214. package/dist/esm/node_modules/lib0/environment.js +33 -91
  215. package/dist/esm/node_modules/lib0/error.js +8 -28
  216. package/dist/esm/node_modules/lib0/function.js +31 -65
  217. package/dist/esm/node_modules/lib0/iterator.js +11 -32
  218. package/dist/esm/node_modules/lib0/logging.common.js +22 -21
  219. package/dist/esm/node_modules/lib0/logging.js +44 -70
  220. package/dist/esm/node_modules/lib0/map.js +21 -85
  221. package/dist/esm/node_modules/lib0/math.js +9 -31
  222. package/dist/esm/node_modules/lib0/number.js +7 -14
  223. package/dist/esm/node_modules/lib0/object.js +26 -87
  224. package/dist/esm/node_modules/lib0/observable.js +40 -77
  225. package/dist/esm/node_modules/lib0/pair.js +5 -19
  226. package/dist/esm/node_modules/lib0/prng.js +15 -76
  227. package/dist/esm/node_modules/lib0/promise.js +7 -29
  228. package/dist/esm/node_modules/lib0/random.js +10 -22
  229. package/dist/esm/node_modules/lib0/schema.js +367 -686
  230. package/dist/esm/node_modules/lib0/set.js +4 -9
  231. package/dist/esm/node_modules/lib0/storage.js +23 -54
  232. package/dist/esm/node_modules/lib0/string.js +26 -71
  233. package/dist/esm/node_modules/lib0/symbol.js +3 -11
  234. package/dist/esm/node_modules/lib0/time.js +3 -14
  235. package/dist/esm/node_modules/lib0/trait/equality.js +5 -27
  236. package/dist/esm/node_modules/lib0/url.js +5 -17
  237. package/dist/esm/node_modules/lib0/webcrypto.js +3 -4
  238. package/dist/esm/node_modules/y-protocols/auth.js +7 -18
  239. package/dist/esm/node_modules/y-protocols/awareness.js +58 -115
  240. package/dist/esm/node_modules/y-protocols/sync.js +26 -102
  241. package/dist/esm/node_modules/y-websocket/src/y-websocket.js +82 -218
  242. package/dist/esm/node_modules/yjs/dist/yjs.js +2263 -4899
  243. package/dist/esm/photo/FilterThumb.js +37 -23
  244. package/dist/esm/photo/NiceAITools.js +685 -466
  245. package/dist/esm/photo/PhotoEditor.js +34 -18
  246. package/dist/esm/photo/PhotoEditor.module.css.js +296 -3
  247. package/dist/esm/photo/PhotoEditorCanvas.js +250 -89
  248. package/dist/esm/photo/PhotoEditorLeftPanel.js +1086 -222
  249. package/dist/esm/photo/PhotoEditorToolbar.js +135 -17
  250. package/dist/esm/photo/photoEditorActions.js +93 -71
  251. package/dist/esm/photo/photoEditorTypes.js +32 -31
  252. package/dist/esm/photo/photoFilters.js +967 -984
  253. package/dist/esm/photo/photoOverlays.js +913 -944
  254. package/dist/esm/photo/photoSelection.js +438 -498
  255. package/dist/esm/photo/usePhotoEditor.js +740 -740
  256. package/dist/esm/pixel/HSVPicker.js +192 -174
  257. package/dist/esm/pixel/PixelEditor.js +160 -47
  258. package/dist/esm/pixel/PixelEditor.module.css.js +209 -3
  259. package/dist/esm/pixel/PixelEditorCanvas.js +29 -14
  260. package/dist/esm/pixel/PixelEditorMenuBar.js +160 -160
  261. package/dist/esm/pixel/PixelEditorRightPanel.js +377 -43
  262. package/dist/esm/pixel/PixelEditorStatusBar.js +47 -18
  263. package/dist/esm/pixel/PixelEditorTimeline.js +106 -21
  264. package/dist/esm/pixel/PixelEditorToolbar.js +99 -19
  265. package/dist/esm/pixel/SpriteGeneratorPanel.js +483 -301
  266. package/dist/esm/pixel/animalGeneratorPresets.js +782 -600
  267. package/dist/esm/pixel/asepriteFormat.js +517 -559
  268. package/dist/esm/pixel/buildingGeneratorPresets.js +699 -519
  269. package/dist/esm/pixel/characterGeneratorPresets.js +650 -543
  270. package/dist/esm/pixel/pixel-pro.js +53 -62
  271. package/dist/esm/pixel/pixelEditorExports.js +397 -427
  272. package/dist/esm/pixel/pixelEditorTypes.js +103 -107
  273. package/dist/esm/pixel/pixelEditorUtils.js +551 -560
  274. package/dist/esm/pixel/spriteGeneratorCore.js +223 -256
  275. package/dist/esm/pixel/usePixelEditor.js +1322 -1342
  276. package/dist/esm/texture/Nice3DTexturePainter.js +709 -439
  277. package/dist/esm/ui/NiceUIDesigner.js +957 -526
  278. package/dist/esm/vector/NiceSvgToCode.js +589 -445
  279. package/dist/esm/vector/VectorEditor.js +291 -116
  280. package/dist/esm/vector/VectorEditor.module.css.js +86 -3
  281. package/dist/esm/vector/VectorEditorMenuBar.js +333 -273
  282. package/dist/esm/vector/VectorEditorRightPanel.js +1094 -369
  283. package/dist/esm/vector/VectorEditorShapeRenderer.js +199 -59
  284. package/dist/esm/vector/VectorEditorStatusBar.js +39 -11
  285. package/dist/esm/vector/useVectorEditor.js +849 -888
  286. package/dist/esm/vector/vectorAnimation.js +115 -136
  287. package/dist/esm/vector/vectorBooleanOps.js +401 -484
  288. package/dist/esm/vector/vectorEditorExport.js +207 -202
  289. package/dist/esm/vector/vectorEditorImport.js +174 -188
  290. package/dist/esm/vector/vectorEditorTypes.js +50 -48
  291. package/dist/esm/vector/vectorGradients.js +158 -173
  292. package/dist/esm/vector/vectorIconExport.js +53 -58
  293. package/dist/esm/vector/vectorIconImport.js +171 -218
  294. package/package.json +9 -15
@@ -1,53 +1,42 @@
1
- import { generateMirroredDirections, createPartData, registerParts } from './spriteGeneratorCore.js';
2
-
3
- /**
4
- * characterGeneratorPresets.ts — Extensive library of character parts
5
- * for the sprite generator. Provides heads, hair, torsos, arms, legs,
6
- * faces, and equipment in multiple styles at 16×16 and 32×32 sizes.
7
- *
8
- * Each part has directional pixel data (S, E, N with mirroring for W, etc.)
9
- */
10
- /* ════════════════════════════════════════════════════════════════
11
- COLOR PALETTES
12
- ════════════════════════════════════════════════════════════════ */
1
+ import { registerParts, generateMirroredDirections, createPartData } from "./spriteGeneratorCore.js";
13
2
  const SKIN_PALETTES = {
14
- light: ['var(--nice-warning-bg, #ffecd2)', '#f5c6a0', '#e0a070', '#c07848', '#8b5e3c'],
15
- medium: ['#e8c090', '#d4a06c', '#b88050', '#946038', '#6b4423'],
16
- dark: ['#c08050', '#a06838', '#805028', '#603818', '#402010'],
17
- fantasy1: ['#d0f0d0', '#a8d8a0', '#78b868', '#508030', '#304818'],
18
- fantasy2: ['#d0d8f0', '#a8b0d8', '#7888b8', '#506090', '#303860'],
3
+ light: ["var(--nice-warning-bg, #ffecd2)", "#f5c6a0", "#e0a070", "#c07848", "#8b5e3c"],
4
+ medium: ["#e8c090", "#d4a06c", "#b88050", "#946038", "#6b4423"],
5
+ dark: ["#c08050", "#a06838", "#805028", "#603818", "#402010"],
6
+ fantasy1: ["#d0f0d0", "#a8d8a0", "#78b868", "#508030", "#304818"],
7
+ fantasy2: ["#d0d8f0", "#a8b0d8", "#7888b8", "#506090", "#303860"]
19
8
  };
20
9
  const HAIR_PALETTES = {
21
- black: ['var(--nice-bg, #1a1a2e)', '#101020', '#080810'],
22
- brown: ['#8b6914', '#6b4e0a', '#4a3508'],
23
- blonde: ['#f0d060', '#d0b040', '#b09028'],
24
- red: ['#d03020', '#a02018', '#781810'],
25
- white: [
26
- 'var(--nice-bg-secondary, #f0f0f0)',
27
- 'var(--nice-border, #d0d0d0)',
28
- 'var(--nice-text-muted, #a0a0a0)',
29
- ],
30
- blue: ['#4080e0', '#3060b0', '#204080'],
31
- green: ['#40c040', '#309030', '#206020'],
32
- pink: ['#f080b0', '#d06090', '#a04070'],
33
- purple: ['#a040e0', '#8030b0', '#602080'],
10
+ black: ["var(--nice-bg, #1a1a2e)", "#101020", "#080810"],
11
+ brown: ["#8b6914", "#6b4e0a", "#4a3508"],
12
+ blonde: ["#f0d060", "#d0b040", "#b09028"],
13
+ red: ["#d03020", "#a02018", "#781810"],
14
+ white: [
15
+ "var(--nice-bg-secondary, #f0f0f0)",
16
+ "var(--nice-border, #d0d0d0)",
17
+ "var(--nice-text-muted, #a0a0a0)"
18
+ ],
19
+ blue: ["#4080e0", "#3060b0", "#204080"],
20
+ green: ["#40c040", "#309030", "#206020"],
21
+ pink: ["#f080b0", "#d06090", "#a04070"],
22
+ purple: ["#a040e0", "#8030b0", "#602080"]
34
23
  };
35
24
  const CLOTHING_PALETTES = {
36
- leather: ['#b08060', '#906840', '#705028'],
37
- iron: ['var(--nice-border, #c0c0c8)', '#909098', '#606068'],
38
- gold: ['#f0d060', '#d0b040', '#a08020'],
39
- cloth_r: ['#d04040', '#b02020', '#801010'],
40
- cloth_b: ['#4060d0', '#3040b0', '#202880'],
41
- cloth_g: ['#40b040', '#208020', '#105010'],
42
- cloth_w: ['var(--nice-bg-secondary, #f0f0f0)', 'var(--nice-border, #d0d0d0)', '#b0b0b0'],
43
- cloth_k: ['var(--nice-border, #404040)', '#282828', '#181818'],
44
- royal: ['#8020a0', '#601080', '#400860'],
25
+ leather: ["#b08060", "#906840", "#705028"],
26
+ iron: ["var(--nice-border, #c0c0c8)", "#909098", "#606068"],
27
+ gold: ["#f0d060", "#d0b040", "#a08020"],
28
+ cloth_r: ["#d04040", "#b02020", "#801010"],
29
+ cloth_b: ["#4060d0", "#3040b0", "#202880"],
30
+ cloth_g: ["#40b040", "#208020", "#105010"],
31
+ cloth_w: ["var(--nice-bg-secondary, #f0f0f0)", "var(--nice-border, #d0d0d0)", "#b0b0b0"],
32
+ cloth_k: ["var(--nice-border, #404040)", "#282828", "#181818"],
33
+ royal: ["#8020a0", "#601080", "#400860"]
45
34
  };
46
- /* ════════════════════════════════════════════════════════════════
47
- 16×16 CHARACTER PARTS — HEADS
48
- ════════════════════════════════════════════════════════════════ */
49
- const _ = -1; // transparent shorthand
50
- const HEAD_ROUND_S = /* @__PURE__ */ createPartData(8, 8, [
35
+ const _ = -1;
36
+ const HEAD_ROUND_S = /* @__PURE__ */ createPartData(
37
+ 8,
38
+ 8,
39
+ [
51
40
  [_, _, 1, 1, 1, 1, _, _],
52
41
  [_, 1, 0, 0, 0, 0, 1, _],
53
42
  [1, 0, 0, 0, 0, 0, 0, 1],
@@ -55,9 +44,14 @@ const HEAD_ROUND_S = /* @__PURE__ */ createPartData(8, 8, [
55
44
  [1, 0, 0, 0, 0, 0, 0, 1],
56
45
  [1, 0, 0, 2, 2, 0, 0, 1],
57
46
  [_, 1, 0, 0, 0, 0, 1, _],
58
- [_, _, 1, 1, 1, 1, _, _],
59
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848', '#e05050', '#2a2a4e']);
60
- const HEAD_ROUND_E = /* @__PURE__ */ createPartData(7, 8, [
47
+ [_, _, 1, 1, 1, 1, _, _]
48
+ ],
49
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848", "#e05050", "#2a2a4e"]
50
+ );
51
+ const HEAD_ROUND_E = /* @__PURE__ */ createPartData(
52
+ 7,
53
+ 8,
54
+ [
61
55
  [_, _, 1, 1, 1, _, _],
62
56
  [_, 1, 0, 0, 0, 1, _],
63
57
  [1, 0, 0, 0, 0, 0, 1],
@@ -65,9 +59,14 @@ const HEAD_ROUND_E = /* @__PURE__ */ createPartData(7, 8, [
65
59
  [1, 0, 0, 0, 0, 0, 1],
66
60
  [1, 0, 0, 0, 2, 0, 1],
67
61
  [_, 1, 0, 0, 0, 1, _],
68
- [_, _, 1, 1, 1, _, _],
69
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848', '#e05050', '#2a2a4e']);
70
- const HEAD_ROUND_N = /* @__PURE__ */ createPartData(8, 8, [
62
+ [_, _, 1, 1, 1, _, _]
63
+ ],
64
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848", "#e05050", "#2a2a4e"]
65
+ );
66
+ const HEAD_ROUND_N = /* @__PURE__ */ createPartData(
67
+ 8,
68
+ 8,
69
+ [
71
70
  [_, _, 1, 1, 1, 1, _, _],
72
71
  [_, 1, 0, 0, 0, 0, 1, _],
73
72
  [1, 0, 0, 0, 0, 0, 0, 1],
@@ -75,18 +74,28 @@ const HEAD_ROUND_N = /* @__PURE__ */ createPartData(8, 8, [
75
74
  [1, 0, 0, 0, 0, 0, 0, 1],
76
75
  [1, 0, 0, 0, 0, 0, 0, 1],
77
76
  [_, 1, 0, 0, 0, 0, 1, _],
78
- [_, _, 1, 1, 1, 1, _, _],
79
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848', '#e05050', '#2a2a4e']);
80
- const HEAD_SQUARE_S = /* @__PURE__ */ createPartData(8, 7, [
77
+ [_, _, 1, 1, 1, 1, _, _]
78
+ ],
79
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848", "#e05050", "#2a2a4e"]
80
+ );
81
+ const HEAD_SQUARE_S = /* @__PURE__ */ createPartData(
82
+ 8,
83
+ 7,
84
+ [
81
85
  [_, 1, 1, 1, 1, 1, 1, _],
82
86
  [1, 0, 0, 0, 0, 0, 0, 1],
83
87
  [1, 0, 3, 0, 0, 3, 0, 1],
84
88
  [1, 0, 0, 0, 0, 0, 0, 1],
85
89
  [1, 0, 0, 2, 2, 0, 0, 1],
86
90
  [1, 0, 0, 0, 0, 0, 0, 1],
87
- [_, 1, 1, 1, 1, 1, 1, _],
88
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848', '#e05050', '#2a2a4e']);
89
- const HEAD_CHIBI_S = /* @__PURE__ */ createPartData(10, 10, [
91
+ [_, 1, 1, 1, 1, 1, 1, _]
92
+ ],
93
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848", "#e05050", "#2a2a4e"]
94
+ );
95
+ const HEAD_CHIBI_S = /* @__PURE__ */ createPartData(
96
+ 10,
97
+ 10,
98
+ [
90
99
  [_, _, _, 1, 1, 1, 1, _, _, _],
91
100
  [_, _, 1, 0, 0, 0, 0, 1, _, _],
92
101
  [_, 1, 0, 0, 0, 0, 0, 0, 1, _],
@@ -96,16 +105,25 @@ const HEAD_CHIBI_S = /* @__PURE__ */ createPartData(10, 10, [
96
105
  [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
97
106
  [1, 0, 0, 0, 2, 2, 0, 0, 0, 1],
98
107
  [_, 1, 0, 0, 0, 0, 0, 0, 1, _],
99
- [_, _, 1, 1, 1, 1, 1, 1, _, _],
100
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848', '#e05050', '#2a2a4e']);
101
- /* ── HAIR ── */
102
- const HAIR_SHORT_S = /* @__PURE__ */ createPartData(8, 4, [
108
+ [_, _, 1, 1, 1, 1, 1, 1, _, _]
109
+ ],
110
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848", "#e05050", "#2a2a4e"]
111
+ );
112
+ const HAIR_SHORT_S = /* @__PURE__ */ createPartData(
113
+ 8,
114
+ 4,
115
+ [
103
116
  [_, _, 0, 0, 0, 0, _, _],
104
117
  [_, 0, 0, 0, 0, 0, 0, _],
105
118
  [0, 0, 1, 1, 1, 1, 0, 0],
106
- [0, 1, _, _, _, _, 1, 0],
107
- ], ['#4a3508', '#6b4e0a']);
108
- const HAIR_LONG_S = /* @__PURE__ */ createPartData(10, 10, [
119
+ [0, 1, _, _, _, _, 1, 0]
120
+ ],
121
+ ["#4a3508", "#6b4e0a"]
122
+ );
123
+ const HAIR_LONG_S = /* @__PURE__ */ createPartData(
124
+ 10,
125
+ 10,
126
+ [
109
127
  [_, _, _, 0, 0, 0, 0, _, _, _],
110
128
  [_, _, 0, 0, 0, 0, 0, 0, _, _],
111
129
  [_, 0, 0, 1, 1, 1, 1, 0, 0, _],
@@ -115,17 +133,27 @@ const HAIR_LONG_S = /* @__PURE__ */ createPartData(10, 10, [
115
133
  [0, 1, _, _, _, _, _, _, 1, 0],
116
134
  [0, 0, _, _, _, _, _, _, 0, 0],
117
135
  [_, 0, _, _, _, _, _, _, 0, _],
118
- [_, 0, 0, _, _, _, _, 0, 0, _],
119
- ], ['#4a3508', '#6b4e0a']);
120
- const HAIR_MOHAWK_S = /* @__PURE__ */ createPartData(8, 6, [
136
+ [_, 0, 0, _, _, _, _, 0, 0, _]
137
+ ],
138
+ ["#4a3508", "#6b4e0a"]
139
+ );
140
+ const HAIR_MOHAWK_S = /* @__PURE__ */ createPartData(
141
+ 8,
142
+ 6,
143
+ [
121
144
  [_, _, _, 0, 0, _, _, _],
122
145
  [_, _, 0, 0, 0, 0, _, _],
123
146
  [_, _, 0, 0, 0, 0, _, _],
124
147
  [_, _, 0, 1, 1, 0, _, _],
125
148
  [_, 0, 1, _, _, 1, 0, _],
126
- [0, 1, _, _, _, _, 1, 0],
127
- ], ['#d03020', '#a02018']);
128
- const HAIR_PONYTAIL_S = /* @__PURE__ */ createPartData(10, 8, [
149
+ [0, 1, _, _, _, _, 1, 0]
150
+ ],
151
+ ["#d03020", "#a02018"]
152
+ );
153
+ const HAIR_PONYTAIL_S = /* @__PURE__ */ createPartData(
154
+ 10,
155
+ 8,
156
+ [
129
157
  [_, _, _, 0, 0, 0, 0, _, _, _],
130
158
  [_, _, 0, 0, 0, 0, 0, 0, _, _],
131
159
  [_, 0, 0, 1, 1, 1, 1, 0, 0, _],
@@ -133,35 +161,54 @@ const HAIR_PONYTAIL_S = /* @__PURE__ */ createPartData(10, 8, [
133
161
  [_, _, _, _, _, _, _, _, 0, 0],
134
162
  [_, _, _, _, _, _, _, _, _, 0],
135
163
  [_, _, _, _, _, _, _, _, _, 0],
136
- [_, _, _, _, _, _, _, _, 0, _],
137
- ], ['#f0d060', '#d0b040']);
138
- const HAIR_SPIKY_S = /* @__PURE__ */ createPartData(10, 6, [
164
+ [_, _, _, _, _, _, _, _, 0, _]
165
+ ],
166
+ ["#f0d060", "#d0b040"]
167
+ );
168
+ const HAIR_SPIKY_S = /* @__PURE__ */ createPartData(
169
+ 10,
170
+ 6,
171
+ [
139
172
  [_, 0, _, _, 0, _, 0, _, _, _],
140
173
  [_, 0, 0, 0, 0, 0, 0, 0, _, _],
141
174
  [0, 0, 0, 0, 0, 0, 0, 0, 0, _],
142
175
  [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],
143
176
  [0, 1, _, _, _, _, _, _, 1, 0],
144
- [_, _, _, _, _, _, _, _, _, _],
145
- ], ['var(--nice-bg, #1a1a2e)', '#101020']);
146
- /* ── TORSOS ── */
147
- const TORSO_BASIC_S = /* @__PURE__ */ createPartData(8, 6, [
177
+ [_, _, _, _, _, _, _, _, _, _]
178
+ ],
179
+ ["var(--nice-bg, #1a1a2e)", "#101020"]
180
+ );
181
+ const TORSO_BASIC_S = /* @__PURE__ */ createPartData(
182
+ 8,
183
+ 6,
184
+ [
148
185
  [_, _, 1, 1, 1, 1, _, _],
149
186
  [_, 1, 0, 0, 0, 0, 1, _],
150
187
  [1, 0, 0, 0, 0, 0, 0, 1],
151
188
  [1, 0, 0, 0, 0, 0, 0, 1],
152
189
  [_, 1, 0, 0, 0, 0, 1, _],
153
- [_, _, 1, 1, 1, 1, _, _],
154
- ], ['#4060d0', '#3040b0']);
155
- const TORSO_ARMOR_S = /* @__PURE__ */ createPartData(10, 7, [
190
+ [_, _, 1, 1, 1, 1, _, _]
191
+ ],
192
+ ["#4060d0", "#3040b0"]
193
+ );
194
+ const TORSO_ARMOR_S = /* @__PURE__ */ createPartData(
195
+ 10,
196
+ 7,
197
+ [
156
198
  [_, _, _, 1, 1, 1, 1, _, _, _],
157
199
  [_, _, 1, 0, 2, 2, 0, 1, _, _],
158
200
  [_, 1, 0, 0, 2, 2, 0, 0, 1, _],
159
201
  [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
160
202
  [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
161
203
  [_, 1, 0, 0, 0, 0, 0, 0, 1, _],
162
- [_, _, 1, 1, 1, 1, 1, 1, _, _],
163
- ], ['var(--nice-border, #c0c0c8)', '#909098', '#f0d060']);
164
- const TORSO_ROBE_S = /* @__PURE__ */ createPartData(10, 10, [
204
+ [_, _, 1, 1, 1, 1, 1, 1, _, _]
205
+ ],
206
+ ["var(--nice-border, #c0c0c8)", "#909098", "#f0d060"]
207
+ );
208
+ const TORSO_ROBE_S = /* @__PURE__ */ createPartData(
209
+ 10,
210
+ 10,
211
+ [
165
212
  [_, _, _, 1, 1, 1, 1, _, _, _],
166
213
  [_, _, 1, 0, 0, 0, 0, 1, _, _],
167
214
  [_, 1, 0, 0, 2, 2, 0, 0, 1, _],
@@ -171,40 +218,62 @@ const TORSO_ROBE_S = /* @__PURE__ */ createPartData(10, 10, [
171
218
  [1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
172
219
  [_, 1, 0, 0, 0, 0, 0, 0, 1, _],
173
220
  [_, _, 1, 0, 0, 0, 0, 1, _, _],
174
- [_, _, _, 1, 1, 1, 1, _, _, _],
175
- ], ['#8020a0', '#601080', '#f0d060']);
176
- /* ── ARMS ── */
177
- const ARM_BASIC_S = /* @__PURE__ */ createPartData(3, 5, [
221
+ [_, _, _, 1, 1, 1, 1, _, _, _]
222
+ ],
223
+ ["#8020a0", "#601080", "#f0d060"]
224
+ );
225
+ const ARM_BASIC_S = /* @__PURE__ */ createPartData(
226
+ 3,
227
+ 5,
228
+ [
178
229
  [_, 0, _],
179
230
  [0, 0, 1],
180
231
  [0, 0, 1],
181
232
  [0, 0, 1],
182
- [_, 0, _],
183
- ], ['var(--nice-warning-bg, #ffecd2)', '#c07848']);
184
- const ARM_ARMORED_S = /* @__PURE__ */ createPartData(4, 5, [
233
+ [_, 0, _]
234
+ ],
235
+ ["var(--nice-warning-bg, #ffecd2)", "#c07848"]
236
+ );
237
+ const ARM_ARMORED_S = /* @__PURE__ */ createPartData(
238
+ 4,
239
+ 5,
240
+ [
185
241
  [_, 0, 1, _],
186
242
  [0, 0, 0, 1],
187
243
  [0, 0, 0, 1],
188
244
  [0, 0, 0, 1],
189
- [_, 0, 1, _],
190
- ], ['var(--nice-border, #c0c0c8)', '#909098']);
191
- /* ── LEGS ── */
192
- const LEG_BASIC_S = /* @__PURE__ */ createPartData(3, 5, [
245
+ [_, 0, 1, _]
246
+ ],
247
+ ["var(--nice-border, #c0c0c8)", "#909098"]
248
+ );
249
+ const LEG_BASIC_S = /* @__PURE__ */ createPartData(
250
+ 3,
251
+ 5,
252
+ [
193
253
  [_, 0, _],
194
254
  [0, 0, 1],
195
255
  [0, 0, 1],
196
256
  [0, 0, 1],
197
- [0, 1, 1],
198
- ], ['#4060d0', '#3040b0']);
199
- const LEG_BOOT_S = /* @__PURE__ */ createPartData(4, 5, [
257
+ [0, 1, 1]
258
+ ],
259
+ ["#4060d0", "#3040b0"]
260
+ );
261
+ const LEG_BOOT_S = /* @__PURE__ */ createPartData(
262
+ 4,
263
+ 5,
264
+ [
200
265
  [_, 0, 0, _],
201
266
  [_, 0, 0, _],
202
267
  [_, 0, 0, _],
203
268
  [0, 0, 0, 1],
204
- [0, 0, 0, 1],
205
- ], ['#b08060', '#906840']);
206
- /* ── HATS ── */
207
- const HAT_WIZARD_S = /* @__PURE__ */ createPartData(10, 8, [
269
+ [0, 0, 0, 1]
270
+ ],
271
+ ["#b08060", "#906840"]
272
+ );
273
+ const HAT_WIZARD_S = /* @__PURE__ */ createPartData(
274
+ 10,
275
+ 8,
276
+ [
208
277
  [_, _, _, _, 0, _, _, _, _, _],
209
278
  [_, _, _, 0, 0, 0, _, _, _, _],
210
279
  [_, _, 0, 0, 0, 0, 0, _, _, _],
@@ -212,32 +281,51 @@ const HAT_WIZARD_S = /* @__PURE__ */ createPartData(10, 8, [
212
281
  [_, 0, 0, 0, 2, 0, 0, 0, _, _],
213
282
  [0, 0, 0, 0, 2, 0, 0, 0, 0, _],
214
283
  [0, 1, 1, 1, 1, 1, 1, 1, 0, _],
215
- [_, _, _, _, _, _, _, _, _, _],
216
- ], ['#8020a0', '#601080', '#f0d060']);
217
- const HAT_KNIGHT_S = /* @__PURE__ */ createPartData(10, 6, [
284
+ [_, _, _, _, _, _, _, _, _, _]
285
+ ],
286
+ ["#8020a0", "#601080", "#f0d060"]
287
+ );
288
+ const HAT_KNIGHT_S = /* @__PURE__ */ createPartData(
289
+ 10,
290
+ 6,
291
+ [
218
292
  [_, _, _, 0, 0, 0, 0, _, _, _],
219
293
  [_, _, 0, 0, 0, 0, 0, 0, _, _],
220
294
  [_, 0, 0, 0, 0, 0, 0, 0, 0, _],
221
295
  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
222
296
  [0, 0, 2, 2, 2, 2, 2, 2, 0, 0],
223
- [_, _, _, 1, 1, 1, 1, _, _, _],
224
- ], ['var(--nice-border, #c0c0c8)', '#606068', '#f0d060']);
225
- const HAT_CROWN_S = /* @__PURE__ */ createPartData(10, 5, [
297
+ [_, _, _, 1, 1, 1, 1, _, _, _]
298
+ ],
299
+ ["var(--nice-border, #c0c0c8)", "#606068", "#f0d060"]
300
+ );
301
+ const HAT_CROWN_S = /* @__PURE__ */ createPartData(
302
+ 10,
303
+ 5,
304
+ [
226
305
  [_, 2, _, _, 2, _, _, 2, _, _],
227
306
  [_, 0, 2, _, 0, _, 2, 0, _, _],
228
307
  [_, 0, 0, 2, 0, 2, 0, 0, _, _],
229
308
  [_, 0, 0, 0, 0, 0, 0, 0, _, _],
230
- [_, 1, 1, 1, 1, 1, 1, 1, _, _],
231
- ], ['#f0d060', '#d0b040', '#ff4040']);
232
- const HAT_CAP_S = /* @__PURE__ */ createPartData(9, 5, [
309
+ [_, 1, 1, 1, 1, 1, 1, 1, _, _]
310
+ ],
311
+ ["#f0d060", "#d0b040", "#ff4040"]
312
+ );
313
+ const HAT_CAP_S = /* @__PURE__ */ createPartData(
314
+ 9,
315
+ 5,
316
+ [
233
317
  [_, _, _, 0, 0, 0, _, _, _],
234
318
  [_, _, 0, 0, 0, 0, 0, _, _],
235
319
  [_, 0, 0, 0, 0, 0, 0, 0, _],
236
320
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
237
- [_, _, 1, 1, 1, 1, 1, _, _],
238
- ], ['#d04040', '#b02020']);
239
- /* ── WEAPONS ── */
240
- const WEAPON_SWORD_S = /* @__PURE__ */ createPartData(3, 10, [
321
+ [_, _, 1, 1, 1, 1, 1, _, _]
322
+ ],
323
+ ["#d04040", "#b02020"]
324
+ );
325
+ const WEAPON_SWORD_S = /* @__PURE__ */ createPartData(
326
+ 3,
327
+ 10,
328
+ [
241
329
  [_, 0, _],
242
330
  [_, 0, _],
243
331
  [_, 0, _],
@@ -247,9 +335,14 @@ const WEAPON_SWORD_S = /* @__PURE__ */ createPartData(3, 10, [
247
335
  [_, 0, _],
248
336
  [1, 1, 1],
249
337
  [_, 2, _],
250
- [_, 2, _],
251
- ], ['var(--nice-border, #c0c0c8)', '#f0d060', '#8b5e3c']);
252
- const WEAPON_STAFF_S = /* @__PURE__ */ createPartData(3, 12, [
338
+ [_, 2, _]
339
+ ],
340
+ ["var(--nice-border, #c0c0c8)", "#f0d060", "#8b5e3c"]
341
+ );
342
+ const WEAPON_STAFF_S = /* @__PURE__ */ createPartData(
343
+ 3,
344
+ 12,
345
+ [
253
346
  [_, 1, _],
254
347
  [1, 1, 1],
255
348
  [_, 1, _],
@@ -261,9 +354,14 @@ const WEAPON_STAFF_S = /* @__PURE__ */ createPartData(3, 12, [
261
354
  [_, 0, _],
262
355
  [_, 0, _],
263
356
  [_, 0, _],
264
- [_, 0, _],
265
- ], ['#8b5e3c', '#4080e0']);
266
- const WEAPON_BOW_S = /* @__PURE__ */ createPartData(5, 10, [
357
+ [_, 0, _]
358
+ ],
359
+ ["#8b5e3c", "#4080e0"]
360
+ );
361
+ const WEAPON_BOW_S = /* @__PURE__ */ createPartData(
362
+ 5,
363
+ 10,
364
+ [
267
365
  [_, _, _, 0, _],
268
366
  [_, _, 0, _, 1],
269
367
  [_, 0, _, _, 1],
@@ -273,441 +371,450 @@ const WEAPON_BOW_S = /* @__PURE__ */ createPartData(5, 10, [
273
371
  [0, _, _, _, 1],
274
372
  [_, 0, _, _, 1],
275
373
  [_, _, 0, _, 1],
276
- [_, _, _, 0, _],
277
- ], ['#8b5e3c', 'var(--nice-border, #c0c0c8)']);
278
- const SHIELD_ROUND_S = /* @__PURE__ */ createPartData(6, 7, [
374
+ [_, _, _, 0, _]
375
+ ],
376
+ ["#8b5e3c", "var(--nice-border, #c0c0c8)"]
377
+ );
378
+ const SHIELD_ROUND_S = /* @__PURE__ */ createPartData(
379
+ 6,
380
+ 7,
381
+ [
279
382
  [_, _, 1, 1, _, _],
280
383
  [_, 1, 0, 0, 1, _],
281
384
  [1, 0, 0, 2, 0, 1],
282
385
  [1, 0, 2, 2, 0, 1],
283
386
  [1, 0, 0, 2, 0, 1],
284
387
  [_, 1, 0, 0, 1, _],
285
- [_, _, 1, 1, _, _],
286
- ], ['var(--nice-border, #c0c0c8)', '#909098', '#f0d060']);
287
- /* ════════════════════════════════════════════════════════════════
288
- REGISTER ALL CHARACTER PARTS
289
- ════════════════════════════════════════════════════════════════ */
388
+ [_, _, 1, 1, _, _]
389
+ ],
390
+ ["var(--nice-border, #c0c0c8)", "#909098", "#f0d060"]
391
+ );
290
392
  const CHARACTER_PARTS = [
291
- // ── Heads ──
292
- {
293
- id: 'head-round',
294
- name: 'Round Head',
295
- category: 'head',
296
- slot: 'head',
297
- anchorX: 4,
298
- anchorY: 7,
299
- zOrder: 10,
300
- tags: ['basic', 'round'],
301
- pixels: generateMirroredDirections({ S: HEAD_ROUND_S, E: HEAD_ROUND_E, N: HEAD_ROUND_N }),
302
- },
303
- {
304
- id: 'head-square',
305
- name: 'Square Head',
306
- category: 'head',
307
- slot: 'head',
308
- anchorX: 4,
309
- anchorY: 6,
310
- zOrder: 10,
311
- tags: ['basic', 'angular'],
312
- pixels: { S: HEAD_SQUARE_S },
313
- },
314
- {
315
- id: 'head-chibi',
316
- name: 'Chibi Head',
317
- category: 'head',
318
- slot: 'head',
319
- anchorX: 5,
320
- anchorY: 9,
321
- zOrder: 10,
322
- tags: ['cute', 'chibi', 'large'],
323
- pixels: { S: HEAD_CHIBI_S },
324
- },
325
- // ── Hair ──
326
- {
327
- id: 'hair-short',
328
- name: 'Short Hair',
329
- category: 'hair',
330
- slot: 'head',
331
- anchorX: 4,
332
- anchorY: 3,
333
- zOrder: 11,
334
- tags: ['basic', 'short'],
335
- pixels: { S: HAIR_SHORT_S },
336
- recolorableIndices: [0, 1],
337
- },
338
- {
339
- id: 'hair-long',
340
- name: 'Long Hair',
341
- category: 'hair',
342
- slot: 'head',
343
- anchorX: 5,
344
- anchorY: 3,
345
- zOrder: 11,
346
- tags: ['long', 'flowing'],
347
- pixels: { S: HAIR_LONG_S },
348
- recolorableIndices: [0, 1],
349
- },
350
- {
351
- id: 'hair-mohawk',
352
- name: 'Mohawk',
353
- category: 'hair',
354
- slot: 'head',
355
- anchorX: 4,
356
- anchorY: 5,
357
- zOrder: 12,
358
- tags: ['punk', 'mohawk'],
359
- pixels: { S: HAIR_MOHAWK_S },
360
- recolorableIndices: [0, 1],
361
- },
362
- {
363
- id: 'hair-ponytail',
364
- name: 'Ponytail',
365
- category: 'hair',
366
- slot: 'head',
367
- anchorX: 5,
368
- anchorY: 3,
369
- zOrder: 11,
370
- tags: ['long', 'ponytail'],
371
- pixels: { S: HAIR_PONYTAIL_S },
372
- recolorableIndices: [0, 1],
373
- },
374
- {
375
- id: 'hair-spiky',
376
- name: 'Spiky Hair',
377
- category: 'hair',
378
- slot: 'head',
379
- anchorX: 5,
380
- anchorY: 5,
381
- zOrder: 12,
382
- tags: ['spiky', 'anime'],
383
- pixels: { S: HAIR_SPIKY_S },
384
- recolorableIndices: [0, 1],
385
- },
386
- // ── Torsos ──
387
- {
388
- id: 'torso-basic',
389
- name: 'Basic Torso',
390
- category: 'torso',
391
- slot: 'torso',
392
- anchorX: 4,
393
- anchorY: 0,
394
- zOrder: 5,
395
- tags: ['basic', 'shirt'],
396
- pixels: { S: TORSO_BASIC_S },
397
- recolorableIndices: [0, 1],
398
- },
399
- {
400
- id: 'torso-armor',
401
- name: 'Armor Torso',
402
- category: 'torso',
403
- slot: 'torso',
404
- anchorX: 5,
405
- anchorY: 0,
406
- zOrder: 5,
407
- tags: ['armor', 'knight'],
408
- pixels: { S: TORSO_ARMOR_S },
409
- recolorableIndices: [0, 1, 2],
410
- },
411
- {
412
- id: 'torso-robe',
413
- name: 'Robe Torso',
414
- category: 'torso',
415
- slot: 'torso',
416
- anchorX: 5,
417
- anchorY: 0,
418
- zOrder: 5,
419
- tags: ['robe', 'wizard', 'long'],
420
- pixels: { S: TORSO_ROBE_S },
421
- recolorableIndices: [0, 1, 2],
422
- },
423
- // ── Arms ──
424
- {
425
- id: 'arm-basic',
426
- name: 'Basic Arm',
427
- category: 'arm',
428
- slot: 'leftArm',
429
- anchorX: 1,
430
- anchorY: 0,
431
- zOrder: 6,
432
- tags: ['basic', 'bare'],
433
- pixels: { S: ARM_BASIC_S },
434
- },
435
- {
436
- id: 'arm-armored',
437
- name: 'Armored Arm',
438
- category: 'arm',
439
- slot: 'leftArm',
440
- anchorX: 2,
441
- anchorY: 0,
442
- zOrder: 6,
443
- tags: ['armor', 'knight'],
444
- pixels: { S: ARM_ARMORED_S },
445
- recolorableIndices: [0, 1],
446
- },
447
- // ── Legs ──
448
- {
449
- id: 'leg-basic',
450
- name: 'Basic Leg',
451
- category: 'leg',
452
- slot: 'leftLeg',
453
- anchorX: 1,
454
- anchorY: 0,
455
- zOrder: 3,
456
- tags: ['basic', 'pants'],
457
- pixels: { S: LEG_BASIC_S },
458
- recolorableIndices: [0, 1],
459
- },
460
- {
461
- id: 'leg-boot',
462
- name: 'Boot Leg',
463
- category: 'leg',
464
- slot: 'leftLeg',
465
- anchorX: 2,
466
- anchorY: 0,
467
- zOrder: 3,
468
- tags: ['boot', 'heavy'],
469
- pixels: { S: LEG_BOOT_S },
470
- recolorableIndices: [0, 1],
471
- },
472
- // ── Hats ──
473
- {
474
- id: 'hat-wizard',
475
- name: 'Wizard Hat',
476
- category: 'hat',
477
- slot: 'head',
478
- anchorX: 5,
479
- anchorY: 7,
480
- zOrder: 13,
481
- tags: ['wizard', 'magic'],
482
- pixels: { S: HAT_WIZARD_S },
483
- recolorableIndices: [0, 1, 2],
484
- },
485
- {
486
- id: 'hat-knight',
487
- name: 'Knight Helmet',
488
- category: 'helmet',
489
- slot: 'head',
490
- anchorX: 5,
491
- anchorY: 5,
492
- zOrder: 13,
493
- tags: ['knight', 'armor'],
494
- pixels: { S: HAT_KNIGHT_S },
495
- recolorableIndices: [0, 1, 2],
496
- },
497
- {
498
- id: 'hat-crown',
499
- name: 'Crown',
500
- category: 'hat',
501
- slot: 'head',
502
- anchorX: 5,
503
- anchorY: 4,
504
- zOrder: 14,
505
- tags: ['royal', 'king'],
506
- pixels: { S: HAT_CROWN_S },
507
- recolorableIndices: [0, 1, 2],
508
- },
509
- {
510
- id: 'hat-cap',
511
- name: 'Cap',
512
- category: 'hat',
513
- slot: 'head',
514
- anchorX: 4,
515
- anchorY: 4,
516
- zOrder: 13,
517
- tags: ['casual', 'cap'],
518
- pixels: { S: HAT_CAP_S },
519
- recolorableIndices: [0, 1],
520
- },
521
- // ── Weapons ──
522
- {
523
- id: 'weapon-sword',
524
- name: 'Sword',
525
- category: 'weapon',
526
- slot: 'rightHand',
527
- anchorX: 1,
528
- anchorY: 7,
529
- zOrder: 15,
530
- tags: ['sword', 'melee'],
531
- pixels: { S: WEAPON_SWORD_S },
532
- },
533
- {
534
- id: 'weapon-staff',
535
- name: 'Staff',
536
- category: 'weapon',
537
- slot: 'rightHand',
538
- anchorX: 1,
539
- anchorY: 2,
540
- zOrder: 15,
541
- tags: ['staff', 'magic'],
542
- pixels: { S: WEAPON_STAFF_S },
543
- },
544
- {
545
- id: 'weapon-bow',
546
- name: 'Bow',
547
- category: 'weapon',
548
- slot: 'rightHand',
549
- anchorX: 0,
550
- anchorY: 5,
551
- zOrder: 15,
552
- tags: ['bow', 'ranged'],
553
- pixels: { S: WEAPON_BOW_S },
554
- },
555
- // ── Shields ──
556
- {
557
- id: 'shield-round',
558
- name: 'Round Shield',
559
- category: 'shield',
560
- slot: 'leftHand',
561
- anchorX: 3,
562
- anchorY: 3,
563
- zOrder: 7,
564
- tags: ['shield', 'defense'],
565
- pixels: { S: SHIELD_ROUND_S },
566
- recolorableIndices: [0, 1, 2],
567
- },
393
+ // ── Heads ──
394
+ {
395
+ id: "head-round",
396
+ name: "Round Head",
397
+ category: "head",
398
+ slot: "head",
399
+ anchorX: 4,
400
+ anchorY: 7,
401
+ zOrder: 10,
402
+ tags: ["basic", "round"],
403
+ pixels: generateMirroredDirections({ S: HEAD_ROUND_S, E: HEAD_ROUND_E, N: HEAD_ROUND_N })
404
+ },
405
+ {
406
+ id: "head-square",
407
+ name: "Square Head",
408
+ category: "head",
409
+ slot: "head",
410
+ anchorX: 4,
411
+ anchorY: 6,
412
+ zOrder: 10,
413
+ tags: ["basic", "angular"],
414
+ pixels: { S: HEAD_SQUARE_S }
415
+ },
416
+ {
417
+ id: "head-chibi",
418
+ name: "Chibi Head",
419
+ category: "head",
420
+ slot: "head",
421
+ anchorX: 5,
422
+ anchorY: 9,
423
+ zOrder: 10,
424
+ tags: ["cute", "chibi", "large"],
425
+ pixels: { S: HEAD_CHIBI_S }
426
+ },
427
+ // ── Hair ──
428
+ {
429
+ id: "hair-short",
430
+ name: "Short Hair",
431
+ category: "hair",
432
+ slot: "head",
433
+ anchorX: 4,
434
+ anchorY: 3,
435
+ zOrder: 11,
436
+ tags: ["basic", "short"],
437
+ pixels: { S: HAIR_SHORT_S },
438
+ recolorableIndices: [0, 1]
439
+ },
440
+ {
441
+ id: "hair-long",
442
+ name: "Long Hair",
443
+ category: "hair",
444
+ slot: "head",
445
+ anchorX: 5,
446
+ anchorY: 3,
447
+ zOrder: 11,
448
+ tags: ["long", "flowing"],
449
+ pixels: { S: HAIR_LONG_S },
450
+ recolorableIndices: [0, 1]
451
+ },
452
+ {
453
+ id: "hair-mohawk",
454
+ name: "Mohawk",
455
+ category: "hair",
456
+ slot: "head",
457
+ anchorX: 4,
458
+ anchorY: 5,
459
+ zOrder: 12,
460
+ tags: ["punk", "mohawk"],
461
+ pixels: { S: HAIR_MOHAWK_S },
462
+ recolorableIndices: [0, 1]
463
+ },
464
+ {
465
+ id: "hair-ponytail",
466
+ name: "Ponytail",
467
+ category: "hair",
468
+ slot: "head",
469
+ anchorX: 5,
470
+ anchorY: 3,
471
+ zOrder: 11,
472
+ tags: ["long", "ponytail"],
473
+ pixels: { S: HAIR_PONYTAIL_S },
474
+ recolorableIndices: [0, 1]
475
+ },
476
+ {
477
+ id: "hair-spiky",
478
+ name: "Spiky Hair",
479
+ category: "hair",
480
+ slot: "head",
481
+ anchorX: 5,
482
+ anchorY: 5,
483
+ zOrder: 12,
484
+ tags: ["spiky", "anime"],
485
+ pixels: { S: HAIR_SPIKY_S },
486
+ recolorableIndices: [0, 1]
487
+ },
488
+ // ── Torsos ──
489
+ {
490
+ id: "torso-basic",
491
+ name: "Basic Torso",
492
+ category: "torso",
493
+ slot: "torso",
494
+ anchorX: 4,
495
+ anchorY: 0,
496
+ zOrder: 5,
497
+ tags: ["basic", "shirt"],
498
+ pixels: { S: TORSO_BASIC_S },
499
+ recolorableIndices: [0, 1]
500
+ },
501
+ {
502
+ id: "torso-armor",
503
+ name: "Armor Torso",
504
+ category: "torso",
505
+ slot: "torso",
506
+ anchorX: 5,
507
+ anchorY: 0,
508
+ zOrder: 5,
509
+ tags: ["armor", "knight"],
510
+ pixels: { S: TORSO_ARMOR_S },
511
+ recolorableIndices: [0, 1, 2]
512
+ },
513
+ {
514
+ id: "torso-robe",
515
+ name: "Robe Torso",
516
+ category: "torso",
517
+ slot: "torso",
518
+ anchorX: 5,
519
+ anchorY: 0,
520
+ zOrder: 5,
521
+ tags: ["robe", "wizard", "long"],
522
+ pixels: { S: TORSO_ROBE_S },
523
+ recolorableIndices: [0, 1, 2]
524
+ },
525
+ // ── Arms ──
526
+ {
527
+ id: "arm-basic",
528
+ name: "Basic Arm",
529
+ category: "arm",
530
+ slot: "leftArm",
531
+ anchorX: 1,
532
+ anchorY: 0,
533
+ zOrder: 6,
534
+ tags: ["basic", "bare"],
535
+ pixels: { S: ARM_BASIC_S }
536
+ },
537
+ {
538
+ id: "arm-armored",
539
+ name: "Armored Arm",
540
+ category: "arm",
541
+ slot: "leftArm",
542
+ anchorX: 2,
543
+ anchorY: 0,
544
+ zOrder: 6,
545
+ tags: ["armor", "knight"],
546
+ pixels: { S: ARM_ARMORED_S },
547
+ recolorableIndices: [0, 1]
548
+ },
549
+ // ── Legs ──
550
+ {
551
+ id: "leg-basic",
552
+ name: "Basic Leg",
553
+ category: "leg",
554
+ slot: "leftLeg",
555
+ anchorX: 1,
556
+ anchorY: 0,
557
+ zOrder: 3,
558
+ tags: ["basic", "pants"],
559
+ pixels: { S: LEG_BASIC_S },
560
+ recolorableIndices: [0, 1]
561
+ },
562
+ {
563
+ id: "leg-boot",
564
+ name: "Boot Leg",
565
+ category: "leg",
566
+ slot: "leftLeg",
567
+ anchorX: 2,
568
+ anchorY: 0,
569
+ zOrder: 3,
570
+ tags: ["boot", "heavy"],
571
+ pixels: { S: LEG_BOOT_S },
572
+ recolorableIndices: [0, 1]
573
+ },
574
+ // ── Hats ──
575
+ {
576
+ id: "hat-wizard",
577
+ name: "Wizard Hat",
578
+ category: "hat",
579
+ slot: "head",
580
+ anchorX: 5,
581
+ anchorY: 7,
582
+ zOrder: 13,
583
+ tags: ["wizard", "magic"],
584
+ pixels: { S: HAT_WIZARD_S },
585
+ recolorableIndices: [0, 1, 2]
586
+ },
587
+ {
588
+ id: "hat-knight",
589
+ name: "Knight Helmet",
590
+ category: "helmet",
591
+ slot: "head",
592
+ anchorX: 5,
593
+ anchorY: 5,
594
+ zOrder: 13,
595
+ tags: ["knight", "armor"],
596
+ pixels: { S: HAT_KNIGHT_S },
597
+ recolorableIndices: [0, 1, 2]
598
+ },
599
+ {
600
+ id: "hat-crown",
601
+ name: "Crown",
602
+ category: "hat",
603
+ slot: "head",
604
+ anchorX: 5,
605
+ anchorY: 4,
606
+ zOrder: 14,
607
+ tags: ["royal", "king"],
608
+ pixels: { S: HAT_CROWN_S },
609
+ recolorableIndices: [0, 1, 2]
610
+ },
611
+ {
612
+ id: "hat-cap",
613
+ name: "Cap",
614
+ category: "hat",
615
+ slot: "head",
616
+ anchorX: 4,
617
+ anchorY: 4,
618
+ zOrder: 13,
619
+ tags: ["casual", "cap"],
620
+ pixels: { S: HAT_CAP_S },
621
+ recolorableIndices: [0, 1]
622
+ },
623
+ // ── Weapons ──
624
+ {
625
+ id: "weapon-sword",
626
+ name: "Sword",
627
+ category: "weapon",
628
+ slot: "rightHand",
629
+ anchorX: 1,
630
+ anchorY: 7,
631
+ zOrder: 15,
632
+ tags: ["sword", "melee"],
633
+ pixels: { S: WEAPON_SWORD_S }
634
+ },
635
+ {
636
+ id: "weapon-staff",
637
+ name: "Staff",
638
+ category: "weapon",
639
+ slot: "rightHand",
640
+ anchorX: 1,
641
+ anchorY: 2,
642
+ zOrder: 15,
643
+ tags: ["staff", "magic"],
644
+ pixels: { S: WEAPON_STAFF_S }
645
+ },
646
+ {
647
+ id: "weapon-bow",
648
+ name: "Bow",
649
+ category: "weapon",
650
+ slot: "rightHand",
651
+ anchorX: 0,
652
+ anchorY: 5,
653
+ zOrder: 15,
654
+ tags: ["bow", "ranged"],
655
+ pixels: { S: WEAPON_BOW_S }
656
+ },
657
+ // ── Shields ──
658
+ {
659
+ id: "shield-round",
660
+ name: "Round Shield",
661
+ category: "shield",
662
+ slot: "leftHand",
663
+ anchorX: 3,
664
+ anchorY: 3,
665
+ zOrder: 7,
666
+ tags: ["shield", "defense"],
667
+ pixels: { S: SHIELD_ROUND_S },
668
+ recolorableIndices: [0, 1, 2]
669
+ }
568
670
  ];
569
671
  function charAssembly(name, parts, w = 32, h = 32) {
570
- return {
571
- id: `char-${name.toLowerCase().replace(/\s+/g, '-')}`,
572
- name,
573
- parts,
574
- skeletonId: 'basic-humanoid',
575
- canvasWidth: w,
576
- canvasHeight: h,
577
- projection: 'sideView',
578
- };
672
+ return {
673
+ id: `char-${name.toLowerCase().replace(/\s+/g, "-")}`,
674
+ name,
675
+ parts,
676
+ skeletonId: "basic-humanoid",
677
+ canvasWidth: w,
678
+ canvasHeight: h,
679
+ projection: "sideView"
680
+ };
579
681
  }
580
682
  const CHARACTER_PRESETS = [
581
- {
582
- id: 'preset-warrior',
583
- name: 'Warrior',
584
- description: 'Knight with armor and sword',
585
- tags: ['knight', 'armor', 'melee'],
586
- assembly: charAssembly('Warrior', [
587
- { partId: 'leg-boot', offsetX: 10, offsetY: 24 },
588
- { partId: 'leg-boot', offsetX: 18, offsetY: 24, flipH: true },
589
- { partId: 'torso-armor', offsetX: 11, offsetY: 16 },
590
- { partId: 'arm-armored', offsetX: 7, offsetY: 17 },
591
- { partId: 'arm-armored', offsetX: 21, offsetY: 17, flipH: true },
592
- { partId: 'head-round', offsetX: 12, offsetY: 8 },
593
- { partId: 'hat-knight', offsetX: 11, offsetY: 3 },
594
- { partId: 'weapon-sword', offsetX: 24, offsetY: 12 },
595
- { partId: 'shield-round', offsetX: 3, offsetY: 16 },
596
- ]),
597
- },
598
- {
599
- id: 'preset-mage',
600
- name: 'Mage',
601
- description: 'Wizard with robe and staff',
602
- tags: ['wizard', 'magic', 'ranged'],
603
- assembly: charAssembly('Mage', [
604
- { partId: 'leg-basic', offsetX: 11, offsetY: 24 },
605
- { partId: 'leg-basic', offsetX: 18, offsetY: 24, flipH: true },
606
- { partId: 'torso-robe', offsetX: 11, offsetY: 14 },
607
- { partId: 'arm-basic', offsetX: 8, offsetY: 15 },
608
- { partId: 'arm-basic', offsetX: 22, offsetY: 15, flipH: true },
609
- { partId: 'head-round', offsetX: 12, offsetY: 6 },
610
- { partId: 'hat-wizard', offsetX: 11, offsetY: -2 },
611
- { partId: 'weapon-staff', offsetX: 24, offsetY: 6 },
612
- ]),
613
- },
614
- {
615
- id: 'preset-archer',
616
- name: 'Archer',
617
- description: 'Ranger with bow',
618
- tags: ['ranger', 'bow', 'ranged'],
619
- assembly: charAssembly('Archer', [
620
- { partId: 'leg-boot', offsetX: 10, offsetY: 24 },
621
- { partId: 'leg-boot', offsetX: 18, offsetY: 24, flipH: true },
622
- { partId: 'torso-basic', offsetX: 12, offsetY: 17 },
623
- { partId: 'arm-basic', offsetX: 9, offsetY: 18 },
624
- { partId: 'arm-basic', offsetX: 21, offsetY: 18, flipH: true },
625
- { partId: 'head-round', offsetX: 12, offsetY: 9 },
626
- { partId: 'hair-short', offsetX: 12, offsetY: 6 },
627
- { partId: 'weapon-bow', offsetX: 23, offsetY: 14 },
628
- ]),
629
- },
630
- {
631
- id: 'preset-king',
632
- name: 'King',
633
- description: 'Royal with crown and robe',
634
- tags: ['royal', 'king', 'npc'],
635
- assembly: charAssembly('King', [
636
- { partId: 'leg-basic', offsetX: 11, offsetY: 24 },
637
- { partId: 'leg-basic', offsetX: 18, offsetY: 24, flipH: true },
638
- { partId: 'torso-robe', offsetX: 11, offsetY: 14 },
639
- { partId: 'arm-basic', offsetX: 8, offsetY: 15 },
640
- { partId: 'arm-basic', offsetX: 22, offsetY: 15, flipH: true },
641
- { partId: 'head-round', offsetX: 12, offsetY: 6 },
642
- { partId: 'hat-crown', offsetX: 11, offsetY: 2 },
643
- ]),
644
- },
645
- {
646
- id: 'preset-villager',
647
- name: 'Villager',
648
- description: 'Simple villager NPC',
649
- tags: ['npc', 'villager', 'simple'],
650
- assembly: charAssembly('Villager', [
651
- { partId: 'leg-basic', offsetX: 11, offsetY: 24 },
652
- { partId: 'leg-basic', offsetX: 18, offsetY: 24, flipH: true },
653
- { partId: 'torso-basic', offsetX: 12, offsetY: 17 },
654
- { partId: 'arm-basic', offsetX: 9, offsetY: 18 },
655
- { partId: 'arm-basic', offsetX: 21, offsetY: 18, flipH: true },
656
- { partId: 'head-round', offsetX: 12, offsetY: 9 },
657
- { partId: 'hair-short', offsetX: 12, offsetY: 6 },
658
- ]),
659
- },
660
- {
661
- id: 'preset-punk',
662
- name: 'Punk',
663
- description: 'Edgy character with mohawk',
664
- tags: ['punk', 'rebellious'],
665
- assembly: charAssembly('Punk', [
666
- { partId: 'leg-boot', offsetX: 10, offsetY: 24 },
667
- { partId: 'leg-boot', offsetX: 18, offsetY: 24, flipH: true },
668
- { partId: 'torso-basic', offsetX: 12, offsetY: 17 },
669
- { partId: 'arm-basic', offsetX: 9, offsetY: 18 },
670
- { partId: 'arm-basic', offsetX: 21, offsetY: 18, flipH: true },
671
- { partId: 'head-round', offsetX: 12, offsetY: 9 },
672
- { partId: 'hair-mohawk', offsetX: 12, offsetY: 4 },
673
- ]),
674
- },
675
- {
676
- id: 'preset-chibi-hero',
677
- name: 'Chibi Hero',
678
- description: 'Cute chibi character',
679
- tags: ['chibi', 'cute', 'hero'],
680
- assembly: charAssembly('Chibi Hero', [
681
- { partId: 'leg-basic', offsetX: 11, offsetY: 26 },
682
- { partId: 'leg-basic', offsetX: 18, offsetY: 26, flipH: true },
683
- { partId: 'torso-basic', offsetX: 12, offsetY: 19 },
684
- { partId: 'arm-basic', offsetX: 9, offsetY: 20 },
685
- { partId: 'arm-basic', offsetX: 21, offsetY: 20, flipH: true },
686
- { partId: 'head-chibi', offsetX: 11, offsetY: 9 },
687
- { partId: 'hair-spiky', offsetX: 11, offsetY: 4 },
688
- { partId: 'weapon-sword', offsetX: 24, offsetY: 14 },
689
- ]),
690
- },
691
- {
692
- id: 'preset-princess',
693
- name: 'Princess',
694
- description: 'Royal princess with crown and long hair',
695
- tags: ['royal', 'princess', 'npc'],
696
- assembly: charAssembly('Princess', [
697
- { partId: 'leg-basic', offsetX: 11, offsetY: 24 },
698
- { partId: 'leg-basic', offsetX: 18, offsetY: 24, flipH: true },
699
- { partId: 'torso-robe', offsetX: 11, offsetY: 14 },
700
- { partId: 'arm-basic', offsetX: 8, offsetY: 15 },
701
- { partId: 'arm-basic', offsetX: 22, offsetY: 15, flipH: true },
702
- { partId: 'head-round', offsetX: 12, offsetY: 6 },
703
- { partId: 'hair-long', offsetX: 11, offsetY: 3 },
704
- { partId: 'hat-crown', offsetX: 11, offsetY: 2 },
705
- ]),
706
- },
683
+ {
684
+ id: "preset-warrior",
685
+ name: "Warrior",
686
+ description: "Knight with armor and sword",
687
+ tags: ["knight", "armor", "melee"],
688
+ assembly: charAssembly("Warrior", [
689
+ { partId: "leg-boot", offsetX: 10, offsetY: 24 },
690
+ { partId: "leg-boot", offsetX: 18, offsetY: 24, flipH: true },
691
+ { partId: "torso-armor", offsetX: 11, offsetY: 16 },
692
+ { partId: "arm-armored", offsetX: 7, offsetY: 17 },
693
+ { partId: "arm-armored", offsetX: 21, offsetY: 17, flipH: true },
694
+ { partId: "head-round", offsetX: 12, offsetY: 8 },
695
+ { partId: "hat-knight", offsetX: 11, offsetY: 3 },
696
+ { partId: "weapon-sword", offsetX: 24, offsetY: 12 },
697
+ { partId: "shield-round", offsetX: 3, offsetY: 16 }
698
+ ])
699
+ },
700
+ {
701
+ id: "preset-mage",
702
+ name: "Mage",
703
+ description: "Wizard with robe and staff",
704
+ tags: ["wizard", "magic", "ranged"],
705
+ assembly: charAssembly("Mage", [
706
+ { partId: "leg-basic", offsetX: 11, offsetY: 24 },
707
+ { partId: "leg-basic", offsetX: 18, offsetY: 24, flipH: true },
708
+ { partId: "torso-robe", offsetX: 11, offsetY: 14 },
709
+ { partId: "arm-basic", offsetX: 8, offsetY: 15 },
710
+ { partId: "arm-basic", offsetX: 22, offsetY: 15, flipH: true },
711
+ { partId: "head-round", offsetX: 12, offsetY: 6 },
712
+ { partId: "hat-wizard", offsetX: 11, offsetY: -2 },
713
+ { partId: "weapon-staff", offsetX: 24, offsetY: 6 }
714
+ ])
715
+ },
716
+ {
717
+ id: "preset-archer",
718
+ name: "Archer",
719
+ description: "Ranger with bow",
720
+ tags: ["ranger", "bow", "ranged"],
721
+ assembly: charAssembly("Archer", [
722
+ { partId: "leg-boot", offsetX: 10, offsetY: 24 },
723
+ { partId: "leg-boot", offsetX: 18, offsetY: 24, flipH: true },
724
+ { partId: "torso-basic", offsetX: 12, offsetY: 17 },
725
+ { partId: "arm-basic", offsetX: 9, offsetY: 18 },
726
+ { partId: "arm-basic", offsetX: 21, offsetY: 18, flipH: true },
727
+ { partId: "head-round", offsetX: 12, offsetY: 9 },
728
+ { partId: "hair-short", offsetX: 12, offsetY: 6 },
729
+ { partId: "weapon-bow", offsetX: 23, offsetY: 14 }
730
+ ])
731
+ },
732
+ {
733
+ id: "preset-king",
734
+ name: "King",
735
+ description: "Royal with crown and robe",
736
+ tags: ["royal", "king", "npc"],
737
+ assembly: charAssembly("King", [
738
+ { partId: "leg-basic", offsetX: 11, offsetY: 24 },
739
+ { partId: "leg-basic", offsetX: 18, offsetY: 24, flipH: true },
740
+ { partId: "torso-robe", offsetX: 11, offsetY: 14 },
741
+ { partId: "arm-basic", offsetX: 8, offsetY: 15 },
742
+ { partId: "arm-basic", offsetX: 22, offsetY: 15, flipH: true },
743
+ { partId: "head-round", offsetX: 12, offsetY: 6 },
744
+ { partId: "hat-crown", offsetX: 11, offsetY: 2 }
745
+ ])
746
+ },
747
+ {
748
+ id: "preset-villager",
749
+ name: "Villager",
750
+ description: "Simple villager NPC",
751
+ tags: ["npc", "villager", "simple"],
752
+ assembly: charAssembly("Villager", [
753
+ { partId: "leg-basic", offsetX: 11, offsetY: 24 },
754
+ { partId: "leg-basic", offsetX: 18, offsetY: 24, flipH: true },
755
+ { partId: "torso-basic", offsetX: 12, offsetY: 17 },
756
+ { partId: "arm-basic", offsetX: 9, offsetY: 18 },
757
+ { partId: "arm-basic", offsetX: 21, offsetY: 18, flipH: true },
758
+ { partId: "head-round", offsetX: 12, offsetY: 9 },
759
+ { partId: "hair-short", offsetX: 12, offsetY: 6 }
760
+ ])
761
+ },
762
+ {
763
+ id: "preset-punk",
764
+ name: "Punk",
765
+ description: "Edgy character with mohawk",
766
+ tags: ["punk", "rebellious"],
767
+ assembly: charAssembly("Punk", [
768
+ { partId: "leg-boot", offsetX: 10, offsetY: 24 },
769
+ { partId: "leg-boot", offsetX: 18, offsetY: 24, flipH: true },
770
+ { partId: "torso-basic", offsetX: 12, offsetY: 17 },
771
+ { partId: "arm-basic", offsetX: 9, offsetY: 18 },
772
+ { partId: "arm-basic", offsetX: 21, offsetY: 18, flipH: true },
773
+ { partId: "head-round", offsetX: 12, offsetY: 9 },
774
+ { partId: "hair-mohawk", offsetX: 12, offsetY: 4 }
775
+ ])
776
+ },
777
+ {
778
+ id: "preset-chibi-hero",
779
+ name: "Chibi Hero",
780
+ description: "Cute chibi character",
781
+ tags: ["chibi", "cute", "hero"],
782
+ assembly: charAssembly("Chibi Hero", [
783
+ { partId: "leg-basic", offsetX: 11, offsetY: 26 },
784
+ { partId: "leg-basic", offsetX: 18, offsetY: 26, flipH: true },
785
+ { partId: "torso-basic", offsetX: 12, offsetY: 19 },
786
+ { partId: "arm-basic", offsetX: 9, offsetY: 20 },
787
+ { partId: "arm-basic", offsetX: 21, offsetY: 20, flipH: true },
788
+ { partId: "head-chibi", offsetX: 11, offsetY: 9 },
789
+ { partId: "hair-spiky", offsetX: 11, offsetY: 4 },
790
+ { partId: "weapon-sword", offsetX: 24, offsetY: 14 }
791
+ ])
792
+ },
793
+ {
794
+ id: "preset-princess",
795
+ name: "Princess",
796
+ description: "Royal princess with crown and long hair",
797
+ tags: ["royal", "princess", "npc"],
798
+ assembly: charAssembly("Princess", [
799
+ { partId: "leg-basic", offsetX: 11, offsetY: 24 },
800
+ { partId: "leg-basic", offsetX: 18, offsetY: 24, flipH: true },
801
+ { partId: "torso-robe", offsetX: 11, offsetY: 14 },
802
+ { partId: "arm-basic", offsetX: 8, offsetY: 15 },
803
+ { partId: "arm-basic", offsetX: 22, offsetY: 15, flipH: true },
804
+ { partId: "head-round", offsetX: 12, offsetY: 6 },
805
+ { partId: "hair-long", offsetX: 11, offsetY: 3 },
806
+ { partId: "hat-crown", offsetX: 11, offsetY: 2 }
807
+ ])
808
+ }
707
809
  ];
708
- /** Initialize: register all character parts */
709
810
  function initCharacterParts() {
710
- registerParts(CHARACTER_PARTS);
811
+ registerParts(CHARACTER_PARTS);
711
812
  }
712
-
713
- export { CHARACTER_PARTS, CHARACTER_PRESETS, CLOTHING_PALETTES, HAIR_PALETTES, SKIN_PALETTES, initCharacterParts };
813
+ export {
814
+ CHARACTER_PARTS,
815
+ CHARACTER_PRESETS,
816
+ CLOTHING_PALETTES,
817
+ HAIR_PALETTES,
818
+ SKIN_PALETTES,
819
+ initCharacterParts
820
+ };