@minicode-dev/chat 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +112 -5
- package/README.md +401 -312
- package/assets/sounds/effects/avalanche.mp3 +0 -0
- package/assets/sounds/racing/car_boost.mp3 +0 -0
- package/assets/sounds/racing/car_boost.ogg +0 -0
- package/assets/sounds/racing/car_bump.mp3 +0 -0
- package/assets/sounds/racing/car_bump.ogg +0 -0
- package/assets/sounds/racing/car_drift_loop.mp3 +0 -0
- package/assets/sounds/racing/car_drift_loop.ogg +0 -0
- package/assets/sounds/racing/car_engine_loop.mp3 +0 -0
- package/assets/sounds/racing/car_engine_loop.ogg +0 -0
- package/assets/sounds/racing/car_engine_start.mp3 +0 -0
- package/assets/sounds/racing/car_engine_start.ogg +0 -0
- package/assets/sounds/racing/countdown_beep.mp3 +0 -0
- package/assets/sounds/racing/countdown_beep.ogg +0 -0
- package/assets/sounds/racing/countdown_go.mp3 +0 -0
- package/assets/sounds/racing/countdown_go.ogg +0 -0
- package/assets/sounds/racing/final_lap.mp3 +0 -0
- package/assets/sounds/racing/final_lap.ogg +0 -0
- package/assets/sounds/racing/finish_line.mp3 +0 -0
- package/assets/sounds/racing/finish_line.ogg +0 -0
- package/assets/sounds/racing/lap_complete.mp3 +0 -0
- package/assets/sounds/racing/lap_complete.ogg +0 -0
- package/assets/sounds/racing/music_circuit.mp3 +0 -0
- package/assets/sounds/racing/music_circuit.ogg +0 -0
- package/assets/sounds/racing/music_final_lap.mp3 +0 -0
- package/assets/sounds/racing/music_final_lap.ogg +0 -0
- package/assets/sounds/racing/race_defeat.mp3 +0 -0
- package/assets/sounds/racing/race_defeat.ogg +0 -0
- package/assets/sounds/racing/race_victory.mp3 +0 -0
- package/assets/sounds/racing/race_victory.ogg +0 -0
- package/assets/sounds/tanks/barrel_explode.mp3 +0 -0
- package/assets/sounds/tanks/barrel_explode.ogg +0 -0
- package/assets/sounds/tanks/crate_break.mp3 +0 -0
- package/assets/sounds/tanks/crate_break.ogg +0 -0
- package/assets/sounds/tanks/health_pickup.mp3 +0 -0
- package/assets/sounds/tanks/health_pickup.ogg +0 -0
- package/assets/sounds/tanks/last_life.mp3 +0 -0
- package/assets/sounds/tanks/last_life.ogg +0 -0
- package/assets/sounds/tanks/life_lost.mp3 +0 -0
- package/assets/sounds/tanks/life_lost.ogg +0 -0
- package/assets/sounds/tanks/respawn.mp3 +0 -0
- package/assets/sounds/tanks/respawn.ogg +0 -0
- package/assets/sounds/tanks/shield_end.mp3 +0 -0
- package/assets/sounds/tanks/shield_end.ogg +0 -0
- package/assets/sounds/tanks/shield_loop.mp3 +0 -0
- package/assets/sounds/tanks/shield_loop.ogg +0 -0
- package/assets/sounds/tanks/wall_hit.mp3 +0 -0
- package/assets/sounds/tanks/wall_hit.ogg +0 -0
- package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js → BattleshipGameCard-B-B4r7lK.js} +146 -144
- package/dist/chunks/{BattleshipGameCard-iRk8d4vR.js.map → BattleshipGameCard-B-B4r7lK.js.map} +1 -1
- package/dist/chunks/{ChatContext-DjIEifGY.js → ChatContext-DQtKsR6Z.js} +2 -2
- package/dist/chunks/{ChatContext-DjIEifGY.js.map → ChatContext-DQtKsR6Z.js.map} +1 -1
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js +1654 -0
- package/dist/chunks/RacingLiveGameCard-c1G7uoDI.js.map +1 -0
- package/dist/chunks/{TanksGameCard-GrqmdwJ7.js → TanksGameCard-CvTaF7tu.js} +164 -162
- package/dist/chunks/{TanksGameCard-GrqmdwJ7.js.map → TanksGameCard-CvTaF7tu.js.map} +1 -1
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js +1011 -0
- package/dist/chunks/TanksLiveGameCard-COr9Oay5.js.map +1 -0
- package/dist/chunks/avalancheScene3d-Z5QyZIid.js +1299 -0
- package/dist/chunks/avalancheScene3d-Z5QyZIid.js.map +1 -0
- package/dist/chunks/connect4Sounds-DmD-E9kX.js +235 -0
- package/dist/chunks/connect4Sounds-DmD-E9kX.js.map +1 -0
- package/dist/chunks/connectionStore-DwgIUl30.js +13 -0
- package/dist/chunks/connectionStore-DwgIUl30.js.map +1 -0
- package/dist/chunks/createLiveScene-CWBunxPi.js +367 -0
- package/dist/chunks/{createLiveScene-819NWv84.js.map → createLiveScene-CWBunxPi.js.map} +1 -1
- package/dist/chunks/createRaceScene-C7Rw89kj.js +305 -0
- package/dist/chunks/createRaceScene-C7Rw89kj.js.map +1 -0
- package/dist/chunks/{createTankScene-6asWHKFf.js → createTankScene-yhX6la27.js} +125 -123
- package/dist/chunks/{createTankScene-6asWHKFf.js.map → createTankScene-yhX6la27.js.map} +1 -1
- package/dist/chunks/decor-CyyCnmct.js +418 -0
- package/dist/chunks/decor-CyyCnmct.js.map +1 -0
- package/dist/chunks/fx-1ZwzmPWj.js +458 -0
- package/dist/chunks/fx-1ZwzmPWj.js.map +1 -0
- package/dist/chunks/fx-UZwhOmdl.js +584 -0
- package/dist/chunks/fx-UZwhOmdl.js.map +1 -0
- package/dist/chunks/gameStatus-BChd29yI.js +62 -0
- package/dist/chunks/gameStatus-BChd29yI.js.map +1 -0
- package/dist/chunks/{connect4Sounds-Cv0q31VW.js → games-BvYTWgaR.js} +814 -951
- package/dist/chunks/games-BvYTWgaR.js.map +1 -0
- package/dist/chunks/rolldown-runtime-CGnMp29N.js +10 -0
- package/dist/chunks/tank-DjEQ4FXF.js +553 -0
- package/dist/chunks/tank-DjEQ4FXF.js.map +1 -0
- package/dist/chunks/tanks-live-BcKmrhnV.js +261 -0
- package/dist/chunks/tanks-live-BcKmrhnV.js.map +1 -0
- package/dist/chunks/{tanksSounds-CUNDIOal.js → tanksSounds-DwjfSp3W.js} +43 -11
- package/dist/chunks/tanksSounds-DwjfSp3W.js.map +1 -0
- package/dist/chunks/track-BcnnpnAm.js +259 -0
- package/dist/chunks/track-BcnnpnAm.js.map +1 -0
- package/dist/chunks/util-DwI9bfS7.js +57 -0
- package/dist/chunks/util-DwI9bfS7.js.map +1 -0
- package/dist/index.js +812 -625
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/index.d.ts +3 -1
- package/package.json +1 -1
- package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js +0 -1225
- package/dist/chunks/TanksLiveGameCard-DSmQcUMh.js.map +0 -1
- package/dist/chunks/avalancheScene3d-Dnl2E3EA.js +0 -1878
- package/dist/chunks/avalancheScene3d-Dnl2E3EA.js.map +0 -1
- package/dist/chunks/connect4Sounds-Cv0q31VW.js.map +0 -1
- package/dist/chunks/createLiveScene-819NWv84.js +0 -365
- package/dist/chunks/fx-BNJvJYOu.js +0 -871
- package/dist/chunks/fx-BNJvJYOu.js.map +0 -1
- package/dist/chunks/gameStatus-Cu1Z8un9.js +0 -69
- package/dist/chunks/gameStatus-Cu1Z8un9.js.map +0 -1
- package/dist/chunks/tank-DIn6Jyt8.js +0 -605
- package/dist/chunks/tank-DIn6Jyt8.js.map +0 -1
- package/dist/chunks/tanksSounds-CUNDIOal.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fx-UZwhOmdl.js","names":["PALETTE","C","PART_ORDER","prep","flat","geometry","paint","color","Color","hex","array","i","Float32BufferAttribute","extrude","q","depth","width","bevel","ExtrudeGeometry","shape","segments","box","w","h","d","BoxGeometry","x","y","z","hw","hh","Shape","cylinder","CylinderGeometry","r","length","axis","profile","points","point","cx","cy","bottom","tilt","addWheels","zc","side","discs","radius","offset","disc","CircleGeometry","parts","coupe","s","muscle","racer","tub","position","taper","SphereGeometry","createMaterials","make","lowPower","MeshLambertMaterial","options","MeshStandardMaterial","standard","MeshBasicMaterial","assemble","merged","name","mergeBufferGeometries","kind","bounds","Box3","center","Vector3","size","materials","physics","createCarModels","palette","pools","STRIDE","PX","PY","PZ","VX","VY","VZ","AGE","LIFE","S0","S1","R0","G0","B0","R1","G1","B1","A0","DRAG","GRAV","HOT","SPIN","TW","COL","VERT","FRAG","rand","min","max","clampPower","power","makeCanvas","canvas","softDot","c","gradient","ctx","CanvasTexture","smokeBlob","seed","next","angle","glint","core","ray","spec","particle","createBatch","data","cap","phase","pos","col","rot","BufferGeometry","attribute","BufferAttribute","itemSize","DynamicDrawUsage","material","ShaderMaterial","scale","map","additive","AdditiveBlending","NormalBlending","Points","renderOrder","attributes","itemSizes","entry","count","cursor","o","p","age","dt","life","p3","p4","damp","k","t","blend","inv","hot","fin","fadeIn","fout","tw","a","createAvalancheFx","n","base","dot","blob","star","bufferSize","Vector2","syncScale","renderer","camera","smoke","fire","glints","batches","group","Group","batch","flashes","sprite","Sprite","SpriteMaterial","flashCursor","disposed","flash","dur","puff","grow","ring","cos","sin","r0","speed","billows","sparkle","blast","fireCount","theta","phi","sparkCount","smokeCount","update","step","b","f","dispose","scene"],"sources":["../../src/effects/avalanche/models/cars.js","../../src/effects/avalanche/fx.js"],"sourcesContent":["// Low-poly toy sports cars for the Avalancha effect: 'car' (coupe), 'car-muscle', 'car-racer'.\n// Each kind is a few merged parts (one InstancedMesh each); only the body takes the palette tint.\n// Local frame: origin at the bbox center, +X front, +Y up, +Z right. No DOM at module scope.\nimport {\n Box3, BoxGeometry, CircleGeometry, Color, CylinderGeometry, ExtrudeGeometry, Float32BufferAttribute,\n MeshBasicMaterial, MeshLambertMaterial, MeshStandardMaterial, Shape, SphereGeometry, Vector3,\n} from 'three';\nimport { mergeBufferGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nconst PALETTE = ['#ff2b3d', '#ffd23f', '#2f6bff', '#7be22c', '#ff7a1a', '#ff4fb0', '#f5f6f8'];\nconst C = {\n tire: '#1b1c21', rim: '#cfd5de', hub: '#3a3d45', chrome: '#dfe4ec', dark: '#2a2c33', black: '#111216',\n white: '#f4f4f6', head: '#fff2bf', tail: '#ff1f3a',\n};\nconst PART_ORDER = ['body', 'glass', 'wheels', 'trim', 'lights'];\n\n// Non-indexed, uv-less: the common layout mergeBufferGeometries needs.\nfunction prep(geometry) {\n const flat = geometry.index ? geometry.toNonIndexed() : geometry;\n flat.deleteAttribute('uv');\n return flat;\n}\n\nfunction paint(geometry, hex) {\n const flat = prep(geometry);\n const color = new Color(hex);\n const array = new Float32Array(flat.attributes.position.count * 3);\n for (let i = 0; i < array.length; i += 3) color.toArray(array, i);\n flat.setAttribute('color', new Float32BufferAttribute(array, 3));\n return flat;\n}\n\n// Side profile (XY) extruded across Z, centered on z = 0. The bevel grows the outline by `bevel`.\nfunction extrude(shape, width, bevel, q, segments = q.bevel) {\n const depth = Math.max(0.01, width - bevel * 2);\n const geometry = new ExtrudeGeometry(shape, {\n depth, bevelEnabled: true, bevelThickness: bevel, bevelSize: bevel, bevelSegments: segments, curveSegments: q.curve,\n });\n return geometry.translate(0, 0, -depth / 2);\n}\n\n// Chamfered box (plain box on lowPower or when too thin).\nfunction box(q, w, h, d, x, y, z, bevel = 0.025) {\n if (q.low || !bevel || bevel * 2.5 > Math.min(w, h, d)) return new BoxGeometry(w, h, d).translate(x, y, z);\n const hw = w / 2 - bevel;\n const hh = h / 2 - bevel;\n const shape = new Shape();\n shape.moveTo(-hw, -hh);\n shape.lineTo(hw, -hh);\n shape.lineTo(hw, hh);\n shape.lineTo(-hw, hh);\n return extrude(shape, d, bevel, q, 1).translate(x, y, z);\n}\n\nfunction cylinder(r, length, segments, axis, x, y, z) {\n const geometry = new CylinderGeometry(r, r, length, segments);\n if (axis === 'x') geometry.rotateZ(Math.PI / 2);\n else if (axis === 'z') geometry.rotateX(Math.PI / 2);\n return geometry.translate(x, y, z);\n}\n\n// Polygon outline; `arch` entries cut a wheel arch into the bottom edge at y = bottom.\nfunction profile(points) {\n const shape = new Shape();\n points.forEach((point, i) => {\n if (point.arch) {\n const [cx, cy, r, bottom] = point.arch;\n const tilt = Math.asin((cy - bottom) / r);\n // Clockwise over the top of the wheel; absarc adds the joining segment.\n shape.absarc(cx, cy, r, Math.PI + tilt, -tilt, true);\n } else if (point.q) {\n shape.quadraticCurveTo(...point.q);\n } else if (i === 0) shape.moveTo(...point);\n else shape.lineTo(...point);\n });\n return shape;\n}\n\n// Wheels resting on y = 0: rubber tire plus rim (and hub) discs on the outer face.\nfunction addWheels(q, parts, axles) {\n axles.forEach(({ x, r, w, z }) => {\n [-1, 1].forEach((side) => {\n const zc = side * z;\n parts.wheels.push(paint(cylinder(r, w, q.radial, 'z', x, r, zc), C.tire));\n const discs = [[r * 0.6, q.radial, C.rim, 0.004]];\n if (!q.low) discs.push([r * 0.2, 6, C.hub, 0.008]);\n discs.forEach(([radius, segments, color, offset]) => {\n const disc = new CircleGeometry(radius, segments);\n if (side < 0) disc.rotateY(Math.PI);\n parts.wheels.push(paint(disc.translate(x, r, zc + side * (w / 2 + offset)), color));\n });\n });\n });\n}\n\nfunction coupe(q) {\n const parts = { body: [], glass: [], wheels: [], trim: [], lights: [] };\n // Outline before the 0.05 bevel: arches 0.31 → 0.26 visible over 0.22 tires.\n parts.body.push(extrude(profile([\n [-1.06, 0.16], { arch: [-0.72, 0.22, 0.31, 0.16] }, { arch: [0.76, 0.22, 0.31, 0.16] }, [1.1, 0.16],\n { q: [1.15, 0.17, 1.15, 0.26] }, { q: [1.14, 0.38, 1.0, 0.4] }, [0.42, 0.46], [-0.7, 0.48],\n { q: [-1.06, 0.49, -1.1, 0.38] }, [-1.11, 0.22], { q: [-1.11, 0.16, -1.06, 0.16] },\n ]), 0.9, 0.05, q));\n // Fastback greenhouse with a body-colored roof slab.\n parts.glass.push(extrude(profile([[0.4, 0.46], [0.02, 0.74], [-0.42, 0.74], [-0.86, 0.47]]), 0.76, 0.03, q));\n parts.body.push(box(q, 0.5, 0.06, 0.8, -0.2, 0.79, 0, 0.02));\n parts.body.push(box(q, 0.16, 0.05, 0.86, -1.05, 0.6, 0, 0.02));\n if (!q.low) [-1, 1].forEach((s) => parts.body.push(box(q, 0.08, 0.05, 0.07, 0.32, 0.54, s * 0.475, 0)));\n addWheels(q, parts, [{ x: 0.76, r: 0.22, w: 0.2, z: 0.4 }, { x: -0.72, r: 0.22, w: 0.2, z: 0.4 }]);\n parts.trim.push(\n paint(box(q, 0.1, 0.1, 0.92, 1.17, 0.17, 0, 0.03), C.dark),\n paint(box(q, 0.1, 0.1, 0.92, -1.15, 0.18, 0, 0.03), C.dark),\n paint(box(q, 0.04, 0.07, 0.44, 1.2, 0.27, 0, 0), C.black),\n );\n [-1, 1].forEach((s) => {\n parts.trim.push(paint(box(q, 0.05, 0.12, 0.05, -1.03, 0.53, s * 0.3, 0), C.dark));\n if (!q.low) parts.trim.push(paint(cylinder(0.035, 0.1, 8, 'x', -1.17, 0.1, s * 0.22), C.chrome));\n parts.lights.push(\n paint(box(q, 0.06, 0.06, 0.2, 1.18, 0.35, s * 0.29, 0), C.head),\n paint(box(q, 0.04, 0.06, 0.24, -1.17, 0.36, s * 0.27, 0), C.tail),\n );\n });\n return parts;\n}\n\nfunction muscle(q) {\n const parts = { body: [], glass: [], wheels: [], trim: [], lights: [] };\n // Boxy body, long flat hood, short deck; fat rear tires.\n parts.body.push(extrude(profile([\n [-1.12, 0.17], { arch: [-0.74, 0.25, 0.34, 0.17] }, { arch: [0.8, 0.22, 0.31, 0.17] }, [1.15, 0.17],\n [1.18, 0.21], [1.18, 0.44], [1.13, 0.5], [-1.1, 0.5], [-1.15, 0.46], [-1.15, 0.22],\n ]), 0.96, 0.05, q));\n parts.glass.push(extrude(profile([[0.28, 0.47], [-0.02, 0.76], [-0.58, 0.76], [-0.8, 0.47]]), 0.8, 0.03, q));\n parts.body.push(\n box(q, 0.62, 0.06, 0.86, -0.3, 0.8, 0, 0.02),\n box(q, 0.34, 0.08, 0.3, 0.62, 0.58, 0, 0.025), // hood scoop\n box(q, 0.2, 0.05, 1.0, -1.04, 0.75, 0, 0.02), // rear wing\n );\n addWheels(q, parts, [{ x: 0.8, r: 0.22, w: 0.2, z: 0.4 }, { x: -0.74, r: 0.25, w: 0.26, z: 0.39 }]);\n parts.trim.push(\n paint(box(q, 0.06, 0.08, 1.0, 1.23, 0.2, 0, 0.02), C.chrome),\n paint(box(q, 0.06, 0.08, 1.0, -1.23, 0.2, 0, 0.02), C.chrome),\n paint(box(q, 0.03, 0.16, 0.62, 1.235, 0.33, 0, 0), C.black),\n paint(box(q, 0.03, 0.05, 0.22, 0.79, 0.59, 0, 0), C.black),\n );\n [-1, 1].forEach((s) => {\n // Twin racing stripes over hood, roof and deck.\n parts.trim.push(\n paint(box(q, 0.82, 0.012, 0.08, 0.71, 0.553, s * 0.08, 0), C.black),\n paint(box(q, 0.6, 0.012, 0.08, -0.3, 0.833, s * 0.08, 0), C.black),\n paint(box(q, 0.3, 0.012, 0.08, -0.98, 0.553, s * 0.08, 0), C.black),\n paint(box(q, 0.06, 0.18, 0.06, -1.04, 0.64, s * 0.34, 0), C.dark),\n );\n if (!q.low) parts.trim.push(paint(cylinder(0.04, 0.12, 8, 'x', -1.2, 0.12, s * 0.3), C.chrome));\n parts.lights.push(\n paint(cylinder(0.065, 0.03, q.low ? 6 : 10, 'x', 1.245, 0.34, s * 0.37), C.head),\n paint(box(q, 0.03, 0.07, 0.3, -1.215, 0.4, s * 0.26, 0), C.tail),\n );\n });\n return parts;\n}\n\nfunction racer(q) {\n const parts = { body: [], glass: [], wheels: [], trim: [], lights: [] };\n // Open-wheel tub: tapered nose, cockpit, airbox and sloped engine cover.\n const tub = extrude(profile([\n [-0.96, 0.12], [1.14, 0.12], [1.14, 0.17], [0.55, 0.3], [0.2, 0.36], [0.14, 0.4], [-0.16, 0.4],\n [-0.24, 0.54], [-0.4, 0.56], [-0.96, 0.3],\n ]), 0.44, 0.04, q);\n const position = tub.attributes.position;\n for (let i = 0; i < position.count; i += 1) {\n const x = position.getX(i);\n const taper = x > 0.35 ? 1 - 0.55 * Math.min(1, (x - 0.35) / 0.85) : x < -0.5 ? 1 - 0.3 * Math.min(1, (-0.5 - x) / 0.5) : 1;\n position.setZ(i, position.getZ(i) * taper);\n }\n tub.computeVertexNormals();\n parts.body.push(\n tub,\n box(q, 0.6, 0.2, 0.76, -0.12, 0.24, 0, 0.05), // sidepods\n box(q, 0.22, 0.04, 1.0, 1.12, 0.07, 0, 0.015), // front wing\n box(q, 0.24, 0.05, 0.84, -0.98, 0.71, 0, 0.02), // rear wing\n );\n parts.glass.push(box(q, 0.04, 0.045, 0.15, 0.08, 0.49, 0, 0));\n addWheels(q, parts, [{ x: 0.82, r: 0.2, w: 0.17, z: 0.415 }, { x: -0.74, r: 0.24, w: 0.24, z: 0.38 }]);\n parts.trim.push(\n paint(new SphereGeometry(0.12, q.low ? 8 : 10, q.low ? 6 : 8).translate(-0.03, 0.47, 0), C.white),\n paint(box(q, 0.06, 0.36, 0.05, -0.94, 0.52, 0, 0), C.dark),\n paint(box(q, 0.03, 0.06, 0.08, -0.25, 0.56, 0, 0), C.black),\n );\n [-1, 1].forEach((s) => {\n parts.trim.push(\n paint(box(q, 0.24, 0.12, 0.025, 1.14, 0.1, s * 0.5, 0), C.dark),\n paint(box(q, 0.3, 0.24, 0.025, -0.98, 0.64, s * 0.43, 0), C.dark),\n paint(box(q, 0.04, 0.03, 0.2, 0.82, 0.2, s * 0.24, 0), C.dark),\n paint(box(q, 0.04, 0.03, 0.1, -0.74, 0.24, s * 0.23, 0), C.dark),\n );\n });\n if (!q.low) parts.trim.push(paint(cylinder(0.03, 0.08, 8, 'x', -1.0, 0.28, 0), C.chrome));\n parts.lights.push(paint(box(q, 0.03, 0.06, 0.1, -1.015, 0.2, 0, 0), C.tail));\n return parts;\n}\n\nfunction createMaterials(lowPower) {\n const make = (options, standard) => (lowPower ? new MeshLambertMaterial(options) : new MeshStandardMaterial({ ...options, ...standard }));\n return {\n body: make({ color: 0xffffff }, { roughness: 0.28, metalness: 0.3 }),\n glass: make({ color: 0x1c2636 }, { roughness: 0.12, metalness: 0.6 }),\n wheels: make({ color: 0xffffff, vertexColors: true }, { roughness: 0.75, metalness: 0.15 }),\n trim: make({ color: 0xffffff, vertexColors: true }, { roughness: 0.35, metalness: 0.55 }),\n // Unlit so head/tail lights read as glowing.\n lights: new MeshBasicMaterial({ color: 0xffffff, vertexColors: true, toneMapped: false }),\n };\n}\n\n// Merges each part, recenters every part on the car's bbox and sizes the collision sphere.\nfunction assemble(kind, parts, materials, palette, physics) {\n const merged = PART_ORDER.filter((name) => parts[name].length).map((name) => {\n const geometry = mergeBufferGeometries(parts[name].map(prep));\n if (!geometry) throw new Error(`avalanche cars: cannot merge ${kind}.${name}`);\n geometry.computeBoundingBox();\n return { name, geometry };\n });\n const bounds = new Box3();\n merged.forEach(({ geometry }) => bounds.union(geometry.boundingBox));\n const center = bounds.getCenter(new Vector3());\n const size = bounds.getSize(new Vector3());\n merged.forEach(({ geometry }) => {\n geometry.translate(-center.x, -center.y, -center.z);\n geometry.computeBoundingSphere();\n });\n return {\n kind,\n parts: merged.map(({ name, geometry }) => ({ geometry, material: materials[name], tinted: name === 'body' })),\n palette,\n // Equal-volume sphere of the bbox (≈0.78): snugger piles than the full bounding sphere.\n radius: Math.cbrt((size.x * size.y * size.z * 3) / (4 * Math.PI)),\n ...physics,\n };\n}\n\n/** Coupe, muscle car and open-wheel racer. Materials and palette are shared across kinds. */\nexport function createCarModels({ lowPower = false } = {}) {\n const q = { low: lowPower, curve: lowPower ? 3 : 5, bevel: lowPower ? 1 : 2, radial: lowPower ? 8 : 14 };\n const materials = createMaterials(lowPower);\n const palette = PALETTE.map((hex) => new Color(hex));\n const pools = { count: 10, countLow: 6 };\n return [\n assemble('car', coupe(q), materials, palette, { mass: 3, bounce: 0.35, friction: 0.6, drag: 0.04, ...pools }),\n assemble('car-muscle', muscle(q), materials, palette, { mass: 3.4, bounce: 0.3, friction: 0.62, drag: 0.04, ...pools }),\n assemble('car-racer', racer(q), materials, palette, { mass: 2.6, bounce: 0.4, friction: 0.55, drag: 0.05, ...pools }),\n ];\n}\n","// Avalancha FX: landing dust, coin glints and mini tank blasts.\n// Three pooled Points batches (smoke, fire, glint) + a few flash sprites. Every GPU resource and\n// buffer is created once; update() does no allocations. Textures are generated CanvasTextures.\nimport {\n AdditiveBlending, BufferAttribute, BufferGeometry, CanvasTexture, Color, DynamicDrawUsage, Group,\n NormalBlending, Points, ShaderMaterial, Sprite, SpriteMaterial, Vector2,\n} from 'three';\n\n// Per-particle record layout (Float32Array, STRIDE floats each).\nconst STRIDE = 22;\nconst PX = 0, PY = 1, PZ = 2, VX = 3, VY = 4, VZ = 5, AGE = 6, LIFE = 7, S0 = 8, S1 = 9;\nconst R0 = 10, G0 = 11, B0 = 12, R1 = 13, G1 = 14, B1 = 15, A0 = 16, DRAG = 17, GRAV = 18;\nconst HOT = 19, SPIN = 20, TW = 21;\n// Rotation and twinkle phase live in their own arrays (rotation is also a vertex attribute).\n\nconst COL = {\n dust: new Color('#e6d6b8'),\n dustGrey: new Color('#a39b90'),\n smokeDark: new Color('#3a3432'),\n smoke: new Color('#76706b'),\n fireCore: new Color('#fff3b0'),\n fire: new Color('#ffc23a'),\n fireRed: new Color('#e8471c'),\n spark: new Color('#fff6cf'),\n ember: new Color('#ff8a2a'),\n glintWhite: new Color('#fffbe8'),\n gold: new Color('#ffc53a'),\n flash: new Color('#ffe2a6'),\n};\n\n// Point size is a world-space diameter: pixels = size * uScale / depth (uScale synced per frame).\nconst VERT = /* glsl */ `\nuniform float uScale;\nattribute vec4 aColor;\nattribute float aSize;\nattribute float aRot;\nvarying vec4 vColor;\nvarying vec2 vRot;\nvoid main() {\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * mv;\n gl_PointSize = aColor.a > 0.003 ? min(aSize * uScale / max(-mv.z, 0.5), 1024.0) : 0.0;\n vColor = aColor;\n vRot = vec2(cos(aRot), sin(aRot));\n}\n`;\nconst FRAG = /* glsl */ `\nuniform sampler2D uMap;\nvarying vec4 vColor;\nvarying vec2 vRot;\nvoid main() {\n vec2 uv = gl_PointCoord - 0.5;\n uv = vec2(vRot.x * uv.x - vRot.y * uv.y, vRot.y * uv.x + vRot.x * uv.y) + 0.5;\n float a = texture2D(uMap, uv).a * vColor.a;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor.rgb, a);\n #include <encodings_fragment>\n}\n`;\n\nconst rand = (min, max) => min + Math.random() * (max - min);\nconst clampPower = (power) => (Number.isFinite(power) ? Math.min(2.5, Math.max(0.2, power)) : 1);\n\nfunction makeCanvas(size) {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n return { canvas, ctx: canvas.getContext('2d') };\n}\n\n// Soft round dot (fire, flash).\nfunction softDot(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n const gradient = ctx.createRadialGradient(c, c, 0, c, c, c);\n gradient.addColorStop(0, 'rgba(255,255,255,1)');\n gradient.addColorStop(0.35, 'rgba(255,255,255,.6)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n return new CanvasTexture(canvas);\n}\n\n// Puffy smoke blob: overlapping soft circles from a fixed seed.\nfunction smokeBlob(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n let seed = 11;\n const next = () => { seed = (seed * 16807) % 2147483647; return seed / 2147483647; };\n for (let i = 0; i < 7; i += 1) {\n const angle = next() * Math.PI * 2;\n const offset = next() * c * 0.3;\n const x = c + Math.cos(angle) * offset;\n const y = c + Math.sin(angle) * offset;\n const radius = c * (0.45 + next() * 0.22);\n const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);\n gradient.addColorStop(0, 'rgba(255,255,255,.55)');\n gradient.addColorStop(0.6, 'rgba(255,255,255,.25)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n }\n return new CanvasTexture(canvas);\n}\n\n// Four-point star glint: soft core + tapered cross + short diagonals (stays inside the inscribed circle).\nfunction glint(size = 64) {\n const { canvas, ctx } = makeCanvas(size);\n const c = size / 2;\n ctx.globalCompositeOperation = 'lighter';\n const core = ctx.createRadialGradient(c, c, 0, c, c, c * 0.42);\n core.addColorStop(0, 'rgba(255,255,255,1)');\n core.addColorStop(0.3, 'rgba(255,255,255,.55)');\n core.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = core;\n ctx.fillRect(0, 0, size, size);\n const ray = (angle, length, width) => {\n ctx.save();\n ctx.translate(c, c);\n ctx.rotate(angle);\n const gradient = ctx.createLinearGradient(-length, 0, length, 0);\n gradient.addColorStop(0, 'rgba(255,255,255,0)');\n gradient.addColorStop(0.5, 'rgba(255,255,255,1)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.moveTo(-length, 0);\n ctx.lineTo(0, -width);\n ctx.lineTo(length, 0);\n ctx.lineTo(0, width);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n };\n ray(0, c * 0.94, size * 0.05);\n ray(Math.PI / 2, c * 0.94, size * 0.05);\n ray(Math.PI / 4, c * 0.5, size * 0.03);\n ray(-Math.PI / 4, c * 0.5, size * 0.03);\n return new CanvasTexture(canvas);\n}\n\n// Reusable emit spec: emitters mutate it, batch.emit() copies it into the pool.\nconst spec = {\n x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, life: 1, delay: 0, s0: 1, s1: 1, c0: COL.dust, c1: COL.dust,\n shade: 1, alpha: 1, drag: 0, grav: 0, hot: 0, rot: 0, spin: 0, twinkle: 0,\n};\nfunction particle(x, y, z) {\n spec.x = x; spec.y = y; spec.z = z;\n spec.vx = 0; spec.vy = 0; spec.vz = 0;\n spec.life = 1; spec.delay = 0; spec.s0 = 1; spec.s1 = 1;\n spec.shade = 1; spec.alpha = 1; spec.drag = 0; spec.grav = 0; spec.hot = 0;\n spec.rot = Math.random() * Math.PI * 2; spec.spin = 0; spec.twinkle = 0;\n return spec;\n}\n\n/** Fixed-capacity Points pool; when full the oldest slot (ring cursor) is overwritten. */\nfunction createBatch(cap, { map, additive, scale, renderOrder, fadeIn }) {\n const data = new Float32Array(cap * STRIDE);\n const phase = new Float32Array(cap);\n const pos = new Float32Array(cap * 3);\n const col = new Float32Array(cap * 4);\n const size = new Float32Array(cap);\n const rot = new Float32Array(cap);\n const geometry = new BufferGeometry();\n const attribute = (array, itemSize) => new BufferAttribute(array, itemSize).setUsage(DynamicDrawUsage);\n geometry.setAttribute('position', attribute(pos, 3));\n geometry.setAttribute('aColor', attribute(col, 4));\n geometry.setAttribute('aSize', attribute(size, 1));\n geometry.setAttribute('aRot', attribute(rot, 1));\n geometry.setDrawRange(0, 0);\n const material = new ShaderMaterial({\n uniforms: { uScale: scale, uMap: { value: map } },\n vertexShader: VERT,\n fragmentShader: FRAG,\n transparent: true,\n depthWrite: false,\n blending: additive ? AdditiveBlending : NormalBlending,\n });\n const points = new Points(geometry, material);\n points.frustumCulled = false;\n points.visible = false;\n points.renderOrder = renderOrder;\n const attributes = [geometry.attributes.position, geometry.attributes.aColor, geometry.attributes.aSize, geometry.attributes.aRot];\n const itemSizes = attributes.map((entry) => entry.itemSize);\n let count = 0;\n let cursor = 0;\n\n return {\n points,\n emit(p) {\n let i;\n if (count < cap) { i = count; count += 1; } else { i = cursor; cursor = (cursor + 1) % cap; }\n const o = i * STRIDE;\n data[o + PX] = p.x; data[o + PY] = p.y; data[o + PZ] = p.z;\n data[o + VX] = p.vx; data[o + VY] = p.vy; data[o + VZ] = p.vz;\n data[o + AGE] = -p.delay; data[o + LIFE] = p.life;\n data[o + S0] = p.s0; data[o + S1] = p.s1;\n data[o + R0] = p.c0.r * p.shade; data[o + G0] = p.c0.g * p.shade; data[o + B0] = p.c0.b * p.shade;\n data[o + R1] = p.c1.r * p.shade; data[o + G1] = p.c1.g * p.shade; data[o + B1] = p.c1.b * p.shade;\n data[o + A0] = p.alpha; data[o + DRAG] = p.drag; data[o + GRAV] = p.grav;\n data[o + HOT] = p.hot; data[o + SPIN] = p.spin; data[o + TW] = p.twinkle;\n phase[i] = Math.random() * Math.PI * 2;\n rot[i] = p.rot;\n // Hidden until the first update positions it.\n col[i * 4 + 3] = 0;\n },\n update(dt) {\n let i = 0;\n while (i < count) {\n const o = i * STRIDE;\n const age = data[o + AGE] + dt;\n const life = data[o + LIFE];\n if (age >= life) {\n // Swap-remove keeps the live range dense.\n count -= 1;\n if (i !== count) {\n data.copyWithin(o, count * STRIDE, count * STRIDE + STRIDE);\n phase[i] = phase[count];\n rot[i] = rot[count];\n }\n continue;\n }\n data[o + AGE] = age;\n const p3 = i * 3;\n const p4 = i * 4;\n if (age < 0) {\n // Delayed spawn: parked and invisible.\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ];\n col[p4 + 3] = 0;\n size[i] = 0;\n i += 1;\n continue;\n }\n const damp = Math.exp(-data[o + DRAG] * dt);\n data[o + VX] *= damp;\n data[o + VY] = data[o + VY] * damp - data[o + GRAV] * dt;\n data[o + VZ] *= damp;\n data[o + PX] += data[o + VX] * dt;\n data[o + PY] += data[o + VY] * dt;\n data[o + PZ] += data[o + VZ] * dt;\n rot[i] += data[o + SPIN] * dt;\n\n const k = age / life;\n const t = k < 0.7 ? k / 0.7 : 1;\n const blend = t * t * (3 - 2 * t);\n const inv = 1 - k;\n const hot = 1 + data[o + HOT] * inv * inv * inv;\n pos[p3] = data[o + PX]; pos[p3 + 1] = data[o + PY]; pos[p3 + 2] = data[o + PZ];\n col[p4] = (data[o + R0] + (data[o + R1] - data[o + R0]) * blend) * hot;\n col[p4 + 1] = (data[o + G0] + (data[o + G1] - data[o + G0]) * blend) * hot;\n col[p4 + 2] = (data[o + B0] + (data[o + B1] - data[o + B0]) * blend) * hot;\n const fin = k < fadeIn ? k / fadeIn : 1;\n const fout = k > 0.5 ? inv * 2 : 1;\n const tw = data[o + TW] > 0 ? 0.35 + 0.65 * (0.5 + 0.5 * Math.sin(age * data[o + TW] + phase[i])) : 1;\n col[p4 + 3] = data[o + A0] * fin * fout * tw;\n size[i] = data[o + S0] + (data[o + S1] - data[o + S0]) * (1 - inv * inv);\n i += 1;\n }\n geometry.setDrawRange(0, count);\n points.visible = count > 0;\n if (count > 0) {\n for (let a = 0; a < attributes.length; a += 1) {\n attributes[a].updateRange.offset = 0;\n attributes[a].updateRange.count = count * itemSizes[a];\n attributes[a].needsUpdate = true;\n }\n }\n },\n dispose() {\n geometry.dispose();\n material.dispose();\n },\n };\n}\n\nexport function createAvalancheFx(scene, { lowPower = false } = {}) {\n const k = lowPower ? 0.5 : 1;\n const n = (base, power, min = 1) => Math.max(min, Math.round(base * power * k));\n\n const dot = softDot(64);\n const blob = smokeBlob(64);\n const star = glint(64);\n\n // Shared world-to-pixel factor: drawingBufferHeight / 2 * projection[5].\n const scale = { value: 600 };\n const bufferSize = new Vector2();\n const syncScale = (renderer, _scene, camera) => {\n renderer.getDrawingBufferSize(bufferSize);\n scale.value = bufferSize.y * 0.5 * camera.projectionMatrix.elements[5];\n };\n\n const smoke = createBatch(Math.round(360 * k), { map: blob, additive: false, scale, renderOrder: 20, fadeIn: 0.12 });\n const fire = createBatch(Math.round(260 * k), { map: dot, additive: true, scale, renderOrder: 21, fadeIn: 0.05 });\n const glints = createBatch(Math.round(240 * k), { map: star, additive: true, scale, renderOrder: 22, fadeIn: 0.08 });\n const batches = [smoke, fire, glints];\n const group = new Group();\n group.name = 'avalanche-fx';\n batches.forEach((batch) => {\n batch.points.onBeforeRender = syncScale;\n group.add(batch.points);\n });\n\n // Flash sprites: short additive pops (Sprite geometry is shared by three, never disposed here).\n const flashes = Array.from({ length: lowPower ? 2 : 4 }, () => {\n const sprite = new Sprite(new SpriteMaterial({\n map: dot, color: COL.flash, blending: AdditiveBlending, transparent: true, depthWrite: false,\n }));\n sprite.visible = false;\n sprite.renderOrder = 23;\n sprite.frustumCulled = false;\n group.add(sprite);\n return { sprite, t: 0, dur: 0.2, size: 1 };\n });\n let flashCursor = 0;\n scene.add(group);\n let disposed = false;\n\n function flash(x, y, z, size, dur) {\n const entry = flashes[flashCursor];\n flashCursor = (flashCursor + 1) % flashes.length;\n entry.t = 0;\n entry.dur = dur;\n entry.size = size;\n entry.sprite.position.set(x, y, z);\n entry.sprite.scale.setScalar(size * 0.55);\n entry.sprite.material.opacity = 1;\n entry.sprite.visible = true;\n }\n\n // Ground dust ring for a landing car/tank (~0.6 s).\n function puff(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n const grow = 0.7 + 0.3 * p;\n const ring = n(18, p, 4);\n for (let i = 0; i < ring; i += 1) {\n const angle = (i / ring) * Math.PI * 2 + rand(-0.15, 0.15);\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const r0 = 0.3 * grow;\n const speed = rand(2.2, 3.8) * grow;\n const s = particle(x + cos * r0, y + rand(0.05, 0.2), z + sin * r0 * 0.6);\n s.vx = cos * speed; s.vy = rand(0.3, 1.1); s.vz = sin * speed * 0.6;\n s.life = rand(0.45, 0.7);\n s.s0 = rand(0.3, 0.5) * grow; s.s1 = rand(1.1, 1.6) * grow;\n s.c0 = COL.dust; s.c1 = COL.dustGrey; s.shade = rand(0.88, 1.06);\n s.alpha = rand(0.45, 0.6); s.drag = 3.6; s.grav = -0.6; s.spin = rand(-1.5, 1.5);\n smoke.emit(s);\n }\n // A few slower billows rising from the center.\n const billows = n(5, p, 1);\n for (let i = 0; i < billows; i += 1) {\n const s = particle(x + rand(-0.35, 0.35) * grow, y + 0.15, z + rand(-0.2, 0.2));\n s.vx = rand(-0.5, 0.5); s.vy = rand(1, 1.8) * grow; s.vz = rand(-0.3, 0.3);\n s.life = rand(0.5, 0.65);\n s.s0 = 0.5 * grow; s.s1 = rand(1.3, 1.8) * grow;\n s.c0 = COL.dust; s.c1 = COL.dustGrey; s.shade = rand(0.9, 1.04);\n s.alpha = 0.42; s.drag = 2.4; s.grav = -0.4; s.spin = rand(-1, 1);\n smoke.emit(s);\n }\n }\n\n // Golden twinkling glints for coins/money (~0.5 s).\n function sparkle(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n const count = n(10, p, 2);\n for (let i = 0; i < count; i += 1) {\n const s = particle(x + rand(-0.3, 0.3), y + rand(-0.2, 0.3), z + rand(-0.2, 0.3));\n const angle = Math.random() * Math.PI * 2;\n const speed = rand(1.5, 3.5) * (0.6 + 0.4 * p);\n s.vx = Math.cos(angle) * speed; s.vy = Math.sin(angle) * speed * 0.8 + 1.2; s.vz = rand(-1, 1) * speed * 0.5;\n s.life = rand(0.35, 0.6); s.delay = rand(0, 0.08);\n s.s0 = rand(0.35, 0.6); s.s1 = 0.08;\n s.c0 = COL.glintWhite; s.c1 = COL.gold; s.alpha = 1; s.hot = 0.4;\n s.drag = 2.6; s.grav = 2.5; s.spin = rand(-6, 6); s.twinkle = rand(24, 40);\n glints.emit(s);\n }\n // Central \"ping\" star.\n const s = particle(x, y + 0.1, z + 0.2);\n s.life = 0.28; s.s0 = 0.9 * (0.7 + 0.3 * p); s.s1 = 0.25;\n s.c0 = COL.glintWhite; s.c1 = COL.gold; s.alpha = 1; s.rot = 0; s.spin = 3;\n glints.emit(s);\n }\n\n // Mini cartoon explosion: flash + fireball + sparks + dark smoke column (~1 s).\n function blast(x, y, z, power = 1) {\n if (disposed) return;\n const p = clampPower(power);\n flash(x, y + 0.5 * p, z + 0.4, 3.4 * p, 0.2);\n const fireCount = n(26, p, 6);\n for (let i = 0; i < fireCount; i += 1) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(Math.random() * 0.9);\n const speed = rand(2.5, 6) * p;\n const s = particle(x + rand(-0.3, 0.3), y + 0.3, z + rand(-0.3, 0.3));\n s.vx = Math.cos(theta) * Math.sin(phi) * speed;\n s.vy = Math.cos(phi) * speed * 0.9 + 1.5;\n s.vz = Math.sin(theta) * Math.sin(phi) * speed * 0.6;\n s.life = rand(0.35, 0.6);\n s.s0 = rand(0.5, 0.75) * p; s.s1 = rand(1.2, 1.6) * p;\n s.c0 = Math.random() < 0.3 ? COL.fireCore : COL.fire; s.c1 = COL.fireRed;\n s.alpha = 0.9; s.drag = 4; s.grav = -1; s.hot = 1.4; s.spin = rand(-2, 2);\n fire.emit(s);\n }\n const sparkCount = n(12, p, 3);\n for (let i = 0; i < sparkCount; i += 1) {\n const theta = Math.random() * Math.PI * 2;\n const speed = rand(6, 11) * p;\n const s = particle(x, y + 0.4, z);\n s.vx = Math.cos(theta) * speed * 0.7; s.vy = rand(4, 9) * p; s.vz = Math.sin(theta) * speed * 0.4;\n s.life = rand(0.4, 0.7);\n s.s0 = 0.2; s.s1 = 0.06;\n s.c0 = COL.spark; s.c1 = COL.ember; s.alpha = 1; s.drag = 1; s.grav = 14; s.hot = 1;\n fire.emit(s);\n }\n const smokeCount = n(14, p, 4);\n for (let i = 0; i < smokeCount; i += 1) {\n const s = particle(x + rand(-0.6, 0.6) * p, y + rand(0.3, 0.9) * p, z + rand(-0.4, 0.4));\n s.vx = rand(-1, 1) * p; s.vy = rand(1.6, 3) * p; s.vz = rand(-0.5, 0.5);\n s.life = rand(0.75, 1); s.delay = rand(0.02, 0.12);\n s.s0 = rand(0.6, 0.8) * p; s.s1 = rand(1.9, 2.5) * p;\n s.c0 = COL.smokeDark; s.c1 = COL.smoke; s.shade = rand(0.85, 1.1);\n s.alpha = rand(0.55, 0.7); s.drag = 1.3; s.grav = -0.5; s.spin = rand(-1.2, 1.2);\n smoke.emit(s);\n }\n }\n\n function update(dt) {\n if (disposed) return;\n const step = Math.min(Math.max(dt || 0, 0), 0.1);\n for (let b = 0; b < batches.length; b += 1) batches[b].update(step);\n for (let f = 0; f < flashes.length; f += 1) {\n const entry = flashes[f];\n if (!entry.sprite.visible) continue;\n entry.t += step;\n const t = entry.t / entry.dur;\n if (t >= 1) { entry.sprite.visible = false; continue; }\n entry.sprite.material.opacity = (1 - t) * (1 - t);\n entry.sprite.scale.setScalar(entry.size * (0.55 + 0.65 * t));\n }\n }\n\n function dispose() {\n if (disposed) return;\n disposed = true;\n scene.remove(group);\n batches.forEach((batch) => batch.dispose());\n flashes.forEach(({ sprite }) => sprite.material.dispose());\n group.clear();\n dot.dispose();\n blob.dispose();\n star.dispose();\n }\n\n return { puff, sparkle, blast, update, dispose };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/games/shared/gameStatus.js
|
|
2
|
+
var e = (e, t) => e != null && t != null && String(e) === String(t), t = (e) => [
|
|
3
|
+
"won",
|
|
4
|
+
"draw",
|
|
5
|
+
"declined",
|
|
6
|
+
"closed"
|
|
7
|
+
].includes(e?.status), n = (e) => !!e && ([
|
|
8
|
+
"invited",
|
|
9
|
+
"placement",
|
|
10
|
+
"seeding",
|
|
11
|
+
"active",
|
|
12
|
+
"conflict"
|
|
13
|
+
].includes(e.status) || !!e.pendingEvent), r = (e) => e?.game === "battleship", i = (e) => e?.game === "tanks", a = {
|
|
14
|
+
connect4: "Conecta 4",
|
|
15
|
+
battleship: "Batalla Naval",
|
|
16
|
+
tanks: "Tanques de guerra",
|
|
17
|
+
tanks_live: "Tanques LIVE 3D",
|
|
18
|
+
racing_live: "Carreras LIVE 🏎️"
|
|
19
|
+
}, o = (e) => a[e?.game] ?? "Conecta 4", s = {
|
|
20
|
+
ok: "Partida verificada",
|
|
21
|
+
mismatch: "Resultados inconsistentes del rival",
|
|
22
|
+
pending: "Verificando…"
|
|
23
|
+
}, c = (e) => s[e?.verification] || "";
|
|
24
|
+
function l(t, n) {
|
|
25
|
+
let r = e(n, t.turnId);
|
|
26
|
+
return t.status === "placement" ? t.myReady ? t.opponentReady ? "Iniciando batalla…" : "Esperando a que el rival coloque su flota" : "Coloca tu flota" : t.status === "active" ? t.pendingShot ? "Esperando resultado…" : r ? "Tu turno · elige una casilla" : "Turno del rival" : t.status === "won" ? e(n, t.winnerId) ? "¡Ganaste!" : "Tu rival ganó" : null;
|
|
27
|
+
}
|
|
28
|
+
function u(t, n) {
|
|
29
|
+
if (t.status === "seeding") return "Preparando el campo de batalla…";
|
|
30
|
+
if (t.status === "active") return e(n, t.turnId) ? "Tu turno · apunta y dispara" : "Turno del rival";
|
|
31
|
+
if (t.status === "won") {
|
|
32
|
+
let r = e(n, t.winnerId), i = t.logic?.reason;
|
|
33
|
+
return i === "resign" ? r ? "¡Victoria! Tu rival se rindió" : "Te rendiste" : i === "timeout" ? r ? "¡Victoria! Tu rival dejó pasar sus turnos" : "Perdiste por inactividad" : i === "max_shots" ? r ? "¡Victoria por vida restante!" : "Tu rival terminó con más vida" : r ? "¡Victoria! Destruiste al rival" : "Tu tanque fue destruido";
|
|
34
|
+
}
|
|
35
|
+
return t.status === "draw" ? t.logic?.reason === "max_shots" ? "Empate · misma vida al agotar los disparos" : "Empate · ambos tanques destruidos" : null;
|
|
36
|
+
}
|
|
37
|
+
function d(t, n) {
|
|
38
|
+
if (t?.game === "racing_live" && t.status === "active") return "Invitación aceptada · carrera en desarrollo";
|
|
39
|
+
if (t?.game === "tanks_live" && t.status === "active") return "Combate en vivo · conduce, apunta y dispara";
|
|
40
|
+
if (r(t)) {
|
|
41
|
+
let e = l(t, n);
|
|
42
|
+
if (e) return e;
|
|
43
|
+
}
|
|
44
|
+
if (i(t)) {
|
|
45
|
+
let e = u(t, n);
|
|
46
|
+
if (e) return e;
|
|
47
|
+
}
|
|
48
|
+
let a = t.status === "active" && e(n, t.turnId);
|
|
49
|
+
return t.status === "invited" ? e(n, t.guestId) ? "Te han invitado a jugar" : "Esperando respuesta a la invitación" : t.status === "active" ? a ? "Tu turno · elige una columna" : "Turno de tu rival" : t.status === "won" ? e(n, t.winnerId) ? "¡Ganaste la partida!" : "Tu rival ganó la partida" : t.status === "draw" ? "Empate · tablero completo" : t.status === "declined" ? "Invitación rechazada" : t.status === "closed" ? "Partida finalizada" : t.status === "conflict" ? "Partida pausada por un conflicto de sincronización" : "Esperando respuesta a la invitación";
|
|
50
|
+
}
|
|
51
|
+
function f(t, n) {
|
|
52
|
+
if (t?.game === "racing_live" && t.status === "active") return "Carrera en desarrollo";
|
|
53
|
+
if (t?.game === "tanks_live" && t.status === "active") return "Combate LIVE";
|
|
54
|
+
if (r(t)) {
|
|
55
|
+
if (t.status === "placement") return t.myReady ? "Esperando al rival" : "Coloca tu flota";
|
|
56
|
+
if (t.status === "active" && t.pendingShot) return "Esperando resultado…";
|
|
57
|
+
}
|
|
58
|
+
return i(t) && t.status === "seeding" ? "Preparando…" : t.status === "active" ? e(n, t.turnId) ? "Tu turno" : "Turno del rival" : t.status === "invited" ? e(n, t.guestId) ? "Invitación recibida" : "Invitación enviada" : t.status === "conflict" ? t.sync?.status === "requesting" ? "Sincronizando…" : "Sin sincronizar" : d(t, n);
|
|
59
|
+
}
|
|
60
|
+
export { r as a, t as c, c as i, e as l, o as n, n as o, f as r, i as s, d as t };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=gameStatus-BChd29yI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gameStatus-BChd29yI.js","names":["sameUser","left","right","isTerminalGame","game","isLiveGame","isBattleshipGame","isTanksGame","GAME_TITLES","getGameTitle","VERIFICATION_LABELS","getVerificationLabel","getBattleshipStatus","myTurn","currentUserId","getTanksStatus","won","reason","getGameStatus","status","getShortGameStatus"],"sources":["../../src/games/shared/gameStatus.js"],"sourcesContent":["export const sameUser = (left, right) => left != null && right != null && String(left) === String(right);\nexport const isTerminalGame = (game) => ['won', 'draw', 'declined', 'closed'].includes(game?.status);\nexport const isLiveGame = (game) => Boolean(game) && (['invited', 'placement', 'seeding', 'active', 'conflict'].includes(game.status) || Boolean(game.pendingEvent));\nexport const isBattleshipGame = (game) => game?.game === 'battleship';\nexport const isTanksGame = (game) => game?.game === 'tanks';\nconst GAME_TITLES = { connect4: 'Conecta 4', battleship: 'Batalla Naval', tanks: 'Tanques de guerra', tanks_live: 'Tanques LIVE 3D', racing_live: 'Carreras LIVE 🏎️' };\nexport const getGameTitle = (game) => GAME_TITLES[game?.game] ?? 'Conecta 4';\n\nconst VERIFICATION_LABELS = { ok: 'Partida verificada', mismatch: 'Resultados inconsistentes del rival', pending: 'Verificando…' };\nexport const getVerificationLabel = (game) => VERIFICATION_LABELS[game?.verification] || '';\n\nfunction getBattleshipStatus(game, currentUserId) {\n const myTurn = sameUser(currentUserId, game.turnId);\n if (game.status === 'placement') {\n if (!game.myReady) return 'Coloca tu flota';\n return game.opponentReady ? 'Iniciando batalla…' : 'Esperando a que el rival coloque su flota';\n }\n if (game.status === 'active') {\n if (game.pendingShot) return 'Esperando resultado…';\n return myTurn ? 'Tu turno · elige una casilla' : 'Turno del rival';\n }\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste!' : 'Tu rival ganó';\n return null;\n}\n\nfunction getTanksStatus(game, currentUserId) {\n if (game.status === 'seeding') return 'Preparando el campo de batalla…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno · apunta y dispara' : 'Turno del rival';\n if (game.status === 'won') {\n const won = sameUser(currentUserId, game.winnerId);\n const reason = game.logic?.reason;\n if (reason === 'resign') return won ? '¡Victoria! Tu rival se rindió' : 'Te rendiste';\n if (reason === 'timeout') return won ? '¡Victoria! Tu rival dejó pasar sus turnos' : 'Perdiste por inactividad';\n if (reason === 'max_shots') return won ? '¡Victoria por vida restante!' : 'Tu rival terminó con más vida';\n return won ? '¡Victoria! Destruiste al rival' : 'Tu tanque fue destruido';\n }\n if (game.status === 'draw') return game.logic?.reason === 'max_shots' ? 'Empate · misma vida al agotar los disparos' : 'Empate · ambos tanques destruidos';\n return null;\n}\n\nexport function getGameStatus(game, currentUserId) {\n if (game?.game === 'racing_live' && game.status === 'active') return 'Invitación aceptada · carrera en desarrollo';\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate en vivo · conduce, apunta y dispara';\n if (isBattleshipGame(game)) {\n const status = getBattleshipStatus(game, currentUserId);\n if (status) return status;\n }\n if (isTanksGame(game)) {\n const status = getTanksStatus(game, currentUserId);\n if (status) return status;\n }\n const myTurn = game.status === 'active' && sameUser(currentUserId, game.turnId);\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Te han invitado a jugar' : 'Esperando respuesta a la invitación';\n if (game.status === 'active') return myTurn ? 'Tu turno · elige una columna' : 'Turno de tu rival';\n if (game.status === 'won') return sameUser(currentUserId, game.winnerId) ? '¡Ganaste la partida!' : 'Tu rival ganó la partida';\n if (game.status === 'draw') return 'Empate · tablero completo';\n if (game.status === 'declined') return 'Invitación rechazada';\n if (game.status === 'closed') return 'Partida finalizada';\n if (game.status === 'conflict') return 'Partida pausada por un conflicto de sincronización';\n return 'Esperando respuesta a la invitación';\n}\n\n// Short label for the minimized bar and the timeline placeholder.\nexport function getShortGameStatus(game, currentUserId) {\n if (game?.game === 'racing_live' && game.status === 'active') return 'Carrera en desarrollo';\n if (game?.game === 'tanks_live' && game.status === 'active') return 'Combate LIVE';\n if (isBattleshipGame(game)) {\n if (game.status === 'placement') return game.myReady ? 'Esperando al rival' : 'Coloca tu flota';\n if (game.status === 'active' && game.pendingShot) return 'Esperando resultado…';\n }\n if (isTanksGame(game) && game.status === 'seeding') return 'Preparando…';\n if (game.status === 'active') return sameUser(currentUserId, game.turnId) ? 'Tu turno' : 'Turno del rival';\n if (game.status === 'invited') return sameUser(currentUserId, game.guestId) ? 'Invitación recibida' : 'Invitación enviada';\n if (game.status === 'conflict') return game.sync?.status === 'requesting' ? 'Sincronizando…' : 'Sin sincronizar';\n return getGameStatus(game, currentUserId);\n}\n"],"mappings":"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"}
|