@datamoc/mw_games 0.38.0 → 0.39.1

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 (90) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/api-surface.json +500 -2
  3. package/dist/assets/SvgParts.d.ts +31 -0
  4. package/dist/assets/SvgParts.d.ts.map +1 -0
  5. package/dist/assets/SvgParts.js +54 -0
  6. package/dist/assets/SvgParts.js.map +1 -0
  7. package/dist/assets/SvgSource.d.ts +3 -0
  8. package/dist/assets/SvgSource.d.ts.map +1 -0
  9. package/dist/assets/SvgSource.js +22 -0
  10. package/dist/assets/SvgSource.js.map +1 -0
  11. package/dist/assets/index.d.ts +2 -0
  12. package/dist/assets/index.d.ts.map +1 -1
  13. package/dist/assets/index.js +1 -0
  14. package/dist/assets/index.js.map +1 -1
  15. package/dist/assets/svg.d.ts.map +1 -1
  16. package/dist/assets/svg.js +9 -5
  17. package/dist/assets/svg.js.map +1 -1
  18. package/dist/mw_games.global.js +110 -110
  19. package/dist/mwl/presentation.d.ts.map +1 -1
  20. package/dist/mwl/presentation.js +25 -18
  21. package/dist/mwl/presentation.js.map +1 -1
  22. package/dist/physics/PhysicsWorld.d.ts +49 -17
  23. package/dist/physics/PhysicsWorld.d.ts.map +1 -1
  24. package/dist/physics/PhysicsWorld.js +297 -59
  25. package/dist/physics/PhysicsWorld.js.map +1 -1
  26. package/dist/physics/XpbdWorld.d.ts +1 -1
  27. package/dist/physics/XpbdWorld.js +1 -1
  28. package/dist/physics/cloth/index.d.ts +98 -0
  29. package/dist/physics/cloth/index.d.ts.map +1 -0
  30. package/dist/physics/cloth/index.js +207 -0
  31. package/dist/physics/cloth/index.js.map +1 -0
  32. package/dist/physics/index.d.ts +4 -0
  33. package/dist/physics/index.d.ts.map +1 -1
  34. package/dist/physics/index.js +2 -0
  35. package/dist/physics/index.js.map +1 -1
  36. package/dist/physics/spring/index.d.ts +90 -0
  37. package/dist/physics/spring/index.d.ts.map +1 -0
  38. package/dist/physics/spring/index.js +97 -0
  39. package/dist/physics/spring/index.js.map +1 -0
  40. package/dist/skeleton/index.d.ts +94 -13
  41. package/dist/skeleton/index.d.ts.map +1 -1
  42. package/dist/skeleton/index.js +192 -73
  43. package/dist/skeleton/index.js.map +1 -1
  44. package/dist/two-d/presentation/MwlPresentation.d.ts +12 -0
  45. package/dist/two-d/presentation/MwlPresentation.d.ts.map +1 -1
  46. package/dist/two-d/presentation/MwlPresentation.js +204 -153
  47. package/dist/two-d/presentation/MwlPresentation.js.map +1 -1
  48. package/dist/two-d/render/ClothSprite.d.ts +83 -0
  49. package/dist/two-d/render/ClothSprite.d.ts.map +1 -0
  50. package/dist/two-d/render/ClothSprite.js +105 -0
  51. package/dist/two-d/render/ClothSprite.js.map +1 -0
  52. package/dist/two-d/render/HazeLayer.d.ts +112 -0
  53. package/dist/two-d/render/HazeLayer.d.ts.map +1 -0
  54. package/dist/two-d/render/HazeLayer.js +185 -0
  55. package/dist/two-d/render/HazeLayer.js.map +1 -0
  56. package/dist/two-d/render/NeonGlow.d.ts +100 -0
  57. package/dist/two-d/render/NeonGlow.d.ts.map +1 -0
  58. package/dist/two-d/render/NeonGlow.js +183 -0
  59. package/dist/two-d/render/NeonGlow.js.map +1 -0
  60. package/dist/two-d/render/SkeletalSprite.d.ts +5 -2
  61. package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
  62. package/dist/two-d/render/SkeletalSprite.js +27 -3
  63. package/dist/two-d/render/SkeletalSprite.js.map +1 -1
  64. package/dist/two-d/render/SpringSprite.d.ts +40 -0
  65. package/dist/two-d/render/SpringSprite.d.ts.map +1 -0
  66. package/dist/two-d/render/SpringSprite.js +39 -0
  67. package/dist/two-d/render/SpringSprite.js.map +1 -0
  68. package/dist/two-d/render/SpriteDeform.d.ts +156 -0
  69. package/dist/two-d/render/SpriteDeform.d.ts.map +1 -0
  70. package/dist/two-d/render/SpriteDeform.js +278 -0
  71. package/dist/two-d/render/SpriteDeform.js.map +1 -0
  72. package/dist/two-d/render/SvgSkeleton.d.ts +54 -0
  73. package/dist/two-d/render/SvgSkeleton.d.ts.map +1 -0
  74. package/dist/two-d/render/SvgSkeleton.js +112 -0
  75. package/dist/two-d/render/SvgSkeleton.js.map +1 -0
  76. package/dist/two-d/render/index.d.ts +12 -0
  77. package/dist/two-d/render/index.d.ts.map +1 -1
  78. package/dist/two-d/render/index.js +6 -0
  79. package/dist/two-d/render/index.js.map +1 -1
  80. package/dist/version.d.ts +1 -1
  81. package/dist/version.js +1 -1
  82. package/package.json +9 -7
  83. package/sbom.cdx.json +6 -58
  84. package/tools/asset-report.d.mts +37 -0
  85. package/tools/asset-report.mjs +157 -0
  86. package/tools/compile-resources.d.mts +2 -0
  87. package/tools/compile-resources.mjs +23 -2
  88. package/tools/emit-page.d.mts +2 -0
  89. package/tools/emit-page.mjs +11 -1
  90. package/tools/vite.mjs +4 -1
