@minicode-dev/chat 0.1.15 → 0.1.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 (57) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/chunks/{BattleshipGameCard-8H-sBCsv.js → BattleshipGameCard-DwNzgH5G.js} +199 -199
  3. package/dist/chunks/{BattleshipGameCard-8H-sBCsv.js.map → BattleshipGameCard-DwNzgH5G.js.map} +1 -1
  4. package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js → BattleshipPrototype-CSQxQJt5.js} +52 -52
  5. package/dist/chunks/{BattleshipPrototype-CmQd5AUO.js.map → BattleshipPrototype-CSQxQJt5.js.map} +1 -1
  6. package/dist/chunks/{ChatContext-CVW58bzC.js → ChatContext-D5rqvt5D.js} +2 -2
  7. package/dist/chunks/{ChatContext-CVW58bzC.js.map → ChatContext-D5rqvt5D.js.map} +1 -1
  8. package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js +1873 -0
  9. package/dist/chunks/RacingLiveGameCard-_wvhDRlG.js.map +1 -0
  10. package/dist/chunks/{TanksGameCard-DnCufSH6.js → TanksGameCard-B-gtDYYg.js} +137 -137
  11. package/dist/chunks/{TanksGameCard-DnCufSH6.js.map → TanksGameCard-B-gtDYYg.js.map} +1 -1
  12. package/dist/chunks/{TanksLiveGameCard-D_27Jomp.js → TanksLiveGameCard-DXgd1J2Y.js} +392 -392
  13. package/dist/chunks/{TanksLiveGameCard-D_27Jomp.js.map → TanksLiveGameCard-DXgd1J2Y.js.map} +1 -1
  14. package/dist/chunks/{avalancheScene3d-CIE2WKQn.js → avalancheScene3d-CNbQyGUd.js} +2 -2
  15. package/dist/chunks/{avalancheScene3d-CIE2WKQn.js.map → avalancheScene3d-CNbQyGUd.js.map} +1 -1
  16. package/dist/chunks/{connect4Sounds-BqEHULjv.js → connect4Sounds-3a6h7gUC.js} +8 -8
  17. package/dist/chunks/{connect4Sounds-BqEHULjv.js.map → connect4Sounds-3a6h7gUC.js.map} +1 -1
  18. package/dist/chunks/createLiveScene-jrzyQogh.js +756 -0
  19. package/dist/chunks/{createLiveScene-MTGRv8rx.js.map → createLiveScene-jrzyQogh.js.map} +1 -1
  20. package/dist/chunks/createRaceScene-C-aw0dlX.js +291 -0
  21. package/dist/chunks/createRaceScene-C-aw0dlX.js.map +1 -0
  22. package/dist/chunks/{createTankScene-yhX6la27.js → createTankScene-6asWHKFf.js} +123 -125
  23. package/dist/chunks/{createTankScene-yhX6la27.js.map → createTankScene-6asWHKFf.js.map} +1 -1
  24. package/dist/chunks/fx-BNJvJYOu.js +871 -0
  25. package/dist/chunks/fx-BNJvJYOu.js.map +1 -0
  26. package/dist/chunks/{games-Bl_8raG6.js → games-D_9SiSBT.js} +708 -697
  27. package/dist/chunks/games-D_9SiSBT.js.map +1 -0
  28. package/dist/chunks/tank-DIn6Jyt8.js +605 -0
  29. package/dist/chunks/tank-DIn6Jyt8.js.map +1 -0
  30. package/dist/chunks/{tanks-live-BcKmrhnV.js → tanks-live-BRhYW4MG.js} +36 -36
  31. package/dist/chunks/{tanks-live-BcKmrhnV.js.map → tanks-live-BRhYW4MG.js.map} +1 -1
  32. package/dist/chunks/{tanksSounds-DTnidbiq.js → tanksSounds-tYPzje61.js} +4 -4
  33. package/dist/chunks/{tanksSounds-DTnidbiq.js.map → tanksSounds-tYPzje61.js.map} +1 -1
  34. package/dist/chunks/track-C1TWWT19.js +557 -0
  35. package/dist/chunks/track-C1TWWT19.js.map +1 -0
  36. package/dist/index.js +4234 -4018
  37. package/dist/index.js.map +1 -1
  38. package/dist/styles.css +1 -1
  39. package/index.d.ts +2 -0
  40. package/package.json +1 -1
  41. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js +0 -1654
  42. package/dist/chunks/RacingLiveGameCard-8j9QLnxW.js.map +0 -1
  43. package/dist/chunks/createLiveScene-MTGRv8rx.js +0 -758
  44. package/dist/chunks/createRaceScene-BiEtQsVs.js +0 -306
  45. package/dist/chunks/createRaceScene-BiEtQsVs.js.map +0 -1
  46. package/dist/chunks/decor-CyyCnmct.js +0 -418
  47. package/dist/chunks/decor-CyyCnmct.js.map +0 -1
  48. package/dist/chunks/fx-1ZwzmPWj.js +0 -458
  49. package/dist/chunks/fx-1ZwzmPWj.js.map +0 -1
  50. package/dist/chunks/games-Bl_8raG6.js.map +0 -1
  51. package/dist/chunks/rolldown-runtime-CGnMp29N.js +0 -10
  52. package/dist/chunks/tank-DjEQ4FXF.js +0 -553
  53. package/dist/chunks/tank-DjEQ4FXF.js.map +0 -1
  54. package/dist/chunks/track-BcnnpnAm.js +0 -259
  55. package/dist/chunks/track-BcnnpnAm.js.map +0 -1
  56. package/dist/chunks/util-DwI9bfS7.js +0 -57
  57. package/dist/chunks/util-DwI9bfS7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"avalancheScene3d-CIE2WKQn.js","names":["clamp","createCarModels","WHEELS","createTankGeometries","TURRET_PIVOT","GUN_PIVOT","createAvalancheFx","TAU","BILL","STACK_HEIGHT","COIN","SERIF","INK","BAND_COLORS","FACE_V","EDGE_V","context2d","canvas","width","height","emboss","depth","color","style","offset","ctx","draw","starPath","i","radius","inner","outer","angle","cx","cy","rosette","j","phase","petals","t","r","drawBillFace","w","h","base","k","x","y0","glow","text","y","size","drawPaperEdges","step","moneyAtlas","lowPower","texture","CanvasTexture","coinTexture","c","field","remapBoxUv","normal","geometry","uv","v0","v1","billGeometry","BoxGeometry","length","thickness","position","stackGeometry","coinGeometry","segments","CylinderGeometry","createMoneyModels","material","MeshLambertMaterial","options","MeshStandardMaterial","standard","atlas","coinMap","paper","gold","Color","hex","TEAM_ORDER","GUN_LENGTH","GUN_PITCH","FIT","Vector3","ROOF_Y","TRACK_W","TREAD","GROOVE","toSRGB","createSink","bake","pos","nrm","col","normalMatrix","Matrix3","matrix","v","inBounds","capY","box","sink","g","b","srgb","finish","p","center","scale","BufferGeometry","BufferAttribute","trackGeometry","road","sprocket","idler","rr","path","arc","n","a","a0","a1","trackZ","x0","x1","y1","len","nx","ny","steps","link","s","t0","t1","ax","ay","bx","by","side","z0","z1","quad","q","createTankModels","geos","track","Box3","identity","Matrix4","turretAt","gunAt","Quaternion","body","accent","gear","wheelAt","noTurn","barrel","lamps","bodyMat","gearMat","DoubleSide","barrelMat","accentMat","MeshBasicMaterial","lampMat","TEAM","name","PARTY","GOLDEN","colors","list","makeMaterial","paperGeometry","PlaneGeometry","streamerGeometry","positions","normals","indices","nz","tilt","starGeometry","shape","Shape","ExtrudeGeometry","createConfettiModels","streamer","star","spark","CircleGeometry","DT_MAX","MAX_SUBSTEPS","LIGHT_MASS","DEFAULT_TTL","DRAG_K","AIR_SPIN_DAMP","CONTACT_SPIN_DAMP","FLOOR_FRICTION","SETTLE_K","BOUNCE_MIN","IMPACT_SPEED","IMPACT_GAP","WAKE_SPEED","SLEEP_SPEED","SLEEP_SPIN","SLEEP_TIME","CONTACT_EPS","SUPPORT_NY","SLOP","MIN_SHARE","DEEP_PEN","GROUND_SPEED","CORRECT","FADE_IN","FADE_OUT","FLUTTER","FLUTTER_DRAG","TUMBLE","SWEEP_WIND","SWEEP_LIFT","WIND_TAU","WALL_OPEN_TIME","OUT_MARGIN","GRID_MAX","GRID_HEIGHT","num","d","clamp$1","lo","hi","makeBody","createBodyWorld","cap","maxBodies","gravity","zMin","zMax","hitSpeed","impactSpeed","fy","floorY","lx","left","rx","right","bodies","free","listeners","heavy","next","cellX","cellY","cellHead","nextId","time","windX","windY","wallsOpenT","sweepDir","wake","impact","lightImpacts","speed","integrate","vx","vy","vz","drag","landed","wx","wy","wz","qx","qy","qz","qw","ux","uy","uz","sx","sy","sz","az","sign","hh","nw","inv","bounds","cr","top","random","rest","dx","dy","dz","v2","w2","pair","rs","lim","d2","pen","vn","ia","ib","ga","gb","im","fast","tx","ty","tz","rn","tl","mu","jt","sa","ca","cb","collide","maxR","cols","rows","hc","ya","yb","xa","xb","yy","xx","m","dt","dtIn","maxV2","minR","age","remain","o","sub","init","ql","u1","u2","u3","mass","light","ttl","hx","hy","hz","big","kx","ky","kz","oldestLight","best","spawn","setBounds","sweep","power","dir","clear","onImpact","DISTANCE","GRAVITY","FLOOR_LIFT","Z_MIN","Z_MAX","BIG_FAMILIES","FALLBACK_PALETTE","TANK_HARD_SPEED","rand","min","max","pick","items","clamp","value","familyOf","kind","isLowPower","blobTexture","gradient","halfExtents","parts","createPool","family","model","capacity","palette","mesh","InstancedMesh","DynamicDrawUsage","tinted","scene","half","createAvalancheScene","forceLowPower","renderer","WebGLRenderer","buildScene","error","Scene","camera","PerspectiveCamera","key","DirectionalLight","fill","flash","PointLight","AmbientLight","models","create","pools","byFamily","pool","capacityTotal","sum","world","fx","BLOBS","blobMap","blobs","BIG_MAX","bigCap","bigAlive","bigPending","FX_PER_FRAME","fxBudget","shake","flashLevel","quaternion","euler","Euler","gfx","freePool","variants","start","confettiFamily","roll","cannon","count","bills","stacks","coins","cars","first","tanks","span","bigCount","bursts","sync","blobCount","index","part","lift","used","live","halfHeight","halfWidth","geometries","materials","textures","entry"],"sources":["../../src/effects/avalanche/models/money.js","../../src/effects/avalanche/models/tanks.js","../../src/effects/avalanche/models/confetti.js","../../src/effects/avalanche/physics.js","../../src/effects/avalanche/avalancheScene3d.js"],"sourcesContent":["// Money for the Avalancha effect: banknotes that glide, strapped stacks and bouncy gold coins.\n// Everything lies flat (face +Y, length along X, width along Z), centered on its box.\n// Textures are drawn on demand, so importing this module never touches the DOM.\nimport {\n BoxGeometry, CanvasTexture, Color, CylinderGeometry, MeshLambertMaterial, MeshStandardMaterial,\n} from 'three';\n\nconst TAU = Math.PI * 2;\nconst BILL = { length: 1.0, width: 0.45, thickness: 0.02 };\nconst STACK_HEIGHT = 0.35;\nconst COIN = { radius: 0.32, thickness: 0.08 };\nconst SERIF = 'Georgia, \"Times New Roman\", serif';\nconst INK = '#1f5a32';\n// Paper straps come in a few denomination colors.\nconst BAND_COLORS = ['#d9a93a', '#8e5bd1', '#d64545', '#3b8fd9'];\n// Atlas rows (texture v): the note face on top, stacked paper edges below.\nconst FACE_V = [0.502, 1];\nconst EDGE_V = [0, 0.49];\n\n// Browsers get a DOM canvas, workers an OffscreenCanvas; tests without either get untextured money.\nfunction context2d(width, height) {\n let canvas = null;\n if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n } else if (typeof OffscreenCanvas !== 'undefined') {\n canvas = new OffscreenCanvas(width, height);\n }\n return canvas?.getContext('2d') || null;\n}\n\n// Fake relief: dark copy down-right, light copy up-left, then the face color on top.\nfunction emboss(ctx, depth, color, draw) {\n [['rgba(90, 55, 0, 0.7)', depth], ['rgba(255, 248, 210, 0.9)', -depth], [color, 0]].forEach(([style, offset]) => {\n ctx.save();\n ctx.translate(offset, offset);\n draw(style);\n ctx.restore();\n });\n}\n\nfunction starPath(ctx, cx, cy, outer, inner) {\n ctx.beginPath();\n for (let i = 0; i < 10; i += 1) {\n const radius = i % 2 ? inner : outer;\n const angle = (i / 10) * TAU - Math.PI / 2;\n ctx.lineTo(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius);\n }\n ctx.closePath();\n}\n\n// Guilloche flower: phase-shifted petal loops.\nfunction rosette(ctx, cx, cy, radius, petals) {\n for (let j = 0; j < 10; j += 1) {\n const phase = (j / 10) * (TAU / petals);\n ctx.beginPath();\n for (let i = 0; i <= 120; i += 1) {\n const t = (i / 120) * TAU;\n const r = radius * (0.7 + 0.3 * Math.sin(petals * t + phase));\n ctx.lineTo(cx + Math.cos(t) * r, cy + Math.sin(t) * r * 0.92);\n }\n ctx.stroke();\n }\n}\n\n// Original playful note (not modeled on any real currency), in a 512x230 design space.\nfunction drawBillFace(ctx, w, h) {\n const cx = w / 2;\n const cy = h / 2;\n const base = ctx.createLinearGradient(0, 0, w, h);\n base.addColorStop(0, '#b2d7a3');\n base.addColorStop(0.5, '#93c385');\n base.addColorStop(1, '#acd39c');\n ctx.fillStyle = base;\n ctx.fillRect(0, 0, w, h);\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = 'rgba(40, 110, 60, 0.28)';\n for (let k = 0; k < 7; k += 1) {\n [28, h - 28].forEach((y0) => {\n ctx.beginPath();\n for (let x = 0; x <= w; x += 4) ctx.lineTo(x, y0 + Math.sin(x * 0.045 + k * 0.9) * 7);\n ctx.stroke();\n });\n }\n rosette(ctx, w * 0.2, cy, 62, 9);\n rosette(ctx, w * 0.8, cy, 62, 12);\n\n ctx.strokeStyle = INK;\n ctx.lineWidth = 8;\n ctx.strokeRect(7, 7, w - 14, h - 14);\n ctx.lineWidth = 2;\n ctx.strokeRect(17, 17, w - 34, h - 34);\n\n // Portrait oval: engraved hatching behind an abstract bust.\n ctx.save();\n ctx.beginPath();\n ctx.ellipse(cx, cy, 58, 70, 0, 0, TAU);\n const glow = ctx.createRadialGradient(cx, cy - 12, 6, cx, cy, 74);\n glow.addColorStop(0, '#dcefd3');\n glow.addColorStop(1, '#94c486');\n ctx.fillStyle = glow;\n ctx.fill();\n ctx.clip();\n ctx.strokeStyle = 'rgba(31, 90, 50, 0.22)';\n ctx.lineWidth = 1;\n for (let x = cx - 60; x <= cx + 60; x += 4) {\n ctx.beginPath();\n ctx.moveTo(x, cy - 72);\n ctx.lineTo(x, cy + 72);\n ctx.stroke();\n }\n ctx.fillStyle = 'rgba(31, 90, 50, 0.78)';\n ctx.beginPath();\n ctx.arc(cx, cy - 16, 20, 0, TAU);\n ctx.fill();\n ctx.beginPath();\n ctx.ellipse(cx, cy + 50, 42, 40, 0, Math.PI, TAU);\n ctx.fill();\n ctx.restore();\n ctx.strokeStyle = INK;\n ctx.lineWidth = 4;\n ctx.beginPath();\n ctx.ellipse(cx, cy, 58, 70, 0, 0, TAU);\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.ellipse(cx, cy, 63, 75, 0, 0, TAU);\n ctx.stroke();\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.lineJoin = 'round';\n // Big \"$\" and \"100\" with a pale outline so they read over the guilloche.\n [['$', w * 0.2, cy + 4, 120], ['100', w * 0.8, cy + 2, 56]].forEach(([text, x, y, size]) => {\n ctx.font = `bold ${size}px ${SERIF}`;\n ctx.lineWidth = 6;\n ctx.strokeStyle = '#d6ebcd';\n ctx.strokeText(text, x, y);\n ctx.fillStyle = INK;\n ctx.fillText(text, x, y);\n });\n\n // Corner cartouches.\n ctx.font = `bold 24px ${SERIF}`;\n [[52, 40], [w - 52, 40], [52, h - 40], [w - 52, h - 40]].forEach(([x, y]) => {\n ctx.beginPath();\n ctx.ellipse(x, y, 31, 16, 0, 0, TAU);\n ctx.fillStyle = '#cfe6c4';\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = INK;\n ctx.stroke();\n ctx.fillStyle = INK;\n ctx.fillText('100', x, y + 1);\n });\n\n ctx.font = `bold 14px ${SERIF}`;\n ctx.fillText('★ AVALANCHA ★', cx, 30);\n ctx.fillText('CIEN', cx, h - 29);\n ctx.font = `12px ${SERIF}`;\n ctx.fillStyle = '#a8323a';\n ctx.textAlign = 'left';\n ctx.fillText('AV 7000 2026', 90, 44);\n ctx.textAlign = 'right';\n ctx.fillText('AV 7000 2026', w - 90, h - 44);\n}\n\n// Side of a stack: many sheets, with the odd darker one.\nfunction drawPaperEdges(ctx, w, h) {\n ctx.fillStyle = '#d9eacf';\n ctx.fillRect(0, 0, w, h);\n const sheets = 36;\n const step = h / sheets;\n for (let i = 0; i < sheets; i += 1) {\n ctx.fillStyle = i % 5 === 2 ? '#76ad69' : i % 2 ? '#b7d5aa' : '#cbe2bf';\n ctx.fillRect(0, i * step + step * 0.55, w, Math.max(1, step * 0.35));\n }\n}\n\n// One POT atlas shared by bills and stacks: note face in the top half, paper edges below.\nfunction moneyAtlas(lowPower) {\n const size = lowPower ? 256 : 512;\n const ctx = context2d(size, size);\n if (!ctx) return null;\n ctx.save();\n // The note keeps its real 1.0x0.45 aspect in design space and is squeezed into the half.\n ctx.scale(size / 512, size / 2 / 230);\n drawBillFace(ctx, 512, 230);\n ctx.restore();\n ctx.save();\n ctx.translate(0, size / 2);\n drawPaperEdges(ctx, size, size / 2);\n ctx.restore();\n const texture = new CanvasTexture(ctx.canvas);\n texture.anisotropy = lowPower ? 1 : 4;\n return texture;\n}\n\nfunction coinTexture(lowPower) {\n const size = lowPower ? 128 : 256;\n const ctx = context2d(size, size);\n if (!ctx) return null;\n const c = size / 2;\n const depth = size / 128;\n // Reeded rim; the coin's edge samples this ring too.\n for (let i = 0; i < 96; i += 1) {\n const angle = (i / 96) * TAU;\n ctx.fillStyle = i % 2 ? '#f0c24a' : '#9c6c10';\n ctx.beginPath();\n ctx.moveTo(c, c);\n ctx.arc(c, c, c * 1.5, angle, angle + TAU / 96 + 0.01);\n ctx.fill();\n }\n const field = ctx.createRadialGradient(c * 0.75, c * 0.7, c * 0.05, c, c, c * 0.9);\n field.addColorStop(0, '#fff3b8');\n field.addColorStop(0.5, '#f5c84a');\n field.addColorStop(1, '#c08a14');\n ctx.fillStyle = field;\n ctx.beginPath();\n ctx.arc(c, c, c * 0.88, 0, TAU);\n ctx.fill();\n\n emboss(ctx, depth, '#e9b93c', (style) => {\n ctx.strokeStyle = style;\n ctx.lineWidth = c * 0.05;\n ctx.beginPath();\n ctx.arc(c, c, c * 0.84, 0, TAU);\n ctx.stroke();\n });\n emboss(ctx, depth * 0.6, '#efc24a', (style) => {\n ctx.fillStyle = style;\n ctx.beginPath();\n for (let i = 0; i < 30; i += 1) {\n const angle = (i / 30) * TAU;\n const x = c + Math.cos(angle) * c * 0.74;\n const y = c + Math.sin(angle) * c * 0.74;\n ctx.moveTo(x + c * 0.03, y);\n ctx.arc(x, y, c * 0.03, 0, TAU);\n }\n ctx.fill();\n });\n emboss(ctx, depth * 1.5, '#f6cd52', (style) => {\n ctx.fillStyle = style;\n starPath(ctx, c, c, c * 0.62, c * 0.3);\n ctx.fill();\n });\n emboss(ctx, depth, '#c99418', (style) => {\n ctx.fillStyle = style;\n ctx.font = `bold ${Math.round(c * 0.5)}px ${SERIF}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('$', c, c * 1.03);\n });\n return new CanvasTexture(ctx.canvas);\n}\n\n// Faces whose normal is ±Y show the note; the thin sides show paper edges.\nfunction remapBoxUv(geometry) {\n const normal = geometry.attributes.normal;\n const uv = geometry.attributes.uv;\n for (let i = 0; i < uv.count; i += 1) {\n const [v0, v1] = Math.abs(normal.getY(i)) > 0.5 ? FACE_V : EDGE_V;\n uv.setY(i, v0 + uv.getY(i) * (v1 - v0));\n }\n}\n\n// Thin slab with a slight paper bend: both ends lift along the length.\nfunction billGeometry(lowPower) {\n const { length, width, thickness } = BILL;\n const geometry = new BoxGeometry(length, thickness, width, lowPower ? 4 : 8, 1, 1);\n remapBoxUv(geometry);\n const position = geometry.attributes.position;\n for (let i = 0; i < position.count; i += 1) {\n const x = position.getX(i) / (length / 2);\n position.setY(i, position.getY(i) + x * x * 0.05);\n }\n geometry.computeVertexNormals();\n geometry.center();\n return geometry;\n}\n\nfunction stackGeometry() {\n const geometry = new BoxGeometry(BILL.length, STACK_HEIGHT, BILL.width);\n remapBoxUv(geometry);\n return geometry;\n}\n\n// Flat cylinder; its side samples the reeded ring of the face texture instead of the whole design.\nfunction coinGeometry(lowPower) {\n const segments = lowPower ? 16 : 24;\n const geometry = new CylinderGeometry(COIN.radius, COIN.radius, COIN.thickness, segments, 1);\n const position = geometry.attributes.position;\n const uv = geometry.attributes.uv;\n // Torso vertices come first in CylinderGeometry.\n for (let i = 0; i < (segments + 1) * 2; i += 1) {\n uv.setXY(i, 0.5 + 0.47 * (position.getZ(i) / COIN.radius), 0.5 + 0.47 * (position.getX(i) / COIN.radius));\n }\n return geometry;\n}\n\nexport function createMoneyModels({ lowPower = false } = {}) {\n const material = (options, standard = {}) => (lowPower\n ? new MeshLambertMaterial(options)\n : new MeshStandardMaterial({ roughness: 0.8, metalness: 0, ...options, ...standard }));\n const atlas = moneyAtlas(lowPower);\n const coinMap = coinTexture(lowPower);\n // Slightly grey base so bright party lights don't wash the note out to white.\n const paper = () => material({ color: atlas ? 0xb8c6b3 : 0x8fc27f, map: atlas });\n // Without an env map a fully metallic coin renders black; the emissive map keeps its gold body lit.\n const gold = material(\n { color: coinMap ? 0xffffff : 0xffc83d, map: coinMap, emissive: lowPower ? 0x5a3e0c : 0x8a6418, emissiveMap: coinMap },\n { metalness: 0.85, roughness: 0.25 },\n );\n\n return [\n {\n kind: 'bill',\n parts: [{ geometry: billGeometry(lowPower), material: paper() }],\n radius: 0.45,\n mass: 0.05,\n bounce: 0.12,\n friction: 0.6,\n drag: 0.85,\n count: 60,\n countLow: 30,\n },\n {\n kind: 'stack',\n parts: [\n { geometry: stackGeometry(), material: paper() },\n // Strap slightly larger than the stack so it never z-fights.\n { geometry: new BoxGeometry(0.2, STACK_HEIGHT + 0.012, BILL.width + 0.012), material: material({ color: 0xffffff }, { roughness: 0.6 }), tinted: true },\n ],\n palette: BAND_COLORS.map((hex) => new Color(hex)),\n radius: 0.52,\n mass: 0.8,\n bounce: 0.22,\n friction: 0.7,\n drag: 0.12,\n count: 12,\n countLow: 6,\n },\n {\n kind: 'coin',\n parts: [{ geometry: coinGeometry(lowPower), material: gold }],\n radius: 0.32,\n mass: 0.3,\n bounce: 0.65,\n friction: 0.35,\n drag: 0.04,\n count: 50,\n countLow: 24,\n },\n ];\n}\n","// Tanks for the Avalancha effect: the Tanques de guerra toy tank baked into static merged parts.\n// Reuses the game's pure geometry builders (src/games/tanks/scene/tank.js stays untouched):\n// turret and gun are frozen in one pose, the barrel is shortened, then everything is centered\n// and scaled: body ≈2.6 × 1.05 × 1.55, barrel tip at x 1.475 (front +X).\n// Colors are plain sRGB hex values (linear-output renderer, like the confetti scene).\nimport {\n Box3, BufferAttribute, BufferGeometry, Color, DoubleSide, Matrix3, Matrix4, MeshBasicMaterial, MeshLambertMaterial,\n MeshStandardMaterial, Quaternion, Vector3,\n} from 'three';\nimport { createTankGeometries, GUN_PIVOT, TEAM, TURRET_PIVOT, WHEELS } from '../../../games/tanks/scene/tank.js';\n\nconst TEAM_ORDER = ['green', 'red']; // TEAM_COLORS in src/games/tanks/view.js\nconst GUN_LENGTH = 0.62; // barrel x-scale: stubbier toy gun\nconst GUN_PITCH = 0.1; // rad\nconst FIT = new Vector3(2.95, 1.1, 1.6); // max box: length (incl. barrel), height, width\nconst ROOF_Y = 1.2; // turret-local y cap for bounds (antenna excluded)\nconst TRACK_W = 0.74; // mirrors tank.js\nconst TREAD = new Color('#3b3b3e');\nconst GROOVE = new Color('#1b1b1d');\n\nconst toSRGB = (c) => (c <= 0.0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);\n\nfunction createSink() {\n return { p: [], n: [], c: [] };\n}\n\n// Append a non-indexed geometry transformed by `matrix`; linear vertex colors become sRGB.\nfunction bake(sink, geometry, matrix, box, { srgb = true, capY = Infinity } = {}) {\n const pos = geometry.attributes.position;\n const nrm = geometry.attributes.normal;\n const col = geometry.attributes.color;\n const normalMatrix = new Matrix3().getNormalMatrix(matrix);\n const v = new Vector3();\n for (let i = 0; i < pos.count; i += 1) {\n v.fromBufferAttribute(pos, i);\n const inBounds = v.y <= capY;\n v.applyMatrix4(matrix);\n if (inBounds) box.expandByPoint(v);\n sink.p.push(v.x, v.y, v.z);\n v.fromBufferAttribute(nrm, i).applyMatrix3(normalMatrix).normalize();\n sink.n.push(v.x, v.y, v.z);\n if (col) {\n const r = col.getX(i), g = col.getY(i), b = col.getZ(i);\n if (srgb) sink.c.push(toSRGB(r), toSRGB(g), toSRGB(b));\n else sink.c.push(r, g, b);\n } else sink.c.push(1, 1, 1);\n }\n}\n\nfunction finish(sink, center, scale) {\n const p = new Float32Array(sink.p);\n for (let i = 0; i < p.length; i += 3) {\n p[i] = (p[i] - center.x) * scale;\n p[i + 1] = (p[i + 1] - center.y) * scale;\n p[i + 2] = (p[i + 2] - center.z) * scale;\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(p, 3));\n geometry.setAttribute('normal', new BufferAttribute(new Float32Array(sink.n), 3));\n geometry.setAttribute('color', new BufferAttribute(new Float32Array(sink.c), 3));\n geometry.computeBoundingSphere();\n return geometry;\n}\n\n// Track loop (same path as tank.js) split into alternating tread links; vertex colors, no texture.\nfunction trackGeometry(link) {\n // WHEELS per side: 5 road wheels (rear → front), sprocket, idler\n const road = WHEELS[0];\n const sprocket = WHEELS[5];\n const idler = WHEELS[6];\n const rr = 0.38;\n const path = [[road.x, 0], [WHEELS[4].x, 0]];\n const arc = (cx, cy, a0, a1, n) => {\n for (let i = 0; i <= n; i += 1) {\n const a = a0 + ((a1 - a0) * i) / n;\n path.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr]);\n }\n };\n arc(sprocket.x, sprocket.y, -2.0, Math.PI / 2, 6);\n arc(idler.x, idler.y, Math.PI / 2, Math.PI + 2.0, 6);\n path.push(path[0]);\n const p = [], n = [], c = [];\n const trackZ = Math.abs(road.z);\n let k = 0;\n for (let i = 0; i < path.length - 1; i += 1) {\n const [x0, y0] = path[i];\n const [x1, y1] = path[i + 1];\n const len = Math.hypot(x1 - x0, y1 - y0);\n if (len < 1e-6) continue;\n // loop is CCW seen from +z → outward normal = (dy, -dx)\n const nx = (y1 - y0) / len, ny = -(x1 - x0) / len;\n const steps = Math.max(1, Math.round(len / link));\n for (let s = 0; s < steps; s += 1, k += 1) {\n const t0 = s / steps, t1 = (s + 1) / steps;\n const ax = x0 + (x1 - x0) * t0, ay = y0 + (y1 - y0) * t0 - 0.03;\n const bx = x0 + (x1 - x0) * t1, by = y0 + (y1 - y0) * t1 - 0.03;\n const color = k % 2 ? GROOVE : TREAD;\n for (const side of [-1, 1]) {\n const z0 = side * trackZ - TRACK_W / 2, z1 = side * trackZ + TRACK_W / 2;\n const quad = [[ax, ay, z0], [bx, by, z0], [bx, by, z1], [ax, ay, z0], [bx, by, z1], [ax, ay, z1]];\n for (const q of quad) {\n p.push(q[0], q[1], q[2]);\n n.push(nx, ny, 0);\n c.push(color.r, color.g, color.b);\n }\n }\n }\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(p), 3));\n geometry.setAttribute('normal', new BufferAttribute(new Float32Array(n), 3));\n geometry.setAttribute('color', new BufferAttribute(new Float32Array(c), 3));\n return geometry;\n}\n\nfunction material(lowPower, options, standard) {\n return lowPower ? new MeshLambertMaterial(options) : new MeshStandardMaterial({ ...options, ...standard });\n}\n\nexport function createTankModels({ lowPower = false } = {}) {\n const geos = createTankGeometries();\n const track = trackGeometry(lowPower ? 0.2 : 0.12);\n const box = new Box3();\n const identity = new Matrix4();\n const turretAt = new Matrix4().makeTranslation(TURRET_PIVOT.x, TURRET_PIVOT.y, TURRET_PIVOT.z);\n const gunAt = new Matrix4().compose(\n TURRET_PIVOT.clone().add(GUN_PIVOT),\n new Quaternion().setFromAxisAngle(new Vector3(0, 0, 1), GUN_PITCH),\n new Vector3(GUN_LENGTH, 1, 1),\n );\n\n const body = createSink();\n bake(body, geos.hull, identity, box);\n bake(body, geos.turret, turretAt, box, { capY: ROOF_Y });\n\n const accent = createSink();\n bake(accent, geos.hullAccent, identity, box);\n bake(accent, geos.turretAccent, turretAt, box, { capY: ROOF_Y });\n\n const gear = createSink();\n bake(gear, track, identity, box, { srgb: false });\n const wheelAt = new Matrix4();\n const noTurn = new Quaternion();\n for (const w of WHEELS) {\n const s = w.r / WHEELS[0].r;\n wheelAt.compose(new Vector3(w.x, w.y, w.z), noTurn, new Vector3(s, s, s));\n bake(gear, geos.wheel, wheelAt, box);\n }\n\n const barrel = createSink();\n bake(barrel, geos.gun, gunAt, box);\n\n const lamps = createSink();\n bake(lamps, geos.lamps, identity, box);\n\n geos.dispose();\n track.dispose();\n\n const size = box.getSize(new Vector3());\n const center = box.getCenter(new Vector3());\n const scale = Math.min(FIT.x / size.x, FIT.y / size.y, FIT.z / size.z);\n\n const bodyMat = material(lowPower, { vertexColors: true, color: 0xffffff },\n { roughness: 0.62, metalness: 0.18, flatShading: true });\n const gearMat = material(lowPower, { vertexColors: true, side: DoubleSide }, { roughness: 0.8, metalness: 0.2 });\n const barrelMat = material(lowPower, { vertexColors: true, color: '#7a7f88' }, { roughness: 0.4, metalness: 0.45 });\n // Team stripes / rear lights: instance tint boosted, unlit (like the game's accent glow).\n const accentMat = new MeshBasicMaterial({ color: new Color(1.35, 1.35, 1.35) });\n const lampMat = new MeshBasicMaterial({ color: '#fff1c2' });\n\n return [{\n kind: 'tank',\n parts: [\n { geometry: finish(body, center, scale), material: bodyMat, tinted: true },\n { geometry: finish(accent, center, scale), material: accentMat, tinted: true },\n { geometry: finish(gear, center, scale), material: gearMat },\n { geometry: finish(barrel, center, scale), material: barrelMat },\n { geometry: finish(lamps, center, scale), material: lampMat },\n ],\n palette: TEAM_ORDER.map((name) => TEAM[name].tint.clone().convertLinearToSRGB()),\n radius: 0.85, // ≈ mean half-extent (body 2.6 × 1.05 × 1.55)\n mass: 5,\n bounce: 0.2,\n friction: 0.8,\n drag: 0.04,\n count: 6,\n countLow: 4,\n }];\n}\n","// Filler confetti for the Avalancha effect: paper bits, curly streamers, stars and sequins.\n// Very light bodies (high drag, low bounce) that flutter around the big falling figures.\n// Shapes adapted from src/effects/confetti/confettiScene3d.js (that file stays untouched).\nimport {\n BufferAttribute, BufferGeometry, CircleGeometry, Color, DoubleSide, ExtrudeGeometry, MeshLambertMaterial,\n MeshStandardMaterial, PlaneGeometry, Shape,\n} from 'three';\n\nconst PARTY = ['#ff4d8d', '#ffd23f', '#3ddc97', '#4cc9f0', '#9b5de5', '#ff7b29', '#f15bb5', '#ffffff'];\nconst GOLDEN = ['#ffcf4a', '#ffd23f', '#ffe08a', '#ffb627', '#ff4d8d', '#4cc9f0'];\nconst colors = (list) => list.map((hex) => new Color(hex));\n\n// Tinted parts keep a white base so the instance color is the final color.\nfunction makeMaterial(lowPower, options, standard = {}) {\n return lowPower\n ? new MeshLambertMaterial(options)\n : new MeshStandardMaterial({ roughness: 0.4, metalness: 0.25, ...options, ...standard });\n}\n\n// Paper rectangle with a slight curl so it never vanishes fully edge-on.\nfunction paperGeometry() {\n const geometry = new PlaneGeometry(0.13, 0.2, 1, 4);\n const position = geometry.attributes.position;\n for (let i = 0; i < position.count; i += 1) {\n const v = position.getY(i) / 0.1;\n position.setZ(i, 0.035 * v * v);\n }\n geometry.computeVertexNormals();\n geometry.center();\n return geometry;\n}\n\n// Curly streamer: a flat paper strip wound into a loosening helix (width along the axis).\nfunction streamerGeometry(lowPower) {\n const segments = lowPower ? 48 : 84;\n const turns = 3.5;\n const length = 1.3;\n const width = 0.055;\n const positions = new Float32Array((segments + 1) * 6);\n const normals = new Float32Array((segments + 1) * 6);\n const indices = [];\n for (let i = 0; i <= segments; i += 1) {\n const t = i / segments;\n const angle = t * turns * Math.PI * 2;\n const radius = 0.14 + 0.06 * t;\n const nx = Math.cos(angle);\n const nz = Math.sin(angle);\n const y = t * length - length / 2;\n const tilt = 0.02 * Math.sin(angle * 0.5);\n for (let side = 0; side < 2; side += 1) {\n const k = (i * 2 + side) * 3;\n positions[k] = nx * radius;\n positions[k + 1] = y + (side ? 1 : -1) * width * 0.5 + tilt;\n positions[k + 2] = nz * radius;\n normals[k] = nx;\n normals[k + 2] = nz;\n }\n if (i < segments) {\n const a = i * 2;\n // CCW seen from outside the helix.\n indices.push(a, a + 1, a + 2, a + 1, a + 3, a + 2);\n }\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(positions, 3));\n geometry.setAttribute('normal', new BufferAttribute(normals, 3));\n geometry.setIndex(indices);\n geometry.center();\n return geometry;\n}\n\nfunction starGeometry() {\n const shape = new Shape();\n for (let i = 0; i < 10; i += 1) {\n const radius = i % 2 ? 0.15 : 0.35;\n const angle = (i / 10) * Math.PI * 2 + Math.PI / 2;\n const x = Math.cos(angle) * radius;\n const y = Math.sin(angle) * radius;\n if (i) shape.lineTo(x, y); else shape.moveTo(x, y);\n }\n const geometry = new ExtrudeGeometry(shape, {\n depth: 0.08, bevelEnabled: true, bevelThickness: 0.03, bevelSize: 0.02, bevelSegments: 1,\n });\n geometry.center();\n return geometry;\n}\n\n/**\n * Filler models for the avalanche: 'confetti', 'streamer', 'star', 'spark'.\n * @param {{ lowPower?: boolean }} options\n */\nexport function createConfettiModels({ lowPower = false } = {}) {\n const paper = paperGeometry();\n const streamer = streamerGeometry(lowPower);\n const star = starGeometry();\n const spark = new CircleGeometry(0.075, lowPower ? 8 : 12);\n [paper, streamer, star, spark].forEach((geometry) => geometry.computeBoundingSphere());\n\n return [\n {\n kind: 'confetti',\n parts: [{\n geometry: paper,\n material: makeMaterial(lowPower, { color: 0xffffff, side: DoubleSide }, { metalness: 0.35, roughness: 0.4 }),\n tinted: true,\n }],\n palette: colors(PARTY),\n radius: 0.12,\n mass: 0.02,\n bounce: 0.1,\n friction: 0.8,\n drag: 0.92,\n count: 500,\n countLow: 200,\n },\n {\n kind: 'streamer',\n parts: [{\n geometry: streamer,\n material: makeMaterial(lowPower, { color: 0xffffff, side: DoubleSide }, { metalness: 0.3, roughness: 0.45 }),\n tinted: true,\n }],\n palette: colors(PARTY),\n // Smaller than the 0.7 half-length so streamers never prop up heavy figures.\n radius: 0.4,\n mass: 0.03,\n bounce: 0.12,\n friction: 0.75,\n drag: 0.85,\n count: 40,\n countLow: 16,\n },\n {\n kind: 'star',\n parts: [{\n geometry: star,\n material: makeMaterial(lowPower, { color: 0xffffff, emissive: 0x2a1800 }, { metalness: 0.6, roughness: 0.25 }),\n tinted: true,\n }],\n palette: colors(GOLDEN),\n radius: 0.35,\n mass: 0.06,\n bounce: 0.25,\n friction: 0.55,\n drag: 0.5,\n count: 40,\n countLow: 20,\n },\n {\n kind: 'spark',\n parts: [{\n geometry: spark,\n material: makeMaterial(lowPower, { color: 0xffffff, emissive: 0x332200, side: DoubleSide }, { metalness: 0.5, roughness: 0.25 }),\n tinted: true,\n }],\n palette: colors(GOLDEN),\n radius: 0.08,\n mass: 0.015,\n bounce: 0.1,\n friction: 0.8,\n drag: 0.9,\n count: 160,\n countLow: 60,\n },\n ];\n}\n","/**\n * Avalancha body world. Pure JS (no three, no DOM).\n * Semi-implicit Euler. Heavy bodies (mass >= 0.1): substeps + uniform-grid broadphase, sphere-sphere contacts.\n * Light bodies (confetti, bills): one step per frame, floor/walls only.\n * Body objects are pooled and reused after death; every spawn gets a new `id`.\n */\n\nconst DT_MAX = 1 / 30;\nconst MAX_SUBSTEPS = 6;\nconst LIGHT_MASS = 0.1;\nconst DEFAULT_TTL = 6;\nconst DRAG_K = 6; // drag (0..1) -> linear damping 1/s\nconst AIR_SPIN_DAMP = 0.3;\nconst CONTACT_SPIN_DAMP = 7;\nconst FLOOR_FRICTION = 10; // friction (0..1) -> tangential damping 1/s while supported\nconst SETTLE_K = 60; // pull of the nearest local axis toward world up while supported\nconst BOUNCE_MIN = 1.2; // approach speed below which restitution is 0 (kills jitter)\nconst IMPACT_SPEED = 4;\nconst IMPACT_GAP = 0.15;\nconst WAKE_SPEED = 1.5;\nconst SLEEP_SPEED = 0.3;\nconst SLEEP_SPIN = 0.6;\nconst SLEEP_TIME = 0.3;\nconst CONTACT_EPS = 0.03;\nconst SUPPORT_NY = 0.1; // contact normal y above this counts as support (includes wedged bodies)\nconst SLOP = 0.01;\nconst MIN_SHARE = 0.2; // min positional-correction share of the heavier body\nconst DEEP_PEN = 0.08;\nconst GROUND_SPEED = 3; // below this approach speed a floor body under another is treated as ground // overlap fraction of radius sum that wakes a sleeper\nconst CORRECT = 0.8;\nconst FADE_IN = 0.15;\nconst FADE_OUT = 0.4;\nconst FLUTTER = 14;\nconst FLUTTER_DRAG = 0.3;\nconst TUMBLE = 0.35;\nconst SWEEP_WIND = 18;\nconst SWEEP_LIFT = 5;\nconst WIND_TAU = 0.9;\nconst WALL_OPEN_TIME = 2.5;\nconst OUT_MARGIN = 3;\nconst GRID_MAX = 64;\nconst GRID_HEIGHT = 40;\n\nexport const PHYSICS_TUNING = Object.freeze({\n DT_MAX, MAX_SUBSTEPS, LIGHT_MASS, DEFAULT_TTL, DRAG_K, AIR_SPIN_DAMP, CONTACT_SPIN_DAMP, FLOOR_FRICTION, SETTLE_K,\n BOUNCE_MIN, IMPACT_SPEED, IMPACT_GAP, WAKE_SPEED, SLEEP_SPEED, SLEEP_SPIN, SLEEP_TIME, FADE_IN, FADE_OUT,\n FLUTTER, SWEEP_WIND, SWEEP_LIFT, WIND_TAU, WALL_OPEN_TIME, OUT_MARGIN,\n});\n\nconst num = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\nconst clamp = (v, lo, hi) => (v < lo ? lo : v > hi ? hi : v);\n\n// Fixed field order keeps one hidden class for every body.\nfunction makeBody() {\n return {\n id: 0, kind: '', x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, qx: 0, qy: 0, qz: 0, qw: 1, wx: 0, wy: 0, wz: 0,\n radius: 0.5, mass: 1, age: 0, ttl: DEFAULT_TTL, scale: 0, landed: false, alive: false, asleep: false,\n bounce: 0.3, friction: 0.5, drag: 0.05, hx: 0, hy: 0, hz: 0, variant: 0, data: null,\n light: false, invMass: 1, cr: 0.5, sup: false, restT: 0, impactT: -1e9, phase: 0, kx: 1, ky: 1, kz: 1,\n px: 0, py: 0, pz: 0, floor: false,\n };\n}\n\n/**\n * @param {{ gravity?: number, floorY?: number, left?: number, right?: number, maxBodies?: number,\n * zMin?: number, zMax?: number, impactSpeed?: number, lightImpacts?: boolean, random?: () => number }} [options]\n */\nexport function createBodyWorld({\n gravity = -26, floorY = -5.5, left = -8, right = 8, maxBodies = 400,\n zMin = -2, zMax = 2, impactSpeed = IMPACT_SPEED, lightImpacts = false, random = Math.random,\n} = {}) {\n const cap = Math.max(1, Math.floor(num(maxBodies, 400)));\n const g = num(gravity, -26);\n const z0 = Math.min(num(zMin, -2), num(zMax, 2));\n const z1 = Math.max(num(zMin, -2), num(zMax, 2));\n const hitSpeed = num(impactSpeed, IMPACT_SPEED);\n let fy = num(floorY, -5.5);\n let lx = num(left, -8);\n let rx = num(right, 8);\n if (rx < lx) { const t = lx; lx = rx; rx = t; }\n\n const bodies = [];\n const free = [];\n const listeners = [];\n const heavy = new Int32Array(cap);\n const next = new Int32Array(cap);\n const cellX = new Int32Array(cap);\n const cellY = new Int32Array(cap);\n const cellHead = new Int32Array(GRID_MAX * GRID_MAX);\n let nextId = 1;\n let time = 0;\n let windX = 0;\n let windY = 0;\n let wallsOpenT = 0;\n let sweepDir = 1;\n\n function wake(b) {\n b.asleep = false;\n b.restT = 0;\n }\n\n function impact(b, speed) {\n if (speed < hitSpeed || (b.light && !lightImpacts) || !listeners.length) return;\n if (time - b.impactT < IMPACT_GAP) return;\n b.impactT = time;\n for (let i = 0; i < listeners.length; i++) {\n try { listeners[i](b, speed); } catch { /* listener errors never break the sim */ }\n }\n }\n\n function integrate(b, h) {\n let vx = b.vx;\n let vy = b.vy + g * h;\n let vz = b.vz;\n const drag = b.drag;\n const landed = b.landed;\n if (drag > FLUTTER_DRAG && !landed) vx += Math.sin(b.age * 3.3 + b.phase) * FLUTTER * drag * h;\n if (drag > 0) {\n // Implicit drag relative to wind: high-drag bodies ride the finale gust.\n const c = drag * DRAG_K * h;\n const k = 1 / (1 + c);\n vx = (vx + c * windX) * k;\n vy = (vy + c * windY) * k;\n vz *= k;\n }\n if (landed) {\n const k = 1 / (1 + b.friction * FLOOR_FRICTION * h);\n vx *= k;\n vz *= k;\n }\n b.vx = vx; b.vy = vy; b.vz = vz;\n b.x += vx * h; b.y += vy * h; b.z += vz * h;\n\n let wx = b.wx; let wy = b.wy; let wz = b.wz;\n const qx = b.qx; const qy = b.qy; const qz = b.qz; const qw = b.qw;\n if (landed) {\n // Settle: torque the nearest local axis (weighted toward thin axes) to world up.\n const ux = 2 * (qx * qy + qw * qz);\n const uy = 1 - 2 * (qx * qx + qz * qz);\n const uz = 2 * (qy * qz - qw * qx);\n const sx = Math.abs(ux) * b.kx; const sy = Math.abs(uy) * b.ky; const sz = Math.abs(uz) * b.kz;\n let ax; let az; let sign;\n if (sy >= sx && sy >= sz) { sign = uy < 0 ? -1 : 1; ax = 2 * (qx * qy - qw * qz); az = 2 * (qy * qz + qw * qx); }\n else if (sx >= sz) { sign = ux < 0 ? -1 : 1; ax = 1 - 2 * (qy * qy + qz * qz); az = 2 * (qx * qz - qw * qy); }\n else { sign = uz < 0 ? -1 : 1; ax = 2 * (qx * qz + qw * qy); az = 1 - 2 * (qx * qx + qy * qy); }\n // axis x up = (-az, 0, ax)\n const k = SETTLE_K * h * sign;\n wx -= az * k;\n wz += ax * k;\n const d = 1 / (1 + CONTACT_SPIN_DAMP * h);\n wx *= d; wy *= d; wz *= d;\n } else if (wx !== 0 || wy !== 0 || wz !== 0) {\n const d = 1 / (1 + AIR_SPIN_DAMP * h);\n wx *= d; wy *= d; wz *= d;\n }\n b.wx = wx; b.wy = wy; b.wz = wz;\n if (wx !== 0 || wy !== 0 || wz !== 0) {\n const hh = 0.5 * h;\n const nx = qx + hh * (wx * qw + wy * qz - wz * qy);\n const ny = qy + hh * (wy * qw + wz * qx - wx * qz);\n const nz = qz + hh * (wz * qw + wx * qy - wy * qx);\n const nw = qw - hh * (wx * qx + wy * qy + wz * qz);\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz + nw * nw);\n if (len > 1e-9) {\n const inv = 1 / len;\n b.qx = nx * inv; b.qy = ny * inv; b.qz = nz * inv; b.qw = nw * inv;\n } else { b.qx = 0; b.qy = 0; b.qz = 0; b.qw = 1; }\n }\n }\n\n function bounds(b) {\n const cr = b.cr;\n let top = cr;\n if (b.hx > 0) {\n // Oriented box support along world up (optional half extents).\n const qx = b.qx; const qy = b.qy; const qz = b.qz; const qw = b.qw;\n const ux = 2 * (qx * qy + qw * qz);\n const uy = 1 - 2 * (qx * qx + qz * qz);\n const uz = 2 * (qy * qz - qw * qx);\n top = (b.hx * Math.abs(ux) + b.hy * Math.abs(uy) + b.hz * Math.abs(uz)) * (cr / b.radius);\n }\n top += fy;\n b.floor = b.y <= top + CONTACT_EPS;\n if (b.floor) {\n b.sup = true;\n if (b.y < top) {\n b.y = top;\n if (b.vy < 0) {\n const s = -b.vy;\n if (s > BOUNCE_MIN) {\n b.vy = s * b.bounce;\n const t = s * TUMBLE;\n b.wx += (random() - 0.5) * t;\n b.wz += (random() - 0.5) * t - (b.vx * 0.3) / b.radius;\n } else b.vy = 0;\n if (s >= hitSpeed) impact(b, s);\n }\n }\n }\n if (wallsOpenT <= 0) {\n if (b.x - cr < lx) {\n b.x = lx + cr;\n if (b.vx < 0) b.vx = b.vx < -BOUNCE_MIN ? -b.vx * (0.25 + 0.5 * b.bounce) : 0;\n } else if (b.x + cr > rx) {\n b.x = rx - cr;\n if (b.vx > 0) b.vx = b.vx > BOUNCE_MIN ? -b.vx * (0.25 + 0.5 * b.bounce) : 0;\n }\n } else if (b.x - cr > rx + OUT_MARGIN || b.x + cr < lx - OUT_MARGIN) b.alive = false;\n if (b.z < z0) { b.z = z0; if (b.vz < 0) b.vz *= -0.3; }\n else if (b.z > z1) { b.z = z1; if (b.vz > 0) b.vz *= -0.3; }\n if (b.y < fy - 20 || b.x !== b.x || b.y !== b.y || b.z !== b.z || b.qw !== b.qw) b.alive = false;\n }\n\n function rest(b, h) {\n if (b.asleep) {\n if (!b.sup) wake(b);\n return;\n }\n if (!b.sup) { b.restT = 0; return; }\n // Real displacement, not velocity: wedged bodies keep a residual v that constraints cancel.\n const dx = b.x - b.px; const dy = b.y - b.py; const dz = b.z - b.pz;\n const v2 = (dx * dx + dy * dy + dz * dz) / (h * h);\n const w2 = b.wx * b.wx + b.wy * b.wy + b.wz * b.wz;\n if (v2 < SLEEP_SPEED * SLEEP_SPEED && w2 < SLEEP_SPIN * SLEEP_SPIN) {\n b.restT += h;\n if (b.restT >= SLEEP_TIME) {\n b.asleep = true;\n b.vx = 0; b.vy = 0; b.vz = 0; b.wx = 0; b.wy = 0; b.wz = 0;\n }\n } else b.restT = 0;\n }\n\n function pair(a, b) {\n const dx = b.x - a.x; const dy = b.y - a.y; const dz = b.z - a.z;\n const rs = a.cr + b.cr;\n const lim = rs + CONTACT_EPS;\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 >= lim * lim) return;\n let d = Math.sqrt(d2);\n let nx = 0; let ny = 1; let nz = 0;\n if (d > 1e-6) { const inv = 1 / d; nx = dx * inv; ny = dy * inv; nz = dz * inv; } else d = 0;\n if (ny > SUPPORT_NY) b.sup = true; else if (ny < -SUPPORT_NY) a.sup = true;\n if (a.asleep && b.asleep) return;\n const pen = rs - d;\n if (pen <= 0) return;\n const vn = (b.vx - a.vx) * nx + (b.vy - a.vy) * ny + (b.vz - a.vz) * nz;\n // Wake on a hard hit or a deep overlap (never sleep jammed inside each other).\n if (-vn > WAKE_SPEED || pen > DEEP_PEN * rs) {\n if (a.asleep) wake(a);\n if (b.asleep) wake(b);\n }\n let ia = a.asleep ? 0 : a.invMass;\n let ib = b.asleep ? 0 : b.invMass;\n if (ia + ib <= 0) return;\n // Shock propagation lite: a floor body under another acts as ground (stops heavy bodies sinking into coins).\n let ga = ia; let gb = ib;\n if (ny > SUPPORT_NY && a.floor) ga = 0;\n else if (ny < -SUPPORT_NY && b.floor) gb = 0;\n if (ga + gb <= 0) { ga = ia; gb = ib; }\n if (vn < 0) {\n const s = -vn;\n // Resting contacts use the grounded masses; hard hits still shove the lower body sideways.\n if (s < GROUND_SPEED) { ia = ga; ib = gb; }\n const im = ia + ib;\n const fast = a.vx * a.vx + a.vy * a.vy + a.vz * a.vz > b.vx * b.vx + b.vy * b.vy + b.vz * b.vz ? a : b;\n const e = s > BOUNCE_MIN ? (a.bounce < b.bounce ? a.bounce : b.bounce) : 0;\n const j = ((1 + e) * s) / im;\n a.vx -= nx * j * ia; a.vy -= ny * j * ia; a.vz -= nz * j * ia;\n b.vx += nx * j * ib; b.vy += ny * j * ib; b.vz += nz * j * ib;\n // Coulomb friction on the tangential relative velocity.\n let tx = b.vx - a.vx; let ty = b.vy - a.vy; let tz = b.vz - a.vz;\n const rn = tx * nx + ty * ny + tz * nz;\n tx -= rn * nx; ty -= rn * ny; tz -= rn * nz;\n const tl = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tl > 1e-6) {\n const mu = (a.friction + b.friction) * 0.5;\n let jt = tl / im;\n if (jt > mu * j) jt = mu * j;\n const k = jt / tl;\n a.vx += tx * k * ia; a.vy += ty * k * ia; a.vz += tz * k * ia;\n b.vx -= tx * k * ib; b.vy -= ty * k * ib; b.vz -= tz * k * ib;\n }\n if (s > BOUNCE_MIN * 2) {\n const t = s * TUMBLE * 0.5;\n fast.wx += (random() - 0.5) * t;\n fast.wz += (random() - 0.5) * t;\n }\n if (s >= hitSpeed) impact(fast, s);\n }\n if (pen > SLOP) {\n // Mass-weighted split, clamped so a heavy body still yields (unjams coins wedged under tanks).\n let sa = ga / (ga + gb);\n if (ga > 0 && gb > 0) sa = sa < MIN_SHARE ? MIN_SHARE : sa > 1 - MIN_SHARE ? 1 - MIN_SHARE : sa;\n const c = (pen - SLOP) * CORRECT;\n const ca = c * sa; const cb = c - ca;\n a.x -= nx * ca; a.y -= ny * ca; a.z -= nz * ca;\n b.x += nx * cb; b.y += ny * cb; b.z += nz * cb;\n }\n }\n\n function collide(hc, maxR) {\n const cs = Math.max(2 * maxR + CONTACT_EPS, 0.25);\n const inv = 1 / cs;\n const x0 = lx - OUT_MARGIN - maxR;\n const y0 = fy - maxR - 1;\n const cols = clamp(Math.ceil((rx - lx + 2 * (OUT_MARGIN + maxR)) * inv), 1, GRID_MAX);\n const rows = clamp(Math.ceil(GRID_HEIGHT * inv), 1, GRID_MAX);\n cellHead.fill(-1, 0, cols * rows);\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) { cellX[k] = -1; continue; }\n const cx = clamp(Math.floor((b.x - x0) * inv), 0, cols - 1);\n const cy = clamp(Math.floor((b.y - y0) * inv), 0, rows - 1);\n cellX[k] = cx; cellY[k] = cy;\n const c = cy * cols + cx;\n next[k] = cellHead[c];\n cellHead[c] = k;\n }\n for (let k = 0; k < hc; k++) {\n const cx = cellX[k];\n if (cx < 0) continue;\n const a = bodies[heavy[k]];\n const cy = cellY[k];\n const ya = cy > 0 ? cy - 1 : 0; const yb = cy < rows - 1 ? cy + 1 : cy;\n const xa = cx > 0 ? cx - 1 : 0; const xb = cx < cols - 1 ? cx + 1 : cx;\n for (let yy = ya; yy <= yb; yy++) {\n for (let xx = xa; xx <= xb; xx++) {\n for (let m = cellHead[yy * cols + xx]; m !== -1; m = next[m]) {\n if (m > k) pair(a, bodies[heavy[m]]);\n }\n }\n }\n }\n }\n\n function step(dtIn) {\n let dt = Number(dtIn);\n if (!(dt > 0)) return;\n if (dt > DT_MAX) dt = DT_MAX;\n time += dt;\n if (wallsOpenT > 0) wallsOpenT -= dt;\n const n = bodies.length;\n let hc = 0;\n let maxV2 = 0;\n let minR = Infinity;\n let maxR = 0;\n for (let i = 0; i < n; i++) {\n const b = bodies[i];\n if (!b.alive) continue;\n const age = (b.age += dt);\n const remain = b.ttl - age;\n if (remain <= 0) { b.alive = false; b.scale = 0; continue; }\n let s = 1;\n let cr = b.radius;\n if (age < FADE_IN) { const t = 1 - age / FADE_IN; s = 1 - t * t * t; }\n if (remain < FADE_OUT) {\n const t = remain / FADE_OUT;\n const o = t * t * (3 - 2 * t);\n s *= o;\n cr *= o > 0.05 ? o : 0.05;\n }\n b.scale = s;\n b.cr = cr;\n if (b.light) {\n // Sleeping light bodies only wake on fade-out shrink or setBounds/sweep.\n if (b.asleep && remain >= FADE_OUT) continue;\n b.sup = false;\n b.px = b.x; b.py = b.y; b.pz = b.z;\n if (!b.asleep) integrate(b, dt);\n bounds(b);\n rest(b, dt);\n b.landed = b.sup;\n } else {\n heavy[hc++] = i;\n if (!b.asleep) {\n const v2 = b.vx * b.vx + b.vy * b.vy + b.vz * b.vz;\n if (v2 > maxV2) maxV2 = v2;\n }\n if (b.radius < minR) minR = b.radius;\n if (cr > maxR) maxR = cr;\n }\n }\n\n if (hc) {\n // Substeps so a fast body moves < ~0.8 radius per substep (no tunneling).\n const v = Math.sqrt(maxV2) + Math.abs(g) * dt;\n const sub = clamp(Math.ceil((v * dt) / (minR * 0.8)), 1, MAX_SUBSTEPS);\n const h = dt / sub;\n for (let s = 0; s < sub; s++) {\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) continue;\n b.sup = false;\n b.px = b.x; b.py = b.y; b.pz = b.z;\n if (!b.asleep) integrate(b, h);\n }\n if (hc > 1) collide(hc, maxR);\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) continue;\n bounds(b);\n rest(b, h);\n b.landed = b.sup;\n }\n }\n }\n\n if (windX !== 0 || windY !== 0) {\n const k = Math.exp(-dt / WIND_TAU);\n windX *= k; windY *= k;\n if (Math.abs(windX) < 0.01 && Math.abs(windY) < 0.01) { windX = 0; windY = 0; }\n }\n\n // Compact in place (keeps order), recycle dead bodies.\n let w = 0;\n const len = bodies.length;\n for (let i = 0; i < len; i++) {\n const b = bodies[i];\n if (b.alive) bodies[w++] = b;\n else { b.scale = 0; b.data = null; free.push(b); }\n }\n bodies.length = w;\n }\n\n function init(b, p, mass, light) {\n b.id = nextId++;\n b.kind = p.kind == null ? '' : p.kind;\n b.x = num(p.x, 0); b.y = num(p.y, 0); b.z = num(p.z, 0);\n b.vx = num(p.vx, 0); b.vy = num(p.vy, 0); b.vz = num(p.vz, 0);\n b.wx = num(p.wx, 0); b.wy = num(p.wy, 0); b.wz = num(p.wz, 0);\n const qx = num(p.qx, 0); const qy = num(p.qy, 0); const qz = num(p.qz, 0); const qw = num(p.qw, NaN);\n const ql = Number.isFinite(qw) ? Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw) : 0;\n if (ql > 1e-6) {\n b.qx = qx / ql; b.qy = qy / ql; b.qz = qz / ql; b.qw = qw / ql;\n } else {\n // Uniform random orientation (Shoemake).\n const u1 = random(); const u2 = random() * 6.283185307179586; const u3 = random() * 6.283185307179586;\n const a = Math.sqrt(1 - u1); const c = Math.sqrt(u1);\n b.qx = a * Math.sin(u2); b.qy = a * Math.cos(u2); b.qz = c * Math.sin(u3); b.qw = c * Math.cos(u3);\n }\n const r = num(p.radius, 0.5);\n b.radius = r > 0.01 ? r : 0.01;\n b.mass = mass;\n b.invMass = 1 / mass;\n b.light = light;\n b.bounce = clamp(num(p.bounce, 0.3), 0, 1);\n b.friction = clamp(num(p.friction, 0.5), 0, 1);\n b.drag = clamp(num(p.drag, 0.05), 0, 2);\n const ttl = num(p.ttl, DEFAULT_TTL);\n b.ttl = ttl > 0.05 ? ttl : 0.05;\n b.age = 0; b.scale = 0; b.cr = b.radius;\n b.landed = false; b.alive = true; b.asleep = false; b.sup = false;\n b.restT = 0; b.impactT = -1e9; b.phase = random() * 6.283185307179586;\n const hx = num(p.hx, 0); const hy = num(p.hy, 0); const hz = num(p.hz, 0);\n if (hx > 0 && hy > 0 && hz > 0) {\n // Prefer resting on thin axes (lower center = stable pose).\n const big = Math.max(hx, hy, hz);\n const m = 0.5 * big;\n let kx = m / (hx + m); let ky = m / (hy + m); let kz = m / (hz + m);\n kx *= kx; ky *= ky; kz *= kz;\n // Never stand on a clearly longest axis (car on its nose): it topples instead.\n const mid = hx + hy + hz - big - Math.min(hx, hy, hz);\n if (big > 1.5 * mid) {\n if (hx === big) kx = 0; else if (hy === big) ky = 0; else kz = 0;\n }\n b.hx = hx; b.hy = hy; b.hz = hz;\n b.kx = kx; b.ky = ky; b.kz = kz;\n } else { b.hx = 0; b.hy = 0; b.hz = 0; b.kx = 1; b.ky = 1; b.kz = 1; }\n b.variant = p.variant == null ? 0 : p.variant;\n b.data = p.data == null ? null : p.data;\n return b;\n }\n\n function oldestLight() {\n let best = null;\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n if (b.light && b.alive && (!best || b.age > best.age)) best = b;\n }\n return best;\n }\n\n function spawn(p) {\n if (!p || typeof p !== 'object') return null;\n const m = num(p.mass, 1);\n const mass = m > 1e-3 ? m : 1e-3;\n const light = mass < LIGHT_MASS;\n let b;\n if (bodies.length >= cap) {\n // Full: heavy bodies take over the oldest light one (in place), light spawns are dropped.\n if (light) return null;\n b = oldestLight();\n if (!b) return null;\n } else {\n b = free.pop() || makeBody();\n bodies.push(b);\n }\n return init(b, p, mass, light);\n }\n\n function setBounds(next = {}) {\n fy = num(next.floorY, fy);\n lx = num(next.left, lx);\n rx = num(next.right, rx);\n if (rx < lx) { const t = lx; lx = rx; rx = t; }\n for (let i = 0; i < bodies.length; i++) wake(bodies[i]);\n }\n\n function sweep(power = 1, dir) {\n const p = clamp(num(power, 1), 0, 3);\n let d = sweepDir;\n if (dir > 0) d = 1;\n else if (dir < 0) d = -1;\n else sweepDir = -sweepDir;\n windX = d * p * SWEEP_WIND;\n windY = p * SWEEP_LIFT;\n wallsOpenT = WALL_OPEN_TIME;\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n if (!b.alive) continue;\n wake(b);\n b.landed = false;\n const k = p / (1 + 0.35 * b.mass);\n b.vx += d * k * (10 + random() * 8);\n b.vy += k * (7 + random() * 6);\n b.wx += (random() - 0.5) * 12 * p;\n b.wy += (random() - 0.5) * 8 * p;\n b.wz -= d * (4 + random() * 6) * p;\n }\n }\n\n function clear() {\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n b.alive = false; b.scale = 0; b.data = null;\n free.push(b);\n }\n bodies.length = 0;\n windX = 0; windY = 0; wallsOpenT = 0; sweepDir = 1;\n }\n\n function onImpact(cb) {\n if (typeof cb !== 'function') return () => {};\n listeners.push(cb);\n return () => {\n const i = listeners.indexOf(cb);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n return { bodies, spawn, step, setBounds, sweep, clear, onImpact, get time() { return time; } };\n}\n","// Three.js scene for the Avalancha effect. Loaded lazily; `three` is an optional peer, so\n// AvalancheEffect falls back to the CSS rain when this module or WebGL is unavailable.\n// Bodies live in the JS world (physics.js); each frame they are packed into one InstancedMesh per\n// (model, part) from index 0, so `mesh.count` hides the dead ones without slot bookkeeping.\nimport {\n AmbientLight, Box3, CanvasTexture, Color, DirectionalLight, DynamicDrawUsage, Euler, InstancedMesh, Matrix4,\n MeshBasicMaterial, PerspectiveCamera, PlaneGeometry, PointLight, Quaternion, Scene, Vector3, WebGLRenderer,\n} from 'three';\nimport { createMoneyModels } from './models/money.js';\nimport { createCarModels } from './models/cars.js';\nimport { createTankModels } from './models/tanks.js';\nimport { createConfettiModels } from './models/confetti.js';\nimport { createBodyWorld } from './physics.js';\nimport { createAvalancheFx } from './fx.js';\n\nconst DISTANCE = 12;\nconst GRAVITY = -26;\n// Resting figures sit on the bottom edge of the frame.\nconst FLOOR_LIFT = 0.05;\n// Depth band: the floor is the frame's bottom edge at z=0, so bodies stay near that plane.\nconst Z_MIN = -2.5;\nconst Z_MAX = 1;\n// Cars, tanks and stacks are the \"big figures\"; the pile stays readable below this many.\nconst BIG_FAMILIES = new Set(['car', 'tank', 'stack']);\nconst FALLBACK_PALETTE = ['#ff4d8d', '#ffd23f', '#3ddc97', '#4cc9f0', '#9b5de5', '#ff7b29'].map((hex) => new Color(hex));\nconst TANK_HARD_SPEED = 12;\n\nconst rand = (min, max) => min + Math.random() * (max - min);\nconst pick = (items) => items[Math.floor(Math.random() * items.length)];\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n// 'car-muscle' and 'car-racer' are variants of the 'car' family.\nconst familyOf = (kind) => String(kind).split('-')[0];\n\n// Phones and low-core devices get smaller pools, Lambert shading, no MSAA and a lower pixel ratio.\nconst isLowPower = () => (typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches)\n || (navigator.hardwareConcurrency || 8) <= 4;\n\nfunction blobTexture(size = 64) {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n const gradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2);\n gradient.addColorStop(0, 'rgba(0,0,0,.55)');\n gradient.addColorStop(0.6, 'rgba(0,0,0,.25)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n return new CanvasTexture(canvas);\n}\n\n// Half extents around the origin (conservative if a model is off-center); physics uses them for floor contact.\nfunction halfExtents(parts) {\n const box = new Box3();\n parts.forEach(({ geometry }) => {\n if (!geometry.boundingBox) geometry.computeBoundingBox();\n box.union(geometry.boundingBox);\n });\n return {\n x: Math.max(Math.abs(box.min.x), Math.abs(box.max.x)),\n y: Math.max(Math.abs(box.min.y), Math.abs(box.max.y)),\n z: Math.max(Math.abs(box.min.z), Math.abs(box.max.z)),\n };\n}\n\nfunction createPool(scene, model, lowPower) {\n const family = familyOf(model.kind);\n const base = Math.round(lowPower ? (model.countLow ?? model.count) : model.count) || 1;\n // Bills from earlier cues are still alive at the finale; reserve room for its sweep.\n const reserve = family === 'bill' ? (lowPower ? 30 : 70) : 0;\n const capacity = Math.max(1, base + reserve);\n const palette = model.palette?.length ? model.palette : FALLBACK_PALETTE;\n const parts = model.parts.map(({ geometry, material, tinted }) => {\n const mesh = new InstancedMesh(geometry, material, capacity);\n mesh.instanceMatrix.setUsage(DynamicDrawUsage);\n mesh.frustumCulled = false;\n if (tinted) {\n // instanceColor must exist before the first render so the program compiles with it.\n for (let i = 0; i < capacity; i += 1) mesh.setColorAt(i, palette[0]);\n mesh.instanceColor.setUsage(DynamicDrawUsage);\n }\n mesh.count = 0;\n mesh.visible = false;\n scene.add(mesh);\n return { mesh, tinted: !!tinted };\n });\n const half = halfExtents(model.parts);\n return {\n kind: model.kind, family, model, parts, palette, capacity, used: 0, pending: 0, big: BIG_FAMILIES.has(family), half,\n // Contact-shadow radius: between the collision sphere and the long half axis.\n blobRadius: (model.radius + Math.max(half.x, half.z)) / 2,\n };\n}\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {{ lowPower?: boolean }} [options] lowPower forces the mobile profile; undefined autodetects.\n */\nexport function createAvalancheScene(canvas, { lowPower: forceLowPower } = {}) {\n const lowPower = !!(forceLowPower ?? isLowPower());\n const renderer = new WebGLRenderer({ canvas, alpha: true, antialias: !lowPower, powerPreference: 'high-performance' });\n // A failed setup must not keep the GL context alive.\n try {\n return buildScene(renderer, lowPower);\n } catch (error) {\n renderer.dispose();\n renderer.forceContextLoss?.();\n throw error;\n }\n}\n\nfunction buildScene(renderer, lowPower) {\n renderer.setPixelRatio(Math.min(lowPower ? 1.5 : 2, window.devicePixelRatio || 1));\n renderer.setClearColor(0x000000, 0);\n const scene = new Scene();\n const camera = new PerspectiveCamera(50, 1, 0.1, 80);\n camera.position.set(0, 0, DISTANCE);\n\n // Lambert (lowPower) reads a bit brighter than the mostly non-metallic standard materials; dim it slightly.\n const light = lowPower ? 0.8 : 1;\n const key = new DirectionalLight(0xffe0b0, 1.25 * light);\n key.position.set(5, 7, 9);\n const fill = new DirectionalLight(0x9cc8ff, 0.55 * light);\n fill.position.set(-7, 1, 5);\n const flash = new PointLight(0xfff1c2, 0, 40, 1.4);\n flash.position.set(0, 1, 5);\n scene.add(new AmbientLight(0xffffff, 0.5 * light), key, fill, flash);\n\n const models = [createMoneyModels, createCarModels, createTankModels, createConfettiModels]\n .flatMap((create) => create({ lowPower }) || []);\n const pools = models.map((model) => createPool(scene, model, lowPower));\n const byFamily = Object.create(null);\n pools.forEach((pool) => {\n if (!byFamily[pool.family]) byFamily[pool.family] = [];\n byFamily[pool.family].push(pool);\n });\n const capacityTotal = pools.reduce((sum, pool) => sum + pool.capacity, 0);\n\n const bounds = { left: -9.9, right: 9.9, top: 5.6, floorY: -5.6 + FLOOR_LIFT, room: 1 };\n const world = createBodyWorld({\n gravity: GRAVITY, floorY: bounds.floorY, left: bounds.left, right: bounds.right, zMin: Z_MIN, zMax: Z_MAX,\n maxBodies: Math.min(capacityTotal, lowPower ? 320 : 640),\n });\n const fx = createAvalancheFx(scene, { lowPower });\n\n // Soft contact shadows under big figures; desktop only.\n const BLOBS = lowPower ? 0 : 32;\n const blobMap = BLOBS ? blobTexture() : null;\n const blobs = BLOBS\n ? new InstancedMesh(new PlaneGeometry(1, 1).rotateX(-Math.PI / 2), new MeshBasicMaterial({ map: blobMap, transparent: true, depthWrite: false, opacity: 0.6 }), BLOBS)\n : null;\n if (blobs) {\n blobs.instanceMatrix.setUsage(DynamicDrawUsage);\n blobs.frustumCulled = false;\n blobs.count = 0;\n blobs.visible = false;\n blobs.renderOrder = -1;\n scene.add(blobs);\n }\n\n const BIG_MAX = lowPower ? 16 : 26;\n let bigCap = BIG_MAX;\n let bigAlive = 0;\n let bigPending = 0;\n const FX_PER_FRAME = lowPower ? 3 : 6;\n let fxBudget = FX_PER_FRAME;\n const scale = lowPower ? 0.55 : 1;\n let time = 0;\n let shake = 0;\n let flashLevel = 0;\n\n // Reused per frame.\n const matrix = new Matrix4();\n const position = new Vector3();\n const quaternion = new Quaternion();\n const identity = new Quaternion();\n const size = new Vector3();\n const euler = new Euler();\n\n // Physics skips light bodies (bills, confetti), so only heavy kinds land here.\n world.onImpact((body, speed) => {\n const gfx = body.data;\n if (!gfx || fxBudget <= 0 || time - gfx.fxAt < 0.3) return;\n const power = clamp(speed / 20, 0.2, 1);\n const y = body.y - body.radius * 0.6;\n switch (gfx.pool.family) {\n case 'car':\n fx.puff(body.x, y, body.z, power);\n break;\n case 'tank':\n fx.puff(body.x, y, body.z, power);\n if (speed > TANK_HARD_SPEED) {\n fx.blast(body.x, y, body.z, power);\n shake = Math.min(0.7, shake + 0.3 * power);\n flashLevel = Math.max(flashLevel, 0.4 * power);\n }\n break;\n case 'coin':\n case 'stack':\n fx.sparkle(body.x, body.y, body.z, power * 0.8);\n break;\n default:\n return;\n }\n gfx.fxAt = time;\n fxBudget -= 1;\n });\n\n // A random free variant of `family`, or null when every pool (or the big-figure cap) is full.\n function freePool(family) {\n const variants = byFamily[family];\n if (!variants) return null;\n const start = Math.floor(Math.random() * variants.length);\n for (let i = 0; i < variants.length; i += 1) {\n const pool = variants[(start + i) % variants.length];\n if (pool.used + pool.pending >= pool.capacity) continue;\n if (pool.big && bigAlive + bigPending >= bigCap) return null;\n return pool;\n }\n return null;\n }\n\n // o: { x, y, z, vx, vy, vz, wx, wy, wz, ttl, size, dragScale, yaw, tilt }.\n // `yaw` aims the model's front (+X); without it the body starts at a random orientation.\n function spawn(family, o) {\n const pool = freePool(family);\n if (!pool) return null;\n const { model, half } = pool;\n const s = o.size ?? rand(0.9, 1.1);\n if (o.yaw != null) {\n const tilt = o.tilt ?? 0.25;\n euler.set(rand(-tilt, tilt), o.yaw, rand(-tilt, tilt));\n } else {\n euler.set(rand(0, 6.3), rand(0, 6.3), rand(0, 6.3));\n }\n quaternion.setFromEuler(euler);\n const body = world.spawn({\n kind: model.kind,\n x: o.x, y: o.y, z: clamp(o.z ?? 0, Z_MIN, Z_MAX),\n vx: o.vx ?? 0, vy: o.vy ?? 0, vz: o.vz ?? 0,\n wx: o.wx ?? 0, wy: o.wy ?? 0, wz: o.wz ?? 0,\n qx: quaternion.x, qy: quaternion.y, qz: quaternion.z, qw: quaternion.w,\n hx: half.x * s, hy: half.y * s, hz: half.z * s,\n radius: model.radius * s,\n mass: model.mass * s,\n bounce: model.bounce,\n friction: model.friction,\n drag: model.drag * (o.dragScale ?? 1),\n ttl: o.ttl ?? 6,\n data: { pool, size: s, tint: pick(pool.palette), fxAt: -1 },\n });\n if (!body) return null;\n pool.pending += 1;\n if (pool.big) bigPending += 1;\n return body;\n }\n\n const confettiFamily = () => {\n const roll = Math.random();\n if (roll < 0.07 && byFamily.streamer) return 'streamer';\n if (roll < 0.14 && byFamily.star) return 'star';\n if (roll < 0.3 && byFamily.spark) return 'spark';\n return 'confetti';\n };\n\n // Party cannon from a bottom corner; side -1 = left, 1 = right. Lower drag so paper reaches\n // 5-10 u up despite the heavy gravity, then still flutters down.\n function cannon(side, power) {\n const x = side < 0 ? bounds.left + 0.5 : bounds.right - 0.5;\n const count = Math.round(80 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn(confettiFamily(), {\n x: x + rand(-0.3, 0.3), y: bounds.floorY + rand(0.3, 0.9), z: rand(Z_MIN, Z_MAX),\n vx: -side * rand(3, 9), vy: rand(24, 38), vz: rand(-1.5, 1.5),\n wx: rand(-14, 14), wy: rand(-14, 14), wz: rand(-14, 14),\n ttl: rand(3.5, 5.2), size: rand(0.8, 1.25), dragScale: 0.4,\n });\n }\n }\n\n function bills(power) {\n const count = Math.round(42 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('bill', {\n x: rand(bounds.left + 0.6, bounds.right - 0.6), y: bounds.top + rand(0.3, 3.5), z: rand(Z_MIN, Z_MAX),\n vx: rand(-1.5, 1.5), vy: rand(-3, 0), vz: rand(-0.5, 0.5),\n wx: rand(-7, 7), wy: rand(-3, 3), wz: rand(-7, 7),\n ttl: rand(5, 6.5), size: rand(0.9, 1.15),\n });\n }\n }\n\n function stacks(count) {\n for (let i = 0; i < count; i += 1) {\n spawn('stack', {\n x: rand(bounds.left, bounds.right) * 0.75, y: bounds.top + rand(0.6, 2.2), z: rand(-1.5, 0.5),\n vx: rand(-2, 2), vy: rand(-4, -1),\n wx: rand(-3, 3), wy: rand(-2, 2), wz: rand(-3, 3),\n ttl: rand(6.5, 7.5),\n });\n }\n }\n\n function coins(power) {\n const count = Math.round(48 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('coin', {\n x: rand(bounds.left + 0.5, bounds.right - 0.5) * 0.85, y: bounds.top + rand(0.3, 3), z: rand(-2, 0.8),\n vx: rand(-2, 2), vy: rand(-7, -1),\n wx: rand(-12, 12), wy: rand(-4, 4), wz: rand(-12, 12),\n ttl: rand(5, 6.5), size: rand(0.9, 1.15),\n });\n }\n }\n\n // Thrown in from the top corners, alternating sides, tumbling toward the middle.\n function cars(count) {\n const first = Math.random() < 0.5 ? -1 : 1;\n for (let i = 0; i < count; i += 1) {\n const side = i % 2 ? -first : first;\n spawn('car', {\n x: side < 0 ? bounds.left + rand(1.3, 3) : bounds.right - rand(1.3, 3),\n y: bounds.top + rand(0.8, 2.4) + i * 0.4, z: rand(-1.8, 0.4),\n vx: -side * rand(3, 7.5), vy: rand(-1, 3), vz: rand(-1, 0.6),\n wx: rand(-2.5, 2.5), wy: rand(-2, 2), wz: rand(-5, 5),\n yaw: side < 0 ? 0 : Math.PI, tilt: 0.4,\n ttl: rand(6.5, 7.5), size: rand(0.92, 1.08),\n });\n }\n }\n\n // Heavy drop spread across the width, shown mostly in profile.\n function tanks(count) {\n const span = Math.max(0, bounds.right - bounds.left - 4);\n for (let i = 0; i < count; i += 1) {\n spawn('tank', {\n x: bounds.left + 2 + span * ((i + 0.5 + rand(-0.25, 0.25)) / count),\n y: bounds.top + rand(1, 3), z: rand(-1.6, 0.3),\n vx: rand(-1, 1), vy: rand(-9, -5),\n wx: rand(-0.6, 0.6), wy: rand(-1.5, 1.5), wz: rand(-0.6, 0.6),\n yaw: (Math.random() < 0.5 ? 0 : Math.PI) + rand(-0.5, 0.5), tilt: 0.15,\n ttl: rand(6.5, 7.5), size: rand(0.95, 1.06),\n });\n }\n }\n\n const bigCount = (base, min, max) => clamp(Math.round(base * bounds.room * (lowPower ? 0.75 : 1)), min, max);\n\n const bursts = {\n confetti(power) {\n cannon(-1, power);\n cannon(1, power);\n },\n money(power) {\n bills(power);\n stacks(Math.round((2 + 2 * power) * (lowPower ? 0.6 : 1)));\n coins(power * 0.15);\n },\n cars(power) {\n cars(bigCount(3 + 2 * power, 2, 5));\n },\n tanks(power) {\n tanks(bigCount(2 + 2 * power, lowPower ? 1 : 2, 4));\n },\n coins(power) {\n coins(power);\n stacks(1);\n },\n // Everything at once; the pools and the big-figure cap keep it bounded.\n mix(power) {\n cannon(-1, power * 0.5);\n cannon(1, power * 0.5);\n bills(power * 0.55);\n coins(power * 0.45);\n stacks(lowPower ? 1 : 2);\n cars(bigCount(2 + power, 1, 3));\n tanks(bigCount(1 + power, 1, 2));\n },\n // The pile fades while the gust sweeps it right, and a wall of bills crosses from the left.\n finale(power) {\n const { bodies } = world;\n for (let i = 0; i < bodies.length; i += 1) {\n const body = bodies[i];\n if (body.alive) body.ttl = Math.min(body.ttl, body.age + rand(0.9, 1.4));\n }\n world.sweep(power, 1);\n const count = Math.round(80 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('bill', {\n x: bounds.left - rand(0.3, 2.5), y: rand(bounds.floorY + 1, bounds.top + 0.5), z: rand(Z_MIN, Z_MAX),\n vx: rand(20, 32), vy: rand(2, 7), vz: rand(-1, 1),\n wx: rand(-9, 9), wy: rand(-4, 4), wz: rand(-9, 9),\n ttl: rand(1.2, 1.5), size: rand(0.9, 1.2), dragScale: 0.3,\n });\n }\n for (let i = 0; i < 3; i += 1) fx.sparkle(rand(bounds.left, bounds.right) * 0.6, rand(-1, 2), 0, 1);\n shake = Math.max(shake, 0.45);\n },\n };\n\n // Copies live bodies into packed instance slots.\n function sync() {\n for (let p = 0; p < pools.length; p += 1) {\n pools[p].used = 0;\n pools[p].pending = 0;\n }\n let big = 0;\n let blobCount = 0;\n const { bodies } = world;\n for (let i = 0; i < bodies.length; i += 1) {\n const body = bodies[i];\n const gfx = body.data;\n if (!body.alive || !gfx) continue;\n const { pool } = gfx;\n if (pool.used >= pool.capacity) continue;\n const s = gfx.size * body.scale;\n position.set(body.x, body.y, body.z);\n quaternion.set(body.qx, body.qy, body.qz, body.qw);\n size.set(s, s, s);\n matrix.compose(position, quaternion, size);\n const index = pool.used;\n pool.used += 1;\n const { parts } = pool;\n for (let m = 0; m < parts.length; m += 1) {\n const part = parts[m];\n part.mesh.setMatrixAt(index, matrix);\n if (part.tinted) part.mesh.setColorAt(index, gfx.tint);\n }\n if (!pool.big) continue;\n big += 1;\n if (blobCount >= BLOBS) continue;\n // Shrinks as the figure rises off the floor.\n const lift = body.y - bounds.floorY - pool.half.y * gfx.size;\n const r = pool.blobRadius * s * clamp(1 - lift / 6, 0.15, 1);\n position.set(body.x, bounds.floorY + 0.02, body.z);\n size.set(r * 2.4, 1, r * 1.5);\n matrix.compose(position, identity, size);\n blobs.setMatrixAt(blobCount, matrix);\n blobCount += 1;\n }\n for (let p = 0; p < pools.length; p += 1) {\n const { parts, used } = pools[p];\n for (let m = 0; m < parts.length; m += 1) {\n const { mesh, tinted } = parts[m];\n mesh.count = used;\n mesh.visible = used > 0;\n if (!used) continue;\n mesh.instanceMatrix.needsUpdate = true;\n if (tinted) mesh.instanceColor.needsUpdate = true;\n }\n }\n bigAlive = big;\n bigPending = 0;\n if (blobs) {\n blobs.count = blobCount;\n blobs.visible = blobCount > 0;\n blobs.instanceMatrix.needsUpdate = true;\n }\n }\n\n return {\n lowPower,\n // Debug snapshot for the lab/QA; allocates, so not for per-frame use in the app.\n stats() {\n const live = Object.create(null);\n let bodies = 0;\n pools.forEach(({ family, used }) => { live[family] = (live[family] || 0) + used; bodies += used; });\n return { bodies, big: bigAlive, bigCap, live, calls: renderer.info.render.calls, triangles: renderer.info.render.triangles };\n },\n burst(kind, power = 1) {\n bursts[kind]?.(power);\n flashLevel = Math.max(flashLevel, kind === 'finale' ? 1 : power * 0.3);\n },\n render(dt) {\n const step = Math.min(dt, 0.05);\n time += step;\n fxBudget = FX_PER_FRAME;\n world.step(step);\n fx.update(step);\n sync();\n shake = Math.max(0, shake - step * 2.2);\n flashLevel = Math.max(0, flashLevel - step * 2.5);\n flash.intensity = flashLevel * 4 * light;\n camera.position.x = (Math.random() - 0.5) * shake * 0.4;\n camera.position.y = (Math.random() - 0.5) * shake * 0.4;\n renderer.render(scene, camera);\n },\n resize(width, height) {\n renderer.setSize(width, height, false);\n camera.aspect = width / height;\n // Portrait chat windows widen the lens so the big figures fit across.\n camera.fov = camera.aspect < 1 ? clamp((50 / Math.max(camera.aspect, 0.55)) * 0.8, 50, 85) : 50;\n camera.updateProjectionMatrix();\n const halfHeight = Math.tan((camera.fov * Math.PI) / 360) * DISTANCE;\n const halfWidth = halfHeight * camera.aspect;\n bounds.top = halfHeight;\n bounds.floorY = -halfHeight + FLOOR_LIFT;\n bounds.left = -halfWidth;\n bounds.right = halfWidth;\n // Narrow windows get fewer big figures.\n bounds.room = clamp((halfWidth * 2) / 16, 0.5, 1);\n bigCap = Math.max(8, Math.round(BIG_MAX * bounds.room));\n world.setBounds({ floorY: bounds.floorY, left: bounds.left, right: bounds.right });\n },\n dispose() {\n fx.dispose();\n world.clear();\n const geometries = new Set();\n const materials = new Set();\n const textures = new Set();\n pools.forEach(({ parts }) => parts.forEach(({ mesh }) => {\n // InstancedMesh owns the instanceMatrix/instanceColor GPU buffers.\n mesh.dispose();\n scene.remove(mesh);\n }));\n models.forEach(({ parts }) => parts.forEach(({ geometry, material }) => {\n geometries.add(geometry);\n [].concat(material).forEach((entry) => materials.add(entry));\n }));\n if (blobs) {\n blobs.dispose();\n scene.remove(blobs);\n geometries.add(blobs.geometry);\n materials.add(blobs.material);\n }\n materials.forEach((entry) => {\n Object.keys(entry).forEach((name) => { if (entry[name]?.isTexture) textures.add(entry[name]); });\n entry.dispose();\n });\n textures.forEach((texture) => texture.dispose());\n geometries.forEach((geometry) => geometry.dispose());\n renderer.dispose();\n renderer.forceContextLoss?.();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"avalancheScene3d-CNbQyGUd.js","names":["clamp","createCarModels","WHEELS","createTankGeometries","TURRET_PIVOT","GUN_PIVOT","createAvalancheFx","TAU","BILL","STACK_HEIGHT","COIN","SERIF","INK","BAND_COLORS","FACE_V","EDGE_V","context2d","canvas","width","height","emboss","depth","color","style","offset","ctx","draw","starPath","i","radius","inner","outer","angle","cx","cy","rosette","j","phase","petals","t","r","drawBillFace","w","h","base","k","x","y0","glow","text","y","size","drawPaperEdges","step","moneyAtlas","lowPower","texture","CanvasTexture","coinTexture","c","field","remapBoxUv","normal","geometry","uv","v0","v1","billGeometry","BoxGeometry","length","thickness","position","stackGeometry","coinGeometry","segments","CylinderGeometry","createMoneyModels","material","MeshLambertMaterial","options","MeshStandardMaterial","standard","atlas","coinMap","paper","gold","Color","hex","TEAM_ORDER","GUN_LENGTH","GUN_PITCH","FIT","Vector3","ROOF_Y","TRACK_W","TREAD","GROOVE","toSRGB","createSink","bake","pos","nrm","col","normalMatrix","Matrix3","matrix","v","inBounds","capY","box","sink","g","b","srgb","finish","p","center","scale","BufferGeometry","BufferAttribute","trackGeometry","road","sprocket","idler","rr","path","arc","n","a","a0","a1","trackZ","x0","x1","y1","len","nx","ny","steps","link","s","t0","t1","ax","ay","bx","by","side","z0","z1","quad","q","createTankModels","geos","track","Box3","identity","Matrix4","turretAt","gunAt","Quaternion","body","accent","gear","wheelAt","noTurn","barrel","lamps","bodyMat","gearMat","DoubleSide","barrelMat","accentMat","MeshBasicMaterial","lampMat","TEAM","name","PARTY","GOLDEN","colors","list","makeMaterial","paperGeometry","PlaneGeometry","streamerGeometry","positions","normals","indices","nz","tilt","starGeometry","shape","Shape","ExtrudeGeometry","createConfettiModels","streamer","star","spark","CircleGeometry","DT_MAX","MAX_SUBSTEPS","LIGHT_MASS","DEFAULT_TTL","DRAG_K","AIR_SPIN_DAMP","CONTACT_SPIN_DAMP","FLOOR_FRICTION","SETTLE_K","BOUNCE_MIN","IMPACT_SPEED","IMPACT_GAP","WAKE_SPEED","SLEEP_SPEED","SLEEP_SPIN","SLEEP_TIME","CONTACT_EPS","SUPPORT_NY","SLOP","MIN_SHARE","DEEP_PEN","GROUND_SPEED","CORRECT","FADE_IN","FADE_OUT","FLUTTER","FLUTTER_DRAG","TUMBLE","SWEEP_WIND","SWEEP_LIFT","WIND_TAU","WALL_OPEN_TIME","OUT_MARGIN","GRID_MAX","GRID_HEIGHT","num","d","clamp$1","lo","hi","makeBody","createBodyWorld","cap","maxBodies","gravity","zMin","zMax","hitSpeed","impactSpeed","fy","floorY","lx","left","rx","right","bodies","free","listeners","heavy","next","cellX","cellY","cellHead","nextId","time","windX","windY","wallsOpenT","sweepDir","wake","impact","lightImpacts","speed","integrate","vx","vy","vz","drag","landed","wx","wy","wz","qx","qy","qz","qw","ux","uy","uz","sx","sy","sz","az","sign","hh","nw","inv","bounds","cr","top","random","rest","dx","dy","dz","v2","w2","pair","rs","lim","d2","pen","vn","ia","ib","ga","gb","im","fast","tx","ty","tz","rn","tl","mu","jt","sa","ca","cb","collide","maxR","cols","rows","hc","ya","yb","xa","xb","yy","xx","m","dt","dtIn","maxV2","minR","age","remain","o","sub","init","ql","u1","u2","u3","mass","light","ttl","hx","hy","hz","big","kx","ky","kz","oldestLight","best","spawn","setBounds","sweep","power","dir","clear","onImpact","DISTANCE","GRAVITY","FLOOR_LIFT","Z_MIN","Z_MAX","BIG_FAMILIES","FALLBACK_PALETTE","TANK_HARD_SPEED","rand","min","max","pick","items","clamp","value","familyOf","kind","isLowPower","blobTexture","gradient","halfExtents","parts","createPool","family","model","capacity","palette","mesh","InstancedMesh","DynamicDrawUsage","tinted","scene","half","createAvalancheScene","forceLowPower","renderer","WebGLRenderer","buildScene","error","Scene","camera","PerspectiveCamera","key","DirectionalLight","fill","flash","PointLight","AmbientLight","models","create","pools","byFamily","pool","capacityTotal","sum","world","fx","BLOBS","blobMap","blobs","BIG_MAX","bigCap","bigAlive","bigPending","FX_PER_FRAME","fxBudget","shake","flashLevel","quaternion","euler","Euler","gfx","freePool","variants","start","confettiFamily","roll","cannon","count","bills","stacks","coins","cars","first","tanks","span","bigCount","bursts","sync","blobCount","index","part","lift","used","live","halfHeight","halfWidth","geometries","materials","textures","entry"],"sources":["../../src/effects/avalanche/models/money.js","../../src/effects/avalanche/models/tanks.js","../../src/effects/avalanche/models/confetti.js","../../src/effects/avalanche/physics.js","../../src/effects/avalanche/avalancheScene3d.js"],"sourcesContent":["// Money for the Avalancha effect: banknotes that glide, strapped stacks and bouncy gold coins.\n// Everything lies flat (face +Y, length along X, width along Z), centered on its box.\n// Textures are drawn on demand, so importing this module never touches the DOM.\nimport {\n BoxGeometry, CanvasTexture, Color, CylinderGeometry, MeshLambertMaterial, MeshStandardMaterial,\n} from 'three';\n\nconst TAU = Math.PI * 2;\nconst BILL = { length: 1.0, width: 0.45, thickness: 0.02 };\nconst STACK_HEIGHT = 0.35;\nconst COIN = { radius: 0.32, thickness: 0.08 };\nconst SERIF = 'Georgia, \"Times New Roman\", serif';\nconst INK = '#1f5a32';\n// Paper straps come in a few denomination colors.\nconst BAND_COLORS = ['#d9a93a', '#8e5bd1', '#d64545', '#3b8fd9'];\n// Atlas rows (texture v): the note face on top, stacked paper edges below.\nconst FACE_V = [0.502, 1];\nconst EDGE_V = [0, 0.49];\n\n// Browsers get a DOM canvas, workers an OffscreenCanvas; tests without either get untextured money.\nfunction context2d(width, height) {\n let canvas = null;\n if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n } else if (typeof OffscreenCanvas !== 'undefined') {\n canvas = new OffscreenCanvas(width, height);\n }\n return canvas?.getContext('2d') || null;\n}\n\n// Fake relief: dark copy down-right, light copy up-left, then the face color on top.\nfunction emboss(ctx, depth, color, draw) {\n [['rgba(90, 55, 0, 0.7)', depth], ['rgba(255, 248, 210, 0.9)', -depth], [color, 0]].forEach(([style, offset]) => {\n ctx.save();\n ctx.translate(offset, offset);\n draw(style);\n ctx.restore();\n });\n}\n\nfunction starPath(ctx, cx, cy, outer, inner) {\n ctx.beginPath();\n for (let i = 0; i < 10; i += 1) {\n const radius = i % 2 ? inner : outer;\n const angle = (i / 10) * TAU - Math.PI / 2;\n ctx.lineTo(cx + Math.cos(angle) * radius, cy + Math.sin(angle) * radius);\n }\n ctx.closePath();\n}\n\n// Guilloche flower: phase-shifted petal loops.\nfunction rosette(ctx, cx, cy, radius, petals) {\n for (let j = 0; j < 10; j += 1) {\n const phase = (j / 10) * (TAU / petals);\n ctx.beginPath();\n for (let i = 0; i <= 120; i += 1) {\n const t = (i / 120) * TAU;\n const r = radius * (0.7 + 0.3 * Math.sin(petals * t + phase));\n ctx.lineTo(cx + Math.cos(t) * r, cy + Math.sin(t) * r * 0.92);\n }\n ctx.stroke();\n }\n}\n\n// Original playful note (not modeled on any real currency), in a 512x230 design space.\nfunction drawBillFace(ctx, w, h) {\n const cx = w / 2;\n const cy = h / 2;\n const base = ctx.createLinearGradient(0, 0, w, h);\n base.addColorStop(0, '#b2d7a3');\n base.addColorStop(0.5, '#93c385');\n base.addColorStop(1, '#acd39c');\n ctx.fillStyle = base;\n ctx.fillRect(0, 0, w, h);\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = 'rgba(40, 110, 60, 0.28)';\n for (let k = 0; k < 7; k += 1) {\n [28, h - 28].forEach((y0) => {\n ctx.beginPath();\n for (let x = 0; x <= w; x += 4) ctx.lineTo(x, y0 + Math.sin(x * 0.045 + k * 0.9) * 7);\n ctx.stroke();\n });\n }\n rosette(ctx, w * 0.2, cy, 62, 9);\n rosette(ctx, w * 0.8, cy, 62, 12);\n\n ctx.strokeStyle = INK;\n ctx.lineWidth = 8;\n ctx.strokeRect(7, 7, w - 14, h - 14);\n ctx.lineWidth = 2;\n ctx.strokeRect(17, 17, w - 34, h - 34);\n\n // Portrait oval: engraved hatching behind an abstract bust.\n ctx.save();\n ctx.beginPath();\n ctx.ellipse(cx, cy, 58, 70, 0, 0, TAU);\n const glow = ctx.createRadialGradient(cx, cy - 12, 6, cx, cy, 74);\n glow.addColorStop(0, '#dcefd3');\n glow.addColorStop(1, '#94c486');\n ctx.fillStyle = glow;\n ctx.fill();\n ctx.clip();\n ctx.strokeStyle = 'rgba(31, 90, 50, 0.22)';\n ctx.lineWidth = 1;\n for (let x = cx - 60; x <= cx + 60; x += 4) {\n ctx.beginPath();\n ctx.moveTo(x, cy - 72);\n ctx.lineTo(x, cy + 72);\n ctx.stroke();\n }\n ctx.fillStyle = 'rgba(31, 90, 50, 0.78)';\n ctx.beginPath();\n ctx.arc(cx, cy - 16, 20, 0, TAU);\n ctx.fill();\n ctx.beginPath();\n ctx.ellipse(cx, cy + 50, 42, 40, 0, Math.PI, TAU);\n ctx.fill();\n ctx.restore();\n ctx.strokeStyle = INK;\n ctx.lineWidth = 4;\n ctx.beginPath();\n ctx.ellipse(cx, cy, 58, 70, 0, 0, TAU);\n ctx.stroke();\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.ellipse(cx, cy, 63, 75, 0, 0, TAU);\n ctx.stroke();\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.lineJoin = 'round';\n // Big \"$\" and \"100\" with a pale outline so they read over the guilloche.\n [['$', w * 0.2, cy + 4, 120], ['100', w * 0.8, cy + 2, 56]].forEach(([text, x, y, size]) => {\n ctx.font = `bold ${size}px ${SERIF}`;\n ctx.lineWidth = 6;\n ctx.strokeStyle = '#d6ebcd';\n ctx.strokeText(text, x, y);\n ctx.fillStyle = INK;\n ctx.fillText(text, x, y);\n });\n\n // Corner cartouches.\n ctx.font = `bold 24px ${SERIF}`;\n [[52, 40], [w - 52, 40], [52, h - 40], [w - 52, h - 40]].forEach(([x, y]) => {\n ctx.beginPath();\n ctx.ellipse(x, y, 31, 16, 0, 0, TAU);\n ctx.fillStyle = '#cfe6c4';\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = INK;\n ctx.stroke();\n ctx.fillStyle = INK;\n ctx.fillText('100', x, y + 1);\n });\n\n ctx.font = `bold 14px ${SERIF}`;\n ctx.fillText('★ AVALANCHA ★', cx, 30);\n ctx.fillText('CIEN', cx, h - 29);\n ctx.font = `12px ${SERIF}`;\n ctx.fillStyle = '#a8323a';\n ctx.textAlign = 'left';\n ctx.fillText('AV 7000 2026', 90, 44);\n ctx.textAlign = 'right';\n ctx.fillText('AV 7000 2026', w - 90, h - 44);\n}\n\n// Side of a stack: many sheets, with the odd darker one.\nfunction drawPaperEdges(ctx, w, h) {\n ctx.fillStyle = '#d9eacf';\n ctx.fillRect(0, 0, w, h);\n const sheets = 36;\n const step = h / sheets;\n for (let i = 0; i < sheets; i += 1) {\n ctx.fillStyle = i % 5 === 2 ? '#76ad69' : i % 2 ? '#b7d5aa' : '#cbe2bf';\n ctx.fillRect(0, i * step + step * 0.55, w, Math.max(1, step * 0.35));\n }\n}\n\n// One POT atlas shared by bills and stacks: note face in the top half, paper edges below.\nfunction moneyAtlas(lowPower) {\n const size = lowPower ? 256 : 512;\n const ctx = context2d(size, size);\n if (!ctx) return null;\n ctx.save();\n // The note keeps its real 1.0x0.45 aspect in design space and is squeezed into the half.\n ctx.scale(size / 512, size / 2 / 230);\n drawBillFace(ctx, 512, 230);\n ctx.restore();\n ctx.save();\n ctx.translate(0, size / 2);\n drawPaperEdges(ctx, size, size / 2);\n ctx.restore();\n const texture = new CanvasTexture(ctx.canvas);\n texture.anisotropy = lowPower ? 1 : 4;\n return texture;\n}\n\nfunction coinTexture(lowPower) {\n const size = lowPower ? 128 : 256;\n const ctx = context2d(size, size);\n if (!ctx) return null;\n const c = size / 2;\n const depth = size / 128;\n // Reeded rim; the coin's edge samples this ring too.\n for (let i = 0; i < 96; i += 1) {\n const angle = (i / 96) * TAU;\n ctx.fillStyle = i % 2 ? '#f0c24a' : '#9c6c10';\n ctx.beginPath();\n ctx.moveTo(c, c);\n ctx.arc(c, c, c * 1.5, angle, angle + TAU / 96 + 0.01);\n ctx.fill();\n }\n const field = ctx.createRadialGradient(c * 0.75, c * 0.7, c * 0.05, c, c, c * 0.9);\n field.addColorStop(0, '#fff3b8');\n field.addColorStop(0.5, '#f5c84a');\n field.addColorStop(1, '#c08a14');\n ctx.fillStyle = field;\n ctx.beginPath();\n ctx.arc(c, c, c * 0.88, 0, TAU);\n ctx.fill();\n\n emboss(ctx, depth, '#e9b93c', (style) => {\n ctx.strokeStyle = style;\n ctx.lineWidth = c * 0.05;\n ctx.beginPath();\n ctx.arc(c, c, c * 0.84, 0, TAU);\n ctx.stroke();\n });\n emboss(ctx, depth * 0.6, '#efc24a', (style) => {\n ctx.fillStyle = style;\n ctx.beginPath();\n for (let i = 0; i < 30; i += 1) {\n const angle = (i / 30) * TAU;\n const x = c + Math.cos(angle) * c * 0.74;\n const y = c + Math.sin(angle) * c * 0.74;\n ctx.moveTo(x + c * 0.03, y);\n ctx.arc(x, y, c * 0.03, 0, TAU);\n }\n ctx.fill();\n });\n emboss(ctx, depth * 1.5, '#f6cd52', (style) => {\n ctx.fillStyle = style;\n starPath(ctx, c, c, c * 0.62, c * 0.3);\n ctx.fill();\n });\n emboss(ctx, depth, '#c99418', (style) => {\n ctx.fillStyle = style;\n ctx.font = `bold ${Math.round(c * 0.5)}px ${SERIF}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('$', c, c * 1.03);\n });\n return new CanvasTexture(ctx.canvas);\n}\n\n// Faces whose normal is ±Y show the note; the thin sides show paper edges.\nfunction remapBoxUv(geometry) {\n const normal = geometry.attributes.normal;\n const uv = geometry.attributes.uv;\n for (let i = 0; i < uv.count; i += 1) {\n const [v0, v1] = Math.abs(normal.getY(i)) > 0.5 ? FACE_V : EDGE_V;\n uv.setY(i, v0 + uv.getY(i) * (v1 - v0));\n }\n}\n\n// Thin slab with a slight paper bend: both ends lift along the length.\nfunction billGeometry(lowPower) {\n const { length, width, thickness } = BILL;\n const geometry = new BoxGeometry(length, thickness, width, lowPower ? 4 : 8, 1, 1);\n remapBoxUv(geometry);\n const position = geometry.attributes.position;\n for (let i = 0; i < position.count; i += 1) {\n const x = position.getX(i) / (length / 2);\n position.setY(i, position.getY(i) + x * x * 0.05);\n }\n geometry.computeVertexNormals();\n geometry.center();\n return geometry;\n}\n\nfunction stackGeometry() {\n const geometry = new BoxGeometry(BILL.length, STACK_HEIGHT, BILL.width);\n remapBoxUv(geometry);\n return geometry;\n}\n\n// Flat cylinder; its side samples the reeded ring of the face texture instead of the whole design.\nfunction coinGeometry(lowPower) {\n const segments = lowPower ? 16 : 24;\n const geometry = new CylinderGeometry(COIN.radius, COIN.radius, COIN.thickness, segments, 1);\n const position = geometry.attributes.position;\n const uv = geometry.attributes.uv;\n // Torso vertices come first in CylinderGeometry.\n for (let i = 0; i < (segments + 1) * 2; i += 1) {\n uv.setXY(i, 0.5 + 0.47 * (position.getZ(i) / COIN.radius), 0.5 + 0.47 * (position.getX(i) / COIN.radius));\n }\n return geometry;\n}\n\nexport function createMoneyModels({ lowPower = false } = {}) {\n const material = (options, standard = {}) => (lowPower\n ? new MeshLambertMaterial(options)\n : new MeshStandardMaterial({ roughness: 0.8, metalness: 0, ...options, ...standard }));\n const atlas = moneyAtlas(lowPower);\n const coinMap = coinTexture(lowPower);\n // Slightly grey base so bright party lights don't wash the note out to white.\n const paper = () => material({ color: atlas ? 0xb8c6b3 : 0x8fc27f, map: atlas });\n // Without an env map a fully metallic coin renders black; the emissive map keeps its gold body lit.\n const gold = material(\n { color: coinMap ? 0xffffff : 0xffc83d, map: coinMap, emissive: lowPower ? 0x5a3e0c : 0x8a6418, emissiveMap: coinMap },\n { metalness: 0.85, roughness: 0.25 },\n );\n\n return [\n {\n kind: 'bill',\n parts: [{ geometry: billGeometry(lowPower), material: paper() }],\n radius: 0.45,\n mass: 0.05,\n bounce: 0.12,\n friction: 0.6,\n drag: 0.85,\n count: 60,\n countLow: 30,\n },\n {\n kind: 'stack',\n parts: [\n { geometry: stackGeometry(), material: paper() },\n // Strap slightly larger than the stack so it never z-fights.\n { geometry: new BoxGeometry(0.2, STACK_HEIGHT + 0.012, BILL.width + 0.012), material: material({ color: 0xffffff }, { roughness: 0.6 }), tinted: true },\n ],\n palette: BAND_COLORS.map((hex) => new Color(hex)),\n radius: 0.52,\n mass: 0.8,\n bounce: 0.22,\n friction: 0.7,\n drag: 0.12,\n count: 12,\n countLow: 6,\n },\n {\n kind: 'coin',\n parts: [{ geometry: coinGeometry(lowPower), material: gold }],\n radius: 0.32,\n mass: 0.3,\n bounce: 0.65,\n friction: 0.35,\n drag: 0.04,\n count: 50,\n countLow: 24,\n },\n ];\n}\n","// Tanks for the Avalancha effect: the Tanques de guerra toy tank baked into static merged parts.\n// Reuses the game's pure geometry builders (src/games/tanks/scene/tank.js stays untouched):\n// turret and gun are frozen in one pose, the barrel is shortened, then everything is centered\n// and scaled: body ≈2.6 × 1.05 × 1.55, barrel tip at x 1.475 (front +X).\n// Colors are plain sRGB hex values (linear-output renderer, like the confetti scene).\nimport {\n Box3, BufferAttribute, BufferGeometry, Color, DoubleSide, Matrix3, Matrix4, MeshBasicMaterial, MeshLambertMaterial,\n MeshStandardMaterial, Quaternion, Vector3,\n} from 'three';\nimport { createTankGeometries, GUN_PIVOT, TEAM, TURRET_PIVOT, WHEELS } from '../../../games/tanks/scene/tank.js';\n\nconst TEAM_ORDER = ['green', 'red']; // TEAM_COLORS in src/games/tanks/view.js\nconst GUN_LENGTH = 0.62; // barrel x-scale: stubbier toy gun\nconst GUN_PITCH = 0.1; // rad\nconst FIT = new Vector3(2.95, 1.1, 1.6); // max box: length (incl. barrel), height, width\nconst ROOF_Y = 1.2; // turret-local y cap for bounds (antenna excluded)\nconst TRACK_W = 0.74; // mirrors tank.js\nconst TREAD = new Color('#3b3b3e');\nconst GROOVE = new Color('#1b1b1d');\n\nconst toSRGB = (c) => (c <= 0.0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055);\n\nfunction createSink() {\n return { p: [], n: [], c: [] };\n}\n\n// Append a non-indexed geometry transformed by `matrix`; linear vertex colors become sRGB.\nfunction bake(sink, geometry, matrix, box, { srgb = true, capY = Infinity } = {}) {\n const pos = geometry.attributes.position;\n const nrm = geometry.attributes.normal;\n const col = geometry.attributes.color;\n const normalMatrix = new Matrix3().getNormalMatrix(matrix);\n const v = new Vector3();\n for (let i = 0; i < pos.count; i += 1) {\n v.fromBufferAttribute(pos, i);\n const inBounds = v.y <= capY;\n v.applyMatrix4(matrix);\n if (inBounds) box.expandByPoint(v);\n sink.p.push(v.x, v.y, v.z);\n v.fromBufferAttribute(nrm, i).applyMatrix3(normalMatrix).normalize();\n sink.n.push(v.x, v.y, v.z);\n if (col) {\n const r = col.getX(i), g = col.getY(i), b = col.getZ(i);\n if (srgb) sink.c.push(toSRGB(r), toSRGB(g), toSRGB(b));\n else sink.c.push(r, g, b);\n } else sink.c.push(1, 1, 1);\n }\n}\n\nfunction finish(sink, center, scale) {\n const p = new Float32Array(sink.p);\n for (let i = 0; i < p.length; i += 3) {\n p[i] = (p[i] - center.x) * scale;\n p[i + 1] = (p[i + 1] - center.y) * scale;\n p[i + 2] = (p[i + 2] - center.z) * scale;\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(p, 3));\n geometry.setAttribute('normal', new BufferAttribute(new Float32Array(sink.n), 3));\n geometry.setAttribute('color', new BufferAttribute(new Float32Array(sink.c), 3));\n geometry.computeBoundingSphere();\n return geometry;\n}\n\n// Track loop (same path as tank.js) split into alternating tread links; vertex colors, no texture.\nfunction trackGeometry(link) {\n // WHEELS per side: 5 road wheels (rear → front), sprocket, idler\n const road = WHEELS[0];\n const sprocket = WHEELS[5];\n const idler = WHEELS[6];\n const rr = 0.38;\n const path = [[road.x, 0], [WHEELS[4].x, 0]];\n const arc = (cx, cy, a0, a1, n) => {\n for (let i = 0; i <= n; i += 1) {\n const a = a0 + ((a1 - a0) * i) / n;\n path.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr]);\n }\n };\n arc(sprocket.x, sprocket.y, -2.0, Math.PI / 2, 6);\n arc(idler.x, idler.y, Math.PI / 2, Math.PI + 2.0, 6);\n path.push(path[0]);\n const p = [], n = [], c = [];\n const trackZ = Math.abs(road.z);\n let k = 0;\n for (let i = 0; i < path.length - 1; i += 1) {\n const [x0, y0] = path[i];\n const [x1, y1] = path[i + 1];\n const len = Math.hypot(x1 - x0, y1 - y0);\n if (len < 1e-6) continue;\n // loop is CCW seen from +z → outward normal = (dy, -dx)\n const nx = (y1 - y0) / len, ny = -(x1 - x0) / len;\n const steps = Math.max(1, Math.round(len / link));\n for (let s = 0; s < steps; s += 1, k += 1) {\n const t0 = s / steps, t1 = (s + 1) / steps;\n const ax = x0 + (x1 - x0) * t0, ay = y0 + (y1 - y0) * t0 - 0.03;\n const bx = x0 + (x1 - x0) * t1, by = y0 + (y1 - y0) * t1 - 0.03;\n const color = k % 2 ? GROOVE : TREAD;\n for (const side of [-1, 1]) {\n const z0 = side * trackZ - TRACK_W / 2, z1 = side * trackZ + TRACK_W / 2;\n const quad = [[ax, ay, z0], [bx, by, z0], [bx, by, z1], [ax, ay, z0], [bx, by, z1], [ax, ay, z1]];\n for (const q of quad) {\n p.push(q[0], q[1], q[2]);\n n.push(nx, ny, 0);\n c.push(color.r, color.g, color.b);\n }\n }\n }\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(new Float32Array(p), 3));\n geometry.setAttribute('normal', new BufferAttribute(new Float32Array(n), 3));\n geometry.setAttribute('color', new BufferAttribute(new Float32Array(c), 3));\n return geometry;\n}\n\nfunction material(lowPower, options, standard) {\n return lowPower ? new MeshLambertMaterial(options) : new MeshStandardMaterial({ ...options, ...standard });\n}\n\nexport function createTankModels({ lowPower = false } = {}) {\n const geos = createTankGeometries();\n const track = trackGeometry(lowPower ? 0.2 : 0.12);\n const box = new Box3();\n const identity = new Matrix4();\n const turretAt = new Matrix4().makeTranslation(TURRET_PIVOT.x, TURRET_PIVOT.y, TURRET_PIVOT.z);\n const gunAt = new Matrix4().compose(\n TURRET_PIVOT.clone().add(GUN_PIVOT),\n new Quaternion().setFromAxisAngle(new Vector3(0, 0, 1), GUN_PITCH),\n new Vector3(GUN_LENGTH, 1, 1),\n );\n\n const body = createSink();\n bake(body, geos.hull, identity, box);\n bake(body, geos.turret, turretAt, box, { capY: ROOF_Y });\n\n const accent = createSink();\n bake(accent, geos.hullAccent, identity, box);\n bake(accent, geos.turretAccent, turretAt, box, { capY: ROOF_Y });\n\n const gear = createSink();\n bake(gear, track, identity, box, { srgb: false });\n const wheelAt = new Matrix4();\n const noTurn = new Quaternion();\n for (const w of WHEELS) {\n const s = w.r / WHEELS[0].r;\n wheelAt.compose(new Vector3(w.x, w.y, w.z), noTurn, new Vector3(s, s, s));\n bake(gear, geos.wheel, wheelAt, box);\n }\n\n const barrel = createSink();\n bake(barrel, geos.gun, gunAt, box);\n\n const lamps = createSink();\n bake(lamps, geos.lamps, identity, box);\n\n geos.dispose();\n track.dispose();\n\n const size = box.getSize(new Vector3());\n const center = box.getCenter(new Vector3());\n const scale = Math.min(FIT.x / size.x, FIT.y / size.y, FIT.z / size.z);\n\n const bodyMat = material(lowPower, { vertexColors: true, color: 0xffffff },\n { roughness: 0.62, metalness: 0.18, flatShading: true });\n const gearMat = material(lowPower, { vertexColors: true, side: DoubleSide }, { roughness: 0.8, metalness: 0.2 });\n const barrelMat = material(lowPower, { vertexColors: true, color: '#7a7f88' }, { roughness: 0.4, metalness: 0.45 });\n // Team stripes / rear lights: instance tint boosted, unlit (like the game's accent glow).\n const accentMat = new MeshBasicMaterial({ color: new Color(1.35, 1.35, 1.35) });\n const lampMat = new MeshBasicMaterial({ color: '#fff1c2' });\n\n return [{\n kind: 'tank',\n parts: [\n { geometry: finish(body, center, scale), material: bodyMat, tinted: true },\n { geometry: finish(accent, center, scale), material: accentMat, tinted: true },\n { geometry: finish(gear, center, scale), material: gearMat },\n { geometry: finish(barrel, center, scale), material: barrelMat },\n { geometry: finish(lamps, center, scale), material: lampMat },\n ],\n palette: TEAM_ORDER.map((name) => TEAM[name].tint.clone().convertLinearToSRGB()),\n radius: 0.85, // ≈ mean half-extent (body 2.6 × 1.05 × 1.55)\n mass: 5,\n bounce: 0.2,\n friction: 0.8,\n drag: 0.04,\n count: 6,\n countLow: 4,\n }];\n}\n","// Filler confetti for the Avalancha effect: paper bits, curly streamers, stars and sequins.\n// Very light bodies (high drag, low bounce) that flutter around the big falling figures.\n// Shapes adapted from src/effects/confetti/confettiScene3d.js (that file stays untouched).\nimport {\n BufferAttribute, BufferGeometry, CircleGeometry, Color, DoubleSide, ExtrudeGeometry, MeshLambertMaterial,\n MeshStandardMaterial, PlaneGeometry, Shape,\n} from 'three';\n\nconst PARTY = ['#ff4d8d', '#ffd23f', '#3ddc97', '#4cc9f0', '#9b5de5', '#ff7b29', '#f15bb5', '#ffffff'];\nconst GOLDEN = ['#ffcf4a', '#ffd23f', '#ffe08a', '#ffb627', '#ff4d8d', '#4cc9f0'];\nconst colors = (list) => list.map((hex) => new Color(hex));\n\n// Tinted parts keep a white base so the instance color is the final color.\nfunction makeMaterial(lowPower, options, standard = {}) {\n return lowPower\n ? new MeshLambertMaterial(options)\n : new MeshStandardMaterial({ roughness: 0.4, metalness: 0.25, ...options, ...standard });\n}\n\n// Paper rectangle with a slight curl so it never vanishes fully edge-on.\nfunction paperGeometry() {\n const geometry = new PlaneGeometry(0.13, 0.2, 1, 4);\n const position = geometry.attributes.position;\n for (let i = 0; i < position.count; i += 1) {\n const v = position.getY(i) / 0.1;\n position.setZ(i, 0.035 * v * v);\n }\n geometry.computeVertexNormals();\n geometry.center();\n return geometry;\n}\n\n// Curly streamer: a flat paper strip wound into a loosening helix (width along the axis).\nfunction streamerGeometry(lowPower) {\n const segments = lowPower ? 48 : 84;\n const turns = 3.5;\n const length = 1.3;\n const width = 0.055;\n const positions = new Float32Array((segments + 1) * 6);\n const normals = new Float32Array((segments + 1) * 6);\n const indices = [];\n for (let i = 0; i <= segments; i += 1) {\n const t = i / segments;\n const angle = t * turns * Math.PI * 2;\n const radius = 0.14 + 0.06 * t;\n const nx = Math.cos(angle);\n const nz = Math.sin(angle);\n const y = t * length - length / 2;\n const tilt = 0.02 * Math.sin(angle * 0.5);\n for (let side = 0; side < 2; side += 1) {\n const k = (i * 2 + side) * 3;\n positions[k] = nx * radius;\n positions[k + 1] = y + (side ? 1 : -1) * width * 0.5 + tilt;\n positions[k + 2] = nz * radius;\n normals[k] = nx;\n normals[k + 2] = nz;\n }\n if (i < segments) {\n const a = i * 2;\n // CCW seen from outside the helix.\n indices.push(a, a + 1, a + 2, a + 1, a + 3, a + 2);\n }\n }\n const geometry = new BufferGeometry();\n geometry.setAttribute('position', new BufferAttribute(positions, 3));\n geometry.setAttribute('normal', new BufferAttribute(normals, 3));\n geometry.setIndex(indices);\n geometry.center();\n return geometry;\n}\n\nfunction starGeometry() {\n const shape = new Shape();\n for (let i = 0; i < 10; i += 1) {\n const radius = i % 2 ? 0.15 : 0.35;\n const angle = (i / 10) * Math.PI * 2 + Math.PI / 2;\n const x = Math.cos(angle) * radius;\n const y = Math.sin(angle) * radius;\n if (i) shape.lineTo(x, y); else shape.moveTo(x, y);\n }\n const geometry = new ExtrudeGeometry(shape, {\n depth: 0.08, bevelEnabled: true, bevelThickness: 0.03, bevelSize: 0.02, bevelSegments: 1,\n });\n geometry.center();\n return geometry;\n}\n\n/**\n * Filler models for the avalanche: 'confetti', 'streamer', 'star', 'spark'.\n * @param {{ lowPower?: boolean }} options\n */\nexport function createConfettiModels({ lowPower = false } = {}) {\n const paper = paperGeometry();\n const streamer = streamerGeometry(lowPower);\n const star = starGeometry();\n const spark = new CircleGeometry(0.075, lowPower ? 8 : 12);\n [paper, streamer, star, spark].forEach((geometry) => geometry.computeBoundingSphere());\n\n return [\n {\n kind: 'confetti',\n parts: [{\n geometry: paper,\n material: makeMaterial(lowPower, { color: 0xffffff, side: DoubleSide }, { metalness: 0.35, roughness: 0.4 }),\n tinted: true,\n }],\n palette: colors(PARTY),\n radius: 0.12,\n mass: 0.02,\n bounce: 0.1,\n friction: 0.8,\n drag: 0.92,\n count: 500,\n countLow: 200,\n },\n {\n kind: 'streamer',\n parts: [{\n geometry: streamer,\n material: makeMaterial(lowPower, { color: 0xffffff, side: DoubleSide }, { metalness: 0.3, roughness: 0.45 }),\n tinted: true,\n }],\n palette: colors(PARTY),\n // Smaller than the 0.7 half-length so streamers never prop up heavy figures.\n radius: 0.4,\n mass: 0.03,\n bounce: 0.12,\n friction: 0.75,\n drag: 0.85,\n count: 40,\n countLow: 16,\n },\n {\n kind: 'star',\n parts: [{\n geometry: star,\n material: makeMaterial(lowPower, { color: 0xffffff, emissive: 0x2a1800 }, { metalness: 0.6, roughness: 0.25 }),\n tinted: true,\n }],\n palette: colors(GOLDEN),\n radius: 0.35,\n mass: 0.06,\n bounce: 0.25,\n friction: 0.55,\n drag: 0.5,\n count: 40,\n countLow: 20,\n },\n {\n kind: 'spark',\n parts: [{\n geometry: spark,\n material: makeMaterial(lowPower, { color: 0xffffff, emissive: 0x332200, side: DoubleSide }, { metalness: 0.5, roughness: 0.25 }),\n tinted: true,\n }],\n palette: colors(GOLDEN),\n radius: 0.08,\n mass: 0.015,\n bounce: 0.1,\n friction: 0.8,\n drag: 0.9,\n count: 160,\n countLow: 60,\n },\n ];\n}\n","/**\n * Avalancha body world. Pure JS (no three, no DOM).\n * Semi-implicit Euler. Heavy bodies (mass >= 0.1): substeps + uniform-grid broadphase, sphere-sphere contacts.\n * Light bodies (confetti, bills): one step per frame, floor/walls only.\n * Body objects are pooled and reused after death; every spawn gets a new `id`.\n */\n\nconst DT_MAX = 1 / 30;\nconst MAX_SUBSTEPS = 6;\nconst LIGHT_MASS = 0.1;\nconst DEFAULT_TTL = 6;\nconst DRAG_K = 6; // drag (0..1) -> linear damping 1/s\nconst AIR_SPIN_DAMP = 0.3;\nconst CONTACT_SPIN_DAMP = 7;\nconst FLOOR_FRICTION = 10; // friction (0..1) -> tangential damping 1/s while supported\nconst SETTLE_K = 60; // pull of the nearest local axis toward world up while supported\nconst BOUNCE_MIN = 1.2; // approach speed below which restitution is 0 (kills jitter)\nconst IMPACT_SPEED = 4;\nconst IMPACT_GAP = 0.15;\nconst WAKE_SPEED = 1.5;\nconst SLEEP_SPEED = 0.3;\nconst SLEEP_SPIN = 0.6;\nconst SLEEP_TIME = 0.3;\nconst CONTACT_EPS = 0.03;\nconst SUPPORT_NY = 0.1; // contact normal y above this counts as support (includes wedged bodies)\nconst SLOP = 0.01;\nconst MIN_SHARE = 0.2; // min positional-correction share of the heavier body\nconst DEEP_PEN = 0.08;\nconst GROUND_SPEED = 3; // below this approach speed a floor body under another is treated as ground // overlap fraction of radius sum that wakes a sleeper\nconst CORRECT = 0.8;\nconst FADE_IN = 0.15;\nconst FADE_OUT = 0.4;\nconst FLUTTER = 14;\nconst FLUTTER_DRAG = 0.3;\nconst TUMBLE = 0.35;\nconst SWEEP_WIND = 18;\nconst SWEEP_LIFT = 5;\nconst WIND_TAU = 0.9;\nconst WALL_OPEN_TIME = 2.5;\nconst OUT_MARGIN = 3;\nconst GRID_MAX = 64;\nconst GRID_HEIGHT = 40;\n\nexport const PHYSICS_TUNING = Object.freeze({\n DT_MAX, MAX_SUBSTEPS, LIGHT_MASS, DEFAULT_TTL, DRAG_K, AIR_SPIN_DAMP, CONTACT_SPIN_DAMP, FLOOR_FRICTION, SETTLE_K,\n BOUNCE_MIN, IMPACT_SPEED, IMPACT_GAP, WAKE_SPEED, SLEEP_SPEED, SLEEP_SPIN, SLEEP_TIME, FADE_IN, FADE_OUT,\n FLUTTER, SWEEP_WIND, SWEEP_LIFT, WIND_TAU, WALL_OPEN_TIME, OUT_MARGIN,\n});\n\nconst num = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\nconst clamp = (v, lo, hi) => (v < lo ? lo : v > hi ? hi : v);\n\n// Fixed field order keeps one hidden class for every body.\nfunction makeBody() {\n return {\n id: 0, kind: '', x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, qx: 0, qy: 0, qz: 0, qw: 1, wx: 0, wy: 0, wz: 0,\n radius: 0.5, mass: 1, age: 0, ttl: DEFAULT_TTL, scale: 0, landed: false, alive: false, asleep: false,\n bounce: 0.3, friction: 0.5, drag: 0.05, hx: 0, hy: 0, hz: 0, variant: 0, data: null,\n light: false, invMass: 1, cr: 0.5, sup: false, restT: 0, impactT: -1e9, phase: 0, kx: 1, ky: 1, kz: 1,\n px: 0, py: 0, pz: 0, floor: false,\n };\n}\n\n/**\n * @param {{ gravity?: number, floorY?: number, left?: number, right?: number, maxBodies?: number,\n * zMin?: number, zMax?: number, impactSpeed?: number, lightImpacts?: boolean, random?: () => number }} [options]\n */\nexport function createBodyWorld({\n gravity = -26, floorY = -5.5, left = -8, right = 8, maxBodies = 400,\n zMin = -2, zMax = 2, impactSpeed = IMPACT_SPEED, lightImpacts = false, random = Math.random,\n} = {}) {\n const cap = Math.max(1, Math.floor(num(maxBodies, 400)));\n const g = num(gravity, -26);\n const z0 = Math.min(num(zMin, -2), num(zMax, 2));\n const z1 = Math.max(num(zMin, -2), num(zMax, 2));\n const hitSpeed = num(impactSpeed, IMPACT_SPEED);\n let fy = num(floorY, -5.5);\n let lx = num(left, -8);\n let rx = num(right, 8);\n if (rx < lx) { const t = lx; lx = rx; rx = t; }\n\n const bodies = [];\n const free = [];\n const listeners = [];\n const heavy = new Int32Array(cap);\n const next = new Int32Array(cap);\n const cellX = new Int32Array(cap);\n const cellY = new Int32Array(cap);\n const cellHead = new Int32Array(GRID_MAX * GRID_MAX);\n let nextId = 1;\n let time = 0;\n let windX = 0;\n let windY = 0;\n let wallsOpenT = 0;\n let sweepDir = 1;\n\n function wake(b) {\n b.asleep = false;\n b.restT = 0;\n }\n\n function impact(b, speed) {\n if (speed < hitSpeed || (b.light && !lightImpacts) || !listeners.length) return;\n if (time - b.impactT < IMPACT_GAP) return;\n b.impactT = time;\n for (let i = 0; i < listeners.length; i++) {\n try { listeners[i](b, speed); } catch { /* listener errors never break the sim */ }\n }\n }\n\n function integrate(b, h) {\n let vx = b.vx;\n let vy = b.vy + g * h;\n let vz = b.vz;\n const drag = b.drag;\n const landed = b.landed;\n if (drag > FLUTTER_DRAG && !landed) vx += Math.sin(b.age * 3.3 + b.phase) * FLUTTER * drag * h;\n if (drag > 0) {\n // Implicit drag relative to wind: high-drag bodies ride the finale gust.\n const c = drag * DRAG_K * h;\n const k = 1 / (1 + c);\n vx = (vx + c * windX) * k;\n vy = (vy + c * windY) * k;\n vz *= k;\n }\n if (landed) {\n const k = 1 / (1 + b.friction * FLOOR_FRICTION * h);\n vx *= k;\n vz *= k;\n }\n b.vx = vx; b.vy = vy; b.vz = vz;\n b.x += vx * h; b.y += vy * h; b.z += vz * h;\n\n let wx = b.wx; let wy = b.wy; let wz = b.wz;\n const qx = b.qx; const qy = b.qy; const qz = b.qz; const qw = b.qw;\n if (landed) {\n // Settle: torque the nearest local axis (weighted toward thin axes) to world up.\n const ux = 2 * (qx * qy + qw * qz);\n const uy = 1 - 2 * (qx * qx + qz * qz);\n const uz = 2 * (qy * qz - qw * qx);\n const sx = Math.abs(ux) * b.kx; const sy = Math.abs(uy) * b.ky; const sz = Math.abs(uz) * b.kz;\n let ax; let az; let sign;\n if (sy >= sx && sy >= sz) { sign = uy < 0 ? -1 : 1; ax = 2 * (qx * qy - qw * qz); az = 2 * (qy * qz + qw * qx); }\n else if (sx >= sz) { sign = ux < 0 ? -1 : 1; ax = 1 - 2 * (qy * qy + qz * qz); az = 2 * (qx * qz - qw * qy); }\n else { sign = uz < 0 ? -1 : 1; ax = 2 * (qx * qz + qw * qy); az = 1 - 2 * (qx * qx + qy * qy); }\n // axis x up = (-az, 0, ax)\n const k = SETTLE_K * h * sign;\n wx -= az * k;\n wz += ax * k;\n const d = 1 / (1 + CONTACT_SPIN_DAMP * h);\n wx *= d; wy *= d; wz *= d;\n } else if (wx !== 0 || wy !== 0 || wz !== 0) {\n const d = 1 / (1 + AIR_SPIN_DAMP * h);\n wx *= d; wy *= d; wz *= d;\n }\n b.wx = wx; b.wy = wy; b.wz = wz;\n if (wx !== 0 || wy !== 0 || wz !== 0) {\n const hh = 0.5 * h;\n const nx = qx + hh * (wx * qw + wy * qz - wz * qy);\n const ny = qy + hh * (wy * qw + wz * qx - wx * qz);\n const nz = qz + hh * (wz * qw + wx * qy - wy * qx);\n const nw = qw - hh * (wx * qx + wy * qy + wz * qz);\n const len = Math.sqrt(nx * nx + ny * ny + nz * nz + nw * nw);\n if (len > 1e-9) {\n const inv = 1 / len;\n b.qx = nx * inv; b.qy = ny * inv; b.qz = nz * inv; b.qw = nw * inv;\n } else { b.qx = 0; b.qy = 0; b.qz = 0; b.qw = 1; }\n }\n }\n\n function bounds(b) {\n const cr = b.cr;\n let top = cr;\n if (b.hx > 0) {\n // Oriented box support along world up (optional half extents).\n const qx = b.qx; const qy = b.qy; const qz = b.qz; const qw = b.qw;\n const ux = 2 * (qx * qy + qw * qz);\n const uy = 1 - 2 * (qx * qx + qz * qz);\n const uz = 2 * (qy * qz - qw * qx);\n top = (b.hx * Math.abs(ux) + b.hy * Math.abs(uy) + b.hz * Math.abs(uz)) * (cr / b.radius);\n }\n top += fy;\n b.floor = b.y <= top + CONTACT_EPS;\n if (b.floor) {\n b.sup = true;\n if (b.y < top) {\n b.y = top;\n if (b.vy < 0) {\n const s = -b.vy;\n if (s > BOUNCE_MIN) {\n b.vy = s * b.bounce;\n const t = s * TUMBLE;\n b.wx += (random() - 0.5) * t;\n b.wz += (random() - 0.5) * t - (b.vx * 0.3) / b.radius;\n } else b.vy = 0;\n if (s >= hitSpeed) impact(b, s);\n }\n }\n }\n if (wallsOpenT <= 0) {\n if (b.x - cr < lx) {\n b.x = lx + cr;\n if (b.vx < 0) b.vx = b.vx < -BOUNCE_MIN ? -b.vx * (0.25 + 0.5 * b.bounce) : 0;\n } else if (b.x + cr > rx) {\n b.x = rx - cr;\n if (b.vx > 0) b.vx = b.vx > BOUNCE_MIN ? -b.vx * (0.25 + 0.5 * b.bounce) : 0;\n }\n } else if (b.x - cr > rx + OUT_MARGIN || b.x + cr < lx - OUT_MARGIN) b.alive = false;\n if (b.z < z0) { b.z = z0; if (b.vz < 0) b.vz *= -0.3; }\n else if (b.z > z1) { b.z = z1; if (b.vz > 0) b.vz *= -0.3; }\n if (b.y < fy - 20 || b.x !== b.x || b.y !== b.y || b.z !== b.z || b.qw !== b.qw) b.alive = false;\n }\n\n function rest(b, h) {\n if (b.asleep) {\n if (!b.sup) wake(b);\n return;\n }\n if (!b.sup) { b.restT = 0; return; }\n // Real displacement, not velocity: wedged bodies keep a residual v that constraints cancel.\n const dx = b.x - b.px; const dy = b.y - b.py; const dz = b.z - b.pz;\n const v2 = (dx * dx + dy * dy + dz * dz) / (h * h);\n const w2 = b.wx * b.wx + b.wy * b.wy + b.wz * b.wz;\n if (v2 < SLEEP_SPEED * SLEEP_SPEED && w2 < SLEEP_SPIN * SLEEP_SPIN) {\n b.restT += h;\n if (b.restT >= SLEEP_TIME) {\n b.asleep = true;\n b.vx = 0; b.vy = 0; b.vz = 0; b.wx = 0; b.wy = 0; b.wz = 0;\n }\n } else b.restT = 0;\n }\n\n function pair(a, b) {\n const dx = b.x - a.x; const dy = b.y - a.y; const dz = b.z - a.z;\n const rs = a.cr + b.cr;\n const lim = rs + CONTACT_EPS;\n const d2 = dx * dx + dy * dy + dz * dz;\n if (d2 >= lim * lim) return;\n let d = Math.sqrt(d2);\n let nx = 0; let ny = 1; let nz = 0;\n if (d > 1e-6) { const inv = 1 / d; nx = dx * inv; ny = dy * inv; nz = dz * inv; } else d = 0;\n if (ny > SUPPORT_NY) b.sup = true; else if (ny < -SUPPORT_NY) a.sup = true;\n if (a.asleep && b.asleep) return;\n const pen = rs - d;\n if (pen <= 0) return;\n const vn = (b.vx - a.vx) * nx + (b.vy - a.vy) * ny + (b.vz - a.vz) * nz;\n // Wake on a hard hit or a deep overlap (never sleep jammed inside each other).\n if (-vn > WAKE_SPEED || pen > DEEP_PEN * rs) {\n if (a.asleep) wake(a);\n if (b.asleep) wake(b);\n }\n let ia = a.asleep ? 0 : a.invMass;\n let ib = b.asleep ? 0 : b.invMass;\n if (ia + ib <= 0) return;\n // Shock propagation lite: a floor body under another acts as ground (stops heavy bodies sinking into coins).\n let ga = ia; let gb = ib;\n if (ny > SUPPORT_NY && a.floor) ga = 0;\n else if (ny < -SUPPORT_NY && b.floor) gb = 0;\n if (ga + gb <= 0) { ga = ia; gb = ib; }\n if (vn < 0) {\n const s = -vn;\n // Resting contacts use the grounded masses; hard hits still shove the lower body sideways.\n if (s < GROUND_SPEED) { ia = ga; ib = gb; }\n const im = ia + ib;\n const fast = a.vx * a.vx + a.vy * a.vy + a.vz * a.vz > b.vx * b.vx + b.vy * b.vy + b.vz * b.vz ? a : b;\n const e = s > BOUNCE_MIN ? (a.bounce < b.bounce ? a.bounce : b.bounce) : 0;\n const j = ((1 + e) * s) / im;\n a.vx -= nx * j * ia; a.vy -= ny * j * ia; a.vz -= nz * j * ia;\n b.vx += nx * j * ib; b.vy += ny * j * ib; b.vz += nz * j * ib;\n // Coulomb friction on the tangential relative velocity.\n let tx = b.vx - a.vx; let ty = b.vy - a.vy; let tz = b.vz - a.vz;\n const rn = tx * nx + ty * ny + tz * nz;\n tx -= rn * nx; ty -= rn * ny; tz -= rn * nz;\n const tl = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tl > 1e-6) {\n const mu = (a.friction + b.friction) * 0.5;\n let jt = tl / im;\n if (jt > mu * j) jt = mu * j;\n const k = jt / tl;\n a.vx += tx * k * ia; a.vy += ty * k * ia; a.vz += tz * k * ia;\n b.vx -= tx * k * ib; b.vy -= ty * k * ib; b.vz -= tz * k * ib;\n }\n if (s > BOUNCE_MIN * 2) {\n const t = s * TUMBLE * 0.5;\n fast.wx += (random() - 0.5) * t;\n fast.wz += (random() - 0.5) * t;\n }\n if (s >= hitSpeed) impact(fast, s);\n }\n if (pen > SLOP) {\n // Mass-weighted split, clamped so a heavy body still yields (unjams coins wedged under tanks).\n let sa = ga / (ga + gb);\n if (ga > 0 && gb > 0) sa = sa < MIN_SHARE ? MIN_SHARE : sa > 1 - MIN_SHARE ? 1 - MIN_SHARE : sa;\n const c = (pen - SLOP) * CORRECT;\n const ca = c * sa; const cb = c - ca;\n a.x -= nx * ca; a.y -= ny * ca; a.z -= nz * ca;\n b.x += nx * cb; b.y += ny * cb; b.z += nz * cb;\n }\n }\n\n function collide(hc, maxR) {\n const cs = Math.max(2 * maxR + CONTACT_EPS, 0.25);\n const inv = 1 / cs;\n const x0 = lx - OUT_MARGIN - maxR;\n const y0 = fy - maxR - 1;\n const cols = clamp(Math.ceil((rx - lx + 2 * (OUT_MARGIN + maxR)) * inv), 1, GRID_MAX);\n const rows = clamp(Math.ceil(GRID_HEIGHT * inv), 1, GRID_MAX);\n cellHead.fill(-1, 0, cols * rows);\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) { cellX[k] = -1; continue; }\n const cx = clamp(Math.floor((b.x - x0) * inv), 0, cols - 1);\n const cy = clamp(Math.floor((b.y - y0) * inv), 0, rows - 1);\n cellX[k] = cx; cellY[k] = cy;\n const c = cy * cols + cx;\n next[k] = cellHead[c];\n cellHead[c] = k;\n }\n for (let k = 0; k < hc; k++) {\n const cx = cellX[k];\n if (cx < 0) continue;\n const a = bodies[heavy[k]];\n const cy = cellY[k];\n const ya = cy > 0 ? cy - 1 : 0; const yb = cy < rows - 1 ? cy + 1 : cy;\n const xa = cx > 0 ? cx - 1 : 0; const xb = cx < cols - 1 ? cx + 1 : cx;\n for (let yy = ya; yy <= yb; yy++) {\n for (let xx = xa; xx <= xb; xx++) {\n for (let m = cellHead[yy * cols + xx]; m !== -1; m = next[m]) {\n if (m > k) pair(a, bodies[heavy[m]]);\n }\n }\n }\n }\n }\n\n function step(dtIn) {\n let dt = Number(dtIn);\n if (!(dt > 0)) return;\n if (dt > DT_MAX) dt = DT_MAX;\n time += dt;\n if (wallsOpenT > 0) wallsOpenT -= dt;\n const n = bodies.length;\n let hc = 0;\n let maxV2 = 0;\n let minR = Infinity;\n let maxR = 0;\n for (let i = 0; i < n; i++) {\n const b = bodies[i];\n if (!b.alive) continue;\n const age = (b.age += dt);\n const remain = b.ttl - age;\n if (remain <= 0) { b.alive = false; b.scale = 0; continue; }\n let s = 1;\n let cr = b.radius;\n if (age < FADE_IN) { const t = 1 - age / FADE_IN; s = 1 - t * t * t; }\n if (remain < FADE_OUT) {\n const t = remain / FADE_OUT;\n const o = t * t * (3 - 2 * t);\n s *= o;\n cr *= o > 0.05 ? o : 0.05;\n }\n b.scale = s;\n b.cr = cr;\n if (b.light) {\n // Sleeping light bodies only wake on fade-out shrink or setBounds/sweep.\n if (b.asleep && remain >= FADE_OUT) continue;\n b.sup = false;\n b.px = b.x; b.py = b.y; b.pz = b.z;\n if (!b.asleep) integrate(b, dt);\n bounds(b);\n rest(b, dt);\n b.landed = b.sup;\n } else {\n heavy[hc++] = i;\n if (!b.asleep) {\n const v2 = b.vx * b.vx + b.vy * b.vy + b.vz * b.vz;\n if (v2 > maxV2) maxV2 = v2;\n }\n if (b.radius < minR) minR = b.radius;\n if (cr > maxR) maxR = cr;\n }\n }\n\n if (hc) {\n // Substeps so a fast body moves < ~0.8 radius per substep (no tunneling).\n const v = Math.sqrt(maxV2) + Math.abs(g) * dt;\n const sub = clamp(Math.ceil((v * dt) / (minR * 0.8)), 1, MAX_SUBSTEPS);\n const h = dt / sub;\n for (let s = 0; s < sub; s++) {\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) continue;\n b.sup = false;\n b.px = b.x; b.py = b.y; b.pz = b.z;\n if (!b.asleep) integrate(b, h);\n }\n if (hc > 1) collide(hc, maxR);\n for (let k = 0; k < hc; k++) {\n const b = bodies[heavy[k]];\n if (!b.alive) continue;\n bounds(b);\n rest(b, h);\n b.landed = b.sup;\n }\n }\n }\n\n if (windX !== 0 || windY !== 0) {\n const k = Math.exp(-dt / WIND_TAU);\n windX *= k; windY *= k;\n if (Math.abs(windX) < 0.01 && Math.abs(windY) < 0.01) { windX = 0; windY = 0; }\n }\n\n // Compact in place (keeps order), recycle dead bodies.\n let w = 0;\n const len = bodies.length;\n for (let i = 0; i < len; i++) {\n const b = bodies[i];\n if (b.alive) bodies[w++] = b;\n else { b.scale = 0; b.data = null; free.push(b); }\n }\n bodies.length = w;\n }\n\n function init(b, p, mass, light) {\n b.id = nextId++;\n b.kind = p.kind == null ? '' : p.kind;\n b.x = num(p.x, 0); b.y = num(p.y, 0); b.z = num(p.z, 0);\n b.vx = num(p.vx, 0); b.vy = num(p.vy, 0); b.vz = num(p.vz, 0);\n b.wx = num(p.wx, 0); b.wy = num(p.wy, 0); b.wz = num(p.wz, 0);\n const qx = num(p.qx, 0); const qy = num(p.qy, 0); const qz = num(p.qz, 0); const qw = num(p.qw, NaN);\n const ql = Number.isFinite(qw) ? Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw) : 0;\n if (ql > 1e-6) {\n b.qx = qx / ql; b.qy = qy / ql; b.qz = qz / ql; b.qw = qw / ql;\n } else {\n // Uniform random orientation (Shoemake).\n const u1 = random(); const u2 = random() * 6.283185307179586; const u3 = random() * 6.283185307179586;\n const a = Math.sqrt(1 - u1); const c = Math.sqrt(u1);\n b.qx = a * Math.sin(u2); b.qy = a * Math.cos(u2); b.qz = c * Math.sin(u3); b.qw = c * Math.cos(u3);\n }\n const r = num(p.radius, 0.5);\n b.radius = r > 0.01 ? r : 0.01;\n b.mass = mass;\n b.invMass = 1 / mass;\n b.light = light;\n b.bounce = clamp(num(p.bounce, 0.3), 0, 1);\n b.friction = clamp(num(p.friction, 0.5), 0, 1);\n b.drag = clamp(num(p.drag, 0.05), 0, 2);\n const ttl = num(p.ttl, DEFAULT_TTL);\n b.ttl = ttl > 0.05 ? ttl : 0.05;\n b.age = 0; b.scale = 0; b.cr = b.radius;\n b.landed = false; b.alive = true; b.asleep = false; b.sup = false;\n b.restT = 0; b.impactT = -1e9; b.phase = random() * 6.283185307179586;\n const hx = num(p.hx, 0); const hy = num(p.hy, 0); const hz = num(p.hz, 0);\n if (hx > 0 && hy > 0 && hz > 0) {\n // Prefer resting on thin axes (lower center = stable pose).\n const big = Math.max(hx, hy, hz);\n const m = 0.5 * big;\n let kx = m / (hx + m); let ky = m / (hy + m); let kz = m / (hz + m);\n kx *= kx; ky *= ky; kz *= kz;\n // Never stand on a clearly longest axis (car on its nose): it topples instead.\n const mid = hx + hy + hz - big - Math.min(hx, hy, hz);\n if (big > 1.5 * mid) {\n if (hx === big) kx = 0; else if (hy === big) ky = 0; else kz = 0;\n }\n b.hx = hx; b.hy = hy; b.hz = hz;\n b.kx = kx; b.ky = ky; b.kz = kz;\n } else { b.hx = 0; b.hy = 0; b.hz = 0; b.kx = 1; b.ky = 1; b.kz = 1; }\n b.variant = p.variant == null ? 0 : p.variant;\n b.data = p.data == null ? null : p.data;\n return b;\n }\n\n function oldestLight() {\n let best = null;\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n if (b.light && b.alive && (!best || b.age > best.age)) best = b;\n }\n return best;\n }\n\n function spawn(p) {\n if (!p || typeof p !== 'object') return null;\n const m = num(p.mass, 1);\n const mass = m > 1e-3 ? m : 1e-3;\n const light = mass < LIGHT_MASS;\n let b;\n if (bodies.length >= cap) {\n // Full: heavy bodies take over the oldest light one (in place), light spawns are dropped.\n if (light) return null;\n b = oldestLight();\n if (!b) return null;\n } else {\n b = free.pop() || makeBody();\n bodies.push(b);\n }\n return init(b, p, mass, light);\n }\n\n function setBounds(next = {}) {\n fy = num(next.floorY, fy);\n lx = num(next.left, lx);\n rx = num(next.right, rx);\n if (rx < lx) { const t = lx; lx = rx; rx = t; }\n for (let i = 0; i < bodies.length; i++) wake(bodies[i]);\n }\n\n function sweep(power = 1, dir) {\n const p = clamp(num(power, 1), 0, 3);\n let d = sweepDir;\n if (dir > 0) d = 1;\n else if (dir < 0) d = -1;\n else sweepDir = -sweepDir;\n windX = d * p * SWEEP_WIND;\n windY = p * SWEEP_LIFT;\n wallsOpenT = WALL_OPEN_TIME;\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n if (!b.alive) continue;\n wake(b);\n b.landed = false;\n const k = p / (1 + 0.35 * b.mass);\n b.vx += d * k * (10 + random() * 8);\n b.vy += k * (7 + random() * 6);\n b.wx += (random() - 0.5) * 12 * p;\n b.wy += (random() - 0.5) * 8 * p;\n b.wz -= d * (4 + random() * 6) * p;\n }\n }\n\n function clear() {\n for (let i = 0; i < bodies.length; i++) {\n const b = bodies[i];\n b.alive = false; b.scale = 0; b.data = null;\n free.push(b);\n }\n bodies.length = 0;\n windX = 0; windY = 0; wallsOpenT = 0; sweepDir = 1;\n }\n\n function onImpact(cb) {\n if (typeof cb !== 'function') return () => {};\n listeners.push(cb);\n return () => {\n const i = listeners.indexOf(cb);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n return { bodies, spawn, step, setBounds, sweep, clear, onImpact, get time() { return time; } };\n}\n","// Three.js scene for the Avalancha effect. Loaded lazily; `three` is an optional peer, so\n// AvalancheEffect falls back to the CSS rain when this module or WebGL is unavailable.\n// Bodies live in the JS world (physics.js); each frame they are packed into one InstancedMesh per\n// (model, part) from index 0, so `mesh.count` hides the dead ones without slot bookkeeping.\nimport {\n AmbientLight, Box3, CanvasTexture, Color, DirectionalLight, DynamicDrawUsage, Euler, InstancedMesh, Matrix4,\n MeshBasicMaterial, PerspectiveCamera, PlaneGeometry, PointLight, Quaternion, Scene, Vector3, WebGLRenderer,\n} from 'three';\nimport { createMoneyModels } from './models/money.js';\nimport { createCarModels } from './models/cars.js';\nimport { createTankModels } from './models/tanks.js';\nimport { createConfettiModels } from './models/confetti.js';\nimport { createBodyWorld } from './physics.js';\nimport { createAvalancheFx } from './fx.js';\n\nconst DISTANCE = 12;\nconst GRAVITY = -26;\n// Resting figures sit on the bottom edge of the frame.\nconst FLOOR_LIFT = 0.05;\n// Depth band: the floor is the frame's bottom edge at z=0, so bodies stay near that plane.\nconst Z_MIN = -2.5;\nconst Z_MAX = 1;\n// Cars, tanks and stacks are the \"big figures\"; the pile stays readable below this many.\nconst BIG_FAMILIES = new Set(['car', 'tank', 'stack']);\nconst FALLBACK_PALETTE = ['#ff4d8d', '#ffd23f', '#3ddc97', '#4cc9f0', '#9b5de5', '#ff7b29'].map((hex) => new Color(hex));\nconst TANK_HARD_SPEED = 12;\n\nconst rand = (min, max) => min + Math.random() * (max - min);\nconst pick = (items) => items[Math.floor(Math.random() * items.length)];\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\n// 'car-muscle' and 'car-racer' are variants of the 'car' family.\nconst familyOf = (kind) => String(kind).split('-')[0];\n\n// Phones and low-core devices get smaller pools, Lambert shading, no MSAA and a lower pixel ratio.\nconst isLowPower = () => (typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches)\n || (navigator.hardwareConcurrency || 8) <= 4;\n\nfunction blobTexture(size = 64) {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n const gradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2);\n gradient.addColorStop(0, 'rgba(0,0,0,.55)');\n gradient.addColorStop(0.6, 'rgba(0,0,0,.25)');\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n return new CanvasTexture(canvas);\n}\n\n// Half extents around the origin (conservative if a model is off-center); physics uses them for floor contact.\nfunction halfExtents(parts) {\n const box = new Box3();\n parts.forEach(({ geometry }) => {\n if (!geometry.boundingBox) geometry.computeBoundingBox();\n box.union(geometry.boundingBox);\n });\n return {\n x: Math.max(Math.abs(box.min.x), Math.abs(box.max.x)),\n y: Math.max(Math.abs(box.min.y), Math.abs(box.max.y)),\n z: Math.max(Math.abs(box.min.z), Math.abs(box.max.z)),\n };\n}\n\nfunction createPool(scene, model, lowPower) {\n const family = familyOf(model.kind);\n const base = Math.round(lowPower ? (model.countLow ?? model.count) : model.count) || 1;\n // Bills from earlier cues are still alive at the finale; reserve room for its sweep.\n const reserve = family === 'bill' ? (lowPower ? 30 : 70) : 0;\n const capacity = Math.max(1, base + reserve);\n const palette = model.palette?.length ? model.palette : FALLBACK_PALETTE;\n const parts = model.parts.map(({ geometry, material, tinted }) => {\n const mesh = new InstancedMesh(geometry, material, capacity);\n mesh.instanceMatrix.setUsage(DynamicDrawUsage);\n mesh.frustumCulled = false;\n if (tinted) {\n // instanceColor must exist before the first render so the program compiles with it.\n for (let i = 0; i < capacity; i += 1) mesh.setColorAt(i, palette[0]);\n mesh.instanceColor.setUsage(DynamicDrawUsage);\n }\n mesh.count = 0;\n mesh.visible = false;\n scene.add(mesh);\n return { mesh, tinted: !!tinted };\n });\n const half = halfExtents(model.parts);\n return {\n kind: model.kind, family, model, parts, palette, capacity, used: 0, pending: 0, big: BIG_FAMILIES.has(family), half,\n // Contact-shadow radius: between the collision sphere and the long half axis.\n blobRadius: (model.radius + Math.max(half.x, half.z)) / 2,\n };\n}\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {{ lowPower?: boolean }} [options] lowPower forces the mobile profile; undefined autodetects.\n */\nexport function createAvalancheScene(canvas, { lowPower: forceLowPower } = {}) {\n const lowPower = !!(forceLowPower ?? isLowPower());\n const renderer = new WebGLRenderer({ canvas, alpha: true, antialias: !lowPower, powerPreference: 'high-performance' });\n // A failed setup must not keep the GL context alive.\n try {\n return buildScene(renderer, lowPower);\n } catch (error) {\n renderer.dispose();\n renderer.forceContextLoss?.();\n throw error;\n }\n}\n\nfunction buildScene(renderer, lowPower) {\n renderer.setPixelRatio(Math.min(lowPower ? 1.5 : 2, window.devicePixelRatio || 1));\n renderer.setClearColor(0x000000, 0);\n const scene = new Scene();\n const camera = new PerspectiveCamera(50, 1, 0.1, 80);\n camera.position.set(0, 0, DISTANCE);\n\n // Lambert (lowPower) reads a bit brighter than the mostly non-metallic standard materials; dim it slightly.\n const light = lowPower ? 0.8 : 1;\n const key = new DirectionalLight(0xffe0b0, 1.25 * light);\n key.position.set(5, 7, 9);\n const fill = new DirectionalLight(0x9cc8ff, 0.55 * light);\n fill.position.set(-7, 1, 5);\n const flash = new PointLight(0xfff1c2, 0, 40, 1.4);\n flash.position.set(0, 1, 5);\n scene.add(new AmbientLight(0xffffff, 0.5 * light), key, fill, flash);\n\n const models = [createMoneyModels, createCarModels, createTankModels, createConfettiModels]\n .flatMap((create) => create({ lowPower }) || []);\n const pools = models.map((model) => createPool(scene, model, lowPower));\n const byFamily = Object.create(null);\n pools.forEach((pool) => {\n if (!byFamily[pool.family]) byFamily[pool.family] = [];\n byFamily[pool.family].push(pool);\n });\n const capacityTotal = pools.reduce((sum, pool) => sum + pool.capacity, 0);\n\n const bounds = { left: -9.9, right: 9.9, top: 5.6, floorY: -5.6 + FLOOR_LIFT, room: 1 };\n const world = createBodyWorld({\n gravity: GRAVITY, floorY: bounds.floorY, left: bounds.left, right: bounds.right, zMin: Z_MIN, zMax: Z_MAX,\n maxBodies: Math.min(capacityTotal, lowPower ? 320 : 640),\n });\n const fx = createAvalancheFx(scene, { lowPower });\n\n // Soft contact shadows under big figures; desktop only.\n const BLOBS = lowPower ? 0 : 32;\n const blobMap = BLOBS ? blobTexture() : null;\n const blobs = BLOBS\n ? new InstancedMesh(new PlaneGeometry(1, 1).rotateX(-Math.PI / 2), new MeshBasicMaterial({ map: blobMap, transparent: true, depthWrite: false, opacity: 0.6 }), BLOBS)\n : null;\n if (blobs) {\n blobs.instanceMatrix.setUsage(DynamicDrawUsage);\n blobs.frustumCulled = false;\n blobs.count = 0;\n blobs.visible = false;\n blobs.renderOrder = -1;\n scene.add(blobs);\n }\n\n const BIG_MAX = lowPower ? 16 : 26;\n let bigCap = BIG_MAX;\n let bigAlive = 0;\n let bigPending = 0;\n const FX_PER_FRAME = lowPower ? 3 : 6;\n let fxBudget = FX_PER_FRAME;\n const scale = lowPower ? 0.55 : 1;\n let time = 0;\n let shake = 0;\n let flashLevel = 0;\n\n // Reused per frame.\n const matrix = new Matrix4();\n const position = new Vector3();\n const quaternion = new Quaternion();\n const identity = new Quaternion();\n const size = new Vector3();\n const euler = new Euler();\n\n // Physics skips light bodies (bills, confetti), so only heavy kinds land here.\n world.onImpact((body, speed) => {\n const gfx = body.data;\n if (!gfx || fxBudget <= 0 || time - gfx.fxAt < 0.3) return;\n const power = clamp(speed / 20, 0.2, 1);\n const y = body.y - body.radius * 0.6;\n switch (gfx.pool.family) {\n case 'car':\n fx.puff(body.x, y, body.z, power);\n break;\n case 'tank':\n fx.puff(body.x, y, body.z, power);\n if (speed > TANK_HARD_SPEED) {\n fx.blast(body.x, y, body.z, power);\n shake = Math.min(0.7, shake + 0.3 * power);\n flashLevel = Math.max(flashLevel, 0.4 * power);\n }\n break;\n case 'coin':\n case 'stack':\n fx.sparkle(body.x, body.y, body.z, power * 0.8);\n break;\n default:\n return;\n }\n gfx.fxAt = time;\n fxBudget -= 1;\n });\n\n // A random free variant of `family`, or null when every pool (or the big-figure cap) is full.\n function freePool(family) {\n const variants = byFamily[family];\n if (!variants) return null;\n const start = Math.floor(Math.random() * variants.length);\n for (let i = 0; i < variants.length; i += 1) {\n const pool = variants[(start + i) % variants.length];\n if (pool.used + pool.pending >= pool.capacity) continue;\n if (pool.big && bigAlive + bigPending >= bigCap) return null;\n return pool;\n }\n return null;\n }\n\n // o: { x, y, z, vx, vy, vz, wx, wy, wz, ttl, size, dragScale, yaw, tilt }.\n // `yaw` aims the model's front (+X); without it the body starts at a random orientation.\n function spawn(family, o) {\n const pool = freePool(family);\n if (!pool) return null;\n const { model, half } = pool;\n const s = o.size ?? rand(0.9, 1.1);\n if (o.yaw != null) {\n const tilt = o.tilt ?? 0.25;\n euler.set(rand(-tilt, tilt), o.yaw, rand(-tilt, tilt));\n } else {\n euler.set(rand(0, 6.3), rand(0, 6.3), rand(0, 6.3));\n }\n quaternion.setFromEuler(euler);\n const body = world.spawn({\n kind: model.kind,\n x: o.x, y: o.y, z: clamp(o.z ?? 0, Z_MIN, Z_MAX),\n vx: o.vx ?? 0, vy: o.vy ?? 0, vz: o.vz ?? 0,\n wx: o.wx ?? 0, wy: o.wy ?? 0, wz: o.wz ?? 0,\n qx: quaternion.x, qy: quaternion.y, qz: quaternion.z, qw: quaternion.w,\n hx: half.x * s, hy: half.y * s, hz: half.z * s,\n radius: model.radius * s,\n mass: model.mass * s,\n bounce: model.bounce,\n friction: model.friction,\n drag: model.drag * (o.dragScale ?? 1),\n ttl: o.ttl ?? 6,\n data: { pool, size: s, tint: pick(pool.palette), fxAt: -1 },\n });\n if (!body) return null;\n pool.pending += 1;\n if (pool.big) bigPending += 1;\n return body;\n }\n\n const confettiFamily = () => {\n const roll = Math.random();\n if (roll < 0.07 && byFamily.streamer) return 'streamer';\n if (roll < 0.14 && byFamily.star) return 'star';\n if (roll < 0.3 && byFamily.spark) return 'spark';\n return 'confetti';\n };\n\n // Party cannon from a bottom corner; side -1 = left, 1 = right. Lower drag so paper reaches\n // 5-10 u up despite the heavy gravity, then still flutters down.\n function cannon(side, power) {\n const x = side < 0 ? bounds.left + 0.5 : bounds.right - 0.5;\n const count = Math.round(80 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn(confettiFamily(), {\n x: x + rand(-0.3, 0.3), y: bounds.floorY + rand(0.3, 0.9), z: rand(Z_MIN, Z_MAX),\n vx: -side * rand(3, 9), vy: rand(24, 38), vz: rand(-1.5, 1.5),\n wx: rand(-14, 14), wy: rand(-14, 14), wz: rand(-14, 14),\n ttl: rand(3.5, 5.2), size: rand(0.8, 1.25), dragScale: 0.4,\n });\n }\n }\n\n function bills(power) {\n const count = Math.round(42 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('bill', {\n x: rand(bounds.left + 0.6, bounds.right - 0.6), y: bounds.top + rand(0.3, 3.5), z: rand(Z_MIN, Z_MAX),\n vx: rand(-1.5, 1.5), vy: rand(-3, 0), vz: rand(-0.5, 0.5),\n wx: rand(-7, 7), wy: rand(-3, 3), wz: rand(-7, 7),\n ttl: rand(5, 6.5), size: rand(0.9, 1.15),\n });\n }\n }\n\n function stacks(count) {\n for (let i = 0; i < count; i += 1) {\n spawn('stack', {\n x: rand(bounds.left, bounds.right) * 0.75, y: bounds.top + rand(0.6, 2.2), z: rand(-1.5, 0.5),\n vx: rand(-2, 2), vy: rand(-4, -1),\n wx: rand(-3, 3), wy: rand(-2, 2), wz: rand(-3, 3),\n ttl: rand(6.5, 7.5),\n });\n }\n }\n\n function coins(power) {\n const count = Math.round(48 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('coin', {\n x: rand(bounds.left + 0.5, bounds.right - 0.5) * 0.85, y: bounds.top + rand(0.3, 3), z: rand(-2, 0.8),\n vx: rand(-2, 2), vy: rand(-7, -1),\n wx: rand(-12, 12), wy: rand(-4, 4), wz: rand(-12, 12),\n ttl: rand(5, 6.5), size: rand(0.9, 1.15),\n });\n }\n }\n\n // Thrown in from the top corners, alternating sides, tumbling toward the middle.\n function cars(count) {\n const first = Math.random() < 0.5 ? -1 : 1;\n for (let i = 0; i < count; i += 1) {\n const side = i % 2 ? -first : first;\n spawn('car', {\n x: side < 0 ? bounds.left + rand(1.3, 3) : bounds.right - rand(1.3, 3),\n y: bounds.top + rand(0.8, 2.4) + i * 0.4, z: rand(-1.8, 0.4),\n vx: -side * rand(3, 7.5), vy: rand(-1, 3), vz: rand(-1, 0.6),\n wx: rand(-2.5, 2.5), wy: rand(-2, 2), wz: rand(-5, 5),\n yaw: side < 0 ? 0 : Math.PI, tilt: 0.4,\n ttl: rand(6.5, 7.5), size: rand(0.92, 1.08),\n });\n }\n }\n\n // Heavy drop spread across the width, shown mostly in profile.\n function tanks(count) {\n const span = Math.max(0, bounds.right - bounds.left - 4);\n for (let i = 0; i < count; i += 1) {\n spawn('tank', {\n x: bounds.left + 2 + span * ((i + 0.5 + rand(-0.25, 0.25)) / count),\n y: bounds.top + rand(1, 3), z: rand(-1.6, 0.3),\n vx: rand(-1, 1), vy: rand(-9, -5),\n wx: rand(-0.6, 0.6), wy: rand(-1.5, 1.5), wz: rand(-0.6, 0.6),\n yaw: (Math.random() < 0.5 ? 0 : Math.PI) + rand(-0.5, 0.5), tilt: 0.15,\n ttl: rand(6.5, 7.5), size: rand(0.95, 1.06),\n });\n }\n }\n\n const bigCount = (base, min, max) => clamp(Math.round(base * bounds.room * (lowPower ? 0.75 : 1)), min, max);\n\n const bursts = {\n confetti(power) {\n cannon(-1, power);\n cannon(1, power);\n },\n money(power) {\n bills(power);\n stacks(Math.round((2 + 2 * power) * (lowPower ? 0.6 : 1)));\n coins(power * 0.15);\n },\n cars(power) {\n cars(bigCount(3 + 2 * power, 2, 5));\n },\n tanks(power) {\n tanks(bigCount(2 + 2 * power, lowPower ? 1 : 2, 4));\n },\n coins(power) {\n coins(power);\n stacks(1);\n },\n // Everything at once; the pools and the big-figure cap keep it bounded.\n mix(power) {\n cannon(-1, power * 0.5);\n cannon(1, power * 0.5);\n bills(power * 0.55);\n coins(power * 0.45);\n stacks(lowPower ? 1 : 2);\n cars(bigCount(2 + power, 1, 3));\n tanks(bigCount(1 + power, 1, 2));\n },\n // The pile fades while the gust sweeps it right, and a wall of bills crosses from the left.\n finale(power) {\n const { bodies } = world;\n for (let i = 0; i < bodies.length; i += 1) {\n const body = bodies[i];\n if (body.alive) body.ttl = Math.min(body.ttl, body.age + rand(0.9, 1.4));\n }\n world.sweep(power, 1);\n const count = Math.round(80 * power * scale);\n for (let i = 0; i < count; i += 1) {\n spawn('bill', {\n x: bounds.left - rand(0.3, 2.5), y: rand(bounds.floorY + 1, bounds.top + 0.5), z: rand(Z_MIN, Z_MAX),\n vx: rand(20, 32), vy: rand(2, 7), vz: rand(-1, 1),\n wx: rand(-9, 9), wy: rand(-4, 4), wz: rand(-9, 9),\n ttl: rand(1.2, 1.5), size: rand(0.9, 1.2), dragScale: 0.3,\n });\n }\n for (let i = 0; i < 3; i += 1) fx.sparkle(rand(bounds.left, bounds.right) * 0.6, rand(-1, 2), 0, 1);\n shake = Math.max(shake, 0.45);\n },\n };\n\n // Copies live bodies into packed instance slots.\n function sync() {\n for (let p = 0; p < pools.length; p += 1) {\n pools[p].used = 0;\n pools[p].pending = 0;\n }\n let big = 0;\n let blobCount = 0;\n const { bodies } = world;\n for (let i = 0; i < bodies.length; i += 1) {\n const body = bodies[i];\n const gfx = body.data;\n if (!body.alive || !gfx) continue;\n const { pool } = gfx;\n if (pool.used >= pool.capacity) continue;\n const s = gfx.size * body.scale;\n position.set(body.x, body.y, body.z);\n quaternion.set(body.qx, body.qy, body.qz, body.qw);\n size.set(s, s, s);\n matrix.compose(position, quaternion, size);\n const index = pool.used;\n pool.used += 1;\n const { parts } = pool;\n for (let m = 0; m < parts.length; m += 1) {\n const part = parts[m];\n part.mesh.setMatrixAt(index, matrix);\n if (part.tinted) part.mesh.setColorAt(index, gfx.tint);\n }\n if (!pool.big) continue;\n big += 1;\n if (blobCount >= BLOBS) continue;\n // Shrinks as the figure rises off the floor.\n const lift = body.y - bounds.floorY - pool.half.y * gfx.size;\n const r = pool.blobRadius * s * clamp(1 - lift / 6, 0.15, 1);\n position.set(body.x, bounds.floorY + 0.02, body.z);\n size.set(r * 2.4, 1, r * 1.5);\n matrix.compose(position, identity, size);\n blobs.setMatrixAt(blobCount, matrix);\n blobCount += 1;\n }\n for (let p = 0; p < pools.length; p += 1) {\n const { parts, used } = pools[p];\n for (let m = 0; m < parts.length; m += 1) {\n const { mesh, tinted } = parts[m];\n mesh.count = used;\n mesh.visible = used > 0;\n if (!used) continue;\n mesh.instanceMatrix.needsUpdate = true;\n if (tinted) mesh.instanceColor.needsUpdate = true;\n }\n }\n bigAlive = big;\n bigPending = 0;\n if (blobs) {\n blobs.count = blobCount;\n blobs.visible = blobCount > 0;\n blobs.instanceMatrix.needsUpdate = true;\n }\n }\n\n return {\n lowPower,\n // Debug snapshot for the lab/QA; allocates, so not for per-frame use in the app.\n stats() {\n const live = Object.create(null);\n let bodies = 0;\n pools.forEach(({ family, used }) => { live[family] = (live[family] || 0) + used; bodies += used; });\n return { bodies, big: bigAlive, bigCap, live, calls: renderer.info.render.calls, triangles: renderer.info.render.triangles };\n },\n burst(kind, power = 1) {\n bursts[kind]?.(power);\n flashLevel = Math.max(flashLevel, kind === 'finale' ? 1 : power * 0.3);\n },\n render(dt) {\n const step = Math.min(dt, 0.05);\n time += step;\n fxBudget = FX_PER_FRAME;\n world.step(step);\n fx.update(step);\n sync();\n shake = Math.max(0, shake - step * 2.2);\n flashLevel = Math.max(0, flashLevel - step * 2.5);\n flash.intensity = flashLevel * 4 * light;\n camera.position.x = (Math.random() - 0.5) * shake * 0.4;\n camera.position.y = (Math.random() - 0.5) * shake * 0.4;\n renderer.render(scene, camera);\n },\n resize(width, height) {\n renderer.setSize(width, height, false);\n camera.aspect = width / height;\n // Portrait chat windows widen the lens so the big figures fit across.\n camera.fov = camera.aspect < 1 ? clamp((50 / Math.max(camera.aspect, 0.55)) * 0.8, 50, 85) : 50;\n camera.updateProjectionMatrix();\n const halfHeight = Math.tan((camera.fov * Math.PI) / 360) * DISTANCE;\n const halfWidth = halfHeight * camera.aspect;\n bounds.top = halfHeight;\n bounds.floorY = -halfHeight + FLOOR_LIFT;\n bounds.left = -halfWidth;\n bounds.right = halfWidth;\n // Narrow windows get fewer big figures.\n bounds.room = clamp((halfWidth * 2) / 16, 0.5, 1);\n bigCap = Math.max(8, Math.round(BIG_MAX * bounds.room));\n world.setBounds({ floorY: bounds.floorY, left: bounds.left, right: bounds.right });\n },\n dispose() {\n fx.dispose();\n world.clear();\n const geometries = new Set();\n const materials = new Set();\n const textures = new Set();\n pools.forEach(({ parts }) => parts.forEach(({ mesh }) => {\n // InstancedMesh owns the instanceMatrix/instanceColor GPU buffers.\n mesh.dispose();\n scene.remove(mesh);\n }));\n models.forEach(({ parts }) => parts.forEach(({ geometry, material }) => {\n geometries.add(geometry);\n [].concat(material).forEach((entry) => materials.add(entry));\n }));\n if (blobs) {\n blobs.dispose();\n scene.remove(blobs);\n geometries.add(blobs.geometry);\n materials.add(blobs.material);\n }\n materials.forEach((entry) => {\n Object.keys(entry).forEach((name) => { if (entry[name]?.isTexture) textures.add(entry[name]); });\n entry.dispose();\n });\n textures.forEach((texture) => texture.dispose());\n geometries.forEach((geometry) => geometry.dispose());\n renderer.dispose();\n renderer.forceContextLoss?.();\n },\n };\n}\n"],"mappings":"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"}