{"project":{"id":"z8j2Wlh","userId":"davidyarham@gmail.com","username":null,"userPicture":null,"name":"Crossy Road Clone","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 src=\"https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js\"></script>\n</head>\n<body>\n<div id=\"game-container\">\n\t<canvas id=\"game-canvas\"></canvas>\n\t<div id=\"ui-overlay\">\n\t\t<div id=\"score\">0</div>\n\t\t<div id=\"high-score\">BEST: 0</div>\n\t</div>\n\t<div id=\"start-screen\">\n\t\t<h1>CROSSY<br>ROAD</h1>\n\t\t<p>TAP or ARROW KEYS to move</p>\n\t\t<button id=\"start-btn\">START</button>\n\t</div>\n\t<div id=\"game-over\" class=\"hidden\">\n\t\t<h2>SPLAT!</h2>\n\t\t<p id=\"final-score\">Score: 0</p>\n\t\t<button id=\"retry-btn\">RETRY</button>\n\t</div>\n</div>\n  <script type=\"module\" src=\"main.js\"></script>\n</body>\n</html>"},{"name":"main.js","content":"const canvas = document.getElementById('game-canvas');\nconst scoreEl = document.getElementById('score');\nconst highScoreEl = document.getElementById('high-score');\nconst startScreen = document.getElementById('start-screen');\nconst gameOverScreen = document.getElementById('game-over');\nconst finalScoreEl = document.getElementById('final-score');\nconst startBtn = document.getElementById('start-btn');\nconst retryBtn = document.getElementById('retry-btn');\n\n// Audio\nconst audioCtx = new(window.AudioContext || window.webkitAudioContext)();\n\nfunction playSound(freq, dur, type = 'square', vol = 0.15) {\n\tconst osc = audioCtx.createOscillator();\n\tconst gain = audioCtx.createGain();\n\tosc.type = type;\n\tosc.frequency.setValueAtTime(freq, audioCtx.currentTime);\n\tgain.gain.setValueAtTime(vol, audioCtx.currentTime);\n\tgain.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + dur);\n\tosc.connect(gain);\n\tgain.connect(audioCtx.destination);\n\tosc.start();\n\tosc.stop(audioCtx.currentTime + dur);\n}\n\nfunction hopSound() {\n\tplaySound(440, 0.08, 'square', 0.12);\n\tsetTimeout(() => playSound(580, 0.08, 'square', 0.1), 40);\n}\n\nfunction scoreSound() {\n\tplaySound(660, 0.1, 'square', 0.1);\n\tsetTimeout(() => playSound(880, 0.15, 'square', 0.1), 60);\n}\n\nfunction deathSound() {\n\tplaySound(200, 0.3, 'sawtooth', 0.2);\n\tsetTimeout(() => playSound(120, 0.4, 'sawtooth', 0.15), 150);\n}\n\nfunction splashSound() {\n\tconst bufferSize = audioCtx.sampleRate * 0.3;\n\tconst buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate);\n\tconst data = buffer.getChannelData(0);\n\tfor (let i = 0; i < bufferSize; i++) {\n\t\tdata[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / bufferSize, 2);\n\t}\n\tconst src = audioCtx.createBufferSource();\n\tconst gain = audioCtx.createGain();\n\tsrc.buffer = buffer;\n\tgain.gain.setValueAtTime(0.15, audioCtx.currentTime);\n\tsrc.connect(gain);\n\tgain.connect(audioCtx.destination);\n\tsrc.start();\n}\n\n// Three.js Setup\nconst scene = new THREE.Scene();\nscene.background = new THREE.Color(0x87ceeb);\nscene.fog = new THREE.Fog(0x87ceeb, 25, 55);\n\nconst camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 100);\nconst renderer = new THREE.WebGLRenderer({\n\tcanvas,\n\tantialias: false\n});\nrenderer.setSize(window.innerWidth, window.innerHeight);\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\nrenderer.shadowMap.enabled = true;\nrenderer.shadowMap.type = THREE.BasicShadowMap;\n\n// Lighting\nconst ambientLight = new THREE.AmbientLight(0xffffff, 0.6);\nscene.add(ambientLight);\n\nconst dirLight = new THREE.DirectionalLight(0xffffff, 0.8);\ndirLight.position.set(10, 20, 10);\ndirLight.castShadow = true;\ndirLight.shadow.mapSize.set(1024, 1024);\ndirLight.shadow.camera.near = 0.5;\ndirLight.shadow.camera.far = 60;\ndirLight.shadow.camera.left = -20;\ndirLight.shadow.camera.right = 20;\ndirLight.shadow.camera.top = 20;\ndirLight.shadow.camera.bottom = -20;\nscene.add(dirLight);\n\n// Materials\nconst mat = (color) => new THREE.MeshLambertMaterial({\n\tcolor\n});\n\n// Colors\nconst GRASS_COLORS = [0x4a7c3f, 0x3d6b34, 0x558b47];\nconst ROAD_COLOR = 0x444444;\nconst WATER_COLOR = 0x2980b9;\nconst SIDEWALK_COLOR = 0x666666;\n\n// Game State\nlet gameState = 'menu';\nlet score = 0;\nlet highScore = parseInt(localStorage.getItem('crossyHighScore') || '0');\nlet playerRow = 0;\nlet playerCol = 0;\nlet maxRow = 0;\nlet isHopping = false;\nlet hopProgress = 0;\nlet hopFrom = {\n\tx: 0,\n\tz: 0\n};\nlet hopTo = {\n\tx: 0,\n\tz: 0\n};\nlet hopDir = 'forward';\nlet lanes = [];\nlet player;\nlet isDead = false;\n\nhighScoreEl.textContent = `BEST: ${highScore}`;\n\n// Player (Chicken)\nfunction createPlayer() {\n\tconst group = new THREE.Group();\n\n\t// Body\n\tconst body = new THREE.Mesh(new THREE.BoxGeometry(0.5, 0.55, 0.6), mat(0xffffff));\n\tbody.position.y = 0.45;\n\tbody.castShadow = true;\n\tgroup.add(body);\n\n\t// Head\n\tconst head = new THREE.Mesh(new THREE.BoxGeometry(0.4, 0.4, 0.4), mat(0xffffff));\n\thead.position.set(0, 0.9, -0.1);\n\thead.castShadow = true;\n\tgroup.add(head);\n\n\t// Beak\n\tconst beak = new THREE.Mesh(new THREE.BoxGeometry(0.15, 0.1, 0.15), mat(0xffa500));\n\tbeak.position.set(0, 0.82, -0.35);\n\tgroup.add(beak);\n\n\t// Comb\n\tconst comb = new THREE.Mesh(new THREE.BoxGeometry(0.12, 0.15, 0.2), mat(0xff3333));\n\tcomb.position.set(0, 1.15, -0.05);\n\tgroup.add(comb);\n\n\t// Eyes\n\tconst eyeGeo = new THREE.BoxGeometry(0.08, 0.08, 0.05);\n\tconst eyeMat = mat(0x111111);\n\tconst leftEye = new THREE.Mesh(eyeGeo, eyeMat);\n\tleftEye.position.set(-0.12, 0.92, -0.32);\n\tgroup.add(leftEye);\n\tconst rightEye = new THREE.Mesh(eyeGeo, eyeMat);\n\trightEye.position.set(0.12, 0.92, -0.32);\n\tgroup.add(rightEye);\n\n\t// Feet\n\tconst footGeo = new THREE.BoxGeometry(0.15, 0.08, 0.2);\n\tconst footMat = mat(0xffa500);\n\tconst leftFoot = new THREE.Mesh(footGeo, footMat);\n\tleftFoot.position.set(-0.14, 0.04, -0.05);\n\tgroup.add(leftFoot);\n\tconst rightFoot = new THREE.Mesh(footGeo, footMat);\n\trightFoot.position.set(0.14, 0.04, -0.05);\n\tgroup.add(rightFoot);\n\n\t// Wings\n\tconst wingGeo = new THREE.BoxGeometry(0.1, 0.35, 0.4);\n\tconst wingMat = mat(0xeeeeee);\n\tconst leftWing = new THREE.Mesh(wingGeo, wingMat);\n\tleftWing.position.set(-0.32, 0.5, 0);\n\tgroup.add(leftWing);\n\tconst rightWing = new THREE.Mesh(wingGeo, wingMat);\n\trightWing.position.set(0.32, 0.5, 0);\n\tgroup.add(rightWing);\n\n\tgroup.position.set(0, 0, 0);\n\tscene.add(group);\n\treturn group;\n}\n\n// Lane types\nconst LANE_TYPES = ['grass', 'road', 'water'];\n\nfunction randomLaneType(row) {\n\tif (row <= 0) return 'grass';\n\tif (row <= 2) return Math.random() < 0.5 ? 'grass' : 'road';\n\tconst r = Math.random();\n\tif (r < 0.35) return 'grass';\n\tif (r < 0.72) return 'road';\n\treturn 'water';\n}\n\nfunction createGrassLane(row) {\n\tconst group = new THREE.Group();\n\tconst colorIdx = Math.floor(Math.random() * GRASS_COLORS.length);\n\tconst ground = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(30, 0.2, 1),\n\t\tmat(GRASS_COLORS[colorIdx])\n\t);\n\tground.position.set(0, -0.1, -row);\n\tground.receiveShadow = true;\n\tgroup.add(ground);\n\n\t// Trees\n\tconst treePositions = [];\n\tfor (let i = -7; i <= 7; i++) {\n\t\tif (Math.abs(i) <= 2 && row < 3) continue;\n\t\tif (Math.random() < 0.3) {\n\t\t\ttreePositions.push(i);\n\t\t\tconst tree = createTree();\n\t\t\ttree.position.set(i, 0, -row);\n\t\t\tgroup.add(tree);\n\t\t}\n\t}\n\n\tscene.add(group);\n\treturn {\n\t\ttype: 'grass',\n\t\trow,\n\t\tgroup,\n\t\tobstacles: treePositions,\n\t\tvehicles: [],\n\t\tlogs: []\n\t};\n}\n\nfunction createTree() {\n\tconst group = new THREE.Group();\n\tconst trunkH = 0.3 + Math.random() * 0.3;\n\tconst trunk = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(0.25, trunkH, 0.25),\n\t\tmat(0x8B4513)\n\t);\n\ttrunk.position.y = trunkH / 2;\n\ttrunk.castShadow = true;\n\tgroup.add(trunk);\n\n\tconst leafSize = 0.5 + Math.random() * 0.3;\n\tconst leaves = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(leafSize, leafSize, leafSize),\n\t\tmat(0x228B22)\n\t);\n\tleaves.position.y = trunkH + leafSize / 2 - 0.05;\n\tleaves.castShadow = true;\n\tgroup.add(leaves);\n\n\tif (Math.random() > 0.4) {\n\t\tconst topLeaves = new THREE.Mesh(\n\t\t\tnew THREE.BoxGeometry(leafSize * 0.6, leafSize * 0.5, leafSize * 0.6),\n\t\t\tmat(0x2d9e2d)\n\t\t);\n\t\ttopLeaves.position.y = trunkH + leafSize + 0.1;\n\t\ttopLeaves.castShadow = true;\n\t\tgroup.add(topLeaves);\n\t}\n\n\treturn group;\n}\n\nfunction createRoadLane(row) {\n\tconst group = new THREE.Group();\n\tconst road = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(30, 0.2, 1),\n\t\tmat(ROAD_COLOR)\n\t);\n\troad.position.set(0, -0.1, -row);\n\troad.receiveShadow = true;\n\tgroup.add(road);\n\n\t// Lane markings\n\tfor (let i = -14; i <= 14; i += 2) {\n\t\tconst marking = new THREE.Mesh(\n\t\t\tnew THREE.BoxGeometry(0.5, 0.01, 0.06),\n\t\t\tmat(0xcccccc)\n\t\t);\n\t\tmarking.position.set(i, 0.01, -row);\n\t\tgroup.add(marking);\n\t}\n\n\tconst speed = (0.02 + Math.random() * 0.04) * (Math.random() < 0.5 ? 1 : -1);\n\tconst vehicleCount = 2 + Math.floor(Math.random() * 2);\n\tconst spacing = 30 / vehicleCount;\n\tconst vehicles = [];\n\n\tfor (let i = 0; i < vehicleCount; i++) {\n\t\tconst isTruck = Math.random() < 0.35;\n\t\tconst vehicle = createVehicle(isTruck);\n\t\tvehicle.position.set(-15 + i * spacing + Math.random() * 3, 0, -row);\n\t\tif (speed < 0) vehicle.rotation.y = Math.PI;\n\t\tgroup.add(vehicle);\n\t\tvehicles.push({\n\t\t\tmesh: vehicle,\n\t\t\tspeed,\n\t\t\twidth: isTruck ? 2.0 : 1.2\n\t\t});\n\t}\n\n\tscene.add(group);\n\treturn {\n\t\ttype: 'road',\n\t\trow,\n\t\tgroup,\n\t\tobstacles: [],\n\t\tvehicles,\n\t\tlogs: []\n\t};\n}\n\nfunction createVehicle(isTruck) {\n\tconst group = new THREE.Group();\n\tconst colors = [0xe74c3c, 0x3498db, 0xf39c12, 0x9b59b6, 0x1abc9c, 0xe67e22, 0x2ecc71];\n\tconst color = colors[Math.floor(Math.random() * colors.length)];\n\n\tif (isTruck) {\n\t\tconst cab = new THREE.Mesh(new THREE.BoxGeometry(0.6, 0.5, 0.7), mat(color));\n\t\tcab.position.set(0.5, 0.35, 0);\n\t\tcab.castShadow = true;\n\t\tgroup.add(cab);\n\n\t\tconst bed = new THREE.Mesh(new THREE.BoxGeometry(1.3, 0.4, 0.75), mat(0x777777));\n\t\tbed.position.set(-0.3, 0.3, 0);\n\t\tbed.castShadow = true;\n\t\tgroup.add(bed);\n\n\t\tconst wheel1 = new THREE.Mesh(new THREE.BoxGeometry(0.2, 0.2, 0.8), mat(0x222222));\n\t\twheel1.position.set(0.6, 0.1, 0);\n\t\tgroup.add(wheel1);\n\t\tconst wheel2 = new THREE.Mesh(new THREE.BoxGeometry(0.2, 0.2, 0.8), mat(0x222222));\n\t\twheel2.position.set(-0.6, 0.1, 0);\n\t\tgroup.add(wheel2);\n\t} else {\n\t\tconst body = new THREE.Mesh(new THREE.BoxGeometry(0.9, 0.3, 0.6), mat(color));\n\t\tbody.position.y = 0.25;\n\t\tbody.castShadow = true;\n\t\tgroup.add(body);\n\n\t\tconst roof = new THREE.Mesh(new THREE.BoxGeometry(0.5, 0.22, 0.55), mat(darkenColor(color, 0.8)));\n\t\troof.position.set(0.05, 0.52, 0);\n\t\troof.castShadow = true;\n\t\tgroup.add(roof);\n\n\t\tconst windshield = new THREE.Mesh(new THREE.BoxGeometry(0.02, 0.18, 0.48), mat(0xaaddff));\n\t\twindshield.position.set(0.26, 0.5, 0);\n\t\tgroup.add(windshield);\n\n\t\tconst wheel1 = new THREE.Mesh(new THREE.BoxGeometry(0.15, 0.15, 0.65), mat(0x222222));\n\t\twheel1.position.set(0.3, 0.08, 0);\n\t\tgroup.add(wheel1);\n\t\tconst wheel2 = new THREE.Mesh(new THREE.BoxGeometry(0.15, 0.15, 0.65), mat(0x222222));\n\t\twheel2.position.set(-0.3, 0.08, 0);\n\t\tgroup.add(wheel2);\n\t}\n\n\treturn group;\n}\n\nfunction darkenColor(hex, factor) {\n\tconst r = ((hex >> 16) & 255) * factor;\n\tconst g = ((hex >> 8) & 255) * factor;\n\tconst b = (hex & 255) * factor;\n\treturn (Math.floor(r) << 16) | (Math.floor(g) << 8) | Math.floor(b);\n}\n\nfunction createWaterLane(row) {\n\tconst group = new THREE.Group();\n\tconst water = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(30, 0.2, 1),\n\t\tmat(WATER_COLOR)\n\t);\n\twater.position.set(0, -0.15, -row);\n\twater.receiveShadow = true;\n\tgroup.add(water);\n\n\tconst speed = (0.015 + Math.random() * 0.025) * (Math.random() < 0.5 ? 1 : -1);\n\tconst logCount = 3 + Math.floor(Math.random() * 2);\n\tconst spacing = 30 / logCount;\n\tconst logs = [];\n\n\tfor (let i = 0; i < logCount; i++) {\n\t\tconst logLen = 1.5 + Math.random() * 2;\n\t\tconst log = createLog(logLen);\n\t\tlog.position.set(-15 + i * spacing + Math.random() * 3, -0.02, -row);\n\t\tgroup.add(log);\n\t\tlogs.push({\n\t\t\tmesh: log,\n\t\t\tspeed,\n\t\t\twidth: logLen\n\t\t});\n\t}\n\n\tscene.add(group);\n\treturn {\n\t\ttype: 'water',\n\t\trow,\n\t\tgroup,\n\t\tobstacles: [],\n\t\tvehicles: [],\n\t\tlogs\n\t};\n}\n\nfunction createLog(len) {\n\tconst group = new THREE.Group();\n\tconst main = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(len, 0.25, 0.6),\n\t\tmat(0x8B6914)\n\t);\n\tmain.position.y = 0.12;\n\tmain.castShadow = true;\n\tgroup.add(main);\n\n\tconst bark = new THREE.Mesh(\n\t\tnew THREE.BoxGeometry(len * 0.9, 0.05, 0.65),\n\t\tmat(0x6B4E0A)\n\t);\n\tbark.position.y = 0.26;\n\tgroup.add(bark);\n\n\treturn group;\n}\n\n// Lane management\nconst LANE_BUFFER = 25;\n\nfunction generateLanes() {\n\tfor (let r = -3; r <= LANE_BUFFER; r++) {\n\t\taddLane(r);\n\t}\n}\n\nfunction addLane(row) {\n\tconst existing = lanes.find(l => l.row === row);\n\tif (existing) return;\n\n\tconst type = randomLaneType(row);\n\tlet lane;\n\tswitch (type) {\n\t\tcase 'grass':\n\t\t\tlane = createGrassLane(row);\n\t\t\tbreak;\n\t\tcase 'road':\n\t\t\tlane = createRoadLane(row);\n\t\t\tbreak;\n\t\tcase 'water':\n\t\t\tlane = createWaterLane(row);\n\t\t\tbreak;\n\t}\n\tlanes.push(lane);\n}\n\nfunction cleanupLanes() {\n\tlanes = lanes.filter(l => {\n\t\tif (l.row < playerRow - 8) {\n\t\t\tscene.remove(l.group);\n\t\t\tl.group.traverse(child => {\n\t\t\t\tif (child.geometry) child.geometry.dispose();\n\t\t\t\tif (child.material) child.material.dispose();\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n}\n\nfunction ensureLanes() {\n\tconst maxNeeded = playerRow + LANE_BUFFER;\n\tfor (let r = playerRow - 3; r <= maxNeeded; r++) {\n\t\taddLane(r);\n\t}\n\tcleanupLanes();\n}\n\n// Camera\nfunction updateCamera() {\n\tconst targetX = player.position.x * 0.3;\n\tconst targetZ = player.position.z - 6;\n\tcamera.position.x += (targetX + 5 - camera.position.x) * 0.08;\n\tcamera.position.y += (9 - camera.position.y) * 0.08;\n\tcamera.position.z += (targetZ + 8 - camera.position.z) * 0.08;\n\tcamera.lookAt(player.position.x * 0.5, 0, player.position.z - 2);\n}\n\n// Movement\nfunction tryMove(dRow, dCol) {\n\tif (isHopping || isDead || gameState !== 'playing') return;\n\n\tconst targetRow = playerRow + dRow;\n\tconst targetCol = playerCol + dCol;\n\n\tif (targetCol < -6 || targetCol > 6) return;\n\n\t// Check tree collision\n\tconst targetLane = lanes.find(l => l.row === targetRow);\n\tif (targetLane && targetLane.type === 'grass') {\n\t\tif (targetLane.obstacles.includes(targetCol)) return;\n\t}\n\n\thopFrom = {\n\t\tx: player.position.x,\n\t\tz: player.position.z\n\t};\n\thopTo = {\n\t\tx: targetCol,\n\t\tz: -targetRow\n\t};\n\thopProgress = 0;\n\tisHopping = true;\n\n\tif (dRow > 0) hopDir = 'forward';\n\telse if (dRow < 0) hopDir = 'back';\n\telse if (dCol > 0) hopDir = 'right';\n\telse hopDir = 'left';\n\n\t// Rotate chicken\n\tif (dRow > 0) player.rotation.y = 0;\n\telse if (dRow < 0) player.rotation.y = Math.PI;\n\telse if (dCol > 0) player.rotation.y = -Math.PI / 2;\n\telse if (dCol < 0) player.rotation.y = Math.PI / 2;\n\n\tplayerRow = targetRow;\n\tplayerCol = targetCol;\n\n\thopSound();\n\n\tif (playerRow > maxRow) {\n\t\tmaxRow = playerRow;\n\t\tscore = maxRow;\n\t\tscoreEl.textContent = score;\n\t\tif (score > 0 && score % 5 === 0) scoreSound();\n\t}\n\n\tensureLanes();\n}\n\nfunction updateHop(dt) {\n\tif (!isHopping) return;\n\thopProgress += dt * 5.5;\n\tif (hopProgress >= 1) {\n\t\thopProgress = 1;\n\t\tisHopping = false;\n\t}\n\n\tconst t = hopProgress;\n\tconst ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n\tplayer.position.x = hopFrom.x + (hopTo.x - hopFrom.x) * ease;\n\tplayer.position.z = hopFrom.z + (hopTo.z - hopFrom.z) * ease;\n\n\t// Hop arc\n\tconst hopHeight = Math.sin(t * Math.PI) * 0.4;\n\tplayer.position.y = hopHeight;\n}\n\n// Collision detection\nfunction checkCollisions() {\n\tif (isDead) return;\n\n\tconst lane = lanes.find(l => l.row === playerRow);\n\tif (!lane) return;\n\n\tconst px = player.position.x;\n\n\tif (lane.type === 'road') {\n\t\tfor (const v of lane.vehicles) {\n\t\t\tconst vx = v.mesh.position.x;\n\t\t\tconst hw = v.width / 2;\n\t\t\tif (px > vx - hw - 0.2 && px < vx + hw + 0.2) {\n\t\t\t\tdie('road');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (lane.type === 'water' && !isHopping) {\n\t\tlet onLog = false;\n\t\tfor (const log of lane.logs) {\n\t\t\tconst lx = log.mesh.position.x;\n\t\t\tconst hw = log.width / 2;\n\t\t\tif (px > lx - hw + 0.1 && px < lx + hw - 0.1) {\n\t\t\t\tonLog = true;\n\t\t\t\tplayer.position.x += log.speed;\n\t\t\t\tplayerCol = Math.round(player.position.x);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!onLog) {\n\t\t\tdie('water');\n\t\t}\n\t}\n}\n\nfunction die(cause) {\n\tisDead = true;\n\tif (cause === 'water') {\n\t\tsplashSound();\n\t\t// Sink\n\t\tplayer.position.y = -0.3;\n\t} else {\n\t\tdeathSound();\n\t\t// Squish\n\t\tplayer.scale.y = 0.15;\n\t\tplayer.position.y = 0;\n\t}\n\n\tsetTimeout(() => {\n\t\tif (score > highScore) {\n\t\t\thighScore = score;\n\t\t\tlocalStorage.setItem('crossyHighScore', highScore.toString());\n\t\t\thighScoreEl.textContent = `BEST: ${highScore}`;\n\t\t}\n\t\tfinalScoreEl.textContent = `Score: ${score}`;\n\t\tgameOverScreen.classList.remove('hidden');\n\t\tgameState = 'gameover';\n\t}, 800);\n}\n\n// Update vehicles & logs\nfunction updateMovingObjects() {\n\tfor (const lane of lanes) {\n\t\tfor (const v of lane.vehicles) {\n\t\t\tv.mesh.position.x += v.speed;\n\t\t\tif (v.speed > 0 && v.mesh.position.x > 16) v.mesh.position.x = -16;\n\t\t\tif (v.speed < 0 && v.mesh.position.x < -16) v.mesh.position.x = 16;\n\t\t}\n\t\tfor (const log of lane.logs) {\n\t\t\tlog.mesh.position.x += log.speed;\n\t\t\tif (log.speed > 0 && log.mesh.position.x > 16) log.mesh.position.x = -16;\n\t\t\tif (log.speed < 0 && log.mesh.position.x < -16) log.mesh.position.x = 16;\n\t\t}\n\t}\n}\n\n// Input\ndocument.addEventListener('keydown', (e) => {\n\tif (gameState !== 'playing') return;\n\tswitch (e.key) {\n\t\tcase 'ArrowUp':\n\t\tcase 'w':\n\t\tcase 'W':\n\t\t\ttryMove(1, 0);\n\t\t\tbreak;\n\t\tcase 'ArrowDown':\n\t\tcase 's':\n\t\tcase 'S':\n\t\t\ttryMove(-1, 0);\n\t\t\tbreak;\n\t\tcase 'ArrowLeft':\n\t\tcase 'a':\n\t\tcase 'A':\n\t\t\ttryMove(0, -1);\n\t\t\tbreak;\n\t\tcase 'ArrowRight':\n\t\tcase 'd':\n\t\tcase 'D':\n\t\t\ttryMove(0, 1);\n\t\t\tbreak;\n\t}\n});\n\n// Touch/swipe\nlet touchStartX = 0,\n\ttouchStartY = 0;\ncanvas.addEventListener('touchstart', (e) => {\n\ttouchStartX = e.touches[0].clientX;\n\ttouchStartY = e.touches[0].clientY;\n}, {\n\tpassive: true\n});\n\ncanvas.addEventListener('touchend', (e) => {\n\tif (gameState !== 'playing') return;\n\tconst dx = e.changedTouches[0].clientX - touchStartX;\n\tconst dy = e.changedTouches[0].clientY - touchStartY;\n\tconst absDx = Math.abs(dx);\n\tconst absDy = Math.abs(dy);\n\n\tif (absDx < 15 && absDy < 15) {\n\t\ttryMove(1, 0);\n\t\treturn;\n\t}\n\n\tif (absDx > absDy) {\n\t\ttryMove(0, dx > 0 ? 1 : -1);\n\t} else {\n\t\ttryMove(dy < 0 ? 1 : -1, 0);\n\t}\n}, {\n\tpassive: true\n});\n\n// Game init\nfunction resetGame() {\n\t// Clear existing\n\tfor (const lane of lanes) {\n\t\tscene.remove(lane.group);\n\t\tlane.group.traverse(child => {\n\t\t\tif (child.geometry) child.geometry.dispose();\n\t\t\tif (child.material) child.material.dispose();\n\t\t});\n\t}\n\tlanes = [];\n\tif (player) scene.remove(player);\n\n\tscore = 0;\n\tplayerRow = 0;\n\tplayerCol = 0;\n\tmaxRow = 0;\n\tisHopping = false;\n\tisDead = false;\n\tscoreEl.textContent = '0';\n\n\tplayer = createPlayer();\n\tplayer.position.set(0, 0, 0);\n\n\tgenerateLanes();\n\tupdateCamera();\n\tcamera.position.set(5, 9, 8);\n}\n\nfunction startGame() {\n\tif (audioCtx.state === 'suspended') audioCtx.resume();\n\tresetGame();\n\tstartScreen.classList.add('hidden');\n\tgameOverScreen.classList.add('hidden');\n\tgameState = 'playing';\n}\n\nstartBtn.addEventListener('click', startGame);\nretryBtn.addEventListener('click', startGame);\n\n// Main loop\nlet lastTime = 0;\n\nfunction animate(time) {\n\trequestAnimationFrame(animate);\n\tconst dt = Math.min((time - lastTime) / 1000, 0.05);\n\tlastTime = time;\n\n\tif (gameState === 'playing') {\n\t\tupdateHop(dt);\n\t\tupdateMovingObjects();\n\t\tcheckCollisions();\n\t\tupdateCamera();\n\t\tdirLight.position.set(player.position.x + 10, 20, player.position.z + 10);\n\t\tdirLight.target.position.set(player.position.x, 0, player.position.z);\n\t\tdirLight.target.updateMatrixWorld();\n\t}\n\n\trenderer.render(scene, camera);\n}\n\nrequestAnimationFrame(animate);\n\n// Resize\nwindow.addEventListener('resize', () => {\n\tcamera.aspect = window.innerWidth / window.innerHeight;\n\tcamera.updateProjectionMatrix();\n\trenderer.setSize(window.innerWidth, window.innerHeight);\n});\n\n// Initial scene for menu\nresetGame();\ncamera.position.set(5, 9, 8);\ncamera.lookAt(0, 0, -2);"},{"name":"style.css","content":":root {\n\tcolor-scheme: dark;\n\tfont-family: 'Courier New', monospace;\n}\n\n* {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml, body {\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\tbackground: #1a1a2e;\n}\n\n#game-container {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100vh;\n}\n\n#game-canvas {\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n}\n\n#ui-overlay {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 0;\n\tright: 0;\n\ttext-align: center;\n\tpointer-events: none;\n\tz-index: 10;\n}\n\n#score {\n\tfont-size: 72px;\n\tfont-weight: 900;\n\tcolor: #fff;\n\ttext-shadow:\n\t\t3px 3px 0 #000,\n\t\t-1px -1px 0 #000,\n\t\t1px -1px 0 #000,\n\t\t-1px 1px 0 #000;\n\tletter-spacing: 2px;\n}\n\n#high-score {\n\tfont-size: 16px;\n\tfont-weight: 700;\n\tcolor: #ffcc00;\n\ttext-shadow: 2px 2px 0 #000;\n\tmargin-top: 4px;\n}\n\n#start-screen,\n#game-over {\n\tposition: absolute;\n\tinset: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: rgba(10, 10, 30, 0.85);\n\tz-index: 20;\n}\n\n#start-screen h1 {\n\tfont-size: 64px;\n\tfont-weight: 900;\n\tcolor: #ffcc00;\n\ttext-shadow: 4px 4px 0 #b8860b, 6px 6px 0 #000;\n\ttext-align: center;\n\tline-height: 1.1;\n\tmargin-bottom: 20px;\n}\n\n#start-screen p {\n\tfont-size: 16px;\n\tcolor: #aaa;\n\tmargin-bottom: 30px;\n}\n\n#game-over h2 {\n\tfont-size: 56px;\n\tfont-weight: 900;\n\tcolor: #ff4444;\n\ttext-shadow: 3px 3px 0 #8b0000, 5px 5px 0 #000;\n\tmargin-bottom: 10px;\n}\n\n#game-over #final-score {\n\tfont-size: 24px;\n\tcolor: #fff;\n\tmargin-bottom: 30px;\n}\n\nbutton {\n\tfont-family: 'Courier New', monospace;\n\tfont-size: 22px;\n\tfont-weight: 900;\n\tpadding: 14px 48px;\n\tborder: none;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\ttext-transform: uppercase;\n\tletter-spacing: 2px;\n\ttransition: transform 0.1s;\n}\n\nbutton:active {\n\ttransform: scale(0.95);\n}\n\n#start-btn {\n\tbackground: #ffcc00;\n\tcolor: #1a1a2e;\n\tbox-shadow: 0 4px 0 #b8860b;\n}\n\n#retry-btn {\n\tbackground: #ff4444;\n\tcolor: #fff;\n\tbox-shadow: 0 4px 0 #8b0000;\n}\n\n.hidden {\n\tdisplay: none !important;\n}"}],"folders":[]},"variants":null,"createdAt":"2026-03-12T21:22:53.212Z","updatedAt":"2026-03-12T21:23:00.911Z"}}