@@ -0,0 +1,112 @@
1
+ import { readSvgSource } from '../../assets/SvgSource.js';
2
+ import { loadSvgParts } from '../../assets/SvgParts.js';
3
+ import { resolve } from '../../skeleton/index.js';
4
+ import { SkeletalSprite } from './SkeletalSprite.js';
5
+ /**
6
+ * Load authored SVG limbs, normalize each around its pivot, and bind them to a skeleton.
7
+ * Uses SVG data-pivot-x / data-pivot-y attributes or pivots supplied by the game. Art is
8
+ * rotated back from its rest angle before rasterization, so rest poses reconstruct the drawing
9
+ * and posed limbs turn around their joints. Separately bound descendant groups are removed
10
+ * from parent parts, avoiding duplicate limbs; ancestor transforms and shared defs/styles survive.
11
+ * Requires browser DOMParser and XMLSerializer. Compiled asset paths work directly under file://.
12
+ * @example
13
+ * ```ts
14
+ * import { create } from '@datamoc/mw_games/skeleton';
15
+ * import { loadSvgSkeleton } from '@datamoc/mw_games/two-d/render';
16
+ * import { releaseSvgParts } from '@datamoc/mw_games/assets';
17
+ * const loaded = await loadSvgSkeleton('<svg xmlns="http://www.w3.org/2000/svg" width="30" height="10"><g id="arm" data-pivot-x="0" data-pivot-y="5"><rect width="30" height="10"/></g></svg>', {
18
+ * skeleton: create([{ name: 'arm', length: 30, origin: { x: 0, y: 5 } }]), resolution: 2,
19
+ * });
20
+ * loaded.sprite.apply({ arm: 45 });
21
+ * loaded.sprite.destroy({ children: true });
22
+ * await releaseSvgParts(loaded.textures);
23
+ * ```
24
+ */
25
+ export async function loadSvgSkeleton(source, options) {
26
+ if (options.mixer && options.mixer.skeleton !== options.skeleton)
27
+ throw new Error('SVG skeleton mixer must use the supplied skeleton');
28
+ const text = await readSvgSource(source);
29
+ const document = new DOMParser().parseFromString(text, 'image/svg+xml');
30
+ const root = document.documentElement;
31
+ if (document.querySelector('parsererror') || root.localName !== 'svg')
32
+ throw new Error('SVG skeleton needs a valid svg root');
33
+ const viewBox = root
34
+ .getAttribute('viewBox')
35
+ ?.trim()
36
+ .split(/[\s,]+/)
37
+ .map(Number) ?? [0, 0, Number(root.getAttribute('width')), Number(root.getAttribute('height'))];
38
+ if (viewBox.length !== 4 || !viewBox.every(Number.isFinite) || viewBox[2] <= 0 || viewBox[3] <= 0)
39
+ throw new Error('SVG skeleton needs a finite viewBox or positive numeric width and height');
40
+ const groups = new Map();
41
+ for (const group of root.querySelectorAll('g[id]')) {
42
+ if (groups.has(group.id))
43
+ throw new Error(`duplicate SVG skeleton group ${group.id}`);
44
+ groups.set(group.id, group);
45
+ }
46
+ const rest = new Map(resolve(options.skeleton).map((bone) => [bone.name, bone]));
47
+ const bindings = options.bindings ?? [...groups.keys()].filter((name) => rest.has(name)).map((bone) => ({ bone }));
48
+ if (!bindings.length)
49
+ throw new Error('SVG skeleton found no matching bone groups');
50
+ const selected = new Set(bindings.map((binding) => binding.group ?? binding.bone));
51
+ const bones = new Set();
52
+ const sources = [];
53
+ const serializer = new XMLSerializer();
54
+ for (const binding of bindings) {
55
+ const id = binding.group ?? binding.bone;
56
+ if (bones.has(binding.bone))
57
+ throw new Error(`duplicate SVG binding for bone ${binding.bone}`);
58
+ bones.add(binding.bone);
59
+ const bone = rest.get(binding.bone);
60
+ if (!bone)
61
+ throw new Error(`SVG binding names no bone ${binding.bone}`);
62
+ const group = groups.get(id);
63
+ if (!group)
64
+ throw new Error(`SVG skeleton missing group ${id}`);
65
+ const pivot = binding.pivot ??
66
+ options.pivots?.[id] ?? {
67
+ x: group.hasAttribute('data-pivot-x') ? Number(group.getAttribute('data-pivot-x')) : NaN,
68
+ y: group.hasAttribute('data-pivot-y') ? Number(group.getAttribute('data-pivot-y')) : NaN,
69
+ };
70
+ const rotation = binding.rotation ?? bone.angle;
71
+ if (![pivot.x, pivot.y, rotation].every(Number.isFinite))
72
+ throw new Error(`SVG skeleton group ${id} needs a finite pivot and rest angle`);
73
+ const farX = Math.max(Math.abs(viewBox[0] - pivot.x), Math.abs(viewBox[0] + viewBox[2] - pivot.x));
74
+ const farY = Math.max(Math.abs(viewBox[1] - pivot.y), Math.abs(viewBox[1] + viewBox[3] - pivot.y));
75
+ const radius = Math.ceil(Math.hypot(farX, farY)) + 1;
76
+ const isolated = root.cloneNode(false);
77
+ isolated.setAttribute('viewBox', `${-radius} ${-radius} ${radius * 2} ${radius * 2}`);
78
+ isolated.setAttribute('width', String(radius * 2));
79
+ isolated.setAttribute('height', String(radius * 2));
80
+ for (const shared of root.querySelectorAll('defs, style'))
81
+ isolated.appendChild(shared.cloneNode(true));
82
+ const drawing = group.cloneNode(true);
83
+ for (const descendant of drawing.querySelectorAll('g[id]'))
84
+ if (selected.has(descendant.id))
85
+ descendant.remove();
86
+ let wrapped = drawing;
87
+ for (let ancestor = group.parentElement; ancestor && ancestor !== root; ancestor = ancestor.parentElement) {
88
+ const wrapper = ancestor.cloneNode(false);
89
+ wrapper.appendChild(wrapped);
90
+ wrapped = wrapper;
91
+ }
92
+ const centered = document.createElementNS(root.namespaceURI, 'g');
93
+ centered.setAttribute('id', 'mwg-part');
94
+ centered.setAttribute('transform', `rotate(${-rotation}) translate(${-pivot.x} ${-pivot.y})`);
95
+ centered.appendChild(wrapped);
96
+ isolated.appendChild(centered);
97
+ sources.push({ bone: binding.bone, svg: serializer.serializeToString(isolated) });
98
+ }
99
+ const textures = Object.create(null);
100
+ // All authoring errors above fail before loading textures or allocating display objects.
101
+ for (const part of sources)
102
+ textures[part.bone] = (await loadSvgParts(part.svg, { resolution: options.resolution }))['mwg-part'];
103
+ const sprite = new SkeletalSprite(options.skeleton, options.mixer);
104
+ for (const part of sources) {
105
+ const member = sprite.bind(part.bone, textures[part.bone]);
106
+ member.anchor.set(0.5);
107
+ member.label = part.bone;
108
+ }
109
+ sprite.apply({});
110
+ return { sprite, textures: Object.freeze(textures) };
111
+ }
112
+ //# sourceMappingURL=SvgSkeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SvgSkeleton.js","sourceRoot":"","sources":["../../../src/two-d/render/SvgSkeleton.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ export type { ChannelSource, ImageModifier, ImageTextureProbe, ParsedImagePath,
6
6
  export { AnimatedSprite, Animation } from './AnimatedSprite.ts';
