Code edit (9 edits merged)
Please save this source code
Code edit (8 edits merged)
Please save this source code
User prompt
update `var isLocked = currentScore < songUnlockLimit[trackIndex];` to use highScore instead of currentScore
Code edit (5 edits merged)
Please save this source code
User prompt
When starting a song (from start button or menu) set the score to 0. When song ends, store the highscore per track (use songHighscore) in the menu, show the all tracks highScore โช๐ก Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { score: 0 }); /**** * Classes ****/ var BackgroundManager = Container.expand(function () { var self = Container.call(this); self.bg0 = self.attachAsset('background01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 2.4, scaleY: 2.4, alpha: 1 }); self.bg1 = self.attachAsset('background01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1.1, scaleY: 1.1, alpha: 1 }); self.bg2 = self.attachAsset('background01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.5, scaleY: 0.5, alpha: 1 }); self.bg3 = self.attachAsset('background01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.22, scaleY: 0.22, alpha: 1 }); self.bg4 = self.attachAsset('background01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.11, scaleY: 0.11, alpha: 1 }); self.tore0 = self.attachAsset('tore', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 1.2, scaleY: 1.2, alpha: 1 }); self.tore1 = self.attachAsset('tore', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.6, scaleY: 0.6, alpha: 1 }); self.tore2 = self.attachAsset('tore', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.26, scaleY: 0.26, alpha: 1 }); self.tore3 = self.attachAsset('tore', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 0.12, scaleY: 0.12, alpha: 1 }); if (isDebug) { self.bg1.tint = 0xFF0000; self.tore1.tint = 0x00FF00; self.bg2.tint = 0x00FFFF; self.tore2.tint = 0xFF00FF; self.bg3.tint = 0xfff200; } else { self.bg0.tint = 0x1697b8; self.tore0.tint = 0x1697b8; self.bg1.tint = 0x1697b8; self.tore1.tint = 0x1697b8; self.bg2.tint = 0x1697b8; self.tore2.tint = 0x1697b8; self.bg3.tint = 0x1697b8; self.tore3.tint = 0x1697b8; self.bg4.tint = 0x1697b8; } self.bgAnimationSpeed = globalSpeed / 1000; self.bgAnimationAcceleration = 2; self.backgrounds = [self.bg0, self.tore0, self.bg1, self.tore1, self.bg2, self.tore2, self.bg3, self.tore3, self.bg4]; self.bgAnimStartTime = Date.now(); self.update = function () { if (!songStarted) { tween.stop(self.bg0, { scaleX: true, scaleY: true }); tween.stop(self.bg1, { scaleX: true, scaleY: true }); tween.stop(self.bg2, { scaleX: true, scaleY: true }); tween.stop(self.bg3, { scaleX: true, scaleY: true }); tween.stop(self.bg4, { scaleX: true, scaleY: true }); tween.stop(self.tore0, { scaleX: true, scaleY: true }); tween.stop(self.tore1, { scaleX: true, scaleY: true }); tween.stop(self.tore2, { scaleX: true, scaleY: true }); tween.stop(self.tore3, { scaleX: true, scaleY: true }); return; } var now = Date.now(); var elapsed = now - self.bgAnimStartTime; var resetTriggered = false; for (var i = 0; i < self.backgrounds.length; i++) { var bg = self.backgrounds[i]; bg.scaleX += self.bgAnimationSpeed * bg.scaleX; bg.scaleY = bg.scaleX; if (bg.scaleX > 3.0) { bg.scaleX = 0.12; bg.scaleY = bg.scaleX; } bg.tint = 0x1697b8; } }; return self; }); var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5, tint: currentColor, alpha: isDebug ? 1 : 0 }); self.speedX = 0; self.speedY = 0; self.lastIntersectingGates = {}; self.lastIntersectingOrbs = {}; self.update = function () { if (!songStarted) { return; } if (runner) { self.x = runner.x - (isJumping ? 120 : 80) * Math.cos(runner.rotation + Math.PI * 0.5); self.y = runner.y - (isJumping ? 120 : 80) * Math.sin(runner.rotation + Math.PI * 0.5); self.rotation = runner.rotation; } if (gateManager && gateManager.gates) { for (var i = gateManager.gates.length - 1; i >= 0; i--) { var gate = gateManager.gates[i]; var gateId = gate.gateId; if (self.lastIntersectingGates[gateId] === undefined) { self.lastIntersectingGates[gateId] = false; } var currentIntersecting = gate.boundingBox.scaleX >= minGateDetectionScale && gate.boundingBox.scaleX <= maxGateDetectionScale && self.intersects(gate.boundingBox); if (!self.lastIntersectingGates[gateId] && currentIntersecting) { var looseOrbsAnim = new LooseOrbsAnim(gate.directionAngle); looseOrbsAnim.x = self.x; looseOrbsAnim.y = self.y; game.addChild(looseOrbsAnim); playHitSound(); var now = Date.now(); if (now - lastGateHitTime <= 1000) { gatePenaltyValue = Math.max(-10, gatePenaltyValue * 2); } else { gatePenaltyValue = -2; } lastGateHitTime = now; var currentScore = LK.getScore(); var newScore = Math.max(0, Math.min(9999, currentScore + gatePenaltyValue)); LK.setScore(newScore); storage.score = newScore; if (game.updateScore) { game.updateScore(); } if (scoreLabel && scoreLabel.showPenalty) { scoreLabel.showPenalty(gatePenaltyValue); } if (!gate.isDestroying) { gate.isDestroying = true; tween(gate, { scaleX: 0, scaleY: 0 }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { gateManager.destroyGate(gate); } }); } } self.lastIntersectingGates[gateId] = currentIntersecting; } } if (orbManager && orbManager.orbs) { for (var i = orbManager.orbs.length - 1; i >= 0; i--) { var orb = orbManager.orbs[i]; var orbId = orb.orbId; if (self.lastIntersectingOrbs[orbId] === undefined) { self.lastIntersectingOrbs[orbId] = false; } var currentIntersecting = self.isScaleForIntersect(orb) && self.intersects(orb.boundingBox); if (!self.lastIntersectingOrbs[orbId] && currentIntersecting) { var sparkAnim = new SparkAnim(); sparkAnim.x = self.x; sparkAnim.y = self.y; game.addChild(sparkAnim); // Add fireworks for special orbs if (orb.special) { var fireworksAnim = new FireworksAnim(); fireworksAnim.x = self.x; fireworksAnim.y = self.y; game.addChild(fireworksAnim); // Add a white flash to the screen LK.effects.flashScreen(0xFFFFFF, 500); } if (orb.special) { LK.getSound('grabSpecial').play(); } else { //LK.getSound('grab').play(); } var newScore = Math.min(9999, LK.getScore() + (orb.special ? 20 : 1)); LK.setScore(newScore); storage.score = newScore; if (game.updateScore) { game.updateScore(); } orb.destroy(); orbManager.orbs.splice(i, 1); delete self.lastIntersectingOrbs[orbId]; continue; } self.lastIntersectingOrbs[orbId] = currentIntersecting; } } }; self.isScaleForIntersect = function (orb) { var isReachable = orb.currentScale >= minOrbDetectionScale && orb.currentScale <= maxOrbDetectionScale; if (orb.special) { isReachable = orb.currentScale >= minOrbDetectionScale + 0.2 && orb.currentScale <= maxOrbDetectionScale + 0.2; } return isReachable; }; return self; }); var ConfettiAnim = Container.expand(function () { var self = Container.call(this); self.confettiPieces = []; self.spawnTime = Date.now(); self.lifetime = 5000; self.spawnDuration = 2000; self.lastSpawnTime = 0; self.spawnInterval = 5; var futuristicBlueTint = 0x32cbec; self.spawnConfettiPiece = function () { var assetType; var random = Math.random(); if (random < 0.2) { assetType = 'note'; } else if (random < 0.4) { assetType = 'note2'; } else { assetType = 'line'; } var piece; if (assetType === 'line') { var confettiColors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6, 0x32cbec]; var randomColor = confettiColors[Math.floor(Math.random() * confettiColors.length)]; piece = self.attachAsset(assetType, { anchorX: 0.5, anchorY: 0.5, tint: randomColor, alpha: 0.8, scaleX: 3 + Math.random() * 5, scaleY: 0.5 + Math.random() * 1.5 }); } else { piece = self.attachAsset(assetType, { anchorX: 0.5, anchorY: 0.5, tint: futuristicBlueTint, alpha: 0.8, scaleX: 0.3 + Math.random() * 0.4, scaleY: 0.3 + Math.random() * 0.4 }); } piece.x = Math.random() * 2048; piece.y = -100; piece.vx = (Math.random() - 0.5) * 100; piece.vy = 400 + Math.random() * 400; piece.rotationSpeed = (Math.random() - 0.5) * 4; self.confettiPieces.push(piece); tween(piece, { alpha: 0 }, { duration: self.lifetime, easing: tween.linear }); }; self.update = function () { var now = Date.now(); var elapsed = now - self.spawnTime; if (elapsed < self.spawnDuration && now - self.lastSpawnTime >= self.spawnInterval) { self.spawnConfettiPiece(); self.lastSpawnTime = now; } var deltaTime = 16 / 1000; for (var i = self.confettiPieces.length - 1; i >= 0; i--) { var piece = self.confettiPieces[i]; piece.x += piece.vx * deltaTime; piece.y += piece.vy * deltaTime; piece.rotation += piece.rotationSpeed * deltaTime; if (piece.y > 2832 || elapsed >= self.lifetime) { piece.destroy(); self.confettiPieces.splice(i, 1); } } if (elapsed >= self.lifetime && self.confettiPieces.length === 0) { self.destroy(); } }; return self; }); var FireworksAnim = Container.expand(function () { var self = Container.call(this); self.particles = []; self.lifetime = 4000; self.spawnTime = Date.now(); // Create explosion particles var particleCount = 100; var colors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6, 0x32cbec]; for (var i = 0; i < particleCount; i++) { var angle = Math.PI * 2 / particleCount * i; var speed = 500 + Math.random() * 200; var particle = self.attachAsset('line', { anchorX: 0.5, anchorY: 0.5, width: 10, height: 6, scaleX: 3, scaleY: 0.5, tint: colors[Math.floor(Math.random() * colors.length)], alpha: 1 }); particle.rotation = angle; particle.vx = Math.cos(angle) * speed; particle.vy = Math.sin(angle) * speed; self.particles.push(particle); // Fade out particle tween(particle, { alpha: 0, scaleX: 0.5, scaleY: 0.1 }, { duration: self.lifetime, easing: tween.easeOut }); } // Create center flash var flash = self.attachAsset('glow', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1, alpha: 1, blendMode: 1 }); tween(flash, { scaleX: 3, scaleY: 3, alpha: 0 }, { duration: 1500, easing: tween.easeOut }); self.update = function () { var deltaTime = 16 / 1000; for (var i = 0; i < self.particles.length; i++) { var particle = self.particles[i]; particle.x += particle.vx * deltaTime; particle.y += particle.vy * deltaTime; particle.vy += 200 * deltaTime; // Gravity particle.vx *= 0.98; // Drag } var elapsed = Date.now() - self.spawnTime; if (elapsed >= self.lifetime) { self.destroy(); } }; return self; }); var Gate = Container.expand(function () { var self = Container.call(this); self.directionAngle = 0; self.boundingBox = self.attachAsset('boundingBox', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2450, alpha: 0.9 }); self.gateColor = 0xFFFFFF; self.gateId = null; self.updateScale = function (newScale) { self.boundingBox.scaleX = newScale; self.boundingBox.scaleY = newScale; var distance = (2450 - 1366) * newScale; self.boundingBox.x = centerX + distance * Math.cos(self.directionAngle + Math.PI * 0.5); self.boundingBox.y = centerY + distance * Math.sin(self.directionAngle + Math.PI * 0.5); self.boundingBox.rotation = self.directionAngle; }; return self; }); var GateManager = Container.expand(function () { var self = Container.call(this); self.gates = []; self.gateAnimStartTime = Date.now(); self.gateAnimationSpeed = globalSpeed / 1000; self.currentSong = songListV4[0]; self.gateBeats = filterGateData(0); self.songStartTime = Date.now(); self.currentNoteIndex = 0; self.noteSpawnScale = 0.12; self.lastGateAngle = null; self.lastProcessedBeat = -1; self.spawnGateAtTime = function () { var beatValue = null; if (self.currentNoteIndex < self.gateBeats.length) { beatValue = self.gateBeats[self.currentNoteIndex].b; } var startScale = self.noteSpawnScale; var endScale = 1.0; var speed = self.gateAnimationSpeed; var timeToReachPlayer = Math.log(endScale / startScale) / speed; var beatAngle = centerAngle; if (beatValue === "1") { beatAngle = rightAngle; } else if (beatValue === "2") { beatAngle = leftAngle; } else { beatAngle = centerAngle; } self.lastGateAngle = beatAngle; var allAngles = [leftAngle, centerAngle, rightAngle]; var gateAngles = []; for (var i = 0; i < allAngles.length; i++) { if (allAngles[i] !== beatAngle) { gateAngles.push(allAngles[i]); } } var now = Date.now(); var songElapsed = now - self.songStartTime; var beatTime = self.gateBeats[self.currentNoteIndex].t; var spawnTime = beatTime - timeToReachPlayer; for (var j = 0; j < gateAngles.length; j++) { var gate = new Gate(); gate.updateScale(self.noteSpawnScale); gate.spawnTime = Date.now() + 200 / globalSpeed; gate.colorIndex = 0; gate.gateId = getNextGateId(); gate.directionAngle = gateAngles[j]; if (songElapsed >= spawnTime) { self.gates.push(gate); self.addChild(gate); } else { (function (g) { LK.setTimeout(function () { self.gates.push(g); self.addChild(g); }, spawnTime - songElapsed); })(gate); } } if (gateAngles.length === 2 && orbManager) { if (songElapsed >= spawnTime) { orbManager.spawnOrb(beatAngle, beatTime); } else { (function (angle) { LK.setTimeout(function () { orbManager.spawnOrb(angle, beatTime); }, spawnTime - songElapsed); })(beatAngle); } } }; self.update = function () { if (!songStarted) { return; } if (!songStarted) { return; } var now = Date.now(); var songElapsed = now - self.songStartTime; if (self.currentNoteIndex < self.gateBeats.length) { var nextBeat = self.gateBeats[self.currentNoteIndex]; if (songElapsed >= nextBeat.t) { if (now - lastBeatTime >= skipBeatDelay) { self.spawnGateAtTime(); lastBeatTime = now; } self.currentNoteIndex++; } } for (var i = self.gates.length - 1; i >= 0; i--) { var gate = self.gates[i]; var currentScale = gate.boundingBox.scaleX; var newScale = currentScale + self.gateAnimationSpeed * currentScale; if (newScale > 3.0) { gate.destroy(); self.gates.splice(i, 1); } else { gate.updateScale(newScale); } } self.checkSongEnd(); }; self.resetSong = function () { self.songStartTime = Date.now(); self.currentNoteIndex = 0; self.lastGateAngle = null; }; self.checkSongEnd = function () { if (self.currentNoteIndex >= self.gateBeats.length) { var songDuration = self.currentSong.duration || 156000; var songElapsed = Date.now() - self.songStartTime; if (songElapsed >= songDuration && songStarted) { songStarted = false; LK.stopMusic(); if (progressBar) { tween.stop(progressBar.bar, { width: true }); } if (menuIcon) { menuIcon.visible = false; } if (speakerManager && speakerManager.speakers) { LK.setTimeout(function () { for (var i = 0; i < speakerManager.speakers.length; i++) { var speaker = speakerManager.speakers[i]; var exitX, exitY; if (i === 0) { exitX = speaker.x - 800; exitY = speaker.y; } else if (i === 1) { exitX = speaker.x; exitY = speaker.y - 800; } else { exitX = speaker.x + 800; exitY = speaker.y; } tween(speaker, { x: exitX, y: exitY, alpha: 0 }, { duration: 1200, easing: tween.easeIn, onFinish: function onFinish() { if (i === speakerManager.speakers.length - 1) { speakerManager.speakers = []; } } }); } }, 1000); } if (runner) { runner.isReturningToInitial = true; runner.shouldStartIdleAfterReturn = true; runner.isPlayingIdleAnim = false; tween(runner, { x: 1024, y: 2000, rotation: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { runner.isReturningToInitial = false; runner.shouldStartIdleAfterReturn = false; runner.startIdleSequence(); var confettiAnim = new ConfettiAnim(); game.addChild(confettiAnim); LK.getSound('cheers').play(); // Set hasFinishedTrack01 to true if this was track01 if (self.currentSong && self.currentSong.name === "Words Fly Fast") { hasFinishedTrack01 = true; storage.hasFinishedTrack01 = true; } } }); } if (ball) { tween(ball, { x: 1024, y: 2000, rotation: 0 }, { duration: 1000, easing: tween.easeOut }); } for (var j = self.gates.length - 1; j >= 0; j--) { self.gates[j].destroy(); } self.gates = []; } } }; self.destroyGate = function (gate) { var index = self.gates.indexOf(gate); if (index > -1) { self.gates.splice(index, 1); gate.destroy(); } }; return self; }); var HelpIndicator = Container.expand(function () { var self = Container.call(this); self.moveHelpShown = false; self.jumpHelpShown = false; self.gameStartTime = gateManager ? gateManager.songStartTime : Date.now(); // Create help move graphic (initially hidden) self.helpMoveGraphic = self.attachAsset('helpMove', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1000, alpha: 0, scaleX: 0.8, scaleY: 0.8 }); // Create help jump graphic (initially hidden) self.helpJumpGraphic = self.attachAsset('helpJump', { anchorX: 0.5, anchorY: 0.5, x: 1480, y: 1000, alpha: 0, scaleX: 0.8, scaleY: 0.8 }); self.showHelpMove = function () { if (self.moveHelpShown) { return; } self.moveHelpShown = true; // Fade in help move tween(self.helpMoveGraphic, { alpha: 1, scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { // Start horizontal movement animation var moveBackAndForth = function moveBackAndForth() { tween(self.helpMoveGraphic, { x: 1224 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.helpMoveGraphic, { x: 824 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.helpMoveGraphic, { x: 1024 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.helpMoveGraphic, { x: 824 }, { duration: 400, easing: tween.easeInOut, onFinish: function onFinish() { tween(self.helpMoveGraphic, { x: 1024 }, { duration: 400, easing: tween.easeInOut }); } }); } }); } }); } }); }; moveBackAndForth(); // Keep visible for 2000ms, then fade out LK.setTimeout(function () { tween(self.helpMoveGraphic, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 600, easing: tween.easeIn }); }, 2000); } }); }; self.showHelpJump = function () { if (self.jumpHelpShown) { return; } self.jumpHelpShown = true; // Fade in help jump tween(self.helpJumpGraphic, { alpha: 1, scaleX: 1.0, scaleY: 1.0 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { // Start double tap scale animation var scaleAnimation = function scaleAnimation() { tween(self.helpJumpGraphic, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self.helpJumpGraphic, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150, easing: tween.easeIn, onFinish: function onFinish() { // Second tap tween(self.helpJumpGraphic, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self.helpJumpGraphic, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150, easing: tween.easeIn }); } }); } }); } }); }; scaleAnimation(); // Keep visible for 2000ms, then fade out LK.setTimeout(function () { tween(self.helpJumpGraphic, { alpha: 0, scaleX: 0.8, scaleY: 0.8 }, { duration: 400, easing: tween.easeIn }); }, 2000); } }); }; self.update = function () { if (!songStarted || hasFinishedTrack01) { return; } var now = Date.now(); var elapsed = now - self.gameStartTime; // Show help move after 2000ms if (!self.moveHelpShown && elapsed >= 2000) { self.showHelpMove(); } // Help jump is now triggered when first special orb spawns (handled in OrbManager) }; self.reset = function () { self.moveHelpShown = false; self.jumpHelpShown = false; self.gameStartTime = gateManager ? gateManager.songStartTime : Date.now(); tween.stop(self.helpMoveGraphic); tween.stop(self.helpJumpGraphic); self.helpMoveGraphic.alpha = 0; self.helpJumpGraphic.alpha = 0; }; return self; }); var LooseOrbsAnim = Container.expand(function (gateAngle) { var self = Container.call(this); self.orbs = []; self.lifetime = 2000; self.spawnTime = Date.now(); self.gateAngle = gateAngle || 0; var orbCount = 3 + Math.floor(Math.random() * 3); var randScale = 0.3 + Math.random() * 0.4; for (var i = 0; i < orbCount; i++) { var orbAsset = self.attachAsset('orb', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8, scaleX: randScale, scaleY: randScale }); orbAsset.x = (Math.random() - 0.5) * 100; orbAsset.y = (Math.random() - 0.5) * 100; var baseAngle = self.gateAngle - Math.PI / 2; var angleSpread = Math.PI * 0.6; var angle = baseAngle + (Math.random() - 0.5) * angleSpread; var speed = 200 + Math.random() * 200; orbAsset.velocityX = Math.cos(angle) * speed; orbAsset.velocityY = Math.sin(angle) * speed - 200; orbAsset.gravity = 1200; self.orbs.push(orbAsset); LK.setTimeout(function () { tween(orbAsset, { alpha: 0 }, { duration: self.lifetime, easing: tween.easeOut }); }, 1000); tween(orbAsset, { rotation: Math.PI * 6 - Math.random() * Math.PI * 12 }, { duration: self.lifetime, easing: tween.linear }); } self.update = function () { var deltaTime = 16 / 1000; for (var i = 0; i < self.orbs.length; i++) { var orb = self.orbs[i]; orb.velocityY += orb.gravity * deltaTime; orb.x += orb.velocityX * deltaTime; orb.y += orb.velocityY * deltaTime; orb.scaleX += 0.4 * deltaTime; orb.scaleY = orb.scaleX; } var elapsed = Date.now() - self.spawnTime; if (elapsed >= self.lifetime) { self.destroy(); } }; return self; }); var MenuIcon = Container.expand(function () { var self = Container.call(this); var iconGraphics = self.attachAsset('menuIcon', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); self.down = function () { if (songStarted) { songStarted = false; LK.stopMusic(); if (progressBar) { tween.stop(progressBar.bar, { width: true }); } if (runner) { runner.x = 1024; runner.y = 2000; runner.rotation = 0; runner.isReturningToInitial = false; runner.shouldStartIdleAfterReturn = false; runner.isPlayingIdleAnim = false; for (var i = 0; i < runner.frameAssets.length; i++) { runner.frameAssets[i].alpha = i === 0 ? 1 : 0; } for (var i = 0; i < runner.idleFrameAssets.length; i++) { runner.idleFrameAssets[i].alpha = 0; } } showMenu(); self.visible = false; } }; return self; }); var Note = Container.expand(function () { var self = Container.call(this); var noteGraphics = self.attachAsset('note', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); self.velocity = { x: 0, y: -5 }; self.lifetime = 800; self.spawnTime = Date.now(); self.noteType = 'note'; self.noteColor = 0xFFFFFF; self.setNoteType = function (type) { self.noteType = type; noteGraphics.destroy(); noteGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); noteGraphics.tint = self.noteColor; }; self.setColor = function (color) { self.noteColor = color; noteGraphics.tint = color; }; self.setVelocity = function (vx, vy) { self.velocity.x = vx; self.velocity.y = vy; }; self.update = function () { self.x += self.velocity.x; self.y += self.velocity.y; var elapsed = Date.now() - self.spawnTime; if (elapsed > self.lifetime) { self.alpha = Math.max(0, 1 - (elapsed - self.lifetime) / 500); } if (elapsed > self.lifetime + 500 || self.y < -100 || self.y > 2832 || self.x < -100 || self.x > 2148) { self.shouldDestroy = true; } }; return self; }); var NoteSparks = Container.expand(function () { var self = Container.call(this); self.notes = []; self.spawnRate = 500; self.lastSpawnTime = 0; self.spawnEnabled = false; self.spawnX = 1024; self.spawnY = 1366; self.spawnVelocityRange = { x: { min: -2, max: 2 }, y: { min: -8, max: -4 } }; self.noteColors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6]; self.setSpawnPosition = function (x, y) { self.spawnX = x; self.spawnY = y; }; self.setSpawnEnabled = function (enabled) { self.spawnEnabled = enabled; }; self.setSpawnRate = function (rate) { self.spawnRate = rate; }; self.spawnNote = function () { var note = new Note(); note.x = self.spawnX + (Math.random() - 0.5) * 50; note.y = self.spawnY; var vx = self.spawnVelocityRange.x.min + Math.random() * (self.spawnVelocityRange.x.max - self.spawnVelocityRange.x.min); var vy = self.spawnVelocityRange.y.min + Math.random() * (self.spawnVelocityRange.y.max - self.spawnVelocityRange.y.min); note.setVelocity(vx, vy); note.setNoteType(Math.random() > 0.5 ? 'note' : 'note2'); var color = self.noteColors[Math.floor(Math.random() * self.noteColors.length)]; note.setColor(color); note.rotation = (Math.random() - 0.5) * 0.5; self.notes.push(note); self.addChild(note); }; self.spawnBurst = function (count) { for (var i = 0; i < count; i++) { self.spawnNote(); } }; self.update = function () { var now = Date.now(); if (self.spawnEnabled && now - self.lastSpawnTime >= self.spawnRate) { self.spawnNote(); self.lastSpawnTime = now; } for (var i = self.notes.length - 1; i >= 0; i--) { var note = self.notes[i]; if (note.shouldDestroy) { note.destroy(); self.notes.splice(i, 1); } } }; return self; }); var Orb = Container.expand(function (special) { var self = Container.call(this); self.special = special; var frames = ['orb0', 'orb1', 'orb2', 'orb3', 'orb4', 'orb5']; var framesSpecial = ['orbSpe0', 'orbSpe1', 'orbSpe2', 'orbSpe3', 'orbSpe4', 'orbSpe5']; var currentFrames = frames; if (self.special) { currentFrames = framesSpecial; } var orbAssets = []; var currentFrameIndex = 0; var animationInterval = 100; var lastFrameTime = 0; self.directionAngle = 0; self.orbId = null; self.initialSize = 200; self.orbAngleOffsetRatio = 0.15; self.spawnTime = Date.now(); self.currentScale = 0.12; var glowGraphics = self.attachAsset('glow', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8, width: self.initialSize * 1.5, height: self.initialSize * 1.5, blendMode: 1 }); self.boundingBox = self.attachAsset('boundingCircle', { anchorX: 0.5, anchorY: 0.5, width: self.initialSize * 0.5, height: self.initialSize * 0.5, alpha: 0 }); var _rotateGlow = function rotateGlow() { tween(glowGraphics, { rotation: glowGraphics.rotation + Math.PI * 2 }, { duration: 3000, easing: tween.linear, onFinish: _rotateGlow }); }; _rotateGlow(); var _pulseGlow = function pulseGlow() { tween(glowGraphics, { scaleX: 0.8, scaleY: 0.8 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(glowGraphics, { scaleX: 1.6, scaleY: 1.6 }, { duration: 500, easing: tween.easeInOut, onFinish: _pulseGlow }); } }); }; _pulseGlow(); for (var i = 0; i < currentFrames.length; i++) { var asset = self.attachAsset(currentFrames[i], { anchorX: 0.5, anchorY: 0.5, alpha: 0, width: self.initialSize, height: self.initialSize }); orbAssets.push(asset); } if (orbAssets.length > 0) { orbAssets[0].alpha = 1; } self.updateScale = function (newScale) { self.currentScale = newScale; for (var i = 0; i < orbAssets.length; i++) { orbAssets[i].scaleX = newScale; orbAssets[i].scaleY = newScale; if (i === currentFrameIndex) { orbAssets[i].alpha = Math.min(1, newScale + 0.66); } } var distance = (2450 - 1366) * newScale; var angle = self.directionAngle; if (angle != centerAngle) { angle += Math.sign(angle) * self.orbAngleOffsetRatio; } self.x = centerX + distance * Math.cos(angle + Math.PI * 0.5); if (self.special) { self.y = centerY + 128 - 0.6 * distance * Math.sin(angle + Math.PI * 0.5); } else { self.y = centerY + distance * Math.sin(angle + Math.PI * 0.5); } self.rotation = angle; }; self.update = function () { var now = Date.now(); if (now - lastFrameTime >= animationInterval) { var currentScale = orbAssets[0].scaleX; var targetAlpha = Math.min(1, currentScale + 0.66); tween(orbAssets[currentFrameIndex], { alpha: 0 }, { duration: animationInterval / 2 }); currentFrameIndex = (currentFrameIndex + 1) % currentFrames.length; tween(orbAssets[currentFrameIndex], { alpha: targetAlpha }, { duration: animationInterval / 2 }); lastFrameTime = now; } }; return self; }); var OrbManager = Container.expand(function () { var self = Container.call(this); self.orbs = []; self.orbSpawnInterval = 1000; self.lastOrbSpawnTime = 0; self.orbSpawnScale = 0.12; self.orbEndScale = 1.0; self.orbAnimationDuration = 2000; self.currentSpecialOrbsTimers = []; self.loadSpecialOrbsTimers = function () { console.log("loadSpecialOrbsTimers:", self.currentSpecialOrbsTimers); if (specialOrbsTimers && specialOrbsTimers[currentTrackIndex]) { self.currentSpecialOrbsTimers = specialOrbsTimers[currentTrackIndex]; } else { self.currentSpecialOrbsTimers = []; } console.log("loadSpecialOrbsTimers:", self.currentSpecialOrbsTimers); }; self.spawnOrb = function (angle, beatTime) { if (!beatTime) { return; } var isSpecial = beatTime && self.currentSpecialOrbsTimers && self.currentSpecialOrbsTimers[beatTime]; var orb = new Orb(isSpecial); orb.orbId = getNextGateId(); orb.directionAngle = angle || centerAngle; orb.spawnTime = Date.now(); orb.x = centerX; orb.y = centerY; orb.rotation = angle; // Check if beatTime matches a currentSpecialOrbsTimers if (isSpecial) { orb.y = centerY - 1024; if (isDebug) { orb.tint = 0x48ff7f; } // Show help jump when spawning first special orb if (helpIndicator && !jumpHelpShown) { helpIndicator.showHelpJump(); jumpHelpShown = true; // Set the flag to true after showing } } else { orb.updateScale(self.orbSpawnScale); } if (isDebug) { console.log("beatTime: " + beatTime); console.log("currentSpecialOrbsTimers:", self.currentSpecialOrbsTimers); if (orb.special) { console.log("SPECIAL !!! beatTime: " + beatTime); } } self.orbs.push(orb); self.addChild(orb); self.lastOrbSpawnTime = Date.now(); }; self.update = function () { if (!songStarted) { if (self.orbs.length > 0) { for (var i = self.orbs.length - 1; i >= 0; i--) { self.orbs[i].destroy(); } self.orbs = []; } return; } var now = Date.now(); if (now - self.lastOrbSpawnTime >= 600) { var hasPlannedSpawn = false; var beatTime; if (gateManager && gateManager.currentNoteIndex < gateManager.gateBeats.length) { var nextBeat = gateManager.gateBeats[gateManager.currentNoteIndex]; var songElapsed = now - gateManager.songStartTime; var timeToNextBeat = nextBeat.t - songElapsed; beatTime = timeToNextBeat / 2 + songElapsed; if (timeToNextBeat <= 300 && timeToNextBeat > 0) { hasPlannedSpawn = true; } } if (!hasPlannedSpawn) { self.spawnOrb(centerAngle, beatTime); self.lastOrbSpawnTime = now; } } for (var i = self.orbs.length - 1; i >= 0; i--) { var orb = self.orbs[i]; var currentScale = orb.currentScale; var newScale = currentScale + gateManager.gateAnimationSpeed * currentScale; if (newScale > 3.0) { orb.destroy(); self.orbs.splice(i, 1); } else { orb.updateScale(newScale); } } }; return self; }); var ProgressBar = Container.expand(function () { var self = Container.call(this); self.frame = self.attachAsset('progressFrame', { anchorX: 0.0, anchorY: 0.5, alpha: 0.8 }); self.bar = self.attachAsset('progressBar', { anchorX: 0.0, anchorY: 0.5, alpha: 0.8 }); self.bar.x = -0; self.setProgress = function (progress) { progress = Math.max(0, Math.min(1, progress)); self.bar.width = self.frame.width * progress; }; self.startProgressAnimation = function () { var songDuration = 0; if (gateManager && gateManager.currentSong && gateManager.currentSong.duration) { songDuration = gateManager.currentSong.duration; } if (songDuration > 0) { self.setProgress(0); tween(self.bar, { width: self.frame.width }, { duration: songDuration, easing: tween.linear }); } }; self.update = function () {}; self.setProgress(0); return self; }); var Runner = Container.expand(function () { var self = Container.call(this); var frameAssets = []; var currentFrameIndex = 0; var animationInterval = 2; var lastFrameTime = 0; for (var i = 1; i <= 12; i++) { var frameId = 'runnerDir4_' + (i < 10 ? '00' + i : '0' + i); var asset = self.attachAsset(frameId, { anchorX: 0.5, anchorY: 0.5, tint: 0xFFFFFF, alpha: 0 }); frameAssets.push(asset); } if (frameAssets.length > 0) { frameAssets[0].alpha = 1; } self.speedX = 0; self.speedY = 0; self.lastIntersectingGates = {}; self.tickCounter = 0; self.idleFrameAssets = []; var currentIdleFrameIndex = 0; var idleAnimationInterval = 100; var lastIdleFrameTime = 0; self.isPlayingIdleAnim = false; self.isReturningToInitial = false; self.shouldStartIdleAfterReturn = false; self.frameAssets = frameAssets; self.isPlayingWaitingAnim = false; self.currentWaitingFrameIndex = 0; self.lastWaitingFrameTime = 0; for (var i = 1; i <= 20; i++) { var idleFrameId = 'runnerIdleDir8' + (i < 10 ? '00' + i : '0' + i); var idleAsset = self.attachAsset(idleFrameId, { anchorX: 0.5, anchorY: 0.5, tint: 0xFFFFFF, alpha: 0 }); self.idleFrameAssets.push(idleAsset); } self.teleportAnim = function () { var beam = game.addChild(LK.getAsset('beam', { anchorX: 0.5, anchorY: 0.0, x: 1024, y: 0, alpha: 0, scaleY: 0 })); LK.getSound('beamEnter').play(); tween(beam, { alpha: 0.8, scaleY: 1.0 }, { duration: 800, easing: tween.easeIn, onFinish: function onFinish() { LK.getSound('beamTeleport').play(); tween(self, { y: -800, scaleX: 0.1, alpha: 0.3 }, { duration: 1200, easing: tween.easeInOut, onFinish: function onFinish() { tween(beam, { alpha: 0, scaleY: 0 }, { duration: 600, easing: tween.easeOut, onFinish: function onFinish() { beam.destroy(); showMenu(); } }); } }); } }); }; self.rotationAnim = function () { var rotationFrames = ['runnerRotation_01', 'runnerRotation_02', 'runnerRotation_03']; var rotationAssets = []; for (var i = 0; i < self.frameAssets.length; i++) { self.frameAssets[i].alpha = 0; } for (var i = 0; i < self.idleFrameAssets.length; i++) { self.idleFrameAssets[i].alpha = 0; } for (var i = 0; i < rotationFrames.length; i++) { var asset = self.attachAsset(rotationFrames[i], { anchorX: 0.5, anchorY: 0.5, tint: 0xFFFFFF, alpha: 0 }); rotationAssets.push(asset); } var frameIndex = 0; var frameInterval = 100; function showNextFrame() { if (frameIndex < rotationAssets.length) { if (frameIndex > 0) { rotationAssets[frameIndex - 1].alpha = 0; } rotationAssets[frameIndex].alpha = 1; frameIndex++; LK.setTimeout(showNextFrame, frameInterval); } else { rotationAssets[rotationAssets.length - 1].alpha = 0; for (var i = 0; i < rotationAssets.length; i++) { rotationAssets[i].alpha = 0; rotationAssets[i].destroy(); } for (var i = 0; i < self.idleFrameAssets.length; i++) { self.idleFrameAssets[i].alpha = 0; } if (self.idleFrameAssets.length > 0) {} self.idleAnim(); } } showNextFrame(); }; self.startIdleSequence = function () { for (var i = 0; i < self.frameAssets.length; i++) { self.frameAssets[i].alpha = 0; } self.rotationAnim(); }; self.idleAnim = function () { if (self.isPlayingIdleAnim) { return; } self.isPlayingIdleAnim = true; currentIdleFrameIndex = 0; lastIdleFrameTime = Date.now(); for (var i = 0; i < self.frameAssets.length; i++) { self.frameAssets[i].alpha = 0; } if (self.idleFrameAssets.length > 0) { self.idleFrameAssets[0].alpha = 1; } LK.setTimeout(function () { if (self.isPlayingIdleAnim) { self.teleportAnim(); } }, 2000); }; self.update = function () { if (self.isReturningToInitial) { for (var i = 0; i < self.idleFrameAssets.length; i++) { self.idleFrameAssets[i].alpha = 0; } if (self.frameAssets.length > 0) { if (self.frameAssets[currentFrameIndex].alpha === 0) { self.frameAssets[currentFrameIndex].alpha = 1; } } var now = Date.now(); if (now - lastFrameTime >= animationInterval) { self.frameAssets[currentFrameIndex].alpha = 0; currentFrameIndex = (currentFrameIndex + 1) % self.frameAssets.length; self.frameAssets[currentFrameIndex].alpha = 1; lastFrameTime = now; } var angle = Math.atan2(self.y - centerY, self.x - centerX); self.rotation = angle - Math.PI * 0.5; return; } if (!songStarted) { if (self.isPlayingWaitingAnim && self.idleFrameAssets && self.idleFrameAssets.length > 0) { var now_waiting = Date.now(); if (now_waiting - self.lastWaitingFrameTime >= idleAnimationInterval) { if (self.idleFrameAssets[self.currentWaitingFrameIndex]) { self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 0; } self.currentWaitingFrameIndex = (self.currentWaitingFrameIndex + 1) % self.idleFrameAssets.length; if (self.idleFrameAssets[self.currentWaitingFrameIndex]) { self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 1; } self.lastWaitingFrameTime = now_waiting; } } else if (self.isPlayingIdleAnim && self.idleFrameAssets && self.idleFrameAssets.length > 0) { // Post-song idle var now = Date.now(); if (now - lastIdleFrameTime >= idleAnimationInterval) { if (self.idleFrameAssets[currentIdleFrameIndex]) { self.idleFrameAssets[currentIdleFrameIndex].alpha = 0; } currentIdleFrameIndex = (currentIdleFrameIndex + 1) % self.idleFrameAssets.length; if (self.idleFrameAssets[currentIdleFrameIndex]) { self.idleFrameAssets[currentIdleFrameIndex].alpha = 1; } lastIdleFrameTime = now; } } return; // Song not started } // Song has started if (self.isPlayingWaitingAnim) { // Transition from waiting to running self.isPlayingWaitingAnim = false; if (globalWhistleInterval !== null) { LK.clearInterval(globalWhistleInterval); globalWhistleInterval = null; } if (self.idleFrameAssets && self.idleFrameAssets.length > 0 && self.idleFrameAssets[self.currentWaitingFrameIndex]) { self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 0; // Hide current waiting frame } // Setup for running animation currentFrameIndex = 0; if (self.frameAssets && self.frameAssets.length > 0 && frameAssets[0]) { // frameAssets is self.frameAssets frameAssets[0].alpha = 1; // Show first running frame } lastFrameTime = Date.now(); // Reset timer for running anim } if (self.isPlayingIdleAnim) { self.isPlayingIdleAnim = false; for (var i = 0; i < self.idleFrameAssets.length; i++) { self.idleFrameAssets[i].alpha = 0; } currentFrameIndex = 0; if (self.frameAssets.length > 0) { self.frameAssets[0].alpha = 1; } } var angle = Math.atan2(self.y - centerY, self.x - centerX); // Check if jumping by comparing distance from center var distanceFromCenter = Math.sqrt(Math.pow(self.x - centerX, 2) + Math.pow(self.y - centerY, 2)); var normalDistance = Math.sqrt(Math.pow(924, 2) + Math.pow(634, 2)); // Normal track radius if (distanceFromCenter > normalDistance * 1.2 || isJumping) { // During jump, maintain last rotation or use currentRotationAngle if (self.lastRotation !== undefined) { self.rotation = self.lastRotation; } else { self.rotation = currentRotationAngle; } } else { // Normal rotation when on track self.rotation = angle - Math.PI * 0.5; self.lastRotation = self.rotation; // Store last valid rotation } var now = Date.now(); if (now - lastFrameTime >= animationInterval) { self.frameAssets[currentFrameIndex].alpha = 0; currentFrameIndex = (currentFrameIndex + 1) % self.frameAssets.length; self.frameAssets[currentFrameIndex].alpha = 1; lastFrameTime = now; } }; if (!songStarted && self.idleFrameAssets && self.idleFrameAssets.length > 0) { self.isPlayingWaitingAnim = true; self.isPlayingIdleAnim = false; self.isReturningToInitial = false; self.currentWaitingFrameIndex = 0; self.lastWaitingFrameTime = Date.now(); // Ensure running frames are hidden for (var idx = 0; idx < self.frameAssets.length; idx++) { if (self.frameAssets[idx]) { self.frameAssets[idx].alpha = 0; } } // Set initial waiting animation frame for (var idx = 0; idx < self.idleFrameAssets.length; idx++) { if (self.idleFrameAssets[idx]) { self.idleFrameAssets[idx].alpha = idx === self.currentWaitingFrameIndex ? 1 : 0; } } whistleAnim(1024, 1800); } return self; }); var ScoreLabel = Container.expand(function () { var self = Container.call(this); self.scoreText = new Text2('0', { size: 160, fill: 0xFFFFFF }); self.scoreText.anchor.set(0.5, 0.5); self.addChild(self.scoreText); self.penaltyText = new Text2('-2', { size: 120, fill: 0xFF0000 }); self.penaltyText.anchor.set(-0.5, 0.5); self.penaltyText.y = 100; self.penaltyText.alpha = 0; self.addChild(self.penaltyText); self.updateScore = function (newScore) { self.scoreText.setText(newScore.toString()); tween(self, { scaleX: 1.3, scaleY: 1.3 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150, easing: tween.easeIn }); } }); }; self.showPenalty = function (penaltyValue) { penaltyValue = penaltyValue || -2; self.penaltyText.setText(penaltyValue.toString()); tween.stop(self.penaltyText, { alpha: true, y: true }); self.penaltyText.y = 150; self.penaltyText.alpha = 1; self.penaltyText.anchor.x = -0.5 + Math.random() * 2.0; tween(self.penaltyText, { alpha: 0, y: 50 }, { duration: 1000, easing: tween.easeOut }); }; return self; }); var SparkAnim = Container.expand(function () { var self = Container.call(this); var assetType = Math.random() > 0.5 ? 'note' : 'note2'; var glowGraphics = self.attachAsset(assetType, { anchorX: 0.5, anchorY: 0.5, alpha: 1.0, scaleX: 1, scaleY: 1, tint: 0x32cbec }); self.lifetime = 1500; self.spawnTime = Date.now(); var initialVelocity = -200; var acceleration = -2000; var deltaTime = 16; var velocity = initialVelocity; self.update = function () { velocity += acceleration * (deltaTime / 1000); glowGraphics.y += velocity * (deltaTime / 1000); var elapsed = Date.now() - self.spawnTime; if (elapsed >= self.lifetime) { self.destroy(); } }; tween(glowGraphics, { alpha: 0 }, { duration: self.lifetime, easing: tween.easeOut }); return self; }); var Speaker = Container.expand(function () { var self = Container.call(this); var speakerGraphics = self.attachAsset('speaker', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); self.volume = 1.0; self.isPlaying = false; self.setVolume = function (vol) { self.volume = Math.max(0, Math.min(1, vol)); }; self.toggleState = function () { self.isPlaying = !self.isPlaying; speakerGraphics.alpha = self.isPlaying ? 1.0 : 0.5; }; return self; }); var SpeakerManager = Container.expand(function () { var self = Container.call(this); self.speakers = []; self.lastBeatTime = 0; self.beatCooldown = 200; self.speakerSongData = songListV4[0]; self.speakerBeats = filterSpeakerData(0); self.currentBeatIndex = 0; self.songStartTime = 0; var speakerPositions = [{ x: 1024 - 500, y: 512 }, { x: 1024, y: 512 }, { x: 1024 + 500, y: 512 }]; self.initializeSpeakers = function () { for (var i = 0; i < 3; i++) { var speaker = new Speaker(); var finalX = speakerPositions[i].x; var finalY = speakerPositions[i].y; if (i === 0) { speaker.x = finalX - 800; speaker.y = finalY; } else if (i === 1) { speaker.x = finalX; speaker.y = finalY - 800; } else { speaker.x = finalX + 800; speaker.y = finalY; } speaker.scaleX = 0.8; speaker.scaleY = 0.8; speaker.isBigBumping = false; self.speakers.push(speaker); self.addChild(speaker); var delay; if (i === 0 || i === 2) { delay = 0; } else { delay = 300; } LK.setTimeout(function (spkr, targetX, targetY) { return function () { tween(spkr, { x: targetX, y: targetY }, { duration: 800, easing: tween.easeOut }); }; }(speaker, finalX, finalY), delay); } }; self.onBeat = function (beatValue) { var now = Date.now(); if (now - self.lastBeatTime >= self.beatCooldown) { var speakerIndex = -1; if (beatValue === "1") { speakerIndex = 1; } else if (beatValue === "2") { speakerIndex = 2; } else { speakerIndex = 0; } if (speakerIndex >= 0 && speakerIndex < self.speakers.length) { var mainSpeaker = self.speakers[speakerIndex]; mainSpeaker.isBigBumping = true; self.spawnNoteSparks(mainSpeaker); tween(mainSpeaker, { scaleX: 1.2, scaleY: 1.2 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(mainSpeaker, { scaleX: 0.8, scaleY: 0.8 }, { duration: 200, easing: tween.easeIn, onFinish: function onFinish() { mainSpeaker.isBigBumping = false; } }); } }); } self.lastBeatTime = now; } }; self.update = function () { if (songStarted) { if (self.speakers.length === 0) { self.initializeSpeakers(); } for (var i = 0; i < self.speakers.length; i++) { var speaker = self.speakers[i]; var time = Date.now() * 0.003; var twistAngle = Math.sin(time + i * 0.5) * 0.15; speaker.rotation = twistAngle; if (!speaker.isBigBumping) { var scaleValue = 0.8 + Math.sin(time * 2 + i * 0.3) * 0.05; speaker.scaleX = scaleValue; speaker.scaleY = scaleValue; var dancingOffset = Math.sin(time * 3 + i * 0.7) * 10; speaker.y = speakerPositions[i].y + dancingOffset; } } } if (!songStarted) { return; } var now = Date.now(); var songElapsed = now - self.songStartTime; if (self.currentBeatIndex < self.speakerBeats.length) { var nextBeat = self.speakerBeats[self.currentBeatIndex]; if (songElapsed >= nextBeat.t) { self.onBeat(nextBeat.s); self.currentBeatIndex++; } } if (self.currentBeatIndex >= self.speakerBeats.length && self.speakerBeats.length > 0) { var lastBeat = self.speakerBeats[self.speakerBeats.length - 1]; if (songElapsed > lastBeat.t + 5000) { self.songStartTime = Date.now(); self.currentBeatIndex = 0; } } }; self.spawnNoteSparks = function (speaker) { var noteCount = 3 + Math.floor(Math.random() * 3); for (var i = 0; i < noteCount; i++) { var note = new Note(); var angle = Math.random() * Math.PI * 2; var distance = 50 + Math.random() * 100; note.x = speaker.x + Math.cos(angle) * distance; note.y = speaker.y + Math.sin(angle) * distance; var speed = 3 + Math.random() * 5; note.setVelocity(Math.cos(angle) * speed, Math.sin(angle) * speed - 2); note.setNoteType(Math.random() > 0.5 ? 'note' : 'note2'); var futuristicColors = [0x32cbec]; var color = futuristicColors[Math.floor(Math.random() * futuristicColors.length)]; note.setColor(color); note.rotation = (Math.random() - 0.5) * 0.5; note.scaleX = 0.5; note.scaleY = 0.5; if (noteSparks) { noteSparks.notes.push(note); noteSparks.addChild(note); } } }; return self; }); var StartButton = Container.expand(function () { var self = Container.call(this); self.buttonBg = self.attachAsset('start', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.buttonPulse = self.attachAsset('start2', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); self.buttonLoading = self.attachAsset('startLoading', { anchorX: 0.5, anchorY: 0.5, alpha: 1 }); self.x = centerX; self.y = centerY; // Start with scale 0 and animate to 1 over 3 seconds self.scaleX = 0; self.scaleY = 0; self.isEntranceComplete = false; // Pulse animation for buttonPulse var _pulse = function pulse() { tween(self.buttonBg, { scaleX: 1.0, scaleY: 1.0, alpha: 1.0 }, { duration: 1200, easing: tween.easeOut, onFinish: function onFinish() { tween(self.buttonBg, { scaleX: 0.9, scaleY: 0.9, alpha: 0.8 }, { duration: 1200, easing: tween.easeIn, onFinish: _pulse }); } }); }; // Entrance animation from scale 0 to 1 over 3 seconds tween(self, { scaleX: 1, scaleY: 1, rotation: Math.PI * 4 }, { duration: 3000, easing: tween.easeOut, onFinish: function onFinish() { self.buttonBg.alpha = 1; self.buttonPulse.alpha = 0; self.buttonLoading.alpha = 0; self.isEntranceComplete = true; _pulse(); } }); // Start the pulse animation self.down = function () { if (songStarted) { return; } // Prevent clicking until entrance animation is complete if (!self.isEntranceComplete) { return; } // If track01 has been finished, show menu instead of starting a song if (hasFinishedTrack01) { // Stop the pulse animation when pressed tween.stop(self.buttonBg); tween(self, { alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); showMenu(); } }); return; } songStarted = true; // Stop the pulse animation when pressed tween.stop(self.buttonBg); tween(self, { alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { var songStartTime = Date.now(); if (isDebug) { LK.playMusic('track_test'); } else { LK.playMusic('track_01'); } if (gateManager) { gateManager.songStartTime = songStartTime; gateManager.currentBeatIndex = 0; } if (speakerManager) { speakerManager.songStartTime = songStartTime; speakerManager.currentBeatIndex = 0; } if (orbManager) { orbManager.loadSpecialOrbsTimers(); } if (menuIcon && hasFinishedTrack01) { menuIcon.visible = true; } if (scoreLabel) { scoreLabel.visible = true; } if (speakerManager && speakerManager.speakers) { for (var i = 0; i < speakerManager.speakers.length; i++) { speakerManager.speakers[i].visible = true; } } if (progressBar) { progressBar.visible = true; progressBar.startProgressAnimation(); } self.destroy(); } }); }; return self; }); var WhistleParticle = Container.expand(function (startX, startY, assetId) { var self = Container.call(this); self.x = startX + (Math.random() - 0.5) * 40; // Initial horizontal spread self.y = startY; self.shouldDestroy = false; var graphicScale = 0.15 + Math.random() * 0.1; // Make them small: 0.15 to 0.25 var graphic = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, tint: 0x000000, // Black tint as requested scaleX: graphicScale, scaleY: graphicScale, alpha: 0.85 // Start slightly transparent }); graphic.rotation = (Math.random() - 0.5) * (Math.PI / 6); // Initial slight random rotation (up to +/- 30 deg) var swingUpDuration = 5000 + Math.random() * 400; // Duration of upward movement: 0.8s to 1.2s var evaporateDuration = 1000 + Math.random() * 200; // Duration of fade out: 0.4s to 0.6s // Swing Up Animation: // Moves upwards, rotates for a "swing" effect. tween(self, { y: self.y - (2000 + Math.random() * 250), // Move up by 120-180px rotation: self.rotation + (Math.random() - 0.5) * (Math.PI / 2) // Swing rotation up to +/- 45 deg from initial }, { duration: swingUpDuration, easing: tween.easeOutCubic // Smoothly decelerates }); // Evaporate Animation: // Fades out the particle after the swing up animation. tween(self, { alpha: 0 }, { duration: evaporateDuration, delay: swingUpDuration, // Start fading after upward motion is complete easing: tween.easeInQuad, // Smoothly accelerates fade, making it "evaporate" onFinish: function onFinish() { self.shouldDestroy = true; // Flag for cleanup in game.update } }); return self; }); var WorldManager = Container.expand(function () { var self = Container.call(this); var assetWidth = 2732; var screenWidth = 2048; var totalContentWidth = assetWidth * 2; self.x_center_view = -(totalContentWidth / 2 - screenWidth / 2); self.shiftAmplitude = 1024; self.shiftDurationOneWay = 15000; self._isShifting = false; self._animateToRandomTarget = function () { if (!songStarted || !self._isShifting) { self._isShifting = false; tween.stop(self, { x: true }); return; } var minTargetX = self.x_center_view - self.shiftAmplitude; var maxTargetX = self.x_center_view + self.shiftAmplitude; var randomTargetX = minTargetX + Math.random() * (maxTargetX - minTargetX); var currentX = self.x; var distanceToTravel = Math.abs(currentX - randomTargetX); if (distanceToTravel < 50) { LK.setTimeout(self._animateToRandomTarget, 0); return; } var speed = self.shiftAmplitude / self.shiftDurationOneWay; if (speed <= 0) { speed = (self.shiftAmplitude > 0 ? self.shiftAmplitude : 1024) / 15000; if (speed <= 0) { speed = 0.05; } } var dynamicDuration = distanceToTravel / speed; dynamicDuration = Math.max(500, Math.min(dynamicDuration, self.shiftDurationOneWay * 2)); tween(self, { x: randomTargetX }, { duration: dynamicDuration, easing: tween.easeInOut, onFinish: self._animateToRandomTarget }); }; self._initiateShift = function () { if (self._isShifting) { return; } self._isShifting = true; self._animateToRandomTarget(); }; self.update = function () { if (songStarted && !self._isShifting) { self._initiateShift(); } else if (!songStarted && self._isShifting) { self._isShifting = false; tween.stop(self, { x: true }); } }; self.loadWorldAssets = function (trackIndex) { var worldAssets = ['world01', 'world02', 'world03']; var worldAsset = worldAssets[trackIndex] || 'world01'; if (self.bgLeft) { self.bgLeft.destroy(); } if (self.bgRight) { self.bgRight.destroy(); } self.bgLeft = self.attachAsset(worldAsset, { anchorX: 0.5, anchorY: 0.5, x: assetWidth / 2, y: centerY, scaleX: 1.0, scaleY: 1.0 }); self.bgRight = self.attachAsset(worldAsset, { anchorX: 0.5, anchorY: 0.5, x: assetWidth / 2 + assetWidth, y: centerY, scaleX: -1.0, scaleY: 1.0 }); }; self.x = self.x_center_view; self.y = 0; self.bgLeft = self.attachAsset('world01', { anchorX: 0.5, anchorY: 0.5, x: assetWidth / 2, y: centerY, scaleX: 1.0, scaleY: 1.0 }); self.bgRight = self.attachAsset('world01', { anchorX: 0.5, anchorY: 0.5, x: assetWidth / 2 + assetWidth, y: centerY, scaleX: -1.0, scaleY: 1.0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000c33 }); /**** * Game Code ****/ var centerX = 1024; var centerY = 1366; var neonColors = [0x39FF14, 0xFF073A, 0x00FFFF, 0xF3F315, 0xFF61F6, 0xFF9900]; var currentColor = neonColors[Math.floor(Math.random() * neonColors.length)]; function drawPolygon(coordinates, tint) { log("drawPolygon ", coordinates); var lines = []; for (var i = 0; i < coordinates.length; i++) { var startPoint = coordinates[i]; var endPoint = coordinates[(i + 1) % coordinates.length]; var line = drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, tint); lines.push(line); } return lines; } function updatePolygon(lines, newCoordinates, scale) { log("updatePolygon ", lines, scale); if (lines.length !== newCoordinates.length) { error("updatePolygon error: lines and newCoordinates length mismatch"); return lines; } for (var i = 0; i < lines.length; i++) { var startPoint = newCoordinates[i]; var endPoint = newCoordinates[(i + 1) % newCoordinates.length]; updateLine(lines[i], startPoint.x, startPoint.y, endPoint.x, endPoint.y, scale); } return lines; } function drawLine(x1, y1, x2, y2, tint) { log("drawLine ", x1, y1); var line = LK.getAsset('line', { anchorX: 0.0, anchorY: 0.0, x: x1, y: y1, tint: tint }); line.startX = x1; line.startY = y1; line.endX = x2; line.endY = y2; var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); line.width = distance; var angle = Math.atan2(y2 - y1, x2 - x1); line.rotation = angle; return line; } function updateLine(line, newX1, newY1, newX2, newY2, scale) { log("updateLine ", line); scale = scale === undefined ? 1 : scale; var midX = (newX1 + newX2) / 2; var midY = (newY1 + newY2) / 2; newX1 = midX + (newX1 - midX) * scale; newY1 = midY + (newY1 - midY) * scale; newX2 = midX + (newX2 - midX) * scale; newY2 = midY + (newY2 - midY) * scale; line.x = newX1; line.y = newY1; line.startX = newX1; line.startY = newY1; line.endX = newX2; line.endY = newY2; var distance = Math.sqrt(Math.pow(newX2 - newX1, 2) + Math.pow(newY2 - newY1, 2)); line.width = distance; var angle = Math.atan2(newY2 - newY1, newX2 - newX1); line.rotation = angle; return line; } function log() { if (isDebug) { console.log(arguments); } } var songTracks = ["track_01", "track_02", "track_03"]; var songListV4 = [{ "name": "Words Fly Fast", "duration": 157240, "songBeats": [{ "t": 128, "s": "1" }, { "t": 443, "s": "1" }, { "t": 651, "b": "1" }, { "t": 747, "s": "1" }, { "t": 1232, "s": "1" }, { "t": 1256, "b": "1" }, { "t": 1579, "s": "1" }, { "t": 1800, "b": "1" }, { "t": 1893, "s": "1" }, { "t": 2224, "s": "1" }, { "t": 2364, "b": "1" }, { "t": 2549, "s": "1" }, { "t": 2828, "b": "1" }, { "t": 2853, "s": "1" }, { "t": 3269, "s": "1" }, { "t": 3324, "b": "1" }, { "t": 3708, "b": "1" }, { "t": 3712, "s": "1" }, { "t": 4037, "s": "1" }, { "t": 4192, "b": "2" }, { "t": 4352, "s": "1" }, { "t": 4661, "s": "1" }, { "t": 4804, "b": "2" }, { "t": 5072, "s": "1" }, { "t": 5320, "b": "2" }, { "t": 5392, "s": "1" }, { "t": 5728, "s": "1" }, { "t": 5796, "b": "2" }, { "t": 6176, "s": "1" }, { "t": 6240, "b": "2" }, { "t": 6587, "s": "1" }, { "t": 6692, "b": "2" }, { "t": 7141, "s": "1" }, { "t": 7176, "b": "2" }, { "t": 7541, "s": "1" }, { "t": 7640, "b": "2" }, { "t": 7856, "s": "1" }, { "t": 8092, "b": "1" }, { "t": 8171, "s": "3" }, { "t": 8501, "s": "2" }, { "t": 8576, "b": "2" }, { "t": 8816, "s": "2" }, { "t": 9120, "s": "3" }, { "t": 9124, "b": "1" }, { "t": 9424, "s": "2" }, { "t": 9580, "b": "2" }, { "t": 9728, "s": "2" }, { "t": 10032, "s": "3" }, { "t": 10084, "b": "1" }, { "t": 10347, "s": "2" }, { "t": 10548, "b": "2" }, { "t": 10651, "s": "1" }, { "t": 10971, "s": "2" }, { "t": 11072, "b": "1" }, { "t": 11275, "s": "2" }, { "t": 11556, "b": "2" }, { "t": 11600, "s": "2" }, { "t": 11915, "s": "1" }, { "t": 12092, "b": "1" }, { "t": 12240, "s": "2" }, { "t": 12560, "s": "3" }, { "t": 12564, "b": "2" }, { "t": 12875, "s": "2" }, { "t": 13008, "b": "1" }, { "t": 13184, "s": "3" }, { "t": 13400, "b": "2" }, { "t": 13493, "s": "2" }, { "t": 13813, "s": "3" }, { "t": 13916, "b": "1" }, { "t": 14176, "s": "3" }, { "t": 14460, "b": "2" }, { "t": 14517, "s": "1" }, { "t": 14843, "s": "2" }, { "t": 14944, "b": "1" }, { "t": 15147, "s": "2" }, { "t": 15360, "b": "2" }, { "t": 15472, "s": "3" }, { "t": 15781, "s": "2" }, { "t": 16112, "s": "2" }, { "t": 16432, "s": "2" }, { "t": 16741, "s": "2" }, { "t": 17056, "s": "3" }, { "t": 17340, "b": "1" }, { "t": 17360, "s": "3" }, { "t": 17685, "s": "2" }, { "t": 17995, "s": "3" }, { "t": 18260, "b": "2" }, { "t": 18299, "s": "3" }, { "t": 18608, "s": "3" }, { "t": 18917, "s": "3" }, { "t": 19196, "b": "1" }, { "t": 19232, "s": "1" }, { "t": 19547, "s": "2" }, { "t": 19851, "s": "3" }, { "t": 20064, "b": "2" }, { "t": 20171, "s": "1" }, { "t": 20475, "s": "3" }, { "t": 20805, "s": "3" }, { "t": 21092, "b": "1" }, { "t": 21120, "s": "1" }, { "t": 21435, "s": "2" }, { "t": 21749, "s": "2" }, { "t": 22059, "s": "2" }, { "t": 22072, "b": "2" }, { "t": 22373, "s": "2" }, { "t": 22699, "s": "2" }, { "t": 23019, "s": "1" }, { "t": 23100, "b": "1" }, { "t": 23323, "s": "3" }, { "t": 23627, "s": "3" }, { "t": 23931, "s": "2" }, { "t": 24040, "b": "2" }, { "t": 24240, "s": "2" }, { "t": 24549, "s": "2" }, { "t": 24869, "s": "2" }, { "t": 24988, "b": "1" }, { "t": 25189, "s": "3" }, { "t": 25493, "s": "2" }, { "t": 25819, "s": "2" }, { "t": 25884, "b": "2" }, { "t": 26133, "s": "1" }, { "t": 26437, "s": "2" }, { "t": 26757, "s": "2" }, { "t": 26876, "b": "1" }, { "t": 27061, "s": "2" }, { "t": 27365, "s": "2" }, { "t": 27669, "s": "3" }, { "t": 27892, "b": "2" }, { "t": 27973, "s": "3" }, { "t": 28277, "s": "3" }, { "t": 28581, "s": "3" }, { "t": 28820, "b": "1" }, { "t": 28885, "s": "3" }, { "t": 29221, "s": "2" }, { "t": 29557, "s": "3" }, { "t": 29688, "b": "2" }, { "t": 29861, "s": "2" }, { "t": 30197, "s": "2" }, { "t": 30507, "s": "2" }, { "t": 30728, "b": "1" }, { "t": 30827, "s": "2" }, { "t": 31141, "s": "2" }, { "t": 31483, "s": "2" }, { "t": 31696, "b": "2" }, { "t": 31787, "s": "2" }, { "t": 32091, "s": "3" }, { "t": 32395, "s": "3" }, { "t": 32656, "b": "1" }, { "t": 32731, "s": "1" }, { "t": 33045, "s": "2" }, { "t": 33349, "s": "3" }, { "t": 33624, "b": "2" }, { "t": 33653, "s": "2" }, { "t": 33957, "s": "3" }, { "t": 34261, "s": "2" }, { "t": 34576, "s": "2" }, { "t": 34673, "b": "1" }, { "t": 34901, "s": "2" }, { "t": 35211, "s": "3" }, { "t": 35520, "s": "2" }, { "t": 35692, "b": "2" }, { "t": 35829, "s": "3" }, { "t": 36149, "s": "3" }, { "t": 36464, "s": "2" }, { "t": 36628, "b": "1" }, { "t": 36779, "s": "3" }, { "t": 37083, "s": "2" }, { "t": 37403, "s": "2" }, { "t": 37536, "b": "2" }, { "t": 37707, "s": "2" }, { "t": 38037, "s": "2" }, { "t": 38341, "s": "3" }, { "t": 38516, "b": "1" }, { "t": 38661, "s": "2" }, { "t": 38976, "s": "1" }, { "t": 39301, "s": "1" }, { "t": 39372, "b": "2" }, { "t": 39611, "s": "2" }, { "t": 39941, "s": "2" }, { "t": 40256, "s": "1" }, { "t": 40524, "b": "1" }, { "t": 40565, "s": "2" }, { "t": 40885, "s": "1" }, { "t": 41028, "b": "1" }, { "t": 41189, "s": "1" }, { "t": 41499, "s": "1" }, { "t": 41851, "s": "1", "b": "3" }, { "t": 42155, "s": "1", "b": "3" }, { "t": 42459, "s": "1" }, { "t": 42976, "s": "1" }, { "t": 43080, "b": "2" }, { "t": 43429, "s": "1" }, { "t": 43564, "b": "2" }, { "t": 43733, "s": "1" }, { "t": 44043, "s": "1" }, { "t": 44357, "s": "2" }, { "t": 44400, "b": "1" }, { "t": 44672, "s": "2" }, { "t": 44948, "b": "1" }, { "t": 44987, "s": "1" }, { "t": 45312, "s": "1" }, { "t": 45744, "s": "1" }, { "t": 46059, "s": "1" }, { "t": 46373, "s": "1" }, { "t": 46683, "s": "2" }, { "t": 46888, "b": "2" }, { "t": 46992, "s": "2" }, { "t": 47301, "s": "1" }, { "t": 47412, "b": "2" }, { "t": 47605, "s": "2" }, { "t": 47920, "s": "2" }, { "t": 48229, "s": "1" }, { "t": 48260, "b": "1" }, { "t": 48544, "s": "2" }, { "t": 48818, "b": "1" }, { "t": 48859, "s": "1" }, { "t": 49168, "s": "1" }, { "t": 49477, "s": "2" }, { "t": 49845, "s": "1" }, { "t": 50160, "s": "1" }, { "t": 50496, "s": "2" }, { "t": 50805, "s": "1" }, { "t": 50816, "b": "2" }, { "t": 51173, "s": "1" }, { "t": 51477, "s": "2" }, { "t": 51524, "b": "2" }, { "t": 51792, "s": "2" }, { "t": 52107, "s": "2" }, { "t": 52168, "b": "1" }, { "t": 52421, "s": "1" }, { "t": 52684, "b": "1" }, { "t": 52869, "s": "1" }, { "t": 53189, "s": "1" }, { "t": 53595, "s": "1" }, { "t": 53979, "s": "1" }, { "t": 54288, "s": "1" }, { "t": 54540, "b": "3" }, { "t": 54597, "s": "3" }, { "t": 54907, "s": "2" }, { "t": 55227, "s": "3" }, { "t": 55488, "b": "3" }, { "t": 55531, "s": "3" }, { "t": 55851, "s": "2" }, { "t": 56165, "s": "3" }, { "t": 56448, "b": "3" }, { "t": 56475, "s": "3" }, { "t": 56789, "s": "2" }, { "t": 57104, "s": "2" }, { "t": 57408, "s": "1" }, { "t": 57436, "b": "3" }, { "t": 57728, "s": "3" }, { "t": 58053, "s": "2" }, { "t": 58363, "s": "1" }, { "t": 58412, "b": "1" }, { "t": 58667, "s": "3" }, { "t": 58976, "s": "3" }, { "t": 59240, "b": "2" }, { "t": 59307, "s": "1" }, { "t": 59621, "s": "3" }, { "t": 59947, "s": "3" }, { "t": 59988, "b": "1" }, { "t": 60304, "s": "2" }, { "t": 60608, "s": "3" }, { "t": 60808, "b": "2" }, { "t": 60971, "s": "1" }, { "t": 61339, "s": "2" }, { "t": 61636, "b": "1" }, { "t": 61701, "s": "1" }, { "t": 62032, "s": "1" }, { "t": 62336, "s": "3" }, { "t": 62640, "s": "3" }, { "t": 62955, "s": "3" }, { "t": 63269, "s": "3" }, { "t": 63584, "s": "2" }, { "t": 63800, "b": "1" }, { "t": 63904, "s": "3" }, { "t": 64213, "s": "3" }, { "t": 64555, "s": "2" }, { "t": 64688, "b": "2" }, { "t": 64864, "s": "3" }, { "t": 65179, "s": "2" }, { "t": 65499, "s": "2" }, { "t": 65656, "b": "1" }, { "t": 65824, "s": "3" }, { "t": 66144, "s": "2" }, { "t": 66464, "s": "2" }, { "t": 66544, "b": "2" }, { "t": 66768, "s": "3" }, { "t": 67093, "s": "1" }, { "t": 67403, "s": "3" }, { "t": 67492, "b": "1" }, { "t": 67707, "s": "3" }, { "t": 68053, "s": "2" }, { "t": 68368, "s": "2" }, { "t": 68432, "b": "2" }, { "t": 68709, "s": "1" }, { "t": 69024, "s": "1" }, { "t": 69333, "s": "2" }, { "t": 69369, "b": "1" }, { "t": 69648, "s": "3" }, { "t": 69968, "s": "2" }, { "t": 70283, "s": "2" }, { "t": 70336, "b": "2" }, { "t": 70587, "s": "3" }, { "t": 70896, "s": "3" }, { "t": 71205, "s": "3" }, { "t": 71416, "b": "1" }, { "t": 71525, "s": "3" }, { "t": 71835, "s": "3" }, { "t": 72139, "s": "3" }, { "t": 72324, "b": "2" }, { "t": 72448, "s": "3" }, { "t": 72779, "s": "3" }, { "t": 73083, "s": "2" }, { "t": 73387, "s": "3" }, { "t": 73408, "b": "1" }, { "t": 73691, "s": "1" }, { "t": 74016, "s": "3" }, { "t": 74316, "b": "2" }, { "t": 74336, "s": "2" }, { "t": 74667, "s": "3" }, { "t": 74987, "s": "3" }, { "t": 75276, "b": "1" }, { "t": 75296, "s": "1" }, { "t": 75605, "s": "3" }, { "t": 75915, "s": "3" }, { "t": 76204, "b": "2" }, { "t": 76224, "s": "3" }, { "t": 76549, "s": "3" }, { "t": 76853, "s": "3" }, { "t": 77157, "s": "3" }, { "t": 77248, "b": "2" }, { "t": 77461, "s": "3" }, { "t": 77776, "s": "1" }, { "t": 78107, "s": "2" }, { "t": 78232, "b": "1" }, { "t": 78421, "s": "2" }, { "t": 78731, "s": "2" }, { "t": 79045, "s": "2" }, { "t": 79168, "b": "2" }, { "t": 79365, "s": "2" }, { "t": 79669, "s": "1" }, { "t": 79995, "s": "1" }, { "t": 80309, "s": "1" }, { "t": 80640, "s": "1" }, { "t": 80965, "s": "1" }, { "t": 81048, "b": "1" }, { "t": 81296, "s": "1" }, { "t": 81856, "s": "1" }, { "t": 81996, "b": "2" }, { "t": 82165, "s": "2" }, { "t": 82491, "s": "2" }, { "t": 82827, "s": "2" }, { "t": 83096, "b": "1" }, { "t": 83136, "s": "2" }, { "t": 83451, "s": "2" }, { "t": 83765, "s": "1" }, { "t": 84064, "b": "2" }, { "t": 84080, "s": "1" }, { "t": 84389, "s": "1" }, { "t": 84704, "s": "1" }, { "t": 85040, "b": "1" }, { "t": 85040, "s": "1" }, { "t": 85392, "s": "2" }, { "t": 85696, "s": "1" }, { "t": 86008, "b": "2" }, { "t": 86016, "s": "1" }, { "t": 86325, "s": "1" }, { "t": 86688, "s": "1" }, { "t": 86956, "b": "1" }, { "t": 87019, "s": "2" }, { "t": 87323, "s": "2" }, { "t": 87643, "s": "1" }, { "t": 87947, "s": "1" }, { "t": 87976, "b": "2" }, { "t": 88272, "s": "1" }, { "t": 88587, "s": "1" }, { "t": 88832, "b": "1" }, { "t": 88901, "s": "1" }, { "t": 89216, "s": "1" }, { "t": 89520, "s": "1" }, { "t": 89844, "b": "2" }, { "t": 89872, "s": "1" }, { "t": 90176, "s": "2" }, { "t": 90485, "s": "2" }, { "t": 90800, "s": "2" }, { "t": 90832, "b": "1" }, { "t": 91115, "s": "1" }, { "t": 91424, "s": "1" }, { "t": 91819, "s": "1" }, { "t": 92304, "s": "1" }, { "t": 92667, "s": "1" }, { "t": 92672, "b": "3" }, { "t": 92992, "s": "2" }, { "t": 93156, "b": "3" }, { "t": 93301, "s": "3" }, { "t": 93659, "s": "1" }, { "t": 93720, "b": "3" }, { "t": 93968, "s": "3" }, { "t": 94272, "s": "3" }, { "t": 94329, "b": "3" }, { "t": 94581, "s": "2" }, { "t": 94812, "b": "3" }, { "t": 94885, "s": "3" }, { "t": 95205, "s": "3" }, { "t": 95256, "b": "3" }, { "t": 95525, "s": "2" }, { "t": 95720, "b": "1" }, { "t": 95845, "s": "3" }, { "t": 96155, "s": "1" }, { "t": 96485, "s": "2" }, { "t": 96496, "b": "2" }, { "t": 96811, "s": "3" }, { "t": 97125, "s": "3" }, { "t": 97451, "s": "2" }, { "t": 97556, "b": "3" }, { "t": 97755, "s": "3" }, { "t": 98069, "s": "3" }, { "t": 98112, "b": "3" }, { "t": 98411, "s": "2" }, { "t": 98624, "b": "3" }, { "t": 98725, "s": "3" }, { "t": 99035, "s": "3" }, { "t": 99100, "b": "3" }, { "t": 99349, "s": "3" }, { "t": 99604, "b": "1" }, { "t": 99680, "s": "1" }, { "t": 100000, "s": "2" }, { "t": 100304, "s": "3" }, { "t": 100440, "b": "2" }, { "t": 100624, "s": "3" }, { "t": 100928, "s": "3" }, { "t": 101232, "s": "3" }, { "t": 101420, "b": "1" }, { "t": 101557, "s": "3" }, { "t": 101888, "s": "2" }, { "t": 102192, "s": "3" }, { "t": 102388, "b": "2" }, { "t": 102507, "s": "3" }, { "t": 102853, "s": "3" }, { "t": 103157, "s": "3" }, { "t": 103336, "b": "1" }, { "t": 103461, "s": "3" }, { "t": 103765, "s": "2" }, { "t": 104085, "s": "1" }, { "t": 104324, "b": "2" }, { "t": 104395, "s": "1" }, { "t": 104709, "s": "2" }, { "t": 105013, "s": "3" }, { "t": 105172, "b": "1" }, { "t": 105317, "s": "2" }, { "t": 105627, "s": "1" }, { "t": 105931, "s": "3" }, { "t": 106240, "s": "2" }, { "t": 106260, "b": "3" }, { "t": 106555, "s": "3" }, { "t": 106836, "b": "3" }, { "t": 106864, "s": "3" }, { "t": 107168, "s": "3" }, { "t": 107392, "b": "3" }, { "t": 107472, "s": "1" }, { "t": 107781, "s": "2" }, { "t": 108028, "b": "2" }, { "t": 108091, "s": "3" }, { "t": 108416, "s": "2" }, { "t": 108692, "b": "1" }, { "t": 108731, "s": "2" }, { "t": 109045, "s": "2" }, { "t": 109349, "s": "3" }, { "t": 109540, "b": "2" }, { "t": 109669, "s": "2" }, { "t": 109979, "s": "2" }, { "t": 110293, "s": "3" }, { "t": 110488, "b": "1" }, { "t": 110597, "s": "3" }, { "t": 110917, "s": "3" }, { "t": 111221, "s": "3" }, { "t": 111525, "s": "3" }, { "t": 111840, "s": "2" }, { "t": 111932, "b": "2" }, { "t": 112144, "s": "3" }, { "t": 112459, "s": "3" }, { "t": 112773, "s": "3" }, { "t": 112888, "b": "1" }, { "t": 113093, "s": "3" }, { "t": 113419, "s": "3" }, { "t": 113723, "s": "3" }, { "t": 113796, "b": "2" }, { "t": 114032, "s": "2" }, { "t": 114336, "s": "2" }, { "t": 114651, "s": "3" }, { "t": 114864, "b": "1" }, { "t": 114965, "s": "1" }, { "t": 115280, "s": "2" }, { "t": 115584, "s": "3" }, { "t": 115888, "s": "3" }, { "t": 115904, "b": "2" }, { "t": 116208, "s": "2" }, { "t": 116523, "s": "3" }, { "t": 116837, "s": "2" }, { "t": 116864, "b": "2" }, { "t": 117147, "s": "3" }, { "t": 117451, "s": "3" }, { "t": 117787, "s": "3" }, { "t": 117792, "b": "1" }, { "t": 118101, "s": "3" }, { "t": 118405, "s": "3" }, { "t": 118741, "s": "2" }, { "t": 119051, "s": "2" }, { "t": 119184, "b": "2" }, { "t": 119360, "s": "1" }, { "t": 119664, "s": "2" }, { "t": 119973, "s": "3" }, { "t": 120244, "b": "1" }, { "t": 120283, "s": "2" }, { "t": 120603, "s": "3" }, { "t": 120912, "s": "3" }, { "t": 121112, "b": "2" }, { "t": 121216, "s": "3" }, { "t": 121525, "s": "3" }, { "t": 121829, "s": "3" }, { "t": 122121, "b": "3" }, { "t": 122293, "s": "1" }, { "t": 122744, "b": "3" }, { "t": 122779, "s": "1" }, { "t": 123099, "s": "1" }, { "t": 123260, "b": "3" }, { "t": 123504, "s": "1" }, { "t": 123784, "b": "3" }, { "t": 123845, "s": "1" }, { "t": 124217, "b": "3" }, { "t": 124352, "s": "1" }, { "t": 124699, "s": "1" }, { "t": 125024, "s": "1" }, { "t": 125333, "s": "1" }, { "t": 125620, "b": "1" }, { "t": 125648, "s": "1" }, { "t": 125979, "s": "1" }, { "t": 126325, "s": "1" }, { "t": 126635, "s": "1" }, { "t": 126668, "b": "2" }, { "t": 126960, "s": "1" }, { "t": 127275, "s": "1" }, { "t": 127589, "s": "1" }, { "t": 127788, "b": "1" }, { "t": 128059, "s": "1" }, { "t": 128523, "s": "1" }, { "t": 128796, "b": "2" }, { "t": 128837, "s": "2" }, { "t": 129173, "s": "1" }, { "t": 129483, "s": "2" }, { "t": 129716, "b": "1" }, { "t": 129813, "s": "2" }, { "t": 130133, "s": "1" }, { "t": 130437, "s": "1" }, { "t": 130741, "s": "1" }, { "t": 130884, "b": "2" }, { "t": 131109, "s": "1" }, { "t": 131413, "s": "1" }, { "t": 131739, "s": "2" }, { "t": 131936, "b": "1" }, { "t": 132080, "s": "2" }, { "t": 132384, "s": "2" }, { "t": 132784, "s": "1" }, { "t": 132932, "b": "2" }, { "t": 133093, "s": "1" }, { "t": 133408, "s": "2" }, { "t": 133739, "s": "1" }, { "t": 134069, "s": "1" }, { "t": 134092, "b": "1" }, { "t": 134389, "s": "1" }, { "t": 134709, "s": "1" }, { "t": 135019, "s": "1" }, { "t": 135124, "b": "2" }, { "t": 135355, "s": "1" }, { "t": 135733, "s": "1" }, { "t": 136064, "s": "2" }, { "t": 136160, "b": "1" }, { "t": 136384, "s": "3" }, { "t": 136693, "s": "1" }, { "t": 137024, "s": "2" }, { "t": 137128, "b": "2" }, { "t": 137339, "s": "2" }, { "t": 137776, "s": "1" }, { "t": 138261, "s": "1" }, { "t": 138741, "s": "1" }, { "t": 139109, "s": "1" }, { "t": 139435, "s": "1" }, { "t": 139693, "b": "3" }, { "t": 139744, "s": "2" }, { "t": 140048, "s": "2" }, { "t": 140208, "b": "3" }, { "t": 140352, "s": "3" }, { "t": 140656, "s": "3" }, { "t": 140712, "b": "3" }, { "t": 140987, "s": "2" }, { "t": 141216, "b": "3" }, { "t": 141291, "s": "3" }, { "t": 141605, "s": "3" }, { "t": 141700, "b": "3" }, { "t": 141909, "s": "3" }, { "t": 142164, "b": "3" }, { "t": 142251, "s": "1" }, { "t": 142555, "s": "1" }, { "t": 142668, "b": "3" }, { "t": 142859, "s": "3" }, { "t": 143164, "b": "3" }, { "t": 143184, "s": "3" }, { "t": 143504, "s": "3" }, { "t": 143668, "b": "1" }, { "t": 143813, "s": "2" }, { "t": 144123, "s": "3" }, { "t": 144427, "s": "2" }, { "t": 144484, "b": "2" }, { "t": 144741, "s": "3" }, { "t": 145061, "s": "3" }, { "t": 145365, "s": "3" }, { "t": 145412, "b": "1" }, { "t": 145685, "s": "3" }, { "t": 146000, "s": "3" }, { "t": 146309, "s": "2" }, { "t": 146340, "b": "2" }, { "t": 146624, "s": "3" }, { "t": 146928, "s": "2" }, { "t": 147237, "s": "2" }, { "t": 147547, "s": "3" }, { "t": 147708, "b": "3" }, { "t": 147851, "s": "2" }, { "t": 148165, "s": "3" }, { "t": 148304, "b": "3" }, { "t": 148480, "s": "3" }, { "t": 148784, "s": "2" }, { "t": 148820, "b": "3" }, { "t": 149104, "s": "3" }, { "t": 149312, "b": "3" }, { "t": 149413, "s": "3" }, { "t": 149717, "s": "3" }, { "t": 149908, "b": "1" }, { "t": 150032, "s": "2" }, { "t": 150336, "s": "2" }, { "t": 150651, "s": "2" }, { "t": 150804, "b": "2" }, { "t": 150971, "s": "3" }, { "t": 151285, "s": "2" }, { "t": 151600, "s": "3" }, { "t": 151784, "b": "3" }, { "t": 151904, "s": "3" }, { "t": 152208, "s": "3" }, { "t": 152328, "b": "3" }, { "t": 152517, "s": "3" }, { "t": 152821, "s": "3" }, { "t": 152832, "b": "3" }, { "t": 153236, "b": "3" }, { "t": 153248, "s": "1" }, { "t": 153680, "b": "1" }, { "t": 153728, "s": "1" }, { "t": 154208, "s": "1" }, { "t": 154518, "b": "2" }, { "t": 154576, "s": "1" }] }, { "name": "Freedom", "duration": 153600, "songBeats": [{ "t": 0, "s": "3" }, { "t": 315, "s": "3" }, { "t": 619, "s": "1" }, { "t": 928, "s": "1" }, { "t": 1355, "s": "1" }, { "t": 1739, "s": "1" }, { "t": 2176, "s": "1" }, { "t": 2539, "s": "1" }, { "t": 2848, "s": "1" }, { "t": 3173, "s": "2" }, { "t": 3218, "b": "1" }, { "t": 3488, "s": "1" }, { "t": 3522, "b": "1" }, { "t": 4037, "s": "1" }, { "t": 4358, "b": "2" }, { "t": 4480, "s": "1" }, { "t": 4661, "b": "2" }, { "t": 4837, "s": "1" }, { "t": 5163, "s": "1" }, { "t": 5378, "b": "1" }, { "t": 5520, "s": "2" }, { "t": 5682, "b": "1" }, { "t": 5899, "s": "1" }, { "t": 5980, "b": "1" }, { "t": 6341, "s": "1" }, { "t": 6557, "b": "2" }, { "t": 6704, "s": "1" }, { "t": 6862, "b": "2" }, { "t": 7045, "s": "2" }, { "t": 7166, "b": "2" }, { "t": 7365, "s": "1" }, { "t": 7670, "b": "1" }, { "t": 7696, "s": "1" }, { "t": 7974, "b": "1" }, { "t": 8080, "s": "1" }, { "t": 8271, "b": "1" }, { "t": 8405, "s": "1" }, { "t": 8709, "s": "1" }, { "t": 8719, "b": "2" }, { "t": 9023, "b": "2" }, { "t": 9109, "s": "1" }, { "t": 9322, "b": "2" }, { "t": 9483, "s": "1" }, { "t": 9819, "s": "1" }, { "t": 9926, "b": "0" }, { "t": 10128, "s": "2" }, { "t": 10234, "b": "0" }, { "t": 10437, "s": "2" }, { "t": 10747, "s": "3" }, { "t": 11037, "b": "2" }, { "t": 11072, "s": "2" }, { "t": 11341, "b": "2" }, { "t": 11387, "s": "2" }, { "t": 11691, "s": "3" }, { "t": 11741, "b": "1" }, { "t": 12005, "s": "3" }, { "t": 12044, "b": "1" }, { "t": 12278, "b": "2" }, { "t": 12352, "s": "2" }, { "t": 12578, "b": "2" }, { "t": 12656, "s": "1" }, { "t": 12842, "b": "1" }, { "t": 12976, "s": "2" }, { "t": 13155, "b": "1" }, { "t": 13296, "s": "1" }, { "t": 13438, "b": "2" }, { "t": 13600, "s": "3" }, { "t": 13744, "b": "2" }, { "t": 13904, "s": "3" }, { "t": 13982, "b": "1" }, { "t": 14208, "s": "2" }, { "t": 14289, "b": "1" }, { "t": 14528, "s": "1" }, { "t": 14569, "b": "2" }, { "t": 14832, "s": "2" }, { "t": 14875, "b": "2" }, { "t": 15147, "s": "3" }, { "t": 15233, "b": "1" }, { "t": 15451, "s": "2" }, { "t": 15544, "b": "1" }, { "t": 15755, "s": "3" }, { "t": 15789, "b": "2" }, { "t": 16059, "s": "3" }, { "t": 16099, "b": "2" }, { "t": 16340, "b": "1" }, { "t": 16363, "s": "3" }, { "t": 16641, "b": "1" }, { "t": 16667, "s": "2" }, { "t": 16881, "b": "2" }, { "t": 16981, "s": "2" }, { "t": 17186, "b": "2" }, { "t": 17296, "s": "1" }, { "t": 17600, "s": "1" }, { "t": 17921, "b": "1" }, { "t": 17947, "s": "2" }, { "t": 18193, "b": "1" }, { "t": 18256, "s": "2" }, { "t": 18447, "b": "1" }, { "t": 18603, "s": "3" }, { "t": 18697, "b": "1" }, { "t": 18949, "s": "2" }, { "t": 19007, "b": "1" }, { "t": 19275, "s": "2" }, { "t": 19589, "s": "3" }, { "t": 19738, "b": "2" }, { "t": 19893, "s": "2" }, { "t": 20045, "b": "2" }, { "t": 20213, "s": "1" }, { "t": 20340, "b": "2" }, { "t": 20768, "s": "1" }, { "t": 21083, "s": "1" }, { "t": 21321, "b": "2" }, { "t": 21440, "s": "1" }, { "t": 21623, "b": "2" }, { "t": 21765, "s": "1" }, { "t": 21934, "b": "2" }, { "t": 22085, "s": "1" }, { "t": 22223, "b": "2" }, { "t": 22512, "s": "1" }, { "t": 22827, "s": "1" }, { "t": 23189, "s": "1" }, { "t": 23453, "b": "2" }, { "t": 23499, "s": "1" }, { "t": 23767, "b": "2" }, { "t": 23803, "s": "1" }, { "t": 24057, "b": "2" }, { "t": 24149, "s": "1" }, { "t": 24480, "s": "1" }, { "t": 24843, "s": "1" }, { "t": 25269, "s": "1" }, { "t": 25627, "s": "1" }, { "t": 25968, "s": "1" }, { "t": 26197, "b": "1" }, { "t": 26293, "s": "1" }, { "t": 26507, "b": "1" }, { "t": 26597, "s": "1" }, { "t": 26987, "s": "1" }, { "t": 27085, "b": "1" }, { "t": 27360, "s": "1" }, { "t": 27387, "b": "1" }, { "t": 27698, "b": "1" }, { "t": 27776, "s": "1" }, { "t": 28128, "s": "3" }, { "t": 28473, "b": "3" }, { "t": 28501, "s": "2" }, { "t": 28848, "s": "1" }, { "t": 29066, "b": "3" }, { "t": 29152, "s": "2" }, { "t": 29467, "s": "2" }, { "t": 29658, "b": "3" }, { "t": 29776, "s": "1" }, { "t": 30085, "s": "2" }, { "t": 30197, "b": "3" }, { "t": 30400, "s": "3" }, { "t": 30715, "s": "3" }, { "t": 30770, "b": "3" }, { "t": 31029, "s": "1" }, { "t": 31071, "b": "3" }, { "t": 31285, "b": "2" }, { "t": 31392, "s": "3" }, { "t": 31596, "b": "2" }, { "t": 31717, "s": "1" }, { "t": 32048, "s": "1" }, { "t": 32062, "b": "1" }, { "t": 32367, "b": "1" }, { "t": 32368, "s": "1" }, { "t": 32663, "b": "1" }, { "t": 32741, "s": "2" }, { "t": 33045, "s": "3" }, { "t": 33129, "b": "2" }, { "t": 33430, "b": "2" }, { "t": 33467, "s": "1" }, { "t": 33736, "b": "2" }, { "t": 33771, "s": "2" }, { "t": 34091, "s": "3" }, { "t": 34190, "b": "1" }, { "t": 34411, "s": "2" }, { "t": 34491, "b": "1" }, { "t": 34731, "s": "1" }, { "t": 34798, "b": "1" }, { "t": 35051, "s": "3" }, { "t": 35218, "b": "2" }, { "t": 35387, "s": "3" }, { "t": 35520, "b": "2" }, { "t": 35771, "s": "1" }, { "t": 35829, "b": "2" }, { "t": 36181, "s": "1" }, { "t": 36417, "b": "3" }, { "t": 36491, "s": "3" }, { "t": 36731, "b": "3" }, { "t": 36805, "s": "2" }, { "t": 37021, "b": "3" }, { "t": 37120, "s": "2" }, { "t": 37337, "b": "3" }, { "t": 37445, "s": "2" }, { "t": 37755, "s": "3" }, { "t": 38080, "s": "1" }, { "t": 38194, "b": "1" }, { "t": 38384, "s": "2" }, { "t": 38504, "b": "1" }, { "t": 38704, "s": "2" }, { "t": 39019, "s": "3" }, { "t": 39194, "b": "2" }, { "t": 39344, "s": "2" }, { "t": 39509, "b": "2" }, { "t": 39653, "s": "2" }, { "t": 39963, "s": "3" }, { "t": 40170, "b": "1" }, { "t": 40325, "s": "1" }, { "t": 40471, "b": "1" }, { "t": 40629, "s": "2" }, { "t": 40949, "s": "1" }, { "t": 41241, "b": "2" }, { "t": 41253, "s": "1" }, { "t": 41551, "b": "2" }, { "t": 41579, "s": "2" }, { "t": 41952, "s": "1" }, { "t": 42261, "s": "2" }, { "t": 42277, "b": "1" }, { "t": 42571, "s": "2" }, { "t": 42583, "b": "1" }, { "t": 42875, "s": "3" }, { "t": 42878, "b": "1" }, { "t": 43269, "s": "1" }, { "t": 43417, "b": "2" }, { "t": 43595, "s": "3" }, { "t": 43731, "b": "2" }, { "t": 43915, "s": "2" }, { "t": 44029, "b": "2" }, { "t": 44224, "s": "3" }, { "t": 44565, "s": "2" }, { "t": 44880, "s": "3" }, { "t": 45189, "s": "2" }, { "t": 45454, "b": "3" }, { "t": 45515, "s": "2" }, { "t": 45840, "s": "1" }, { "t": 45917, "b": "3" }, { "t": 46223, "b": "3" }, { "t": 46293, "s": "1" }, { "t": 46429, "b": "3" }, { "t": 46597, "s": "3" }, { "t": 46735, "b": "3" }, { "t": 46923, "s": "3" }, { "t": 47197, "b": "2" }, { "t": 47227, "s": "3" }, { "t": 47509, "b": "2" }, { "t": 47541, "s": "2" }, { "t": 47803, "b": "2" }, { "t": 47861, "s": "3" }, { "t": 48165, "s": "2" }, { "t": 48469, "s": "2" }, { "t": 48773, "s": "2" }, { "t": 49050, "b": "1" }, { "t": 49083, "s": "2" }, { "t": 49354, "b": "1" }, { "t": 49387, "s": "2" }, { "t": 49660, "b": "1" }, { "t": 49701, "s": "3" }, { "t": 50005, "s": "3" }, { "t": 50315, "s": "2" }, { "t": 50624, "s": "3" }, { "t": 50997, "s": "3" }, { "t": 51274, "b": "2" }, { "t": 51301, "s": "2" }, { "t": 51574, "b": "2" }, { "t": 51611, "s": "2" }, { "t": 51885, "b": "2" }, { "t": 51957, "s": "3" }, { "t": 52267, "s": "2" }, { "t": 52576, "s": "3" }, { "t": 52880, "s": "3" }, { "t": 53205, "s": "2" }, { "t": 53520, "s": "3" }, { "t": 53692, "b": "1" }, { "t": 53835, "s": "3" }, { "t": 53995, "b": "1" }, { "t": 54139, "s": "3" }, { "t": 54293, "b": "1" }, { "t": 54443, "s": "3" }, { "t": 54600, "b": "1" }, { "t": 54752, "s": "2" }, { "t": 54893, "b": "1" }, { "t": 55083, "s": "1" }, { "t": 55424, "s": "1" }, { "t": 56085, "s": "1" }, { "t": 56400, "s": "2" }, { "t": 56715, "s": "3" }, { "t": 56858, "b": "0" }, { "t": 57093, "s": "1" }, { "t": 57361, "b": "0" }, { "t": 57403, "s": "1" }, { "t": 57728, "s": "2" }, { "t": 57969, "b": "0" }, { "t": 58032, "s": "2" }, { "t": 58336, "s": "2" }, { "t": 58489, "b": "0" }, { "t": 58640, "s": "3" }, { "t": 58944, "s": "1" }, { "t": 58986, "b": "2" }, { "t": 59264, "s": "3" }, { "t": 59290, "b": "2" }, { "t": 59579, "s": "3" }, { "t": 59883, "s": "3" }, { "t": 60113, "b": "1" }, { "t": 60208, "s": "2" }, { "t": 60416, "b": "1" }, { "t": 60523, "s": "2" }, { "t": 60837, "s": "2" }, { "t": 61138, "b": "2" }, { "t": 61141, "s": "1" }, { "t": 61438, "b": "2" }, { "t": 61451, "s": "2" }, { "t": 61741, "b": "2" }, { "t": 61765, "s": "2" }, { "t": 62085, "s": "3" }, { "t": 62366, "b": "1" }, { "t": 62395, "s": "2" }, { "t": 62675, "b": "1" }, { "t": 62704, "s": "3" }, { "t": 63024, "s": "2" }, { "t": 63344, "s": "2" }, { "t": 63453, "b": "2" }, { "t": 63653, "s": "2" }, { "t": 63756, "b": "2" }, { "t": 63957, "s": "2" }, { "t": 64141, "b": "3" }, { "t": 64283, "s": "2" }, { "t": 64608, "s": "2" }, { "t": 64745, "b": "3" }, { "t": 64912, "s": "3" }, { "t": 65057, "b": "3" }, { "t": 65253, "s": "2" }, { "t": 65573, "s": "2" }, { "t": 65833, "b": "1" }, { "t": 65904, "s": "2" }, { "t": 66138, "b": "1" }, { "t": 66213, "s": "2" }, { "t": 66533, "s": "3" }, { "t": 66869, "s": "1" }, { "t": 66994, "b": "2" }, { "t": 67173, "s": "2" }, { "t": 67298, "b": "2" }, { "t": 67477, "s": "2" }, { "t": 67787, "s": "2" }, { "t": 68093, "b": "1" }, { "t": 68117, "s": "2" }, { "t": 68399, "b": "1" }, { "t": 68437, "s": "3" }, { "t": 68747, "s": "2" }, { "t": 69067, "s": "2" }, { "t": 69121, "b": "2" }, { "t": 69371, "s": "3" }, { "t": 69426, "b": "2" }, { "t": 69675, "s": "3" }, { "t": 70000, "s": "3" }, { "t": 70138, "b": "1" }, { "t": 70389, "s": "1" }, { "t": 70439, "b": "1" }, { "t": 70704, "s": "2" }, { "t": 70746, "b": "1" }, { "t": 71013, "s": "3" }, { "t": 71342, "b": "2" }, { "t": 71344, "s": "2" }, { "t": 71653, "b": "2" }, { "t": 71653, "s": "1" }, { "t": 71963, "s": "1" }, { "t": 72272, "s": "3" }, { "t": 72592, "s": "2" }, { "t": 72896, "s": "1" }, { "t": 73205, "s": "3" }, { "t": 73313, "b": "3" }, { "t": 73563, "s": "1" }, { "t": 73857, "b": "3" }, { "t": 73877, "s": "2" }, { "t": 74174, "b": "3" }, { "t": 74181, "s": "3" }, { "t": 74528, "s": "3" }, { "t": 75019, "s": "1" }, { "t": 75328, "s": "1" }, { "t": 75786, "b": "1" }, { "t": 76011, "s": "1" }, { "t": 76088, "b": "1" }, { "t": 76336, "s": "1" }, { "t": 76396, "b": "1" }, { "t": 76651, "s": "1" }, { "t": 77008, "s": "1" }, { "t": 77390, "b": "2" }, { "t": 77429, "s": "1" }, { "t": 77692, "b": "2" }, { "t": 77872, "s": "1" }, { "t": 77998, "b": "2" }, { "t": 78293, "s": "1" }, { "t": 78624, "s": "1" }, { "t": 78933, "s": "1" }, { "t": 78977, "b": "1" }, { "t": 79237, "s": "1" }, { "t": 79281, "b": "1" }, { "t": 79590, "b": "1" }, { "t": 79616, "s": "1" }, { "t": 80064, "s": "1" }, { "t": 80459, "s": "1" }, { "t": 80665, "b": "2" }, { "t": 80779, "s": "1" }, { "t": 80975, "b": "2" }, { "t": 81125, "s": "1" }, { "t": 81429, "s": "1" }, { "t": 81733, "s": "3" }, { "t": 82069, "s": "1" }, { "t": 82373, "s": "2" }, { "t": 82473, "b": "1" }, { "t": 82715, "s": "2" }, { "t": 82782, "b": "1" }, { "t": 83051, "s": "1" }, { "t": 83190, "b": "2" }, { "t": 83371, "s": "3" }, { "t": 83499, "b": "2" }, { "t": 83723, "s": "1" }, { "t": 83937, "b": "3" }, { "t": 84032, "s": "3" }, { "t": 84357, "s": "3" }, { "t": 84667, "s": "3" }, { "t": 84971, "s": "3" }, { "t": 85038, "b": "3" }, { "t": 85291, "s": "3" }, { "t": 85341, "b": "3" }, { "t": 85605, "s": "2" }, { "t": 85915, "s": "2" }, { "t": 85953, "b": "1" }, { "t": 86229, "s": "3" }, { "t": 86263, "b": "1" }, { "t": 86539, "s": "3" }, { "t": 86864, "s": "3" }, { "t": 87086, "b": "2" }, { "t": 87179, "s": "2" }, { "t": 87391, "b": "2" }, { "t": 87488, "s": "2" }, { "t": 87797, "s": "2" }, { "t": 88107, "s": "2" }, { "t": 88123, "b": "1" }, { "t": 88411, "s": "3" }, { "t": 88424, "b": "1" }, { "t": 88731, "s": "2" }, { "t": 89072, "s": "2" }, { "t": 89153, "b": "2" }, { "t": 89387, "s": "2" }, { "t": 89457, "b": "2" }, { "t": 89696, "s": "3" }, { "t": 89766, "b": "2" }, { "t": 90005, "s": "3" }, { "t": 90221, "b": "1" }, { "t": 90309, "s": "3" }, { "t": 90524, "b": "1" }, { "t": 90619, "s": "3" }, { "t": 90933, "s": "2" }, { "t": 91150, "b": "3" }, { "t": 91253, "s": "2" }, { "t": 91451, "b": "3" }, { "t": 91557, "s": "2" }, { "t": 91826, "b": "3" }, { "t": 91931, "s": "3" }, { "t": 92136, "b": "3" }, { "t": 92363, "s": "2" }, { "t": 92741, "s": "1" }, { "t": 93045, "s": "3" }, { "t": 93077, "b": "1" }, { "t": 93386, "b": "1" }, { "t": 93472, "s": "1" }, { "t": 93797, "s": "3" }, { "t": 94112, "s": "3" }, { "t": 94166, "b": "2" }, { "t": 94421, "s": "3" }, { "t": 94480, "b": "2" }, { "t": 94752, "s": "2" }, { "t": 95056, "s": "2" }, { "t": 95386, "b": "1" }, { "t": 95392, "s": "3" }, { "t": 95686, "b": "1" }, { "t": 95760, "s": "1" }, { "t": 96069, "s": "3" }, { "t": 96395, "s": "2" }, { "t": 96617, "b": "2" }, { "t": 96715, "s": "2" }, { "t": 96926, "b": "2" }, { "t": 97035, "s": "2" }, { "t": 97344, "s": "2" }, { "t": 97648, "s": "2" }, { "t": 97798, "b": "1" }, { "t": 98048, "s": "1" }, { "t": 98103, "b": "1" }, { "t": 98352, "s": "2" }, { "t": 98656, "s": "1" }, { "t": 98938, "b": "2" }, { "t": 98965, "s": "2" }, { "t": 99246, "b": "2" }, { "t": 99269, "s": "2" }, { "t": 99544, "b": "2" }, { "t": 99579, "s": "3" }, { "t": 99893, "s": "2" }, { "t": 100077, "b": "1" }, { "t": 100208, "s": "3" }, { "t": 100382, "b": "1" }, { "t": 100512, "s": "3" }, { "t": 100680, "b": "1" }, { "t": 100821, "s": "3" }, { "t": 101131, "s": "3" }, { "t": 101145, "b": "2" }, { "t": 101445, "s": "3" }, { "t": 101447, "b": "2" }, { "t": 101747, "b": "2" }, { "t": 101749, "s": "3" }, { "t": 102117, "s": "2" }, { "t": 102325, "b": "3" }, { "t": 102421, "s": "3" }, { "t": 102628, "b": "3" }, { "t": 102731, "s": "3" }, { "t": 103045, "s": "2" }, { "t": 103365, "s": "3" }, { "t": 103481, "b": "3" }, { "t": 103669, "s": "1" }, { "t": 103782, "b": "3" }, { "t": 103973, "s": "2" }, { "t": 104309, "s": "2" }, { "t": 104635, "s": "2" }, { "t": 104854, "b": "3" }, { "t": 104960, "s": "1" }, { "t": 105166, "b": "3" }, { "t": 105285, "s": "1" }, { "t": 105589, "s": "2" }, { "t": 105893, "s": "1" }, { "t": 106094, "b": "3" }, { "t": 106240, "s": "1" }, { "t": 106401, "b": "3" }, { "t": 106587, "s": "1" }, { "t": 106891, "s": "3" }, { "t": 107200, "s": "2" }, { "t": 107266, "b": "3" }, { "t": 107504, "s": "3" }, { "t": 107569, "b": "3" }, { "t": 107829, "s": "2" }, { "t": 108144, "s": "3" }, { "t": 108453, "s": "2" }, { "t": 108506, "b": "3" }, { "t": 108809, "b": "3" }, { "t": 108848, "s": "2" }, { "t": 109157, "s": "1" }, { "t": 109493, "s": "1" }, { "t": 109808, "s": "3" }, { "t": 110123, "s": "1" }, { "t": 110432, "s": "1" }, { "t": 110741, "s": "1" }, { "t": 110938, "b": "1" }, { "t": 111056, "s": "1" }, { "t": 111241, "b": "1" }, { "t": 111403, "s": "1" }, { "t": 111776, "s": "1" }, { "t": 112128, "s": "3" }, { "t": 112218, "b": "2" }, { "t": 112432, "s": "3" }, { "t": 112521, "b": "2" }, { "t": 112757, "s": "2" }, { "t": 112823, "b": "2" }, { "t": 113061, "s": "3" }, { "t": 113365, "s": "3" }, { "t": 113621, "b": "1" }, { "t": 113675, "s": "2" }, { "t": 113930, "b": "1" }, { "t": 114005, "s": "3" }, { "t": 114309, "s": "2" }, { "t": 114613, "s": "3" }, { "t": 114881, "b": "2" }, { "t": 114917, "s": "2" }, { "t": 115191, "b": "2" }, { "t": 115227, "s": "3" }, { "t": 115490, "b": "2" }, { "t": 115536, "s": "3" }, { "t": 115845, "s": "3" }, { "t": 115989, "b": "1" }, { "t": 116187, "s": "2" }, { "t": 116291, "b": "1" }, { "t": 116539, "s": "2" }, { "t": 116596, "b": "1" }, { "t": 116848, "s": "3" }, { "t": 117138, "b": "2" }, { "t": 117157, "s": "3" }, { "t": 117447, "b": "2" }, { "t": 117477, "s": "2" }, { "t": 117740, "b": "2" }, { "t": 117781, "s": "3" }, { "t": 118091, "s": "2" }, { "t": 118416, "s": "2" }, { "t": 118731, "s": "3" }, { "t": 118830, "b": "3" }, { "t": 119045, "s": "3" }, { "t": 119132, "b": "3" }, { "t": 119365, "s": "3" }, { "t": 119449, "b": "3" }, { "t": 119739, "s": "1" }, { "t": 119756, "b": "3" }, { "t": 120080, "s": "1" }, { "t": 120432, "s": "1" }, { "t": 120736, "s": "3" }, { "t": 120885, "b": "1" }, { "t": 121040, "s": "2" }, { "t": 121192, "b": "1" }, { "t": 121392, "s": "3" }, { "t": 121707, "s": "2" }, { "t": 122011, "s": "3" }, { "t": 122073, "b": "2" }, { "t": 122331, "s": "2" }, { "t": 122374, "b": "2" }, { "t": 122661, "s": "2" }, { "t": 122997, "s": "3" }, { "t": 123157, "b": "1" }, { "t": 123301, "s": "3" }, { "t": 123460, "b": "1" }, { "t": 123605, "s": "3" }, { "t": 123941, "s": "3" }, { "t": 124256, "s": "3" }, { "t": 124402, "b": "2" }, { "t": 124576, "s": "2" }, { "t": 124708, "b": "2" }, { "t": 124880, "s": "2" }, { "t": 125200, "s": "3" }, { "t": 125525, "s": "3" }, { "t": 125533, "b": "1" }, { "t": 125834, "b": "1" }, { "t": 125840, "s": "2" }, { "t": 126155, "s": "3" }, { "t": 126469, "s": "2" }, { "t": 126779, "s": "2" }, { "t": 126806, "b": "2" }, { "t": 127104, "s": "3" }, { "t": 127113, "b": "2" }, { "t": 127413, "s": "2" }, { "t": 127723, "s": "3" }, { "t": 128027, "s": "3" }, { "t": 128186, "b": "3" }, { "t": 128341, "s": "3" }, { "t": 128491, "b": "3" }, { "t": 128651, "s": "3" }, { "t": 128953, "b": "3" }, { "t": 128960, "s": "3" }, { "t": 129255, "b": "3" }, { "t": 129280, "s": "3" }, { "t": 129595, "s": "3" }, { "t": 129909, "s": "3" }, { "t": 129941, "b": "1" }, { "t": 130229, "s": "3" }, { "t": 130242, "b": "1" }, { "t": 130533, "s": "3" }, { "t": 130843, "s": "2" }, { "t": 131093, "b": "2" }, { "t": 131211, "s": "1" }, { "t": 131395, "b": "2" }, { "t": 131531, "s": "2" }, { "t": 131702, "b": "2" }, { "t": 131845, "s": "1" }, { "t": 132155, "s": "3" }, { "t": 132305, "b": "1" }, { "t": 132480, "s": "2" }, { "t": 132609, "b": "1" }, { "t": 132784, "s": "3" }, { "t": 133099, "s": "3" }, { "t": 133401, "b": "2" }, { "t": 133413, "s": "3" }, { "t": 133706, "b": "2" }, { "t": 133744, "s": "3" }, { "t": 134002, "b": "2" }, { "t": 134048, "s": "2" }, { "t": 134352, "s": "3" }, { "t": 134550, "b": "1" }, { "t": 134672, "s": "3" }, { "t": 134856, "b": "1" }, { "t": 134987, "s": "2" }, { "t": 135333, "s": "3" }, { "t": 135593, "b": "2" }, { "t": 135637, "s": "3" }, { "t": 135896, "b": "2" }, { "t": 135947, "s": "3" }, { "t": 136206, "b": "2" }, { "t": 136261, "s": "3" }, { "t": 136571, "s": "3" }, { "t": 136885, "s": "3" }, { "t": 137195, "s": "3" }, { "t": 137238, "b": "3" }, { "t": 137504, "s": "3" }, { "t": 137538, "b": "3" }, { "t": 137819, "s": "3" }, { "t": 137881, "b": "3" }, { "t": 138123, "s": "3" }, { "t": 138183, "b": "3" }, { "t": 138432, "s": "3" }, { "t": 138497, "b": "3" }, { "t": 138802, "b": "3" }, { "t": 140544, "s": "2" }, { "t": 140853, "s": "2" }, { "t": 141045, "b": "1" }, { "t": 141163, "s": "3" }, { "t": 141351, "b": "1" }, { "t": 141483, "s": "1" }, { "t": 141845, "s": "1" }, { "t": 142160, "s": "1" }, { "t": 142512, "s": "1" }, { "t": 142816, "s": "2" }, { "t": 143062, "b": "2" }, { "t": 143141, "s": "1" }, { "t": 143367, "b": "2" }, { "t": 143488, "s": "1" }, { "t": 143888, "s": "1" }, { "t": 144325, "s": "1" }, { "t": 144529, "b": "1" }, { "t": 144645, "s": "1" }, { "t": 144833, "b": "1" }, { "t": 144971, "s": "1" }, { "t": 145280, "s": "2" }, { "t": 145595, "s": "1" }, { "t": 145899, "s": "1" }, { "t": 146029, "b": "2" }, { "t": 146203, "s": "2" }, { "t": 146339, "b": "2" }, { "t": 146608, "s": "1" }, { "t": 146933, "s": "1" }, { "t": 147264, "s": "1" }, { "t": 147346, "b": "1" }, { "t": 147568, "s": "1" }, { "t": 147652, "b": "1" }, { "t": 147883, "s": "1" }, { "t": 147947, "b": "1" }, { "t": 148192, "s": "1" }, { "t": 148501, "s": "1" }, { "t": 148805, "s": "1" }, { "t": 149109, "s": "1" }, { "t": 149419, "s": "1" }, { "t": 149728, "s": "1" }, { "t": 149938, "b": "3" }, { "t": 150160, "s": "1" }, { "t": 150240, "b": "3" }, { "t": 150464, "s": "2" }, { "t": 150539, "b": "3" }, { "t": 150849, "b": "3" }] }, { "name": "Stranger in the Storm", "duration": 170760, "songBeats": [{ "t": 165, "s": "1" }, { "t": 469, "s": "1" }, { "t": 582, "b": "0" }, { "t": 869, "s": "1" }, { "t": 1221, "s": "1" }, { "t": 1286, "b": "0" }, { "t": 1541, "s": "1" }, { "t": 1941, "s": "1" }, { "t": 2053, "b": "0" }, { "t": 2288, "s": "1" }, { "t": 2635, "s": "1" }, { "t": 2769, "b": "0" }, { "t": 2987, "s": "2" }, { "t": 3093, "b": "0" }, { "t": 3339, "s": "2" }, { "t": 3465, "b": "0" }, { "t": 3691, "s": "1" }, { "t": 4043, "s": "1" }, { "t": 4194, "b": "0" }, { "t": 4395, "s": "1" }, { "t": 4752, "s": "1" }, { "t": 4929, "b": "0" }, { "t": 5104, "s": "2" }, { "t": 5501, "b": "0" }, { "t": 5627, "s": "1" }, { "t": 5931, "s": "2" }, { "t": 6141, "b": "1" }, { "t": 6240, "s": "1" }, { "t": 6544, "s": "2" }, { "t": 6845, "b": "2" }, { "t": 6869, "s": "1" }, { "t": 7221, "s": "1" }, { "t": 7462, "b": "1" }, { "t": 7573, "s": "1" }, { "t": 7931, "s": "1" }, { "t": 8149, "b": "2" }, { "t": 8272, "s": "1" }, { "t": 8456, "b": "2" }, { "t": 8635, "s": "1" }, { "t": 8944, "s": "1" }, { "t": 8954, "b": "1" }, { "t": 9253, "s": "3" }, { "t": 9637, "s": "1" }, { "t": 9662, "b": "2" }, { "t": 9941, "s": "3" }, { "t": 10245, "s": "3" }, { "t": 10285, "b": "1" }, { "t": 10555, "s": "3" }, { "t": 10875, "s": "3" }, { "t": 10921, "b": "2" }, { "t": 11179, "s": "2" }, { "t": 11235, "b": "2" }, { "t": 11488, "s": "1" }, { "t": 11577, "b": "1" }, { "t": 11803, "s": "1" }, { "t": 12107, "s": "3" }, { "t": 12373, "b": "2" }, { "t": 12416, "s": "2" }, { "t": 12720, "s": "3" }, { "t": 13024, "s": "1" }, { "t": 13098, "b": "1" }, { "t": 13344, "s": "3" }, { "t": 13398, "b": "1" }, { "t": 13648, "s": "2" }, { "t": 13737, "b": "2" }, { "t": 13952, "s": "2" }, { "t": 14050, "b": "2" }, { "t": 14277, "s": "1" }, { "t": 14521, "b": "1" }, { "t": 14635, "s": "1" }, { "t": 14837, "b": "1" }, { "t": 14987, "s": "1" }, { "t": 15269, "b": "2" }, { "t": 15296, "s": "1" }, { "t": 15593, "b": "2" }, { "t": 15605, "s": "3" }, { "t": 15925, "b": "1" }, { "t": 16112, "s": "1" }, { "t": 16248, "b": "1" }, { "t": 16741, "s": "1" }, { "t": 16945, "b": "3" }, { "t": 17045, "s": "3" }, { "t": 17254, "b": "3" }, { "t": 17413, "s": "1" }, { "t": 17682, "b": "3" }, { "t": 17723, "s": "3" }, { "t": 17996, "b": "3" }, { "t": 18165, "s": "1" }, { "t": 18422, "b": "3" }, { "t": 18507, "s": "1" }, { "t": 18734, "b": "3" }, { "t": 18827, "s": "1" }, { "t": 19157, "s": "3" }, { "t": 19213, "b": "3" }, { "t": 19483, "s": "2" }, { "t": 19515, "b": "3" }, { "t": 19787, "s": "3" }, { "t": 20101, "s": "3" }, { "t": 20414, "b": "1" }, { "t": 20416, "s": "3" }, { "t": 20720, "s": "2" }, { "t": 21035, "s": "3" }, { "t": 21101, "b": "2" }, { "t": 21344, "s": "2" }, { "t": 21412, "b": "2" }, { "t": 21691, "s": "1" }, { "t": 21765, "b": "1" }, { "t": 22032, "s": "1" }, { "t": 22357, "s": "1" }, { "t": 22402, "b": "2" }, { "t": 22683, "s": "3" }, { "t": 22702, "b": "2" }, { "t": 23061, "s": "1" }, { "t": 23321, "b": "3" }, { "t": 23371, "s": "3" }, { "t": 23675, "s": "3" }, { "t": 23984, "s": "2" }, { "t": 24065, "b": "3" }, { "t": 24288, "s": "2" }, { "t": 24366, "b": "3" }, { "t": 24592, "s": "3" }, { "t": 24814, "b": "3" }, { "t": 24896, "s": "2" }, { "t": 25123, "b": "3" }, { "t": 25205, "s": "1" }, { "t": 25509, "s": "3" }, { "t": 25589, "b": "3" }, { "t": 25856, "s": "1" }, { "t": 25899, "b": "3" }, { "t": 26160, "s": "3" }, { "t": 26265, "b": "1" }, { "t": 26480, "s": "3" }, { "t": 26789, "s": "3" }, { "t": 26901, "b": "2" }, { "t": 27200, "s": "1" }, { "t": 27207, "b": "2" }, { "t": 27585, "b": "1" }, { "t": 27696, "s": "1" }, { "t": 28005, "s": "1" }, { "t": 28285, "b": "2" }, { "t": 28331, "s": "3" }, { "t": 28661, "s": "2" }, { "t": 28987, "s": "3" }, { "t": 29001, "b": "1" }, { "t": 29307, "s": "3" }, { "t": 29606, "b": "2" }, { "t": 29632, "s": "3" }, { "t": 29908, "b": "2" }, { "t": 29947, "s": "2" }, { "t": 30251, "s": "2" }, { "t": 30310, "b": "1" }, { "t": 30555, "s": "2" }, { "t": 30621, "b": "1" }, { "t": 30864, "s": "1" }, { "t": 31057, "b": "2" }, { "t": 31195, "s": "3" }, { "t": 31366, "b": "2" }, { "t": 31504, "s": "2" }, { "t": 31808, "s": "3" }, { "t": 31825, "b": "1" }, { "t": 32112, "s": "3" }, { "t": 32141, "b": "1" }, { "t": 32416, "s": "3" }, { "t": 32541, "b": "2" }, { "t": 32720, "s": "3" }, { "t": 32850, "b": "2" }, { "t": 33035, "s": "3" }, { "t": 33197, "b": "1" }, { "t": 33339, "s": "2" }, { "t": 33499, "b": "1" }, { "t": 33653, "s": "2" }, { "t": 33941, "b": "2" }, { "t": 33957, "s": "3" }, { "t": 34248, "b": "2" }, { "t": 34261, "s": "3" }, { "t": 34537, "b": "1" }, { "t": 34571, "s": "2" }, { "t": 34850, "b": "1" }, { "t": 34891, "s": "1" }, { "t": 35195, "s": "2" }, { "t": 35201, "b": "2" }, { "t": 35504, "s": "2" }, { "t": 35525, "b": "2" }, { "t": 35829, "s": "2" }, { "t": 35881, "b": "1" }, { "t": 36155, "s": "2" }, { "t": 36194, "b": "1" }, { "t": 36469, "s": "1" }, { "t": 36526, "b": "2" }, { "t": 36773, "s": "3" }, { "t": 36839, "b": "2" }, { "t": 37077, "s": "3" }, { "t": 37282, "b": "1" }, { "t": 37387, "s": "3" }, { "t": 37701, "s": "3" }, { "t": 37905, "b": "2" }, { "t": 38011, "s": "3" }, { "t": 38207, "b": "2" }, { "t": 38336, "s": "3" }, { "t": 38640, "s": "3" }, { "t": 38645, "b": "1" }, { "t": 38949, "b": "1" }, { "t": 38981, "s": "1" }, { "t": 39296, "s": "2" }, { "t": 39301, "b": "2" }, { "t": 39602, "b": "2" }, { "t": 39605, "s": "3" }, { "t": 39909, "s": "3" }, { "t": 40157, "b": "3" }, { "t": 40213, "s": "2" }, { "t": 40528, "s": "2" }, { "t": 40848, "s": "2" }, { "t": 40965, "b": "3" }, { "t": 41163, "s": "2" }, { "t": 41477, "s": "2" }, { "t": 41721, "b": "3" }, { "t": 41781, "s": "2" }, { "t": 42031, "b": "3" }, { "t": 42165, "s": "2" }, { "t": 42466, "b": "3" }, { "t": 42501, "s": "2" }, { "t": 42790, "b": "3" }, { "t": 42821, "s": "2" }, { "t": 43125, "s": "3" }, { "t": 43440, "s": "3" }, { "t": 43744, "s": "3" }, { "t": 43749, "b": "1" }, { "t": 44057, "b": "1" }, { "t": 44059, "s": "2" }, { "t": 44363, "s": "3" }, { "t": 44533, "b": "2" }, { "t": 44683, "s": "2" }, { "t": 44987, "s": "3" }, { "t": 45149, "b": "1" }, { "t": 45328, "s": "3" }, { "t": 45643, "s": "2" }, { "t": 45933, "b": "2" }, { "t": 45957, "s": "3" }, { "t": 46247, "b": "2" }, { "t": 46267, "s": "3" }, { "t": 46576, "s": "3" }, { "t": 46673, "b": "1" }, { "t": 46885, "s": "3" }, { "t": 47221, "s": "3" }, { "t": 47317, "b": "2" }, { "t": 47525, "s": "3" }, { "t": 47631, "b": "2" }, { "t": 47829, "s": "3" }, { "t": 47973, "b": "1" }, { "t": 48267, "s": "1" }, { "t": 48683, "s": "1" }, { "t": 48987, "s": "1" }, { "t": 49419, "s": "1" }, { "t": 49781, "s": "1" }, { "t": 49917, "b": "3" }, { "t": 50107, "s": "1" }, { "t": 50621, "b": "3" }, { "t": 50811, "s": "2" }, { "t": 51120, "s": "1" }, { "t": 51424, "s": "2" }, { "t": 51517, "b": "1" }, { "t": 51744, "s": "1" }, { "t": 52053, "s": "1" }, { "t": 52313, "b": "2" }, { "t": 52400, "s": "1" }, { "t": 52630, "b": "2" }, { "t": 52752, "s": "1" }, { "t": 53067, "s": "1" }, { "t": 53392, "s": "1" }, { "t": 53401, "b": "1" }, { "t": 53713, "b": "1" }, { "t": 53797, "s": "1" }, { "t": 54165, "s": "2" }, { "t": 54382, "b": "2" }, { "t": 54528, "s": "1" }, { "t": 54693, "b": "2" }, { "t": 54869, "s": "1" }, { "t": 55184, "s": "1" }, { "t": 55390, "b": "1" }, { "t": 55573, "s": "1" }, { "t": 55693, "b": "1" }, { "t": 55931, "s": "1" }, { "t": 56277, "b": "2" }, { "t": 56283, "s": "1" }, { "t": 56581, "b": "2" }, { "t": 56635, "s": "1" }, { "t": 56981, "s": "1" }, { "t": 57186, "b": "1" }, { "t": 57344, "s": "1" }, { "t": 57509, "b": "1" }, { "t": 57669, "s": "1" }, { "t": 58053, "s": "1" }, { "t": 58186, "b": "2" }, { "t": 58416, "s": "1" }, { "t": 58488, "b": "2" }, { "t": 58768, "s": "1" }, { "t": 59070, "b": "1" }, { "t": 59104, "s": "1" }, { "t": 59374, "b": "1" }, { "t": 59456, "s": "1" }, { "t": 59808, "s": "1" }, { "t": 59990, "b": "2" }, { "t": 60160, "s": "1" }, { "t": 60299, "b": "2" }, { "t": 60512, "s": "1" }, { "t": 60826, "b": "1" }, { "t": 60869, "s": "2" }, { "t": 61135, "b": "1" }, { "t": 61211, "s": "1" }, { "t": 61579, "s": "1" }, { "t": 61646, "b": "2" }, { "t": 61925, "s": "1" }, { "t": 61975, "b": "2" }, { "t": 62283, "s": "1" }, { "t": 62592, "s": "2" }, { "t": 62774, "b": "3" }, { "t": 62912, "s": "3" }, { "t": 63307, "s": "1" }, { "t": 63501, "b": "3" }, { "t": 63627, "s": "3" }, { "t": 63984, "s": "1" }, { "t": 64277, "b": "3" }, { "t": 64288, "s": "3" }, { "t": 64584, "b": "3" }, { "t": 64592, "s": "3" }, { "t": 64901, "s": "1" }, { "t": 65173, "b": "2" }, { "t": 65216, "s": "3" }, { "t": 65489, "b": "2" }, { "t": 65525, "s": "3" }, { "t": 65835, "s": "3" }, { "t": 66053, "b": "2" }, { "t": 66139, "s": "3" }, { "t": 66448, "s": "3" }, { "t": 66757, "s": "3" }, { "t": 66769, "b": "2" }, { "t": 67067, "s": "3" }, { "t": 67089, "b": "2" }, { "t": 67371, "s": "3" }, { "t": 67513, "b": "2" }, { "t": 67675, "s": "3" }, { "t": 67827, "b": "2" }, { "t": 67984, "s": "3" }, { "t": 68150, "b": "1" }, { "t": 68293, "s": "3" }, { "t": 68452, "b": "1" }, { "t": 68624, "s": "2" }, { "t": 68939, "s": "2" }, { "t": 68949, "b": "1" }, { "t": 69243, "s": "3" }, { "t": 69557, "s": "1" }, { "t": 69693, "b": "1" }, { "t": 69867, "s": "1" }, { "t": 70219, "s": "1" }, { "t": 70571, "s": "1" }, { "t": 70701, "b": "0" }, { "t": 70885, "s": "2" }, { "t": 71195, "s": "2" }, { "t": 71410, "b": "0" }, { "t": 71499, "s": "1" }, { "t": 71813, "s": "2" }, { "t": 72094, "b": "0" }, { "t": 72149, "s": "1" }, { "t": 72397, "b": "0" }, { "t": 72464, "s": "1" }, { "t": 72773, "s": "3" }, { "t": 72809, "b": "0" }, { "t": 73083, "s": "3" }, { "t": 73397, "s": "2" }, { "t": 73442, "b": "0" }, { "t": 73707, "s": "3" }, { "t": 74016, "s": "3" }, { "t": 74093, "b": "1" }, { "t": 74325, "s": "3" }, { "t": 74635, "s": "3" }, { "t": 74805, "b": "2" }, { "t": 74981, "s": "2" }, { "t": 75291, "s": "3" }, { "t": 75542, "b": "1" }, { "t": 75605, "s": "3" }, { "t": 75915, "s": "3" }, { "t": 76245, "s": "3" }, { "t": 76321, "b": "2" }, { "t": 76549, "s": "2" }, { "t": 76638, "b": "2" }, { "t": 76864, "s": "2" }, { "t": 77037, "b": "1" }, { "t": 77179, "s": "2" }, { "t": 77342, "b": "1" }, { "t": 77488, "s": "2" }, { "t": 77745, "b": "2" }, { "t": 77808, "s": "2" }, { "t": 78061, "b": "2" }, { "t": 78123, "s": "2" }, { "t": 78442, "b": "1" }, { "t": 78448, "s": "3" }, { "t": 78784, "s": "2" }, { "t": 79093, "s": "3" }, { "t": 79126, "b": "2" }, { "t": 79403, "s": "3" }, { "t": 79437, "b": "2" }, { "t": 79712, "s": "3" }, { "t": 79773, "b": "1" }, { "t": 80016, "s": "3" }, { "t": 80088, "b": "1" }, { "t": 80331, "s": "3" }, { "t": 80458, "b": "2" }, { "t": 80635, "s": "1" }, { "t": 80773, "b": "2" }, { "t": 81213, "b": "1" }, { "t": 81264, "s": "1" }, { "t": 81605, "s": "1" }, { "t": 81909, "s": "2" }, { "t": 81962, "b": "3" }, { "t": 82219, "s": "2" }, { "t": 82533, "s": "1" }, { "t": 82689, "b": "3" }, { "t": 82848, "s": "2" }, { "t": 83173, "s": "2" }, { "t": 83453, "b": "3" }, { "t": 83488, "s": "2" }, { "t": 83803, "s": "2" }, { "t": 84139, "s": "2" }, { "t": 84209, "b": "3" }, { "t": 84443, "s": "2" }, { "t": 84510, "b": "3" }, { "t": 84752, "s": "3" }, { "t": 84927, "b": "3" }, { "t": 85061, "s": "2" }, { "t": 85230, "b": "3" }, { "t": 85371, "s": "2" }, { "t": 85630, "b": "3" }, { "t": 85680, "s": "2" }, { "t": 85953, "b": "3" }, { "t": 85984, "s": "2" }, { "t": 86299, "s": "2" }, { "t": 86608, "s": "2" }, { "t": 86917, "s": "2" }, { "t": 87227, "s": "2" }, { "t": 87536, "s": "2" }, { "t": 87840, "s": "2" }, { "t": 87922, "b": "1" }, { "t": 88165, "s": "2" }, { "t": 88507, "s": "2" }, { "t": 88629, "b": "2" }, { "t": 88821, "s": "2" }, { "t": 88942, "b": "2" }, { "t": 89152, "s": "2" }, { "t": 89345, "b": "1" }, { "t": 89461, "s": "2" }, { "t": 89861, "s": "2" }, { "t": 90061, "b": "2" }, { "t": 90187, "s": "2" }, { "t": 90371, "b": "2" }, { "t": 90496, "s": "3" }, { "t": 90805, "s": "2" }, { "t": 90869, "b": "1" }, { "t": 91109, "s": "2" }, { "t": 91419, "s": "2" }, { "t": 91473, "b": "2" }, { "t": 91728, "s": "2" }, { "t": 91786, "b": "2" }, { "t": 92032, "s": "3" }, { "t": 92142, "b": "1" }, { "t": 92347, "s": "3" }, { "t": 92452, "b": "1" }, { "t": 92656, "s": "3" }, { "t": 92924, "b": "2" }, { "t": 93024, "s": "3" }, { "t": 93239, "b": "2" }, { "t": 93339, "s": "2" }, { "t": 93653, "s": "2" }, { "t": 93853, "b": "3" }, { "t": 93957, "s": "2" }, { "t": 94277, "s": "2" }, { "t": 94608, "s": "3" }, { "t": 94661, "b": "3" }, { "t": 94917, "s": "1" }, { "t": 95237, "s": "2" }, { "t": 95389, "b": "3" }, { "t": 95568, "s": "2" }, { "t": 95883, "s": "2" }, { "t": 96185, "b": "3" }, { "t": 96187, "s": "3" }, { "t": 96493, "b": "3" }, { "t": 96496, "s": "2" }, { "t": 96816, "s": "2" }, { "t": 97131, "s": "3" }, { "t": 97161, "b": "1" }, { "t": 97435, "s": "2" }, { "t": 97749, "s": "2" }, { "t": 97853, "b": "2" }, { "t": 98053, "s": "2" }, { "t": 98166, "b": "2" }, { "t": 98368, "s": "3" }, { "t": 98545, "b": "1" }, { "t": 98683, "s": "2" }, { "t": 98987, "s": "2" }, { "t": 99273, "b": "2" }, { "t": 99301, "s": "2" }, { "t": 99611, "s": "3" }, { "t": 99925, "s": "3" }, { "t": 100098, "b": "1" }, { "t": 100235, "s": "3" }, { "t": 100401, "b": "1" }, { "t": 100544, "s": "1" }, { "t": 100805, "b": "2" }, { "t": 100859, "s": "2" }, { "t": 101130, "b": "2" }, { "t": 101163, "s": "2" }, { "t": 101472, "s": "2" }, { "t": 101513, "b": "1" }, { "t": 101909, "s": "1" }, { "t": 102341, "s": "1" }, { "t": 102736, "s": "1" }, { "t": 103056, "s": "1" }, { "t": 103429, "s": "1" }, { "t": 103755, "s": "1" }, { "t": 104080, "s": "1" }, { "t": 104422, "b": "3" }, { "t": 104453, "s": "2" }, { "t": 104723, "b": "3" }, { "t": 104773, "s": "3" }, { "t": 105083, "s": "2" }, { "t": 105210, "b": "3" }, { "t": 105413, "s": "3" }, { "t": 105519, "b": "3" }, { "t": 105723, "s": "2" }, { "t": 105953, "b": "3" }, { "t": 106037, "s": "1" }, { "t": 106261, "b": "3" }, { "t": 106347, "s": "2" }, { "t": 106661, "s": "3" }, { "t": 106714, "b": "3" }, { "t": 106976, "s": "3" }, { "t": 107030, "b": "3" }, { "t": 107280, "s": "3" }, { "t": 107397, "b": "1" }, { "t": 107589, "s": "3" }, { "t": 107701, "b": "1" }, { "t": 107893, "s": "3" }, { "t": 108065, "b": "2" }, { "t": 108203, "s": "3" }, { "t": 108401, "b": "2" }, { "t": 108512, "s": "3" }, { "t": 108709, "b": "1" }, { "t": 108848, "s": "3" }, { "t": 109011, "b": "1" }, { "t": 109152, "s": "3" }, { "t": 109373, "b": "2" }, { "t": 109467, "s": "3" }, { "t": 109707, "b": "2" }, { "t": 109803, "s": "3" }, { "t": 110107, "s": "3" }, { "t": 110225, "b": "1" }, { "t": 110421, "s": "2" }, { "t": 110538, "b": "1" }, { "t": 110741, "s": "2" }, { "t": 110901, "b": "2" }, { "t": 111045, "s": "2" }, { "t": 111224, "b": "2" }, { "t": 111365, "s": "2" }, { "t": 111675, "s": "2" }, { "t": 111690, "b": "1" }, { "t": 111984, "s": "1" }, { "t": 112299, "s": "3" }, { "t": 112325, "b": "2" }, { "t": 112608, "s": "3" }, { "t": 112632, "b": "2" }, { "t": 112928, "s": "3" }, { "t": 113041, "b": "1" }, { "t": 113237, "s": "3" }, { "t": 113375, "b": "1" }, { "t": 113557, "s": "3" }, { "t": 113770, "b": "2" }, { "t": 113877, "s": "3" }, { "t": 114076, "b": "2" }, { "t": 114187, "s": "3" }, { "t": 114453, "b": "1" }, { "t": 114512, "s": "1" }, { "t": 114767, "b": "1" }, { "t": 114832, "s": "1" }, { "t": 115143, "b": "2" }, { "t": 115179, "s": "1" }, { "t": 115452, "b": "2" }, { "t": 115541, "s": "1" }, { "t": 115865, "b": "3" }, { "t": 115941, "s": "1" }, { "t": 116267, "s": "1" }, { "t": 116594, "b": "3" }, { "t": 116651, "s": "1" }, { "t": 117013, "s": "1" }, { "t": 117298, "b": "3" }, { "t": 117515, "s": "2" }, { "t": 117603, "b": "3" }, { "t": 117867, "s": "1" }, { "t": 118013, "b": "3" }, { "t": 118208, "s": "1" }, { "t": 118539, "s": "1" }, { "t": 118761, "b": "3" }, { "t": 118928, "s": "2" }, { "t": 119070, "b": "3" }, { "t": 119280, "s": "2" }, { "t": 119402, "b": "3" }, { "t": 119632, "s": "2" }, { "t": 119706, "b": "3" }, { "t": 119947, "s": "1" }, { "t": 120148, "b": "3" }, { "t": 120336, "s": "1" }, { "t": 120450, "b": "3" }, { "t": 120693, "s": "2" }, { "t": 120813, "b": "3" }, { "t": 121045, "s": "2" }, { "t": 121134, "b": "3" }, { "t": 121397, "s": "2" }, { "t": 121530, "b": "1" }, { "t": 121749, "s": "2" }, { "t": 122069, "s": "1" }, { "t": 122370, "b": "1" }, { "t": 122395, "s": "1" }, { "t": 122811, "s": "1" }, { "t": 123073, "b": "1" }, { "t": 123115, "s": "1" }, { "t": 123396, "b": "1" }, { "t": 123515, "s": "2" }, { "t": 123742, "b": "1" }, { "t": 123867, "s": "2" }, { "t": 124046, "b": "1" }, { "t": 124192, "s": "2" }, { "t": 124446, "b": "2" }, { "t": 124576, "s": "2" }, { "t": 124774, "b": "2" }, { "t": 124933, "s": "3" }, { "t": 125221, "b": "2" }, { "t": 125280, "s": "1" }, { "t": 125538, "b": "2" }, { "t": 125637, "s": "2" }, { "t": 125869, "b": "2" }, { "t": 125989, "s": "3" }, { "t": 126183, "b": "2" }, { "t": 126341, "s": "2" }, { "t": 126661, "s": "1" }, { "t": 126878, "b": "1" }, { "t": 127013, "s": "2" }, { "t": 127323, "s": "2" }, { "t": 127637, "s": "2" }, { "t": 127713, "b": "2" }, { "t": 127941, "s": "2" }, { "t": 128267, "s": "2" }, { "t": 128449, "b": "1" }, { "t": 128571, "s": "2" }, { "t": 128875, "s": "3" }, { "t": 129137, "b": "2" }, { "t": 129227, "s": "3" }, { "t": 129444, "b": "2" }, { "t": 129531, "s": "3" }, { "t": 129793, "b": "1" }, { "t": 129840, "s": "2" }, { "t": 130187, "s": "2" }, { "t": 130496, "s": "2" }, { "t": 130497, "b": "2" }, { "t": 130805, "s": "3" }, { "t": 130809, "b": "2" }, { "t": 131125, "s": "2" }, { "t": 131133, "b": "1" }, { "t": 131440, "s": "1" }, { "t": 131709, "b": "2" }, { "t": 131760, "s": "2" }, { "t": 132030, "b": "2" }, { "t": 132069, "s": "3" }, { "t": 132345, "b": "1" }, { "t": 132379, "s": "3" }, { "t": 132688, "s": "3" }, { "t": 133003, "s": "3" }, { "t": 133038, "b": "2" }, { "t": 133323, "s": "2" }, { "t": 133348, "b": "2" }, { "t": 133627, "s": "2" }, { "t": 133713, "b": "1" }, { "t": 133952, "s": "3" }, { "t": 134014, "b": "1" }, { "t": 134368, "s": "3" }, { "t": 134450, "b": "2" }, { "t": 134672, "s": "3" }, { "t": 134981, "s": "2" }, { "t": 135339, "s": "1" }, { "t": 135437, "b": "3" }, { "t": 135648, "s": "1" }, { "t": 135963, "s": "1" }, { "t": 136273, "b": "3" }, { "t": 136283, "s": "1" }, { "t": 136587, "s": "1" }, { "t": 136960, "s": "2" }, { "t": 136961, "b": "3" }, { "t": 137312, "s": "1" }, { "t": 137627, "s": "1" }, { "t": 137718, "b": "3" }, { "t": 137936, "s": "1" }, { "t": 138240, "s": "2" }, { "t": 138393, "b": "3" }, { "t": 138549, "s": "2" }, { "t": 138859, "s": "1" }, { "t": 138957, "b": "1" }, { "t": 139168, "s": "2" }, { "t": 139483, "s": "1" }, { "t": 139642, "b": "2" }, { "t": 139936, "s": "1" }, { "t": 140299, "s": "1" }, { "t": 140422, "b": "1" }, { "t": 140800, "s": "1" }, { "t": 141077, "b": "2" }, { "t": 141163, "s": "2" }, { "t": 141483, "s": "2" }, { "t": 141787, "s": "3" }, { "t": 141937, "b": "1" }, { "t": 142091, "s": "2" }, { "t": 142395, "s": "1" }, { "t": 142626, "b": "2" }, { "t": 142731, "s": "1" }, { "t": 142937, "b": "2" }, { "t": 143035, "s": "2" }, { "t": 143305, "b": "1" }, { "t": 143349, "s": "3" }, { "t": 143653, "s": "3" }, { "t": 143889, "b": "2" }, { "t": 143957, "s": "3" }, { "t": 144202, "b": "2" }, { "t": 144267, "s": "3" }, { "t": 144559, "b": "1" }, { "t": 144581, "s": "3" }, { "t": 144885, "s": "3" }, { "t": 145189, "s": "3" }, { "t": 145253, "b": "2" }, { "t": 145493, "s": "3" }, { "t": 145564, "b": "2" }, { "t": 145797, "s": "3" }, { "t": 145928, "b": "1" }, { "t": 146112, "s": "3" }, { "t": 146246, "b": "1" }, { "t": 146427, "s": "3" }, { "t": 146667, "b": "2" }, { "t": 146789, "s": "3" }, { "t": 147099, "s": "3" }, { "t": 147369, "b": "1" }, { "t": 147408, "s": "3" }, { "t": 147670, "b": "1" }, { "t": 147712, "s": "2" }, { "t": 148018, "b": "2" }, { "t": 148027, "s": "2" }, { "t": 148331, "s": "3" }, { "t": 148645, "s": "3" }, { "t": 148754, "b": "1" }, { "t": 148955, "s": "3" }, { "t": 149074, "b": "1" }, { "t": 149264, "s": "3" }, { "t": 149369, "b": "2" }, { "t": 149579, "s": "2" }, { "t": 149888, "s": "3" }, { "t": 150053, "b": "1" }, { "t": 150192, "s": "3" }, { "t": 150375, "b": "1" }, { "t": 150507, "s": "2" }, { "t": 150761, "b": "2" }, { "t": 150811, "s": "2" }, { "t": 151115, "s": "3" }, { "t": 151419, "s": "3" }, { "t": 151477, "b": "1" }, { "t": 151728, "s": "3" }, { "t": 151784, "b": "1" }, { "t": 152037, "s": "3" }, { "t": 152202, "b": "2" }, { "t": 152341, "s": "3" }, { "t": 152512, "b": "2" }, { "t": 152656, "s": "1" }, { "t": 152937, "b": "1" }, { "t": 153008, "s": "1" }, { "t": 153365, "s": "1" }, { "t": 153665, "b": "3" }, { "t": 153723, "s": "1" }, { "t": 154048, "s": "2" }, { "t": 154405, "s": "1" }, { "t": 154593, "b": "3" }, { "t": 154752, "s": "1" }, { "t": 155109, "s": "1" }, { "t": 155325, "b": "3" }, { "t": 155429, "s": "1" }, { "t": 155813, "s": "1" }, { "t": 156097, "b": "3" }, { "t": 156165, "s": "1" }, { "t": 156533, "s": "1" }, { "t": 156833, "b": "3" }, { "t": 156837, "s": "1" }, { "t": 157563, "s": "1" }, { "t": 157867, "s": "1" }, { "t": 158192, "s": "2" }, { "t": 158457, "b": "1" }, { "t": 158507, "s": "2" }, { "t": 158816, "s": "2" }, { "t": 159120, "s": "1" }, { "t": 159133, "b": "2" }, { "t": 159424, "s": "2" }, { "t": 159739, "s": "1" }, { "t": 159769, "b": "1" }, { "t": 160043, "s": "1" }, { "t": 160347, "s": "2" }, { "t": 160405, "b": "2" }, { "t": 160667, "s": "1" }, { "t": 160981, "s": "2" }, { "t": 161086, "b": "1" }, { "t": 161317, "s": "2" }, { "t": 161627, "s": "1" }, { "t": 161741, "b": "2" }, { "t": 161936, "s": "1" }, { "t": 162261, "s": "2" }, { "t": 162492, "b": "1" }, { "t": 162677, "s": "1" }, { "t": 163061, "s": "1" }, { "t": 163141, "b": "2" }, { "t": 163435, "s": "1" }, { "t": 163467, "b": "2" }, { "t": 163749, "s": "3" }, { "t": 163983, "b": "0" }, { "t": 164053, "s": "3" }, { "t": 164379, "s": "3" }, { "t": 164578, "b": "0" }, { "t": 164683, "s": "2" }, { "t": 164890, "b": "0" }, { "t": 165003, "s": "3" }, { "t": 165253, "b": "0" }, { "t": 165328, "s": "2" }, { "t": 165632, "s": "1" }, { "t": 165905, "b": "1" }, { "t": 165936, "s": "3" }, { "t": 166240, "s": "3" }, { "t": 166544, "s": "3" }, { "t": 166614, "b": "2" }, { "t": 166859, "s": "3" }, { "t": 166946, "b": "2" }, { "t": 167173, "s": "3" }, { "t": 167349, "b": "0" }, { "t": 167477, "s": "3" }, { "t": 167808, "s": "2" }, { "t": 168077, "b": "0" }, { "t": 168171, "s": "2" }, { "t": 168793, "b": "1" }, { "t": 168987, "s": "1" }, { "t": 169107, "b": "1" }, { "t": 169497, "b": "2" }, { "t": 169810, "b": "2" }] }]; var songUnlockLimit = [0, 100, 500]; var specialOrbsTimers = [{ 41851: true, 55488: true, 93720: true, 123260: true, 141216: true }, { 29658: true, 46429: true, 73313: true, 104854: true, 128186: true }, { 24366: true, 49917: true, 84510: true, 105519: true, 120148: true }]; var isDebug = false; var currentTrackIndex = 0; var globalSpeed = 20; var currentRotationAngle = 0; var fullLog = []; var fpsText; var lastTick; var frameCount; var debugText; var worldManager; var backgroundManager; var gateManager; var targetManager; var ball; var runner; var speakerManager; var noteSparks; var scoreLabel; var progressBar; var orbManager; var helpIndicator; var minGateDetectionScale = 0.4; var maxGateDetectionScale = 0.6; var minOrbDetectionScale = 0.3; var maxOrbDetectionScale = 0.8; var borderLimitAngle = Math.PI * 0.08; var gateLimitAngle = Math.PI * 0.2; var gateUniqueId = 0; var songStarted = false; var leftAngle = -Math.PI * 0.5 + gateLimitAngle; var centerAngle = -Math.PI * 0.5 + Math.PI / 2; var rightAngle = -Math.PI * 0.5 + Math.PI - gateLimitAngle; var jumpDistance = -1200; var lastHitSoundTime = 0; var hitSoundCooldown = 100; var skipBeatDelay = 900; var lastBeatTime = 0; var lastGateHitTime = 0; var gatePenaltyValue = -2; var currentMenuLocks = []; var menuIcon; var hasFinishedTrack01 = storage.hasFinishedTrack01 || false; var lastTapTime = 0; var doubleTapThreshold = 300; // milliseconds var isJumping = false; var jumpHelpShown = false; // Flag to track if the jump help has been shown var globalWhistleParticles = []; var globalWhistleInterval = null; /** * Spawns a looping animation of small black tinted 'note'/'note2' assets * that swing up and then evaporate at the given coordinates. * @param {number} spawnX The x-coordinate for the center of the whistle effect. * @param {number} spawnY The y-coordinate for the center of the whistle effect. */ function whistleAnim(spawnX, spawnY) { // Clear any existing global whistle interval to ensure only one effect runs globally, // or to restart it at a new position if called again. if (globalWhistleInterval !== null) { LK.clearInterval(globalWhistleInterval); } globalWhistleInterval = LK.setInterval(function () { var assetName = Math.random() < 0.5 ? 'note' : 'note2'; //console.log("Spawn WhistleParticle", spawnX, spawnY, assetName); var particle = new WhistleParticle(spawnX, spawnY, assetName); game.addChild(particle); globalWhistleParticles.push(particle); }, 150 + Math.random() * 100); // Spawn a new note every 150-250ms } if (isDebug) { songUnlockLimit = [0, 2, 6]; songListV4 = [{ "name": "Words Fly Fast", "duration": 10000, "songBeats": [{ "t": 1000, "s": "1" }, { "t": 2000, "s": "1" }, { "t": 3000, "b": "3" }, { "t": 4000, "b": "1" }] }, { "name": "Freedom", "duration": 5000, "songBeats": [{ "t": 0, "s": "3" }, { "t": 315, "s": "3" }, { "t": 3218, "b": "1" }, { "t": 3522, "b": "1" }] }, { "name": "Stranger in the Storm", "duration": 5000, "songBeats": [{ "t": 165, "s": "1" }, { "t": 469, "s": "1" }, { "t": 582, "b": "0" }, { "t": 1286, "b": "0" }] }]; specialOrbsTimers = [{ 3000: true, 6000: true }, { 3000: true, 6000: true }, { 3000: true, 6000: true }]; } function getNextGateId() { return gateUniqueId++; } function playHitSound() { var now = Date.now(); if (now - lastHitSoundTime >= hitSoundCooldown) { LK.getSound('hit').play(); lastHitSoundTime = now; } } function gameInitialize() { // Load score from storage LK.setScore(storage.score || 0); worldManager = new WorldManager(); game.addChild(worldManager); backgroundManager = new BackgroundManager(); game.addChild(backgroundManager); gateManager = new GateManager(); game.addChild(gateManager); speakerManager = new SpeakerManager(); game.addChild(speakerManager); noteSparks = new NoteSparks(); game.addChild(noteSparks); orbManager = new OrbManager(); game.addChild(orbManager); ball = new Ball(); ball.x = 1024; ball.y = 2000; ball.alpha = isDebug ? 1 : 0; game.addChild(ball); runner = new Runner(); runner.x = 1024; runner.y = 2000; runner.alpha = 1; game.addChild(runner); scoreLabel = new ScoreLabel(); scoreLabel.y = 80; scoreLabel.visible = false; LK.gui.top.addChild(scoreLabel); progressBar = new ProgressBar(); progressBar.x = 0; progressBar.y = 10; progressBar.visible = false; game.addChild(progressBar); game.updateScore = function () { scoreLabel.updateScore(LK.getScore()); }; menuIcon = new MenuIcon(); menuIcon.x = 1900; menuIcon.y = 80; menuIcon.visible = false; game.addChild(menuIcon); helpIndicator = new HelpIndicator(); game.addChild(helpIndicator); jumpHelpShown = false; // Reset the flag on game initialization if (!songStarted) { // Always show start button first, regardless of completion status var startButton = new StartButton(); game.addChild(startButton); } if (isDebug) { var debugMarker = LK.getAsset('debugMarker', { anchorX: 0.5, anchorY: 0.5, x: 2048 * 0.5, y: 2732 / 2 }); game.addChild(debugMarker); fpsText = new Text2('FPS: 0', { size: 50, fill: 0xFFFFFF }); fpsText.anchor.set(1, 1); LK.gui.bottomRight.addChild(fpsText); lastTick = Date.now(); frameCount = 0; debugText = new Text2('Debug Info', { size: 50, fill: 0xFFFFFF }); debugText.anchor.set(0.5, 0); LK.gui.top.addChild(debugText); } } game.update = function () { // Manage and destroy whistle particles for (var i = globalWhistleParticles.length - 1; i >= 0; i--) { var p = globalWhistleParticles[i]; if (p.shouldDestroy) { // It's good practice for the main game loop to handle destruction p.destroy(); globalWhistleParticles.splice(i, 1); } } if (progressBar && progressBar.update) { progressBar.update(); } if (isDebug) { var now = Date.now(); frameCount++; if (now - lastTick >= 1000) { fpsText.setText('FPS: ' + frameCount); frameCount = 0; lastTick = now; } } }; var snapPositions = { left: 0, center: 1, right: 2 }; var currentSnapPosition = snapPositions.center; var lastMouseZone = 1; function updateSnapPosition(snapPos) { currentSnapPosition = snapPos; var targetAngle = centerAngle; if (snapPos === snapPositions.left) { targetAngle = leftAngle; } else if (snapPos === snapPositions.center) { targetAngle = centerAngle; } else if (snapPos === snapPositions.right) { targetAngle = rightAngle; } var radiusX = 924; var radiusY = 634; runner.x = centerX + radiusX * Math.cos(targetAngle + Math.PI * 0.5); runner.y = centerY + radiusY * Math.sin(targetAngle + Math.PI * 0.5); var rotationMap = { 0: -0.5, 1: 0, 2: 0.5 }; currentRotationAngle = rotationMap[snapPos] * Math.PI * 0.5; } function animateToSnapPosition(snapPos, jump) { var needsIntermediateStep = false; if (currentSnapPosition === snapPositions.left && snapPos === snapPositions.right || currentSnapPosition === snapPositions.right && snapPos === snapPositions.left) { needsIntermediateStep = true; } if (needsIntermediateStep && !jump) { var radiusX = 924; var radiusY = 634; var centerPosX = centerX + radiusX * Math.cos(centerAngle + Math.PI * 0.5); var centerPosY = centerY + radiusY * Math.sin(centerAngle + Math.PI * 0.5); tween(runner, { x: centerPosX, y: centerPosY }, { duration: 100, easing: tween.easeInOut, onFinish: function onFinish() { performSnapAnimation(snapPos, jump); } }); currentRotationAngle = 0; } else { performSnapAnimation(snapPos, jump); } } function performSnapAnimation(snapPos, jump) { currentSnapPosition = snapPos; var targetAngle = centerAngle; if (snapPos === snapPositions.left) { targetAngle = rightAngle; } else if (snapPos === snapPositions.center) { targetAngle = centerAngle; } else if (snapPos === snapPositions.right) { targetAngle = leftAngle; } var radiusX = 924; var radiusY = 634; var targetX = centerX + radiusX * Math.cos(targetAngle + Math.PI * 0.5); var targetY = centerY + radiusY * Math.sin(targetAngle + Math.PI * 0.5); var rotationMap = { 0: -0.5, 1: 0, 2: 0.5 }; var targetRotation = rotationMap[snapPos] * Math.PI * 0.5; // Don't perform lane switching if jumping if (isJumping) { return; } if (jump) { // Calculate jump based on current angle var jumpX = runner.x + jumpDistance * Math.cos(targetAngle); var jumpY = runner.y + jumpDistance * Math.sin(targetAngle); tween(runner, { x: jumpX, y: jumpY }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(runner, { x: targetX, y: targetY }, { duration: 200, easing: tween.easeIn }); } }); } else { tween(runner, { x: targetX, y: targetY }, { duration: 300, easing: tween.easeInOut }); } currentRotationAngle = targetRotation; } game.down = function (x, y, obj) { if (!songStarted) { return; } // Check for double tap var currentTime = Date.now(); if (currentTime - lastTapTime < doubleTapThreshold) { // Double tap detected - make runner jump if (!isJumping && runner) { isJumping = true; var originalX = runner.x; var originalY = runner.y; // Calculate jump direction based on current angle var angle = Math.atan2(runner.y - centerY, runner.x - centerX); var jumpX = runner.x + jumpDistance * Math.cos(angle); var jumpY = runner.y + jumpDistance * Math.sin(angle); tween(runner, { x: jumpX, y: jumpY }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(runner, { x: originalX, y: originalY }, { duration: 300, easing: tween.easeIn, onFinish: function onFinish() { isJumping = false; } }); } }); } lastTapTime = 0; // Reset to prevent triple tap return; } lastTapTime = currentTime; var screenWidth = 2048; var thirdWidth = screenWidth / 3; var tapZone; if (x < thirdWidth) { tapZone = 0; } else if (x < thirdWidth * 2) { tapZone = 1; } else { tapZone = 2; } if (tapZone === 0) { animateToSnapPosition(snapPositions.left); } else if (tapZone === 1) { animateToSnapPosition(snapPositions.center); } else { animateToSnapPosition(snapPositions.right); } lastMouseZone = tapZone; }; game.move = function (x, y, obj) { if (!songStarted) { return; } var screenWidth = 2048; var thirdWidth = screenWidth / 3; var currentZone; if (x < thirdWidth) { currentZone = 0; } else if (x < thirdWidth * 2) { currentZone = 1; } else { currentZone = 2; } if (currentZone !== lastMouseZone) { if (currentZone === 0) { animateToSnapPosition(snapPositions.left); } else if (currentZone === 1) { animateToSnapPosition(snapPositions.center); } else { animateToSnapPosition(snapPositions.right); } lastMouseZone = currentZone; } }; game.up = function (x, y, obj) {}; function filterSpeakerData(trackIndex) { if (!songListV4[trackIndex]) { return []; } var speakerBeats = []; var songData = songListV4[trackIndex]; if (songData.songBeats) { for (var i = 0; i < songData.songBeats.length; i++) { var beat = songData.songBeats[i]; if (beat.s !== undefined) { speakerBeats.push(beat); } } } return speakerBeats; } function filterGateData(trackIndex) { if (!songListV4[trackIndex]) { return []; } var gateBeats = []; var songData = songListV4[trackIndex]; if (songData.songBeats) { for (var i = 0; i < songData.songBeats.length; i++) { var beat = songData.songBeats[i]; if (beat.b !== undefined) { gateBeats.push(beat); } } } return gateBeats; } function showMenuLock(yPosition, limit) { var lockContainer = new Container(); lockContainer.x = 1024; lockContainer.y = yPosition; game.addChild(lockContainer); var lockChain = lockContainer.addChild(LK.getAsset('lockChain', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 })); var lock = lockContainer.addChild(LK.getAsset('lock', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 })); var clefDeSol = lockContainer.addChild(LK.getAsset('clefDeSol', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 30, tint: 0x000000, width: 30, height: 60 })); var limitText = new Text2(limit.toString(), { size: 60, fill: 0x000000, dropShadow: true, dropShadowColor: 0x646464, dropShadowBlur: 4, dropShadowAngle: 3 * Math.PI / 4, dropShadowDistance: 4 }); limitText.anchor.set(0.5, 0.5); limitText.x = 0; limitText.y = 110; lockContainer.addChild(limitText); return lockContainer; } function showMenu() { if (globalWhistleInterval !== null) { LK.clearInterval(globalWhistleInterval); globalWhistleInterval = null; } if (runner) { runner.x = 1024; runner.y = 2000; runner.alpha = 0; runner.scaleX = 1; runner.scaleY = 1; runner.isPlayingIdleAnim = false; runner.isReturningToInitial = false; for (var i = 0; i < runner.idleFrameAssets.length; i++) { runner.idleFrameAssets[i].alpha = 0; } for (var i = 0; i < runner.frameAssets.length; i++) { runner.frameAssets[i].alpha = i === 0 ? 1 : 0; } } var menuContainer = new Container(); menuContainer.x = 1024; menuContainer.y = 1366; game.addChild(menuContainer); var menuData = [{ x: 0, y: -780, text: songListV4[0] ? songListV4[0].name : "Track 01" }, { x: 0, y: -80, text: songListV4[1] ? songListV4[1].name : "Track 02" }, { x: 0, y: 620, text: songListV4[2] ? songListV4[2].name : "Track 03" }]; for (var i = 0; i < menuData.length; i++) { var tile = menuContainer.addChild(LK.getAsset('menuTile', { anchorX: 0.5, anchorY: 0.5, x: menuData[i].x, y: menuData[i].y, alpha: 0, scaleX: 0.85, scaleY: 0.58 })); var trackText = new Text2(menuData[i].text, { size: 120, fill: 0xFFFFFF, dropShadow: true, dropShadowColor: 0x000000, dropShadowBlur: 4, dropShadowAngle: Math.PI / 4, dropShadowDistance: 5 }); trackText.anchor.set(0.5, 0.5); trackText.x = menuData[i].x; trackText.y = menuData[i].y; menuContainer.addChild(trackText); (function (menuTile, menuText, delay, trackIndex) { var currentScore = LK.getScore(); var isLocked = currentScore < songUnlockLimit[trackIndex]; LK.setTimeout(function () { tween(menuTile, { alpha: 1, scaleX: 0.85, scaleY: 0.58 }, { duration: 800, easing: tween.easeOut }); tween(menuText, { alpha: 1 }, { duration: 800, easing: tween.easeOut }); if (isLocked) { var lock = showMenuLock(menuContainer.y + menuData[trackIndex].y, songUnlockLimit[trackIndex]); currentMenuLocks.push(lock); } }, delay); menuTile.down = function () { if (isLocked) { return; } // Hide all visible lockContainers for (var j = 0; j < currentMenuLocks.length; j++) { if (currentMenuLocks[j]) { currentMenuLocks[j].visible = false; } } // Update currentTrackIndex currentTrackIndex = trackIndex; // Reset all game managers and objects if (gateManager) { // Stop all existing gates for (var g = gateManager.gates.length - 1; g >= 0; g--) { gateManager.gates[g].destroy(); } gateManager.gates = []; // Reset gate manager state if (songListV4[trackIndex]) { gateManager.currentSong = songListV4[trackIndex]; gateManager.gateBeats = filterGateData(trackIndex); } gateManager.currentNoteIndex = 0; gateManager.lastGateAngle = null; gateManager.gateAnimStartTime = Date.now(); } if (orbManager) { // Destroy all existing orbs for (var o = orbManager.orbs.length - 1; o >= 0; o--) { orbManager.orbs[o].destroy(); } orbManager.orbs = []; orbManager.lastOrbSpawnTime = 0; } if (ball) { // Reset ball state ball.lastIntersectingGates = {}; ball.lastIntersectingOrbs = {}; } if (runner) { // Reset runner position and state runner.x = 1024; runner.y = 2000; runner.rotation = 0; runner.isReturningToInitial = false; runner.shouldStartIdleAfterReturn = false; runner.isPlayingIdleAnim = false; runner.isPlayingWaitingAnim = false; // Reset runner animations for (var i = 0; i < runner.frameAssets.length; i++) { runner.frameAssets[i].alpha = i === 0 ? 1 : 0; } for (var i = 0; i < runner.idleFrameAssets.length; i++) { runner.idleFrameAssets[i].alpha = 0; } } // Reset global game state currentSnapPosition = snapPositions.center; lastMouseZone = 1; currentRotationAngle = 0; isJumping = false; lastGateHitTime = 0; gatePenaltyValue = -2; lastBeatTime = 0; if (speakerManager) { for (var k = speakerManager.speakers.length - 1; k >= 0; k--) { var oldSpeaker = speakerManager.speakers[k]; tween.stop(oldSpeaker); if (oldSpeaker && typeof oldSpeaker.destroy === 'function') { oldSpeaker.destroy(); } } speakerManager.speakers = []; if (songListV4[trackIndex]) { speakerManager.speakerSongData = songListV4[trackIndex]; speakerManager.speakerBeats = filterSpeakerData(trackIndex); } speakerManager.currentBeatIndex = 0; } if (worldManager) { worldManager.loadWorldAssets(trackIndex); } var musicTrack = songTracks[trackIndex]; if (musicTrack) { tween(menuContainer, { alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { menuContainer.destroy(); var songStartTime = Date.now(); if (menuIcon && hasFinishedTrack01) { menuIcon.visible = true; } if (gateManager) { gateManager.songStartTime = songStartTime; } if (speakerManager) { speakerManager.songStartTime = songStartTime; } if (orbManager) { orbManager.loadSpecialOrbsTimers(); } if (helpIndicator) { helpIndicator.reset(); } jumpHelpShown = false; // Reset the flag when showing the menu if (scoreLabel) { scoreLabel.visible = true; } if (progressBar) { progressBar.visible = true; progressBar.startProgressAnimation(); } if (runner) { for (var i = 0; i < runner.idleFrameAssets.length; i++) { runner.idleFrameAssets[i].alpha = 0; } runner.alpha = 1; } songStarted = true; LK.playMusic(musicTrack); } }); } }; })(tile, trackText, i * 200, i); } } gameInitialize();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
score: 0
});
/****
* Classes
****/
var BackgroundManager = Container.expand(function () {
var self = Container.call(this);
self.bg0 = self.attachAsset('background01', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 2.4,
scaleY: 2.4,
alpha: 1
});
self.bg1 = self.attachAsset('background01', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 1.1,
scaleY: 1.1,
alpha: 1
});
self.bg2 = self.attachAsset('background01', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.5,
scaleY: 0.5,
alpha: 1
});
self.bg3 = self.attachAsset('background01', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.22,
scaleY: 0.22,
alpha: 1
});
self.bg4 = self.attachAsset('background01', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.11,
scaleY: 0.11,
alpha: 1
});
self.tore0 = self.attachAsset('tore', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 1.2,
scaleY: 1.2,
alpha: 1
});
self.tore1 = self.attachAsset('tore', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.6,
scaleY: 0.6,
alpha: 1
});
self.tore2 = self.attachAsset('tore', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.26,
scaleY: 0.26,
alpha: 1
});
self.tore3 = self.attachAsset('tore', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.12,
scaleY: 0.12,
alpha: 1
});
if (isDebug) {
self.bg1.tint = 0xFF0000;
self.tore1.tint = 0x00FF00;
self.bg2.tint = 0x00FFFF;
self.tore2.tint = 0xFF00FF;
self.bg3.tint = 0xfff200;
} else {
self.bg0.tint = 0x1697b8;
self.tore0.tint = 0x1697b8;
self.bg1.tint = 0x1697b8;
self.tore1.tint = 0x1697b8;
self.bg2.tint = 0x1697b8;
self.tore2.tint = 0x1697b8;
self.bg3.tint = 0x1697b8;
self.tore3.tint = 0x1697b8;
self.bg4.tint = 0x1697b8;
}
self.bgAnimationSpeed = globalSpeed / 1000;
self.bgAnimationAcceleration = 2;
self.backgrounds = [self.bg0, self.tore0, self.bg1, self.tore1, self.bg2, self.tore2, self.bg3, self.tore3, self.bg4];
self.bgAnimStartTime = Date.now();
self.update = function () {
if (!songStarted) {
tween.stop(self.bg0, {
scaleX: true,
scaleY: true
});
tween.stop(self.bg1, {
scaleX: true,
scaleY: true
});
tween.stop(self.bg2, {
scaleX: true,
scaleY: true
});
tween.stop(self.bg3, {
scaleX: true,
scaleY: true
});
tween.stop(self.bg4, {
scaleX: true,
scaleY: true
});
tween.stop(self.tore0, {
scaleX: true,
scaleY: true
});
tween.stop(self.tore1, {
scaleX: true,
scaleY: true
});
tween.stop(self.tore2, {
scaleX: true,
scaleY: true
});
tween.stop(self.tore3, {
scaleX: true,
scaleY: true
});
return;
}
var now = Date.now();
var elapsed = now - self.bgAnimStartTime;
var resetTriggered = false;
for (var i = 0; i < self.backgrounds.length; i++) {
var bg = self.backgrounds[i];
bg.scaleX += self.bgAnimationSpeed * bg.scaleX;
bg.scaleY = bg.scaleX;
if (bg.scaleX > 3.0) {
bg.scaleX = 0.12;
bg.scaleY = bg.scaleX;
}
bg.tint = 0x1697b8;
}
};
return self;
});
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5,
tint: currentColor,
alpha: isDebug ? 1 : 0
});
self.speedX = 0;
self.speedY = 0;
self.lastIntersectingGates = {};
self.lastIntersectingOrbs = {};
self.update = function () {
if (!songStarted) {
return;
}
if (runner) {
self.x = runner.x - (isJumping ? 120 : 80) * Math.cos(runner.rotation + Math.PI * 0.5);
self.y = runner.y - (isJumping ? 120 : 80) * Math.sin(runner.rotation + Math.PI * 0.5);
self.rotation = runner.rotation;
}
if (gateManager && gateManager.gates) {
for (var i = gateManager.gates.length - 1; i >= 0; i--) {
var gate = gateManager.gates[i];
var gateId = gate.gateId;
if (self.lastIntersectingGates[gateId] === undefined) {
self.lastIntersectingGates[gateId] = false;
}
var currentIntersecting = gate.boundingBox.scaleX >= minGateDetectionScale && gate.boundingBox.scaleX <= maxGateDetectionScale && self.intersects(gate.boundingBox);
if (!self.lastIntersectingGates[gateId] && currentIntersecting) {
var looseOrbsAnim = new LooseOrbsAnim(gate.directionAngle);
looseOrbsAnim.x = self.x;
looseOrbsAnim.y = self.y;
game.addChild(looseOrbsAnim);
playHitSound();
var now = Date.now();
if (now - lastGateHitTime <= 1000) {
gatePenaltyValue = Math.max(-10, gatePenaltyValue * 2);
} else {
gatePenaltyValue = -2;
}
lastGateHitTime = now;
var currentScore = LK.getScore();
var newScore = Math.max(0, Math.min(9999, currentScore + gatePenaltyValue));
LK.setScore(newScore);
storage.score = newScore;
if (game.updateScore) {
game.updateScore();
}
if (scoreLabel && scoreLabel.showPenalty) {
scoreLabel.showPenalty(gatePenaltyValue);
}
if (!gate.isDestroying) {
gate.isDestroying = true;
tween(gate, {
scaleX: 0,
scaleY: 0
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
gateManager.destroyGate(gate);
}
});
}
}
self.lastIntersectingGates[gateId] = currentIntersecting;
}
}
if (orbManager && orbManager.orbs) {
for (var i = orbManager.orbs.length - 1; i >= 0; i--) {
var orb = orbManager.orbs[i];
var orbId = orb.orbId;
if (self.lastIntersectingOrbs[orbId] === undefined) {
self.lastIntersectingOrbs[orbId] = false;
}
var currentIntersecting = self.isScaleForIntersect(orb) && self.intersects(orb.boundingBox);
if (!self.lastIntersectingOrbs[orbId] && currentIntersecting) {
var sparkAnim = new SparkAnim();
sparkAnim.x = self.x;
sparkAnim.y = self.y;
game.addChild(sparkAnim);
// Add fireworks for special orbs
if (orb.special) {
var fireworksAnim = new FireworksAnim();
fireworksAnim.x = self.x;
fireworksAnim.y = self.y;
game.addChild(fireworksAnim);
// Add a white flash to the screen
LK.effects.flashScreen(0xFFFFFF, 500);
}
if (orb.special) {
LK.getSound('grabSpecial').play();
} else {
//LK.getSound('grab').play();
}
var newScore = Math.min(9999, LK.getScore() + (orb.special ? 20 : 1));
LK.setScore(newScore);
storage.score = newScore;
if (game.updateScore) {
game.updateScore();
}
orb.destroy();
orbManager.orbs.splice(i, 1);
delete self.lastIntersectingOrbs[orbId];
continue;
}
self.lastIntersectingOrbs[orbId] = currentIntersecting;
}
}
};
self.isScaleForIntersect = function (orb) {
var isReachable = orb.currentScale >= minOrbDetectionScale && orb.currentScale <= maxOrbDetectionScale;
if (orb.special) {
isReachable = orb.currentScale >= minOrbDetectionScale + 0.2 && orb.currentScale <= maxOrbDetectionScale + 0.2;
}
return isReachable;
};
return self;
});
var ConfettiAnim = Container.expand(function () {
var self = Container.call(this);
self.confettiPieces = [];
self.spawnTime = Date.now();
self.lifetime = 5000;
self.spawnDuration = 2000;
self.lastSpawnTime = 0;
self.spawnInterval = 5;
var futuristicBlueTint = 0x32cbec;
self.spawnConfettiPiece = function () {
var assetType;
var random = Math.random();
if (random < 0.2) {
assetType = 'note';
} else if (random < 0.4) {
assetType = 'note2';
} else {
assetType = 'line';
}
var piece;
if (assetType === 'line') {
var confettiColors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6, 0x32cbec];
var randomColor = confettiColors[Math.floor(Math.random() * confettiColors.length)];
piece = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5,
tint: randomColor,
alpha: 0.8,
scaleX: 3 + Math.random() * 5,
scaleY: 0.5 + Math.random() * 1.5
});
} else {
piece = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5,
tint: futuristicBlueTint,
alpha: 0.8,
scaleX: 0.3 + Math.random() * 0.4,
scaleY: 0.3 + Math.random() * 0.4
});
}
piece.x = Math.random() * 2048;
piece.y = -100;
piece.vx = (Math.random() - 0.5) * 100;
piece.vy = 400 + Math.random() * 400;
piece.rotationSpeed = (Math.random() - 0.5) * 4;
self.confettiPieces.push(piece);
tween(piece, {
alpha: 0
}, {
duration: self.lifetime,
easing: tween.linear
});
};
self.update = function () {
var now = Date.now();
var elapsed = now - self.spawnTime;
if (elapsed < self.spawnDuration && now - self.lastSpawnTime >= self.spawnInterval) {
self.spawnConfettiPiece();
self.lastSpawnTime = now;
}
var deltaTime = 16 / 1000;
for (var i = self.confettiPieces.length - 1; i >= 0; i--) {
var piece = self.confettiPieces[i];
piece.x += piece.vx * deltaTime;
piece.y += piece.vy * deltaTime;
piece.rotation += piece.rotationSpeed * deltaTime;
if (piece.y > 2832 || elapsed >= self.lifetime) {
piece.destroy();
self.confettiPieces.splice(i, 1);
}
}
if (elapsed >= self.lifetime && self.confettiPieces.length === 0) {
self.destroy();
}
};
return self;
});
var FireworksAnim = Container.expand(function () {
var self = Container.call(this);
self.particles = [];
self.lifetime = 4000;
self.spawnTime = Date.now();
// Create explosion particles
var particleCount = 100;
var colors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6, 0x32cbec];
for (var i = 0; i < particleCount; i++) {
var angle = Math.PI * 2 / particleCount * i;
var speed = 500 + Math.random() * 200;
var particle = self.attachAsset('line', {
anchorX: 0.5,
anchorY: 0.5,
width: 10,
height: 6,
scaleX: 3,
scaleY: 0.5,
tint: colors[Math.floor(Math.random() * colors.length)],
alpha: 1
});
particle.rotation = angle;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
self.particles.push(particle);
// Fade out particle
tween(particle, {
alpha: 0,
scaleX: 0.5,
scaleY: 0.1
}, {
duration: self.lifetime,
easing: tween.easeOut
});
}
// Create center flash
var flash = self.attachAsset('glow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
scaleY: 0.1,
alpha: 1,
blendMode: 1
});
tween(flash, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 1500,
easing: tween.easeOut
});
self.update = function () {
var deltaTime = 16 / 1000;
for (var i = 0; i < self.particles.length; i++) {
var particle = self.particles[i];
particle.x += particle.vx * deltaTime;
particle.y += particle.vy * deltaTime;
particle.vy += 200 * deltaTime; // Gravity
particle.vx *= 0.98; // Drag
}
var elapsed = Date.now() - self.spawnTime;
if (elapsed >= self.lifetime) {
self.destroy();
}
};
return self;
});
var Gate = Container.expand(function () {
var self = Container.call(this);
self.directionAngle = 0;
self.boundingBox = self.attachAsset('boundingBox', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2450,
alpha: 0.9
});
self.gateColor = 0xFFFFFF;
self.gateId = null;
self.updateScale = function (newScale) {
self.boundingBox.scaleX = newScale;
self.boundingBox.scaleY = newScale;
var distance = (2450 - 1366) * newScale;
self.boundingBox.x = centerX + distance * Math.cos(self.directionAngle + Math.PI * 0.5);
self.boundingBox.y = centerY + distance * Math.sin(self.directionAngle + Math.PI * 0.5);
self.boundingBox.rotation = self.directionAngle;
};
return self;
});
var GateManager = Container.expand(function () {
var self = Container.call(this);
self.gates = [];
self.gateAnimStartTime = Date.now();
self.gateAnimationSpeed = globalSpeed / 1000;
self.currentSong = songListV4[0];
self.gateBeats = filterGateData(0);
self.songStartTime = Date.now();
self.currentNoteIndex = 0;
self.noteSpawnScale = 0.12;
self.lastGateAngle = null;
self.lastProcessedBeat = -1;
self.spawnGateAtTime = function () {
var beatValue = null;
if (self.currentNoteIndex < self.gateBeats.length) {
beatValue = self.gateBeats[self.currentNoteIndex].b;
}
var startScale = self.noteSpawnScale;
var endScale = 1.0;
var speed = self.gateAnimationSpeed;
var timeToReachPlayer = Math.log(endScale / startScale) / speed;
var beatAngle = centerAngle;
if (beatValue === "1") {
beatAngle = rightAngle;
} else if (beatValue === "2") {
beatAngle = leftAngle;
} else {
beatAngle = centerAngle;
}
self.lastGateAngle = beatAngle;
var allAngles = [leftAngle, centerAngle, rightAngle];
var gateAngles = [];
for (var i = 0; i < allAngles.length; i++) {
if (allAngles[i] !== beatAngle) {
gateAngles.push(allAngles[i]);
}
}
var now = Date.now();
var songElapsed = now - self.songStartTime;
var beatTime = self.gateBeats[self.currentNoteIndex].t;
var spawnTime = beatTime - timeToReachPlayer;
for (var j = 0; j < gateAngles.length; j++) {
var gate = new Gate();
gate.updateScale(self.noteSpawnScale);
gate.spawnTime = Date.now() + 200 / globalSpeed;
gate.colorIndex = 0;
gate.gateId = getNextGateId();
gate.directionAngle = gateAngles[j];
if (songElapsed >= spawnTime) {
self.gates.push(gate);
self.addChild(gate);
} else {
(function (g) {
LK.setTimeout(function () {
self.gates.push(g);
self.addChild(g);
}, spawnTime - songElapsed);
})(gate);
}
}
if (gateAngles.length === 2 && orbManager) {
if (songElapsed >= spawnTime) {
orbManager.spawnOrb(beatAngle, beatTime);
} else {
(function (angle) {
LK.setTimeout(function () {
orbManager.spawnOrb(angle, beatTime);
}, spawnTime - songElapsed);
})(beatAngle);
}
}
};
self.update = function () {
if (!songStarted) {
return;
}
if (!songStarted) {
return;
}
var now = Date.now();
var songElapsed = now - self.songStartTime;
if (self.currentNoteIndex < self.gateBeats.length) {
var nextBeat = self.gateBeats[self.currentNoteIndex];
if (songElapsed >= nextBeat.t) {
if (now - lastBeatTime >= skipBeatDelay) {
self.spawnGateAtTime();
lastBeatTime = now;
}
self.currentNoteIndex++;
}
}
for (var i = self.gates.length - 1; i >= 0; i--) {
var gate = self.gates[i];
var currentScale = gate.boundingBox.scaleX;
var newScale = currentScale + self.gateAnimationSpeed * currentScale;
if (newScale > 3.0) {
gate.destroy();
self.gates.splice(i, 1);
} else {
gate.updateScale(newScale);
}
}
self.checkSongEnd();
};
self.resetSong = function () {
self.songStartTime = Date.now();
self.currentNoteIndex = 0;
self.lastGateAngle = null;
};
self.checkSongEnd = function () {
if (self.currentNoteIndex >= self.gateBeats.length) {
var songDuration = self.currentSong.duration || 156000;
var songElapsed = Date.now() - self.songStartTime;
if (songElapsed >= songDuration && songStarted) {
songStarted = false;
LK.stopMusic();
if (progressBar) {
tween.stop(progressBar.bar, {
width: true
});
}
if (menuIcon) {
menuIcon.visible = false;
}
if (speakerManager && speakerManager.speakers) {
LK.setTimeout(function () {
for (var i = 0; i < speakerManager.speakers.length; i++) {
var speaker = speakerManager.speakers[i];
var exitX, exitY;
if (i === 0) {
exitX = speaker.x - 800;
exitY = speaker.y;
} else if (i === 1) {
exitX = speaker.x;
exitY = speaker.y - 800;
} else {
exitX = speaker.x + 800;
exitY = speaker.y;
}
tween(speaker, {
x: exitX,
y: exitY,
alpha: 0
}, {
duration: 1200,
easing: tween.easeIn,
onFinish: function onFinish() {
if (i === speakerManager.speakers.length - 1) {
speakerManager.speakers = [];
}
}
});
}
}, 1000);
}
if (runner) {
runner.isReturningToInitial = true;
runner.shouldStartIdleAfterReturn = true;
runner.isPlayingIdleAnim = false;
tween(runner, {
x: 1024,
y: 2000,
rotation: 0
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
runner.isReturningToInitial = false;
runner.shouldStartIdleAfterReturn = false;
runner.startIdleSequence();
var confettiAnim = new ConfettiAnim();
game.addChild(confettiAnim);
LK.getSound('cheers').play();
// Set hasFinishedTrack01 to true if this was track01
if (self.currentSong && self.currentSong.name === "Words Fly Fast") {
hasFinishedTrack01 = true;
storage.hasFinishedTrack01 = true;
}
}
});
}
if (ball) {
tween(ball, {
x: 1024,
y: 2000,
rotation: 0
}, {
duration: 1000,
easing: tween.easeOut
});
}
for (var j = self.gates.length - 1; j >= 0; j--) {
self.gates[j].destroy();
}
self.gates = [];
}
}
};
self.destroyGate = function (gate) {
var index = self.gates.indexOf(gate);
if (index > -1) {
self.gates.splice(index, 1);
gate.destroy();
}
};
return self;
});
var HelpIndicator = Container.expand(function () {
var self = Container.call(this);
self.moveHelpShown = false;
self.jumpHelpShown = false;
self.gameStartTime = gateManager ? gateManager.songStartTime : Date.now();
// Create help move graphic (initially hidden)
self.helpMoveGraphic = self.attachAsset('helpMove', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1000,
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
});
// Create help jump graphic (initially hidden)
self.helpJumpGraphic = self.attachAsset('helpJump', {
anchorX: 0.5,
anchorY: 0.5,
x: 1480,
y: 1000,
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
});
self.showHelpMove = function () {
if (self.moveHelpShown) {
return;
}
self.moveHelpShown = true;
// Fade in help move
tween(self.helpMoveGraphic, {
alpha: 1,
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
// Start horizontal movement animation
var moveBackAndForth = function moveBackAndForth() {
tween(self.helpMoveGraphic, {
x: 1224
}, {
duration: 400,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.helpMoveGraphic, {
x: 824
}, {
duration: 400,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.helpMoveGraphic, {
x: 1024
}, {
duration: 400,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.helpMoveGraphic, {
x: 824
}, {
duration: 400,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self.helpMoveGraphic, {
x: 1024
}, {
duration: 400,
easing: tween.easeInOut
});
}
});
}
});
}
});
}
});
};
moveBackAndForth();
// Keep visible for 2000ms, then fade out
LK.setTimeout(function () {
tween(self.helpMoveGraphic, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 600,
easing: tween.easeIn
});
}, 2000);
}
});
};
self.showHelpJump = function () {
if (self.jumpHelpShown) {
return;
}
self.jumpHelpShown = true;
// Fade in help jump
tween(self.helpJumpGraphic, {
alpha: 1,
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 400,
easing: tween.easeOut,
onFinish: function onFinish() {
// Start double tap scale animation
var scaleAnimation = function scaleAnimation() {
tween(self.helpJumpGraphic, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.helpJumpGraphic, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150,
easing: tween.easeIn,
onFinish: function onFinish() {
// Second tap
tween(self.helpJumpGraphic, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.helpJumpGraphic, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150,
easing: tween.easeIn
});
}
});
}
});
}
});
};
scaleAnimation();
// Keep visible for 2000ms, then fade out
LK.setTimeout(function () {
tween(self.helpJumpGraphic, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 400,
easing: tween.easeIn
});
}, 2000);
}
});
};
self.update = function () {
if (!songStarted || hasFinishedTrack01) {
return;
}
var now = Date.now();
var elapsed = now - self.gameStartTime;
// Show help move after 2000ms
if (!self.moveHelpShown && elapsed >= 2000) {
self.showHelpMove();
}
// Help jump is now triggered when first special orb spawns (handled in OrbManager)
};
self.reset = function () {
self.moveHelpShown = false;
self.jumpHelpShown = false;
self.gameStartTime = gateManager ? gateManager.songStartTime : Date.now();
tween.stop(self.helpMoveGraphic);
tween.stop(self.helpJumpGraphic);
self.helpMoveGraphic.alpha = 0;
self.helpJumpGraphic.alpha = 0;
};
return self;
});
var LooseOrbsAnim = Container.expand(function (gateAngle) {
var self = Container.call(this);
self.orbs = [];
self.lifetime = 2000;
self.spawnTime = Date.now();
self.gateAngle = gateAngle || 0;
var orbCount = 3 + Math.floor(Math.random() * 3);
var randScale = 0.3 + Math.random() * 0.4;
for (var i = 0; i < orbCount; i++) {
var orbAsset = self.attachAsset('orb', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8,
scaleX: randScale,
scaleY: randScale
});
orbAsset.x = (Math.random() - 0.5) * 100;
orbAsset.y = (Math.random() - 0.5) * 100;
var baseAngle = self.gateAngle - Math.PI / 2;
var angleSpread = Math.PI * 0.6;
var angle = baseAngle + (Math.random() - 0.5) * angleSpread;
var speed = 200 + Math.random() * 200;
orbAsset.velocityX = Math.cos(angle) * speed;
orbAsset.velocityY = Math.sin(angle) * speed - 200;
orbAsset.gravity = 1200;
self.orbs.push(orbAsset);
LK.setTimeout(function () {
tween(orbAsset, {
alpha: 0
}, {
duration: self.lifetime,
easing: tween.easeOut
});
}, 1000);
tween(orbAsset, {
rotation: Math.PI * 6 - Math.random() * Math.PI * 12
}, {
duration: self.lifetime,
easing: tween.linear
});
}
self.update = function () {
var deltaTime = 16 / 1000;
for (var i = 0; i < self.orbs.length; i++) {
var orb = self.orbs[i];
orb.velocityY += orb.gravity * deltaTime;
orb.x += orb.velocityX * deltaTime;
orb.y += orb.velocityY * deltaTime;
orb.scaleX += 0.4 * deltaTime;
orb.scaleY = orb.scaleX;
}
var elapsed = Date.now() - self.spawnTime;
if (elapsed >= self.lifetime) {
self.destroy();
}
};
return self;
});
var MenuIcon = Container.expand(function () {
var self = Container.call(this);
var iconGraphics = self.attachAsset('menuIcon', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.down = function () {
if (songStarted) {
songStarted = false;
LK.stopMusic();
if (progressBar) {
tween.stop(progressBar.bar, {
width: true
});
}
if (runner) {
runner.x = 1024;
runner.y = 2000;
runner.rotation = 0;
runner.isReturningToInitial = false;
runner.shouldStartIdleAfterReturn = false;
runner.isPlayingIdleAnim = false;
for (var i = 0; i < runner.frameAssets.length; i++) {
runner.frameAssets[i].alpha = i === 0 ? 1 : 0;
}
for (var i = 0; i < runner.idleFrameAssets.length; i++) {
runner.idleFrameAssets[i].alpha = 0;
}
}
showMenu();
self.visible = false;
}
};
return self;
});
var Note = Container.expand(function () {
var self = Container.call(this);
var noteGraphics = self.attachAsset('note', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.velocity = {
x: 0,
y: -5
};
self.lifetime = 800;
self.spawnTime = Date.now();
self.noteType = 'note';
self.noteColor = 0xFFFFFF;
self.setNoteType = function (type) {
self.noteType = type;
noteGraphics.destroy();
noteGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
noteGraphics.tint = self.noteColor;
};
self.setColor = function (color) {
self.noteColor = color;
noteGraphics.tint = color;
};
self.setVelocity = function (vx, vy) {
self.velocity.x = vx;
self.velocity.y = vy;
};
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
var elapsed = Date.now() - self.spawnTime;
if (elapsed > self.lifetime) {
self.alpha = Math.max(0, 1 - (elapsed - self.lifetime) / 500);
}
if (elapsed > self.lifetime + 500 || self.y < -100 || self.y > 2832 || self.x < -100 || self.x > 2148) {
self.shouldDestroy = true;
}
};
return self;
});
var NoteSparks = Container.expand(function () {
var self = Container.call(this);
self.notes = [];
self.spawnRate = 500;
self.lastSpawnTime = 0;
self.spawnEnabled = false;
self.spawnX = 1024;
self.spawnY = 1366;
self.spawnVelocityRange = {
x: {
min: -2,
max: 2
},
y: {
min: -8,
max: -4
}
};
self.noteColors = [0xFF073A, 0x39FF14, 0x00FFFF, 0xF3F315, 0xFF61F6];
self.setSpawnPosition = function (x, y) {
self.spawnX = x;
self.spawnY = y;
};
self.setSpawnEnabled = function (enabled) {
self.spawnEnabled = enabled;
};
self.setSpawnRate = function (rate) {
self.spawnRate = rate;
};
self.spawnNote = function () {
var note = new Note();
note.x = self.spawnX + (Math.random() - 0.5) * 50;
note.y = self.spawnY;
var vx = self.spawnVelocityRange.x.min + Math.random() * (self.spawnVelocityRange.x.max - self.spawnVelocityRange.x.min);
var vy = self.spawnVelocityRange.y.min + Math.random() * (self.spawnVelocityRange.y.max - self.spawnVelocityRange.y.min);
note.setVelocity(vx, vy);
note.setNoteType(Math.random() > 0.5 ? 'note' : 'note2');
var color = self.noteColors[Math.floor(Math.random() * self.noteColors.length)];
note.setColor(color);
note.rotation = (Math.random() - 0.5) * 0.5;
self.notes.push(note);
self.addChild(note);
};
self.spawnBurst = function (count) {
for (var i = 0; i < count; i++) {
self.spawnNote();
}
};
self.update = function () {
var now = Date.now();
if (self.spawnEnabled && now - self.lastSpawnTime >= self.spawnRate) {
self.spawnNote();
self.lastSpawnTime = now;
}
for (var i = self.notes.length - 1; i >= 0; i--) {
var note = self.notes[i];
if (note.shouldDestroy) {
note.destroy();
self.notes.splice(i, 1);
}
}
};
return self;
});
var Orb = Container.expand(function (special) {
var self = Container.call(this);
self.special = special;
var frames = ['orb0', 'orb1', 'orb2', 'orb3', 'orb4', 'orb5'];
var framesSpecial = ['orbSpe0', 'orbSpe1', 'orbSpe2', 'orbSpe3', 'orbSpe4', 'orbSpe5'];
var currentFrames = frames;
if (self.special) {
currentFrames = framesSpecial;
}
var orbAssets = [];
var currentFrameIndex = 0;
var animationInterval = 100;
var lastFrameTime = 0;
self.directionAngle = 0;
self.orbId = null;
self.initialSize = 200;
self.orbAngleOffsetRatio = 0.15;
self.spawnTime = Date.now();
self.currentScale = 0.12;
var glowGraphics = self.attachAsset('glow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8,
width: self.initialSize * 1.5,
height: self.initialSize * 1.5,
blendMode: 1
});
self.boundingBox = self.attachAsset('boundingCircle', {
anchorX: 0.5,
anchorY: 0.5,
width: self.initialSize * 0.5,
height: self.initialSize * 0.5,
alpha: 0
});
var _rotateGlow = function rotateGlow() {
tween(glowGraphics, {
rotation: glowGraphics.rotation + Math.PI * 2
}, {
duration: 3000,
easing: tween.linear,
onFinish: _rotateGlow
});
};
_rotateGlow();
var _pulseGlow = function pulseGlow() {
tween(glowGraphics, {
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(glowGraphics, {
scaleX: 1.6,
scaleY: 1.6
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: _pulseGlow
});
}
});
};
_pulseGlow();
for (var i = 0; i < currentFrames.length; i++) {
var asset = self.attachAsset(currentFrames[i], {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0,
width: self.initialSize,
height: self.initialSize
});
orbAssets.push(asset);
}
if (orbAssets.length > 0) {
orbAssets[0].alpha = 1;
}
self.updateScale = function (newScale) {
self.currentScale = newScale;
for (var i = 0; i < orbAssets.length; i++) {
orbAssets[i].scaleX = newScale;
orbAssets[i].scaleY = newScale;
if (i === currentFrameIndex) {
orbAssets[i].alpha = Math.min(1, newScale + 0.66);
}
}
var distance = (2450 - 1366) * newScale;
var angle = self.directionAngle;
if (angle != centerAngle) {
angle += Math.sign(angle) * self.orbAngleOffsetRatio;
}
self.x = centerX + distance * Math.cos(angle + Math.PI * 0.5);
if (self.special) {
self.y = centerY + 128 - 0.6 * distance * Math.sin(angle + Math.PI * 0.5);
} else {
self.y = centerY + distance * Math.sin(angle + Math.PI * 0.5);
}
self.rotation = angle;
};
self.update = function () {
var now = Date.now();
if (now - lastFrameTime >= animationInterval) {
var currentScale = orbAssets[0].scaleX;
var targetAlpha = Math.min(1, currentScale + 0.66);
tween(orbAssets[currentFrameIndex], {
alpha: 0
}, {
duration: animationInterval / 2
});
currentFrameIndex = (currentFrameIndex + 1) % currentFrames.length;
tween(orbAssets[currentFrameIndex], {
alpha: targetAlpha
}, {
duration: animationInterval / 2
});
lastFrameTime = now;
}
};
return self;
});
var OrbManager = Container.expand(function () {
var self = Container.call(this);
self.orbs = [];
self.orbSpawnInterval = 1000;
self.lastOrbSpawnTime = 0;
self.orbSpawnScale = 0.12;
self.orbEndScale = 1.0;
self.orbAnimationDuration = 2000;
self.currentSpecialOrbsTimers = [];
self.loadSpecialOrbsTimers = function () {
console.log("loadSpecialOrbsTimers:", self.currentSpecialOrbsTimers);
if (specialOrbsTimers && specialOrbsTimers[currentTrackIndex]) {
self.currentSpecialOrbsTimers = specialOrbsTimers[currentTrackIndex];
} else {
self.currentSpecialOrbsTimers = [];
}
console.log("loadSpecialOrbsTimers:", self.currentSpecialOrbsTimers);
};
self.spawnOrb = function (angle, beatTime) {
if (!beatTime) {
return;
}
var isSpecial = beatTime && self.currentSpecialOrbsTimers && self.currentSpecialOrbsTimers[beatTime];
var orb = new Orb(isSpecial);
orb.orbId = getNextGateId();
orb.directionAngle = angle || centerAngle;
orb.spawnTime = Date.now();
orb.x = centerX;
orb.y = centerY;
orb.rotation = angle;
// Check if beatTime matches a currentSpecialOrbsTimers
if (isSpecial) {
orb.y = centerY - 1024;
if (isDebug) {
orb.tint = 0x48ff7f;
}
// Show help jump when spawning first special orb
if (helpIndicator && !jumpHelpShown) {
helpIndicator.showHelpJump();
jumpHelpShown = true; // Set the flag to true after showing
}
} else {
orb.updateScale(self.orbSpawnScale);
}
if (isDebug) {
console.log("beatTime: " + beatTime);
console.log("currentSpecialOrbsTimers:", self.currentSpecialOrbsTimers);
if (orb.special) {
console.log("SPECIAL !!! beatTime: " + beatTime);
}
}
self.orbs.push(orb);
self.addChild(orb);
self.lastOrbSpawnTime = Date.now();
};
self.update = function () {
if (!songStarted) {
if (self.orbs.length > 0) {
for (var i = self.orbs.length - 1; i >= 0; i--) {
self.orbs[i].destroy();
}
self.orbs = [];
}
return;
}
var now = Date.now();
if (now - self.lastOrbSpawnTime >= 600) {
var hasPlannedSpawn = false;
var beatTime;
if (gateManager && gateManager.currentNoteIndex < gateManager.gateBeats.length) {
var nextBeat = gateManager.gateBeats[gateManager.currentNoteIndex];
var songElapsed = now - gateManager.songStartTime;
var timeToNextBeat = nextBeat.t - songElapsed;
beatTime = timeToNextBeat / 2 + songElapsed;
if (timeToNextBeat <= 300 && timeToNextBeat > 0) {
hasPlannedSpawn = true;
}
}
if (!hasPlannedSpawn) {
self.spawnOrb(centerAngle, beatTime);
self.lastOrbSpawnTime = now;
}
}
for (var i = self.orbs.length - 1; i >= 0; i--) {
var orb = self.orbs[i];
var currentScale = orb.currentScale;
var newScale = currentScale + gateManager.gateAnimationSpeed * currentScale;
if (newScale > 3.0) {
orb.destroy();
self.orbs.splice(i, 1);
} else {
orb.updateScale(newScale);
}
}
};
return self;
});
var ProgressBar = Container.expand(function () {
var self = Container.call(this);
self.frame = self.attachAsset('progressFrame', {
anchorX: 0.0,
anchorY: 0.5,
alpha: 0.8
});
self.bar = self.attachAsset('progressBar', {
anchorX: 0.0,
anchorY: 0.5,
alpha: 0.8
});
self.bar.x = -0;
self.setProgress = function (progress) {
progress = Math.max(0, Math.min(1, progress));
self.bar.width = self.frame.width * progress;
};
self.startProgressAnimation = function () {
var songDuration = 0;
if (gateManager && gateManager.currentSong && gateManager.currentSong.duration) {
songDuration = gateManager.currentSong.duration;
}
if (songDuration > 0) {
self.setProgress(0);
tween(self.bar, {
width: self.frame.width
}, {
duration: songDuration,
easing: tween.linear
});
}
};
self.update = function () {};
self.setProgress(0);
return self;
});
var Runner = Container.expand(function () {
var self = Container.call(this);
var frameAssets = [];
var currentFrameIndex = 0;
var animationInterval = 2;
var lastFrameTime = 0;
for (var i = 1; i <= 12; i++) {
var frameId = 'runnerDir4_' + (i < 10 ? '00' + i : '0' + i);
var asset = self.attachAsset(frameId, {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xFFFFFF,
alpha: 0
});
frameAssets.push(asset);
}
if (frameAssets.length > 0) {
frameAssets[0].alpha = 1;
}
self.speedX = 0;
self.speedY = 0;
self.lastIntersectingGates = {};
self.tickCounter = 0;
self.idleFrameAssets = [];
var currentIdleFrameIndex = 0;
var idleAnimationInterval = 100;
var lastIdleFrameTime = 0;
self.isPlayingIdleAnim = false;
self.isReturningToInitial = false;
self.shouldStartIdleAfterReturn = false;
self.frameAssets = frameAssets;
self.isPlayingWaitingAnim = false;
self.currentWaitingFrameIndex = 0;
self.lastWaitingFrameTime = 0;
for (var i = 1; i <= 20; i++) {
var idleFrameId = 'runnerIdleDir8' + (i < 10 ? '00' + i : '0' + i);
var idleAsset = self.attachAsset(idleFrameId, {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xFFFFFF,
alpha: 0
});
self.idleFrameAssets.push(idleAsset);
}
self.teleportAnim = function () {
var beam = game.addChild(LK.getAsset('beam', {
anchorX: 0.5,
anchorY: 0.0,
x: 1024,
y: 0,
alpha: 0,
scaleY: 0
}));
LK.getSound('beamEnter').play();
tween(beam, {
alpha: 0.8,
scaleY: 1.0
}, {
duration: 800,
easing: tween.easeIn,
onFinish: function onFinish() {
LK.getSound('beamTeleport').play();
tween(self, {
y: -800,
scaleX: 0.1,
alpha: 0.3
}, {
duration: 1200,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(beam, {
alpha: 0,
scaleY: 0
}, {
duration: 600,
easing: tween.easeOut,
onFinish: function onFinish() {
beam.destroy();
showMenu();
}
});
}
});
}
});
};
self.rotationAnim = function () {
var rotationFrames = ['runnerRotation_01', 'runnerRotation_02', 'runnerRotation_03'];
var rotationAssets = [];
for (var i = 0; i < self.frameAssets.length; i++) {
self.frameAssets[i].alpha = 0;
}
for (var i = 0; i < self.idleFrameAssets.length; i++) {
self.idleFrameAssets[i].alpha = 0;
}
for (var i = 0; i < rotationFrames.length; i++) {
var asset = self.attachAsset(rotationFrames[i], {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xFFFFFF,
alpha: 0
});
rotationAssets.push(asset);
}
var frameIndex = 0;
var frameInterval = 100;
function showNextFrame() {
if (frameIndex < rotationAssets.length) {
if (frameIndex > 0) {
rotationAssets[frameIndex - 1].alpha = 0;
}
rotationAssets[frameIndex].alpha = 1;
frameIndex++;
LK.setTimeout(showNextFrame, frameInterval);
} else {
rotationAssets[rotationAssets.length - 1].alpha = 0;
for (var i = 0; i < rotationAssets.length; i++) {
rotationAssets[i].alpha = 0;
rotationAssets[i].destroy();
}
for (var i = 0; i < self.idleFrameAssets.length; i++) {
self.idleFrameAssets[i].alpha = 0;
}
if (self.idleFrameAssets.length > 0) {}
self.idleAnim();
}
}
showNextFrame();
};
self.startIdleSequence = function () {
for (var i = 0; i < self.frameAssets.length; i++) {
self.frameAssets[i].alpha = 0;
}
self.rotationAnim();
};
self.idleAnim = function () {
if (self.isPlayingIdleAnim) {
return;
}
self.isPlayingIdleAnim = true;
currentIdleFrameIndex = 0;
lastIdleFrameTime = Date.now();
for (var i = 0; i < self.frameAssets.length; i++) {
self.frameAssets[i].alpha = 0;
}
if (self.idleFrameAssets.length > 0) {
self.idleFrameAssets[0].alpha = 1;
}
LK.setTimeout(function () {
if (self.isPlayingIdleAnim) {
self.teleportAnim();
}
}, 2000);
};
self.update = function () {
if (self.isReturningToInitial) {
for (var i = 0; i < self.idleFrameAssets.length; i++) {
self.idleFrameAssets[i].alpha = 0;
}
if (self.frameAssets.length > 0) {
if (self.frameAssets[currentFrameIndex].alpha === 0) {
self.frameAssets[currentFrameIndex].alpha = 1;
}
}
var now = Date.now();
if (now - lastFrameTime >= animationInterval) {
self.frameAssets[currentFrameIndex].alpha = 0;
currentFrameIndex = (currentFrameIndex + 1) % self.frameAssets.length;
self.frameAssets[currentFrameIndex].alpha = 1;
lastFrameTime = now;
}
var angle = Math.atan2(self.y - centerY, self.x - centerX);
self.rotation = angle - Math.PI * 0.5;
return;
}
if (!songStarted) {
if (self.isPlayingWaitingAnim && self.idleFrameAssets && self.idleFrameAssets.length > 0) {
var now_waiting = Date.now();
if (now_waiting - self.lastWaitingFrameTime >= idleAnimationInterval) {
if (self.idleFrameAssets[self.currentWaitingFrameIndex]) {
self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 0;
}
self.currentWaitingFrameIndex = (self.currentWaitingFrameIndex + 1) % self.idleFrameAssets.length;
if (self.idleFrameAssets[self.currentWaitingFrameIndex]) {
self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 1;
}
self.lastWaitingFrameTime = now_waiting;
}
} else if (self.isPlayingIdleAnim && self.idleFrameAssets && self.idleFrameAssets.length > 0) {
// Post-song idle
var now = Date.now();
if (now - lastIdleFrameTime >= idleAnimationInterval) {
if (self.idleFrameAssets[currentIdleFrameIndex]) {
self.idleFrameAssets[currentIdleFrameIndex].alpha = 0;
}
currentIdleFrameIndex = (currentIdleFrameIndex + 1) % self.idleFrameAssets.length;
if (self.idleFrameAssets[currentIdleFrameIndex]) {
self.idleFrameAssets[currentIdleFrameIndex].alpha = 1;
}
lastIdleFrameTime = now;
}
}
return; // Song not started
}
// Song has started
if (self.isPlayingWaitingAnim) {
// Transition from waiting to running
self.isPlayingWaitingAnim = false;
if (globalWhistleInterval !== null) {
LK.clearInterval(globalWhistleInterval);
globalWhistleInterval = null;
}
if (self.idleFrameAssets && self.idleFrameAssets.length > 0 && self.idleFrameAssets[self.currentWaitingFrameIndex]) {
self.idleFrameAssets[self.currentWaitingFrameIndex].alpha = 0; // Hide current waiting frame
}
// Setup for running animation
currentFrameIndex = 0;
if (self.frameAssets && self.frameAssets.length > 0 && frameAssets[0]) {
// frameAssets is self.frameAssets
frameAssets[0].alpha = 1; // Show first running frame
}
lastFrameTime = Date.now(); // Reset timer for running anim
}
if (self.isPlayingIdleAnim) {
self.isPlayingIdleAnim = false;
for (var i = 0; i < self.idleFrameAssets.length; i++) {
self.idleFrameAssets[i].alpha = 0;
}
currentFrameIndex = 0;
if (self.frameAssets.length > 0) {
self.frameAssets[0].alpha = 1;
}
}
var angle = Math.atan2(self.y - centerY, self.x - centerX);
// Check if jumping by comparing distance from center
var distanceFromCenter = Math.sqrt(Math.pow(self.x - centerX, 2) + Math.pow(self.y - centerY, 2));
var normalDistance = Math.sqrt(Math.pow(924, 2) + Math.pow(634, 2)); // Normal track radius
if (distanceFromCenter > normalDistance * 1.2 || isJumping) {
// During jump, maintain last rotation or use currentRotationAngle
if (self.lastRotation !== undefined) {
self.rotation = self.lastRotation;
} else {
self.rotation = currentRotationAngle;
}
} else {
// Normal rotation when on track
self.rotation = angle - Math.PI * 0.5;
self.lastRotation = self.rotation; // Store last valid rotation
}
var now = Date.now();
if (now - lastFrameTime >= animationInterval) {
self.frameAssets[currentFrameIndex].alpha = 0;
currentFrameIndex = (currentFrameIndex + 1) % self.frameAssets.length;
self.frameAssets[currentFrameIndex].alpha = 1;
lastFrameTime = now;
}
};
if (!songStarted && self.idleFrameAssets && self.idleFrameAssets.length > 0) {
self.isPlayingWaitingAnim = true;
self.isPlayingIdleAnim = false;
self.isReturningToInitial = false;
self.currentWaitingFrameIndex = 0;
self.lastWaitingFrameTime = Date.now();
// Ensure running frames are hidden
for (var idx = 0; idx < self.frameAssets.length; idx++) {
if (self.frameAssets[idx]) {
self.frameAssets[idx].alpha = 0;
}
}
// Set initial waiting animation frame
for (var idx = 0; idx < self.idleFrameAssets.length; idx++) {
if (self.idleFrameAssets[idx]) {
self.idleFrameAssets[idx].alpha = idx === self.currentWaitingFrameIndex ? 1 : 0;
}
}
whistleAnim(1024, 1800);
}
return self;
});
var ScoreLabel = Container.expand(function () {
var self = Container.call(this);
self.scoreText = new Text2('0', {
size: 160,
fill: 0xFFFFFF
});
self.scoreText.anchor.set(0.5, 0.5);
self.addChild(self.scoreText);
self.penaltyText = new Text2('-2', {
size: 120,
fill: 0xFF0000
});
self.penaltyText.anchor.set(-0.5, 0.5);
self.penaltyText.y = 100;
self.penaltyText.alpha = 0;
self.addChild(self.penaltyText);
self.updateScore = function (newScore) {
self.scoreText.setText(newScore.toString());
tween(self, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150,
easing: tween.easeIn
});
}
});
};
self.showPenalty = function (penaltyValue) {
penaltyValue = penaltyValue || -2;
self.penaltyText.setText(penaltyValue.toString());
tween.stop(self.penaltyText, {
alpha: true,
y: true
});
self.penaltyText.y = 150;
self.penaltyText.alpha = 1;
self.penaltyText.anchor.x = -0.5 + Math.random() * 2.0;
tween(self.penaltyText, {
alpha: 0,
y: 50
}, {
duration: 1000,
easing: tween.easeOut
});
};
return self;
});
var SparkAnim = Container.expand(function () {
var self = Container.call(this);
var assetType = Math.random() > 0.5 ? 'note' : 'note2';
var glowGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1.0,
scaleX: 1,
scaleY: 1,
tint: 0x32cbec
});
self.lifetime = 1500;
self.spawnTime = Date.now();
var initialVelocity = -200;
var acceleration = -2000;
var deltaTime = 16;
var velocity = initialVelocity;
self.update = function () {
velocity += acceleration * (deltaTime / 1000);
glowGraphics.y += velocity * (deltaTime / 1000);
var elapsed = Date.now() - self.spawnTime;
if (elapsed >= self.lifetime) {
self.destroy();
}
};
tween(glowGraphics, {
alpha: 0
}, {
duration: self.lifetime,
easing: tween.easeOut
});
return self;
});
var Speaker = Container.expand(function () {
var self = Container.call(this);
var speakerGraphics = self.attachAsset('speaker', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.volume = 1.0;
self.isPlaying = false;
self.setVolume = function (vol) {
self.volume = Math.max(0, Math.min(1, vol));
};
self.toggleState = function () {
self.isPlaying = !self.isPlaying;
speakerGraphics.alpha = self.isPlaying ? 1.0 : 0.5;
};
return self;
});
var SpeakerManager = Container.expand(function () {
var self = Container.call(this);
self.speakers = [];
self.lastBeatTime = 0;
self.beatCooldown = 200;
self.speakerSongData = songListV4[0];
self.speakerBeats = filterSpeakerData(0);
self.currentBeatIndex = 0;
self.songStartTime = 0;
var speakerPositions = [{
x: 1024 - 500,
y: 512
}, {
x: 1024,
y: 512
}, {
x: 1024 + 500,
y: 512
}];
self.initializeSpeakers = function () {
for (var i = 0; i < 3; i++) {
var speaker = new Speaker();
var finalX = speakerPositions[i].x;
var finalY = speakerPositions[i].y;
if (i === 0) {
speaker.x = finalX - 800;
speaker.y = finalY;
} else if (i === 1) {
speaker.x = finalX;
speaker.y = finalY - 800;
} else {
speaker.x = finalX + 800;
speaker.y = finalY;
}
speaker.scaleX = 0.8;
speaker.scaleY = 0.8;
speaker.isBigBumping = false;
self.speakers.push(speaker);
self.addChild(speaker);
var delay;
if (i === 0 || i === 2) {
delay = 0;
} else {
delay = 300;
}
LK.setTimeout(function (spkr, targetX, targetY) {
return function () {
tween(spkr, {
x: targetX,
y: targetY
}, {
duration: 800,
easing: tween.easeOut
});
};
}(speaker, finalX, finalY), delay);
}
};
self.onBeat = function (beatValue) {
var now = Date.now();
if (now - self.lastBeatTime >= self.beatCooldown) {
var speakerIndex = -1;
if (beatValue === "1") {
speakerIndex = 1;
} else if (beatValue === "2") {
speakerIndex = 2;
} else {
speakerIndex = 0;
}
if (speakerIndex >= 0 && speakerIndex < self.speakers.length) {
var mainSpeaker = self.speakers[speakerIndex];
mainSpeaker.isBigBumping = true;
self.spawnNoteSparks(mainSpeaker);
tween(mainSpeaker, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(mainSpeaker, {
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
mainSpeaker.isBigBumping = false;
}
});
}
});
}
self.lastBeatTime = now;
}
};
self.update = function () {
if (songStarted) {
if (self.speakers.length === 0) {
self.initializeSpeakers();
}
for (var i = 0; i < self.speakers.length; i++) {
var speaker = self.speakers[i];
var time = Date.now() * 0.003;
var twistAngle = Math.sin(time + i * 0.5) * 0.15;
speaker.rotation = twistAngle;
if (!speaker.isBigBumping) {
var scaleValue = 0.8 + Math.sin(time * 2 + i * 0.3) * 0.05;
speaker.scaleX = scaleValue;
speaker.scaleY = scaleValue;
var dancingOffset = Math.sin(time * 3 + i * 0.7) * 10;
speaker.y = speakerPositions[i].y + dancingOffset;
}
}
}
if (!songStarted) {
return;
}
var now = Date.now();
var songElapsed = now - self.songStartTime;
if (self.currentBeatIndex < self.speakerBeats.length) {
var nextBeat = self.speakerBeats[self.currentBeatIndex];
if (songElapsed >= nextBeat.t) {
self.onBeat(nextBeat.s);
self.currentBeatIndex++;
}
}
if (self.currentBeatIndex >= self.speakerBeats.length && self.speakerBeats.length > 0) {
var lastBeat = self.speakerBeats[self.speakerBeats.length - 1];
if (songElapsed > lastBeat.t + 5000) {
self.songStartTime = Date.now();
self.currentBeatIndex = 0;
}
}
};
self.spawnNoteSparks = function (speaker) {
var noteCount = 3 + Math.floor(Math.random() * 3);
for (var i = 0; i < noteCount; i++) {
var note = new Note();
var angle = Math.random() * Math.PI * 2;
var distance = 50 + Math.random() * 100;
note.x = speaker.x + Math.cos(angle) * distance;
note.y = speaker.y + Math.sin(angle) * distance;
var speed = 3 + Math.random() * 5;
note.setVelocity(Math.cos(angle) * speed, Math.sin(angle) * speed - 2);
note.setNoteType(Math.random() > 0.5 ? 'note' : 'note2');
var futuristicColors = [0x32cbec];
var color = futuristicColors[Math.floor(Math.random() * futuristicColors.length)];
note.setColor(color);
note.rotation = (Math.random() - 0.5) * 0.5;
note.scaleX = 0.5;
note.scaleY = 0.5;
if (noteSparks) {
noteSparks.notes.push(note);
noteSparks.addChild(note);
}
}
};
return self;
});
var StartButton = Container.expand(function () {
var self = Container.call(this);
self.buttonBg = self.attachAsset('start', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.buttonPulse = self.attachAsset('start2', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.buttonLoading = self.attachAsset('startLoading', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.x = centerX;
self.y = centerY;
// Start with scale 0 and animate to 1 over 3 seconds
self.scaleX = 0;
self.scaleY = 0;
self.isEntranceComplete = false;
// Pulse animation for buttonPulse
var _pulse = function pulse() {
tween(self.buttonBg, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 1.0
}, {
duration: 1200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.buttonBg, {
scaleX: 0.9,
scaleY: 0.9,
alpha: 0.8
}, {
duration: 1200,
easing: tween.easeIn,
onFinish: _pulse
});
}
});
};
// Entrance animation from scale 0 to 1 over 3 seconds
tween(self, {
scaleX: 1,
scaleY: 1,
rotation: Math.PI * 4
}, {
duration: 3000,
easing: tween.easeOut,
onFinish: function onFinish() {
self.buttonBg.alpha = 1;
self.buttonPulse.alpha = 0;
self.buttonLoading.alpha = 0;
self.isEntranceComplete = true;
_pulse();
}
});
// Start the pulse animation
self.down = function () {
if (songStarted) {
return;
}
// Prevent clicking until entrance animation is complete
if (!self.isEntranceComplete) {
return;
}
// If track01 has been finished, show menu instead of starting a song
if (hasFinishedTrack01) {
// Stop the pulse animation when pressed
tween.stop(self.buttonBg);
tween(self, {
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
showMenu();
}
});
return;
}
songStarted = true;
// Stop the pulse animation when pressed
tween.stop(self.buttonBg);
tween(self, {
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
var songStartTime = Date.now();
if (isDebug) {
LK.playMusic('track_test');
} else {
LK.playMusic('track_01');
}
if (gateManager) {
gateManager.songStartTime = songStartTime;
gateManager.currentBeatIndex = 0;
}
if (speakerManager) {
speakerManager.songStartTime = songStartTime;
speakerManager.currentBeatIndex = 0;
}
if (orbManager) {
orbManager.loadSpecialOrbsTimers();
}
if (menuIcon && hasFinishedTrack01) {
menuIcon.visible = true;
}
if (scoreLabel) {
scoreLabel.visible = true;
}
if (speakerManager && speakerManager.speakers) {
for (var i = 0; i < speakerManager.speakers.length; i++) {
speakerManager.speakers[i].visible = true;
}
}
if (progressBar) {
progressBar.visible = true;
progressBar.startProgressAnimation();
}
self.destroy();
}
});
};
return self;
});
var WhistleParticle = Container.expand(function (startX, startY, assetId) {
var self = Container.call(this);
self.x = startX + (Math.random() - 0.5) * 40; // Initial horizontal spread
self.y = startY;
self.shouldDestroy = false;
var graphicScale = 0.15 + Math.random() * 0.1; // Make them small: 0.15 to 0.25
var graphic = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x000000,
// Black tint as requested
scaleX: graphicScale,
scaleY: graphicScale,
alpha: 0.85 // Start slightly transparent
});
graphic.rotation = (Math.random() - 0.5) * (Math.PI / 6); // Initial slight random rotation (up to +/- 30 deg)
var swingUpDuration = 5000 + Math.random() * 400; // Duration of upward movement: 0.8s to 1.2s
var evaporateDuration = 1000 + Math.random() * 200; // Duration of fade out: 0.4s to 0.6s
// Swing Up Animation:
// Moves upwards, rotates for a "swing" effect.
tween(self, {
y: self.y - (2000 + Math.random() * 250),
// Move up by 120-180px
rotation: self.rotation + (Math.random() - 0.5) * (Math.PI / 2) // Swing rotation up to +/- 45 deg from initial
}, {
duration: swingUpDuration,
easing: tween.easeOutCubic // Smoothly decelerates
});
// Evaporate Animation:
// Fades out the particle after the swing up animation.
tween(self, {
alpha: 0
}, {
duration: evaporateDuration,
delay: swingUpDuration,
// Start fading after upward motion is complete
easing: tween.easeInQuad,
// Smoothly accelerates fade, making it "evaporate"
onFinish: function onFinish() {
self.shouldDestroy = true; // Flag for cleanup in game.update
}
});
return self;
});
var WorldManager = Container.expand(function () {
var self = Container.call(this);
var assetWidth = 2732;
var screenWidth = 2048;
var totalContentWidth = assetWidth * 2;
self.x_center_view = -(totalContentWidth / 2 - screenWidth / 2);
self.shiftAmplitude = 1024;
self.shiftDurationOneWay = 15000;
self._isShifting = false;
self._animateToRandomTarget = function () {
if (!songStarted || !self._isShifting) {
self._isShifting = false;
tween.stop(self, {
x: true
});
return;
}
var minTargetX = self.x_center_view - self.shiftAmplitude;
var maxTargetX = self.x_center_view + self.shiftAmplitude;
var randomTargetX = minTargetX + Math.random() * (maxTargetX - minTargetX);
var currentX = self.x;
var distanceToTravel = Math.abs(currentX - randomTargetX);
if (distanceToTravel < 50) {
LK.setTimeout(self._animateToRandomTarget, 0);
return;
}
var speed = self.shiftAmplitude / self.shiftDurationOneWay;
if (speed <= 0) {
speed = (self.shiftAmplitude > 0 ? self.shiftAmplitude : 1024) / 15000;
if (speed <= 0) {
speed = 0.05;
}
}
var dynamicDuration = distanceToTravel / speed;
dynamicDuration = Math.max(500, Math.min(dynamicDuration, self.shiftDurationOneWay * 2));
tween(self, {
x: randomTargetX
}, {
duration: dynamicDuration,
easing: tween.easeInOut,
onFinish: self._animateToRandomTarget
});
};
self._initiateShift = function () {
if (self._isShifting) {
return;
}
self._isShifting = true;
self._animateToRandomTarget();
};
self.update = function () {
if (songStarted && !self._isShifting) {
self._initiateShift();
} else if (!songStarted && self._isShifting) {
self._isShifting = false;
tween.stop(self, {
x: true
});
}
};
self.loadWorldAssets = function (trackIndex) {
var worldAssets = ['world01', 'world02', 'world03'];
var worldAsset = worldAssets[trackIndex] || 'world01';
if (self.bgLeft) {
self.bgLeft.destroy();
}
if (self.bgRight) {
self.bgRight.destroy();
}
self.bgLeft = self.attachAsset(worldAsset, {
anchorX: 0.5,
anchorY: 0.5,
x: assetWidth / 2,
y: centerY,
scaleX: 1.0,
scaleY: 1.0
});
self.bgRight = self.attachAsset(worldAsset, {
anchorX: 0.5,
anchorY: 0.5,
x: assetWidth / 2 + assetWidth,
y: centerY,
scaleX: -1.0,
scaleY: 1.0
});
};
self.x = self.x_center_view;
self.y = 0;
self.bgLeft = self.attachAsset('world01', {
anchorX: 0.5,
anchorY: 0.5,
x: assetWidth / 2,
y: centerY,
scaleX: 1.0,
scaleY: 1.0
});
self.bgRight = self.attachAsset('world01', {
anchorX: 0.5,
anchorY: 0.5,
x: assetWidth / 2 + assetWidth,
y: centerY,
scaleX: -1.0,
scaleY: 1.0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000c33
});
/****
* Game Code
****/
var centerX = 1024;
var centerY = 1366;
var neonColors = [0x39FF14, 0xFF073A, 0x00FFFF, 0xF3F315, 0xFF61F6, 0xFF9900];
var currentColor = neonColors[Math.floor(Math.random() * neonColors.length)];
function drawPolygon(coordinates, tint) {
log("drawPolygon ", coordinates);
var lines = [];
for (var i = 0; i < coordinates.length; i++) {
var startPoint = coordinates[i];
var endPoint = coordinates[(i + 1) % coordinates.length];
var line = drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y, tint);
lines.push(line);
}
return lines;
}
function updatePolygon(lines, newCoordinates, scale) {
log("updatePolygon ", lines, scale);
if (lines.length !== newCoordinates.length) {
error("updatePolygon error: lines and newCoordinates length mismatch");
return lines;
}
for (var i = 0; i < lines.length; i++) {
var startPoint = newCoordinates[i];
var endPoint = newCoordinates[(i + 1) % newCoordinates.length];
updateLine(lines[i], startPoint.x, startPoint.y, endPoint.x, endPoint.y, scale);
}
return lines;
}
function drawLine(x1, y1, x2, y2, tint) {
log("drawLine ", x1, y1);
var line = LK.getAsset('line', {
anchorX: 0.0,
anchorY: 0.0,
x: x1,
y: y1,
tint: tint
});
line.startX = x1;
line.startY = y1;
line.endX = x2;
line.endY = y2;
var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
line.width = distance;
var angle = Math.atan2(y2 - y1, x2 - x1);
line.rotation = angle;
return line;
}
function updateLine(line, newX1, newY1, newX2, newY2, scale) {
log("updateLine ", line);
scale = scale === undefined ? 1 : scale;
var midX = (newX1 + newX2) / 2;
var midY = (newY1 + newY2) / 2;
newX1 = midX + (newX1 - midX) * scale;
newY1 = midY + (newY1 - midY) * scale;
newX2 = midX + (newX2 - midX) * scale;
newY2 = midY + (newY2 - midY) * scale;
line.x = newX1;
line.y = newY1;
line.startX = newX1;
line.startY = newY1;
line.endX = newX2;
line.endY = newY2;
var distance = Math.sqrt(Math.pow(newX2 - newX1, 2) + Math.pow(newY2 - newY1, 2));
line.width = distance;
var angle = Math.atan2(newY2 - newY1, newX2 - newX1);
line.rotation = angle;
return line;
}
function log() {
if (isDebug) {
console.log(arguments);
}
}
var songTracks = ["track_01", "track_02", "track_03"];
var songListV4 = [{
"name": "Words Fly Fast",
"duration": 157240,
"songBeats": [{
"t": 128,
"s": "1"
}, {
"t": 443,
"s": "1"
}, {
"t": 651,
"b": "1"
}, {
"t": 747,
"s": "1"
}, {
"t": 1232,
"s": "1"
}, {
"t": 1256,
"b": "1"
}, {
"t": 1579,
"s": "1"
}, {
"t": 1800,
"b": "1"
}, {
"t": 1893,
"s": "1"
}, {
"t": 2224,
"s": "1"
}, {
"t": 2364,
"b": "1"
}, {
"t": 2549,
"s": "1"
}, {
"t": 2828,
"b": "1"
}, {
"t": 2853,
"s": "1"
}, {
"t": 3269,
"s": "1"
}, {
"t": 3324,
"b": "1"
}, {
"t": 3708,
"b": "1"
}, {
"t": 3712,
"s": "1"
}, {
"t": 4037,
"s": "1"
}, {
"t": 4192,
"b": "2"
}, {
"t": 4352,
"s": "1"
}, {
"t": 4661,
"s": "1"
}, {
"t": 4804,
"b": "2"
}, {
"t": 5072,
"s": "1"
}, {
"t": 5320,
"b": "2"
}, {
"t": 5392,
"s": "1"
}, {
"t": 5728,
"s": "1"
}, {
"t": 5796,
"b": "2"
}, {
"t": 6176,
"s": "1"
}, {
"t": 6240,
"b": "2"
}, {
"t": 6587,
"s": "1"
}, {
"t": 6692,
"b": "2"
}, {
"t": 7141,
"s": "1"
}, {
"t": 7176,
"b": "2"
}, {
"t": 7541,
"s": "1"
}, {
"t": 7640,
"b": "2"
}, {
"t": 7856,
"s": "1"
}, {
"t": 8092,
"b": "1"
}, {
"t": 8171,
"s": "3"
}, {
"t": 8501,
"s": "2"
}, {
"t": 8576,
"b": "2"
}, {
"t": 8816,
"s": "2"
}, {
"t": 9120,
"s": "3"
}, {
"t": 9124,
"b": "1"
}, {
"t": 9424,
"s": "2"
}, {
"t": 9580,
"b": "2"
}, {
"t": 9728,
"s": "2"
}, {
"t": 10032,
"s": "3"
}, {
"t": 10084,
"b": "1"
}, {
"t": 10347,
"s": "2"
}, {
"t": 10548,
"b": "2"
}, {
"t": 10651,
"s": "1"
}, {
"t": 10971,
"s": "2"
}, {
"t": 11072,
"b": "1"
}, {
"t": 11275,
"s": "2"
}, {
"t": 11556,
"b": "2"
}, {
"t": 11600,
"s": "2"
}, {
"t": 11915,
"s": "1"
}, {
"t": 12092,
"b": "1"
}, {
"t": 12240,
"s": "2"
}, {
"t": 12560,
"s": "3"
}, {
"t": 12564,
"b": "2"
}, {
"t": 12875,
"s": "2"
}, {
"t": 13008,
"b": "1"
}, {
"t": 13184,
"s": "3"
}, {
"t": 13400,
"b": "2"
}, {
"t": 13493,
"s": "2"
}, {
"t": 13813,
"s": "3"
}, {
"t": 13916,
"b": "1"
}, {
"t": 14176,
"s": "3"
}, {
"t": 14460,
"b": "2"
}, {
"t": 14517,
"s": "1"
}, {
"t": 14843,
"s": "2"
}, {
"t": 14944,
"b": "1"
}, {
"t": 15147,
"s": "2"
}, {
"t": 15360,
"b": "2"
}, {
"t": 15472,
"s": "3"
}, {
"t": 15781,
"s": "2"
}, {
"t": 16112,
"s": "2"
}, {
"t": 16432,
"s": "2"
}, {
"t": 16741,
"s": "2"
}, {
"t": 17056,
"s": "3"
}, {
"t": 17340,
"b": "1"
}, {
"t": 17360,
"s": "3"
}, {
"t": 17685,
"s": "2"
}, {
"t": 17995,
"s": "3"
}, {
"t": 18260,
"b": "2"
}, {
"t": 18299,
"s": "3"
}, {
"t": 18608,
"s": "3"
}, {
"t": 18917,
"s": "3"
}, {
"t": 19196,
"b": "1"
}, {
"t": 19232,
"s": "1"
}, {
"t": 19547,
"s": "2"
}, {
"t": 19851,
"s": "3"
}, {
"t": 20064,
"b": "2"
}, {
"t": 20171,
"s": "1"
}, {
"t": 20475,
"s": "3"
}, {
"t": 20805,
"s": "3"
}, {
"t": 21092,
"b": "1"
}, {
"t": 21120,
"s": "1"
}, {
"t": 21435,
"s": "2"
}, {
"t": 21749,
"s": "2"
}, {
"t": 22059,
"s": "2"
}, {
"t": 22072,
"b": "2"
}, {
"t": 22373,
"s": "2"
}, {
"t": 22699,
"s": "2"
}, {
"t": 23019,
"s": "1"
}, {
"t": 23100,
"b": "1"
}, {
"t": 23323,
"s": "3"
}, {
"t": 23627,
"s": "3"
}, {
"t": 23931,
"s": "2"
}, {
"t": 24040,
"b": "2"
}, {
"t": 24240,
"s": "2"
}, {
"t": 24549,
"s": "2"
}, {
"t": 24869,
"s": "2"
}, {
"t": 24988,
"b": "1"
}, {
"t": 25189,
"s": "3"
}, {
"t": 25493,
"s": "2"
}, {
"t": 25819,
"s": "2"
}, {
"t": 25884,
"b": "2"
}, {
"t": 26133,
"s": "1"
}, {
"t": 26437,
"s": "2"
}, {
"t": 26757,
"s": "2"
}, {
"t": 26876,
"b": "1"
}, {
"t": 27061,
"s": "2"
}, {
"t": 27365,
"s": "2"
}, {
"t": 27669,
"s": "3"
}, {
"t": 27892,
"b": "2"
}, {
"t": 27973,
"s": "3"
}, {
"t": 28277,
"s": "3"
}, {
"t": 28581,
"s": "3"
}, {
"t": 28820,
"b": "1"
}, {
"t": 28885,
"s": "3"
}, {
"t": 29221,
"s": "2"
}, {
"t": 29557,
"s": "3"
}, {
"t": 29688,
"b": "2"
}, {
"t": 29861,
"s": "2"
}, {
"t": 30197,
"s": "2"
}, {
"t": 30507,
"s": "2"
}, {
"t": 30728,
"b": "1"
}, {
"t": 30827,
"s": "2"
}, {
"t": 31141,
"s": "2"
}, {
"t": 31483,
"s": "2"
}, {
"t": 31696,
"b": "2"
}, {
"t": 31787,
"s": "2"
}, {
"t": 32091,
"s": "3"
}, {
"t": 32395,
"s": "3"
}, {
"t": 32656,
"b": "1"
}, {
"t": 32731,
"s": "1"
}, {
"t": 33045,
"s": "2"
}, {
"t": 33349,
"s": "3"
}, {
"t": 33624,
"b": "2"
}, {
"t": 33653,
"s": "2"
}, {
"t": 33957,
"s": "3"
}, {
"t": 34261,
"s": "2"
}, {
"t": 34576,
"s": "2"
}, {
"t": 34673,
"b": "1"
}, {
"t": 34901,
"s": "2"
}, {
"t": 35211,
"s": "3"
}, {
"t": 35520,
"s": "2"
}, {
"t": 35692,
"b": "2"
}, {
"t": 35829,
"s": "3"
}, {
"t": 36149,
"s": "3"
}, {
"t": 36464,
"s": "2"
}, {
"t": 36628,
"b": "1"
}, {
"t": 36779,
"s": "3"
}, {
"t": 37083,
"s": "2"
}, {
"t": 37403,
"s": "2"
}, {
"t": 37536,
"b": "2"
}, {
"t": 37707,
"s": "2"
}, {
"t": 38037,
"s": "2"
}, {
"t": 38341,
"s": "3"
}, {
"t": 38516,
"b": "1"
}, {
"t": 38661,
"s": "2"
}, {
"t": 38976,
"s": "1"
}, {
"t": 39301,
"s": "1"
}, {
"t": 39372,
"b": "2"
}, {
"t": 39611,
"s": "2"
}, {
"t": 39941,
"s": "2"
}, {
"t": 40256,
"s": "1"
}, {
"t": 40524,
"b": "1"
}, {
"t": 40565,
"s": "2"
}, {
"t": 40885,
"s": "1"
}, {
"t": 41028,
"b": "1"
}, {
"t": 41189,
"s": "1"
}, {
"t": 41499,
"s": "1"
}, {
"t": 41851,
"s": "1",
"b": "3"
}, {
"t": 42155,
"s": "1",
"b": "3"
}, {
"t": 42459,
"s": "1"
}, {
"t": 42976,
"s": "1"
}, {
"t": 43080,
"b": "2"
}, {
"t": 43429,
"s": "1"
}, {
"t": 43564,
"b": "2"
}, {
"t": 43733,
"s": "1"
}, {
"t": 44043,
"s": "1"
}, {
"t": 44357,
"s": "2"
}, {
"t": 44400,
"b": "1"
}, {
"t": 44672,
"s": "2"
}, {
"t": 44948,
"b": "1"
}, {
"t": 44987,
"s": "1"
}, {
"t": 45312,
"s": "1"
}, {
"t": 45744,
"s": "1"
}, {
"t": 46059,
"s": "1"
}, {
"t": 46373,
"s": "1"
}, {
"t": 46683,
"s": "2"
}, {
"t": 46888,
"b": "2"
}, {
"t": 46992,
"s": "2"
}, {
"t": 47301,
"s": "1"
}, {
"t": 47412,
"b": "2"
}, {
"t": 47605,
"s": "2"
}, {
"t": 47920,
"s": "2"
}, {
"t": 48229,
"s": "1"
}, {
"t": 48260,
"b": "1"
}, {
"t": 48544,
"s": "2"
}, {
"t": 48818,
"b": "1"
}, {
"t": 48859,
"s": "1"
}, {
"t": 49168,
"s": "1"
}, {
"t": 49477,
"s": "2"
}, {
"t": 49845,
"s": "1"
}, {
"t": 50160,
"s": "1"
}, {
"t": 50496,
"s": "2"
}, {
"t": 50805,
"s": "1"
}, {
"t": 50816,
"b": "2"
}, {
"t": 51173,
"s": "1"
}, {
"t": 51477,
"s": "2"
}, {
"t": 51524,
"b": "2"
}, {
"t": 51792,
"s": "2"
}, {
"t": 52107,
"s": "2"
}, {
"t": 52168,
"b": "1"
}, {
"t": 52421,
"s": "1"
}, {
"t": 52684,
"b": "1"
}, {
"t": 52869,
"s": "1"
}, {
"t": 53189,
"s": "1"
}, {
"t": 53595,
"s": "1"
}, {
"t": 53979,
"s": "1"
}, {
"t": 54288,
"s": "1"
}, {
"t": 54540,
"b": "3"
}, {
"t": 54597,
"s": "3"
}, {
"t": 54907,
"s": "2"
}, {
"t": 55227,
"s": "3"
}, {
"t": 55488,
"b": "3"
}, {
"t": 55531,
"s": "3"
}, {
"t": 55851,
"s": "2"
}, {
"t": 56165,
"s": "3"
}, {
"t": 56448,
"b": "3"
}, {
"t": 56475,
"s": "3"
}, {
"t": 56789,
"s": "2"
}, {
"t": 57104,
"s": "2"
}, {
"t": 57408,
"s": "1"
}, {
"t": 57436,
"b": "3"
}, {
"t": 57728,
"s": "3"
}, {
"t": 58053,
"s": "2"
}, {
"t": 58363,
"s": "1"
}, {
"t": 58412,
"b": "1"
}, {
"t": 58667,
"s": "3"
}, {
"t": 58976,
"s": "3"
}, {
"t": 59240,
"b": "2"
}, {
"t": 59307,
"s": "1"
}, {
"t": 59621,
"s": "3"
}, {
"t": 59947,
"s": "3"
}, {
"t": 59988,
"b": "1"
}, {
"t": 60304,
"s": "2"
}, {
"t": 60608,
"s": "3"
}, {
"t": 60808,
"b": "2"
}, {
"t": 60971,
"s": "1"
}, {
"t": 61339,
"s": "2"
}, {
"t": 61636,
"b": "1"
}, {
"t": 61701,
"s": "1"
}, {
"t": 62032,
"s": "1"
}, {
"t": 62336,
"s": "3"
}, {
"t": 62640,
"s": "3"
}, {
"t": 62955,
"s": "3"
}, {
"t": 63269,
"s": "3"
}, {
"t": 63584,
"s": "2"
}, {
"t": 63800,
"b": "1"
}, {
"t": 63904,
"s": "3"
}, {
"t": 64213,
"s": "3"
}, {
"t": 64555,
"s": "2"
}, {
"t": 64688,
"b": "2"
}, {
"t": 64864,
"s": "3"
}, {
"t": 65179,
"s": "2"
}, {
"t": 65499,
"s": "2"
}, {
"t": 65656,
"b": "1"
}, {
"t": 65824,
"s": "3"
}, {
"t": 66144,
"s": "2"
}, {
"t": 66464,
"s": "2"
}, {
"t": 66544,
"b": "2"
}, {
"t": 66768,
"s": "3"
}, {
"t": 67093,
"s": "1"
}, {
"t": 67403,
"s": "3"
}, {
"t": 67492,
"b": "1"
}, {
"t": 67707,
"s": "3"
}, {
"t": 68053,
"s": "2"
}, {
"t": 68368,
"s": "2"
}, {
"t": 68432,
"b": "2"
}, {
"t": 68709,
"s": "1"
}, {
"t": 69024,
"s": "1"
}, {
"t": 69333,
"s": "2"
}, {
"t": 69369,
"b": "1"
}, {
"t": 69648,
"s": "3"
}, {
"t": 69968,
"s": "2"
}, {
"t": 70283,
"s": "2"
}, {
"t": 70336,
"b": "2"
}, {
"t": 70587,
"s": "3"
}, {
"t": 70896,
"s": "3"
}, {
"t": 71205,
"s": "3"
}, {
"t": 71416,
"b": "1"
}, {
"t": 71525,
"s": "3"
}, {
"t": 71835,
"s": "3"
}, {
"t": 72139,
"s": "3"
}, {
"t": 72324,
"b": "2"
}, {
"t": 72448,
"s": "3"
}, {
"t": 72779,
"s": "3"
}, {
"t": 73083,
"s": "2"
}, {
"t": 73387,
"s": "3"
}, {
"t": 73408,
"b": "1"
}, {
"t": 73691,
"s": "1"
}, {
"t": 74016,
"s": "3"
}, {
"t": 74316,
"b": "2"
}, {
"t": 74336,
"s": "2"
}, {
"t": 74667,
"s": "3"
}, {
"t": 74987,
"s": "3"
}, {
"t": 75276,
"b": "1"
}, {
"t": 75296,
"s": "1"
}, {
"t": 75605,
"s": "3"
}, {
"t": 75915,
"s": "3"
}, {
"t": 76204,
"b": "2"
}, {
"t": 76224,
"s": "3"
}, {
"t": 76549,
"s": "3"
}, {
"t": 76853,
"s": "3"
}, {
"t": 77157,
"s": "3"
}, {
"t": 77248,
"b": "2"
}, {
"t": 77461,
"s": "3"
}, {
"t": 77776,
"s": "1"
}, {
"t": 78107,
"s": "2"
}, {
"t": 78232,
"b": "1"
}, {
"t": 78421,
"s": "2"
}, {
"t": 78731,
"s": "2"
}, {
"t": 79045,
"s": "2"
}, {
"t": 79168,
"b": "2"
}, {
"t": 79365,
"s": "2"
}, {
"t": 79669,
"s": "1"
}, {
"t": 79995,
"s": "1"
}, {
"t": 80309,
"s": "1"
}, {
"t": 80640,
"s": "1"
}, {
"t": 80965,
"s": "1"
}, {
"t": 81048,
"b": "1"
}, {
"t": 81296,
"s": "1"
}, {
"t": 81856,
"s": "1"
}, {
"t": 81996,
"b": "2"
}, {
"t": 82165,
"s": "2"
}, {
"t": 82491,
"s": "2"
}, {
"t": 82827,
"s": "2"
}, {
"t": 83096,
"b": "1"
}, {
"t": 83136,
"s": "2"
}, {
"t": 83451,
"s": "2"
}, {
"t": 83765,
"s": "1"
}, {
"t": 84064,
"b": "2"
}, {
"t": 84080,
"s": "1"
}, {
"t": 84389,
"s": "1"
}, {
"t": 84704,
"s": "1"
}, {
"t": 85040,
"b": "1"
}, {
"t": 85040,
"s": "1"
}, {
"t": 85392,
"s": "2"
}, {
"t": 85696,
"s": "1"
}, {
"t": 86008,
"b": "2"
}, {
"t": 86016,
"s": "1"
}, {
"t": 86325,
"s": "1"
}, {
"t": 86688,
"s": "1"
}, {
"t": 86956,
"b": "1"
}, {
"t": 87019,
"s": "2"
}, {
"t": 87323,
"s": "2"
}, {
"t": 87643,
"s": "1"
}, {
"t": 87947,
"s": "1"
}, {
"t": 87976,
"b": "2"
}, {
"t": 88272,
"s": "1"
}, {
"t": 88587,
"s": "1"
}, {
"t": 88832,
"b": "1"
}, {
"t": 88901,
"s": "1"
}, {
"t": 89216,
"s": "1"
}, {
"t": 89520,
"s": "1"
}, {
"t": 89844,
"b": "2"
}, {
"t": 89872,
"s": "1"
}, {
"t": 90176,
"s": "2"
}, {
"t": 90485,
"s": "2"
}, {
"t": 90800,
"s": "2"
}, {
"t": 90832,
"b": "1"
}, {
"t": 91115,
"s": "1"
}, {
"t": 91424,
"s": "1"
}, {
"t": 91819,
"s": "1"
}, {
"t": 92304,
"s": "1"
}, {
"t": 92667,
"s": "1"
}, {
"t": 92672,
"b": "3"
}, {
"t": 92992,
"s": "2"
}, {
"t": 93156,
"b": "3"
}, {
"t": 93301,
"s": "3"
}, {
"t": 93659,
"s": "1"
}, {
"t": 93720,
"b": "3"
}, {
"t": 93968,
"s": "3"
}, {
"t": 94272,
"s": "3"
}, {
"t": 94329,
"b": "3"
}, {
"t": 94581,
"s": "2"
}, {
"t": 94812,
"b": "3"
}, {
"t": 94885,
"s": "3"
}, {
"t": 95205,
"s": "3"
}, {
"t": 95256,
"b": "3"
}, {
"t": 95525,
"s": "2"
}, {
"t": 95720,
"b": "1"
}, {
"t": 95845,
"s": "3"
}, {
"t": 96155,
"s": "1"
}, {
"t": 96485,
"s": "2"
}, {
"t": 96496,
"b": "2"
}, {
"t": 96811,
"s": "3"
}, {
"t": 97125,
"s": "3"
}, {
"t": 97451,
"s": "2"
}, {
"t": 97556,
"b": "3"
}, {
"t": 97755,
"s": "3"
}, {
"t": 98069,
"s": "3"
}, {
"t": 98112,
"b": "3"
}, {
"t": 98411,
"s": "2"
}, {
"t": 98624,
"b": "3"
}, {
"t": 98725,
"s": "3"
}, {
"t": 99035,
"s": "3"
}, {
"t": 99100,
"b": "3"
}, {
"t": 99349,
"s": "3"
}, {
"t": 99604,
"b": "1"
}, {
"t": 99680,
"s": "1"
}, {
"t": 100000,
"s": "2"
}, {
"t": 100304,
"s": "3"
}, {
"t": 100440,
"b": "2"
}, {
"t": 100624,
"s": "3"
}, {
"t": 100928,
"s": "3"
}, {
"t": 101232,
"s": "3"
}, {
"t": 101420,
"b": "1"
}, {
"t": 101557,
"s": "3"
}, {
"t": 101888,
"s": "2"
}, {
"t": 102192,
"s": "3"
}, {
"t": 102388,
"b": "2"
}, {
"t": 102507,
"s": "3"
}, {
"t": 102853,
"s": "3"
}, {
"t": 103157,
"s": "3"
}, {
"t": 103336,
"b": "1"
}, {
"t": 103461,
"s": "3"
}, {
"t": 103765,
"s": "2"
}, {
"t": 104085,
"s": "1"
}, {
"t": 104324,
"b": "2"
}, {
"t": 104395,
"s": "1"
}, {
"t": 104709,
"s": "2"
}, {
"t": 105013,
"s": "3"
}, {
"t": 105172,
"b": "1"
}, {
"t": 105317,
"s": "2"
}, {
"t": 105627,
"s": "1"
}, {
"t": 105931,
"s": "3"
}, {
"t": 106240,
"s": "2"
}, {
"t": 106260,
"b": "3"
}, {
"t": 106555,
"s": "3"
}, {
"t": 106836,
"b": "3"
}, {
"t": 106864,
"s": "3"
}, {
"t": 107168,
"s": "3"
}, {
"t": 107392,
"b": "3"
}, {
"t": 107472,
"s": "1"
}, {
"t": 107781,
"s": "2"
}, {
"t": 108028,
"b": "2"
}, {
"t": 108091,
"s": "3"
}, {
"t": 108416,
"s": "2"
}, {
"t": 108692,
"b": "1"
}, {
"t": 108731,
"s": "2"
}, {
"t": 109045,
"s": "2"
}, {
"t": 109349,
"s": "3"
}, {
"t": 109540,
"b": "2"
}, {
"t": 109669,
"s": "2"
}, {
"t": 109979,
"s": "2"
}, {
"t": 110293,
"s": "3"
}, {
"t": 110488,
"b": "1"
}, {
"t": 110597,
"s": "3"
}, {
"t": 110917,
"s": "3"
}, {
"t": 111221,
"s": "3"
}, {
"t": 111525,
"s": "3"
}, {
"t": 111840,
"s": "2"
}, {
"t": 111932,
"b": "2"
}, {
"t": 112144,
"s": "3"
}, {
"t": 112459,
"s": "3"
}, {
"t": 112773,
"s": "3"
}, {
"t": 112888,
"b": "1"
}, {
"t": 113093,
"s": "3"
}, {
"t": 113419,
"s": "3"
}, {
"t": 113723,
"s": "3"
}, {
"t": 113796,
"b": "2"
}, {
"t": 114032,
"s": "2"
}, {
"t": 114336,
"s": "2"
}, {
"t": 114651,
"s": "3"
}, {
"t": 114864,
"b": "1"
}, {
"t": 114965,
"s": "1"
}, {
"t": 115280,
"s": "2"
}, {
"t": 115584,
"s": "3"
}, {
"t": 115888,
"s": "3"
}, {
"t": 115904,
"b": "2"
}, {
"t": 116208,
"s": "2"
}, {
"t": 116523,
"s": "3"
}, {
"t": 116837,
"s": "2"
}, {
"t": 116864,
"b": "2"
}, {
"t": 117147,
"s": "3"
}, {
"t": 117451,
"s": "3"
}, {
"t": 117787,
"s": "3"
}, {
"t": 117792,
"b": "1"
}, {
"t": 118101,
"s": "3"
}, {
"t": 118405,
"s": "3"
}, {
"t": 118741,
"s": "2"
}, {
"t": 119051,
"s": "2"
}, {
"t": 119184,
"b": "2"
}, {
"t": 119360,
"s": "1"
}, {
"t": 119664,
"s": "2"
}, {
"t": 119973,
"s": "3"
}, {
"t": 120244,
"b": "1"
}, {
"t": 120283,
"s": "2"
}, {
"t": 120603,
"s": "3"
}, {
"t": 120912,
"s": "3"
}, {
"t": 121112,
"b": "2"
}, {
"t": 121216,
"s": "3"
}, {
"t": 121525,
"s": "3"
}, {
"t": 121829,
"s": "3"
}, {
"t": 122121,
"b": "3"
}, {
"t": 122293,
"s": "1"
}, {
"t": 122744,
"b": "3"
}, {
"t": 122779,
"s": "1"
}, {
"t": 123099,
"s": "1"
}, {
"t": 123260,
"b": "3"
}, {
"t": 123504,
"s": "1"
}, {
"t": 123784,
"b": "3"
}, {
"t": 123845,
"s": "1"
}, {
"t": 124217,
"b": "3"
}, {
"t": 124352,
"s": "1"
}, {
"t": 124699,
"s": "1"
}, {
"t": 125024,
"s": "1"
}, {
"t": 125333,
"s": "1"
}, {
"t": 125620,
"b": "1"
}, {
"t": 125648,
"s": "1"
}, {
"t": 125979,
"s": "1"
}, {
"t": 126325,
"s": "1"
}, {
"t": 126635,
"s": "1"
}, {
"t": 126668,
"b": "2"
}, {
"t": 126960,
"s": "1"
}, {
"t": 127275,
"s": "1"
}, {
"t": 127589,
"s": "1"
}, {
"t": 127788,
"b": "1"
}, {
"t": 128059,
"s": "1"
}, {
"t": 128523,
"s": "1"
}, {
"t": 128796,
"b": "2"
}, {
"t": 128837,
"s": "2"
}, {
"t": 129173,
"s": "1"
}, {
"t": 129483,
"s": "2"
}, {
"t": 129716,
"b": "1"
}, {
"t": 129813,
"s": "2"
}, {
"t": 130133,
"s": "1"
}, {
"t": 130437,
"s": "1"
}, {
"t": 130741,
"s": "1"
}, {
"t": 130884,
"b": "2"
}, {
"t": 131109,
"s": "1"
}, {
"t": 131413,
"s": "1"
}, {
"t": 131739,
"s": "2"
}, {
"t": 131936,
"b": "1"
}, {
"t": 132080,
"s": "2"
}, {
"t": 132384,
"s": "2"
}, {
"t": 132784,
"s": "1"
}, {
"t": 132932,
"b": "2"
}, {
"t": 133093,
"s": "1"
}, {
"t": 133408,
"s": "2"
}, {
"t": 133739,
"s": "1"
}, {
"t": 134069,
"s": "1"
}, {
"t": 134092,
"b": "1"
}, {
"t": 134389,
"s": "1"
}, {
"t": 134709,
"s": "1"
}, {
"t": 135019,
"s": "1"
}, {
"t": 135124,
"b": "2"
}, {
"t": 135355,
"s": "1"
}, {
"t": 135733,
"s": "1"
}, {
"t": 136064,
"s": "2"
}, {
"t": 136160,
"b": "1"
}, {
"t": 136384,
"s": "3"
}, {
"t": 136693,
"s": "1"
}, {
"t": 137024,
"s": "2"
}, {
"t": 137128,
"b": "2"
}, {
"t": 137339,
"s": "2"
}, {
"t": 137776,
"s": "1"
}, {
"t": 138261,
"s": "1"
}, {
"t": 138741,
"s": "1"
}, {
"t": 139109,
"s": "1"
}, {
"t": 139435,
"s": "1"
}, {
"t": 139693,
"b": "3"
}, {
"t": 139744,
"s": "2"
}, {
"t": 140048,
"s": "2"
}, {
"t": 140208,
"b": "3"
}, {
"t": 140352,
"s": "3"
}, {
"t": 140656,
"s": "3"
}, {
"t": 140712,
"b": "3"
}, {
"t": 140987,
"s": "2"
}, {
"t": 141216,
"b": "3"
}, {
"t": 141291,
"s": "3"
}, {
"t": 141605,
"s": "3"
}, {
"t": 141700,
"b": "3"
}, {
"t": 141909,
"s": "3"
}, {
"t": 142164,
"b": "3"
}, {
"t": 142251,
"s": "1"
}, {
"t": 142555,
"s": "1"
}, {
"t": 142668,
"b": "3"
}, {
"t": 142859,
"s": "3"
}, {
"t": 143164,
"b": "3"
}, {
"t": 143184,
"s": "3"
}, {
"t": 143504,
"s": "3"
}, {
"t": 143668,
"b": "1"
}, {
"t": 143813,
"s": "2"
}, {
"t": 144123,
"s": "3"
}, {
"t": 144427,
"s": "2"
}, {
"t": 144484,
"b": "2"
}, {
"t": 144741,
"s": "3"
}, {
"t": 145061,
"s": "3"
}, {
"t": 145365,
"s": "3"
}, {
"t": 145412,
"b": "1"
}, {
"t": 145685,
"s": "3"
}, {
"t": 146000,
"s": "3"
}, {
"t": 146309,
"s": "2"
}, {
"t": 146340,
"b": "2"
}, {
"t": 146624,
"s": "3"
}, {
"t": 146928,
"s": "2"
}, {
"t": 147237,
"s": "2"
}, {
"t": 147547,
"s": "3"
}, {
"t": 147708,
"b": "3"
}, {
"t": 147851,
"s": "2"
}, {
"t": 148165,
"s": "3"
}, {
"t": 148304,
"b": "3"
}, {
"t": 148480,
"s": "3"
}, {
"t": 148784,
"s": "2"
}, {
"t": 148820,
"b": "3"
}, {
"t": 149104,
"s": "3"
}, {
"t": 149312,
"b": "3"
}, {
"t": 149413,
"s": "3"
}, {
"t": 149717,
"s": "3"
}, {
"t": 149908,
"b": "1"
}, {
"t": 150032,
"s": "2"
}, {
"t": 150336,
"s": "2"
}, {
"t": 150651,
"s": "2"
}, {
"t": 150804,
"b": "2"
}, {
"t": 150971,
"s": "3"
}, {
"t": 151285,
"s": "2"
}, {
"t": 151600,
"s": "3"
}, {
"t": 151784,
"b": "3"
}, {
"t": 151904,
"s": "3"
}, {
"t": 152208,
"s": "3"
}, {
"t": 152328,
"b": "3"
}, {
"t": 152517,
"s": "3"
}, {
"t": 152821,
"s": "3"
}, {
"t": 152832,
"b": "3"
}, {
"t": 153236,
"b": "3"
}, {
"t": 153248,
"s": "1"
}, {
"t": 153680,
"b": "1"
}, {
"t": 153728,
"s": "1"
}, {
"t": 154208,
"s": "1"
}, {
"t": 154518,
"b": "2"
}, {
"t": 154576,
"s": "1"
}]
}, {
"name": "Freedom",
"duration": 153600,
"songBeats": [{
"t": 0,
"s": "3"
}, {
"t": 315,
"s": "3"
}, {
"t": 619,
"s": "1"
}, {
"t": 928,
"s": "1"
}, {
"t": 1355,
"s": "1"
}, {
"t": 1739,
"s": "1"
}, {
"t": 2176,
"s": "1"
}, {
"t": 2539,
"s": "1"
}, {
"t": 2848,
"s": "1"
}, {
"t": 3173,
"s": "2"
}, {
"t": 3218,
"b": "1"
}, {
"t": 3488,
"s": "1"
}, {
"t": 3522,
"b": "1"
}, {
"t": 4037,
"s": "1"
}, {
"t": 4358,
"b": "2"
}, {
"t": 4480,
"s": "1"
}, {
"t": 4661,
"b": "2"
}, {
"t": 4837,
"s": "1"
}, {
"t": 5163,
"s": "1"
}, {
"t": 5378,
"b": "1"
}, {
"t": 5520,
"s": "2"
}, {
"t": 5682,
"b": "1"
}, {
"t": 5899,
"s": "1"
}, {
"t": 5980,
"b": "1"
}, {
"t": 6341,
"s": "1"
}, {
"t": 6557,
"b": "2"
}, {
"t": 6704,
"s": "1"
}, {
"t": 6862,
"b": "2"
}, {
"t": 7045,
"s": "2"
}, {
"t": 7166,
"b": "2"
}, {
"t": 7365,
"s": "1"
}, {
"t": 7670,
"b": "1"
}, {
"t": 7696,
"s": "1"
}, {
"t": 7974,
"b": "1"
}, {
"t": 8080,
"s": "1"
}, {
"t": 8271,
"b": "1"
}, {
"t": 8405,
"s": "1"
}, {
"t": 8709,
"s": "1"
}, {
"t": 8719,
"b": "2"
}, {
"t": 9023,
"b": "2"
}, {
"t": 9109,
"s": "1"
}, {
"t": 9322,
"b": "2"
}, {
"t": 9483,
"s": "1"
}, {
"t": 9819,
"s": "1"
}, {
"t": 9926,
"b": "0"
}, {
"t": 10128,
"s": "2"
}, {
"t": 10234,
"b": "0"
}, {
"t": 10437,
"s": "2"
}, {
"t": 10747,
"s": "3"
}, {
"t": 11037,
"b": "2"
}, {
"t": 11072,
"s": "2"
}, {
"t": 11341,
"b": "2"
}, {
"t": 11387,
"s": "2"
}, {
"t": 11691,
"s": "3"
}, {
"t": 11741,
"b": "1"
}, {
"t": 12005,
"s": "3"
}, {
"t": 12044,
"b": "1"
}, {
"t": 12278,
"b": "2"
}, {
"t": 12352,
"s": "2"
}, {
"t": 12578,
"b": "2"
}, {
"t": 12656,
"s": "1"
}, {
"t": 12842,
"b": "1"
}, {
"t": 12976,
"s": "2"
}, {
"t": 13155,
"b": "1"
}, {
"t": 13296,
"s": "1"
}, {
"t": 13438,
"b": "2"
}, {
"t": 13600,
"s": "3"
}, {
"t": 13744,
"b": "2"
}, {
"t": 13904,
"s": "3"
}, {
"t": 13982,
"b": "1"
}, {
"t": 14208,
"s": "2"
}, {
"t": 14289,
"b": "1"
}, {
"t": 14528,
"s": "1"
}, {
"t": 14569,
"b": "2"
}, {
"t": 14832,
"s": "2"
}, {
"t": 14875,
"b": "2"
}, {
"t": 15147,
"s": "3"
}, {
"t": 15233,
"b": "1"
}, {
"t": 15451,
"s": "2"
}, {
"t": 15544,
"b": "1"
}, {
"t": 15755,
"s": "3"
}, {
"t": 15789,
"b": "2"
}, {
"t": 16059,
"s": "3"
}, {
"t": 16099,
"b": "2"
}, {
"t": 16340,
"b": "1"
}, {
"t": 16363,
"s": "3"
}, {
"t": 16641,
"b": "1"
}, {
"t": 16667,
"s": "2"
}, {
"t": 16881,
"b": "2"
}, {
"t": 16981,
"s": "2"
}, {
"t": 17186,
"b": "2"
}, {
"t": 17296,
"s": "1"
}, {
"t": 17600,
"s": "1"
}, {
"t": 17921,
"b": "1"
}, {
"t": 17947,
"s": "2"
}, {
"t": 18193,
"b": "1"
}, {
"t": 18256,
"s": "2"
}, {
"t": 18447,
"b": "1"
}, {
"t": 18603,
"s": "3"
}, {
"t": 18697,
"b": "1"
}, {
"t": 18949,
"s": "2"
}, {
"t": 19007,
"b": "1"
}, {
"t": 19275,
"s": "2"
}, {
"t": 19589,
"s": "3"
}, {
"t": 19738,
"b": "2"
}, {
"t": 19893,
"s": "2"
}, {
"t": 20045,
"b": "2"
}, {
"t": 20213,
"s": "1"
}, {
"t": 20340,
"b": "2"
}, {
"t": 20768,
"s": "1"
}, {
"t": 21083,
"s": "1"
}, {
"t": 21321,
"b": "2"
}, {
"t": 21440,
"s": "1"
}, {
"t": 21623,
"b": "2"
}, {
"t": 21765,
"s": "1"
}, {
"t": 21934,
"b": "2"
}, {
"t": 22085,
"s": "1"
}, {
"t": 22223,
"b": "2"
}, {
"t": 22512,
"s": "1"
}, {
"t": 22827,
"s": "1"
}, {
"t": 23189,
"s": "1"
}, {
"t": 23453,
"b": "2"
}, {
"t": 23499,
"s": "1"
}, {
"t": 23767,
"b": "2"
}, {
"t": 23803,
"s": "1"
}, {
"t": 24057,
"b": "2"
}, {
"t": 24149,
"s": "1"
}, {
"t": 24480,
"s": "1"
}, {
"t": 24843,
"s": "1"
}, {
"t": 25269,
"s": "1"
}, {
"t": 25627,
"s": "1"
}, {
"t": 25968,
"s": "1"
}, {
"t": 26197,
"b": "1"
}, {
"t": 26293,
"s": "1"
}, {
"t": 26507,
"b": "1"
}, {
"t": 26597,
"s": "1"
}, {
"t": 26987,
"s": "1"
}, {
"t": 27085,
"b": "1"
}, {
"t": 27360,
"s": "1"
}, {
"t": 27387,
"b": "1"
}, {
"t": 27698,
"b": "1"
}, {
"t": 27776,
"s": "1"
}, {
"t": 28128,
"s": "3"
}, {
"t": 28473,
"b": "3"
}, {
"t": 28501,
"s": "2"
}, {
"t": 28848,
"s": "1"
}, {
"t": 29066,
"b": "3"
}, {
"t": 29152,
"s": "2"
}, {
"t": 29467,
"s": "2"
}, {
"t": 29658,
"b": "3"
}, {
"t": 29776,
"s": "1"
}, {
"t": 30085,
"s": "2"
}, {
"t": 30197,
"b": "3"
}, {
"t": 30400,
"s": "3"
}, {
"t": 30715,
"s": "3"
}, {
"t": 30770,
"b": "3"
}, {
"t": 31029,
"s": "1"
}, {
"t": 31071,
"b": "3"
}, {
"t": 31285,
"b": "2"
}, {
"t": 31392,
"s": "3"
}, {
"t": 31596,
"b": "2"
}, {
"t": 31717,
"s": "1"
}, {
"t": 32048,
"s": "1"
}, {
"t": 32062,
"b": "1"
}, {
"t": 32367,
"b": "1"
}, {
"t": 32368,
"s": "1"
}, {
"t": 32663,
"b": "1"
}, {
"t": 32741,
"s": "2"
}, {
"t": 33045,
"s": "3"
}, {
"t": 33129,
"b": "2"
}, {
"t": 33430,
"b": "2"
}, {
"t": 33467,
"s": "1"
}, {
"t": 33736,
"b": "2"
}, {
"t": 33771,
"s": "2"
}, {
"t": 34091,
"s": "3"
}, {
"t": 34190,
"b": "1"
}, {
"t": 34411,
"s": "2"
}, {
"t": 34491,
"b": "1"
}, {
"t": 34731,
"s": "1"
}, {
"t": 34798,
"b": "1"
}, {
"t": 35051,
"s": "3"
}, {
"t": 35218,
"b": "2"
}, {
"t": 35387,
"s": "3"
}, {
"t": 35520,
"b": "2"
}, {
"t": 35771,
"s": "1"
}, {
"t": 35829,
"b": "2"
}, {
"t": 36181,
"s": "1"
}, {
"t": 36417,
"b": "3"
}, {
"t": 36491,
"s": "3"
}, {
"t": 36731,
"b": "3"
}, {
"t": 36805,
"s": "2"
}, {
"t": 37021,
"b": "3"
}, {
"t": 37120,
"s": "2"
}, {
"t": 37337,
"b": "3"
}, {
"t": 37445,
"s": "2"
}, {
"t": 37755,
"s": "3"
}, {
"t": 38080,
"s": "1"
}, {
"t": 38194,
"b": "1"
}, {
"t": 38384,
"s": "2"
}, {
"t": 38504,
"b": "1"
}, {
"t": 38704,
"s": "2"
}, {
"t": 39019,
"s": "3"
}, {
"t": 39194,
"b": "2"
}, {
"t": 39344,
"s": "2"
}, {
"t": 39509,
"b": "2"
}, {
"t": 39653,
"s": "2"
}, {
"t": 39963,
"s": "3"
}, {
"t": 40170,
"b": "1"
}, {
"t": 40325,
"s": "1"
}, {
"t": 40471,
"b": "1"
}, {
"t": 40629,
"s": "2"
}, {
"t": 40949,
"s": "1"
}, {
"t": 41241,
"b": "2"
}, {
"t": 41253,
"s": "1"
}, {
"t": 41551,
"b": "2"
}, {
"t": 41579,
"s": "2"
}, {
"t": 41952,
"s": "1"
}, {
"t": 42261,
"s": "2"
}, {
"t": 42277,
"b": "1"
}, {
"t": 42571,
"s": "2"
}, {
"t": 42583,
"b": "1"
}, {
"t": 42875,
"s": "3"
}, {
"t": 42878,
"b": "1"
}, {
"t": 43269,
"s": "1"
}, {
"t": 43417,
"b": "2"
}, {
"t": 43595,
"s": "3"
}, {
"t": 43731,
"b": "2"
}, {
"t": 43915,
"s": "2"
}, {
"t": 44029,
"b": "2"
}, {
"t": 44224,
"s": "3"
}, {
"t": 44565,
"s": "2"
}, {
"t": 44880,
"s": "3"
}, {
"t": 45189,
"s": "2"
}, {
"t": 45454,
"b": "3"
}, {
"t": 45515,
"s": "2"
}, {
"t": 45840,
"s": "1"
}, {
"t": 45917,
"b": "3"
}, {
"t": 46223,
"b": "3"
}, {
"t": 46293,
"s": "1"
}, {
"t": 46429,
"b": "3"
}, {
"t": 46597,
"s": "3"
}, {
"t": 46735,
"b": "3"
}, {
"t": 46923,
"s": "3"
}, {
"t": 47197,
"b": "2"
}, {
"t": 47227,
"s": "3"
}, {
"t": 47509,
"b": "2"
}, {
"t": 47541,
"s": "2"
}, {
"t": 47803,
"b": "2"
}, {
"t": 47861,
"s": "3"
}, {
"t": 48165,
"s": "2"
}, {
"t": 48469,
"s": "2"
}, {
"t": 48773,
"s": "2"
}, {
"t": 49050,
"b": "1"
}, {
"t": 49083,
"s": "2"
}, {
"t": 49354,
"b": "1"
}, {
"t": 49387,
"s": "2"
}, {
"t": 49660,
"b": "1"
}, {
"t": 49701,
"s": "3"
}, {
"t": 50005,
"s": "3"
}, {
"t": 50315,
"s": "2"
}, {
"t": 50624,
"s": "3"
}, {
"t": 50997,
"s": "3"
}, {
"t": 51274,
"b": "2"
}, {
"t": 51301,
"s": "2"
}, {
"t": 51574,
"b": "2"
}, {
"t": 51611,
"s": "2"
}, {
"t": 51885,
"b": "2"
}, {
"t": 51957,
"s": "3"
}, {
"t": 52267,
"s": "2"
}, {
"t": 52576,
"s": "3"
}, {
"t": 52880,
"s": "3"
}, {
"t": 53205,
"s": "2"
}, {
"t": 53520,
"s": "3"
}, {
"t": 53692,
"b": "1"
}, {
"t": 53835,
"s": "3"
}, {
"t": 53995,
"b": "1"
}, {
"t": 54139,
"s": "3"
}, {
"t": 54293,
"b": "1"
}, {
"t": 54443,
"s": "3"
}, {
"t": 54600,
"b": "1"
}, {
"t": 54752,
"s": "2"
}, {
"t": 54893,
"b": "1"
}, {
"t": 55083,
"s": "1"
}, {
"t": 55424,
"s": "1"
}, {
"t": 56085,
"s": "1"
}, {
"t": 56400,
"s": "2"
}, {
"t": 56715,
"s": "3"
}, {
"t": 56858,
"b": "0"
}, {
"t": 57093,
"s": "1"
}, {
"t": 57361,
"b": "0"
}, {
"t": 57403,
"s": "1"
}, {
"t": 57728,
"s": "2"
}, {
"t": 57969,
"b": "0"
}, {
"t": 58032,
"s": "2"
}, {
"t": 58336,
"s": "2"
}, {
"t": 58489,
"b": "0"
}, {
"t": 58640,
"s": "3"
}, {
"t": 58944,
"s": "1"
}, {
"t": 58986,
"b": "2"
}, {
"t": 59264,
"s": "3"
}, {
"t": 59290,
"b": "2"
}, {
"t": 59579,
"s": "3"
}, {
"t": 59883,
"s": "3"
}, {
"t": 60113,
"b": "1"
}, {
"t": 60208,
"s": "2"
}, {
"t": 60416,
"b": "1"
}, {
"t": 60523,
"s": "2"
}, {
"t": 60837,
"s": "2"
}, {
"t": 61138,
"b": "2"
}, {
"t": 61141,
"s": "1"
}, {
"t": 61438,
"b": "2"
}, {
"t": 61451,
"s": "2"
}, {
"t": 61741,
"b": "2"
}, {
"t": 61765,
"s": "2"
}, {
"t": 62085,
"s": "3"
}, {
"t": 62366,
"b": "1"
}, {
"t": 62395,
"s": "2"
}, {
"t": 62675,
"b": "1"
}, {
"t": 62704,
"s": "3"
}, {
"t": 63024,
"s": "2"
}, {
"t": 63344,
"s": "2"
}, {
"t": 63453,
"b": "2"
}, {
"t": 63653,
"s": "2"
}, {
"t": 63756,
"b": "2"
}, {
"t": 63957,
"s": "2"
}, {
"t": 64141,
"b": "3"
}, {
"t": 64283,
"s": "2"
}, {
"t": 64608,
"s": "2"
}, {
"t": 64745,
"b": "3"
}, {
"t": 64912,
"s": "3"
}, {
"t": 65057,
"b": "3"
}, {
"t": 65253,
"s": "2"
}, {
"t": 65573,
"s": "2"
}, {
"t": 65833,
"b": "1"
}, {
"t": 65904,
"s": "2"
}, {
"t": 66138,
"b": "1"
}, {
"t": 66213,
"s": "2"
}, {
"t": 66533,
"s": "3"
}, {
"t": 66869,
"s": "1"
}, {
"t": 66994,
"b": "2"
}, {
"t": 67173,
"s": "2"
}, {
"t": 67298,
"b": "2"
}, {
"t": 67477,
"s": "2"
}, {
"t": 67787,
"s": "2"
}, {
"t": 68093,
"b": "1"
}, {
"t": 68117,
"s": "2"
}, {
"t": 68399,
"b": "1"
}, {
"t": 68437,
"s": "3"
}, {
"t": 68747,
"s": "2"
}, {
"t": 69067,
"s": "2"
}, {
"t": 69121,
"b": "2"
}, {
"t": 69371,
"s": "3"
}, {
"t": 69426,
"b": "2"
}, {
"t": 69675,
"s": "3"
}, {
"t": 70000,
"s": "3"
}, {
"t": 70138,
"b": "1"
}, {
"t": 70389,
"s": "1"
}, {
"t": 70439,
"b": "1"
}, {
"t": 70704,
"s": "2"
}, {
"t": 70746,
"b": "1"
}, {
"t": 71013,
"s": "3"
}, {
"t": 71342,
"b": "2"
}, {
"t": 71344,
"s": "2"
}, {
"t": 71653,
"b": "2"
}, {
"t": 71653,
"s": "1"
}, {
"t": 71963,
"s": "1"
}, {
"t": 72272,
"s": "3"
}, {
"t": 72592,
"s": "2"
}, {
"t": 72896,
"s": "1"
}, {
"t": 73205,
"s": "3"
}, {
"t": 73313,
"b": "3"
}, {
"t": 73563,
"s": "1"
}, {
"t": 73857,
"b": "3"
}, {
"t": 73877,
"s": "2"
}, {
"t": 74174,
"b": "3"
}, {
"t": 74181,
"s": "3"
}, {
"t": 74528,
"s": "3"
}, {
"t": 75019,
"s": "1"
}, {
"t": 75328,
"s": "1"
}, {
"t": 75786,
"b": "1"
}, {
"t": 76011,
"s": "1"
}, {
"t": 76088,
"b": "1"
}, {
"t": 76336,
"s": "1"
}, {
"t": 76396,
"b": "1"
}, {
"t": 76651,
"s": "1"
}, {
"t": 77008,
"s": "1"
}, {
"t": 77390,
"b": "2"
}, {
"t": 77429,
"s": "1"
}, {
"t": 77692,
"b": "2"
}, {
"t": 77872,
"s": "1"
}, {
"t": 77998,
"b": "2"
}, {
"t": 78293,
"s": "1"
}, {
"t": 78624,
"s": "1"
}, {
"t": 78933,
"s": "1"
}, {
"t": 78977,
"b": "1"
}, {
"t": 79237,
"s": "1"
}, {
"t": 79281,
"b": "1"
}, {
"t": 79590,
"b": "1"
}, {
"t": 79616,
"s": "1"
}, {
"t": 80064,
"s": "1"
}, {
"t": 80459,
"s": "1"
}, {
"t": 80665,
"b": "2"
}, {
"t": 80779,
"s": "1"
}, {
"t": 80975,
"b": "2"
}, {
"t": 81125,
"s": "1"
}, {
"t": 81429,
"s": "1"
}, {
"t": 81733,
"s": "3"
}, {
"t": 82069,
"s": "1"
}, {
"t": 82373,
"s": "2"
}, {
"t": 82473,
"b": "1"
}, {
"t": 82715,
"s": "2"
}, {
"t": 82782,
"b": "1"
}, {
"t": 83051,
"s": "1"
}, {
"t": 83190,
"b": "2"
}, {
"t": 83371,
"s": "3"
}, {
"t": 83499,
"b": "2"
}, {
"t": 83723,
"s": "1"
}, {
"t": 83937,
"b": "3"
}, {
"t": 84032,
"s": "3"
}, {
"t": 84357,
"s": "3"
}, {
"t": 84667,
"s": "3"
}, {
"t": 84971,
"s": "3"
}, {
"t": 85038,
"b": "3"
}, {
"t": 85291,
"s": "3"
}, {
"t": 85341,
"b": "3"
}, {
"t": 85605,
"s": "2"
}, {
"t": 85915,
"s": "2"
}, {
"t": 85953,
"b": "1"
}, {
"t": 86229,
"s": "3"
}, {
"t": 86263,
"b": "1"
}, {
"t": 86539,
"s": "3"
}, {
"t": 86864,
"s": "3"
}, {
"t": 87086,
"b": "2"
}, {
"t": 87179,
"s": "2"
}, {
"t": 87391,
"b": "2"
}, {
"t": 87488,
"s": "2"
}, {
"t": 87797,
"s": "2"
}, {
"t": 88107,
"s": "2"
}, {
"t": 88123,
"b": "1"
}, {
"t": 88411,
"s": "3"
}, {
"t": 88424,
"b": "1"
}, {
"t": 88731,
"s": "2"
}, {
"t": 89072,
"s": "2"
}, {
"t": 89153,
"b": "2"
}, {
"t": 89387,
"s": "2"
}, {
"t": 89457,
"b": "2"
}, {
"t": 89696,
"s": "3"
}, {
"t": 89766,
"b": "2"
}, {
"t": 90005,
"s": "3"
}, {
"t": 90221,
"b": "1"
}, {
"t": 90309,
"s": "3"
}, {
"t": 90524,
"b": "1"
}, {
"t": 90619,
"s": "3"
}, {
"t": 90933,
"s": "2"
}, {
"t": 91150,
"b": "3"
}, {
"t": 91253,
"s": "2"
}, {
"t": 91451,
"b": "3"
}, {
"t": 91557,
"s": "2"
}, {
"t": 91826,
"b": "3"
}, {
"t": 91931,
"s": "3"
}, {
"t": 92136,
"b": "3"
}, {
"t": 92363,
"s": "2"
}, {
"t": 92741,
"s": "1"
}, {
"t": 93045,
"s": "3"
}, {
"t": 93077,
"b": "1"
}, {
"t": 93386,
"b": "1"
}, {
"t": 93472,
"s": "1"
}, {
"t": 93797,
"s": "3"
}, {
"t": 94112,
"s": "3"
}, {
"t": 94166,
"b": "2"
}, {
"t": 94421,
"s": "3"
}, {
"t": 94480,
"b": "2"
}, {
"t": 94752,
"s": "2"
}, {
"t": 95056,
"s": "2"
}, {
"t": 95386,
"b": "1"
}, {
"t": 95392,
"s": "3"
}, {
"t": 95686,
"b": "1"
}, {
"t": 95760,
"s": "1"
}, {
"t": 96069,
"s": "3"
}, {
"t": 96395,
"s": "2"
}, {
"t": 96617,
"b": "2"
}, {
"t": 96715,
"s": "2"
}, {
"t": 96926,
"b": "2"
}, {
"t": 97035,
"s": "2"
}, {
"t": 97344,
"s": "2"
}, {
"t": 97648,
"s": "2"
}, {
"t": 97798,
"b": "1"
}, {
"t": 98048,
"s": "1"
}, {
"t": 98103,
"b": "1"
}, {
"t": 98352,
"s": "2"
}, {
"t": 98656,
"s": "1"
}, {
"t": 98938,
"b": "2"
}, {
"t": 98965,
"s": "2"
}, {
"t": 99246,
"b": "2"
}, {
"t": 99269,
"s": "2"
}, {
"t": 99544,
"b": "2"
}, {
"t": 99579,
"s": "3"
}, {
"t": 99893,
"s": "2"
}, {
"t": 100077,
"b": "1"
}, {
"t": 100208,
"s": "3"
}, {
"t": 100382,
"b": "1"
}, {
"t": 100512,
"s": "3"
}, {
"t": 100680,
"b": "1"
}, {
"t": 100821,
"s": "3"
}, {
"t": 101131,
"s": "3"
}, {
"t": 101145,
"b": "2"
}, {
"t": 101445,
"s": "3"
}, {
"t": 101447,
"b": "2"
}, {
"t": 101747,
"b": "2"
}, {
"t": 101749,
"s": "3"
}, {
"t": 102117,
"s": "2"
}, {
"t": 102325,
"b": "3"
}, {
"t": 102421,
"s": "3"
}, {
"t": 102628,
"b": "3"
}, {
"t": 102731,
"s": "3"
}, {
"t": 103045,
"s": "2"
}, {
"t": 103365,
"s": "3"
}, {
"t": 103481,
"b": "3"
}, {
"t": 103669,
"s": "1"
}, {
"t": 103782,
"b": "3"
}, {
"t": 103973,
"s": "2"
}, {
"t": 104309,
"s": "2"
}, {
"t": 104635,
"s": "2"
}, {
"t": 104854,
"b": "3"
}, {
"t": 104960,
"s": "1"
}, {
"t": 105166,
"b": "3"
}, {
"t": 105285,
"s": "1"
}, {
"t": 105589,
"s": "2"
}, {
"t": 105893,
"s": "1"
}, {
"t": 106094,
"b": "3"
}, {
"t": 106240,
"s": "1"
}, {
"t": 106401,
"b": "3"
}, {
"t": 106587,
"s": "1"
}, {
"t": 106891,
"s": "3"
}, {
"t": 107200,
"s": "2"
}, {
"t": 107266,
"b": "3"
}, {
"t": 107504,
"s": "3"
}, {
"t": 107569,
"b": "3"
}, {
"t": 107829,
"s": "2"
}, {
"t": 108144,
"s": "3"
}, {
"t": 108453,
"s": "2"
}, {
"t": 108506,
"b": "3"
}, {
"t": 108809,
"b": "3"
}, {
"t": 108848,
"s": "2"
}, {
"t": 109157,
"s": "1"
}, {
"t": 109493,
"s": "1"
}, {
"t": 109808,
"s": "3"
}, {
"t": 110123,
"s": "1"
}, {
"t": 110432,
"s": "1"
}, {
"t": 110741,
"s": "1"
}, {
"t": 110938,
"b": "1"
}, {
"t": 111056,
"s": "1"
}, {
"t": 111241,
"b": "1"
}, {
"t": 111403,
"s": "1"
}, {
"t": 111776,
"s": "1"
}, {
"t": 112128,
"s": "3"
}, {
"t": 112218,
"b": "2"
}, {
"t": 112432,
"s": "3"
}, {
"t": 112521,
"b": "2"
}, {
"t": 112757,
"s": "2"
}, {
"t": 112823,
"b": "2"
}, {
"t": 113061,
"s": "3"
}, {
"t": 113365,
"s": "3"
}, {
"t": 113621,
"b": "1"
}, {
"t": 113675,
"s": "2"
}, {
"t": 113930,
"b": "1"
}, {
"t": 114005,
"s": "3"
}, {
"t": 114309,
"s": "2"
}, {
"t": 114613,
"s": "3"
}, {
"t": 114881,
"b": "2"
}, {
"t": 114917,
"s": "2"
}, {
"t": 115191,
"b": "2"
}, {
"t": 115227,
"s": "3"
}, {
"t": 115490,
"b": "2"
}, {
"t": 115536,
"s": "3"
}, {
"t": 115845,
"s": "3"
}, {
"t": 115989,
"b": "1"
}, {
"t": 116187,
"s": "2"
}, {
"t": 116291,
"b": "1"
}, {
"t": 116539,
"s": "2"
}, {
"t": 116596,
"b": "1"
}, {
"t": 116848,
"s": "3"
}, {
"t": 117138,
"b": "2"
}, {
"t": 117157,
"s": "3"
}, {
"t": 117447,
"b": "2"
}, {
"t": 117477,
"s": "2"
}, {
"t": 117740,
"b": "2"
}, {
"t": 117781,
"s": "3"
}, {
"t": 118091,
"s": "2"
}, {
"t": 118416,
"s": "2"
}, {
"t": 118731,
"s": "3"
}, {
"t": 118830,
"b": "3"
}, {
"t": 119045,
"s": "3"
}, {
"t": 119132,
"b": "3"
}, {
"t": 119365,
"s": "3"
}, {
"t": 119449,
"b": "3"
}, {
"t": 119739,
"s": "1"
}, {
"t": 119756,
"b": "3"
}, {
"t": 120080,
"s": "1"
}, {
"t": 120432,
"s": "1"
}, {
"t": 120736,
"s": "3"
}, {
"t": 120885,
"b": "1"
}, {
"t": 121040,
"s": "2"
}, {
"t": 121192,
"b": "1"
}, {
"t": 121392,
"s": "3"
}, {
"t": 121707,
"s": "2"
}, {
"t": 122011,
"s": "3"
}, {
"t": 122073,
"b": "2"
}, {
"t": 122331,
"s": "2"
}, {
"t": 122374,
"b": "2"
}, {
"t": 122661,
"s": "2"
}, {
"t": 122997,
"s": "3"
}, {
"t": 123157,
"b": "1"
}, {
"t": 123301,
"s": "3"
}, {
"t": 123460,
"b": "1"
}, {
"t": 123605,
"s": "3"
}, {
"t": 123941,
"s": "3"
}, {
"t": 124256,
"s": "3"
}, {
"t": 124402,
"b": "2"
}, {
"t": 124576,
"s": "2"
}, {
"t": 124708,
"b": "2"
}, {
"t": 124880,
"s": "2"
}, {
"t": 125200,
"s": "3"
}, {
"t": 125525,
"s": "3"
}, {
"t": 125533,
"b": "1"
}, {
"t": 125834,
"b": "1"
}, {
"t": 125840,
"s": "2"
}, {
"t": 126155,
"s": "3"
}, {
"t": 126469,
"s": "2"
}, {
"t": 126779,
"s": "2"
}, {
"t": 126806,
"b": "2"
}, {
"t": 127104,
"s": "3"
}, {
"t": 127113,
"b": "2"
}, {
"t": 127413,
"s": "2"
}, {
"t": 127723,
"s": "3"
}, {
"t": 128027,
"s": "3"
}, {
"t": 128186,
"b": "3"
}, {
"t": 128341,
"s": "3"
}, {
"t": 128491,
"b": "3"
}, {
"t": 128651,
"s": "3"
}, {
"t": 128953,
"b": "3"
}, {
"t": 128960,
"s": "3"
}, {
"t": 129255,
"b": "3"
}, {
"t": 129280,
"s": "3"
}, {
"t": 129595,
"s": "3"
}, {
"t": 129909,
"s": "3"
}, {
"t": 129941,
"b": "1"
}, {
"t": 130229,
"s": "3"
}, {
"t": 130242,
"b": "1"
}, {
"t": 130533,
"s": "3"
}, {
"t": 130843,
"s": "2"
}, {
"t": 131093,
"b": "2"
}, {
"t": 131211,
"s": "1"
}, {
"t": 131395,
"b": "2"
}, {
"t": 131531,
"s": "2"
}, {
"t": 131702,
"b": "2"
}, {
"t": 131845,
"s": "1"
}, {
"t": 132155,
"s": "3"
}, {
"t": 132305,
"b": "1"
}, {
"t": 132480,
"s": "2"
}, {
"t": 132609,
"b": "1"
}, {
"t": 132784,
"s": "3"
}, {
"t": 133099,
"s": "3"
}, {
"t": 133401,
"b": "2"
}, {
"t": 133413,
"s": "3"
}, {
"t": 133706,
"b": "2"
}, {
"t": 133744,
"s": "3"
}, {
"t": 134002,
"b": "2"
}, {
"t": 134048,
"s": "2"
}, {
"t": 134352,
"s": "3"
}, {
"t": 134550,
"b": "1"
}, {
"t": 134672,
"s": "3"
}, {
"t": 134856,
"b": "1"
}, {
"t": 134987,
"s": "2"
}, {
"t": 135333,
"s": "3"
}, {
"t": 135593,
"b": "2"
}, {
"t": 135637,
"s": "3"
}, {
"t": 135896,
"b": "2"
}, {
"t": 135947,
"s": "3"
}, {
"t": 136206,
"b": "2"
}, {
"t": 136261,
"s": "3"
}, {
"t": 136571,
"s": "3"
}, {
"t": 136885,
"s": "3"
}, {
"t": 137195,
"s": "3"
}, {
"t": 137238,
"b": "3"
}, {
"t": 137504,
"s": "3"
}, {
"t": 137538,
"b": "3"
}, {
"t": 137819,
"s": "3"
}, {
"t": 137881,
"b": "3"
}, {
"t": 138123,
"s": "3"
}, {
"t": 138183,
"b": "3"
}, {
"t": 138432,
"s": "3"
}, {
"t": 138497,
"b": "3"
}, {
"t": 138802,
"b": "3"
}, {
"t": 140544,
"s": "2"
}, {
"t": 140853,
"s": "2"
}, {
"t": 141045,
"b": "1"
}, {
"t": 141163,
"s": "3"
}, {
"t": 141351,
"b": "1"
}, {
"t": 141483,
"s": "1"
}, {
"t": 141845,
"s": "1"
}, {
"t": 142160,
"s": "1"
}, {
"t": 142512,
"s": "1"
}, {
"t": 142816,
"s": "2"
}, {
"t": 143062,
"b": "2"
}, {
"t": 143141,
"s": "1"
}, {
"t": 143367,
"b": "2"
}, {
"t": 143488,
"s": "1"
}, {
"t": 143888,
"s": "1"
}, {
"t": 144325,
"s": "1"
}, {
"t": 144529,
"b": "1"
}, {
"t": 144645,
"s": "1"
}, {
"t": 144833,
"b": "1"
}, {
"t": 144971,
"s": "1"
}, {
"t": 145280,
"s": "2"
}, {
"t": 145595,
"s": "1"
}, {
"t": 145899,
"s": "1"
}, {
"t": 146029,
"b": "2"
}, {
"t": 146203,
"s": "2"
}, {
"t": 146339,
"b": "2"
}, {
"t": 146608,
"s": "1"
}, {
"t": 146933,
"s": "1"
}, {
"t": 147264,
"s": "1"
}, {
"t": 147346,
"b": "1"
}, {
"t": 147568,
"s": "1"
}, {
"t": 147652,
"b": "1"
}, {
"t": 147883,
"s": "1"
}, {
"t": 147947,
"b": "1"
}, {
"t": 148192,
"s": "1"
}, {
"t": 148501,
"s": "1"
}, {
"t": 148805,
"s": "1"
}, {
"t": 149109,
"s": "1"
}, {
"t": 149419,
"s": "1"
}, {
"t": 149728,
"s": "1"
}, {
"t": 149938,
"b": "3"
}, {
"t": 150160,
"s": "1"
}, {
"t": 150240,
"b": "3"
}, {
"t": 150464,
"s": "2"
}, {
"t": 150539,
"b": "3"
}, {
"t": 150849,
"b": "3"
}]
}, {
"name": "Stranger in the Storm",
"duration": 170760,
"songBeats": [{
"t": 165,
"s": "1"
}, {
"t": 469,
"s": "1"
}, {
"t": 582,
"b": "0"
}, {
"t": 869,
"s": "1"
}, {
"t": 1221,
"s": "1"
}, {
"t": 1286,
"b": "0"
}, {
"t": 1541,
"s": "1"
}, {
"t": 1941,
"s": "1"
}, {
"t": 2053,
"b": "0"
}, {
"t": 2288,
"s": "1"
}, {
"t": 2635,
"s": "1"
}, {
"t": 2769,
"b": "0"
}, {
"t": 2987,
"s": "2"
}, {
"t": 3093,
"b": "0"
}, {
"t": 3339,
"s": "2"
}, {
"t": 3465,
"b": "0"
}, {
"t": 3691,
"s": "1"
}, {
"t": 4043,
"s": "1"
}, {
"t": 4194,
"b": "0"
}, {
"t": 4395,
"s": "1"
}, {
"t": 4752,
"s": "1"
}, {
"t": 4929,
"b": "0"
}, {
"t": 5104,
"s": "2"
}, {
"t": 5501,
"b": "0"
}, {
"t": 5627,
"s": "1"
}, {
"t": 5931,
"s": "2"
}, {
"t": 6141,
"b": "1"
}, {
"t": 6240,
"s": "1"
}, {
"t": 6544,
"s": "2"
}, {
"t": 6845,
"b": "2"
}, {
"t": 6869,
"s": "1"
}, {
"t": 7221,
"s": "1"
}, {
"t": 7462,
"b": "1"
}, {
"t": 7573,
"s": "1"
}, {
"t": 7931,
"s": "1"
}, {
"t": 8149,
"b": "2"
}, {
"t": 8272,
"s": "1"
}, {
"t": 8456,
"b": "2"
}, {
"t": 8635,
"s": "1"
}, {
"t": 8944,
"s": "1"
}, {
"t": 8954,
"b": "1"
}, {
"t": 9253,
"s": "3"
}, {
"t": 9637,
"s": "1"
}, {
"t": 9662,
"b": "2"
}, {
"t": 9941,
"s": "3"
}, {
"t": 10245,
"s": "3"
}, {
"t": 10285,
"b": "1"
}, {
"t": 10555,
"s": "3"
}, {
"t": 10875,
"s": "3"
}, {
"t": 10921,
"b": "2"
}, {
"t": 11179,
"s": "2"
}, {
"t": 11235,
"b": "2"
}, {
"t": 11488,
"s": "1"
}, {
"t": 11577,
"b": "1"
}, {
"t": 11803,
"s": "1"
}, {
"t": 12107,
"s": "3"
}, {
"t": 12373,
"b": "2"
}, {
"t": 12416,
"s": "2"
}, {
"t": 12720,
"s": "3"
}, {
"t": 13024,
"s": "1"
}, {
"t": 13098,
"b": "1"
}, {
"t": 13344,
"s": "3"
}, {
"t": 13398,
"b": "1"
}, {
"t": 13648,
"s": "2"
}, {
"t": 13737,
"b": "2"
}, {
"t": 13952,
"s": "2"
}, {
"t": 14050,
"b": "2"
}, {
"t": 14277,
"s": "1"
}, {
"t": 14521,
"b": "1"
}, {
"t": 14635,
"s": "1"
}, {
"t": 14837,
"b": "1"
}, {
"t": 14987,
"s": "1"
}, {
"t": 15269,
"b": "2"
}, {
"t": 15296,
"s": "1"
}, {
"t": 15593,
"b": "2"
}, {
"t": 15605,
"s": "3"
}, {
"t": 15925,
"b": "1"
}, {
"t": 16112,
"s": "1"
}, {
"t": 16248,
"b": "1"
}, {
"t": 16741,
"s": "1"
}, {
"t": 16945,
"b": "3"
}, {
"t": 17045,
"s": "3"
}, {
"t": 17254,
"b": "3"
}, {
"t": 17413,
"s": "1"
}, {
"t": 17682,
"b": "3"
}, {
"t": 17723,
"s": "3"
}, {
"t": 17996,
"b": "3"
}, {
"t": 18165,
"s": "1"
}, {
"t": 18422,
"b": "3"
}, {
"t": 18507,
"s": "1"
}, {
"t": 18734,
"b": "3"
}, {
"t": 18827,
"s": "1"
}, {
"t": 19157,
"s": "3"
}, {
"t": 19213,
"b": "3"
}, {
"t": 19483,
"s": "2"
}, {
"t": 19515,
"b": "3"
}, {
"t": 19787,
"s": "3"
}, {
"t": 20101,
"s": "3"
}, {
"t": 20414,
"b": "1"
}, {
"t": 20416,
"s": "3"
}, {
"t": 20720,
"s": "2"
}, {
"t": 21035,
"s": "3"
}, {
"t": 21101,
"b": "2"
}, {
"t": 21344,
"s": "2"
}, {
"t": 21412,
"b": "2"
}, {
"t": 21691,
"s": "1"
}, {
"t": 21765,
"b": "1"
}, {
"t": 22032,
"s": "1"
}, {
"t": 22357,
"s": "1"
}, {
"t": 22402,
"b": "2"
}, {
"t": 22683,
"s": "3"
}, {
"t": 22702,
"b": "2"
}, {
"t": 23061,
"s": "1"
}, {
"t": 23321,
"b": "3"
}, {
"t": 23371,
"s": "3"
}, {
"t": 23675,
"s": "3"
}, {
"t": 23984,
"s": "2"
}, {
"t": 24065,
"b": "3"
}, {
"t": 24288,
"s": "2"
}, {
"t": 24366,
"b": "3"
}, {
"t": 24592,
"s": "3"
}, {
"t": 24814,
"b": "3"
}, {
"t": 24896,
"s": "2"
}, {
"t": 25123,
"b": "3"
}, {
"t": 25205,
"s": "1"
}, {
"t": 25509,
"s": "3"
}, {
"t": 25589,
"b": "3"
}, {
"t": 25856,
"s": "1"
}, {
"t": 25899,
"b": "3"
}, {
"t": 26160,
"s": "3"
}, {
"t": 26265,
"b": "1"
}, {
"t": 26480,
"s": "3"
}, {
"t": 26789,
"s": "3"
}, {
"t": 26901,
"b": "2"
}, {
"t": 27200,
"s": "1"
}, {
"t": 27207,
"b": "2"
}, {
"t": 27585,
"b": "1"
}, {
"t": 27696,
"s": "1"
}, {
"t": 28005,
"s": "1"
}, {
"t": 28285,
"b": "2"
}, {
"t": 28331,
"s": "3"
}, {
"t": 28661,
"s": "2"
}, {
"t": 28987,
"s": "3"
}, {
"t": 29001,
"b": "1"
}, {
"t": 29307,
"s": "3"
}, {
"t": 29606,
"b": "2"
}, {
"t": 29632,
"s": "3"
}, {
"t": 29908,
"b": "2"
}, {
"t": 29947,
"s": "2"
}, {
"t": 30251,
"s": "2"
}, {
"t": 30310,
"b": "1"
}, {
"t": 30555,
"s": "2"
}, {
"t": 30621,
"b": "1"
}, {
"t": 30864,
"s": "1"
}, {
"t": 31057,
"b": "2"
}, {
"t": 31195,
"s": "3"
}, {
"t": 31366,
"b": "2"
}, {
"t": 31504,
"s": "2"
}, {
"t": 31808,
"s": "3"
}, {
"t": 31825,
"b": "1"
}, {
"t": 32112,
"s": "3"
}, {
"t": 32141,
"b": "1"
}, {
"t": 32416,
"s": "3"
}, {
"t": 32541,
"b": "2"
}, {
"t": 32720,
"s": "3"
}, {
"t": 32850,
"b": "2"
}, {
"t": 33035,
"s": "3"
}, {
"t": 33197,
"b": "1"
}, {
"t": 33339,
"s": "2"
}, {
"t": 33499,
"b": "1"
}, {
"t": 33653,
"s": "2"
}, {
"t": 33941,
"b": "2"
}, {
"t": 33957,
"s": "3"
}, {
"t": 34248,
"b": "2"
}, {
"t": 34261,
"s": "3"
}, {
"t": 34537,
"b": "1"
}, {
"t": 34571,
"s": "2"
}, {
"t": 34850,
"b": "1"
}, {
"t": 34891,
"s": "1"
}, {
"t": 35195,
"s": "2"
}, {
"t": 35201,
"b": "2"
}, {
"t": 35504,
"s": "2"
}, {
"t": 35525,
"b": "2"
}, {
"t": 35829,
"s": "2"
}, {
"t": 35881,
"b": "1"
}, {
"t": 36155,
"s": "2"
}, {
"t": 36194,
"b": "1"
}, {
"t": 36469,
"s": "1"
}, {
"t": 36526,
"b": "2"
}, {
"t": 36773,
"s": "3"
}, {
"t": 36839,
"b": "2"
}, {
"t": 37077,
"s": "3"
}, {
"t": 37282,
"b": "1"
}, {
"t": 37387,
"s": "3"
}, {
"t": 37701,
"s": "3"
}, {
"t": 37905,
"b": "2"
}, {
"t": 38011,
"s": "3"
}, {
"t": 38207,
"b": "2"
}, {
"t": 38336,
"s": "3"
}, {
"t": 38640,
"s": "3"
}, {
"t": 38645,
"b": "1"
}, {
"t": 38949,
"b": "1"
}, {
"t": 38981,
"s": "1"
}, {
"t": 39296,
"s": "2"
}, {
"t": 39301,
"b": "2"
}, {
"t": 39602,
"b": "2"
}, {
"t": 39605,
"s": "3"
}, {
"t": 39909,
"s": "3"
}, {
"t": 40157,
"b": "3"
}, {
"t": 40213,
"s": "2"
}, {
"t": 40528,
"s": "2"
}, {
"t": 40848,
"s": "2"
}, {
"t": 40965,
"b": "3"
}, {
"t": 41163,
"s": "2"
}, {
"t": 41477,
"s": "2"
}, {
"t": 41721,
"b": "3"
}, {
"t": 41781,
"s": "2"
}, {
"t": 42031,
"b": "3"
}, {
"t": 42165,
"s": "2"
}, {
"t": 42466,
"b": "3"
}, {
"t": 42501,
"s": "2"
}, {
"t": 42790,
"b": "3"
}, {
"t": 42821,
"s": "2"
}, {
"t": 43125,
"s": "3"
}, {
"t": 43440,
"s": "3"
}, {
"t": 43744,
"s": "3"
}, {
"t": 43749,
"b": "1"
}, {
"t": 44057,
"b": "1"
}, {
"t": 44059,
"s": "2"
}, {
"t": 44363,
"s": "3"
}, {
"t": 44533,
"b": "2"
}, {
"t": 44683,
"s": "2"
}, {
"t": 44987,
"s": "3"
}, {
"t": 45149,
"b": "1"
}, {
"t": 45328,
"s": "3"
}, {
"t": 45643,
"s": "2"
}, {
"t": 45933,
"b": "2"
}, {
"t": 45957,
"s": "3"
}, {
"t": 46247,
"b": "2"
}, {
"t": 46267,
"s": "3"
}, {
"t": 46576,
"s": "3"
}, {
"t": 46673,
"b": "1"
}, {
"t": 46885,
"s": "3"
}, {
"t": 47221,
"s": "3"
}, {
"t": 47317,
"b": "2"
}, {
"t": 47525,
"s": "3"
}, {
"t": 47631,
"b": "2"
}, {
"t": 47829,
"s": "3"
}, {
"t": 47973,
"b": "1"
}, {
"t": 48267,
"s": "1"
}, {
"t": 48683,
"s": "1"
}, {
"t": 48987,
"s": "1"
}, {
"t": 49419,
"s": "1"
}, {
"t": 49781,
"s": "1"
}, {
"t": 49917,
"b": "3"
}, {
"t": 50107,
"s": "1"
}, {
"t": 50621,
"b": "3"
}, {
"t": 50811,
"s": "2"
}, {
"t": 51120,
"s": "1"
}, {
"t": 51424,
"s": "2"
}, {
"t": 51517,
"b": "1"
}, {
"t": 51744,
"s": "1"
}, {
"t": 52053,
"s": "1"
}, {
"t": 52313,
"b": "2"
}, {
"t": 52400,
"s": "1"
}, {
"t": 52630,
"b": "2"
}, {
"t": 52752,
"s": "1"
}, {
"t": 53067,
"s": "1"
}, {
"t": 53392,
"s": "1"
}, {
"t": 53401,
"b": "1"
}, {
"t": 53713,
"b": "1"
}, {
"t": 53797,
"s": "1"
}, {
"t": 54165,
"s": "2"
}, {
"t": 54382,
"b": "2"
}, {
"t": 54528,
"s": "1"
}, {
"t": 54693,
"b": "2"
}, {
"t": 54869,
"s": "1"
}, {
"t": 55184,
"s": "1"
}, {
"t": 55390,
"b": "1"
}, {
"t": 55573,
"s": "1"
}, {
"t": 55693,
"b": "1"
}, {
"t": 55931,
"s": "1"
}, {
"t": 56277,
"b": "2"
}, {
"t": 56283,
"s": "1"
}, {
"t": 56581,
"b": "2"
}, {
"t": 56635,
"s": "1"
}, {
"t": 56981,
"s": "1"
}, {
"t": 57186,
"b": "1"
}, {
"t": 57344,
"s": "1"
}, {
"t": 57509,
"b": "1"
}, {
"t": 57669,
"s": "1"
}, {
"t": 58053,
"s": "1"
}, {
"t": 58186,
"b": "2"
}, {
"t": 58416,
"s": "1"
}, {
"t": 58488,
"b": "2"
}, {
"t": 58768,
"s": "1"
}, {
"t": 59070,
"b": "1"
}, {
"t": 59104,
"s": "1"
}, {
"t": 59374,
"b": "1"
}, {
"t": 59456,
"s": "1"
}, {
"t": 59808,
"s": "1"
}, {
"t": 59990,
"b": "2"
}, {
"t": 60160,
"s": "1"
}, {
"t": 60299,
"b": "2"
}, {
"t": 60512,
"s": "1"
}, {
"t": 60826,
"b": "1"
}, {
"t": 60869,
"s": "2"
}, {
"t": 61135,
"b": "1"
}, {
"t": 61211,
"s": "1"
}, {
"t": 61579,
"s": "1"
}, {
"t": 61646,
"b": "2"
}, {
"t": 61925,
"s": "1"
}, {
"t": 61975,
"b": "2"
}, {
"t": 62283,
"s": "1"
}, {
"t": 62592,
"s": "2"
}, {
"t": 62774,
"b": "3"
}, {
"t": 62912,
"s": "3"
}, {
"t": 63307,
"s": "1"
}, {
"t": 63501,
"b": "3"
}, {
"t": 63627,
"s": "3"
}, {
"t": 63984,
"s": "1"
}, {
"t": 64277,
"b": "3"
}, {
"t": 64288,
"s": "3"
}, {
"t": 64584,
"b": "3"
}, {
"t": 64592,
"s": "3"
}, {
"t": 64901,
"s": "1"
}, {
"t": 65173,
"b": "2"
}, {
"t": 65216,
"s": "3"
}, {
"t": 65489,
"b": "2"
}, {
"t": 65525,
"s": "3"
}, {
"t": 65835,
"s": "3"
}, {
"t": 66053,
"b": "2"
}, {
"t": 66139,
"s": "3"
}, {
"t": 66448,
"s": "3"
}, {
"t": 66757,
"s": "3"
}, {
"t": 66769,
"b": "2"
}, {
"t": 67067,
"s": "3"
}, {
"t": 67089,
"b": "2"
}, {
"t": 67371,
"s": "3"
}, {
"t": 67513,
"b": "2"
}, {
"t": 67675,
"s": "3"
}, {
"t": 67827,
"b": "2"
}, {
"t": 67984,
"s": "3"
}, {
"t": 68150,
"b": "1"
}, {
"t": 68293,
"s": "3"
}, {
"t": 68452,
"b": "1"
}, {
"t": 68624,
"s": "2"
}, {
"t": 68939,
"s": "2"
}, {
"t": 68949,
"b": "1"
}, {
"t": 69243,
"s": "3"
}, {
"t": 69557,
"s": "1"
}, {
"t": 69693,
"b": "1"
}, {
"t": 69867,
"s": "1"
}, {
"t": 70219,
"s": "1"
}, {
"t": 70571,
"s": "1"
}, {
"t": 70701,
"b": "0"
}, {
"t": 70885,
"s": "2"
}, {
"t": 71195,
"s": "2"
}, {
"t": 71410,
"b": "0"
}, {
"t": 71499,
"s": "1"
}, {
"t": 71813,
"s": "2"
}, {
"t": 72094,
"b": "0"
}, {
"t": 72149,
"s": "1"
}, {
"t": 72397,
"b": "0"
}, {
"t": 72464,
"s": "1"
}, {
"t": 72773,
"s": "3"
}, {
"t": 72809,
"b": "0"
}, {
"t": 73083,
"s": "3"
}, {
"t": 73397,
"s": "2"
}, {
"t": 73442,
"b": "0"
}, {
"t": 73707,
"s": "3"
}, {
"t": 74016,
"s": "3"
}, {
"t": 74093,
"b": "1"
}, {
"t": 74325,
"s": "3"
}, {
"t": 74635,
"s": "3"
}, {
"t": 74805,
"b": "2"
}, {
"t": 74981,
"s": "2"
}, {
"t": 75291,
"s": "3"
}, {
"t": 75542,
"b": "1"
}, {
"t": 75605,
"s": "3"
}, {
"t": 75915,
"s": "3"
}, {
"t": 76245,
"s": "3"
}, {
"t": 76321,
"b": "2"
}, {
"t": 76549,
"s": "2"
}, {
"t": 76638,
"b": "2"
}, {
"t": 76864,
"s": "2"
}, {
"t": 77037,
"b": "1"
}, {
"t": 77179,
"s": "2"
}, {
"t": 77342,
"b": "1"
}, {
"t": 77488,
"s": "2"
}, {
"t": 77745,
"b": "2"
}, {
"t": 77808,
"s": "2"
}, {
"t": 78061,
"b": "2"
}, {
"t": 78123,
"s": "2"
}, {
"t": 78442,
"b": "1"
}, {
"t": 78448,
"s": "3"
}, {
"t": 78784,
"s": "2"
}, {
"t": 79093,
"s": "3"
}, {
"t": 79126,
"b": "2"
}, {
"t": 79403,
"s": "3"
}, {
"t": 79437,
"b": "2"
}, {
"t": 79712,
"s": "3"
}, {
"t": 79773,
"b": "1"
}, {
"t": 80016,
"s": "3"
}, {
"t": 80088,
"b": "1"
}, {
"t": 80331,
"s": "3"
}, {
"t": 80458,
"b": "2"
}, {
"t": 80635,
"s": "1"
}, {
"t": 80773,
"b": "2"
}, {
"t": 81213,
"b": "1"
}, {
"t": 81264,
"s": "1"
}, {
"t": 81605,
"s": "1"
}, {
"t": 81909,
"s": "2"
}, {
"t": 81962,
"b": "3"
}, {
"t": 82219,
"s": "2"
}, {
"t": 82533,
"s": "1"
}, {
"t": 82689,
"b": "3"
}, {
"t": 82848,
"s": "2"
}, {
"t": 83173,
"s": "2"
}, {
"t": 83453,
"b": "3"
}, {
"t": 83488,
"s": "2"
}, {
"t": 83803,
"s": "2"
}, {
"t": 84139,
"s": "2"
}, {
"t": 84209,
"b": "3"
}, {
"t": 84443,
"s": "2"
}, {
"t": 84510,
"b": "3"
}, {
"t": 84752,
"s": "3"
}, {
"t": 84927,
"b": "3"
}, {
"t": 85061,
"s": "2"
}, {
"t": 85230,
"b": "3"
}, {
"t": 85371,
"s": "2"
}, {
"t": 85630,
"b": "3"
}, {
"t": 85680,
"s": "2"
}, {
"t": 85953,
"b": "3"
}, {
"t": 85984,
"s": "2"
}, {
"t": 86299,
"s": "2"
}, {
"t": 86608,
"s": "2"
}, {
"t": 86917,
"s": "2"
}, {
"t": 87227,
"s": "2"
}, {
"t": 87536,
"s": "2"
}, {
"t": 87840,
"s": "2"
}, {
"t": 87922,
"b": "1"
}, {
"t": 88165,
"s": "2"
}, {
"t": 88507,
"s": "2"
}, {
"t": 88629,
"b": "2"
}, {
"t": 88821,
"s": "2"
}, {
"t": 88942,
"b": "2"
}, {
"t": 89152,
"s": "2"
}, {
"t": 89345,
"b": "1"
}, {
"t": 89461,
"s": "2"
}, {
"t": 89861,
"s": "2"
}, {
"t": 90061,
"b": "2"
}, {
"t": 90187,
"s": "2"
}, {
"t": 90371,
"b": "2"
}, {
"t": 90496,
"s": "3"
}, {
"t": 90805,
"s": "2"
}, {
"t": 90869,
"b": "1"
}, {
"t": 91109,
"s": "2"
}, {
"t": 91419,
"s": "2"
}, {
"t": 91473,
"b": "2"
}, {
"t": 91728,
"s": "2"
}, {
"t": 91786,
"b": "2"
}, {
"t": 92032,
"s": "3"
}, {
"t": 92142,
"b": "1"
}, {
"t": 92347,
"s": "3"
}, {
"t": 92452,
"b": "1"
}, {
"t": 92656,
"s": "3"
}, {
"t": 92924,
"b": "2"
}, {
"t": 93024,
"s": "3"
}, {
"t": 93239,
"b": "2"
}, {
"t": 93339,
"s": "2"
}, {
"t": 93653,
"s": "2"
}, {
"t": 93853,
"b": "3"
}, {
"t": 93957,
"s": "2"
}, {
"t": 94277,
"s": "2"
}, {
"t": 94608,
"s": "3"
}, {
"t": 94661,
"b": "3"
}, {
"t": 94917,
"s": "1"
}, {
"t": 95237,
"s": "2"
}, {
"t": 95389,
"b": "3"
}, {
"t": 95568,
"s": "2"
}, {
"t": 95883,
"s": "2"
}, {
"t": 96185,
"b": "3"
}, {
"t": 96187,
"s": "3"
}, {
"t": 96493,
"b": "3"
}, {
"t": 96496,
"s": "2"
}, {
"t": 96816,
"s": "2"
}, {
"t": 97131,
"s": "3"
}, {
"t": 97161,
"b": "1"
}, {
"t": 97435,
"s": "2"
}, {
"t": 97749,
"s": "2"
}, {
"t": 97853,
"b": "2"
}, {
"t": 98053,
"s": "2"
}, {
"t": 98166,
"b": "2"
}, {
"t": 98368,
"s": "3"
}, {
"t": 98545,
"b": "1"
}, {
"t": 98683,
"s": "2"
}, {
"t": 98987,
"s": "2"
}, {
"t": 99273,
"b": "2"
}, {
"t": 99301,
"s": "2"
}, {
"t": 99611,
"s": "3"
}, {
"t": 99925,
"s": "3"
}, {
"t": 100098,
"b": "1"
}, {
"t": 100235,
"s": "3"
}, {
"t": 100401,
"b": "1"
}, {
"t": 100544,
"s": "1"
}, {
"t": 100805,
"b": "2"
}, {
"t": 100859,
"s": "2"
}, {
"t": 101130,
"b": "2"
}, {
"t": 101163,
"s": "2"
}, {
"t": 101472,
"s": "2"
}, {
"t": 101513,
"b": "1"
}, {
"t": 101909,
"s": "1"
}, {
"t": 102341,
"s": "1"
}, {
"t": 102736,
"s": "1"
}, {
"t": 103056,
"s": "1"
}, {
"t": 103429,
"s": "1"
}, {
"t": 103755,
"s": "1"
}, {
"t": 104080,
"s": "1"
}, {
"t": 104422,
"b": "3"
}, {
"t": 104453,
"s": "2"
}, {
"t": 104723,
"b": "3"
}, {
"t": 104773,
"s": "3"
}, {
"t": 105083,
"s": "2"
}, {
"t": 105210,
"b": "3"
}, {
"t": 105413,
"s": "3"
}, {
"t": 105519,
"b": "3"
}, {
"t": 105723,
"s": "2"
}, {
"t": 105953,
"b": "3"
}, {
"t": 106037,
"s": "1"
}, {
"t": 106261,
"b": "3"
}, {
"t": 106347,
"s": "2"
}, {
"t": 106661,
"s": "3"
}, {
"t": 106714,
"b": "3"
}, {
"t": 106976,
"s": "3"
}, {
"t": 107030,
"b": "3"
}, {
"t": 107280,
"s": "3"
}, {
"t": 107397,
"b": "1"
}, {
"t": 107589,
"s": "3"
}, {
"t": 107701,
"b": "1"
}, {
"t": 107893,
"s": "3"
}, {
"t": 108065,
"b": "2"
}, {
"t": 108203,
"s": "3"
}, {
"t": 108401,
"b": "2"
}, {
"t": 108512,
"s": "3"
}, {
"t": 108709,
"b": "1"
}, {
"t": 108848,
"s": "3"
}, {
"t": 109011,
"b": "1"
}, {
"t": 109152,
"s": "3"
}, {
"t": 109373,
"b": "2"
}, {
"t": 109467,
"s": "3"
}, {
"t": 109707,
"b": "2"
}, {
"t": 109803,
"s": "3"
}, {
"t": 110107,
"s": "3"
}, {
"t": 110225,
"b": "1"
}, {
"t": 110421,
"s": "2"
}, {
"t": 110538,
"b": "1"
}, {
"t": 110741,
"s": "2"
}, {
"t": 110901,
"b": "2"
}, {
"t": 111045,
"s": "2"
}, {
"t": 111224,
"b": "2"
}, {
"t": 111365,
"s": "2"
}, {
"t": 111675,
"s": "2"
}, {
"t": 111690,
"b": "1"
}, {
"t": 111984,
"s": "1"
}, {
"t": 112299,
"s": "3"
}, {
"t": 112325,
"b": "2"
}, {
"t": 112608,
"s": "3"
}, {
"t": 112632,
"b": "2"
}, {
"t": 112928,
"s": "3"
}, {
"t": 113041,
"b": "1"
}, {
"t": 113237,
"s": "3"
}, {
"t": 113375,
"b": "1"
}, {
"t": 113557,
"s": "3"
}, {
"t": 113770,
"b": "2"
}, {
"t": 113877,
"s": "3"
}, {
"t": 114076,
"b": "2"
}, {
"t": 114187,
"s": "3"
}, {
"t": 114453,
"b": "1"
}, {
"t": 114512,
"s": "1"
}, {
"t": 114767,
"b": "1"
}, {
"t": 114832,
"s": "1"
}, {
"t": 115143,
"b": "2"
}, {
"t": 115179,
"s": "1"
}, {
"t": 115452,
"b": "2"
}, {
"t": 115541,
"s": "1"
}, {
"t": 115865,
"b": "3"
}, {
"t": 115941,
"s": "1"
}, {
"t": 116267,
"s": "1"
}, {
"t": 116594,
"b": "3"
}, {
"t": 116651,
"s": "1"
}, {
"t": 117013,
"s": "1"
}, {
"t": 117298,
"b": "3"
}, {
"t": 117515,
"s": "2"
}, {
"t": 117603,
"b": "3"
}, {
"t": 117867,
"s": "1"
}, {
"t": 118013,
"b": "3"
}, {
"t": 118208,
"s": "1"
}, {
"t": 118539,
"s": "1"
}, {
"t": 118761,
"b": "3"
}, {
"t": 118928,
"s": "2"
}, {
"t": 119070,
"b": "3"
}, {
"t": 119280,
"s": "2"
}, {
"t": 119402,
"b": "3"
}, {
"t": 119632,
"s": "2"
}, {
"t": 119706,
"b": "3"
}, {
"t": 119947,
"s": "1"
}, {
"t": 120148,
"b": "3"
}, {
"t": 120336,
"s": "1"
}, {
"t": 120450,
"b": "3"
}, {
"t": 120693,
"s": "2"
}, {
"t": 120813,
"b": "3"
}, {
"t": 121045,
"s": "2"
}, {
"t": 121134,
"b": "3"
}, {
"t": 121397,
"s": "2"
}, {
"t": 121530,
"b": "1"
}, {
"t": 121749,
"s": "2"
}, {
"t": 122069,
"s": "1"
}, {
"t": 122370,
"b": "1"
}, {
"t": 122395,
"s": "1"
}, {
"t": 122811,
"s": "1"
}, {
"t": 123073,
"b": "1"
}, {
"t": 123115,
"s": "1"
}, {
"t": 123396,
"b": "1"
}, {
"t": 123515,
"s": "2"
}, {
"t": 123742,
"b": "1"
}, {
"t": 123867,
"s": "2"
}, {
"t": 124046,
"b": "1"
}, {
"t": 124192,
"s": "2"
}, {
"t": 124446,
"b": "2"
}, {
"t": 124576,
"s": "2"
}, {
"t": 124774,
"b": "2"
}, {
"t": 124933,
"s": "3"
}, {
"t": 125221,
"b": "2"
}, {
"t": 125280,
"s": "1"
}, {
"t": 125538,
"b": "2"
}, {
"t": 125637,
"s": "2"
}, {
"t": 125869,
"b": "2"
}, {
"t": 125989,
"s": "3"
}, {
"t": 126183,
"b": "2"
}, {
"t": 126341,
"s": "2"
}, {
"t": 126661,
"s": "1"
}, {
"t": 126878,
"b": "1"
}, {
"t": 127013,
"s": "2"
}, {
"t": 127323,
"s": "2"
}, {
"t": 127637,
"s": "2"
}, {
"t": 127713,
"b": "2"
}, {
"t": 127941,
"s": "2"
}, {
"t": 128267,
"s": "2"
}, {
"t": 128449,
"b": "1"
}, {
"t": 128571,
"s": "2"
}, {
"t": 128875,
"s": "3"
}, {
"t": 129137,
"b": "2"
}, {
"t": 129227,
"s": "3"
}, {
"t": 129444,
"b": "2"
}, {
"t": 129531,
"s": "3"
}, {
"t": 129793,
"b": "1"
}, {
"t": 129840,
"s": "2"
}, {
"t": 130187,
"s": "2"
}, {
"t": 130496,
"s": "2"
}, {
"t": 130497,
"b": "2"
}, {
"t": 130805,
"s": "3"
}, {
"t": 130809,
"b": "2"
}, {
"t": 131125,
"s": "2"
}, {
"t": 131133,
"b": "1"
}, {
"t": 131440,
"s": "1"
}, {
"t": 131709,
"b": "2"
}, {
"t": 131760,
"s": "2"
}, {
"t": 132030,
"b": "2"
}, {
"t": 132069,
"s": "3"
}, {
"t": 132345,
"b": "1"
}, {
"t": 132379,
"s": "3"
}, {
"t": 132688,
"s": "3"
}, {
"t": 133003,
"s": "3"
}, {
"t": 133038,
"b": "2"
}, {
"t": 133323,
"s": "2"
}, {
"t": 133348,
"b": "2"
}, {
"t": 133627,
"s": "2"
}, {
"t": 133713,
"b": "1"
}, {
"t": 133952,
"s": "3"
}, {
"t": 134014,
"b": "1"
}, {
"t": 134368,
"s": "3"
}, {
"t": 134450,
"b": "2"
}, {
"t": 134672,
"s": "3"
}, {
"t": 134981,
"s": "2"
}, {
"t": 135339,
"s": "1"
}, {
"t": 135437,
"b": "3"
}, {
"t": 135648,
"s": "1"
}, {
"t": 135963,
"s": "1"
}, {
"t": 136273,
"b": "3"
}, {
"t": 136283,
"s": "1"
}, {
"t": 136587,
"s": "1"
}, {
"t": 136960,
"s": "2"
}, {
"t": 136961,
"b": "3"
}, {
"t": 137312,
"s": "1"
}, {
"t": 137627,
"s": "1"
}, {
"t": 137718,
"b": "3"
}, {
"t": 137936,
"s": "1"
}, {
"t": 138240,
"s": "2"
}, {
"t": 138393,
"b": "3"
}, {
"t": 138549,
"s": "2"
}, {
"t": 138859,
"s": "1"
}, {
"t": 138957,
"b": "1"
}, {
"t": 139168,
"s": "2"
}, {
"t": 139483,
"s": "1"
}, {
"t": 139642,
"b": "2"
}, {
"t": 139936,
"s": "1"
}, {
"t": 140299,
"s": "1"
}, {
"t": 140422,
"b": "1"
}, {
"t": 140800,
"s": "1"
}, {
"t": 141077,
"b": "2"
}, {
"t": 141163,
"s": "2"
}, {
"t": 141483,
"s": "2"
}, {
"t": 141787,
"s": "3"
}, {
"t": 141937,
"b": "1"
}, {
"t": 142091,
"s": "2"
}, {
"t": 142395,
"s": "1"
}, {
"t": 142626,
"b": "2"
}, {
"t": 142731,
"s": "1"
}, {
"t": 142937,
"b": "2"
}, {
"t": 143035,
"s": "2"
}, {
"t": 143305,
"b": "1"
}, {
"t": 143349,
"s": "3"
}, {
"t": 143653,
"s": "3"
}, {
"t": 143889,
"b": "2"
}, {
"t": 143957,
"s": "3"
}, {
"t": 144202,
"b": "2"
}, {
"t": 144267,
"s": "3"
}, {
"t": 144559,
"b": "1"
}, {
"t": 144581,
"s": "3"
}, {
"t": 144885,
"s": "3"
}, {
"t": 145189,
"s": "3"
}, {
"t": 145253,
"b": "2"
}, {
"t": 145493,
"s": "3"
}, {
"t": 145564,
"b": "2"
}, {
"t": 145797,
"s": "3"
}, {
"t": 145928,
"b": "1"
}, {
"t": 146112,
"s": "3"
}, {
"t": 146246,
"b": "1"
}, {
"t": 146427,
"s": "3"
}, {
"t": 146667,
"b": "2"
}, {
"t": 146789,
"s": "3"
}, {
"t": 147099,
"s": "3"
}, {
"t": 147369,
"b": "1"
}, {
"t": 147408,
"s": "3"
}, {
"t": 147670,
"b": "1"
}, {
"t": 147712,
"s": "2"
}, {
"t": 148018,
"b": "2"
}, {
"t": 148027,
"s": "2"
}, {
"t": 148331,
"s": "3"
}, {
"t": 148645,
"s": "3"
}, {
"t": 148754,
"b": "1"
}, {
"t": 148955,
"s": "3"
}, {
"t": 149074,
"b": "1"
}, {
"t": 149264,
"s": "3"
}, {
"t": 149369,
"b": "2"
}, {
"t": 149579,
"s": "2"
}, {
"t": 149888,
"s": "3"
}, {
"t": 150053,
"b": "1"
}, {
"t": 150192,
"s": "3"
}, {
"t": 150375,
"b": "1"
}, {
"t": 150507,
"s": "2"
}, {
"t": 150761,
"b": "2"
}, {
"t": 150811,
"s": "2"
}, {
"t": 151115,
"s": "3"
}, {
"t": 151419,
"s": "3"
}, {
"t": 151477,
"b": "1"
}, {
"t": 151728,
"s": "3"
}, {
"t": 151784,
"b": "1"
}, {
"t": 152037,
"s": "3"
}, {
"t": 152202,
"b": "2"
}, {
"t": 152341,
"s": "3"
}, {
"t": 152512,
"b": "2"
}, {
"t": 152656,
"s": "1"
}, {
"t": 152937,
"b": "1"
}, {
"t": 153008,
"s": "1"
}, {
"t": 153365,
"s": "1"
}, {
"t": 153665,
"b": "3"
}, {
"t": 153723,
"s": "1"
}, {
"t": 154048,
"s": "2"
}, {
"t": 154405,
"s": "1"
}, {
"t": 154593,
"b": "3"
}, {
"t": 154752,
"s": "1"
}, {
"t": 155109,
"s": "1"
}, {
"t": 155325,
"b": "3"
}, {
"t": 155429,
"s": "1"
}, {
"t": 155813,
"s": "1"
}, {
"t": 156097,
"b": "3"
}, {
"t": 156165,
"s": "1"
}, {
"t": 156533,
"s": "1"
}, {
"t": 156833,
"b": "3"
}, {
"t": 156837,
"s": "1"
}, {
"t": 157563,
"s": "1"
}, {
"t": 157867,
"s": "1"
}, {
"t": 158192,
"s": "2"
}, {
"t": 158457,
"b": "1"
}, {
"t": 158507,
"s": "2"
}, {
"t": 158816,
"s": "2"
}, {
"t": 159120,
"s": "1"
}, {
"t": 159133,
"b": "2"
}, {
"t": 159424,
"s": "2"
}, {
"t": 159739,
"s": "1"
}, {
"t": 159769,
"b": "1"
}, {
"t": 160043,
"s": "1"
}, {
"t": 160347,
"s": "2"
}, {
"t": 160405,
"b": "2"
}, {
"t": 160667,
"s": "1"
}, {
"t": 160981,
"s": "2"
}, {
"t": 161086,
"b": "1"
}, {
"t": 161317,
"s": "2"
}, {
"t": 161627,
"s": "1"
}, {
"t": 161741,
"b": "2"
}, {
"t": 161936,
"s": "1"
}, {
"t": 162261,
"s": "2"
}, {
"t": 162492,
"b": "1"
}, {
"t": 162677,
"s": "1"
}, {
"t": 163061,
"s": "1"
}, {
"t": 163141,
"b": "2"
}, {
"t": 163435,
"s": "1"
}, {
"t": 163467,
"b": "2"
}, {
"t": 163749,
"s": "3"
}, {
"t": 163983,
"b": "0"
}, {
"t": 164053,
"s": "3"
}, {
"t": 164379,
"s": "3"
}, {
"t": 164578,
"b": "0"
}, {
"t": 164683,
"s": "2"
}, {
"t": 164890,
"b": "0"
}, {
"t": 165003,
"s": "3"
}, {
"t": 165253,
"b": "0"
}, {
"t": 165328,
"s": "2"
}, {
"t": 165632,
"s": "1"
}, {
"t": 165905,
"b": "1"
}, {
"t": 165936,
"s": "3"
}, {
"t": 166240,
"s": "3"
}, {
"t": 166544,
"s": "3"
}, {
"t": 166614,
"b": "2"
}, {
"t": 166859,
"s": "3"
}, {
"t": 166946,
"b": "2"
}, {
"t": 167173,
"s": "3"
}, {
"t": 167349,
"b": "0"
}, {
"t": 167477,
"s": "3"
}, {
"t": 167808,
"s": "2"
}, {
"t": 168077,
"b": "0"
}, {
"t": 168171,
"s": "2"
}, {
"t": 168793,
"b": "1"
}, {
"t": 168987,
"s": "1"
}, {
"t": 169107,
"b": "1"
}, {
"t": 169497,
"b": "2"
}, {
"t": 169810,
"b": "2"
}]
}];
var songUnlockLimit = [0, 100, 500];
var specialOrbsTimers = [{
41851: true,
55488: true,
93720: true,
123260: true,
141216: true
}, {
29658: true,
46429: true,
73313: true,
104854: true,
128186: true
}, {
24366: true,
49917: true,
84510: true,
105519: true,
120148: true
}];
var isDebug = false;
var currentTrackIndex = 0;
var globalSpeed = 20;
var currentRotationAngle = 0;
var fullLog = [];
var fpsText;
var lastTick;
var frameCount;
var debugText;
var worldManager;
var backgroundManager;
var gateManager;
var targetManager;
var ball;
var runner;
var speakerManager;
var noteSparks;
var scoreLabel;
var progressBar;
var orbManager;
var helpIndicator;
var minGateDetectionScale = 0.4;
var maxGateDetectionScale = 0.6;
var minOrbDetectionScale = 0.3;
var maxOrbDetectionScale = 0.8;
var borderLimitAngle = Math.PI * 0.08;
var gateLimitAngle = Math.PI * 0.2;
var gateUniqueId = 0;
var songStarted = false;
var leftAngle = -Math.PI * 0.5 + gateLimitAngle;
var centerAngle = -Math.PI * 0.5 + Math.PI / 2;
var rightAngle = -Math.PI * 0.5 + Math.PI - gateLimitAngle;
var jumpDistance = -1200;
var lastHitSoundTime = 0;
var hitSoundCooldown = 100;
var skipBeatDelay = 900;
var lastBeatTime = 0;
var lastGateHitTime = 0;
var gatePenaltyValue = -2;
var currentMenuLocks = [];
var menuIcon;
var hasFinishedTrack01 = storage.hasFinishedTrack01 || false;
var lastTapTime = 0;
var doubleTapThreshold = 300; // milliseconds
var isJumping = false;
var jumpHelpShown = false; // Flag to track if the jump help has been shown
var globalWhistleParticles = [];
var globalWhistleInterval = null;
/**
* Spawns a looping animation of small black tinted 'note'/'note2' assets
* that swing up and then evaporate at the given coordinates.
* @param {number} spawnX The x-coordinate for the center of the whistle effect.
* @param {number} spawnY The y-coordinate for the center of the whistle effect.
*/
function whistleAnim(spawnX, spawnY) {
// Clear any existing global whistle interval to ensure only one effect runs globally,
// or to restart it at a new position if called again.
if (globalWhistleInterval !== null) {
LK.clearInterval(globalWhistleInterval);
}
globalWhistleInterval = LK.setInterval(function () {
var assetName = Math.random() < 0.5 ? 'note' : 'note2';
//console.log("Spawn WhistleParticle", spawnX, spawnY, assetName);
var particle = new WhistleParticle(spawnX, spawnY, assetName);
game.addChild(particle);
globalWhistleParticles.push(particle);
}, 150 + Math.random() * 100); // Spawn a new note every 150-250ms
}
if (isDebug) {
songUnlockLimit = [0, 2, 6];
songListV4 = [{
"name": "Words Fly Fast",
"duration": 10000,
"songBeats": [{
"t": 1000,
"s": "1"
}, {
"t": 2000,
"s": "1"
}, {
"t": 3000,
"b": "3"
}, {
"t": 4000,
"b": "1"
}]
}, {
"name": "Freedom",
"duration": 5000,
"songBeats": [{
"t": 0,
"s": "3"
}, {
"t": 315,
"s": "3"
}, {
"t": 3218,
"b": "1"
}, {
"t": 3522,
"b": "1"
}]
}, {
"name": "Stranger in the Storm",
"duration": 5000,
"songBeats": [{
"t": 165,
"s": "1"
}, {
"t": 469,
"s": "1"
}, {
"t": 582,
"b": "0"
}, {
"t": 1286,
"b": "0"
}]
}];
specialOrbsTimers = [{
3000: true,
6000: true
}, {
3000: true,
6000: true
}, {
3000: true,
6000: true
}];
}
function getNextGateId() {
return gateUniqueId++;
}
function playHitSound() {
var now = Date.now();
if (now - lastHitSoundTime >= hitSoundCooldown) {
LK.getSound('hit').play();
lastHitSoundTime = now;
}
}
function gameInitialize() {
// Load score from storage
LK.setScore(storage.score || 0);
worldManager = new WorldManager();
game.addChild(worldManager);
backgroundManager = new BackgroundManager();
game.addChild(backgroundManager);
gateManager = new GateManager();
game.addChild(gateManager);
speakerManager = new SpeakerManager();
game.addChild(speakerManager);
noteSparks = new NoteSparks();
game.addChild(noteSparks);
orbManager = new OrbManager();
game.addChild(orbManager);
ball = new Ball();
ball.x = 1024;
ball.y = 2000;
ball.alpha = isDebug ? 1 : 0;
game.addChild(ball);
runner = new Runner();
runner.x = 1024;
runner.y = 2000;
runner.alpha = 1;
game.addChild(runner);
scoreLabel = new ScoreLabel();
scoreLabel.y = 80;
scoreLabel.visible = false;
LK.gui.top.addChild(scoreLabel);
progressBar = new ProgressBar();
progressBar.x = 0;
progressBar.y = 10;
progressBar.visible = false;
game.addChild(progressBar);
game.updateScore = function () {
scoreLabel.updateScore(LK.getScore());
};
menuIcon = new MenuIcon();
menuIcon.x = 1900;
menuIcon.y = 80;
menuIcon.visible = false;
game.addChild(menuIcon);
helpIndicator = new HelpIndicator();
game.addChild(helpIndicator);
jumpHelpShown = false; // Reset the flag on game initialization
if (!songStarted) {
// Always show start button first, regardless of completion status
var startButton = new StartButton();
game.addChild(startButton);
}
if (isDebug) {
var debugMarker = LK.getAsset('debugMarker', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 * 0.5,
y: 2732 / 2
});
game.addChild(debugMarker);
fpsText = new Text2('FPS: 0', {
size: 50,
fill: 0xFFFFFF
});
fpsText.anchor.set(1, 1);
LK.gui.bottomRight.addChild(fpsText);
lastTick = Date.now();
frameCount = 0;
debugText = new Text2('Debug Info', {
size: 50,
fill: 0xFFFFFF
});
debugText.anchor.set(0.5, 0);
LK.gui.top.addChild(debugText);
}
}
game.update = function () {
// Manage and destroy whistle particles
for (var i = globalWhistleParticles.length - 1; i >= 0; i--) {
var p = globalWhistleParticles[i];
if (p.shouldDestroy) {
// It's good practice for the main game loop to handle destruction
p.destroy();
globalWhistleParticles.splice(i, 1);
}
}
if (progressBar && progressBar.update) {
progressBar.update();
}
if (isDebug) {
var now = Date.now();
frameCount++;
if (now - lastTick >= 1000) {
fpsText.setText('FPS: ' + frameCount);
frameCount = 0;
lastTick = now;
}
}
};
var snapPositions = {
left: 0,
center: 1,
right: 2
};
var currentSnapPosition = snapPositions.center;
var lastMouseZone = 1;
function updateSnapPosition(snapPos) {
currentSnapPosition = snapPos;
var targetAngle = centerAngle;
if (snapPos === snapPositions.left) {
targetAngle = leftAngle;
} else if (snapPos === snapPositions.center) {
targetAngle = centerAngle;
} else if (snapPos === snapPositions.right) {
targetAngle = rightAngle;
}
var radiusX = 924;
var radiusY = 634;
runner.x = centerX + radiusX * Math.cos(targetAngle + Math.PI * 0.5);
runner.y = centerY + radiusY * Math.sin(targetAngle + Math.PI * 0.5);
var rotationMap = {
0: -0.5,
1: 0,
2: 0.5
};
currentRotationAngle = rotationMap[snapPos] * Math.PI * 0.5;
}
function animateToSnapPosition(snapPos, jump) {
var needsIntermediateStep = false;
if (currentSnapPosition === snapPositions.left && snapPos === snapPositions.right || currentSnapPosition === snapPositions.right && snapPos === snapPositions.left) {
needsIntermediateStep = true;
}
if (needsIntermediateStep && !jump) {
var radiusX = 924;
var radiusY = 634;
var centerPosX = centerX + radiusX * Math.cos(centerAngle + Math.PI * 0.5);
var centerPosY = centerY + radiusY * Math.sin(centerAngle + Math.PI * 0.5);
tween(runner, {
x: centerPosX,
y: centerPosY
}, {
duration: 100,
easing: tween.easeInOut,
onFinish: function onFinish() {
performSnapAnimation(snapPos, jump);
}
});
currentRotationAngle = 0;
} else {
performSnapAnimation(snapPos, jump);
}
}
function performSnapAnimation(snapPos, jump) {
currentSnapPosition = snapPos;
var targetAngle = centerAngle;
if (snapPos === snapPositions.left) {
targetAngle = rightAngle;
} else if (snapPos === snapPositions.center) {
targetAngle = centerAngle;
} else if (snapPos === snapPositions.right) {
targetAngle = leftAngle;
}
var radiusX = 924;
var radiusY = 634;
var targetX = centerX + radiusX * Math.cos(targetAngle + Math.PI * 0.5);
var targetY = centerY + radiusY * Math.sin(targetAngle + Math.PI * 0.5);
var rotationMap = {
0: -0.5,
1: 0,
2: 0.5
};
var targetRotation = rotationMap[snapPos] * Math.PI * 0.5;
// Don't perform lane switching if jumping
if (isJumping) {
return;
}
if (jump) {
// Calculate jump based on current angle
var jumpX = runner.x + jumpDistance * Math.cos(targetAngle);
var jumpY = runner.y + jumpDistance * Math.sin(targetAngle);
tween(runner, {
x: jumpX,
y: jumpY
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(runner, {
x: targetX,
y: targetY
}, {
duration: 200,
easing: tween.easeIn
});
}
});
} else {
tween(runner, {
x: targetX,
y: targetY
}, {
duration: 300,
easing: tween.easeInOut
});
}
currentRotationAngle = targetRotation;
}
game.down = function (x, y, obj) {
if (!songStarted) {
return;
}
// Check for double tap
var currentTime = Date.now();
if (currentTime - lastTapTime < doubleTapThreshold) {
// Double tap detected - make runner jump
if (!isJumping && runner) {
isJumping = true;
var originalX = runner.x;
var originalY = runner.y;
// Calculate jump direction based on current angle
var angle = Math.atan2(runner.y - centerY, runner.x - centerX);
var jumpX = runner.x + jumpDistance * Math.cos(angle);
var jumpY = runner.y + jumpDistance * Math.sin(angle);
tween(runner, {
x: jumpX,
y: jumpY
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(runner, {
x: originalX,
y: originalY
}, {
duration: 300,
easing: tween.easeIn,
onFinish: function onFinish() {
isJumping = false;
}
});
}
});
}
lastTapTime = 0; // Reset to prevent triple tap
return;
}
lastTapTime = currentTime;
var screenWidth = 2048;
var thirdWidth = screenWidth / 3;
var tapZone;
if (x < thirdWidth) {
tapZone = 0;
} else if (x < thirdWidth * 2) {
tapZone = 1;
} else {
tapZone = 2;
}
if (tapZone === 0) {
animateToSnapPosition(snapPositions.left);
} else if (tapZone === 1) {
animateToSnapPosition(snapPositions.center);
} else {
animateToSnapPosition(snapPositions.right);
}
lastMouseZone = tapZone;
};
game.move = function (x, y, obj) {
if (!songStarted) {
return;
}
var screenWidth = 2048;
var thirdWidth = screenWidth / 3;
var currentZone;
if (x < thirdWidth) {
currentZone = 0;
} else if (x < thirdWidth * 2) {
currentZone = 1;
} else {
currentZone = 2;
}
if (currentZone !== lastMouseZone) {
if (currentZone === 0) {
animateToSnapPosition(snapPositions.left);
} else if (currentZone === 1) {
animateToSnapPosition(snapPositions.center);
} else {
animateToSnapPosition(snapPositions.right);
}
lastMouseZone = currentZone;
}
};
game.up = function (x, y, obj) {};
function filterSpeakerData(trackIndex) {
if (!songListV4[trackIndex]) {
return [];
}
var speakerBeats = [];
var songData = songListV4[trackIndex];
if (songData.songBeats) {
for (var i = 0; i < songData.songBeats.length; i++) {
var beat = songData.songBeats[i];
if (beat.s !== undefined) {
speakerBeats.push(beat);
}
}
}
return speakerBeats;
}
function filterGateData(trackIndex) {
if (!songListV4[trackIndex]) {
return [];
}
var gateBeats = [];
var songData = songListV4[trackIndex];
if (songData.songBeats) {
for (var i = 0; i < songData.songBeats.length; i++) {
var beat = songData.songBeats[i];
if (beat.b !== undefined) {
gateBeats.push(beat);
}
}
}
return gateBeats;
}
function showMenuLock(yPosition, limit) {
var lockContainer = new Container();
lockContainer.x = 1024;
lockContainer.y = yPosition;
game.addChild(lockContainer);
var lockChain = lockContainer.addChild(LK.getAsset('lockChain', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
}));
var lock = lockContainer.addChild(LK.getAsset('lock', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
}));
var clefDeSol = lockContainer.addChild(LK.getAsset('clefDeSol', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 30,
tint: 0x000000,
width: 30,
height: 60
}));
var limitText = new Text2(limit.toString(), {
size: 60,
fill: 0x000000,
dropShadow: true,
dropShadowColor: 0x646464,
dropShadowBlur: 4,
dropShadowAngle: 3 * Math.PI / 4,
dropShadowDistance: 4
});
limitText.anchor.set(0.5, 0.5);
limitText.x = 0;
limitText.y = 110;
lockContainer.addChild(limitText);
return lockContainer;
}
function showMenu() {
if (globalWhistleInterval !== null) {
LK.clearInterval(globalWhistleInterval);
globalWhistleInterval = null;
}
if (runner) {
runner.x = 1024;
runner.y = 2000;
runner.alpha = 0;
runner.scaleX = 1;
runner.scaleY = 1;
runner.isPlayingIdleAnim = false;
runner.isReturningToInitial = false;
for (var i = 0; i < runner.idleFrameAssets.length; i++) {
runner.idleFrameAssets[i].alpha = 0;
}
for (var i = 0; i < runner.frameAssets.length; i++) {
runner.frameAssets[i].alpha = i === 0 ? 1 : 0;
}
}
var menuContainer = new Container();
menuContainer.x = 1024;
menuContainer.y = 1366;
game.addChild(menuContainer);
var menuData = [{
x: 0,
y: -780,
text: songListV4[0] ? songListV4[0].name : "Track 01"
}, {
x: 0,
y: -80,
text: songListV4[1] ? songListV4[1].name : "Track 02"
}, {
x: 0,
y: 620,
text: songListV4[2] ? songListV4[2].name : "Track 03"
}];
for (var i = 0; i < menuData.length; i++) {
var tile = menuContainer.addChild(LK.getAsset('menuTile', {
anchorX: 0.5,
anchorY: 0.5,
x: menuData[i].x,
y: menuData[i].y,
alpha: 0,
scaleX: 0.85,
scaleY: 0.58
}));
var trackText = new Text2(menuData[i].text, {
size: 120,
fill: 0xFFFFFF,
dropShadow: true,
dropShadowColor: 0x000000,
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 4,
dropShadowDistance: 5
});
trackText.anchor.set(0.5, 0.5);
trackText.x = menuData[i].x;
trackText.y = menuData[i].y;
menuContainer.addChild(trackText);
(function (menuTile, menuText, delay, trackIndex) {
var currentScore = LK.getScore();
var isLocked = currentScore < songUnlockLimit[trackIndex];
LK.setTimeout(function () {
tween(menuTile, {
alpha: 1,
scaleX: 0.85,
scaleY: 0.58
}, {
duration: 800,
easing: tween.easeOut
});
tween(menuText, {
alpha: 1
}, {
duration: 800,
easing: tween.easeOut
});
if (isLocked) {
var lock = showMenuLock(menuContainer.y + menuData[trackIndex].y, songUnlockLimit[trackIndex]);
currentMenuLocks.push(lock);
}
}, delay);
menuTile.down = function () {
if (isLocked) {
return;
}
// Hide all visible lockContainers
for (var j = 0; j < currentMenuLocks.length; j++) {
if (currentMenuLocks[j]) {
currentMenuLocks[j].visible = false;
}
}
// Update currentTrackIndex
currentTrackIndex = trackIndex;
// Reset all game managers and objects
if (gateManager) {
// Stop all existing gates
for (var g = gateManager.gates.length - 1; g >= 0; g--) {
gateManager.gates[g].destroy();
}
gateManager.gates = [];
// Reset gate manager state
if (songListV4[trackIndex]) {
gateManager.currentSong = songListV4[trackIndex];
gateManager.gateBeats = filterGateData(trackIndex);
}
gateManager.currentNoteIndex = 0;
gateManager.lastGateAngle = null;
gateManager.gateAnimStartTime = Date.now();
}
if (orbManager) {
// Destroy all existing orbs
for (var o = orbManager.orbs.length - 1; o >= 0; o--) {
orbManager.orbs[o].destroy();
}
orbManager.orbs = [];
orbManager.lastOrbSpawnTime = 0;
}
if (ball) {
// Reset ball state
ball.lastIntersectingGates = {};
ball.lastIntersectingOrbs = {};
}
if (runner) {
// Reset runner position and state
runner.x = 1024;
runner.y = 2000;
runner.rotation = 0;
runner.isReturningToInitial = false;
runner.shouldStartIdleAfterReturn = false;
runner.isPlayingIdleAnim = false;
runner.isPlayingWaitingAnim = false;
// Reset runner animations
for (var i = 0; i < runner.frameAssets.length; i++) {
runner.frameAssets[i].alpha = i === 0 ? 1 : 0;
}
for (var i = 0; i < runner.idleFrameAssets.length; i++) {
runner.idleFrameAssets[i].alpha = 0;
}
}
// Reset global game state
currentSnapPosition = snapPositions.center;
lastMouseZone = 1;
currentRotationAngle = 0;
isJumping = false;
lastGateHitTime = 0;
gatePenaltyValue = -2;
lastBeatTime = 0;
if (speakerManager) {
for (var k = speakerManager.speakers.length - 1; k >= 0; k--) {
var oldSpeaker = speakerManager.speakers[k];
tween.stop(oldSpeaker);
if (oldSpeaker && typeof oldSpeaker.destroy === 'function') {
oldSpeaker.destroy();
}
}
speakerManager.speakers = [];
if (songListV4[trackIndex]) {
speakerManager.speakerSongData = songListV4[trackIndex];
speakerManager.speakerBeats = filterSpeakerData(trackIndex);
}
speakerManager.currentBeatIndex = 0;
}
if (worldManager) {
worldManager.loadWorldAssets(trackIndex);
}
var musicTrack = songTracks[trackIndex];
if (musicTrack) {
tween(menuContainer, {
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
menuContainer.destroy();
var songStartTime = Date.now();
if (menuIcon && hasFinishedTrack01) {
menuIcon.visible = true;
}
if (gateManager) {
gateManager.songStartTime = songStartTime;
}
if (speakerManager) {
speakerManager.songStartTime = songStartTime;
}
if (orbManager) {
orbManager.loadSpecialOrbsTimers();
}
if (helpIndicator) {
helpIndicator.reset();
}
jumpHelpShown = false; // Reset the flag when showing the menu
if (scoreLabel) {
scoreLabel.visible = true;
}
if (progressBar) {
progressBar.visible = true;
progressBar.startProgressAnimation();
}
if (runner) {
for (var i = 0; i < runner.idleFrameAssets.length; i++) {
runner.idleFrameAssets[i].alpha = 0;
}
runner.alpha = 1;
}
songStarted = true;
LK.playMusic(musicTrack);
}
});
}
};
})(tile, trackText, i * 200, i);
}
}
gameInitialize();
remove background
remove background
Futuristic speaker in the shape of a white orb. Face view
white video camera icon
landscape of a furturistic world by night
a white music note
white sparkles emiting from the center. back background
clean red-violet beam from above
button in the shape of a protorealistic holographic futuristc Rectangle . Front view.
above the clouds by a bright night, no visible moon Photorealistic
White Clef de sol
A 20 nodes straight metalic lock chain. High definition. In-Game asset. 2d. High contrast. No shadows
a closed metalic padlock. No visible key hole.
white menu icon
in white