{"project":{"id":"e7yOk6D","userId":"davidyarham@gmail.com","username":null,"userPicture":null,"name":"Fun Cube Runner","thumbnail":"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","visible":true,"contributors":"","githubRepo":null,"forkedFrom":null,"tags":"","files":{"folder":"","files":[{"name":"index.html","content":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Untitled</title>\n  <link rel=\"stylesheet\" href=\"style.css\">\n<script type=\"importmap\">\n{\n  \"imports\": {\n    \"three\": \"https://unpkg.com/three@0.160.0/build/three.module.js\",\n    \"three/addons/\": \"https://unpkg.com/three@0.160.0/examples/jsm/\"\n  }\n}\n</script>\n</head>\n<body>\n<div class=\"game-shell\">\n\t<div class=\"hud\">\n\t\t<div class=\"hud__brand\">FUN CUBE RUNNER <span class=\"hud__brand-glow\">⚡</span></div>\n\t\t<div class=\"hud__stats\">\n\t\t\t<div class=\"hud__pill\">Score: <span id=\"score\">0</span></div>\n\t\t\t<div class=\"hud__pill\">Best: <span id=\"best\">0</span></div>\n\t\t\t<div class=\"hud__pill\">Speed: <span id=\"speed\">1.0x</span></div>\n\t\t\t<div class=\"hud__pill\">Combo: <span id=\"combo\">0</span></div>\n\t\t</div>\n\t\t<div class=\"meter\">\n\t\t\t<div class=\"meter__fill\" id=\"boostFill\"></div>\n\t\t</div>\n\t\t<div class=\"hud__hint\">Move: A / D / ← / → · Jump: Space / W / ↑ · Dash: Shift · Grab coins, chain combos, chase\n\t\t\tpower-ups, and survive the speed rush!</div>\n\t\t<div class=\"hud__hint\" id=\"statusText\">Ready to run.</div>\n\t\t<div class=\"hud__hint hud__hint--strong\" id=\"milestoneText\">Hit 50 points for a mini reward.</div>\n\t\t<div class=\"hud__hint\" id=\"pauseText\">Press P to pause</div>\n\t</div>\n\n\t<div id=\"game\"></div>\n\n\t<div class=\"fps-counter\" id=\"fpsCounter\">FPS 60</div>\n\n\t<div class=\"overlay\" id=\"overlay\">\n\t\t<div class=\"overlay__backdrop\"></div>\n\t\t<div class=\"overlay__card overlay__card--welcome\">\n\t\t\t<div class=\"overlay__spark overlay__spark--1\" aria-hidden=\"true\"></div>\n\t\t\t<div class=\"overlay__spark overlay__spark--2\" aria-hidden=\"true\"></div>\n\t\t\t<div class=\"overlay__spark overlay__spark--3\" aria-hidden=\"true\"></div>\n\t\t\t<div class=\"overlay__grid\" aria-hidden=\"true\"></div>\n\t\t\t<div class=\"overlay__eyebrow\">Neon arcade challenge</div>\n\t\t\t<h1>Fun Cube Runner</h1>\n\t\t\t<p class=\"overlay__lead\">Blast through neon lanes, scoop up coins, stack wild combos, and outrun the speed storm\n\t\t\t\tbefore the track eats you alive.</p>\n\t\t\t<div class=\"overlay__features\">\n\t\t\t\t<div class=\"overlay__feature\">\n\t\t\t\t\t<span>← →</span><strong>Snap between lanes</strong><small>Dodge danger fast</small>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"overlay__feature\">\n\t\t\t\t\t<span>Space</span><strong>Double jump</strong><small>Float over chaos</small>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"overlay__feature\">\n\t\t\t\t\t<span>Shift</span><strong>Dash burst</strong><small>Smash your speed meter</small>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"overlay__actions\">\n\t\t\t\t<button id=\"startBtn\" type=\"button\">Launch Run</button>\n\t\t\t\t<div class=\"overlay__subtext\">Keyboard, tap, and swipe ready • chase your best score</div>\n\t\t\t\t<div class=\"overlay__chips\" aria-hidden=\"true\">\n\t\t\t\t\t<span class=\"overlay__chip\">Coins</span>\n\t\t\t\t\t<span class=\"overlay__chip\">Combos</span>\n\t\t\t\t\t<span class=\"overlay__chip\">Boost</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"overlay overlay--hidden\" id=\"gameOver\">\n\t\t<div class=\"overlay__backdrop overlay__backdrop--danger\"></div>\n\t\t<div class=\"overlay__card overlay__card--danger overlay__card--gameover\">\n\t\t\t<div class=\"overlay__spark overlay__spark--danger\" aria-hidden=\"true\"></div>\n\t\t\t<div class=\"overlay__eyebrow\">Run complete</div>\n\t\t\t<div class=\"overlay__burst\" aria-hidden=\"true\"></div>\n\t\t\t<h2>Oof. You crashed.</h2>\n\t\t\t<p class=\"overlay__lead\">Your final score was</p>\n\t\t\t<div class=\"overlay__score\" id=\"finalScoreWrap\"><strong id=\"finalScore\">0</strong></div>\n\t\t\t<div class=\"overlay__actions\">\n\t\t\t\t<button id=\"restartBtn\" type=\"button\">Play Again</button>\n\t\t\t\t<div class=\"overlay__subtext\">Try a cleaner lane switch or save boost for danger zones</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div id=\"mobileControls\" class=\"mobile-controls\" aria-label=\"Mobile game controls\">\n\t\t<div class=\"mobile-controls__left\">\n\t\t\t<button id=\"btnLeft\" class=\"mobile-btn\" type=\"button\" aria-label=\"Move left\">◀</button>\n\t\t\t<button id=\"btnRight\" class=\"mobile-btn\" type=\"button\" aria-label=\"Move right\">▶</button>\n\t\t</div>\n\t\t<div class=\"mobile-controls__right\">\n\t\t\t<button id=\"btnJump\" class=\"mobile-btn mobile-btn--jump\" type=\"button\" aria-label=\"Jump\">Jump</button>\n\t\t\t<button id=\"btnDash\" class=\"mobile-btn mobile-btn--dash\" type=\"button\" aria-label=\"Dash\">Dash</button>\n\t\t</div>\n\t</div>\n</div>\n  <script type=\"module\" src=\"main.js\"></script>\n</body>\n</html>"},{"name":"main.js","content":"import * as THREE from 'three';\nimport {\n\tEffectComposer\n} from 'three/addons/postprocessing/EffectComposer.js';\nimport {\n\tRenderPass\n} from 'three/addons/postprocessing/RenderPass.js';\nimport {\n\tUnrealBloomPass\n} from 'three/addons/postprocessing/UnrealBloomPass.js';\n\nconst mount = document.getElementById('game');\nconst scoreEl = document.getElementById('score');\nconst bestEl = document.getElementById('best');\nconst speedEl = document.getElementById('speed');\nconst comboEl = document.getElementById('combo');\nconst boostFillEl = document.getElementById('boostFill');\nconst statusTextEl = document.getElementById('statusText');\nconst milestoneTextEl = document.getElementById('milestoneText');\nconst pauseTextEl = document.getElementById('pauseText');\nconst finalScoreEl = document.getElementById('finalScore');\nconst overlayEl = document.getElementById('overlay');\nconst gameOverEl = document.getElementById('gameOver');\nconst startBtn = document.getElementById('startBtn');\nconst restartBtn = document.getElementById('restartBtn');\nconst mobileControls = document.getElementById('mobileControls');\nconst btnLeft = document.getElementById('btnLeft');\nconst btnRight = document.getElementById('btnRight');\nconst btnJump = document.getElementById('btnJump');\nconst btnDash = document.getElementById('btnDash');\nconst fpsEl = document.getElementById('fpsCounter');\n\nconst safeText = (el, value) => {\n\tif (el) el.textContent = value;\n};\n\nconst isCoarsePointer = window.matchMedia('(hover: none), (pointer: coarse)').matches;\nconst isMobile = /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent) || isCoarsePointer;\nconst isLowPowerDevice = isCoarsePointer || (navigator.hardwareConcurrency || 4) <= 4;\nlet adaptivePixelRatio = Math.min(window.devicePixelRatio || 1, isLowPowerDevice ? 0.8 : 1);\n\nlet audioCtx;\nlet touchStartX = 0;\nlet touchStartY = 0;\nlet touchMoved = false;\nlet fpsFrames = 0;\nlet fpsTime = 0;\nlet fpsDisplay = 60;\nlet startedOnce = false;\n\nfunction ensureAudio() {\n\tif (!audioCtx) {\n\t\tconst Ctx = window.AudioContext || window.webkitAudioContext;\n\t\tif (!Ctx) return;\n\t\taudioCtx = new Ctx();\n\t}\n\tif (audioCtx.state === 'suspended') audioCtx.resume();\n}\n\nfunction playTone({\n\tfreq = 440,\n\tduration = 0.12,\n\ttype = 'sine',\n\tvolume = 0.05,\n\tslide = 0,\n\tdelay = 0\n}) {\n\tif (!audioCtx) return;\n\tconst start = audioCtx.currentTime + delay;\n\tconst osc = audioCtx.createOscillator();\n\tconst gain = audioCtx.createGain();\n\tosc.type = type;\n\tosc.frequency.setValueAtTime(freq, start);\n\tif (slide) osc.frequency.exponentialRampToValueAtTime(Math.max(40, freq + slide), start + duration);\n\tgain.gain.setValueAtTime(0.0001, start);\n\tgain.gain.exponentialRampToValueAtTime(volume, start + 0.01);\n\tgain.gain.exponentialRampToValueAtTime(0.0001, start + duration);\n\tosc.connect(gain);\n\tgain.connect(audioCtx.destination);\n\tosc.start(start);\n\tosc.stop(start + duration + 0.02);\n}\n\nfunction soundJump() {\n\tplayTone({\n\t\tfreq: 280,\n\t\tduration: 0.12,\n\t\ttype: 'square',\n\t\tvolume: 0.045,\n\t\tslide: 220\n\t});\n\tplayTone({\n\t\tfreq: 420,\n\t\tduration: 0.08,\n\t\ttype: 'triangle',\n\t\tvolume: 0.025,\n\t\tdelay: 0.02,\n\t\tslide: 80\n\t});\n}\n\nfunction soundCoin() {\n\tplayTone({\n\t\tfreq: 880,\n\t\tduration: 0.08,\n\t\ttype: 'triangle',\n\t\tvolume: 0.05,\n\t\tslide: 220\n\t});\n\tplayTone({\n\t\tfreq: 1320,\n\t\tduration: 0.12,\n\t\ttype: 'sine',\n\t\tvolume: 0.04,\n\t\tdelay: 0.05,\n\t\tslide: 120\n\t});\n}\n\nfunction soundCrash() {\n\tplayTone({\n\t\tfreq: 180,\n\t\tduration: 0.22,\n\t\ttype: 'sawtooth',\n\t\tvolume: 0.06,\n\t\tslide: -120\n\t});\n\tplayTone({\n\t\tfreq: 90,\n\t\tduration: 0.28,\n\t\ttype: 'square',\n\t\tvolume: 0.04,\n\t\tdelay: 0.03,\n\t\tslide: -40\n\t});\n}\n\nfunction soundDash() {\n\tplayTone({\n\t\tfreq: 210,\n\t\tduration: 0.09,\n\t\ttype: 'sawtooth',\n\t\tvolume: 0.05,\n\t\tslide: 500\n\t});\n\tplayTone({\n\t\tfreq: 420,\n\t\tduration: 0.08,\n\t\ttype: 'square',\n\t\tvolume: 0.03,\n\t\tdelay: 0.02,\n\t\tslide: 260\n\t});\n}\n\nfunction soundShield() {\n\tplayTone({\n\t\tfreq: 500,\n\t\tduration: 0.12,\n\t\ttype: 'sine',\n\t\tvolume: 0.04,\n\t\tslide: -40\n\t});\n\tplayTone({\n\t\tfreq: 760,\n\t\tduration: 0.15,\n\t\ttype: 'triangle',\n\t\tvolume: 0.03,\n\t\tdelay: 0.03,\n\t\tslide: -30\n\t});\n}\n\nfunction soundMega() {\n\tplayTone({\n\t\tfreq: 520,\n\t\tduration: 0.08,\n\t\ttype: 'square',\n\t\tvolume: 0.03,\n\t\tslide: 280\n\t});\n\tplayTone({\n\t\tfreq: 880,\n\t\tduration: 0.12,\n\t\ttype: 'triangle',\n\t\tvolume: 0.04,\n\t\tdelay: 0.05,\n\t\tslide: 260\n\t});\n}\n\nfunction soundStart() {\n\tplayTone({\n\t\tfreq: 520,\n\t\tduration: 0.08,\n\t\ttype: 'triangle',\n\t\tvolume: 0.035,\n\t\tslide: 80\n\t});\n\tplayTone({\n\t\tfreq: 780,\n\t\tduration: 0.1,\n\t\ttype: 'triangle',\n\t\tvolume: 0.035,\n\t\tdelay: 0.06,\n\t\tslide: 100\n\t});\n}\n\nfunction soundPower() {\n\tplayTone({\n\t\tfreq: 640,\n\t\tduration: 0.08,\n\t\ttype: 'square',\n\t\tvolume: 0.04,\n\t\tslide: 220\n\t});\n\tplayTone({\n\t\tfreq: 980,\n\t\tduration: 0.12,\n\t\ttype: 'triangle',\n\t\tvolume: 0.04,\n\t\tdelay: 0.04,\n\t\tslide: 180\n\t});\n}\n\nlet best = Number(localStorage.getItem('fun-cube-runner-best') || 0);\nsafeText(bestEl, best);\n\nconst scene = new THREE.Scene();\nscene.fog = new THREE.Fog(0x0b1020, 16, 76);\nscene.background = new THREE.Color(0x090e1a);\n\nconst camera = new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 200);\ncamera.position.set(0, 6.2, 10.5);\ncamera.lookAt(0, 1, 0);\n\nconst renderer = new THREE.WebGLRenderer({\n\tantialias: !isLowPowerDevice,\n\talpha: true,\n\tpowerPreference: 'high-performance'\n});\nrenderer.setPixelRatio(adaptivePixelRatio);\nrenderer.setSize(window.innerWidth, window.innerHeight);\nrenderer.shadowMap.enabled = !isLowPowerDevice;\nrenderer.shadowMap.type = THREE.PCFSoftShadowMap;\nrenderer.outputColorSpace = THREE.SRGBColorSpace;\nrenderer.toneMapping = THREE.ACESFilmicToneMapping;\nrenderer.toneMappingExposure = 1.38;\nrenderer.physicallyCorrectLights = true;\nif (mount) mount.appendChild(renderer.domElement);\n\nconst usePostFX = !isLowPowerDevice;\nconst composer = usePostFX ? new EffectComposer(renderer) : null;\nconst renderPass = new RenderPass(scene, camera);\nif (composer) composer.addPass(renderPass);\nconst bloomPass = composer ? new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 0.38, 0.32, 0.4) : null;\nif (bloomPass) {\n\tbloomPass.threshold = 0.12;\n\tbloomPass.strength = 0.34;\n\tbloomPass.radius = 0.28;\n\tcomposer.addPass(bloomPass);\n}\n\nscene.add(new THREE.AmbientLight(0xbdd3ff, 2.05));\n\nconst dirLight = new THREE.DirectionalLight(0xfff2d6, 2.2);\ndirLight.position.set(6, 12, 8);\ndirLight.castShadow = !isLowPowerDevice;\ndirLight.shadow.mapSize.width = 1024;\ndirLight.shadow.mapSize.height = 1024;\ndirLight.shadow.camera.left = -20;\ndirLight.shadow.camera.right = 20;\ndirLight.shadow.camera.top = 20;\ndirLight.shadow.camera.bottom = -20;\nscene.add(dirLight);\n\nconst hemi = new THREE.HemisphereLight(0x6dd5ff, 0x1b2238, 1.45);\nscene.add(hemi);\n\nconst rimLight = new THREE.PointLight(0x7c5cff, 22, 34, 2);\nrimLight.position.set(0, 6, 8);\nscene.add(rimLight);\n\nconst glowLight = new THREE.PointLight(0x37e7ff, 14, 30, 2);\nconst accentLight = new THREE.PointLight(0xff4fd8, 10, 28, 2);\nconst energyBeams = [];\nglowLight.position.set(0, 3, -10);\nscene.add(glowLight);\naccentLight.position.set(0, 4, -24);\nscene.add(accentLight);\n\nfor (let i = 0; i < (isLowPowerDevice ? 1 : 4); i++) {\n\tconst beam = new THREE.Mesh(\n\t\tnew THREE.CylinderGeometry(0.18, 1.1, 22, 12, 1, true),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: i % 2 === 0 ? 0x37e7ff : 0xff4fd8,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.11,\n\t\t\tside: THREE.DoubleSide,\n\t\t\tdepthWrite: false\n\t\t})\n\t);\n\tbeam.position.set(i < 3 ? -8 - i * 4 : 8 + (i - 3) * 4, 8, -32 - i * 10);\n\tbeam.userData.phase = i * 0.9;\n\tenergyBeams.push(beam);\n\tscene.add(beam);\n}\n\nconst skyDome = new THREE.Mesh(\n\tnew THREE.SphereGeometry(90, 32, 32),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0x142041,\n\t\tside: THREE.BackSide,\n\t\ttransparent: true,\n\t\topacity: 1\n\t})\n);\nscene.add(skyDome);\n\nconst horizonGlow = new THREE.Mesh(\n\tnew THREE.CylinderGeometry(18, 30, 20, 40, 1, true),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0x16356e,\n\t\ttransparent: true,\n\t\topacity: 0.22,\n\t\tside: THREE.DoubleSide\n\t})\n);\nhorizonGlow.position.set(0, 7, -42);\nscene.add(horizonGlow);\n\nconst sunGlow = new THREE.Mesh(\n\tnew THREE.CircleGeometry(8, 40),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0xff6aa8,\n\t\ttransparent: true,\n\t\topacity: 0.24\n\t})\n);\nsunGlow.position.set(0, 12, -70);\nscene.add(sunGlow);\n\nconst auroraBands = [];\nfor (let i = 0; i < 2; i++) {\n\tconst aurora = new THREE.Mesh(\n\t\tnew THREE.PlaneGeometry(70, 18),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: i === 1 ? 0xff4fd8 : 0x37e7ff,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.08,\n\t\t\tblending: THREE.AdditiveBlending,\n\t\t\tside: THREE.DoubleSide,\n\t\t\tdepthWrite: false\n\t\t})\n\t);\n\taurora.position.set(0, 14 + i * 3, -52 - i * 6);\n\taurora.rotation.x = -0.24;\n\taurora.userData.phase = i * 1.7;\n\tauroraBands.push(aurora);\n\tscene.add(aurora);\n}\n\nconst laneX = [-3.2, 0, 3.2];\nconst obstacles = [];\nconst coins = [];\nconst particles = [];\nconst stars = [];\nconst fogParticles = [];\nconst skyline = [];\nconst billboards = [];\nconst lanePulseLights = [];\nconst powerUps = [];\nconst trails = [];\nconst laneRings = [];\nconst railLights = [];\nlet shake = 0;\nconst clock = new THREE.Clock();\n\nlet lastObstacleLane = 1;\nlet safeLaneBias = 1;\n\nconst world = {\n\trunning: false,\n\tended: false,\n\tscore: 0,\n\tspeed: 14,\n\tspawnTimer: 0,\n\tcoinTimer: 0,\n\tdistance: 0,\n\tcombo: 0,\n\tcomboTimer: 0,\n\tshield: 0,\n\tshieldFlash: 0,\n\thitFlash: 0,\n\tmagnet: 0,\n\tboost: 0,\n\tdash: 0,\n\tpowerTimer: 0,\n\tjumpsLeft: 2,\n\tboostMeter: 0,\n\tlastGroundHit: 0,\n\tnextMilestone: 50,\n\tdangerPulse: 0,\n\tpaused: false\n};\n\nconst groundGroup = new THREE.Group();\nconst laneGlowBars = [];\nscene.add(groundGroup);\n\nfunction spawnPowerUp() {\n\tconst lane = Math.random() > 0.5 ? safeLaneBias : Math.floor(Math.random() * 3);\n\tconst types = ['shield', 'magnet', 'boost'];\n\tconst type = types[Math.floor(Math.random() * types.length)];\n\tconst colorMap = {\n\t\tshield: 0x65f0ff,\n\t\tmagnet: 0xff66cc,\n\t\tboost: 0x7cff6b\n\t};\n\tconst yMap = {\n\t\tshield: 2.1,\n\t\tmagnet: 2.9,\n\t\tboost: 3.7\n\t};\n\tconst geo = type === 'shield' ?\n\t\tnew THREE.OctahedronGeometry(0.7, 0) :\n\t\ttype === 'magnet' ?\n\t\tnew THREE.TorusKnotGeometry(0.42, 0.14, 24, 6) :\n\t\tnew THREE.ConeGeometry(0.6, 1.3, 5);\n\tconst mesh = new THREE.Mesh(\n\t\tgeo,\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: colorMap[type],\n\t\t\temissive: colorMap[type],\n\t\t\temissiveIntensity: 0.6,\n\t\t\tmetalness: 0.4,\n\t\t\troughness: 0.3\n\t\t})\n\t);\n\tmesh.castShadow = !isLowPowerDevice;\n\tconst edgeFrame = new THREE.LineSegments(\n\t\tnew THREE.EdgesGeometry(new THREE.BoxGeometry(1.9, 1.9, 1.9)),\n\t\tnew THREE.LineBasicMaterial({\n\t\t\tcolor: 0xffb4c5,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.55\n\t\t})\n\t);\n\tmesh.add(edgeFrame);\n\tconst aura = new THREE.Mesh(\n\t\tnew THREE.TorusGeometry(0.95, 0.06, 10, 24),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: colorMap[type],\n\t\t\ttransparent: true,\n\t\t\topacity: 0.52\n\t\t})\n\t);\n\taura.rotation.x = Math.PI / 2;\n\tmesh.add(aura);\n\tconst core = new THREE.Mesh(\n\t\tnew THREE.SphereGeometry(0.18, 10, 10),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xffffff,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.9\n\t\t})\n\t);\n\tmesh.add(core);\n\tconst powerShadow = new THREE.Mesh(\n\t\tnew THREE.CircleGeometry(0.95, 24),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: colorMap[type],\n\t\t\ttransparent: true,\n\t\t\topacity: 0.2\n\t\t})\n\t);\n\tpowerShadow.rotation.x = -Math.PI / 2;\n\tpowerShadow.position.y = -yMap[type] + 0.04;\n\tmesh.add(powerShadow);\n\tmesh.position.set(laneX[lane], yMap[type], -58);\n\tmesh.userData = {\n\t\tlane,\n\t\ttype: 'power' + type[0].toUpperCase() + type.slice(1),\n\t\tkind: type\n\t};\n\tpowerUps.push(mesh);\n\tscene.add(mesh);\n}\n\nfunction updateHud() {\n\tsafeText(comboEl, world.combo);\n\tif (boostFillEl) boostFillEl.style.width = `${Math.min(100, world.boostMeter)}%`;\n\tsafeText(milestoneTextEl, world.score >= world.nextMilestone ? 'Reward ready! Keep moving!' : `Hit ${world.nextMilestone} points for a mini reward.`);\n}\n\nfunction spawnTrail() {\n\tconst trail = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(0.9, 0.9, 0.9),\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: 0x7c5cff,\n\t\t\temissive: 0x2d1d8b,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.4\n\t\t})\n\t);\n\ttrail.position.copy(player.position);\n\ttrail.userData.life = 0.24;\n\ttrails.push(trail);\n\tscene.add(trail);\n}\n\nfunction updateStatusText() {\n\tconst bits = [];\n\tif (world.combo > 1) bits.push(`Combo x${world.combo}`);\n\tif (world.shield > 0) bits.push(`Shield ${Math.ceil(world.shield)}s`);\n\tif (world.magnet > 0) bits.push('Magnet on');\n\tif (world.boost > 0) bits.push('Boost on');\n\tif (world.dash > 0) bits.push('Dashing');\n\tsafeText(statusTextEl, bits.length ? bits.join(' · ') : 'Pink/red blocks are bad. Gold and bright pickups are good.');\n\tupdateHud();\n}\n\nfunction activatePower(kind) {\n\tif (kind === 'shield') {\n\t\tworld.shield = 8;\n\t\tsoundShield();\n\t}\n\tif (kind === 'magnet') {\n\t\tworld.magnet = 8;\n\t\tsoundPower();\n\t}\n\tif (kind === 'boost') {\n\t\tworld.boost = 5;\n\t\tsoundPower();\n\t\tshake = Math.max(shake, 0.18);\n\t}\n\tupdateStatusText();\n}\n\nfunction dash() {\n\tif (!world.running || world.dash > 0) return;\n\tif (world.boostMeter < 35) return;\n\tworld.boostMeter -= 35;\n\tworld.dash = 0.34;\n\tshake = Math.max(shake, 0.16);\n\tsoundDash();\n\tupdateHud();\n\tupdateStatusText();\n}\n\nconst groundMat = new THREE.MeshStandardMaterial({\n\tcolor: 0x1e2854,\n\troughness: 0.34,\n\tmetalness: 0.34,\n\temissive: 0x11193d,\n\temissiveIntensity: 1.05\n});\n\nfor (let i = 0; i < 10; i++) {\n\tconst tile = new THREE.Mesh(new THREE.BoxGeometry(12, 1, 12), groundMat);\n\tconst tileGlow = new THREE.Mesh(\n\t\tnew THREE.PlaneGeometry(11.2, 11.2),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: i % 2 === 0 ? 0x2f76ff : 0x8a4dff,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.09,\n\t\t\tblending: THREE.AdditiveBlending,\n\t\t\tdepthWrite: false\n\t\t})\n\t);\n\ttileGlow.rotation.x = -Math.PI / 2;\n\ttileGlow.position.y = 0.02;\n\ttileGlow.userData.isTileGlow = true;\n\ttile.add(tileGlow);\n\ttile.position.set(0, -0.5, -i * 12);\n\ttile.receiveShadow = !isLowPowerDevice;\n\tgroundGroup.add(tile);\n\n\tconst wallMat = new THREE.MeshStandardMaterial({\n\t\tcolor: 0x202a52,\n\t\temissive: 0x0d1435,\n\t\temissiveIntensity: 0.6,\n\t\tmetalness: 0.2,\n\t\troughness: 0.45\n\t});\n\tconst wallL = new THREE.Mesh(new THREE.BoxGeometry(0.6, 2.2, 12), wallMat);\n\tconst wallR = wallL.clone();\n\twallL.position.set(-6.3, 0.6, -i * 12);\n\twallR.position.set(6.3, 0.6, -i * 12);\n\tgroundGroup.add(wallL, wallR);\n\n\tconst railGeo = new THREE.BoxGeometry(0.12, 0.12, 12);\n\tconst railMatL = new THREE.MeshBasicMaterial({\n\t\tcolor: 0x4ddcff,\n\t\ttransparent: true,\n\t\topacity: 0.75\n\t});\n\tconst railMatR = new THREE.MeshBasicMaterial({\n\t\tcolor: 0xa56bff,\n\t\ttransparent: true,\n\t\topacity: 0.75\n\t});\n\tconst railL = new THREE.Mesh(railGeo, railMatL);\n\tconst railR = new THREE.Mesh(railGeo, railMatR);\n\trailL.position.set(-5.9, 1.28, -i * 12);\n\trailR.position.set(5.9, 1.28, -i * 12);\n\trailL.userData.isRail = true;\n\trailR.userData.isRail = true;\n\trailLights.push(railL, railR);\n\tgroundGroup.add(railL, railR);\n\n\tfor (let p = 0; p < 3; p++) {\n\t\tconst pulse = new THREE.PointLight(p % 2 === 0 ? 0x52e0ff : 0xff4fd8, 1.8, 9, 2);\n\t\tpulse.position.set(p % 2 === 0 ? -5.7 : 5.7, 1.1, -i * 12 + p * 4 - 4);\n\t\tpulse.userData.phase = i * 0.6 + p;\n\t\tlanePulseLights.push(pulse);\n\t\tgroundGroup.add(pulse);\n\t}\n}\n\nfor (let i = 0; i < 10; i++) {\n\tconst bar = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(0.14, 0.03, 3.8),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: i % 2 === 0 ? 0x52e0ff : 0xff4fd8,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.32\n\t\t})\n\t);\n\tbar.position.set(i % 2 === 0 ? -1.6 : 1.6, 0.05, -i * 8);\n\tbar.userData.scroll = true;\n\tlaneGlowBars.push(bar);\n\tgroundGroup.add(bar);\n}\n\nconst laneStripeMat = new THREE.MeshStandardMaterial({\n\tcolor: 0x7ef0ff,\n\temissive: 0x2bd9ff,\n\temissiveIntensity: 1.55,\n\tmetalness: 0.35,\n\troughness: 0.18\n});\nfor (let i = 0; i < (isLowPowerDevice ? 5 : 12); i++) {\n\tlaneX.forEach((x) => {\n\t\tconst stripe = new THREE.Mesh(new THREE.BoxGeometry(0.16, 0.04, 1.3), laneStripeMat);\n\t\tstripe.position.set(x, 0.03, -i * 6);\n\t\tstripe.userData.isStripe = true;\n\t\tgroundGroup.add(stripe);\n\n\t\tif (i < 8) {\n\t\t\tconst ring = new THREE.Mesh(\n\t\t\t\tnew THREE.TorusGeometry(0.9, 0.05, 8, 24),\n\t\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\t\tcolor: 0x4be7ff,\n\t\t\t\t\ttransparent: true,\n\t\t\t\t\topacity: 0.38\n\t\t\t\t})\n\t\t\t);\n\t\t\tring.rotation.x = Math.PI / 2;\n\t\t\tring.position.set(x, 0.06, -i * 15);\n\t\t\tring.userData.isRing = true;\n\t\t\tlaneRings.push(ring);\n\t\t\tgroundGroup.add(ring);\n\t\t}\n\t});\n}\n\nconst player = new THREE.Group();\nscene.add(player);\n\nconst body = new THREE.Mesh(\n\tnew THREE.BoxGeometry(1.3, 1.3, 1.3),\n\tnew THREE.MeshStandardMaterial({\n\t\tcolor: 0xff6f9d,\n\t\troughness: 0.22,\n\t\tmetalness: 0.24,\n\t\temissive: 0x3a0c1d,\n\t\temissiveIntensity: 0.45\n\t})\n);\nbody.castShadow = !isLowPowerDevice;\nplayer.add(body);\n\nconst face = new THREE.Mesh(\n\tnew THREE.BoxGeometry(0.86, 0.56, 0.08),\n\tnew THREE.MeshStandardMaterial({\n\t\tcolor: 0xffe7ef,\n\t\temissive: 0x5a1830,\n\t\temissiveIntensity: 0.65,\n\t\tmetalness: 0.08,\n\t\troughness: 0.35\n\t})\n);\nface.position.set(0, 0.08, 0.69);\nplayer.add(face);\n\nconst eyeGeo = new THREE.BoxGeometry(0.12, 0.12, 0.06);\nconst eyeMat = new THREE.MeshStandardMaterial({\n\tcolor: 0x111111\n});\nconst eyeL = new THREE.Mesh(eyeGeo, eyeMat);\nconst eyeR = new THREE.Mesh(eyeGeo, eyeMat);\neyeL.position.set(-0.2, 0.12, 0.75);\neyeR.position.set(0.2, 0.12, 0.75);\nplayer.add(eyeL, eyeR);\n\nconst playerCore = new THREE.Mesh(\n\tnew THREE.OctahedronGeometry(0.28, 0),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0xffffff,\n\t\ttransparent: true,\n\t\topacity: 0.85\n\t})\n);\nplayerCore.position.set(0, 0.05, 0);\nplayer.add(playerCore);\n\nconst playerAura = new THREE.Mesh(\n\tnew THREE.TorusGeometry(0.95, 0.08, 12, 32),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0xff7fb0,\n\t\ttransparent: true,\n\t\topacity: 0.4\n\t})\n);\nplayerAura.rotation.x = Math.PI / 2;\nplayerAura.position.y = -0.45;\nplayer.add(playerAura);\n\nconst playerShadowGlow = new THREE.Mesh(\n\tnew THREE.CircleGeometry(1.2, 28),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0xff4d8d,\n\t\ttransparent: true,\n\t\topacity: 0.24\n\t})\n);\nplayerShadowGlow.rotation.x = -Math.PI / 2;\nplayerShadowGlow.position.y = -0.64;\nplayer.add(playerShadowGlow);\n\nconst crownGlow = new THREE.Mesh(\n\tnew THREE.TorusGeometry(0.42, 0.04, 10, 24),\n\tnew THREE.MeshBasicMaterial({\n\t\tcolor: 0xffffff,\n\t\ttransparent: true,\n\t\topacity: 0.5\n\t})\n);\ncrownGlow.position.y = 0.95;\ncrownGlow.rotation.x = Math.PI / 2;\nplayer.add(crownGlow);\n\nconst speedWingGeo = new THREE.BoxGeometry(0.08, 0.7, 1.2);\nconst speedWingMat = new THREE.MeshBasicMaterial({\n\tcolor: 0x72e8ff,\n\ttransparent: true,\n\topacity: 0.18,\n\tblending: THREE.AdditiveBlending,\n\tdepthWrite: false\n});\nconst wingL = new THREE.Mesh(speedWingGeo, speedWingMat);\nconst wingR = new THREE.Mesh(speedWingGeo, speedWingMat.clone());\nwingL.position.set(-0.78, 0.05, -0.15);\nwingR.position.set(0.78, 0.05, -0.15);\nwingL.rotation.z = 0.35;\nwingR.rotation.z = -0.35;\nplayer.add(wingL, wingR);\n\nplayer.position.set(0, 1, 4.5);\nplayer.userData = {\n\tlane: 1,\n\ttargetX: 0,\n\tvelocityY: 0,\n\tjumping: false\n};\n\nfunction makeStarfield() {\n\tconst geo = new THREE.SphereGeometry(0.08, 8, 8);\n\tconst mat = new THREE.MeshBasicMaterial({\n\t\tcolor: 0xdff6ff\n\t});\n\tfor (let i = 0; i < (isLowPowerDevice ? 18 : 48); i++) {\n\t\tconst star = new THREE.Mesh(geo, mat);\n\t\tresetStar(star, true);\n\t\tstars.push(star);\n\t\tscene.add(star);\n\t}\n}\n\nfunction resetStar(star, initial = false) {\n\tstar.position.set(\n\t\tTHREE.MathUtils.randFloatSpread(55),\n\t\tTHREE.MathUtils.randFloat(6, 26),\n\t\tinitial ? THREE.MathUtils.randFloat(-80, 10) : THREE.MathUtils.randFloat(-80, -40)\n\t);\n}\nmakeStarfield();\n\nfunction makeSkyline() {\n\tfor (let i = 0; i < (isLowPowerDevice ? 6 : 14); i++) {\n\t\tconst height = THREE.MathUtils.randFloat(6, 20);\n\t\tconst tower = new THREE.Mesh(\n\t\t\tnew THREE.BoxGeometry(1.8, height, 1.8),\n\t\t\tnew THREE.MeshStandardMaterial({\n\t\t\t\tcolor: 0x1a244a,\n\t\t\t\temissive: 0x0d1631,\n\t\t\t\temissiveIntensity: 0.9,\n\t\t\t\tmetalness: 0.35,\n\t\t\t\troughness: 0.55,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.96\n\t\t\t})\n\t\t);\n\t\tconst side = i % 2 === 0 ? -1 : 1;\n\t\ttower.position.set(side * THREE.MathUtils.randFloat(11, 22), height * 0.5 - 1, THREE.MathUtils.randFloat(-95, -18));\n\t\ttower.userData.baseY = tower.position.y;\n\t\ttower.userData.speed = THREE.MathUtils.randFloat(0.4, 1.2);\n\t\tskyline.push(tower);\n\t\tscene.add(tower);\n\n\t\tfor (let w = 0; w < Math.floor(height * 0.9); w++) {\n\t\t\tif (Math.random() > 0.45) continue;\n\t\t\tconst windowStrip = new THREE.Mesh(\n\t\t\t\tnew THREE.PlaneGeometry(0.18, 0.32),\n\t\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\t\tcolor: Math.random() > 0.5 ? 0x63d8ff : 0xb48cff,\n\t\t\t\t\ttransparent: true,\n\t\t\t\t\topacity: 0.56 + Math.random() * 0.22\n\t\t\t\t})\n\t\t\t);\n\t\t\twindowStrip.position.set(0, -height * 0.35 + w * 0.7, 0.92);\n\t\t\ttower.add(windowStrip);\n\t\t}\n\n\t\tconst sign = new THREE.Mesh(\n\t\t\tnew THREE.PlaneGeometry(1.2, 0.34),\n\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\tcolor: side === -1 ? 0x63d8ff : 0xff73d4,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.85,\n\t\t\t\tblending: THREE.AdditiveBlending,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t})\n\t\t);\n\t\tsign.position.set(0, height * 0.28, 0.93);\n\t\ttower.add(sign);\n\t\tbillboards.push(sign);\n\n\t\tconst beam = new THREE.Mesh(\n\t\t\tnew THREE.PlaneGeometry(0.24, height * 0.72),\n\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\tcolor: side === -1 ? 0x53c7ff : 0xa56bff,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.36,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t})\n\t\t);\n\t\tbeam.position.set(0, 0, 0.92);\n\t\ttower.add(beam);\n\t}\n}\nmakeSkyline();\n\nfunction makeFogParticles() {\n\tconst geo = new THREE.PlaneGeometry(2.8, 2.8);\n\tfor (let i = 0; i < 12; i++) {\n\t\tconst puff = new THREE.Mesh(\n\t\t\tgeo,\n\t\t\tnew THREE.MeshBasicMaterial({\n\t\t\t\tcolor: i % 2 === 0 ? 0x52c7ff : 0xb26cff,\n\t\t\t\ttransparent: true,\n\t\t\t\topacity: 0.12,\n\t\t\t\tside: THREE.DoubleSide,\n\t\t\t\tdepthWrite: false\n\t\t\t})\n\t\t);\n\t\tpuff.position.set(\n\t\t\tTHREE.MathUtils.randFloatSpread(26),\n\t\t\tTHREE.MathUtils.randFloat(1.5, 10),\n\t\t\tTHREE.MathUtils.randFloat(-80, -10)\n\t\t);\n\t\tpuff.rotation.z = Math.random() * Math.PI;\n\t\tpuff.userData.speed = THREE.MathUtils.randFloat(0.6, 1.4);\n\t\tfogParticles.push(puff);\n\t\tscene.add(puff);\n\t}\n}\nmakeFogParticles();\n\nfunction spawnObstacle() {\n\tlet lane = Math.floor(Math.random() * 3);\n\tif (Math.random() > 0.45) lane = safeLaneBias === lane ? (lane + 1 + Math.floor(Math.random() * 2)) % 3 : lane;\n\tif (lane === lastObstacleLane && Math.random() > 0.35) lane = (lane + 1 + Math.floor(Math.random() * 2)) % 3;\n\tlastObstacleLane = lane;\n\tconst h = THREE.MathUtils.randFloat(1.4, 3.6);\n\tconst mesh = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(1.8, h, 1.8),\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: 0xff4d6d,\n\t\t\troughness: 0.24,\n\t\t\tmetalness: 0.35,\n\t\t\temissive: 0x4a1020,\n\t\t\temissiveIntensity: 0.9\n\t\t})\n\t);\n\tmesh.castShadow = !isLowPowerDevice;\n\tconst warningRing = new THREE.Mesh(\n\t\tnew THREE.TorusGeometry(1.05, 0.08, 10, 26),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xff9db2,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.5\n\t\t})\n\t);\n\twarningRing.rotation.x = Math.PI / 2;\n\twarningRing.position.y = -h * 0.5 + 0.08;\n\tmesh.add(warningRing);\n\tconst warningBeam = new THREE.Mesh(\n\t\tnew THREE.CylinderGeometry(0.18, 0.45, h + 1.8, 10, 1, true),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xff6f91,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.12,\n\t\t\tside: THREE.DoubleSide\n\t\t})\n\t);\n\twarningBeam.position.y = 0.65;\n\tmesh.add(warningBeam);\n\tconst cap = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(1.15, 0.2, 1.15),\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: 0xffffff,\n\t\t\temissive: 0xffffff,\n\t\t\temissiveIntensity: 0.9\n\t\t})\n\t);\n\tcap.position.y = h * 0.5 + 0.18;\n\tmesh.add(cap);\n\tconst dangerShadow = new THREE.Mesh(\n\t\tnew THREE.CircleGeometry(1.1, 24),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xff4d6d,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.18\n\t\t})\n\t);\n\tdangerShadow.rotation.x = -Math.PI / 2;\n\tdangerShadow.position.y = -h * 0.5 + 0.03;\n\tmesh.add(dangerShadow);\n\tmesh.position.set(laneX[lane], h / 2, -55);\n\tmesh.userData = {\n\t\tlane,\n\t\ttype: 'obstacle',\n\t\th\n\t};\n\tobstacles.push(mesh);\n\tscene.add(mesh);\n}\n\nfunction spawnCoin() {\n\tconst lane = Math.random() > 0.55 ? safeLaneBias : Math.floor(Math.random() * 3);\n\tconst coin = new THREE.Mesh(\n\t\tnew THREE.TorusGeometry(0.52, 0.18, 10, 18),\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: 0xffe27a,\n\t\t\temissive: 0xc88b00,\n\t\t\temissiveIntensity: 1,\n\t\t\tmetalness: 0.92,\n\t\t\troughness: 0.14\n\t\t})\n\t);\n\tcoin.rotation.y = Math.PI / 2;\n\tconst coinInner = new THREE.Mesh(\n\t\tnew THREE.CylinderGeometry(0.22, 0.22, 0.08, 12),\n\t\tnew THREE.MeshStandardMaterial({\n\t\t\tcolor: 0xfff7cf,\n\t\t\temissive: 0xffd84d,\n\t\t\temissiveIntensity: 0.6,\n\t\t\tmetalness: 0.9,\n\t\t\troughness: 0.12\n\t\t})\n\t);\n\tcoinInner.rotation.z = Math.PI / 2;\n\tcoin.add(coinInner);\n\tcoin.rotation.z = Math.PI * 0.08;\n\tconst pickupRing = new THREE.Mesh(\n\t\tnew THREE.TorusGeometry(0.85, 0.05, 8, 22),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xffd84d,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.38\n\t\t})\n\t);\n\tpickupRing.rotation.x = Math.PI / 2;\n\tcoin.add(pickupRing);\n\tconst coinSpark = new THREE.Mesh(\n\t\tnew THREE.SphereGeometry(0.12, 8, 8),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xffffff,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.8\n\t\t})\n\t);\n\tcoinSpark.position.z = 0.15;\n\tcoin.add(coinSpark);\n\tconst coinGlow = new THREE.Mesh(\n\t\tnew THREE.CircleGeometry(0.8, 24),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor: 0xffcf4d,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.22\n\t\t})\n\t);\n\tcoinGlow.rotation.x = -Math.PI / 2;\n\tcoinGlow.position.y = -0.52;\n\tcoin.add(coinGlow);\n\tcoin.position.set(laneX[lane], THREE.MathUtils.randFloat(1.4, 3.8), -55);\n\tconst mega = Math.random() > 0.88;\n\tif (mega) {\n\t\tcoin.scale.setScalar(1.7);\n\t\tcoin.material.emissive.setHex(0xff4fd8);\n\t\tcoin.material.color.setHex(0xff9af0);\n\t\tcoin.material.emissiveIntensity = 1.3;\n\t}\n\tcoin.userData = {\n\t\tlane,\n\t\ttype: mega ? 'megaCoin' : 'coin',\n\t\tvalue: mega ? 20 : 6,\n\t\tcombo: mega ? 3 : 1\n\t};\n\tcoins.push(coin);\n\tscene.add(coin);\n}\n\nfunction burst(position, color, amount = 12) {\n\tfor (let i = 0; i < Math.min(amount, isLowPowerDevice ? 4 : 8); i++) {\n\t\tconst p = new THREE.Mesh(\n\t\t\tnew THREE.SphereGeometry(0.1, 8, 8),\n\t\t\tnew THREE.MeshStandardMaterial({\n\t\t\t\tcolor,\n\t\t\t\temissive: color,\n\t\t\t\temissiveIntensity: 1.2,\n\t\t\t\tmetalness: 0.35,\n\t\t\t\troughness: 0.2\n\t\t\t})\n\t\t);\n\t\tp.position.copy(position);\n\t\tp.userData = {\n\t\t\tvelocity: new THREE.Vector3(\n\t\t\t\tTHREE.MathUtils.randFloatSpread(5),\n\t\t\t\tTHREE.MathUtils.randFloat(1, 5),\n\t\t\t\tTHREE.MathUtils.randFloatSpread(5)\n\t\t\t),\n\t\t\tlife: 0.7 + Math.random() * 0.5\n\t\t};\n\t\tparticles.push(p);\n\t\tscene.add(p);\n\t}\n}\n\nfunction setScore(v) {\n\tworld.score = v;\n\twhile (world.score >= world.nextMilestone) {\n\t\tworld.boostMeter = Math.min(100, world.boostMeter + 20);\n\t\tworld.shield = Math.max(world.shield, 1.8);\n\t\tworld.nextMilestone += 50;\n\t\tshake = Math.max(shake, 0.12);\n\t\tsoundPower();\n\t\tsafeText(milestoneTextEl, 'Mini reward! Shield + boost energy!');\n\t}\n\tsafeText(scoreEl, Math.floor(world.score));\n\tif (world.score > best) {\n\t\tbest = Math.floor(world.score);\n\t\tlocalStorage.setItem('fun-cube-runner-best', String(best));\n\t\tsafeText(bestEl, best);\n\t}\n\tupdateHud();\n}\n\nfunction clearActiveObjects() {\n\t[...obstacles, ...coins, ...powerUps, ...particles, ...trails].forEach((item) => scene.remove(item));\n\tobstacles.length = 0;\n\tcoins.length = 0;\n\tpowerUps.length = 0;\n\tparticles.length = 0;\n\ttrails.length = 0;\n}\n\nfunction startGame() {\n\tensureAudio();\n\tsoundStart();\n\tstartedOnce = true;\n\tworld.running = true;\n\tworld.ended = false;\n\tworld.speed = 16;\n\tworld.spawnTimer = 0;\n\tworld.coinTimer = 0;\n\tworld.distance = 0;\n\tworld.combo = 0;\n\tworld.comboTimer = 0;\n\tworld.shield = 0;\n\tworld.shieldFlash = 0;\n\tworld.hitFlash = 0;\n\tworld.magnet = 0;\n\tworld.boost = 0;\n\tworld.dash = 0;\n\tworld.powerTimer = 0;\n\tworld.jumpsLeft = 2;\n\tworld.boostMeter = 0;\n\tworld.lastGroundHit = 0;\n\tsafeLaneBias = 1;\n\tlastObstacleLane = 1;\n\tsafeText(statusTextEl, 'Go go go!');\n\tworld.nextMilestone = 50;\n\tworld.dangerPulse = 0;\n\tworld.paused = false;\n\tsafeText(pauseTextEl, 'Press P to pause');\n\tsafeText(milestoneTextEl, 'Hit 50 points for a mini reward.');\n\tupdateHud();\n\tsetScore(0);\n\n\tplayer.position.set(0, 1, 4.5);\n\tplayer.rotation.set(0, 0, 0);\n\tplayer.scale.set(1, 1, 1);\n\tplayer.userData.lane = 1;\n\tplayer.userData.targetX = 0;\n\tplayer.userData.velocityY = 0;\n\tplayer.userData.jumping = false;\n\tclearActiveObjects();\n\n\tif (overlayEl) overlayEl.classList.add('overlay--hidden');\n\tif (gameOverEl) gameOverEl.classList.add('overlay--hidden');\n}\n\nfunction endGame() {\n\tsoundCrash();\n\tsafeText(statusTextEl, 'Crashed! Tap Play Again and try a different lane.');\n\tworld.running = false;\n\tworld.ended = true;\n\tsafeText(finalScoreEl, Math.floor(world.score));\n\tif (gameOverEl) gameOverEl.classList.remove('overlay--hidden');\n\tburst(player.position.clone(), 0xff5d8f, 20);\n}\n\nfunction moveLane(dir) {\n\tif (!world.running || world.paused) return;\n\tplayer.userData.lane = THREE.MathUtils.clamp(player.userData.lane + dir, 0, 2);\n\tplayer.userData.targetX = laneX[player.userData.lane];\n}\n\nfunction jump() {\n\tif (!world.running || world.paused) return;\n\tif (world.jumpsLeft <= 0) return;\n\tplayer.userData.jumping = true;\n\tplayer.userData.velocityY = world.jumpsLeft === 2 ? 9.8 : 8.7;\n\tworld.jumpsLeft -= 1;\n\tsoundJump();\n\tupdateStatusText();\n}\n\nwindow.addEventListener('keydown', (e) => {\n\tif (['ArrowLeft', 'a', 'A'].includes(e.key)) moveLane(-1);\n\tif (['ArrowRight', 'd', 'D'].includes(e.key)) moveLane(1);\n\tif (['ArrowUp', 'w', 'W', ' '].includes(e.key)) {\n\t\te.preventDefault();\n\t\tjump();\n\t}\n\tif (e.key === 'Shift') dash();\n\tif (['p', 'P'].includes(e.key) && world.running) {\n\t\tworld.paused = !world.paused;\n\t\tsafeText(pauseTextEl, world.paused ? 'Paused — press P to resume' : 'Press P to pause');\n\t}\n\tif (e.key === 'Enter' && !world.running) startGame();\n}, {\n\tpassive: false\n});\n\nif (startBtn) startBtn.addEventListener('click', startGame);\nif (restartBtn) restartBtn.addEventListener('click', startGame);\n\nfunction bindMobileButton(btn, handler) {\n\tif (!btn) return;\n\tbtn.addEventListener('pointerdown', (e) => {\n\t\te.preventDefault();\n\t\tensureAudio();\n\t\thandler();\n\t}, {\n\t\tpassive: false\n\t});\n}\n\nbindMobileButton(btnLeft, () => moveLane(-1));\nbindMobileButton(btnRight, () => moveLane(1));\nbindMobileButton(btnJump, () => jump());\nbindMobileButton(btnDash, () => dash());\n\nif (mount) {\n\tmount.addEventListener('pointerdown', (e) => {\n\t\tif (!isCoarsePointer) return;\n\t\ttouchStartX = e.clientX;\n\t\ttouchStartY = e.clientY;\n\t\ttouchMoved = false;\n\t}, {\n\t\tpassive: true\n\t});\n\n\tmount.addEventListener('pointermove', (e) => {\n\t\tif (!isCoarsePointer) return;\n\t\tconst dx = e.clientX - touchStartX;\n\t\tconst dy = e.clientY - touchStartY;\n\t\tif (Math.abs(dx) > 20 || Math.abs(dy) > 20) touchMoved = true;\n\t}, {\n\t\tpassive: true\n\t});\n\n\tmount.addEventListener('pointerup', (e) => {\n\t\tif (!isCoarsePointer) return;\n\t\tconst dx = e.clientX - touchStartX;\n\t\tconst dy = e.clientY - touchStartY;\n\t\tconst absX = Math.abs(dx);\n\t\tconst absY = Math.abs(dy);\n\n\t\tif (!world.running && !world.ended) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!world.running) return;\n\n\t\tif (absX < 14 && absY < 14 && !touchMoved) {\n\t\t\tjump();\n\t\t\treturn;\n\t\t}\n\n\t\tif (absX > absY) {\n\t\t\tif (dx > 24) moveLane(1);\n\t\t\telse if (dx < -24) moveLane(-1);\n\t\t} else {\n\t\t\tif (dy < -24) jump();\n\t\t\telse if (dy > 28) dash();\n\t\t}\n\t}, {\n\t\tpassive: true\n\t});\n}\n\nif (mobileControls) {\n\tmobileControls.style.display = isCoarsePointer ? 'flex' : '';\n}\n\nfunction updateGround(speed, dt) {\n\tgroundGroup.children.forEach((tile, index) => {\n\t\ttile.position.z += speed * dt;\n\t\tif (tile.userData.scroll) tile.material.opacity = 0.14 + Math.sin((tile.position.z + index) * 0.12) * 0.08;\n\t\tif (tile.userData.isRing) tile.material.opacity = 0.18 + Math.sin(tile.position.z * 0.08) * 0.1;\n\t\tif (tile.userData.isRail) tile.material.opacity = 0.55 + Math.sin(tile.position.z * 0.05) * 0.18;\n\t\tif (tile.position.z > 14) tile.position.z -= 120;\n\t\tif (tile.userData.scroll && tile.position.z > 12) tile.position.z -= 128;\n\t\tif (tile.userData.isStripe && tile.position.z > 10) tile.position.z -= 120;\n\t});\n}\n\nfunction updatePlayer(dt, elapsed) {\n\tconst dashFactor = world.dash > 0 ? 3.2 : 1;\n\tplayer.position.x = THREE.MathUtils.lerp(player.position.x, player.userData.targetX, 13 * dt * dashFactor);\n\n\tplayer.userData.velocityY -= 22 * dt;\n\tplayer.position.y += player.userData.velocityY * dt;\n\n\tif (player.position.y <= 1) {\n\t\tif (player.userData.jumping && world.lastGroundHit <= 0) {\n\t\t\tshake = Math.max(shake, 0.05);\n\t\t\tworld.lastGroundHit = 0.12;\n\t\t}\n\t\tplayer.position.y = 1;\n\t\tplayer.userData.velocityY = 0;\n\t\tplayer.userData.jumping = false;\n\t\tworld.jumpsLeft = 2;\n\t}\n\tif (world.dash > 0) {\n\t\tworld.dash -= dt;\n\t\tif (Math.random() > 0.82) spawnTrail();\n\t}\n\tbody.rotation.x = Math.sin(elapsed * 10) * 0.08;\n\tface.rotation.x = Math.sin(elapsed * 6) * 0.03;\n\teyeL.scale.y = 0.9 + Math.abs(Math.sin(elapsed * 3.4)) * 0.18;\n\teyeR.scale.y = eyeL.scale.y;\n\tbody.rotation.y = world.magnet > 0 ? elapsed * 8 : 0;\n\tconst shieldPulse = world.shield > 0 ? 0.28 + Math.abs(Math.sin(elapsed * 10)) * 0.2 : 0;\n\tconst impactPulse = world.shieldFlash * 0.45 + world.hitFlash * 0.35;\n\tplayerAura.material.opacity = 0.18 + (world.shield > 0 ? shieldPulse : 0.1) + Math.sin(elapsed * 8) * 0.04 + impactPulse;\n\tplayerAura.material.color.setHex(world.shield > 0 ? (world.shieldFlash > 0.1 ? 0xffffff : 0x65f0ff) : world.boost > 0 ? 0x7cff6b : 0xff7fb0);\n\tplayerAura.scale.setScalar(1 + Math.sin(elapsed * 6) * 0.05 + (world.dash > 0 ? 0.18 : 0) + world.shieldFlash * 0.2);\n\tplayerShadowGlow.material.opacity = 0.12 + (world.dash > 0 ? 0.14 : 0.04) + world.shieldFlash * 0.14;\n\tcrownGlow.material.opacity = 0.2 + Math.abs(Math.sin(elapsed * 7)) * 0.22 + world.shieldFlash * 0.25;\n\tplayerCore.material.opacity = 0.45 + Math.abs(Math.sin(elapsed * 9)) * 0.22 + (world.boost > 0 ? 0.18 : 0) + world.shieldFlash * 0.25;\n\tplayerCore.scale.setScalar(0.9 + Math.abs(Math.sin(elapsed * 8)) * 0.16 + (world.dash > 0 ? 0.16 : 0));\n\twingL.material.opacity = 0.1 + (world.dash > 0 ? 0.32 : 0.04) + (world.boost > 0 ? 0.12 : 0);\n\twingR.material.opacity = wingL.material.opacity;\n\twingL.scale.z = 1 + (world.dash > 0 ? 1.3 : 0.1);\n\twingR.scale.z = wingL.scale.z;\n\tcrownGlow.material.color.setHex(world.shield > 0 ? (world.shieldFlash > 0.1 ? 0xffffff : 0x8cf6ff) : 0xffffff);\n\tcrownGlow.rotation.z += dt * (0.9 + world.shieldFlash * 3.2);\n\tbody.material.emissiveIntensity = 0.45 + shieldPulse * 0.6 + world.hitFlash * 0.9;\n\tface.material.emissiveIntensity = 0.65 + world.hitFlash * 1.1;\n\tbody.material.color.setHex(world.hitFlash > 0.2 ? 0xffffff : 0xff6f9d);\n\tplayer.rotation.z = (player.userData.targetX - player.position.x) * -0.08;\n\tplayer.rotation.x = player.userData.jumping ? -player.userData.velocityY * 0.03 : 0;\n\tif (world.lastGroundHit > 0) world.lastGroundHit -= dt;\n\tconst squash = player.userData.jumping ? 1.04 : 1 - Math.max(0, world.lastGroundHit) * 1.6;\n\tplayer.scale.set(1 + (1 - squash) * 0.7, squash, 1 + (1 - squash) * 0.35);\n\tconst sx = shake > 0 ? THREE.MathUtils.randFloatSpread(shake) : 0;\n\tconst sy = shake > 0 ? THREE.MathUtils.randFloatSpread(shake * 0.6) : 0;\n\tcamera.position.x = THREE.MathUtils.lerp(camera.position.x, player.position.x * 0.35 + sx, 4 * dt);\n\tcamera.position.y = THREE.MathUtils.lerp(camera.position.y, 6.2 + player.position.y * 0.12 + sy, 4 * dt);\n\tcamera.fov = THREE.MathUtils.lerp(camera.fov, 65 + Math.min(10, Math.max(0, world.speed - 16) * 0.6) + (world.dash > 0 ? 5 : 0), 4 * dt);\n\tcamera.updateProjectionMatrix();\n\tcamera.lookAt(player.position.x, 1.5, -4);\n}\n\nfunction collide(a, b, padY = 0.9) {\n\treturn Math.abs(a.position.x - b.position.x) < 1.2 && Math.abs(a.position.z - b.position.z) < 1.15 && Math.abs(a.position.y - b.position.y) < padY;\n}\n\nfunction updateObjects(dt, elapsed) {\n\tshake = Math.max(0, shake - dt * 1.2);\n\tif (world.comboTimer > 0) world.comboTimer -= dt;\n\telse world.combo = 0;\n\tif (world.shield > 0) world.shield -= dt;\n\tworld.shieldFlash = Math.max(0, world.shieldFlash - dt * 3.4);\n\tworld.hitFlash = Math.max(0, world.hitFlash - dt * 4.4);\n\tif (world.magnet > 0) world.magnet -= dt;\n\tif (world.boost > 0) world.boost -= dt;\n\tworld.spawnTimer += dt;\n\tworld.coinTimer += dt;\n\tconst effectiveSpeed = world.speed + (world.boost > 0 ? 9 : 0) + (world.dash > 0 ? 7 : 0);\n\tworld.distance += effectiveSpeed * dt;\n\tworld.speed += dt * (world.score < 120 ? 0.42 : 0.34);\n\tsafeLaneBias = player.userData.lane;\n\tworld.dangerPulse = Math.max(0, world.dangerPulse - dt * 1.8);\n\tsafeText(speedEl, `${(effectiveSpeed / 14).toFixed(1)}x${world.shield > 0 ? ` 🛡${Math.ceil(world.shield)}` : ''}${world.magnet > 0 ? ' 🧲' : ''}${world.boost > 0 ? ' ⚡' : ''}`);\n\tif (statusTextEl) statusTextEl.style.color = world.dangerPulse > 0.1 ? '#ff9db2' : '#fff2a8';\n\tif (mount) mount.style.filter = world.shield > 0 ? `drop-shadow(0 0 ${10 + world.shieldFlash * 18}px rgba(120,240,255,0.35))` : 'none';\n\n\tif (world.spawnTimer > Math.max(0.26, 0.86 - world.speed * 0.02)) {\n\t\tworld.spawnTimer = 0;\n\t\tspawnObstacle();\n\t\tif (Math.random() > 0.42) spawnCoin();\n\t\tif (Math.random() > 0.88) spawnCoin();\n\t}\n\tif (world.coinTimer > 0.85) {\n\t\tworld.coinTimer = 0;\n\t\tif (Math.random() > 0.35) spawnCoin();\n\t}\n\n\tworld.powerTimer += dt;\n\tif (world.powerTimer > 5.2) {\n\t\tworld.powerTimer = 0;\n\t\tif (Math.random() > 0.3) spawnPowerUp();\n\t}\n\n\tfor (let i = obstacles.length - 1; i >= 0; i--) {\n\t\tconst o = obstacles[i];\n\t\to.position.z += effectiveSpeed * dt;\n\t\to.rotation.x = 0;\n\t\to.rotation.y = 0;\n\t\to.material.emissiveIntensity = 0.85 + Math.abs(Math.sin(elapsed * 5 + i)) * 0.55;\n\t\tif (o.children[0]) o.children[0].material.opacity = 0.32 + Math.sin(elapsed * 7 + i) * 0.18;\n\t\tif (o.children[1]) o.children[1].material.opacity = 0.08 + Math.sin(elapsed * 9 + i) * 0.05;\n\t\tif (o.children[3]) o.children[3].material.opacity = 0.12 + Math.sin(elapsed * 8 + i) * 0.08;\n\t\tif (Math.abs(player.position.z - o.position.z) < 6) world.dangerPulse = Math.max(world.dangerPulse, 1);\n\t\tif (collide(player, o, 1.15) && player.position.y < o.userData.h + 0.35) {\n\t\t\tif (world.shield > 0 || world.dash > 0) {\n\t\t\t\tburst(o.position.clone(), world.shield > 0 ? 0x65f0ff : 0xffffff, 14);\n\t\t\t\tburst(player.position.clone().add(new THREE.Vector3(0, 0.4, 0)), 0xffffff, 10);\n\t\t\t\tsoundShield();\n\t\t\t\tshake = Math.max(shake, 0.22);\n\t\t\t\tworld.shieldFlash = 1;\n\t\t\t\tworld.dangerPulse = 1;\n\t\t\t\tworld.hitFlash = 1;\n\t\t\t\tif (world.shield > 0) world.shield = Math.max(0, world.shield - 2.5);\n\t\t\t\tscene.remove(o);\n\t\t\t\tobstacles.splice(i, 1);\n\t\t\t\tsetScore(world.score + 4 + world.combo);\n\t\t\t\tworld.boostMeter = Math.min(100, world.boostMeter + 12);\n\t\t\t\tupdateHud();\n\t\t\t\tupdateStatusText();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tendGame();\n\t\t\treturn;\n\t\t}\n\n\t\tif (o.position.z > 12) {\n\t\t\tscene.remove(o);\n\t\t\tobstacles.splice(i, 1);\n\t\t\tsetScore(world.score + 1 + Math.floor(world.combo * 0.5));\n\t\t}\n\t}\n\n\tfor (let i = coins.length - 1; i >= 0; i--) {\n\t\tconst c = coins[i];\n\t\tc.position.z += effectiveSpeed * dt;\n\t\tif (world.magnet > 0) {\n\t\t\tc.position.x = THREE.MathUtils.lerp(c.position.x, player.position.x, 2.8 * dt);\n\t\t\tc.position.y = THREE.MathUtils.lerp(c.position.y, player.position.y + 0.6, 2.8 * dt);\n\t\t}\n\t\tc.rotation.x += dt * 7;\n\t\tc.rotation.y += dt * 5;\n\t\tc.position.y += Math.sin(elapsed * 8 + i) * dt * 1.5;\n\t\tc.material.emissiveIntensity = c.userData.type === 'megaCoin' ? 1.15 + Math.sin(elapsed * 10 + i) * 0.35 : 0.9 + Math.sin(elapsed * 8 + i) * 0.2;\n\t\tif (c.children[0]) c.children[0].material.opacity = 0.22 + Math.sin(elapsed * 9 + i) * 0.12;\n\t\tif (c.children[1]) c.children[1].material.opacity = 0.15 + Math.sin(elapsed * 7 + i) * 0.08;\n\n\t\tif (collide(player, c, 1.4)) {\n\t\t\tif (c.userData.type === 'megaCoin') soundMega();\n\t\t\telse soundCoin();\n\t\t\tburst(c.position.clone(), c.userData.type === 'megaCoin' ? 0xff4fd8 : 0xffd84d, c.userData.type === 'megaCoin' ? 18 : 10);\n\t\t\tscene.remove(c);\n\t\t\tcoins.splice(i, 1);\n\t\t\tworld.combo += c.userData.combo;\n\t\t\tworld.comboTimer = 3;\n\t\t\tworld.boostMeter = Math.min(100, world.boostMeter + (c.userData.type === 'megaCoin' ? 28 : 10));\n\t\t\tshake = Math.max(shake, 0.05 + world.combo * 0.01);\n\t\t\tsetScore(world.score + c.userData.value + world.combo * 2);\n\t\t\tupdateStatusText();\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (c.position.z > 12) {\n\t\t\tscene.remove(c);\n\t\t\tcoins.splice(i, 1);\n\t\t}\n\t}\n\n\tfor (let i = powerUps.length - 1; i >= 0; i--) {\n\t\tconst p = powerUps[i];\n\t\tp.position.z += effectiveSpeed * dt;\n\t\tp.rotation.x += dt * 2.2;\n\t\tp.rotation.y += dt * 3.6;\n\t\tp.position.y = 2.1 + Math.sin(elapsed * 5 + i) * 0.35;\n\t\tp.material.emissiveIntensity = 0.45 + Math.sin(elapsed * 8 + i) * 0.18;\n\t\tif (p.children[0]) p.children[0].material.opacity = 0.26 + Math.sin(elapsed * 9 + i) * 0.12;\n\t\tif (p.children[1]) p.children[1].material.opacity = 0.14 + Math.sin(elapsed * 7 + i) * 0.06;\n\n\t\tif (collide(player, p, 1.8)) {\n\t\t\tactivatePower(p.userData.kind);\n\t\t\tburst(p.position.clone(), p.material.color.getHex(), 16);\n\t\t\tscene.remove(p);\n\t\t\tpowerUps.splice(i, 1);\n\t\t\tsetScore(world.score + 12);\n\t\t\tworld.boostMeter = Math.min(100, world.boostMeter + 18);\n\t\t\tupdateStatusText();\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (p.position.z > 12) {\n\t\t\tscene.remove(p);\n\t\t\tpowerUps.splice(i, 1);\n\t\t}\n\t}\n}\n\nfunction updateTrails(dt) {\n\tfor (let i = trails.length - 1; i >= 0; i--) {\n\t\tconst t = trails[i];\n\t\tt.userData.life -= dt;\n\t\tt.material.opacity = Math.max(0, t.userData.life * 1.6);\n\t\tt.scale.multiplyScalar(0.96);\n\t\tif (t.userData.life <= 0) {\n\t\t\tscene.remove(t);\n\t\t\ttrails.splice(i, 1);\n\t\t}\n\t}\n}\n\nfunction updateParticles(dt) {\n\tfor (let i = particles.length - 1; i >= 0; i--) {\n\t\tconst p = particles[i];\n\t\tp.userData.life -= dt;\n\t\tp.position.addScaledVector(p.userData.velocity, dt);\n\t\tp.userData.velocity.y -= 8 * dt;\n\t\tp.scale.setScalar(Math.max(0.01, p.userData.life * 1.2));\n\t\tp.material.opacity = Math.max(0, p.userData.life * 1.4);\n\t\tif (p.userData.life <= 0) {\n\t\t\tscene.remove(p);\n\t\t\tparticles.splice(i, 1);\n\t\t}\n\t}\n}\n\nfunction updateFog(dt, elapsed) {\n\tfogParticles.forEach((puff, i) => {\n\t\tpuff.position.z += (world.running && !world.paused ? world.speed * 0.34 : 1.2) * dt * puff.userData.speed;\n\t\tpuff.position.x += Math.sin(elapsed * 0.4 + i) * dt * 0.5;\n\t\tpuff.material.opacity = 0.04 + Math.abs(Math.sin(elapsed * 0.7 + i)) * 0.06;\n\t\tpuff.lookAt(camera.position);\n\t\tif (puff.position.z > 10) {\n\t\t\tpuff.position.z = THREE.MathUtils.randFloat(-80, -30);\n\t\t\tpuff.position.x = THREE.MathUtils.randFloatSpread(26);\n\t\t\tpuff.position.y = THREE.MathUtils.randFloat(1.5, 10);\n\t\t}\n\t});\n}\n\nfunction updateAurora(elapsed) {\n\tauroraBands.forEach((band, i) => {\n\t\tband.position.x = Math.sin(elapsed * 0.22 + i) * (4 + i * 2);\n\t\tband.material.opacity = 0.05 + Math.abs(Math.sin(elapsed * 0.7 + band.userData.phase)) * 0.06 + (world.boost > 0 ? 0.03 : 0);\n\t\tband.rotation.z = Math.sin(elapsed * 0.18 + i) * 0.08;\n\t});\n}\n\nfunction updateEnergyBeams(dt, elapsed) {\n\tenergyBeams.forEach((beam, i) => {\n\t\tbeam.rotation.y += dt * (0.08 + i * 0.01);\n\t\tbeam.material.opacity = 0.05 + Math.abs(Math.sin(elapsed * 1.6 + beam.userData.phase)) * 0.06 + (world.boost > 0 ? 0.03 : 0);\n\t\tbeam.scale.x = 1 + Math.sin(elapsed * 1.4 + i) * 0.08;\n\t\tbeam.scale.z = 1 + Math.cos(elapsed * 1.2 + i) * 0.08;\n\t});\n}\n\nfunction updateSkyline(dt, elapsed) {\n\tbillboards.forEach((sign, i) => {\n\t\tsign.material.opacity = 0.5 + Math.abs(Math.sin(elapsed * 2.4 + i)) * 0.35;\n\t\tsign.scale.x = 0.92 + Math.abs(Math.sin(elapsed * 1.8 + i)) * 0.18;\n\t});\n\tskyline.forEach((tower, i) => {\n\t\ttower.position.z += (world.running && !world.paused ? world.speed * 0.42 : 1.5) * dt * tower.userData.speed;\n\t\ttower.position.y = tower.userData.baseY + Math.sin(elapsed * 0.5 + i) * 0.08;\n\t\tif (tower.position.z > 18) tower.position.z = THREE.MathUtils.randFloat(-95, -55);\n\t});\n}\n\nfunction updateStars(dt) {\n\tstars.forEach((star, i) => {\n\t\tstar.position.z += world.running ? world.speed * dt * 1.15 : dt * 2;\n\t\tstar.position.x += Math.sin((star.position.z + i) * 0.08) * dt * 0.15;\n\t\tstar.scale.setScalar(0.7 + Math.abs(Math.sin((star.position.z + i) * 0.15)) * 0.9);\n\t\tif (star.position.z > 12) resetStar(star);\n\t});\n}\n\nfunction animate() {\n\trequestAnimationFrame(animate);\n\tconst dt = Math.min(clock.getDelta(), 0.033);\n\tconst elapsed = clock.elapsedTime;\n\n\tupdateStars(world.paused ? 0 : dt);\n\tupdateSkyline(world.paused ? 0 : dt, elapsed);\n\tupdateFog(world.paused ? 0 : dt, elapsed);\n\tupdateEnergyBeams(world.paused ? 0 : dt, elapsed);\n\tupdateAurora(elapsed);\n\tskyDome.material.color.setHSL(0.62 + Math.sin(elapsed * 0.08) * 0.02, 0.45, 0.12 + Math.sin(elapsed * 0.12) * 0.015);\n\thorizonGlow.material.opacity = 0.16 + Math.sin(elapsed * 0.9) * 0.04;\n\tsunGlow.material.opacity = 0.14 + Math.sin(elapsed * 1.2) * 0.04;\n\tsunGlow.scale.setScalar(1 + Math.sin(elapsed * 0.8) * 0.03 + (world.boost > 0 ? 0.03 : 0));\n\tdirLight.intensity = 2.1 + Math.sin(elapsed * 0.7) * 0.18;\n\trimLight.position.x = Math.sin(elapsed * 1.3) * 4;\n\trimLight.position.y = 5 + Math.sin(elapsed * 0.8) * 1.2;\n\trimLight.intensity = 16 + Math.sin(elapsed * 2.2) * 3 + (world.dash > 0 ? 4 : 0);\n\tglowLight.position.z = -10 + Math.sin(elapsed * 1.6) * 6;\n\taccentLight.position.x = Math.sin(elapsed * 1.1) * 5;\n\taccentLight.position.z = -24 + Math.cos(elapsed * 1.4) * 8;\n\taccentLight.intensity = 6 + Math.abs(Math.sin(elapsed * 2.6)) * 2.4 + (world.shield > 0 ? 2.2 : 0);\n\tglowLight.intensity = 11 + Math.sin(elapsed * 3) * 3 + (world.boost > 0 ? 3.5 : 0);\n\trenderer.toneMappingExposure = 1.32 + (world.boost > 0 ? 0.1 : 0) + (world.dash > 0 ? 0.06 : 0) + world.hitFlash * 0.05;\n\tif (bloomPass) {\n\t\tbloomPass.strength = isLowPowerDevice ? 0 : 0.18 + (world.boost > 0 ? 0.08 : 0) + (world.dash > 0 ? 0.04 : 0) + world.shieldFlash * 0.06;\n\t\tbloomPass.radius = isLowPowerDevice ? 0 : 0.18 + (world.boost > 0 ? 0.02 : 0);\n\t}\n\themi.intensity = 1.35 + Math.sin(elapsed * 0.6) * 0.08;\n\tupdateGround(world.running && !world.paused ? world.speed : 8, dt);\n\n\tif (world.running && !world.paused) {\n\t\tupdatePlayer(dt, elapsed);\n\t\tupdateObjects(dt, elapsed);\n\t} else if (!world.ended && !world.running) {\n\t\tplayer.rotation.y += dt * 0.8;\n\t\tplayer.position.y = 1 + Math.sin(elapsed * 2.2) * 0.18;\n\t\tcamera.lookAt(0, 1.4, 0);\n\t}\n\n\tupdateTrails(dt);\n\tupdateParticles(dt);\n\tif (world.shieldFlash > 0 || world.hitFlash > 0) {\n\t\tscene.fog.color.lerpColors(\n\t\t\tnew THREE.Color(0x0b1020),\n\t\t\tnew THREE.Color(world.shield > 0 ? 0xa8f7ff : 0xffffff),\n\t\t\tMath.min(0.45, world.shieldFlash * 0.35 + world.hitFlash * 0.25)\n\t\t);\n\t\tif (sunGlow) sunGlow.material.opacity = 0.14 + world.shieldFlash * 0.12;\n\t} else {\n\t\tscene.fog.color.set(0x0b1020);\n\t\tif (sunGlow) sunGlow.material.opacity = 0.14 + Math.sin(elapsed * 1.2) * 0.04;\n\t}\n\tfor (let i = 0; i < lanePulseLights.length; i += 2) {\n\t\tconst light = lanePulseLights[i];\n\t\tlight.intensity = 0.8 + Math.abs(Math.sin(elapsed * 2.6 + light.userData.phase)) * 1.1 + (world.boost > 0 ? 0.4 : 0);\n\t}\n\tfor (let i = 1; i < lanePulseLights.length; i += 2) {\n\t\tlanePulseLights[i].intensity = 0.35;\n\t}\n\n\tfpsFrames++;\n\tfpsTime += dt;\n\tif (fpsTime >= 0.4) {\n\t\tfpsDisplay = Math.round(fpsFrames / fpsTime);\n\t\tif (fpsEl) {\n\t\t\tfpsEl.textContent = `FPS ${fpsDisplay}`;\n\t\t\tfpsEl.style.color = fpsDisplay >= 58 ? '#72e8ff' : fpsDisplay >= 45 ? '#ffe27a' : '#ff8fb8';\n\t\t}\n\t\tif (fpsDisplay < 54 && adaptivePixelRatio > 0.9) {\n\t\t\tadaptivePixelRatio = Math.max(0.9, adaptivePixelRatio - 0.05);\n\t\t\trenderer.setPixelRatio(adaptivePixelRatio);\n\t\t\tif (composer) composer.setSize(window.innerWidth, window.innerHeight);\n\t\t} else if (fpsDisplay > 62 && adaptivePixelRatio < Math.min(window.devicePixelRatio || 1, isCoarsePointer ? 1.1 : 1.35)) {\n\t\t\tadaptivePixelRatio = Math.min(Math.min(window.devicePixelRatio || 1, isCoarsePointer ? 1.1 : 1.35), adaptivePixelRatio + 0.05);\n\t\t\trenderer.setPixelRatio(adaptivePixelRatio);\n\t\t\tif (composer) composer.setSize(window.innerWidth, window.innerHeight);\n\t\t}\n\t\tfpsFrames = 0;\n\t\tfpsTime = 0;\n\t}\n\n\tif (composer) composer.render();\n\telse renderer.render(scene, camera);\n}\nanimate();\n\nfunction resizeGame() {\n\tconst width = window.innerWidth;\n\tconst height = window.innerHeight;\n\tcamera.aspect = width / height;\n\tcamera.fov = width < 700 ? 72 : 65;\n\tcamera.updateProjectionMatrix();\n\trenderer.setSize(width, height, false);\n\tadaptivePixelRatio = Math.min(window.devicePixelRatio || 1, width < 700 ? 1.05 : (isLowPowerDevice ? 0.8 : 1.35));\n\trenderer.setPixelRatio(adaptivePixelRatio);\n\tif (composer) composer.setSize(width, height);\n\tif (bloomPass) bloomPass.setSize(width, height);\n}\n\nwindow.addEventListener('resize', resizeGame, {\n\tpassive: true\n});\nwindow.addEventListener('orientationchange', () => setTimeout(resizeGame, 120), {\n\tpassive: true\n});\n\ndocument.addEventListener('visibilitychange', () => {\n\tif (document.hidden && world.running) {\n\t\tworld.paused = true;\n\t\tsafeText(pauseTextEl, 'Paused — return to continue');\n\t}\n});\n\nif (isMobile) {\n\tconst unlock = () => {\n\t\tensureAudio();\n\t\twindow.removeEventListener('pointerdown', unlock);\n\t\twindow.removeEventListener('touchstart', unlock);\n\t};\n\twindow.addEventListener('pointerdown', unlock, {\n\t\tonce: true,\n\t\tpassive: true\n\t});\n\twindow.addEventListener('touchstart', unlock, {\n\t\tonce: true,\n\t\tpassive: true\n\t});\n}\n\nresizeGame();"},{"name":"style.css","content":":root {\n\tcolor-scheme: light;\n\tfont-family: Inter, system-ui, sans-serif;\n\t--bg1: #0b1020;\n\t--bg2: #151d38;\n\t--panel: rgba(10, 14, 28, 0.54);\n\t--panel-border: rgba(255, 255, 255, 0.16);\n\t--text: #f4f7ff;\n\t--muted: #a7b2d8;\n\t--accent: #7c5cff;\n\t--accent-2: #37e7ff;\n\t--danger: #ff5d8f;\n\t--gold: #ffd84d;\n}\n\n* {\n\tbox-sizing: border-box;\n}\n\nhtml,\nbody {\n\tmargin: 0;\n\tmin-height: 100%;\n\tbackground:\n\t\tradial-gradient(circle at top, #25315f 0%, transparent 35%),\n\t\tlinear-gradient(180deg, var(--bg2), var(--bg1));\n\tcolor: var(--text);\n}\n\nbody {\n\toverflow: hidden;\n\tbackground-attachment: fixed;\n\ttouch-action: manipulation;\n\t-webkit-tap-highlight-color: transparent;\n}\n\n.game-shell {\n\tposition: relative;\n\twidth: 100vw;\n\theight: 100vh;\n\toverflow: hidden;\n}\n\n.game-shell::before {\n\tcontent: '';\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n\tz-index: 1;\n\tbackground:\n\t\tradial-gradient(circle at 20% 15%, rgba(55, 231, 255, 0.12), transparent 28%),\n\t\tradial-gradient(circle at 80% 20%, rgba(255, 79, 216, 0.12), transparent 30%),\n\t\tradial-gradient(circle at 50% 100%, rgba(124, 92, 255, 0.18), transparent 36%);\n\tmix-blend-mode: screen;\n}\n\n.game-shell::after {\n\tcontent: '';\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n\tz-index: 2;\n\tbackground:\n\t\tlinear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 18%, transparent 82%, rgba(0, 0, 0, 0.2)),\n\t\tradial-gradient(circle at 50% 20%, rgba(114, 232, 255, 0.05), transparent 28%),\n\t\tradial-gradient(circle at 50% 85%, rgba(255, 79, 216, 0.06), transparent 34%);\n\topacity: 0.9;\n}\n\n#game {\n\tposition: relative;\n\tz-index: 0;\n\twidth: 100%;\n\theight: 100%;\n\tfilter: saturate(1.12) contrast(1.08) brightness(1.02);\n\ttouch-action: none;\n}\n\n#game::after {\n\tcontent: '';\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n\tz-index: 1;\n\tbackground:\n\t\tlinear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 18%, transparent 82%, rgba(0, 0, 0, 0.24)),\n\t\trepeating-linear-gradient(180deg, rgba(255, 255, 255, 0.024) 0 2px, rgba(0, 0, 0, 0) 2px 6px);\n\tmix-blend-mode: screen;\n\topacity: 0.42;\n}\n\n#game::before {\n\tcontent: '';\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n\tz-index: 1;\n\tbackground: radial-gradient(circle at 50% 45%, transparent 0%, transparent 52%, rgba(0, 0, 0, 0.24) 100%);\n}\n\n#game canvas {\n\tdisplay: block;\n\twidth: 100% !important;\n\theight: 100% !important;\n\timage-rendering: auto;\n}\n\n.fps-counter {\n\tposition: fixed;\n\ttop: 16px;\n\tright: 16px;\n\tz-index: 60;\n\tpadding: 8px 12px;\n\tborder-radius: 999px;\n\tborder: 1px solid rgba(255, 255, 255, 0.14);\n\tbackground: linear-gradient(180deg, rgba(16, 22, 40, 0.84), rgba(8, 12, 24, 0.72));\n\tbackdrop-filter: blur(10px) saturate(1.1);\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.22), inset 0 1px 0 rgba(255, 255, 255, 0.08);\n\tcolor: #72e8ff;\n\tfont: 800 12px/1 Inter, system-ui, sans-serif;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\tpointer-events: none;\n\tuser-select: none;\n\tmin-width: 74px;\n\ttext-align: center;\n}\n\n.hud {\n\tposition: absolute;\n\tinset: 0 0 auto 0;\n\tz-index: 5;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tpadding: 18px;\n\tmax-width: 960px;\n\tpointer-events: none;\n}\n\n.hud__brand {\n\talign-self: flex-start;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 10px 14px;\n\tborder: 1px solid var(--panel-border);\n\tborder-radius: 999px;\n\tbackground: linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.04)), var(--panel);\n\tbackdrop-filter: blur(16px) saturate(1.25);\n\tbox-shadow: 0 12px 40px rgba(0, 0, 0, 0.24), inset 0 1px 0 rgba(255, 255, 255, 0.14);\n\tfont-weight: 900;\n\tletter-spacing: 0.16em;\n\tfont-size: 0.9rem;\n\ttext-shadow: 0 0 14px rgba(55, 231, 255, 0.18);\n}\n\n.hud__brand-glow {\n\tdisplay: inline-grid;\n\tplace-items: center;\n\twidth: 22px;\n\theight: 22px;\n\tborder-radius: 50%;\n\tbackground: radial-gradient(circle, rgba(255, 226, 122, 0.95), rgba(255, 143, 208, 0.85));\n\tcolor: #08111f;\n\tfont-size: 12px;\n\tbox-shadow: 0 0 16px rgba(255, 226, 122, 0.35);\n}\n\n.hud__stats {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 10px;\n}\n\n.hud__pill {\n\tpadding: 10px 14px;\n\tborder-radius: 999px;\n\tbackground: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.03)), var(--panel);\n\tborder: 1px solid var(--panel-border);\n\tbackdrop-filter: blur(14px) saturate(1.2);\n\tfont-weight: 700;\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.18), inset 0 1px 0 rgba(255, 255, 255, 0.08);\n}\n\n.hud__hint {\n\tcolor: var(--muted);\n\tfont-size: 0.95rem;\n\tline-height: 1.45;\n\ttext-shadow: 0 2px 18px rgba(0, 0, 0, 0.45);\n}\n\n.hud__hint--strong {\n\tcolor: #fff0a8;\n}\n\n.meter {\n\twidth: min(320px, 82vw);\n\theight: 12px;\n\tborder-radius: 999px;\n\toverflow: hidden;\n\tborder: 1px solid var(--panel-border);\n\tbackground: rgba(255, 255, 255, 0.08);\n\tbackdrop-filter: blur(12px);\n}\n\n.meter__fill {\n\twidth: 0;\n\theight: 100%;\n\tborder-radius: inherit;\n\tbackground: linear-gradient(90deg, var(--gold), #ff9ecb, var(--accent-2));\n\tbox-shadow: 0 0 18px rgba(255, 216, 77, 0.28);\n\ttransition: width 0.18s ease;\n}\n\n.overlay {\n\tposition: fixed;\n\tinset: 0;\n\tdisplay: grid;\n\tplace-items: center;\n\tpadding: 32px;\n\tz-index: 40;\n}\n\n.overlay--hidden {\n\tdisplay: none;\n}\n\n.overlay__backdrop {\n\tposition: absolute;\n\tinset: 0;\n\tbackground:\n\t\tradial-gradient(circle at 50% 10%, rgba(255, 102, 196, 0.18), transparent 24%),\n\t\tradial-gradient(circle at 20% 80%, rgba(71, 224, 255, 0.12), transparent 24%),\n\t\tradial-gradient(circle at 80% 18%, rgba(124, 92, 255, 0.16), transparent 22%),\n\t\tlinear-gradient(180deg, rgba(5, 8, 18, 0.62), rgba(5, 8, 18, 0.9));\n\tbackdrop-filter: blur(14px) saturate(1.08);\n}\n\n.overlay__backdrop--danger {\n\tbackground:\n\t\tradial-gradient(circle at 50% 24%, rgba(255, 93, 143, 0.24), transparent 30%),\n\t\tradial-gradient(circle at 82% 18%, rgba(255, 216, 77, 0.12), transparent 24%),\n\t\tlinear-gradient(180deg, rgba(14, 8, 14, 0.62), rgba(14, 8, 14, 0.9));\n}\n\n.overlay__card {\n\tposition: relative;\n\tz-index: 1;\n\twidth: min(660px, 100%);\n\tpadding: 42px 42px 34px;\n\tborder-radius: 28px;\n\tborder: 1px solid rgba(255, 255, 255, 0.12);\n\tbackground:\n\t\tlinear-gradient(180deg, rgba(20, 26, 46, 0.95), rgba(8, 12, 24, 0.98)),\n\t\tradial-gradient(circle at top, rgba(255, 255, 255, 0.04), transparent 40%);\n\tbox-shadow:\n\t\t0 30px 90px rgba(0, 0, 0, 0.5),\n\t\t0 0 60px rgba(90, 120, 255, 0.12),\n\t\t0 0 120px rgba(255, 102, 196, 0.08),\n\t\t0 0 0 1px rgba(255, 255, 255, 0.04) inset,\n\t\tinset 0 1px 0 rgba(255, 255, 255, 0.08);\n\ttext-align: center;\n\tcolor: #f7f8ff;\n\toverflow: hidden;\n}\n\n.overlay__card::before {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tpointer-events: none;\n\tbackground:\n\t\tlinear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 24%),\n\t\tradial-gradient(circle at top right, rgba(92, 118, 255, 0.14), transparent 24%),\n\t\tradial-gradient(circle at bottom left, rgba(255, 102, 196, 0.12), transparent 28%);\n}\n\n.overlay__card::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: inherit;\n\tpadding: 1px;\n\tbackground: linear-gradient(135deg, rgba(255, 255, 255, 0.22), rgba(255, 255, 255, 0.03));\n\t-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n\t-webkit-mask-composite: xor;\n\tmask-composite: exclude;\n\tpointer-events: none;\n}\n\n.overlay__grid {\n\tposition: absolute;\n\tleft: -10%;\n\tright: -10%;\n\tbottom: -12%;\n\theight: 42%;\n\tbackground:\n\t\tlinear-gradient(rgba(114, 232, 255, 0.15) 1px, transparent 1px),\n\t\tlinear-gradient(90deg, rgba(114, 232, 255, 0.15) 1px, transparent 1px);\n\tbackground-size: 26px 26px;\n\topacity: 0.22;\n\ttransform: perspective(500px) rotateX(72deg);\n\ttransform-origin: bottom;\n\tpointer-events: none;\n}\n\n.overlay__spark {\n\tposition: absolute;\n\tborder-radius: 999px;\n\tfilter: blur(4px);\n\tpointer-events: none;\n\tanimation: overlayFloat 5s ease-in-out infinite;\n}\n\n.overlay__spark--1 {\n\twidth: 120px;\n\theight: 120px;\n\tleft: -24px;\n\ttop: 22px;\n\tbackground: radial-gradient(circle, rgba(114, 232, 255, 0.35), transparent 70%);\n}\n\n.overlay__spark--2 {\n\twidth: 150px;\n\theight: 150px;\n\tright: -36px;\n\ttop: -12px;\n\tbackground: radial-gradient(circle, rgba(255, 102, 196, 0.3), transparent 70%);\n\tanimation-delay: -1.2s;\n}\n\n.overlay__spark--3 {\n\twidth: 110px;\n\theight: 110px;\n\tright: 18%;\n\tbottom: 14%;\n\tbackground: radial-gradient(circle, rgba(255, 226, 122, 0.22), transparent 72%);\n\tanimation-delay: -2.2s;\n}\n\n.overlay__spark--danger {\n\twidth: 180px;\n\theight: 180px;\n\tright: -50px;\n\ttop: -50px;\n\tbackground: radial-gradient(circle, rgba(255, 93, 143, 0.28), transparent 72%);\n}\n\n.overlay__card--danger {\n\tbackground: linear-gradient(180deg, rgba(41, 18, 28, 0.97), rgba(20, 10, 16, 0.99));\n}\n\n.overlay__eyebrow {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-bottom: 16px;\n\tpadding: 8px 13px;\n\tborder-radius: 999px;\n\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\tbackground: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n\tcolor: #ffe27a;\n\tfont-size: 11px;\n\tfont-weight: 900;\n\tletter-spacing: 0.18em;\n\ttext-transform: uppercase;\n\tbox-shadow: 0 0 24px rgba(255, 226, 122, 0.08);\n}\n\n.overlay__card h1,\n.overlay__card h2 {\n\tposition: relative;\n\tmargin: 0;\n\tfont-size: clamp(36px, 5.8vw, 56px);\n\tline-height: 0.98;\n\tletter-spacing: -0.05em;\n\tfont-weight: 900;\n\ttext-wrap: balance;\n\ttext-shadow: 0 8px 30px rgba(0, 0, 0, 0.28);\n}\n\n.overlay__lead {\n\tposition: relative;\n\tmax-width: 540px;\n\tmargin: 16px auto 0;\n\tcolor: rgba(225, 233, 250, 0.82);\n\tfont-size: clamp(15px, 2.1vw, 18px);\n\tline-height: 1.65;\n}\n\n.overlay__features {\n\tposition: relative;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n\tgap: 14px;\n\tmargin: 30px 0 24px;\n}\n\n.overlay__feature {\n\tpadding: 18px 14px;\n\tborder-radius: 18px;\n\tbackground: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\tbox-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05), 0 10px 24px rgba(0, 0, 0, 0.16);\n\tdisplay: grid;\n\tgap: 8px;\n\ttransition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.overlay__feature span {\n\tcolor: #9fdcff;\n\tfont-size: 12px;\n\tfont-weight: 900;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n}\n\n.overlay__feature strong {\n\tfont-size: 14px;\n\tfont-weight: 800;\n\tcolor: #f5f7ff;\n}\n\n.overlay__feature small {\n\tfont-size: 12px;\n\tcolor: rgba(200, 212, 236, 0.7);\n}\n\n.overlay__actions {\n\tposition: relative;\n\tdisplay: grid;\n\tjustify-items: center;\n\tgap: 12px;\n\tmargin-top: 10px;\n}\n\n.overlay button {\n\tappearance: none;\n\t-webkit-appearance: none;\n\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\tborder-radius: 16px;\n\tpadding: 16px 30px;\n\tmin-width: 230px;\n\tfont: inherit;\n\tfont-weight: 900;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\tcolor: #0d1526;\n\tbackground: linear-gradient(135deg, #ffe27a 0%, #ff8fd0 52%, #72e8ff 100%);\n\tbox-shadow: 0 18px 36px rgba(255, 120, 180, 0.28), 0 0 30px rgba(114, 232, 255, 0.14);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;\n\ttouch-action: manipulation;\n}\n\n.overlay__subtext {\n\tfont-size: 13px;\n\tcolor: rgba(196, 206, 230, 0.72);\n\tletter-spacing: 0.01em;\n}\n\n.overlay__chips {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: center;\n\tgap: 8px;\n\tmargin-top: 4px;\n}\n\n.overlay__chip {\n\tpadding: 7px 10px;\n\tborder-radius: 999px;\n\tfont-size: 11px;\n\tfont-weight: 800;\n\tletter-spacing: 0.08em;\n\ttext-transform: uppercase;\n\tcolor: #dfe8ff;\n\tbackground: rgba(255, 255, 255, 0.06);\n\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\tbox-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);\n}\n\n.overlay__score {\n\tposition: relative;\n\tmargin-top: 16px;\n\tfont-size: clamp(56px, 10vw, 100px);\n\tline-height: 1;\n\tfont-weight: 900;\n\tletter-spacing: -0.06em;\n\tcolor: #fff2a8;\n\ttext-shadow: 0 0 24px rgba(255, 226, 122, 0.22), 0 8px 30px rgba(0, 0, 0, 0.18);\n}\n\n.overlay__burst {\n\tposition: absolute;\n\twidth: 180px;\n\theight: 180px;\n\tright: -40px;\n\ttop: -40px;\n\tborder-radius: 50%;\n\tbackground: radial-gradient(circle, rgba(255, 93, 143, 0.22), rgba(255, 93, 143, 0) 68%);\n\tfilter: blur(4px);\n\tpointer-events: none;\n}\n\n.mobile-controls {\n\tposition: fixed;\n\tleft: 0;\n\tright: 0;\n\tbottom: max(14px, env(safe-area-inset-bottom));\n\tdisplay: none;\n\tjustify-content: space-between;\n\tgap: 16px;\n\tpadding: 0 14px;\n\tz-index: 30;\n\tpointer-events: none;\n}\n\n.mobile-controls__left,\n.mobile-controls__right {\n\tdisplay: flex;\n\tgap: 12px;\n\tpointer-events: auto;\n}\n\n.mobile-btn {\n\t-webkit-appearance: none;\n\tappearance: none;\n\ttouch-action: manipulation;\n\tmin-width: 64px;\n\theight: 64px;\n\tborder: 1px solid rgba(255, 255, 255, 0.22);\n\tbackground: linear-gradient(180deg, rgba(24, 34, 62, 0.86), rgba(8, 14, 28, 0.62));\n\tcolor: #fff;\n\tfont: inherit;\n\tfont-weight: 800;\n\tborder-radius: 18px;\n\tbackdrop-filter: blur(14px) saturate(1.2);\n\tbox-shadow: 0 10px 30px rgba(0, 0, 0, 0.28), 0 0 22px rgba(82, 224, 255, 0.14), inset 0 1px 0 rgba(255, 255, 255, 0.08);\n}\n\n.mobile-btn--jump,\n.mobile-btn--dash {\n\tmin-width: 88px;\n}\n\n.mobile-btn--dash {\n\tcolor: #aefcff;\n}\n\n@media (hover: hover) {\n\t.overlay__feature:hover {\n\t\ttransform: translateY(-4px);\n\t\tborder-color: rgba(114, 232, 255, 0.28);\n\t\tbox-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 14px 28px rgba(0, 0, 0, 0.22), 0 0 24px rgba(114, 232, 255, 0.08);\n\t}\n\n\t.overlay button:hover {\n\t\ttransform: translateY(-3px) scale(1.01);\n\t\tbox-shadow: 0 22px 42px rgba(255, 120, 180, 0.34), 0 0 34px rgba(114, 232, 255, 0.18);\n\t\tfilter: brightness(1.03) saturate(1.06);\n\t}\n}\n\n.overlay button:active,\n.mobile-btn:active {\n\ttransform: scale(0.98);\n}\n\n@media (max-width: 700px) {\n\t.overlay {\n\t\tpadding: 16px;\n\t}\n\n\t.overlay__card {\n\t\twidth: min(100%, 560px);\n\t\tpadding: 28px 20px 22px;\n\t\tborder-radius: 22px;\n\t}\n\n\t.overlay__card h1,\n\t.overlay__card h2 {\n\t\tfont-size: clamp(30px, 10vw, 42px);\n\t}\n\n\t.overlay__features {\n\t\tgrid-template-columns: 1fr;\n\t\tgap: 10px;\n\t\tmargin: 22px 0 18px;\n\t}\n\n\t.overlay__grid {\n\t\theight: 34%;\n\t\tbackground-size: 22px 22px;\n\t}\n\n\t.overlay__burst {\n\t\twidth: 120px;\n\t\theight: 120px;\n\t\tright: -24px;\n\t\ttop: -24px;\n\t}\n\n\t.overlay button {\n\t\twidth: 100%;\n\t\tmin-width: 0;\n\t}\n}\n\n@media (max-width: 640px) {\n\t.hud {\n\t\tpadding: 14px;\n\t\tgap: 10px;\n\t}\n\n\t.hud__brand {\n\t\tfont-size: 0.78rem;\n\t\tletter-spacing: 0.12em;\n\t}\n\n\t.hud__stats {\n\t\tgap: 8px;\n\t}\n\n\t.hud__pill {\n\t\tpadding: 8px 12px;\n\t\tfont-size: 0.84rem;\n\t}\n\n\t.hud__hint {\n\t\tfont-size: 0.85rem;\n\t\tmax-width: min(92vw, 320px);\n\t}\n\n\t.meter {\n\t\twidth: min(260px, 76vw);\n\t\theight: 11px;\n\t}\n\n\t.fps-counter {\n\t\ttop: auto;\n\t\tbottom: calc(100px + env(safe-area-inset-bottom));\n\t\tright: 12px;\n\t\tfont-size: 11px;\n\t\tpadding: 7px 10px;\n\t}\n}\n\n@media (hover: none), (pointer: coarse) {\n\t.mobile-controls {\n\t\tdisplay: flex;\n\t}\n}\n\n@keyframes overlayFloat {\n\n\t0%,\n\t100% {\n\t\ttransform: translateY(0px) scale(1);\n\t}\n\n\t50% {\n\t\ttransform: translateY(-10px) scale(1.04);\n\t}\n}"}],"folders":[]},"variants":null,"createdAt":"2026-03-06T02:03:51.946Z","updatedAt":"2026-03-06T03:20:56.453Z"}}