7
7
  export type { AnimationFrame, AnimationFrameInput, AnimationOptions } from './AnimatedSprite.ts';
8
8
  export { SpriteGroup, isOnScreen } from './SpriteGroup.ts';
9
+ export { PinnedDeform, DeformableSprite } from './SpriteDeform.ts';
10
+ export type { DeformPoint, PinnedDeformOptions, DeformableSpriteOptions } from './SpriteDeform.ts';
9
11
  export { SkeletalSprite, ArticulatedChain, ChainRig } from './SkeletalSprite.ts';
10
12
  export type { ChainOptions } from './SkeletalSprite.ts';
11
13
  export type { SpriteGroupMember } from './SpriteGroup.ts';
@@ -47,6 +49,14 @@ export { StatusVisuals } from './StatusVisuals.ts';
47
49
  export type { TintTarget, StatusVisualStyle, StatusVisualsOptions } from './StatusVisuals.ts';
48
50
  export { SpriteMotion } from './SpriteMotion.ts';
49
51
  export type { MotionTarget, MotionHandle, SpriteMotionOptions } from './SpriteMotion.ts';
52
+ export { ClothSprite } from './ClothSprite.ts';
53
+ export type { ClothSpriteOptions } from './ClothSprite.ts';
54
+ export { SpringSprite } from './SpringSprite.ts';
55
+ export type { SpringSpriteOptions } from './SpringSprite.ts';
56
+ export { HazeLayer, hazeField, paintHazePixels } from './HazeLayer.ts';
57
+ export type { HazeLayerOptions, HazePaint } from './HazeLayer.ts';
58
+ export { NeonGlow, glowFalloff, paintGlowPixels } from './NeonGlow.ts';
59
+ export type { NeonGlowOptions, GlowPaint } from './NeonGlow.ts';
50
60
  export { blobIndex, autotileFrames, BLOB_SHAPES } from './Autotile.ts';
