@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTankScene-6asWHKFf.js","names":["createTank","wrapPi","DEG","dampK","ringTexture","lin","WHEELS","blobTexture","createTankGeometries","createTankShared","createSky","createHills","createDecor","createTerrain","SKY","createFx","MAX_DT","MAX_TANKS","SAMPLE_DT","PIXEL_RATIO","SHADOW_SIZE","SUN_DIR","Vector3","detectQuality","coarse","small","cores","pixelRatioFor","d","q","normQ","createTankScene","container","emit","onEvent","err","autoQuality","quality","currentQuality","disposed","renderer","WebGLRenderer","sRGBEncoding","ACESFilmicToneMapping","PCFSoftShadowMap","canvas","width","height","scene","Scene","Fog","camera","PerspectiveCamera","world","Group","hemi","HemisphereLight","sun","DirectionalLight","sc","sky","hills","terrain","decor","fx","tankGeos","tankShared","tanks","tankOrder","wheels","makeWheelMaterial","MeshLambertMaterial","MeshStandardMaterial","makeWheels","InstancedMesh","DynamicDrawUsage","blobTex","blobGeo","PlaneGeometry","blobMat","MeshBasicMaterial","blobs","activeTex","activeMat","activeRing","Mesh","activeId","wind","mapSize","hasWorld","shadowDirty","wheelsDirty","aimDirty","wakeTime","elapsed","timeScale","realDt","turnQueue","currentTurn","celebrateState","mapCenter","v1","v2","v3","mtx","Matrix4","scl","cam","portrait","updateFov","aspect","setCam","mode","opts","reducedMotion","frameOverview","n","ax","az","bx","bz","id","t","dx","dz","span","fovV","ux","uz","nx","ny","nz","act","sx","sz","B","clamp","H","S","px","pz","pl","el","halfH","frameBehind","s","yaw","useHull","rx","rz","back","side","pitchLift","frameFollow","vx","vz","hl","hx","hz","frameOrbit","dt","updateCamera","g","moving","k","dist","tankColorFor","wt","index","ensureTank","removeTank","i","restoreTurret","placeWreckTurret","a","x","z","blowTurret","updateBlown","b","syncTankStatics","bi","at","damageLevel","applyWorld","w","res","sunTarget","list","seen","fromTurn","alive","wait","sec","waitReal","samplePos","samples","out","u","f","turnScript","tank","turn","speedK","path","p","total","seg","L","speed","dustAcc","fwdX","fwdZ","prevX","prevZ","acc","ay","mx","mz","step","dot","head","tgt","turnD","ty","tp","dy","dp","rate","dur","y0","p0","e","shots","craters","c","damage","flashed","recs","sh","fired","lastImpact","carrier","r","remaining","firstStart","fx0","fy0","fz0","vy","active","lt","impactShot","destroyed","imp","y","kind","radius","best","bd","startNextTurn","rec","running","finishTurn","wake","flushTurns","resize","h","ro","docVisible","onScreen","io","entries","updateRunning","onVisibility","contextLost","onContextLost","clock","Clock","rafId","slowTimer","perfAcc","perfFrames","lastStats","schedule","frame","raw","animating","changed","lvl","cx","cz","cy","col","info","applyQuality","hasAmbient","should","hi","first","pitch","power","points","resolve","est","winnerId"],"sources":["../../src/games/tanks/scene/createTankScene.js"],"sourcesContent":["// Tanques de guerra 3D — three.js scene (three >=0.134 <0.138). Framework-agnostic.\n//\n// createTankScene(container, { quality, reducedMotion, onEvent }) → {\n// setWorld, setAim, setPreview, playTurn, setCameraMode, setQuality, celebrate,\n// resize, getStats, dispose\n// }\n// World units are meters: map size×size, x right, z depth, y up, terrain origin at (0,0).\n// Renders on demand: the rAF loop stops when nothing animates.\nimport {\n ACESFilmicToneMapping,\n Clock,\n DirectionalLight,\n DynamicDrawUsage,\n Fog,\n Group,\n HemisphereLight,\n InstancedMesh,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshStandardMaterial,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n Scene,\n sRGBEncoding,\n Vector3,\n WebGLRenderer,\n} from 'three'\nimport { createTerrain, createSky, createHills, SKY } from './terrain.js'\nimport { createDecor } from './decor.js'\nimport { createTank, createTankGeometries, createTankShared, WHEELS } from './tank.js'\nimport { createFx } from './fx.js'\nimport { blobTexture, clamp, dampK, DEG, lin, ringTexture, wrapPi } from './util.js'\n\nconst MAX_DT = 1 / 15\nconst MAX_TANKS = 4\nconst SAMPLE_DT = 0.04 // 2 ticks @ 50 Hz\nconst PIXEL_RATIO = { low: 1.25, medium: 1.5, high: 1.75 }\nconst SHADOW_SIZE = 2048\nconst SUN_DIR = new Vector3(0.62, 0.42, 0.66).normalize()\n\nexport function detectQuality() {\n if (typeof window === 'undefined') return 'low'\n const coarse = !!(window.matchMedia && window.matchMedia('(pointer: coarse)').matches)\n const small = Math.min(window.innerWidth || 0, window.innerHeight || 0) < 640\n const cores = (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) || 8\n if (coarse || small || cores <= 4) return 'low'\n return cores >= 8 ? 'high' : 'medium'\n}\n\nfunction pixelRatioFor(q) {\n const d = (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n return Math.min(d, PIXEL_RATIO[q] || 1.5)\n}\n\nconst normQ = (q) => (q === 'low' || q === 'medium' || q === 'high' ? q : null)\n\nexport function createTankScene(container, { quality = 'auto', reducedMotion = false, onEvent } = {}) {\n if (!container) throw new Error('createTankScene: container element required')\n const emit = (e) => {\n if (typeof onEvent === 'function') {\n try {\n onEvent(e)\n } catch (err) {\n // listener errors must never break the render loop\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n }\n\n let autoQuality = !normQ(quality)\n let currentQuality = normQ(quality) || detectQuality()\n let disposed = false\n\n // ------------------------------------------------------------------ renderer\n const renderer = new WebGLRenderer({\n antialias: !(currentQuality === 'low' && ((typeof window !== 'undefined' && window.devicePixelRatio) || 1) >= 2),\n alpha: false,\n stencil: false,\n powerPreference: 'high-performance',\n })\n renderer.outputEncoding = sRGBEncoding\n renderer.toneMapping = ACESFilmicToneMapping\n renderer.toneMappingExposure = 1.05\n renderer.shadowMap.enabled = true\n renderer.shadowMap.type = PCFSoftShadowMap\n renderer.shadowMap.autoUpdate = false\n renderer.setPixelRatio(pixelRatioFor(currentQuality))\n renderer.setClearColor(SKY.horizon, 1)\n const canvas = renderer.domElement\n canvas.style.display = 'block'\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n canvas.style.outline = 'none'\n container.appendChild(canvas)\n\n let width = Math.max(1, container.clientWidth)\n let height = Math.max(1, container.clientHeight)\n renderer.setSize(width, height, false)\n\n // ------------------------------------------------------------------ scene\n const scene = new Scene()\n scene.fog = new Fog(SKY.fog.clone(), 200, 700)\n const camera = new PerspectiveCamera(45, width / height, 0.5, 1400)\n const world = new Group()\n scene.add(world)\n\n const hemi = new HemisphereLight(lin('#ffd2b0'), lin('#33402f'), 0.6)\n const sun = new DirectionalLight(lin('#ffbe7a'), 1.9)\n sun.shadow.mapSize.set(SHADOW_SIZE, SHADOW_SIZE)\n sun.shadow.bias = -0.0006\n sun.shadow.normalBias = 0.04\n const sc = sun.shadow.camera\n sc.left = -120\n sc.right = 120\n sc.top = 120\n sc.bottom = -120\n sc.near = 20\n sc.far = 520\n sc.updateProjectionMatrix()\n scene.add(hemi, sun, sun.target)\n\n const sky = createSky(SUN_DIR)\n scene.add(sky.mesh)\n const hills = createHills(new Vector3(80, 0, 80), SUN_DIR)\n scene.add(hills.mesh)\n\n const terrain = createTerrain()\n world.add(terrain.mesh)\n const decor = createDecor()\n const fx = createFx(scene, { quality: currentQuality, reducedMotion, heightAt: terrain.heightAt })\n\n const tankGeos = createTankGeometries()\n const tankShared = createTankShared()\n const tanks = new Map() // id → tank\n const tankOrder = []\n\n // wheels for all tanks: one InstancedMesh\n let wheels = null\n function makeWheelMaterial() {\n return currentQuality === 'low'\n ? new MeshLambertMaterial({ vertexColors: true })\n : new MeshStandardMaterial({ vertexColors: true, roughness: 0.7, metalness: 0.25 })\n }\n function makeWheels() {\n tankShared.wheelMat = makeWheelMaterial()\n wheels = new InstancedMesh(tankGeos.wheel, tankShared.wheelMat, MAX_TANKS * WHEELS.length)\n wheels.instanceMatrix.setUsage(DynamicDrawUsage)\n wheels.frustumCulled = false\n wheels.count = 0\n world.add(wheels)\n }\n makeWheels()\n\n // blob shadows (medium/low)\n const blobTex = blobTexture(64)\n const blobGeo = new PlaneGeometry(1, 1)\n blobGeo.rotateX(-Math.PI / 2)\n const blobMat = new MeshBasicMaterial({\n map: blobTex,\n transparent: true,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n const blobs = new InstancedMesh(blobGeo, blobMat, MAX_TANKS)\n blobs.frustumCulled = false\n blobs.count = 0\n blobs.renderOrder = 2\n world.add(blobs)\n\n // active tank ring\n const activeTex = ringTexture(128)\n const activeMat = new MeshBasicMaterial({\n map: activeTex,\n transparent: true,\n depthWrite: false,\n opacity: 0.85,\n polygonOffset: true,\n polygonOffsetFactor: -3,\n polygonOffsetUnits: -3,\n })\n const activeRing = new Mesh(blobGeo, activeMat)\n activeRing.visible = false\n activeRing.renderOrder = 3\n world.add(activeRing)\n\n // ------------------------------------------------------------------ state\n let lastWorld = null\n let activeId = null\n let wind = { x: 0, z: 0 }\n let mapSize = 160\n let hasWorld = false\n let shadowDirty = true\n let wheelsDirty = true\n let aimDirty = false\n let wakeTime = 0 // keep rendering until elapsed > wakeTime\n let elapsed = 0\n let timeScale = 1\n let realDt = 0\n const turnQueue = []\n let currentTurn = null // { turn, gen, resolve, started, deadline }\n let celebrateState = null\n\n const mapCenter = new Vector3(80, 0, 80)\n const v1 = new Vector3()\n const v2 = new Vector3()\n const v3 = new Vector3()\n const mtx = new Matrix4()\n const scl = new Vector3()\n\n // ------------------------------------------------------------------ camera rig\n const cam = {\n mode: 'overview',\n userMode: 'overview',\n pos: new Vector3(80, 120, 260),\n target: new Vector3(80, 0, 80),\n dPos: new Vector3(),\n dTarget: new Vector3(),\n focus: new Vector3(),\n vel: new Vector3(1, 0, 0),\n tankId: null,\n orbit: 0,\n orbitSpeed: 0,\n radius: 25,\n lift: 10,\n rate: 2.5,\n shake: 0,\n snap: true,\n moving: true,\n }\n let portrait = false\n\n function updateFov() {\n const aspect = width / height\n portrait = aspect < 0.85\n camera.fov = portrait ? 62 : aspect < 1.25 ? 52 : 45\n camera.aspect = aspect\n camera.updateProjectionMatrix()\n }\n updateFov()\n\n function setCam(mode, opts = {}) {\n cam.mode = mode\n if (opts.tankId !== undefined) cam.tankId = opts.tankId\n if (opts.focus) cam.focus.copy(opts.focus)\n if (opts.orbitFromCurrent) {\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n }\n if (reducedMotion || opts.cut) cam.snap = true\n cam.moving = true\n }\n\n function frameOverview() {\n let n = 0\n v1.set(0, 0, 0)\n let ax = 0, az = 0, bx = 0, bz = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n if (!t) continue\n const s = t.state\n if (n === 0) { ax = s.x; az = s.z } else { bx = s.x; bz = s.z }\n v1.x += s.x\n v1.y += s.y\n v1.z += s.z\n n++\n }\n if (n === 0) {\n v1.copy(mapCenter)\n v1.y = terrain.ready ? terrain.heightAt(mapCenter.x, mapCenter.z) : 0\n bx = ax + 1\n bz = az\n } else v1.multiplyScalar(1 / n)\n if (n < 2) {\n bx = ax + 1\n bz = az\n }\n const dx = bx - ax\n const dz = bz - az\n const span = n >= 2 ? Math.hypot(dx, dz) : 30\n const fovV = (camera.fov * DEG) / 2\n if (portrait && n >= 2) {\n // tall screens: look along the line between tanks, active tank nearest\n let ux = dx / span, uz = dz / span\n let nx = ax, ny = 0, nz = az\n const act = activeId != null ? tanks.get(activeId) : null\n if (act && act.state.x === bx && act.state.z === bz) {\n ux = -ux\n uz = -uz\n nx = bx\n nz = bz\n }\n ny = terrain.ready ? terrain.heightAt(nx, nz) : v1.y\n // slight sideways offset so the tanks don't line up with the view axis\n const sx = -uz, sz = ux\n const B = clamp(span * 0.3, 16, 70)\n const H = span * 0.3 + 8\n const S = span * 0.1\n cam.dPos.set(nx - ux * B + sx * S, ny + H, nz - uz * B + sz * S)\n cam.dTarget.set(nx + ux * span * 0.42, ny + 1, nz + uz * span * 0.42)\n cam.rate = 2.2\n return\n }\n let px = -dz, pz = dx\n const pl = Math.hypot(px, pz) || 1\n px /= pl\n pz /= pl\n if (pz < 0) { px = -px; pz = -pz }\n const el = portrait ? 0.78 : 0.52\n const halfH = Math.atan(Math.tan(fovV) * camera.aspect)\n const need = span / 2 + 14\n let d = need / Math.tan(halfH)\n d = Math.max(d, 26 / Math.tan(fovV))\n d = clamp(d * 1.05, 38, 260)\n cam.dTarget.set(v1.x, v1.y + 2, v1.z)\n cam.dPos.set(\n v1.x + px * Math.cos(el) * d,\n v1.y + Math.sin(el) * d,\n v1.z + pz * Math.cos(el) * d,\n )\n cam.rate = 2.2\n }\n\n function frameBehind(t, useHull) {\n const s = t.state\n const yaw = (useHull ? s.hullYaw : s.yaw) * DEG\n const dx = Math.cos(yaw)\n const dz = Math.sin(yaw)\n const rx = -dz\n const rz = dx\n const back = portrait ? 24 : 20\n const side = portrait ? 2 : 4.5\n cam.dPos.set(s.x - dx * back + rx * side, s.y + (portrait ? 10 : 8.5), s.z - dz * back + rz * side)\n const pitchLift = clamp(Math.tan(clamp(s.pitch, 0, 70) * DEG) * 4, 0, 10)\n cam.dTarget.set(s.x + dx * 40, s.y + 1 + pitchLift, s.z + dz * 40)\n cam.rate = useHull ? 3 : 4.5\n }\n\n function frameFollow() {\n const vx = cam.vel.x, vz = cam.vel.z\n const hl = Math.hypot(vx, vz) || 1\n const hx = vx / hl, hz = vz / hl\n cam.dPos.set(cam.focus.x - hx * 18 - hz * 4, cam.focus.y + 6, cam.focus.z - hz * 18 + hx * 4)\n cam.dTarget.set(cam.focus.x + cam.vel.x * 0.35, cam.focus.y + cam.vel.y * 0.2, cam.focus.z + cam.vel.z * 0.35)\n cam.rate = 4.5\n }\n\n function frameOrbit(dt) {\n cam.orbit += cam.orbitSpeed * dt * (reducedMotion ? 0 : 1)\n cam.dPos.set(\n cam.focus.x + Math.cos(cam.orbit) * cam.radius,\n cam.focus.y + cam.lift,\n cam.focus.z + Math.sin(cam.orbit) * cam.radius,\n )\n cam.dTarget.set(cam.focus.x, cam.focus.y + (cam.mode === 'celebrate' ? 4 : 1.5), cam.focus.z)\n }\n\n function updateCamera(dt) {\n const t = cam.tankId != null ? tanks.get(cam.tankId) : null\n switch (cam.mode) {\n case 'aim':\n if (t) frameBehind(t, false)\n else frameOverview()\n break\n case 'drive':\n if (t) frameBehind(t, true)\n else frameOverview()\n break\n case 'follow':\n frameFollow()\n break\n case 'impact':\n cam.radius = 30\n cam.lift = 12\n cam.orbitSpeed = 0.22\n cam.rate = 2.4\n frameOrbit(dt)\n break\n case 'killcam':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = 17\n cam.lift = 6.5\n cam.orbitSpeed = 0.32\n cam.rate = 2\n frameOrbit(dt)\n break\n case 'celebrate':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = portrait ? 24 : 19\n cam.lift = 4.5\n cam.orbitSpeed = 0.38\n cam.rate = 1.8\n frameOrbit(dt)\n break\n default:\n frameOverview()\n }\n // keep the camera above terrain\n if (terrain.ready) {\n const g = terrain.heightAt(cam.dPos.x, cam.dPos.z) + 3\n if (cam.dPos.y < g) cam.dPos.y = g\n }\n let moving\n if (cam.snap) {\n cam.pos.copy(cam.dPos)\n cam.target.copy(cam.dTarget)\n cam.snap = false\n moving = true\n } else {\n const k = dampK(cam.rate, dt)\n cam.pos.lerp(cam.dPos, k)\n cam.target.lerp(cam.dTarget, k)\n moving = cam.pos.distanceToSquared(cam.dPos) > 0.0025 || cam.target.distanceToSquared(cam.dTarget) > 0.0025\n }\n if (terrain.ready) {\n const g = terrain.heightAt(cam.pos.x, cam.pos.z) + 2\n if (cam.pos.y < g) cam.pos.y = g\n }\n camera.position.copy(cam.pos)\n if (cam.shake > 0.001 && !reducedMotion) {\n const s = cam.shake\n camera.position.x += (Math.random() - 0.5) * s\n camera.position.y += (Math.random() - 0.5) * s\n camera.position.z += (Math.random() - 0.5) * s\n cam.shake *= Math.exp(-6 * dt)\n moving = true\n } else cam.shake = 0\n camera.lookAt(cam.target)\n // fog follows framing distance\n const dist = cam.pos.distanceTo(cam.target)\n scene.fog.near = dist * 1.1 + 20\n scene.fog.far = dist * 3.2 + 260\n cam.moving = moving || cam.mode === 'impact' || cam.mode === 'killcam' || (cam.mode === 'celebrate' && !!celebrateState)\n return cam.moving\n }\n\n // ------------------------------------------------------------------ tanks\n function tankColorFor(wt, index) {\n if (wt.color === 'red' || wt.color === 'green') return wt.color\n return index === 0 ? 'green' : 'red'\n }\n\n function ensureTank(wt, index) {\n let t = tanks.get(wt.id)\n if (t) return t\n t = createTank(tankGeos, tankShared, { id: wt.id, color: tankColorFor(wt, index), quality: currentQuality })\n t.setShadows(currentQuality === 'high')\n world.add(t.root)\n tanks.set(wt.id, t)\n tankOrder.push(wt.id)\n return t\n }\n\n function removeTank(id) {\n const t = tanks.get(id)\n if (!t) return\n if (t.state.blown) t.turret.removeFromParent()\n t.dispose()\n tanks.delete(id)\n const i = tankOrder.indexOf(id)\n if (i >= 0) tankOrder.splice(i, 1)\n }\n\n function restoreTurret(t) {\n if (!t.state.blown) return\n t.state.blown = null\n t.body.add(t.turret)\n t.turret.position.set(-0.35, 1.6, 0)\n t.turret.rotation.set(0, 0, 0)\n t.turret.scale.setScalar(1)\n }\n\n // Wreck turret resting beside the hull (used when a dead tank appears without animation).\n function placeWreckTurret(t) {\n const s = t.state\n if (s.blown) return\n t.place(terrain)\n world.attach(t.turret)\n const a = (s.hullYaw + 120) * DEG\n const x = s.x + Math.cos(a) * 4.5\n const z = s.z + Math.sin(a) * 4.5\n t.turret.position.set(x, terrain.heightAt(x, z) + 0.2, z)\n t.turret.rotation.set(0.5, a, 2.6)\n s.blown = { p: t.turret.position.clone(), v: new Vector3(), w: new Vector3(), landed: true }\n }\n\n function blowTurret(t) {\n const s = t.state\n if (s.blown) return\n world.attach(t.turret)\n const a = Math.random() * Math.PI * 2\n s.blown = {\n p: t.turret.position.clone(),\n v: new Vector3(Math.cos(a) * 3.5, 15, Math.sin(a) * 3.5),\n w: new Vector3((Math.random() - 0.5) * 6, (Math.random() - 0.5) * 5, (Math.random() - 0.5) * 6),\n landed: false,\n }\n }\n\n function updateBlown(t, dt) {\n const b = t.state.blown\n if (!b || b.landed) return false\n b.v.y -= 20 * dt\n b.p.addScaledVector(b.v, dt)\n t.turret.rotation.x += b.w.x * dt\n t.turret.rotation.y += b.w.y * dt\n t.turret.rotation.z += b.w.z * dt\n const g = terrain.heightAt(b.p.x, b.p.z) + 0.25\n if (b.p.y < g && b.v.y < 0) {\n b.p.y = g\n if (b.v.y < -5) {\n b.v.y *= -0.25\n b.v.x *= 0.5\n b.v.z *= 0.5\n b.w.multiplyScalar(0.4)\n fx.dust(b.p.x, g, b.p.z, 2)\n fx.dust(b.p.x, g, b.p.z, 2)\n } else {\n b.landed = true\n // settle roughly upside-down / on its side\n t.turret.rotation.x = Math.round(t.turret.rotation.x / Math.PI) * Math.PI + 0.25\n t.turret.rotation.z = Math.round(t.turret.rotation.z / Math.PI) * Math.PI + 0.2\n }\n }\n t.turret.position.copy(b.p)\n shadowDirty = true\n return true\n }\n\n function syncTankStatics() {\n // wheels + blobs + active ring\n let k = 0\n let bi = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n t.writeWheels(wheels, k)\n k += WHEELS.length\n const s = t.state\n v1.set(s.x, s.y + 0.08, s.z)\n scl.set(7.2, 1, 5.2)\n mtx.compose(v1, t.body.quaternion, scl)\n blobs.setMatrixAt(bi++, mtx)\n }\n wheels.count = k\n wheels.instanceMatrix.needsUpdate = true\n blobs.count = currentQuality === 'high' ? 0 : bi\n blobs.instanceMatrix.needsUpdate = true\n const at = activeId != null ? tanks.get(activeId) : null\n if (at && at.state.alive && !currentTurn && !celebrateState) {\n activeRing.visible = true\n activeRing.position.set(at.state.x, at.state.y + 0.12, at.state.z)\n activeRing.quaternion.copy(at.body.quaternion)\n activeRing.scale.set(9, 1, 9)\n activeMat.color.copy(at.team.accent).multiplyScalar(1.4)\n } else activeRing.visible = false\n wheelsDirty = false\n }\n\n function damageLevel(t) {\n const s = t.state\n if (!s.alive) return 2\n return s.hp / Math.max(1, s.maxHp) <= 0.5 ? 1 : 0\n }\n\n // ------------------------------------------------------------------ world\n function applyWorld(w, { fromTurn = false } = {}) {\n if (!w || disposed) return\n lastWorld = w\n hasWorld = true\n mapSize = w.size || 160\n mapCenter.set(mapSize / 2, 0, mapSize / 2)\n const res = terrain.setHeights(w)\n if (res !== 'same') {\n shadowDirty = true\n const sunTarget = mapCenter\n sun.target.position.copy(sunTarget)\n sun.position.copy(sunTarget).addScaledVector(SUN_DIR, 260)\n sun.target.updateMatrixWorld()\n }\n if (decor.build(world, w, terrain)) shadowDirty = true\n else if (res !== 'same') decor.reground(terrain)\n decor.setShadows(currentQuality === 'high')\n\n const list = Array.isArray(w.tanks) ? w.tanks : []\n const seen = new Set()\n list.forEach((wt, i) => {\n if (!wt || wt.id == null) return\n seen.add(wt.id)\n const t = ensureTank(wt, i)\n const s = t.state\n s.x = +wt.x || 0\n s.z = +wt.z || 0\n s.y = Number.isFinite(wt.y) ? wt.y : terrain.heightAt(s.x, s.z)\n s.hullYaw = +wt.hullYaw || 0\n const keepAim = !fromTurn && wt.id === w.activeId && s.targetYaw != null\n if (!keepAim) {\n s.yaw = Number.isFinite(wt.yaw) ? wt.yaw : s.hullYaw\n s.pitch = Number.isFinite(wt.pitch) ? wt.pitch : 10\n s.targetYaw = null\n s.targetPitch = null\n }\n s.hp = Number.isFinite(wt.hp) ? wt.hp : 100\n s.maxHp = Math.max(100, s.maxHp, s.hp)\n const alive = wt.alive !== undefined ? !!wt.alive : s.hp > 0\n if (alive && !s.alive) {\n restoreTurret(t)\n t.setCharred(false)\n }\n s.alive = alive\n if (!alive) {\n t.setCharred(true)\n if (!s.blown) placeWreckTurret(t)\n }\n t.place(terrain)\n })\n for (const id of Array.from(tanks.keys())) if (!seen.has(id)) removeTank(id)\n activeId = w.activeId != null ? w.activeId : w.turnPlayerId != null ? w.turnPlayerId : activeId\n wind = w.wind || wind\n fx.setWind(wind)\n wheelsDirty = true\n shadowDirty = true\n if (!currentTurn && !celebrateState) {\n cam.tankId = activeId\n if (cam.mode !== cam.userMode) setCam(cam.userMode)\n }\n }\n\n // ------------------------------------------------------------------ turns\n function* wait(sec) {\n let t = 0\n while (t < sec) t += yield\n }\n function* waitReal(sec) {\n let t = 0\n while (t < sec) {\n yield\n t += realDt\n }\n }\n\n function samplePos(samples, u, out) {\n const n = (samples.length / 3) | 0\n if (n === 0) return out.set(0, 0, 0)\n if (u <= 0) return out.set(samples[0], samples[1], samples[2])\n if (u >= n - 1) return out.set(samples[(n - 1) * 3], samples[(n - 1) * 3 + 1], samples[(n - 1) * 3 + 2])\n const i = Math.floor(u)\n const f = u - i\n const a = i * 3\n return out.set(\n samples[a] + (samples[a + 3] - samples[a]) * f,\n samples[a + 1] + (samples[a + 4] - samples[a + 1]) * f,\n samples[a + 2] + (samples[a + 5] - samples[a + 2]) * f,\n )\n }\n\n function* turnScript(turn) {\n const tank = tanks.get(turn.tankId)\n const speedK = reducedMotion ? 2 : 1\n if (tank) {\n tank.state.targetYaw = null\n tank.state.targetPitch = null\n }\n activeRing.visible = false\n fx.setPreview(null)\n\n // ---------------- drive\n const path = Array.isArray(turn.movePath) ? turn.movePath.filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z)) : []\n let total = 0\n const seg = []\n for (let i = 1; i < path.length; i++) {\n const L = Math.hypot(path[i].x - path[i - 1].x, path[i].z - path[i - 1].z)\n seg.push(L)\n total += L\n }\n if (tank && tank.state.alive && total > 0.05) {\n const s = tank.state\n setCam('drive', { tankId: tank.id })\n emit({ type: 'engine_start', tankId: tank.id })\n yield* wait(reducedMotion ? 0.05 : 0.35)\n emit({ type: 'move_start', tankId: tank.id })\n const speed = 5 * speedK\n let d = 0\n let dustAcc = 0\n const fwdX = Math.cos(s.hullYaw * DEG)\n const fwdZ = Math.sin(s.hullYaw * DEG)\n while (d < total) {\n const dt = yield\n const prevX = s.x, prevZ = s.z\n d = Math.min(total, d + speed * dt)\n // locate on path\n let acc = 0\n let i = 0\n while (i < seg.length - 1 && acc + seg[i] < d) acc += seg[i++]\n const f = seg[i] > 0 ? (d - acc) / seg[i] : 1\n const a = path[i], b = path[i + 1]\n s.x = a.x + (b.x - a.x) * f\n s.z = a.z + (b.z - a.z) * f\n const ay = Number.isFinite(a.y) ? a.y : terrain.heightAt(a.x, a.z)\n const by = Number.isFinite(b.y) ? b.y : terrain.heightAt(b.x, b.z)\n s.y = ay + (by - ay) * f\n const mx = s.x - prevX, mz = s.z - prevZ\n const step = Math.hypot(mx, mz)\n if (step > 1e-5) {\n const dot = (mx * fwdX + mz * fwdZ) / step\n if (Math.abs(dot) < 0.9) {\n // path bends: steer the hull toward travel direction\n const head = Math.atan2(mz, mx) / DEG\n const tgt = dot >= 0 ? head : head + 180\n const diff = wrapPi((tgt - s.hullYaw) * DEG) / DEG\n const turnD = diff * dampK(6, dt)\n s.hullYaw += turnD\n s.yaw += turnD\n }\n tank.scrollTracks(dot >= 0 ? step : -step)\n dustAcc += step\n }\n tank.place(terrain, dt)\n while (dustAcc > 0.7) {\n dustAcc -= 0.7\n tank.localToWorld(v2, -2.6, 0.2, 1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -2.6, 0.2, -1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -3.3, 1.3, 0.9)\n fx.exhaust(v2.x, v2.y, v2.z)\n }\n wheelsDirty = true\n shadowDirty = true\n }\n emit({ type: 'move_end', tankId: tank.id })\n }\n\n // ---------------- turret\n if (tank && tank.state.alive) {\n const s = tank.state\n const ty = Number.isFinite(turn.yaw) ? turn.yaw : s.yaw\n const tp = Number.isFinite(turn.pitch) ? turn.pitch : s.pitch\n const dy = wrapPi((ty - s.yaw) * DEG) / DEG\n const dp = tp - s.pitch\n if (cam.mode !== 'drive' && !reducedMotion) setCam('aim', { tankId: tank.id })\n else if (cam.mode === 'drive') setCam('aim', { tankId: tank.id })\n if (Math.abs(dy) > 0.5 || Math.abs(dp) > 0.5) {\n emit({ type: 'turret_start', tankId: tank.id })\n const rate = 90 * speedK\n const dur = Math.max(0.25, Math.max(Math.abs(dy), Math.abs(dp)) / rate)\n const y0 = s.yaw, p0 = s.pitch\n let t = 0\n while (t < dur) {\n t += yield\n const k = Math.min(1, t / dur)\n const e = k * k * (3 - 2 * k)\n s.yaw = y0 + dy * e\n s.pitch = p0 + dp * e\n tank.place(terrain)\n shadowDirty = true\n }\n emit({ type: 'turret_end', tankId: tank.id })\n }\n s.yaw = ty\n s.pitch = tp\n tank.place(terrain)\n yield* wait(reducedMotion ? 0.05 : 0.2)\n }\n\n // ---------------- shots\n const shots = Array.isArray(turn.shots) ? turn.shots.slice(0, 8) : []\n const craters = Array.isArray(turn.craters) ? turn.craters.map((c) => ({ ...c, used: false })) : []\n const damage = turn.damage || {}\n const flashed = new Set()\n const recs = shots.map((sh, i) => {\n const samples = sh && sh.samples && sh.samples.length >= 3 ? sh.samples : null\n const n = samples ? (samples.length / 3) | 0 : 0\n return {\n shot: sh,\n samples,\n n,\n start: (Number.isFinite(sh && sh.startMs) ? sh.startMs / 1000 : 0) / speedK,\n dur: (Math.max(1, n - 1) * SAMPLE_DT) / speedK,\n role: (sh && sh.role) || 'main',\n slot: i,\n started: false,\n done: !samples,\n offset: new Vector3(),\n }\n })\n let fired = false\n let lastImpact = null\n const carrier = recs.find((r) => r.role === 'carrier' && !r.done) || null\n if (recs.length) {\n let t = 0\n let remaining = recs.filter((r) => !r.done).length\n const firstStart = Math.min(...recs.map((r) => r.start))\n while (remaining > 0 && t < 30) {\n // fire moment\n if (!fired && tank) {\n fired = true\n tank.muzzleWorld(v2)\n tank.gunDirWorld(v3)\n fx.muzzle(v2, v3)\n tank.state.recoil = 1\n cam.shake = 0.6\n emit({ type: 'fire', tankId: tank.id })\n }\n let fx0 = 0, fy0 = 0, fz0 = 0, vx = 0, vy = 0, vz = 0, active = 0\n for (const r of recs) {\n if (r.done) continue\n const lt = t - r.start\n if (lt < 0) continue\n if (!r.started && r.role === 'bomblet' && carrier && !carrier.done) continue\n if (!r.started) {\n r.started = true\n samplePos(r.samples, 0, v1)\n if (tank && (r.role === 'main' || r.role === 'carrier') && r.start <= firstStart + 1e-6) {\n tank.muzzleWorld(v2)\n r.offset.copy(v2).sub(v1)\n }\n fx.projShow(r.slot, v1.x + r.offset.x, v1.y + r.offset.y, v1.z + r.offset.z, (r.shot.radius || 0) >= 7)\n emit({ type: 'projectile_start', tankId: turn.tankId, role: r.role })\n }\n const u = lt / SAMPLE_DT * speedK\n if (lt >= r.dur) {\n // impact\n r.done = true\n remaining--\n fx.projHide(r.slot)\n lastImpact = impactShot(r, craters, damage, flashed) || lastImpact\n continue\n }\n samplePos(r.samples, u, v1)\n const w = Math.max(0, 1 - u / 5)\n v1.addScaledVector(r.offset, w)\n fx.projMove(r.slot, v1.x, v1.y, v1.z)\n samplePos(r.samples, u + 1, v3)\n fx0 += v1.x; fy0 += v1.y; fz0 += v1.z\n vx += (v3.x - v1.x) / SAMPLE_DT\n vy += (v3.y - v1.y) / SAMPLE_DT\n vz += (v3.z - v1.z) / SAMPLE_DT\n active++\n }\n if (active > 0) {\n cam.focus.set(fx0 / active, fy0 / active, fz0 / active)\n if (Math.hypot(vx, vz) > 0.1) cam.vel.set(vx / active, vy / active, vz / active)\n if (cam.mode !== 'follow' && !reducedMotion) setCam('follow')\n if (reducedMotion && cam.mode !== 'overview') setCam('overview', { cut: true })\n } else if (lastImpact && cam.mode === 'follow') {\n setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n }\n t += yield\n }\n }\n\n // leftover craters (no matching impact)\n for (const c of craters) {\n if (c.used) continue\n terrain.crater(c.x, c.z, c.radius || 4, c.depth || 1)\n decor.blast(terrain, c.x, c.z, c.radius || 4)\n shadowDirty = true\n }\n // splash damage flashes\n for (const id of Object.keys(damage)) {\n if (damage[id] > 0 && !flashed.has(id)) {\n const t = tanks.get(id)\n if (t) t.state.hitFlash = 1\n }\n }\n\n if (lastImpact) {\n if (!reducedMotion && cam.mode !== 'impact') setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n if (reducedMotion) setCam('overview', { cut: true })\n yield* wait(reducedMotion ? 0.5 : 1.3)\n } else {\n yield* wait(0.4)\n }\n\n // ---------------- destruction\n const destroyed = Array.isArray(turn.destroyed) ? turn.destroyed : []\n for (const id of destroyed) {\n const t = tanks.get(id)\n if (!t || (!t.state.alive && t.state.charred)) continue\n if (!reducedMotion) {\n setCam('killcam', { tankId: id, focus: v1.set(t.state.x, t.state.y, t.state.z), orbitFromCurrent: true })\n timeScale = 0.35\n yield* waitReal(0.35)\n }\n t.state.alive = false\n t.setCharred(true)\n blowTurret(t)\n fx.bigExplosion(t.state.x, t.state.y + 1, t.state.z)\n cam.shake = 1.6\n shadowDirty = true\n emit({ type: 'destroyed', tankId: id })\n emit({ type: 'big_explosion', tankId: id })\n yield* waitReal(reducedMotion ? 0.6 : 1.5)\n timeScale = 1\n yield* wait(reducedMotion ? 0.3 : 1.0)\n }\n timeScale = 1\n }\n\n function impactShot(r, craters, damage, flashed) {\n const imp = r.shot.impact || {}\n const n = r.n\n const x = Number.isFinite(imp.x) ? imp.x : r.samples[(n - 1) * 3]\n const y = Number.isFinite(imp.y) ? imp.y : r.samples[(n - 1) * 3 + 1]\n const z = Number.isFinite(imp.z) ? imp.z : r.samples[(n - 1) * 3 + 2]\n const kind = imp.kind || 'terrain'\n emit({ type: 'impact', kind, tankId: imp.tankId, role: r.role })\n if (kind === 'split') {\n fx.pop(x, y, z)\n return null\n }\n if (kind === 'out') {\n fx.outPuff(x, y, z)\n return null\n }\n const radius = r.shot.radius || 5\n fx.explosion(x, y, z, radius, kind)\n cam.shake = Math.max(cam.shake, radius >= 7 ? 1.4 : 0.9)\n if (radius >= 7) emit({ type: 'big_explosion' })\n // nearest crater\n let best = null\n let bd = Infinity\n for (const c of craters) {\n if (c.used) continue\n const d = Math.hypot(c.x - x, c.z - z)\n if (d < bd) {\n bd = d\n best = c\n }\n }\n if (best && bd < Math.max(3, radius * 1.5)) {\n best.used = true\n terrain.crater(best.x, best.z, best.radius || radius, best.depth || 0.8)\n }\n decor.blast(terrain, x, z, radius)\n shadowDirty = true\n if (kind === 'tank' && imp.tankId != null) {\n const t = tanks.get(imp.tankId)\n if (t) {\n t.state.hitFlash = 1\n fx.hitSparks(x, y, z)\n flashed.add(String(imp.tankId))\n }\n emit({ type: 'tank_hit', tankId: imp.tankId })\n }\n // splash flashes for tanks within radius\n for (const id of Object.keys(damage)) {\n if (!(damage[id] > 0) || flashed.has(id)) continue\n const t = tanks.get(id)\n if (t && Math.hypot(t.state.x - x, t.state.z - z) < radius * 1.3) {\n t.state.hitFlash = 1\n flashed.add(id)\n emit({ type: 'tank_hit', tankId: id })\n }\n }\n return new Vector3(x, y, z)\n }\n\n function startNextTurn() {\n if (currentTurn || !turnQueue.length) return\n const rec = turnQueue.shift()\n if (disposed || !running || !hasWorld) {\n finishTurn(rec)\n startNextTurn()\n return\n }\n rec.gen = turnScript(rec.turn)\n rec.realT = 0\n currentTurn = rec\n rec.gen.next(0)\n wake()\n }\n\n function finishTurn(rec) {\n if (rec.finished) return\n rec.finished = true\n if (rec.timer) clearTimeout(rec.timer)\n if (currentTurn === rec) currentTurn = null\n timeScale = 1\n for (let i = 0; i < 8; i++) fx.projHide(i)\n if (!disposed) {\n try {\n const w = rec.turn && rec.turn.world\n if (w) applyWorld(w, { fromTurn: true })\n setCam(cam.userMode, { tankId: activeId })\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n rec.resolve()\n }\n\n function flushTurns() {\n if (currentTurn) finishTurn(currentTurn)\n while (turnQueue.length) finishTurn(turnQueue.shift())\n }\n\n // ------------------------------------------------------------------ resize / visibility\n function resize() {\n if (disposed) return\n const w = container.clientWidth\n const h = container.clientHeight\n if (!w || !h) return\n width = w\n height = h\n renderer.setSize(w, h, false)\n updateFov()\n wake(0.3)\n }\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(resize) : null\n if (ro) ro.observe(container)\n else window.addEventListener('resize', resize)\n\n let docVisible = typeof document === 'undefined' ? true : !document.hidden\n let onScreen = true\n let running = docVisible\n const io =\n typeof IntersectionObserver !== 'undefined'\n ? new IntersectionObserver((entries) => {\n onScreen = entries[entries.length - 1].isIntersecting\n updateRunning()\n })\n : null\n if (io) io.observe(container)\n const onVisibility = () => {\n docVisible = !document.hidden\n updateRunning()\n }\n document.addEventListener('visibilitychange', onVisibility)\n\n let contextLost = false\n const onContextLost = (e) => {\n if (e && e.preventDefault) e.preventDefault()\n contextLost = true\n updateRunning()\n emit({ type: 'context_lost' })\n }\n canvas.addEventListener('webglcontextlost', onContextLost)\n\n // ------------------------------------------------------------------ loop\n const clock = new Clock(false)\n let rafId = 0\n let slowTimer = 0\n let perfAcc = 0\n let perfFrames = 0\n let lastStats = { calls: 0, triangles: 0, particles: 0, quality: currentQuality, fps: 0 }\n\n function wake(sec = 0.05) {\n if (disposed) return\n wakeTime = Math.max(wakeTime, elapsed + sec)\n schedule()\n }\n function schedule() {\n if (disposed || !running || rafId) return\n if (slowTimer) {\n clearTimeout(slowTimer)\n slowTimer = 0\n }\n if (!clock.running) {\n clock.start()\n }\n rafId = requestAnimationFrame(frame)\n }\n\n function frame() {\n rafId = 0\n if (disposed || !running) return\n const raw = clock.getDelta()\n realDt = Math.min(raw, MAX_DT)\n const dt = realDt * timeScale\n elapsed += realDt\n let animating = elapsed < wakeTime\n\n // turn script\n if (currentTurn) {\n animating = true\n currentTurn.realT += realDt\n let res\n try {\n res = currentTurn.gen.next(dt)\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n res = { done: true }\n }\n if (res.done || currentTurn.realT > currentTurn.deadline) finishTurn(currentTurn)\n if (!currentTurn) startNextTurn()\n }\n\n // tanks: aim smoothing, recoil, hit flash, damage smoke, blown turrets\n for (const id of tankOrder) {\n const t = tanks.get(id)\n const s = t.state\n let changed = false\n if (s.targetYaw != null && !currentTurn) {\n const dy = wrapPi((s.targetYaw - s.yaw) * DEG) / DEG\n const dp = s.targetPitch - s.pitch\n if (Math.abs(dy) > 0.02 || Math.abs(dp) > 0.02) {\n const k = reducedMotion ? 1 : dampK(14, realDt)\n s.yaw += dy * k\n s.pitch += dp * k\n changed = true\n animating = true\n } else if (aimDirty) {\n s.yaw = s.targetYaw\n s.pitch = s.targetPitch\n changed = true\n }\n }\n if (s.recoil > 0) {\n s.recoil = Math.max(0, s.recoil - dt * 2.2)\n changed = true\n animating = true\n }\n if (s.hitFlash > 0) {\n s.hitFlash = Math.max(0, s.hitFlash - dt * 2.5)\n t.setFlash(s.hitFlash * s.hitFlash * 1.5)\n animating = true\n }\n if (updateBlown(t, dt)) animating = true\n if (changed) {\n t.place(terrain)\n shadowDirty = true\n }\n const lvl = damageLevel(t)\n if (lvl > 0) {\n if (s.blown && lvl >= 2) v1.set(s.x, s.y + 1.4, s.z)\n else t.localToWorld(v1, lvl >= 2 ? -0.5 : -1.8, 1.8, 0)\n fx.emitDamage(v1.x, v1.y, v1.z, dt, lvl, s)\n }\n }\n aimDirty = false\n\n // celebration\n if (celebrateState) {\n const c = celebrateState\n c.t += realDt\n c.next -= realDt\n animating = true\n if (c.next <= 0 && c.t < 5.5) {\n c.next = 0.55\n const t = c.id != null ? tanks.get(c.id) : null\n const cx = t ? t.state.x : mapCenter.x\n const cz = t ? t.state.z : mapCenter.z\n const cy = t ? t.state.y : terrain.heightAt(cx, cz)\n const col = t ? t.team.accent : lin('#ffd36b')\n fx.firework(cx + (Math.random() - 0.5) * 10, cy + 9 + Math.random() * 3, cz + (Math.random() - 0.5) * 10, col)\n }\n if (c.t > 9) {\n celebrateState = null\n }\n }\n\n if (wheelsDirty) syncTankStatics()\n if (fx.update(dt, camera, renderer, animating || !!currentTurn)) animating = true\n if (updateCamera(realDt)) animating = true\n if (fx.hasPreview && cam.mode === 'aim') animating = animating || elapsed < wakeTime\n\n if (shadowDirty && currentQuality === 'high') {\n renderer.shadowMap.needsUpdate = true\n }\n shadowDirty = false\n renderer.render(scene, camera)\n const info = renderer.info.render\n lastStats = {\n calls: info.calls,\n triangles: info.triangles,\n particles: fx.particleCount,\n quality: currentQuality,\n fps: raw > 0 ? Math.round(1 / raw) : 0,\n }\n\n // auto quality: downgrade one tier if animation can't hold ~38 fps\n if (autoQuality && animating && currentQuality !== 'low' && elapsed > 2) {\n perfAcc += Math.min(raw, 0.25)\n perfFrames++\n if (perfFrames >= 90) {\n if (perfAcc / perfFrames > 1 / 38) applyQuality(currentQuality === 'high' ? 'medium' : 'low')\n perfAcc = 0\n perfFrames = 0\n }\n }\n\n if (animating) schedule()\n else if (hasAmbient()) {\n // ambient smoke: throttled ~24 fps\n slowTimer = setTimeout(() => {\n slowTimer = 0\n schedule()\n }, 40)\n } else {\n clock.stop()\n }\n }\n\n function hasAmbient() {\n for (const id of tankOrder) if (damageLevel(tanks.get(id)) > 0) return true\n return fx.particleCount > 0\n }\n\n function updateRunning() {\n const should = !disposed && !contextLost && docVisible && onScreen\n if (should === running) {\n if (should) schedule()\n return\n }\n running = should\n if (should) {\n clock.stop()\n wake(0.1)\n } else {\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n slowTimer = 0\n clock.stop()\n flushTurns() // never leave awaited turns hanging while paused\n }\n }\n\n function applyQuality(q) {\n if (q === currentQuality) return\n currentQuality = q\n renderer.setPixelRatio(pixelRatioFor(q))\n renderer.setSize(width, height, false)\n const hi = q === 'high'\n sun.castShadow = hi\n decor.setQuality(q, world)\n decor.setShadows(hi)\n terrain.mesh.receiveShadow = hi\n for (const t of tanks.values()) {\n t.setQuality(q)\n t.setShadows(hi)\n }\n if (tankShared.wheelMat) {\n tankShared.wheelMat.dispose()\n tankShared.wheelMat = makeWheelMaterial()\n wheels.material = tankShared.wheelMat\n }\n wheels.castShadow = hi\n fx.setQuality(q)\n sun.intensity = q === 'low' ? 1.7 : 1.9\n hemi.intensity = q === 'low' ? 0.55 : 0.6\n wheelsDirty = true\n shadowDirty = true\n wake(0.1)\n }\n // initial quality wiring (applyQuality skips when equal)\n {\n const q = currentQuality\n currentQuality = null\n applyQuality(q)\n }\n\n // ------------------------------------------------------------------ public API\n return {\n setWorld(w) {\n if (disposed || !w) return\n if (currentTurn) {\n // authoritative end state arrives with the turn; keep the latest for afterwards\n if (currentTurn.turn) currentTurn.turn.world = currentTurn.turn.world || w\n return\n }\n const first = !hasWorld\n applyWorld(w)\n if (first) {\n frameOverview()\n if (reducedMotion) cam.snap = true\n else {\n cam.pos.copy(cam.dPos).sub(cam.dTarget).multiplyScalar(1.7).add(cam.dTarget)\n cam.pos.y += 40\n cam.target.copy(cam.dTarget)\n }\n }\n wake(0.2)\n },\n\n setAim({ yaw, pitch, power } = {}) {\n if (disposed || currentTurn) return\n const t = activeId != null ? tanks.get(activeId) : null\n if (!t || !t.state.alive) return\n if (Number.isFinite(yaw)) t.state.targetYaw = yaw\n else if (t.state.targetYaw == null) t.state.targetYaw = t.state.yaw\n if (Number.isFinite(pitch)) t.state.targetPitch = pitch\n else if (t.state.targetPitch == null) t.state.targetPitch = t.state.pitch\n t.state.power = power\n aimDirty = true\n wake(0.6)\n },\n\n setPreview(points) {\n if (disposed) return\n fx.setPreview(points && points.length ? points : null)\n wake(1.5)\n },\n\n playTurn(turn) {\n return new Promise((resolve) => {\n if (disposed || !turn) {\n if (turn && turn.world && !disposed) applyWorld(turn.world, { fromTurn: true })\n resolve()\n return\n }\n const shots = Array.isArray(turn.shots) ? turn.shots : []\n let est = 4 + (Array.isArray(turn.movePath) ? turn.movePath.length * 0.3 : 0)\n for (const s of shots) {\n const n = s && s.samples ? s.samples.length / 3 : 0\n est = Math.max(est, 4 + ((s && s.startMs) || 0) / 1000 + n * SAMPLE_DT)\n }\n est += (Array.isArray(turn.destroyed) ? turn.destroyed.length : 0) * 4\n const rec = { turn, resolve, finished: false, deadline: est * 2 + 6, timer: 0 }\n // wall-clock watchdog (in case rAF never fires while \"visible\")\n rec.timer = setTimeout(() => finishTurn(rec), (est * 2 + 12) * 1000)\n turnQueue.push(rec)\n celebrateState = null\n startNextTurn()\n })\n },\n\n setCameraMode(mode) {\n if (disposed) return\n cam.userMode = mode === 'aim' ? 'aim' : 'overview'\n if (!currentTurn && !celebrateState) setCam(cam.userMode, { tankId: activeId })\n wake(0.2)\n },\n\n setQuality(q) {\n if (disposed) return\n const n = normQ(q)\n autoQuality = false\n if (n) applyQuality(n)\n },\n\n celebrate(winnerId) {\n if (disposed) return\n activeRing.visible = false\n if (winnerId == null || !tanks.has(winnerId)) {\n celebrateState = null\n setCam('overview')\n wake(0.5)\n return\n }\n celebrateState = { id: winnerId, t: 0, next: 0.3 }\n setCam('celebrate', { tankId: winnerId, orbitFromCurrent: true })\n const t = tanks.get(winnerId)\n cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n wake(0.5)\n },\n\n resize,\n\n getStats() {\n return { ...lastStats }\n },\n\n dispose() {\n if (disposed) return\n flushTurns()\n disposed = true\n running = false\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n if (ro) ro.disconnect()\n else window.removeEventListener('resize', resize)\n if (io) io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n canvas.removeEventListener('webglcontextlost', onContextLost)\n for (const id of Array.from(tanks.keys())) removeTank(id)\n wheels.dispose()\n if (tankShared.wheelMat) tankShared.wheelMat.dispose()\n tankShared.dispose()\n tankGeos.dispose()\n blobs.dispose()\n blobGeo.dispose()\n blobMat.dispose()\n blobTex.dispose()\n activeMat.dispose()\n activeTex.dispose()\n fx.dispose()\n decor.dispose()\n terrain.dispose()\n sky.dispose()\n hills.dispose()\n if (sun.shadow && sun.shadow.map) sun.shadow.map.dispose()\n scene.clear()\n renderer.dispose()\n renderer.forceContextLoss()\n if (canvas.parentNode) canvas.parentNode.removeChild(canvas)\n },\n }\n}\n\nexport default createTankScene\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createTankScene-yhX6la27.js","names":["dampK","lin","ringTexture","wrapPi","blobTexture","clamp","DEG","createTank","WHEELS","createTankGeometries","createTankShared","createTerrain","createSky","SKY","createHills","createDecor","createFx","MAX_DT","MAX_TANKS","SAMPLE_DT","PIXEL_RATIO","SHADOW_SIZE","SUN_DIR","Vector3","detectQuality","coarse","small","cores","pixelRatioFor","d","q","normQ","createTankScene","container","emit","onEvent","err","autoQuality","quality","currentQuality","disposed","renderer","WebGLRenderer","sRGBEncoding","ACESFilmicToneMapping","PCFSoftShadowMap","canvas","width","height","scene","Scene","Fog","camera","PerspectiveCamera","world","Group","hemi","HemisphereLight","sun","DirectionalLight","sc","sky","hills","terrain","decor","fx","tankGeos","tankShared","tanks","tankOrder","wheels","makeWheelMaterial","MeshLambertMaterial","MeshStandardMaterial","makeWheels","InstancedMesh","DynamicDrawUsage","blobTex","blobGeo","PlaneGeometry","blobMat","MeshBasicMaterial","blobs","activeTex","activeMat","activeRing","Mesh","activeId","wind","mapSize","hasWorld","shadowDirty","wheelsDirty","aimDirty","wakeTime","elapsed","timeScale","realDt","turnQueue","currentTurn","celebrateState","mapCenter","v1","v2","v3","mtx","Matrix4","scl","cam","portrait","updateFov","aspect","setCam","mode","opts","reducedMotion","frameOverview","n","ax","az","bx","bz","id","t","dx","dz","span","fovV","ux","uz","nx","ny","nz","act","sx","sz","B","H","S","px","pz","pl","el","halfH","frameBehind","s","yaw","useHull","rx","rz","back","side","pitchLift","frameFollow","vx","vz","hl","hx","hz","frameOrbit","dt","updateCamera","g","moving","k","dist","tankColorFor","wt","index","ensureTank","removeTank","i","restoreTurret","placeWreckTurret","a","x","z","blowTurret","updateBlown","b","syncTankStatics","bi","at","damageLevel","applyWorld","w","res","sunTarget","list","seen","fromTurn","alive","wait","sec","waitReal","samplePos","samples","out","u","f","turnScript","tank","turn","speedK","path","p","total","seg","L","speed","dustAcc","fwdX","fwdZ","prevX","prevZ","acc","ay","mx","mz","step","dot","head","tgt","turnD","ty","tp","dy","dp","rate","dur","y0","p0","e","shots","craters","c","damage","flashed","recs","sh","fired","lastImpact","carrier","r","remaining","firstStart","fx0","fy0","fz0","vy","active","lt","impactShot","destroyed","imp","y","kind","radius","best","bd","startNextTurn","rec","running","finishTurn","wake","flushTurns","resize","h","ro","docVisible","onScreen","io","entries","updateRunning","onVisibility","contextLost","onContextLost","clock","Clock","rafId","slowTimer","perfAcc","perfFrames","lastStats","schedule","frame","raw","animating","changed","lvl","cx","cz","cy","col","info","applyQuality","hasAmbient","should","hi","first","pitch","power","points","resolve","est","winnerId"],"sources":["../../src/games/tanks/scene/createTankScene.js"],"sourcesContent":["// Tanques de guerra 3D — three.js scene (three >=0.134 <0.138). Framework-agnostic.\n//\n// createTankScene(container, { quality, reducedMotion, onEvent }) → {\n// setWorld, setAim, setPreview, playTurn, setCameraMode, setQuality, celebrate,\n// resize, getStats, dispose\n// }\n// World units are meters: map size×size, x right, z depth, y up, terrain origin at (0,0).\n// Renders on demand: the rAF loop stops when nothing animates.\nimport {\n ACESFilmicToneMapping,\n Clock,\n DirectionalLight,\n DynamicDrawUsage,\n Fog,\n Group,\n HemisphereLight,\n InstancedMesh,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshStandardMaterial,\n PCFSoftShadowMap,\n PerspectiveCamera,\n PlaneGeometry,\n Scene,\n sRGBEncoding,\n Vector3,\n WebGLRenderer,\n} from 'three'\nimport { createTerrain, createSky, createHills, SKY } from './terrain.js'\nimport { createDecor } from './decor.js'\nimport { createTank, createTankGeometries, createTankShared, WHEELS } from './tank.js'\nimport { createFx } from './fx.js'\nimport { blobTexture, clamp, dampK, DEG, lin, ringTexture, wrapPi } from './util.js'\n\nconst MAX_DT = 1 / 15\nconst MAX_TANKS = 4\nconst SAMPLE_DT = 0.04 // 2 ticks @ 50 Hz\nconst PIXEL_RATIO = { low: 1.25, medium: 1.5, high: 1.75 }\nconst SHADOW_SIZE = 2048\nconst SUN_DIR = new Vector3(0.62, 0.42, 0.66).normalize()\n\nexport function detectQuality() {\n if (typeof window === 'undefined') return 'low'\n const coarse = !!(window.matchMedia && window.matchMedia('(pointer: coarse)').matches)\n const small = Math.min(window.innerWidth || 0, window.innerHeight || 0) < 640\n const cores = (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) || 8\n if (coarse || small || cores <= 4) return 'low'\n return cores >= 8 ? 'high' : 'medium'\n}\n\nfunction pixelRatioFor(q) {\n const d = (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n return Math.min(d, PIXEL_RATIO[q] || 1.5)\n}\n\nconst normQ = (q) => (q === 'low' || q === 'medium' || q === 'high' ? q : null)\n\nexport function createTankScene(container, { quality = 'auto', reducedMotion = false, onEvent } = {}) {\n if (!container) throw new Error('createTankScene: container element required')\n const emit = (e) => {\n if (typeof onEvent === 'function') {\n try {\n onEvent(e)\n } catch (err) {\n // listener errors must never break the render loop\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n }\n\n let autoQuality = !normQ(quality)\n let currentQuality = normQ(quality) || detectQuality()\n let disposed = false\n\n // ------------------------------------------------------------------ renderer\n const renderer = new WebGLRenderer({\n antialias: !(currentQuality === 'low' && ((typeof window !== 'undefined' && window.devicePixelRatio) || 1) >= 2),\n alpha: false,\n stencil: false,\n powerPreference: 'high-performance',\n })\n renderer.outputEncoding = sRGBEncoding\n renderer.toneMapping = ACESFilmicToneMapping\n renderer.toneMappingExposure = 1.05\n renderer.shadowMap.enabled = true\n renderer.shadowMap.type = PCFSoftShadowMap\n renderer.shadowMap.autoUpdate = false\n renderer.setPixelRatio(pixelRatioFor(currentQuality))\n renderer.setClearColor(SKY.horizon, 1)\n const canvas = renderer.domElement\n canvas.style.display = 'block'\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n canvas.style.outline = 'none'\n container.appendChild(canvas)\n\n let width = Math.max(1, container.clientWidth)\n let height = Math.max(1, container.clientHeight)\n renderer.setSize(width, height, false)\n\n // ------------------------------------------------------------------ scene\n const scene = new Scene()\n scene.fog = new Fog(SKY.fog.clone(), 200, 700)\n const camera = new PerspectiveCamera(45, width / height, 0.5, 1400)\n const world = new Group()\n scene.add(world)\n\n const hemi = new HemisphereLight(lin('#ffd2b0'), lin('#33402f'), 0.6)\n const sun = new DirectionalLight(lin('#ffbe7a'), 1.9)\n sun.shadow.mapSize.set(SHADOW_SIZE, SHADOW_SIZE)\n sun.shadow.bias = -0.0006\n sun.shadow.normalBias = 0.04\n const sc = sun.shadow.camera\n sc.left = -120\n sc.right = 120\n sc.top = 120\n sc.bottom = -120\n sc.near = 20\n sc.far = 520\n sc.updateProjectionMatrix()\n scene.add(hemi, sun, sun.target)\n\n const sky = createSky(SUN_DIR)\n scene.add(sky.mesh)\n const hills = createHills(new Vector3(80, 0, 80), SUN_DIR)\n scene.add(hills.mesh)\n\n const terrain = createTerrain()\n world.add(terrain.mesh)\n const decor = createDecor()\n const fx = createFx(scene, { quality: currentQuality, reducedMotion, heightAt: terrain.heightAt })\n\n const tankGeos = createTankGeometries()\n const tankShared = createTankShared()\n const tanks = new Map() // id → tank\n const tankOrder = []\n\n // wheels for all tanks: one InstancedMesh\n let wheels = null\n function makeWheelMaterial() {\n return currentQuality === 'low'\n ? new MeshLambertMaterial({ vertexColors: true })\n : new MeshStandardMaterial({ vertexColors: true, roughness: 0.7, metalness: 0.25 })\n }\n function makeWheels() {\n tankShared.wheelMat = makeWheelMaterial()\n wheels = new InstancedMesh(tankGeos.wheel, tankShared.wheelMat, MAX_TANKS * WHEELS.length)\n wheels.instanceMatrix.setUsage(DynamicDrawUsage)\n wheels.frustumCulled = false\n wheels.count = 0\n world.add(wheels)\n }\n makeWheels()\n\n // blob shadows (medium/low)\n const blobTex = blobTexture(64)\n const blobGeo = new PlaneGeometry(1, 1)\n blobGeo.rotateX(-Math.PI / 2)\n const blobMat = new MeshBasicMaterial({\n map: blobTex,\n transparent: true,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n const blobs = new InstancedMesh(blobGeo, blobMat, MAX_TANKS)\n blobs.frustumCulled = false\n blobs.count = 0\n blobs.renderOrder = 2\n world.add(blobs)\n\n // active tank ring\n const activeTex = ringTexture(128)\n const activeMat = new MeshBasicMaterial({\n map: activeTex,\n transparent: true,\n depthWrite: false,\n opacity: 0.85,\n polygonOffset: true,\n polygonOffsetFactor: -3,\n polygonOffsetUnits: -3,\n })\n const activeRing = new Mesh(blobGeo, activeMat)\n activeRing.visible = false\n activeRing.renderOrder = 3\n world.add(activeRing)\n\n // ------------------------------------------------------------------ state\n let lastWorld = null\n let activeId = null\n let wind = { x: 0, z: 0 }\n let mapSize = 160\n let hasWorld = false\n let shadowDirty = true\n let wheelsDirty = true\n let aimDirty = false\n let wakeTime = 0 // keep rendering until elapsed > wakeTime\n let elapsed = 0\n let timeScale = 1\n let realDt = 0\n const turnQueue = []\n let currentTurn = null // { turn, gen, resolve, started, deadline }\n let celebrateState = null\n\n const mapCenter = new Vector3(80, 0, 80)\n const v1 = new Vector3()\n const v2 = new Vector3()\n const v3 = new Vector3()\n const mtx = new Matrix4()\n const scl = new Vector3()\n\n // ------------------------------------------------------------------ camera rig\n const cam = {\n mode: 'overview',\n userMode: 'overview',\n pos: new Vector3(80, 120, 260),\n target: new Vector3(80, 0, 80),\n dPos: new Vector3(),\n dTarget: new Vector3(),\n focus: new Vector3(),\n vel: new Vector3(1, 0, 0),\n tankId: null,\n orbit: 0,\n orbitSpeed: 0,\n radius: 25,\n lift: 10,\n rate: 2.5,\n shake: 0,\n snap: true,\n moving: true,\n }\n let portrait = false\n\n function updateFov() {\n const aspect = width / height\n portrait = aspect < 0.85\n camera.fov = portrait ? 62 : aspect < 1.25 ? 52 : 45\n camera.aspect = aspect\n camera.updateProjectionMatrix()\n }\n updateFov()\n\n function setCam(mode, opts = {}) {\n cam.mode = mode\n if (opts.tankId !== undefined) cam.tankId = opts.tankId\n if (opts.focus) cam.focus.copy(opts.focus)\n if (opts.orbitFromCurrent) {\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n }\n if (reducedMotion || opts.cut) cam.snap = true\n cam.moving = true\n }\n\n function frameOverview() {\n let n = 0\n v1.set(0, 0, 0)\n let ax = 0, az = 0, bx = 0, bz = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n if (!t) continue\n const s = t.state\n if (n === 0) { ax = s.x; az = s.z } else { bx = s.x; bz = s.z }\n v1.x += s.x\n v1.y += s.y\n v1.z += s.z\n n++\n }\n if (n === 0) {\n v1.copy(mapCenter)\n v1.y = terrain.ready ? terrain.heightAt(mapCenter.x, mapCenter.z) : 0\n bx = ax + 1\n bz = az\n } else v1.multiplyScalar(1 / n)\n if (n < 2) {\n bx = ax + 1\n bz = az\n }\n const dx = bx - ax\n const dz = bz - az\n const span = n >= 2 ? Math.hypot(dx, dz) : 30\n const fovV = (camera.fov * DEG) / 2\n if (portrait && n >= 2) {\n // tall screens: look along the line between tanks, active tank nearest\n let ux = dx / span, uz = dz / span\n let nx = ax, ny = 0, nz = az\n const act = activeId != null ? tanks.get(activeId) : null\n if (act && act.state.x === bx && act.state.z === bz) {\n ux = -ux\n uz = -uz\n nx = bx\n nz = bz\n }\n ny = terrain.ready ? terrain.heightAt(nx, nz) : v1.y\n // slight sideways offset so the tanks don't line up with the view axis\n const sx = -uz, sz = ux\n const B = clamp(span * 0.3, 16, 70)\n const H = span * 0.3 + 8\n const S = span * 0.1\n cam.dPos.set(nx - ux * B + sx * S, ny + H, nz - uz * B + sz * S)\n cam.dTarget.set(nx + ux * span * 0.42, ny + 1, nz + uz * span * 0.42)\n cam.rate = 2.2\n return\n }\n let px = -dz, pz = dx\n const pl = Math.hypot(px, pz) || 1\n px /= pl\n pz /= pl\n if (pz < 0) { px = -px; pz = -pz }\n const el = portrait ? 0.78 : 0.52\n const halfH = Math.atan(Math.tan(fovV) * camera.aspect)\n const need = span / 2 + 14\n let d = need / Math.tan(halfH)\n d = Math.max(d, 26 / Math.tan(fovV))\n d = clamp(d * 1.05, 38, 260)\n cam.dTarget.set(v1.x, v1.y + 2, v1.z)\n cam.dPos.set(\n v1.x + px * Math.cos(el) * d,\n v1.y + Math.sin(el) * d,\n v1.z + pz * Math.cos(el) * d,\n )\n cam.rate = 2.2\n }\n\n function frameBehind(t, useHull) {\n const s = t.state\n const yaw = (useHull ? s.hullYaw : s.yaw) * DEG\n const dx = Math.cos(yaw)\n const dz = Math.sin(yaw)\n const rx = -dz\n const rz = dx\n const back = portrait ? 24 : 20\n const side = portrait ? 2 : 4.5\n cam.dPos.set(s.x - dx * back + rx * side, s.y + (portrait ? 10 : 8.5), s.z - dz * back + rz * side)\n const pitchLift = clamp(Math.tan(clamp(s.pitch, 0, 70) * DEG) * 4, 0, 10)\n cam.dTarget.set(s.x + dx * 40, s.y + 1 + pitchLift, s.z + dz * 40)\n cam.rate = useHull ? 3 : 4.5\n }\n\n function frameFollow() {\n const vx = cam.vel.x, vz = cam.vel.z\n const hl = Math.hypot(vx, vz) || 1\n const hx = vx / hl, hz = vz / hl\n cam.dPos.set(cam.focus.x - hx * 18 - hz * 4, cam.focus.y + 6, cam.focus.z - hz * 18 + hx * 4)\n cam.dTarget.set(cam.focus.x + cam.vel.x * 0.35, cam.focus.y + cam.vel.y * 0.2, cam.focus.z + cam.vel.z * 0.35)\n cam.rate = 4.5\n }\n\n function frameOrbit(dt) {\n cam.orbit += cam.orbitSpeed * dt * (reducedMotion ? 0 : 1)\n cam.dPos.set(\n cam.focus.x + Math.cos(cam.orbit) * cam.radius,\n cam.focus.y + cam.lift,\n cam.focus.z + Math.sin(cam.orbit) * cam.radius,\n )\n cam.dTarget.set(cam.focus.x, cam.focus.y + (cam.mode === 'celebrate' ? 4 : 1.5), cam.focus.z)\n }\n\n function updateCamera(dt) {\n const t = cam.tankId != null ? tanks.get(cam.tankId) : null\n switch (cam.mode) {\n case 'aim':\n if (t) frameBehind(t, false)\n else frameOverview()\n break\n case 'drive':\n if (t) frameBehind(t, true)\n else frameOverview()\n break\n case 'follow':\n frameFollow()\n break\n case 'impact':\n cam.radius = 30\n cam.lift = 12\n cam.orbitSpeed = 0.22\n cam.rate = 2.4\n frameOrbit(dt)\n break\n case 'killcam':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = 17\n cam.lift = 6.5\n cam.orbitSpeed = 0.32\n cam.rate = 2\n frameOrbit(dt)\n break\n case 'celebrate':\n if (t) cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.radius = portrait ? 24 : 19\n cam.lift = 4.5\n cam.orbitSpeed = 0.38\n cam.rate = 1.8\n frameOrbit(dt)\n break\n default:\n frameOverview()\n }\n // keep the camera above terrain\n if (terrain.ready) {\n const g = terrain.heightAt(cam.dPos.x, cam.dPos.z) + 3\n if (cam.dPos.y < g) cam.dPos.y = g\n }\n let moving\n if (cam.snap) {\n cam.pos.copy(cam.dPos)\n cam.target.copy(cam.dTarget)\n cam.snap = false\n moving = true\n } else {\n const k = dampK(cam.rate, dt)\n cam.pos.lerp(cam.dPos, k)\n cam.target.lerp(cam.dTarget, k)\n moving = cam.pos.distanceToSquared(cam.dPos) > 0.0025 || cam.target.distanceToSquared(cam.dTarget) > 0.0025\n }\n if (terrain.ready) {\n const g = terrain.heightAt(cam.pos.x, cam.pos.z) + 2\n if (cam.pos.y < g) cam.pos.y = g\n }\n camera.position.copy(cam.pos)\n if (cam.shake > 0.001 && !reducedMotion) {\n const s = cam.shake\n camera.position.x += (Math.random() - 0.5) * s\n camera.position.y += (Math.random() - 0.5) * s\n camera.position.z += (Math.random() - 0.5) * s\n cam.shake *= Math.exp(-6 * dt)\n moving = true\n } else cam.shake = 0\n camera.lookAt(cam.target)\n // fog follows framing distance\n const dist = cam.pos.distanceTo(cam.target)\n scene.fog.near = dist * 1.1 + 20\n scene.fog.far = dist * 3.2 + 260\n cam.moving = moving || cam.mode === 'impact' || cam.mode === 'killcam' || (cam.mode === 'celebrate' && !!celebrateState)\n return cam.moving\n }\n\n // ------------------------------------------------------------------ tanks\n function tankColorFor(wt, index) {\n if (wt.color === 'red' || wt.color === 'green') return wt.color\n return index === 0 ? 'green' : 'red'\n }\n\n function ensureTank(wt, index) {\n let t = tanks.get(wt.id)\n if (t) return t\n t = createTank(tankGeos, tankShared, { id: wt.id, color: tankColorFor(wt, index), quality: currentQuality })\n t.setShadows(currentQuality === 'high')\n world.add(t.root)\n tanks.set(wt.id, t)\n tankOrder.push(wt.id)\n return t\n }\n\n function removeTank(id) {\n const t = tanks.get(id)\n if (!t) return\n if (t.state.blown) t.turret.removeFromParent()\n t.dispose()\n tanks.delete(id)\n const i = tankOrder.indexOf(id)\n if (i >= 0) tankOrder.splice(i, 1)\n }\n\n function restoreTurret(t) {\n if (!t.state.blown) return\n t.state.blown = null\n t.body.add(t.turret)\n t.turret.position.set(-0.35, 1.6, 0)\n t.turret.rotation.set(0, 0, 0)\n t.turret.scale.setScalar(1)\n }\n\n // Wreck turret resting beside the hull (used when a dead tank appears without animation).\n function placeWreckTurret(t) {\n const s = t.state\n if (s.blown) return\n t.place(terrain)\n world.attach(t.turret)\n const a = (s.hullYaw + 120) * DEG\n const x = s.x + Math.cos(a) * 4.5\n const z = s.z + Math.sin(a) * 4.5\n t.turret.position.set(x, terrain.heightAt(x, z) + 0.2, z)\n t.turret.rotation.set(0.5, a, 2.6)\n s.blown = { p: t.turret.position.clone(), v: new Vector3(), w: new Vector3(), landed: true }\n }\n\n function blowTurret(t) {\n const s = t.state\n if (s.blown) return\n world.attach(t.turret)\n const a = Math.random() * Math.PI * 2\n s.blown = {\n p: t.turret.position.clone(),\n v: new Vector3(Math.cos(a) * 3.5, 15, Math.sin(a) * 3.5),\n w: new Vector3((Math.random() - 0.5) * 6, (Math.random() - 0.5) * 5, (Math.random() - 0.5) * 6),\n landed: false,\n }\n }\n\n function updateBlown(t, dt) {\n const b = t.state.blown\n if (!b || b.landed) return false\n b.v.y -= 20 * dt\n b.p.addScaledVector(b.v, dt)\n t.turret.rotation.x += b.w.x * dt\n t.turret.rotation.y += b.w.y * dt\n t.turret.rotation.z += b.w.z * dt\n const g = terrain.heightAt(b.p.x, b.p.z) + 0.25\n if (b.p.y < g && b.v.y < 0) {\n b.p.y = g\n if (b.v.y < -5) {\n b.v.y *= -0.25\n b.v.x *= 0.5\n b.v.z *= 0.5\n b.w.multiplyScalar(0.4)\n fx.dust(b.p.x, g, b.p.z, 2)\n fx.dust(b.p.x, g, b.p.z, 2)\n } else {\n b.landed = true\n // settle roughly upside-down / on its side\n t.turret.rotation.x = Math.round(t.turret.rotation.x / Math.PI) * Math.PI + 0.25\n t.turret.rotation.z = Math.round(t.turret.rotation.z / Math.PI) * Math.PI + 0.2\n }\n }\n t.turret.position.copy(b.p)\n shadowDirty = true\n return true\n }\n\n function syncTankStatics() {\n // wheels + blobs + active ring\n let k = 0\n let bi = 0\n for (const id of tankOrder) {\n const t = tanks.get(id)\n t.writeWheels(wheels, k)\n k += WHEELS.length\n const s = t.state\n v1.set(s.x, s.y + 0.08, s.z)\n scl.set(7.2, 1, 5.2)\n mtx.compose(v1, t.body.quaternion, scl)\n blobs.setMatrixAt(bi++, mtx)\n }\n wheels.count = k\n wheels.instanceMatrix.needsUpdate = true\n blobs.count = currentQuality === 'high' ? 0 : bi\n blobs.instanceMatrix.needsUpdate = true\n const at = activeId != null ? tanks.get(activeId) : null\n if (at && at.state.alive && !currentTurn && !celebrateState) {\n activeRing.visible = true\n activeRing.position.set(at.state.x, at.state.y + 0.12, at.state.z)\n activeRing.quaternion.copy(at.body.quaternion)\n activeRing.scale.set(9, 1, 9)\n activeMat.color.copy(at.team.accent).multiplyScalar(1.4)\n } else activeRing.visible = false\n wheelsDirty = false\n }\n\n function damageLevel(t) {\n const s = t.state\n if (!s.alive) return 2\n return s.hp / Math.max(1, s.maxHp) <= 0.5 ? 1 : 0\n }\n\n // ------------------------------------------------------------------ world\n function applyWorld(w, { fromTurn = false } = {}) {\n if (!w || disposed) return\n lastWorld = w\n hasWorld = true\n mapSize = w.size || 160\n mapCenter.set(mapSize / 2, 0, mapSize / 2)\n const res = terrain.setHeights(w)\n if (res !== 'same') {\n shadowDirty = true\n const sunTarget = mapCenter\n sun.target.position.copy(sunTarget)\n sun.position.copy(sunTarget).addScaledVector(SUN_DIR, 260)\n sun.target.updateMatrixWorld()\n }\n if (decor.build(world, w, terrain)) shadowDirty = true\n else if (res !== 'same') decor.reground(terrain)\n decor.setShadows(currentQuality === 'high')\n\n const list = Array.isArray(w.tanks) ? w.tanks : []\n const seen = new Set()\n list.forEach((wt, i) => {\n if (!wt || wt.id == null) return\n seen.add(wt.id)\n const t = ensureTank(wt, i)\n const s = t.state\n s.x = +wt.x || 0\n s.z = +wt.z || 0\n s.y = Number.isFinite(wt.y) ? wt.y : terrain.heightAt(s.x, s.z)\n s.hullYaw = +wt.hullYaw || 0\n const keepAim = !fromTurn && wt.id === w.activeId && s.targetYaw != null\n if (!keepAim) {\n s.yaw = Number.isFinite(wt.yaw) ? wt.yaw : s.hullYaw\n s.pitch = Number.isFinite(wt.pitch) ? wt.pitch : 10\n s.targetYaw = null\n s.targetPitch = null\n }\n s.hp = Number.isFinite(wt.hp) ? wt.hp : 100\n s.maxHp = Math.max(100, s.maxHp, s.hp)\n const alive = wt.alive !== undefined ? !!wt.alive : s.hp > 0\n if (alive && !s.alive) {\n restoreTurret(t)\n t.setCharred(false)\n }\n s.alive = alive\n if (!alive) {\n t.setCharred(true)\n if (!s.blown) placeWreckTurret(t)\n }\n t.place(terrain)\n })\n for (const id of Array.from(tanks.keys())) if (!seen.has(id)) removeTank(id)\n activeId = w.activeId != null ? w.activeId : w.turnPlayerId != null ? w.turnPlayerId : activeId\n wind = w.wind || wind\n fx.setWind(wind)\n wheelsDirty = true\n shadowDirty = true\n if (!currentTurn && !celebrateState) {\n cam.tankId = activeId\n if (cam.mode !== cam.userMode) setCam(cam.userMode)\n }\n }\n\n // ------------------------------------------------------------------ turns\n function* wait(sec) {\n let t = 0\n while (t < sec) t += yield\n }\n function* waitReal(sec) {\n let t = 0\n while (t < sec) {\n yield\n t += realDt\n }\n }\n\n function samplePos(samples, u, out) {\n const n = (samples.length / 3) | 0\n if (n === 0) return out.set(0, 0, 0)\n if (u <= 0) return out.set(samples[0], samples[1], samples[2])\n if (u >= n - 1) return out.set(samples[(n - 1) * 3], samples[(n - 1) * 3 + 1], samples[(n - 1) * 3 + 2])\n const i = Math.floor(u)\n const f = u - i\n const a = i * 3\n return out.set(\n samples[a] + (samples[a + 3] - samples[a]) * f,\n samples[a + 1] + (samples[a + 4] - samples[a + 1]) * f,\n samples[a + 2] + (samples[a + 5] - samples[a + 2]) * f,\n )\n }\n\n function* turnScript(turn) {\n const tank = tanks.get(turn.tankId)\n const speedK = reducedMotion ? 2 : 1\n if (tank) {\n tank.state.targetYaw = null\n tank.state.targetPitch = null\n }\n activeRing.visible = false\n fx.setPreview(null)\n\n // ---------------- drive\n const path = Array.isArray(turn.movePath) ? turn.movePath.filter((p) => p && Number.isFinite(p.x) && Number.isFinite(p.z)) : []\n let total = 0\n const seg = []\n for (let i = 1; i < path.length; i++) {\n const L = Math.hypot(path[i].x - path[i - 1].x, path[i].z - path[i - 1].z)\n seg.push(L)\n total += L\n }\n if (tank && tank.state.alive && total > 0.05) {\n const s = tank.state\n setCam('drive', { tankId: tank.id })\n emit({ type: 'engine_start', tankId: tank.id })\n yield* wait(reducedMotion ? 0.05 : 0.35)\n emit({ type: 'move_start', tankId: tank.id })\n const speed = 5 * speedK\n let d = 0\n let dustAcc = 0\n const fwdX = Math.cos(s.hullYaw * DEG)\n const fwdZ = Math.sin(s.hullYaw * DEG)\n while (d < total) {\n const dt = yield\n const prevX = s.x, prevZ = s.z\n d = Math.min(total, d + speed * dt)\n // locate on path\n let acc = 0\n let i = 0\n while (i < seg.length - 1 && acc + seg[i] < d) acc += seg[i++]\n const f = seg[i] > 0 ? (d - acc) / seg[i] : 1\n const a = path[i], b = path[i + 1]\n s.x = a.x + (b.x - a.x) * f\n s.z = a.z + (b.z - a.z) * f\n const ay = Number.isFinite(a.y) ? a.y : terrain.heightAt(a.x, a.z)\n const by = Number.isFinite(b.y) ? b.y : terrain.heightAt(b.x, b.z)\n s.y = ay + (by - ay) * f\n const mx = s.x - prevX, mz = s.z - prevZ\n const step = Math.hypot(mx, mz)\n if (step > 1e-5) {\n const dot = (mx * fwdX + mz * fwdZ) / step\n if (Math.abs(dot) < 0.9) {\n // path bends: steer the hull toward travel direction\n const head = Math.atan2(mz, mx) / DEG\n const tgt = dot >= 0 ? head : head + 180\n const diff = wrapPi((tgt - s.hullYaw) * DEG) / DEG\n const turnD = diff * dampK(6, dt)\n s.hullYaw += turnD\n s.yaw += turnD\n }\n tank.scrollTracks(dot >= 0 ? step : -step)\n dustAcc += step\n }\n tank.place(terrain, dt)\n while (dustAcc > 0.7) {\n dustAcc -= 0.7\n tank.localToWorld(v2, -2.6, 0.2, 1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -2.6, 0.2, -1.4)\n fx.dust(v2.x, v2.y, v2.z)\n tank.localToWorld(v2, -3.3, 1.3, 0.9)\n fx.exhaust(v2.x, v2.y, v2.z)\n }\n wheelsDirty = true\n shadowDirty = true\n }\n emit({ type: 'move_end', tankId: tank.id })\n }\n\n // ---------------- turret\n if (tank && tank.state.alive) {\n const s = tank.state\n const ty = Number.isFinite(turn.yaw) ? turn.yaw : s.yaw\n const tp = Number.isFinite(turn.pitch) ? turn.pitch : s.pitch\n const dy = wrapPi((ty - s.yaw) * DEG) / DEG\n const dp = tp - s.pitch\n if (cam.mode !== 'drive' && !reducedMotion) setCam('aim', { tankId: tank.id })\n else if (cam.mode === 'drive') setCam('aim', { tankId: tank.id })\n if (Math.abs(dy) > 0.5 || Math.abs(dp) > 0.5) {\n emit({ type: 'turret_start', tankId: tank.id })\n const rate = 90 * speedK\n const dur = Math.max(0.25, Math.max(Math.abs(dy), Math.abs(dp)) / rate)\n const y0 = s.yaw, p0 = s.pitch\n let t = 0\n while (t < dur) {\n t += yield\n const k = Math.min(1, t / dur)\n const e = k * k * (3 - 2 * k)\n s.yaw = y0 + dy * e\n s.pitch = p0 + dp * e\n tank.place(terrain)\n shadowDirty = true\n }\n emit({ type: 'turret_end', tankId: tank.id })\n }\n s.yaw = ty\n s.pitch = tp\n tank.place(terrain)\n yield* wait(reducedMotion ? 0.05 : 0.2)\n }\n\n // ---------------- shots\n const shots = Array.isArray(turn.shots) ? turn.shots.slice(0, 8) : []\n const craters = Array.isArray(turn.craters) ? turn.craters.map((c) => ({ ...c, used: false })) : []\n const damage = turn.damage || {}\n const flashed = new Set()\n const recs = shots.map((sh, i) => {\n const samples = sh && sh.samples && sh.samples.length >= 3 ? sh.samples : null\n const n = samples ? (samples.length / 3) | 0 : 0\n return {\n shot: sh,\n samples,\n n,\n start: (Number.isFinite(sh && sh.startMs) ? sh.startMs / 1000 : 0) / speedK,\n dur: (Math.max(1, n - 1) * SAMPLE_DT) / speedK,\n role: (sh && sh.role) || 'main',\n slot: i,\n started: false,\n done: !samples,\n offset: new Vector3(),\n }\n })\n let fired = false\n let lastImpact = null\n const carrier = recs.find((r) => r.role === 'carrier' && !r.done) || null\n if (recs.length) {\n let t = 0\n let remaining = recs.filter((r) => !r.done).length\n const firstStart = Math.min(...recs.map((r) => r.start))\n while (remaining > 0 && t < 30) {\n // fire moment\n if (!fired && tank) {\n fired = true\n tank.muzzleWorld(v2)\n tank.gunDirWorld(v3)\n fx.muzzle(v2, v3)\n tank.state.recoil = 1\n cam.shake = 0.6\n emit({ type: 'fire', tankId: tank.id })\n }\n let fx0 = 0, fy0 = 0, fz0 = 0, vx = 0, vy = 0, vz = 0, active = 0\n for (const r of recs) {\n if (r.done) continue\n const lt = t - r.start\n if (lt < 0) continue\n if (!r.started && r.role === 'bomblet' && carrier && !carrier.done) continue\n if (!r.started) {\n r.started = true\n samplePos(r.samples, 0, v1)\n if (tank && (r.role === 'main' || r.role === 'carrier') && r.start <= firstStart + 1e-6) {\n tank.muzzleWorld(v2)\n r.offset.copy(v2).sub(v1)\n }\n fx.projShow(r.slot, v1.x + r.offset.x, v1.y + r.offset.y, v1.z + r.offset.z, (r.shot.radius || 0) >= 7)\n emit({ type: 'projectile_start', tankId: turn.tankId, role: r.role })\n }\n const u = lt / SAMPLE_DT * speedK\n if (lt >= r.dur) {\n // impact\n r.done = true\n remaining--\n fx.projHide(r.slot)\n lastImpact = impactShot(r, craters, damage, flashed) || lastImpact\n continue\n }\n samplePos(r.samples, u, v1)\n const w = Math.max(0, 1 - u / 5)\n v1.addScaledVector(r.offset, w)\n fx.projMove(r.slot, v1.x, v1.y, v1.z)\n samplePos(r.samples, u + 1, v3)\n fx0 += v1.x; fy0 += v1.y; fz0 += v1.z\n vx += (v3.x - v1.x) / SAMPLE_DT\n vy += (v3.y - v1.y) / SAMPLE_DT\n vz += (v3.z - v1.z) / SAMPLE_DT\n active++\n }\n if (active > 0) {\n cam.focus.set(fx0 / active, fy0 / active, fz0 / active)\n if (Math.hypot(vx, vz) > 0.1) cam.vel.set(vx / active, vy / active, vz / active)\n if (cam.mode !== 'follow' && !reducedMotion) setCam('follow')\n if (reducedMotion && cam.mode !== 'overview') setCam('overview', { cut: true })\n } else if (lastImpact && cam.mode === 'follow') {\n setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n }\n t += yield\n }\n }\n\n // leftover craters (no matching impact)\n for (const c of craters) {\n if (c.used) continue\n terrain.crater(c.x, c.z, c.radius || 4, c.depth || 1)\n decor.blast(terrain, c.x, c.z, c.radius || 4)\n shadowDirty = true\n }\n // splash damage flashes\n for (const id of Object.keys(damage)) {\n if (damage[id] > 0 && !flashed.has(id)) {\n const t = tanks.get(id)\n if (t) t.state.hitFlash = 1\n }\n }\n\n if (lastImpact) {\n if (!reducedMotion && cam.mode !== 'impact') setCam('impact', { focus: lastImpact, orbitFromCurrent: true })\n if (reducedMotion) setCam('overview', { cut: true })\n yield* wait(reducedMotion ? 0.5 : 1.3)\n } else {\n yield* wait(0.4)\n }\n\n // ---------------- destruction\n const destroyed = Array.isArray(turn.destroyed) ? turn.destroyed : []\n for (const id of destroyed) {\n const t = tanks.get(id)\n if (!t || (!t.state.alive && t.state.charred)) continue\n if (!reducedMotion) {\n setCam('killcam', { tankId: id, focus: v1.set(t.state.x, t.state.y, t.state.z), orbitFromCurrent: true })\n timeScale = 0.35\n yield* waitReal(0.35)\n }\n t.state.alive = false\n t.setCharred(true)\n blowTurret(t)\n fx.bigExplosion(t.state.x, t.state.y + 1, t.state.z)\n cam.shake = 1.6\n shadowDirty = true\n emit({ type: 'destroyed', tankId: id })\n emit({ type: 'big_explosion', tankId: id })\n yield* waitReal(reducedMotion ? 0.6 : 1.5)\n timeScale = 1\n yield* wait(reducedMotion ? 0.3 : 1.0)\n }\n timeScale = 1\n }\n\n function impactShot(r, craters, damage, flashed) {\n const imp = r.shot.impact || {}\n const n = r.n\n const x = Number.isFinite(imp.x) ? imp.x : r.samples[(n - 1) * 3]\n const y = Number.isFinite(imp.y) ? imp.y : r.samples[(n - 1) * 3 + 1]\n const z = Number.isFinite(imp.z) ? imp.z : r.samples[(n - 1) * 3 + 2]\n const kind = imp.kind || 'terrain'\n emit({ type: 'impact', kind, tankId: imp.tankId, role: r.role })\n if (kind === 'split') {\n fx.pop(x, y, z)\n return null\n }\n if (kind === 'out') {\n fx.outPuff(x, y, z)\n return null\n }\n const radius = r.shot.radius || 5\n fx.explosion(x, y, z, radius, kind)\n cam.shake = Math.max(cam.shake, radius >= 7 ? 1.4 : 0.9)\n if (radius >= 7) emit({ type: 'big_explosion' })\n // nearest crater\n let best = null\n let bd = Infinity\n for (const c of craters) {\n if (c.used) continue\n const d = Math.hypot(c.x - x, c.z - z)\n if (d < bd) {\n bd = d\n best = c\n }\n }\n if (best && bd < Math.max(3, radius * 1.5)) {\n best.used = true\n terrain.crater(best.x, best.z, best.radius || radius, best.depth || 0.8)\n }\n decor.blast(terrain, x, z, radius)\n shadowDirty = true\n if (kind === 'tank' && imp.tankId != null) {\n const t = tanks.get(imp.tankId)\n if (t) {\n t.state.hitFlash = 1\n fx.hitSparks(x, y, z)\n flashed.add(String(imp.tankId))\n }\n emit({ type: 'tank_hit', tankId: imp.tankId })\n }\n // splash flashes for tanks within radius\n for (const id of Object.keys(damage)) {\n if (!(damage[id] > 0) || flashed.has(id)) continue\n const t = tanks.get(id)\n if (t && Math.hypot(t.state.x - x, t.state.z - z) < radius * 1.3) {\n t.state.hitFlash = 1\n flashed.add(id)\n emit({ type: 'tank_hit', tankId: id })\n }\n }\n return new Vector3(x, y, z)\n }\n\n function startNextTurn() {\n if (currentTurn || !turnQueue.length) return\n const rec = turnQueue.shift()\n if (disposed || !running || !hasWorld) {\n finishTurn(rec)\n startNextTurn()\n return\n }\n rec.gen = turnScript(rec.turn)\n rec.realT = 0\n currentTurn = rec\n rec.gen.next(0)\n wake()\n }\n\n function finishTurn(rec) {\n if (rec.finished) return\n rec.finished = true\n if (rec.timer) clearTimeout(rec.timer)\n if (currentTurn === rec) currentTurn = null\n timeScale = 1\n for (let i = 0; i < 8; i++) fx.projHide(i)\n if (!disposed) {\n try {\n const w = rec.turn && rec.turn.world\n if (w) applyWorld(w, { fromTurn: true })\n setCam(cam.userMode, { tankId: activeId })\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n }\n }\n rec.resolve()\n }\n\n function flushTurns() {\n if (currentTurn) finishTurn(currentTurn)\n while (turnQueue.length) finishTurn(turnQueue.shift())\n }\n\n // ------------------------------------------------------------------ resize / visibility\n function resize() {\n if (disposed) return\n const w = container.clientWidth\n const h = container.clientHeight\n if (!w || !h) return\n width = w\n height = h\n renderer.setSize(w, h, false)\n updateFov()\n wake(0.3)\n }\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(resize) : null\n if (ro) ro.observe(container)\n else window.addEventListener('resize', resize)\n\n let docVisible = typeof document === 'undefined' ? true : !document.hidden\n let onScreen = true\n let running = docVisible\n const io =\n typeof IntersectionObserver !== 'undefined'\n ? new IntersectionObserver((entries) => {\n onScreen = entries[entries.length - 1].isIntersecting\n updateRunning()\n })\n : null\n if (io) io.observe(container)\n const onVisibility = () => {\n docVisible = !document.hidden\n updateRunning()\n }\n document.addEventListener('visibilitychange', onVisibility)\n\n let contextLost = false\n const onContextLost = (e) => {\n if (e && e.preventDefault) e.preventDefault()\n contextLost = true\n updateRunning()\n emit({ type: 'context_lost' })\n }\n canvas.addEventListener('webglcontextlost', onContextLost)\n\n // ------------------------------------------------------------------ loop\n const clock = new Clock(false)\n let rafId = 0\n let slowTimer = 0\n let perfAcc = 0\n let perfFrames = 0\n let lastStats = { calls: 0, triangles: 0, particles: 0, quality: currentQuality, fps: 0 }\n\n function wake(sec = 0.05) {\n if (disposed) return\n wakeTime = Math.max(wakeTime, elapsed + sec)\n schedule()\n }\n function schedule() {\n if (disposed || !running || rafId) return\n if (slowTimer) {\n clearTimeout(slowTimer)\n slowTimer = 0\n }\n if (!clock.running) {\n clock.start()\n }\n rafId = requestAnimationFrame(frame)\n }\n\n function frame() {\n rafId = 0\n if (disposed || !running) return\n const raw = clock.getDelta()\n realDt = Math.min(raw, MAX_DT)\n const dt = realDt * timeScale\n elapsed += realDt\n let animating = elapsed < wakeTime\n\n // turn script\n if (currentTurn) {\n animating = true\n currentTurn.realT += realDt\n let res\n try {\n res = currentTurn.gen.next(dt)\n } catch (err) {\n if (typeof console !== 'undefined') console.error(err)\n res = { done: true }\n }\n if (res.done || currentTurn.realT > currentTurn.deadline) finishTurn(currentTurn)\n if (!currentTurn) startNextTurn()\n }\n\n // tanks: aim smoothing, recoil, hit flash, damage smoke, blown turrets\n for (const id of tankOrder) {\n const t = tanks.get(id)\n const s = t.state\n let changed = false\n if (s.targetYaw != null && !currentTurn) {\n const dy = wrapPi((s.targetYaw - s.yaw) * DEG) / DEG\n const dp = s.targetPitch - s.pitch\n if (Math.abs(dy) > 0.02 || Math.abs(dp) > 0.02) {\n const k = reducedMotion ? 1 : dampK(14, realDt)\n s.yaw += dy * k\n s.pitch += dp * k\n changed = true\n animating = true\n } else if (aimDirty) {\n s.yaw = s.targetYaw\n s.pitch = s.targetPitch\n changed = true\n }\n }\n if (s.recoil > 0) {\n s.recoil = Math.max(0, s.recoil - dt * 2.2)\n changed = true\n animating = true\n }\n if (s.hitFlash > 0) {\n s.hitFlash = Math.max(0, s.hitFlash - dt * 2.5)\n t.setFlash(s.hitFlash * s.hitFlash * 1.5)\n animating = true\n }\n if (updateBlown(t, dt)) animating = true\n if (changed) {\n t.place(terrain)\n shadowDirty = true\n }\n const lvl = damageLevel(t)\n if (lvl > 0) {\n if (s.blown && lvl >= 2) v1.set(s.x, s.y + 1.4, s.z)\n else t.localToWorld(v1, lvl >= 2 ? -0.5 : -1.8, 1.8, 0)\n fx.emitDamage(v1.x, v1.y, v1.z, dt, lvl, s)\n }\n }\n aimDirty = false\n\n // celebration\n if (celebrateState) {\n const c = celebrateState\n c.t += realDt\n c.next -= realDt\n animating = true\n if (c.next <= 0 && c.t < 5.5) {\n c.next = 0.55\n const t = c.id != null ? tanks.get(c.id) : null\n const cx = t ? t.state.x : mapCenter.x\n const cz = t ? t.state.z : mapCenter.z\n const cy = t ? t.state.y : terrain.heightAt(cx, cz)\n const col = t ? t.team.accent : lin('#ffd36b')\n fx.firework(cx + (Math.random() - 0.5) * 10, cy + 9 + Math.random() * 3, cz + (Math.random() - 0.5) * 10, col)\n }\n if (c.t > 9) {\n celebrateState = null\n }\n }\n\n if (wheelsDirty) syncTankStatics()\n if (fx.update(dt, camera, renderer, animating || !!currentTurn)) animating = true\n if (updateCamera(realDt)) animating = true\n if (fx.hasPreview && cam.mode === 'aim') animating = animating || elapsed < wakeTime\n\n if (shadowDirty && currentQuality === 'high') {\n renderer.shadowMap.needsUpdate = true\n }\n shadowDirty = false\n renderer.render(scene, camera)\n const info = renderer.info.render\n lastStats = {\n calls: info.calls,\n triangles: info.triangles,\n particles: fx.particleCount,\n quality: currentQuality,\n fps: raw > 0 ? Math.round(1 / raw) : 0,\n }\n\n // auto quality: downgrade one tier if animation can't hold ~38 fps\n if (autoQuality && animating && currentQuality !== 'low' && elapsed > 2) {\n perfAcc += Math.min(raw, 0.25)\n perfFrames++\n if (perfFrames >= 90) {\n if (perfAcc / perfFrames > 1 / 38) applyQuality(currentQuality === 'high' ? 'medium' : 'low')\n perfAcc = 0\n perfFrames = 0\n }\n }\n\n if (animating) schedule()\n else if (hasAmbient()) {\n // ambient smoke: throttled ~24 fps\n slowTimer = setTimeout(() => {\n slowTimer = 0\n schedule()\n }, 40)\n } else {\n clock.stop()\n }\n }\n\n function hasAmbient() {\n for (const id of tankOrder) if (damageLevel(tanks.get(id)) > 0) return true\n return fx.particleCount > 0\n }\n\n function updateRunning() {\n const should = !disposed && !contextLost && docVisible && onScreen\n if (should === running) {\n if (should) schedule()\n return\n }\n running = should\n if (should) {\n clock.stop()\n wake(0.1)\n } else {\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n slowTimer = 0\n clock.stop()\n flushTurns() // never leave awaited turns hanging while paused\n }\n }\n\n function applyQuality(q) {\n if (q === currentQuality) return\n currentQuality = q\n renderer.setPixelRatio(pixelRatioFor(q))\n renderer.setSize(width, height, false)\n const hi = q === 'high'\n sun.castShadow = hi\n decor.setQuality(q, world)\n decor.setShadows(hi)\n terrain.mesh.receiveShadow = hi\n for (const t of tanks.values()) {\n t.setQuality(q)\n t.setShadows(hi)\n }\n if (tankShared.wheelMat) {\n tankShared.wheelMat.dispose()\n tankShared.wheelMat = makeWheelMaterial()\n wheels.material = tankShared.wheelMat\n }\n wheels.castShadow = hi\n fx.setQuality(q)\n sun.intensity = q === 'low' ? 1.7 : 1.9\n hemi.intensity = q === 'low' ? 0.55 : 0.6\n wheelsDirty = true\n shadowDirty = true\n wake(0.1)\n }\n // initial quality wiring (applyQuality skips when equal)\n {\n const q = currentQuality\n currentQuality = null\n applyQuality(q)\n }\n\n // ------------------------------------------------------------------ public API\n return {\n setWorld(w) {\n if (disposed || !w) return\n if (currentTurn) {\n // authoritative end state arrives with the turn; keep the latest for afterwards\n if (currentTurn.turn) currentTurn.turn.world = currentTurn.turn.world || w\n return\n }\n const first = !hasWorld\n applyWorld(w)\n if (first) {\n frameOverview()\n if (reducedMotion) cam.snap = true\n else {\n cam.pos.copy(cam.dPos).sub(cam.dTarget).multiplyScalar(1.7).add(cam.dTarget)\n cam.pos.y += 40\n cam.target.copy(cam.dTarget)\n }\n }\n wake(0.2)\n },\n\n setAim({ yaw, pitch, power } = {}) {\n if (disposed || currentTurn) return\n const t = activeId != null ? tanks.get(activeId) : null\n if (!t || !t.state.alive) return\n if (Number.isFinite(yaw)) t.state.targetYaw = yaw\n else if (t.state.targetYaw == null) t.state.targetYaw = t.state.yaw\n if (Number.isFinite(pitch)) t.state.targetPitch = pitch\n else if (t.state.targetPitch == null) t.state.targetPitch = t.state.pitch\n t.state.power = power\n aimDirty = true\n wake(0.6)\n },\n\n setPreview(points) {\n if (disposed) return\n fx.setPreview(points && points.length ? points : null)\n wake(1.5)\n },\n\n playTurn(turn) {\n return new Promise((resolve) => {\n if (disposed || !turn) {\n if (turn && turn.world && !disposed) applyWorld(turn.world, { fromTurn: true })\n resolve()\n return\n }\n const shots = Array.isArray(turn.shots) ? turn.shots : []\n let est = 4 + (Array.isArray(turn.movePath) ? turn.movePath.length * 0.3 : 0)\n for (const s of shots) {\n const n = s && s.samples ? s.samples.length / 3 : 0\n est = Math.max(est, 4 + ((s && s.startMs) || 0) / 1000 + n * SAMPLE_DT)\n }\n est += (Array.isArray(turn.destroyed) ? turn.destroyed.length : 0) * 4\n const rec = { turn, resolve, finished: false, deadline: est * 2 + 6, timer: 0 }\n // wall-clock watchdog (in case rAF never fires while \"visible\")\n rec.timer = setTimeout(() => finishTurn(rec), (est * 2 + 12) * 1000)\n turnQueue.push(rec)\n celebrateState = null\n startNextTurn()\n })\n },\n\n setCameraMode(mode) {\n if (disposed) return\n cam.userMode = mode === 'aim' ? 'aim' : 'overview'\n if (!currentTurn && !celebrateState) setCam(cam.userMode, { tankId: activeId })\n wake(0.2)\n },\n\n setQuality(q) {\n if (disposed) return\n const n = normQ(q)\n autoQuality = false\n if (n) applyQuality(n)\n },\n\n celebrate(winnerId) {\n if (disposed) return\n activeRing.visible = false\n if (winnerId == null || !tanks.has(winnerId)) {\n celebrateState = null\n setCam('overview')\n wake(0.5)\n return\n }\n celebrateState = { id: winnerId, t: 0, next: 0.3 }\n setCam('celebrate', { tankId: winnerId, orbitFromCurrent: true })\n const t = tanks.get(winnerId)\n cam.focus.set(t.state.x, t.state.y, t.state.z)\n cam.orbit = Math.atan2(cam.pos.z - cam.focus.z, cam.pos.x - cam.focus.x)\n wake(0.5)\n },\n\n resize,\n\n getStats() {\n return { ...lastStats }\n },\n\n dispose() {\n if (disposed) return\n flushTurns()\n disposed = true\n running = false\n if (rafId) cancelAnimationFrame(rafId)\n rafId = 0\n if (slowTimer) clearTimeout(slowTimer)\n if (ro) ro.disconnect()\n else window.removeEventListener('resize', resize)\n if (io) io.disconnect()\n document.removeEventListener('visibilitychange', onVisibility)\n canvas.removeEventListener('webglcontextlost', onContextLost)\n for (const id of Array.from(tanks.keys())) removeTank(id)\n wheels.dispose()\n if (tankShared.wheelMat) tankShared.wheelMat.dispose()\n tankShared.dispose()\n tankGeos.dispose()\n blobs.dispose()\n blobGeo.dispose()\n blobMat.dispose()\n blobTex.dispose()\n activeMat.dispose()\n activeTex.dispose()\n fx.dispose()\n decor.dispose()\n terrain.dispose()\n sky.dispose()\n hills.dispose()\n if (sun.shadow && sun.shadow.map) sun.shadow.map.dispose()\n scene.clear()\n renderer.dispose()\n renderer.forceContextLoss()\n if (canvas.parentNode) canvas.parentNode.removeChild(canvas)\n },\n }\n}\n\nexport default createTankScene\n"],"mappings":"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"}
|