51
61
  export type { NeighborMask } from './Autotile.ts';
52
62
  export { RpgmAutotileAtlas, rpgmAutotileFrame, rpgmAutotileSlot, xpAutotileRef, xpAutotilePattern, assertAutotileLayout, autotileCellParts, rpgmTableEdgeCells, RPGM_AUTOTILE_SLOT_BASES, RPGM_AUTOTILE_SLOT_COUNTS, RPGM_FLOOR_AUTOTILE_TABLE, RPGM_WALL_AUTOTILE_TABLE, XP_AUTOTILE_PATTERNS, XP_NEIGHBORS_TO_PATTERN, } from './RpgmAutotile.ts';
@@ -64,4 +74,6 @@ export { paletteRangeMapping, recolorTexture, remapPixels, withTextureCanvas } f
64
74
  export type { PaletteMapping, PaletteRange, PaletteRemapMode, RecolorProbe, RemapCanvas, RemapCanvasContext, } from './PaletteRemap.ts';
65
75
  export { loadTiledMap } from './TiledMap.ts';
66
76
  export type { TiledMapData, TiledTilesetData, TilesetSheet, LoadedTiledMap, TiledObject, TiledLayer, } from './TiledMap.ts';
77
+ export { loadSvgSkeleton } from './SvgSkeleton.ts';
78
+ export type { SvgBoneBinding, SvgSkeletonOptions, LoadedSvgSkeleton } from './SvgSkeleton.ts';
67
79
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export { TintedSprite, registerColorTransform } from './TintedSprite.js';
3
3
  export { applyAllImageModifiers, applyImageModifiers, applyTextureModifiers, blendMatrix, blendPixels, channelScaleMatrix, channelSwapMatrix, colorShiftMatrix, croppedTexture, imageModifier, maskPixels, parseColorPairs, parseImagePath, parsePaletteLists, parseRotateMode, rotatePixels, spriteColorMatrix, } from './ImageModifiers.js';
4
4
  export { AnimatedSprite, Animation } from './AnimatedSprite.js';
5
5
  export { SpriteGroup, isOnScreen } from './SpriteGroup.js';
6
+ export { PinnedDeform, DeformableSprite } from './SpriteDeform.js';
6
7
  export { SkeletalSprite, ArticulatedChain, ChainRig } from './SkeletalSprite.js';
7
8
  export { SpriteSheet } from './SpriteSheet.js';
8
9
  export { Camera, createCamera, snapZoom } from './Camera.js';
@@ -24,6 +25,10 @@ export { ScreenEffects } from './ScreenEffects.js';
24
25
  export { ActorAnimator } from './ActorAnimator.js';
25
26
  export { StatusVisuals } from './StatusVisuals.js';
26
27
  export { SpriteMotion } from './SpriteMotion.js';
28
+ export { ClothSprite } from './ClothSprite.js';
29
+ export { SpringSprite } from './SpringSprite.js';
30
+ export { HazeLayer, hazeField, paintHazePixels } from './HazeLayer.js';
31
+ export { NeonGlow, glowFalloff, paintGlowPixels } from './NeonGlow.js';
27
32
  export { blobIndex, autotileFrames, BLOB_SHAPES } from './Autotile.js';
28
33
  export { RpgmAutotileAtlas, rpgmAutotileFrame, rpgmAutotileSlot, xpAutotileRef, xpAutotilePattern, assertAutotileLayout, autotileCellParts, rpgmTableEdgeCells, RPGM_AUTOTILE_SLOT_BASES, RPGM_AUTOTILE_SLOT_COUNTS, RPGM_FLOOR_AUTOTILE_TABLE, RPGM_WALL_AUTOTILE_TABLE, XP_AUTOTILE_PATTERNS, XP_NEIGHBORS_TO_PATTERN, } from './RpgmAutotile.js';
29
34
  export { hexRotate, matchTerrainRule, resolveTerrainGraphics, squareRotate } from './TerrainGraphics.js';
@@ -33,4 +38,5 @@ export { Container2D, Rectangle2D, Texture2D, rectOf } from './Types2D.js';
33
38
  export { Node2D, Shape2D, Text2D, Sprite2D, TiledSprite, Gradient, createLayers } from './Shape2D.js';
34
39
  export { paletteRangeMapping, recolorTexture, remapPixels, withTextureCanvas } from './PaletteRemap.js';
35
40
  export { loadTiledMap } from './TiledMap.js';
41
+ export { loadSvgSkeleton } from './SvgSkeleton.js';
36
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/render/index.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -9,5 +9,5 @@
9
9
  * this from `package.json` automatically, chosen because this project's own build already
10
10
  * has no step before `tsc`/`vite` that this would need to run ahead of.
11
11
  */
12
- export declare const version = "0.38.0";
12
+ export declare const version = "0.39.1";
13
13
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -9,5 +9,5 @@
9
9
  * this from `package.json` automatically, chosen because this project's own build already
10
10
  * has no step before `tsc`/`vite` that this would need to run ahead of.
11
11
  */
12
- export const version = '0.38.0';
12
+ export const version = '0.39.1';
13
13
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datamoc/mw_games",
3
- "version": "0.38.0",
3
+ "version": "0.39.1",
4
4
  "description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
5
5
  "license": "MPL-2.0",
6
6
  "repository": {
@@ -35,6 +35,7 @@
35
35
  ],
36
36
  "bin": {
37
37
  "mwg-bench": "tools/benchmark-browser.mjs",
38
+ "mwg-assets": "tools/asset-report.mjs",
38
39
  "mwg-audit-adoptions": "tools/audit-adoptions.mjs",
39
40
  "mwg-emit": "tools/emit-page.mjs",
40
41
  "mwg-extract-rgssad": "tools/extract-rgssad.mjs",
@@ -58,6 +59,8 @@
58
59
  "dist",
59
60
  "tools/compile-resources.mjs",
60
61
  "tools/compile-resources.d.mts",
62
+ "tools/asset-report.mjs",
63
+ "tools/asset-report.d.mts",
61
64
  "tools/webp-convert.mjs",
62
65
  "tools/webp-convert.d.mts",
63
66
  "tools/extract-html.mjs",
@@ -225,6 +228,7 @@
225
228
  },
226
229
  "./tools/benchmark-browser": "./tools/benchmark-browser.mjs",
227
230
  "./tools/audit-adoptions": "./tools/audit-adoptions.mjs",
231
+ "./tools/asset-report": "./tools/asset-report.mjs",
228
232
  "./tools/browser-driver": "./tools/browser-driver.mjs",
229
233
  "./tools/benchmark-history": "./tools/benchmark-history.mjs",
230
234
  "./tools/browser-smoke": "./tools/browser-smoke.mjs",
@@ -328,6 +332,10 @@
328
332
  "example:multi-turn-beam:build": "vite build --config examples/multi-turn-beam/vite.config.ts && node tools/emit-page.mjs examples/multi-turn-beam --assets=examples/assets",
329
333
  "example:chess": "vite --config examples/chess/vite.config.ts",
330
334
  "example:chess:build": "vite build --config examples/chess/vite.config.ts && node tools/emit-page.mjs examples/chess --assets=examples/assets",
335
+ "example:cloth": "vite --config examples/cloth/vite.config.ts",
336
+ "example:cloth:build": "vite build --config examples/cloth/vite.config.ts && node tools/emit-page.mjs examples/cloth --assets=examples/assets",
337
+ "example:spring": "vite --config examples/spring/vite.config.ts",
338
+ "example:spring:build": "vite build --config examples/spring/vite.config.ts && node tools/emit-page.mjs examples/spring --assets=examples/assets",
331
339
  "example:tower-defense": "vite --config examples/tower-defense/vite.config.ts",
332
340
  "example:tower-defense:build": "vite build --config examples/tower-defense/vite.config.ts && node tools/emit-page.mjs examples/tower-defense --assets=examples/assets",
333
341
  "example:3d": "vite --config examples/three-d/vite.config.ts",
@@ -399,7 +407,6 @@
399
407
  "@babylonjs/core": "^9.25.0",
400
408
  "@babylonjs/loaders": "^9.25.0",
401
409
  "@capacitor/core": "^8.5.2",
402
- "matter-js": "^0.20.0",
403
410
  "pixi.js": "^8.20.1",
404
411
  "playwright-core": "^1.62.1",
405
412
  "ws": "^8.21.3"
@@ -422,9 +429,6 @@
422
429
  },
423
430
  "ws": {
424
431
  "optional": true
425
- },
426
- "matter-js": {
427
- "optional": true
428
432
  }
429
433
  },
430
434
  "devDependencies": {
@@ -434,10 +438,8 @@
434
438
  "@capacitor/cli": "^8.5.2",
435
439
  "@capacitor/core": "^8.5.2",
436
440
  "@capacitor/ios": "^8.5.2",
437
- "@types/matter-js": "^0.20.2",
438
441
  "@types/node": "^26.4.1",
439
442
  "@types/ws": "^8.18.1",
440
- "matter-js": "^0.20.0",
441
443
  "multithreading": "^0.3.52",
442
444
  "pixi.js": "^8.20.1",
443
445
  "playwright-core": "^1.62.1",
package/sbom.cdx.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:53986a29-5c37-578e-bb00-52dad3cade61",
4
+ "serialNumber": "urn:uuid:87d5da55-61f5-526f-9055-cdcdd6680517",
5
5
  "version": 1,
6
6
  "metadata": {
7
7
  "tools": {
@@ -10,16 +10,16 @@
10
10
  "type": "application",
11
11
  "group": "datamoc",
12
12
  "name": "tools/sbom.mjs",
13
- "version": "0.38.0"
13
+ "version": "0.39.1"
14
14
  }
15
15
  ]
16
16
  },
17
17
  "component": {
18
18
  "type": "library",
19
- "bom-ref": "pkg:npm/%40datamoc/mw_games@0.38.0",
19
+ "bom-ref": "pkg:npm/%40datamoc/mw_games@0.39.1",
20
20
  "name": "@datamoc/mw_games",
21
- "version": "0.38.0",
22
- "purl": "pkg:npm/%40datamoc/mw_games@0.38.0",
21
+ "version": "0.39.1",
22
+ "purl": "pkg:npm/%40datamoc/mw_games@0.39.1",
23
23
  "description": "A local-file game framework: renderer-free game logic, drawn through PixiJS in 2D or Babylon.js in 3D, with mobile and desktop packaging.",
24
24
  "licenses": [
25
25
  {
@@ -1375,27 +1375,6 @@
1375
1375
  }
1376
1376
  ]
1377
1377
  },
1378
- {
1379
- "type": "library",
1380
- "bom-ref": "pkg:npm/%40types/matter-js@0.20.2",
1381
- "name": "@types/matter-js",
1382
- "version": "0.20.2",
1383
- "purl": "pkg:npm/%40types/matter-js@0.20.2",
1384
- "scope": "excluded",
1385
- "hashes": [
1386
- {
1387
- "alg": "SHA-512",
1388
- "content": "dcf3cacb7431bd9f3d87dfb0741576e3cf08d492d5b3b0c4a4890fbe03bc242d6651d89548edfb648bd572d3930fb848abc3802f6809dee8064ae522a7a0e10b"
1389
- }
1390
- ],
1391
- "licenses": [
1392
- {
1393
- "license": {
1394
- "id": "MIT"
1395
- }
1396
- }
1397
- ]
1398
- },
1399
1378
  {
1400
1379
  "type": "library",
1401
1380
  "bom-ref": "pkg:npm/%40types/node@26.6.5",
@@ -3181,27 +3160,6 @@
3181
3160
  }
3182
3161
  ]
3183
3162
  },
3184
- {
3185
- "type": "library",
3186
- "bom-ref": "pkg:npm/matter-js@0.20.0",
3187
- "name": "matter-js",
3188
- "version": "0.20.0",
3189
- "purl": "pkg:npm/matter-js@0.20.0",
3190
- "scope": "excluded",
3191
- "hashes": [
3192
- {
3193
- "alg": "SHA-512",
3194
- "content": "882f5f611ef3553dc7a69367b05b29f573a841d40ddad5327da2a0e021cb1fc6cdfa3e864f81b0ec81f6acfd2d7e501e6eb1c5c3bdf4451dc3915499457f21c0"
3195
- }
3196
- ],
3197
- "licenses": [
3198
- {
3199
- "license": {
3200
- "id": "MIT"
3201
- }
3202
- }
3203
- ]
3204
- },
3205
3163
  {
3206
3164
  "type": "library",
3207
3165
  "bom-ref": "pkg:npm/minimatch@10.2.6",
@@ -4643,7 +4601,7 @@
4643
4601
  ]
4644
4602
  },
4645
4603
  {
4646
- "ref": "pkg:npm/%40datamoc/mw_games@0.38.0",
4604
+ "ref": "pkg:npm/%40datamoc/mw_games@0.39.1",
4647
4605
  "dependsOn": [
4648
4606
  "pkg:npm/%40babylonjs/core@9.30.0",
4649
4607
  "pkg:npm/%40babylonjs/loaders@9.30.0",
@@ -4652,11 +4610,9 @@
4652
4610
  "pkg:npm/%40capacitor/core@8.5.3",
4653
4611
  "pkg:npm/%40capacitor/ios@8.5.3",
4654
4612
  "pkg:npm/%40datamoc/pyroeis@0.9.0",
4655
- "pkg:npm/%40types/matter-js@0.20.2",
4656
4613
  "pkg:npm/%40types/node@26.6.5",
4657
4614
  "pkg:npm/%40types/ws@8.18.2",
4658
4615
  "pkg:npm/json5@2.2.3",
4659
- "pkg:npm/matter-js@0.20.0",
4660
4616
  "pkg:npm/multithreading@0.3.52",
4661
4617
  "pkg:npm/pixi.js@8.22.0",
4662
4618
  "pkg:npm/playwright-core@1.64.0",
@@ -4980,10 +4936,6 @@
4980
4936
  "pkg:npm/%40types/node@26.6.5"
4981
4937
  ]
4982
4938
  },
4983
- {
4984
- "ref": "pkg:npm/%40types/matter-js@0.20.2",
4985
- "dependsOn": []
4986
- },
4987
4939
  {
4988
4940
  "ref": "pkg:npm/%40types/node@26.6.5",
4989
4941
  "dependsOn": [
@@ -5385,10 +5337,6 @@
5385
5337
  "ref": "pkg:npm/lru-cache@11.5.3",
5386
5338
  "dependsOn": []
5387
5339
  },
5388
- {
5389
- "ref": "pkg:npm/matter-js@0.20.0",
5390
- "dependsOn": []
5391
- },
5392
5340
  {
5393
5341
  "ref": "pkg:npm/minimatch@10.2.6",
5394
5342
  "dependsOn": [
@@ -0,0 +1,37 @@
1
+ export interface AssetReportFile {
2
+ path: string;
3
+ raw: number;
4
+ gzip: number;
5
+ brotli: number;
6
+ sha256: string;
7
+ /** This file's gzip bytes over the page's total gzip bytes, 0 when the page is empty. */
8
+ share: number;
9
+ }
10
+ export interface AssetReportSource {
11
+ path: string;
12
+ raw: number;
13
+ sha256: string;
14
+ }
15
+ export interface AssetReportTotals {
16
+ files: number;
17
+ raw: number;
18
+ gzip: number;
19
+ brotli: number;
20
+ assetFiles: number;
21
+ assetRaw: number;
22
+ }
23
+ export interface AssetReport {
24
+ dist: string;
25
+ files: AssetReportFile[];
26
+ assets: AssetReportSource[];
27
+ /** Groups of source paths with byte-identical content, sorted; empty when none exist. */
28
+ duplicates: string[][];
29
+ totals: AssetReportTotals;
30
+ }
31
+ export function fingerprint(data: Uint8Array): string;
32
+ export function compressedSizes(data: Uint8Array): { gzip: number; brotli: number };
33
+ export function assetReport(options: {
34
+ dist: string;
35
+ assets?: string;
36
+ mime?: Record<string, string>;
37
+ }): Promise<AssetReport>;
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+ import { createHash } from 'node:crypto';
3
+ import { gzipSync, brotliCompressSync, constants } from 'node:zlib';
4
+ import { realpathSync, statSync } from 'node:fs';
5
+ import { readFile, writeFile } from 'node:fs/promises';
6
+ import { join, relative, sep, extname } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { walk, DEFAULT_MIME } from './compile-resources.mjs';
9
+
10
+ /**
11
+ * Reports what a built page actually ships, so a game can see where its bytes go.
12
+ *
13
+ * Two halves, both deterministic (sorted paths, fixed compression settings, hashes):
14
+ *
15
+ * - `files`: every file under `dist` (precompressed `.gz`/`.br`/`.xz` siblings
16
+ * excluded - they are derived artifacts, and the gzip/brotli columns already count
17
+ * them) with raw, gzip (level 9) and brotli (quality 11) weights plus its share of
18
+ * the compressed page, the same settings `tools/compress-dist.mjs` writes with;
19
+ * - `assets`: every source file the asset folder embeds (the root `credits.json`
20
+ * and unknown extensions excluded, exactly the files `compileResources` skips),
21
+ * with duplicates grouped by SHA-256 so an asset embedded twice is visible.
22
+ *
23
+ * Shipped as `@datamoc/mw_games/tools/asset-report` (`assetReport(options)`, what the
24
+ * flags below map onto) and as the `mwg-assets` command.
25
+ *
26
+ * usage: mwg-assets <dist folder> [--assets=<dir>] [--json=<report file>]
27
+ */
28
+
29
+ const DERIVED_SIBLINGS = new Set(['.gz', '.br', '.xz']);
30
+
31
+ export function fingerprint(data) {
32
+ return createHash('sha256').update(data).digest('hex');
33
+ }
34
+
35
+ export function compressedSizes(data) {
36
+ return {
37
+ gzip: gzipSync(data, { level: 9 }).length,
38
+ brotli: brotliCompressSync(data, { params: { [constants.BROTLI_PARAM_QUALITY]: 11 } }).length,
39
+ };
40
+ }
41
+
42
+ function isDirectory(path) {
43
+ try {
44
+ return statSync(path).isDirectory();
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * @param options.dist the built page folder to measure
52
+ * @param options.assets the asset source folder to inventory (skipped when absent)
53
+ * @param options.mime extension to MIME type, merged over the compile defaults, so a
54
+ * game embedding extra types reports the same set the build embeds
55
+ * @returns the sorted files, sources, duplicate groups and totals described above
56
+ */
57
+ export async function assetReport({ dist, assets, mime = {} } = {}) {
58
+ if (!dist || !isDirectory(dist))
59
+ throw new Error(`assetReport needs the dist folder of a built page, got "${dist}"`);
60
+ if (assets !== undefined && !isDirectory(assets))
61
+ throw new Error(`assetReport needs a readable assets folder, got "${assets}"`);
62
+
63
+ const files = [];
64
+ for await (const file of walk(dist)) {
65
+ if (DERIVED_SIBLINGS.has(extname(file).toLowerCase())) continue;
66
+ const data = await readFile(file);
67
+ const { gzip, brotli } = compressedSizes(data);
68
+ files.push({
69
+ path: relative(dist, file).split(sep).join('/'),
70
+ raw: data.length,
71
+ gzip,
72
+ brotli,
73
+ sha256: fingerprint(data),
74
+ share: 0,
75
+ });
76
+ }
77
+ files.sort((a, b) => (a.path < b.path ? -1 : 1));
78
+ const totalGzip = files.reduce((sum, file) => sum + file.gzip, 0);
79
+ for (const file of files) file.share = totalGzip ? file.gzip / totalGzip : 0;
80
+
81
+ const sources = [];
82
+ const duplicates = [];
83
+ if (assets !== undefined) {
84
+ const types = { ...DEFAULT_MIME, ...mime };
85
+ const creditsFile = join(assets, 'credits.json');
86
+ const byHash = new Map();
87
+ for await (const file of walk(assets)) {
88
+ if (file === creditsFile) continue;
89
+ if (!types[extname(file).toLowerCase()]) continue;
90
+ const data = await readFile(file);
91
+ const sha256 = fingerprint(data);
92
+ const key = relative(assets, file).split(sep).join('/');
93
+ sources.push({ path: key, raw: data.length, sha256 });
94
+ const group = byHash.get(sha256) ?? [];
95
+ group.push(key);
96
+ byHash.set(sha256, group);
97
+ }
98
+ sources.sort((a, b) => (a.path < b.path ? -1 : 1));
99
+ for (const group of byHash.values()) if (group.length > 1) duplicates.push([...group].sort());
100
+ duplicates.sort((a, b) => (a[0] < b[0] ? -1 : 1));
101
+ }
102
+
103
+ return {
104
+ dist,
105
+ files,
106
+ assets: sources,
107
+ duplicates,
108
+ totals: {
109
+ files: files.length,
110
+ raw: files.reduce((sum, file) => sum + file.raw, 0),
111
+ gzip: totalGzip,
112
+ brotli: files.reduce((sum, file) => sum + file.brotli, 0),
113
+ assetFiles: sources.length,
114
+ assetRaw: sources.reduce((sum, source) => sum + source.raw, 0),
115
+ },
116
+ };
117
+ }
118
+
119
+ const kb = (n) => (n / 1024).toFixed(1) + ' KB';
120
+ const percent = (share) => (share * 100).toFixed(1) + '%';
121
+
122
+ async function main(argv) {
123
+ const folder = argv.find((arg) => !arg.startsWith('--'));
124
+ if (!folder) {
125
+ console.error('usage: mwg-assets <dist folder> [--assets=<dir>] [--json=<report file>]');
126
+ process.exit(1);
127
+ }
128
+ const value = (name) => argv.find((a) => a.startsWith(`--${name}=`))?.slice(name.length + 3);
129
+ const report = await assetReport({ dist: folder, assets: value('assets') });
130
+
131
+ console.log(`\n ${report.dist}`);
132
+ for (const file of report.files) {
133
+ console.log(
134
+ ` ${file.path.padEnd(40)}${kb(file.raw).padStart(10)} gz ${kb(file.gzip).padStart(10)} br ${kb(file.brotli).padStart(10)} ${percent(file.share).padStart(6)}`,
135
+ );
136
+ }
137
+ console.log(
138
+ ` ${report.totals.files} file(s), ${kb(report.totals.raw)} raw -> ${kb(report.totals.gzip)} gz / ${kb(report.totals.brotli)} br`,
139
+ );
140
+ if (report.assets.length) {
141
+ console.log(` ${report.totals.assetFiles} embedded asset(s), ${kb(report.totals.assetRaw)} raw`);
142
+ for (const group of report.duplicates) console.log(` duplicate: ${group.join(' == ')}`);
143
+ }
144
+ const json = value('json');
145
+ if (json) {
146
+ await writeFile(json, JSON.stringify(report, null, 2) + '\n', 'utf8');
147
+ console.log(` report written to ${json}`);
148
+ }
149
+ }
150
+
151
+ //realpath, since an npm `bin` shim reaches this file through a symlink
152
+ //no top-level await: a vite config loaded as CommonJS has to be able to require() this module
153
+ if (process.argv[1] && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url))
154
+ main(process.argv.slice(2)).catch((error) => {
155
+ console.error(error);
156
+ process.exitCode = 1;
157
+ });
@@ -7,6 +7,8 @@ export interface CompileResourcesOptions {
7
7
  to: string;
8
8
  mime?: Record<string, string>;
9
9
  groupBy?: (key: string) => string;
10
+ /** Exact paths relative to the asset folder to embed. Omit to include all; [] includes none. Unknown entries fail by name. */
11
+ assetFiles?: readonly string[];
10
12
  toWebp?: boolean;
11
13
  webpLossless?: boolean;
12
14
  webpQuality?: number;