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,
songHighscore: [0, 0, 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 = 0;
self.gateAnimationSpeed = globalSpeed / 1000;
self.currentSong = songListV4[0];
self.gateBeats = filterGateData(0);
self.songStartTime = 0;
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) {
var currentScoreValue = LK.getScore();
// currentTrackIndex is a global variable reflecting the song that just ended
if (songHighscore && typeof currentTrackIndex === 'number' && currentTrackIndex >= 0 && currentTrackIndex < songHighscore.length) {
if (currentScoreValue > songHighscore[currentTrackIndex]) {
songHighscore[currentTrackIndex] = currentScoreValue;
storage.songHighscore = songHighscore; // Persist the updated array
}
} else {
// Fallback/Initialization if currentTrackIndex is out of bounds or songHighscore is not proper
// This case should ideally not be hit if currentTrackIndex and storage init are correct.
if (!songHighscore) {
songHighscore = [];
}
while (songHighscore.length <= currentTrackIndex) {
songHighscore.push(0);
}
if (currentScoreValue > songHighscore[currentTrackIndex]) {
songHighscore[currentTrackIndex] = currentScoreValue;
storage.songHighscore = songHighscore;
}
}
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
});
}
});
};
tween(self.buttonLoading, {
rotation: Math.PI * 4
}, {
duration: 3000,
easing: tween.easeOut
});
tween(self, {
scaleX: 1,
scaleY: 1
}, {
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
LK.setScore(0);
storage.score = 0; // Persist current score as 0
if (game.updateScore) {
game.updateScore();
}
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;
}
// 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');
}
songStarted = true;
if (gateManager) {
//gateManager.songStartTime = songStartTime;
//gateManager.currentBeatIndex = 0;
gateManager.resetSong();
}
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": 747,
"s": "1"
}, {
"t": 1232,
"s": "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, 600];
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 screenWidth = 2048;
var thirdWidth = screenWidth / 3;
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;
var songHighscore = storage.songHighscore; // Read from storage, defaults handled by plugin import
/**
* 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 = 150;
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 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 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;
}
};
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() {
songHighscore = storage.songHighscore; // Refresh from storage to get latest highscores
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 - 40;
menuContainer.addChild(trackText);
var highScore = songHighscore[i] || 0; // Use refreshed songHighscore
var highScoreText = new Text2('Best: ' + highScore, {
size: 70,
fill: 0xFFFFFF,
// Yellow for highscore text
dropShadow: true,
dropShadowColor: 0x000000,
dropShadowBlur: 3,
dropShadowAngle: Math.PI / 4,
dropShadowDistance: 3,
alpha: 0,
// Start hidden, will be tweened in
visible: !!highScore
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.x = menuData[i].x;
highScoreText.y = menuData[i].y + 110; // Position it below the track name
menuContainer.addChild(highScoreText);
(function (menuTile, menuText, highScoreTextDisplay, delay, trackIndex) {
// Added highScoreTextDisplay
var currentScore = LK.getScore();
var theHighScore = songHighscore[0] + songHighscore[1] + songHighscore[2];
var isLocked = theHighScore < 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);
highScoreTextDisplay.visible = false;
} else {
tween(highScoreTextDisplay, {
// highScoreTextDisplay is the passed highScoreText
alpha: 1
}, {
duration: 800,
easing: tween.easeOut
});
}
}, 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;
}
}
LK.setScore(0);
storage.score = 0; // Persist current score as 0
if (game.updateScore) {
game.updateScore();
}
// 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, highScoreText, i * 200, i); // Pass highScoreText to the IIFE
}
}
gameInitialize(); ===================================================================
--- original.js
+++ change.js
@@ -460,13 +460,13 @@
});
var GateManager = Container.expand(function () {
var self = Container.call(this);
self.gates = [];
- self.gateAnimStartTime = Date.now();
+ self.gateAnimStartTime = 0;
self.gateAnimationSpeed = globalSpeed / 1000;
self.currentSong = songListV4[0];
self.gateBeats = filterGateData(0);
- self.songStartTime = Date.now();
+ self.songStartTime = 0;
self.currentNoteIndex = 0;
self.noteSpawnScale = 0.12;
self.lastGateAngle = null;
self.lastProcessedBeat = -1;
@@ -1967,9 +1967,8 @@
}
});
return;
}
- songStarted = true;
// Stop the pulse animation when pressed
tween.stop(self.buttonBg);
tween(self, {
alpha: 0
@@ -1982,11 +1981,13 @@
LK.playMusic('track_test');
} else {
LK.playMusic('track_01');
}
+ songStarted = true;
if (gateManager) {
- gateManager.songStartTime = songStartTime;
- gateManager.currentBeatIndex = 0;
+ //gateManager.songStartTime = songStartTime;
+ //gateManager.currentBeatIndex = 0;
+ gateManager.resetSong();
}
if (speakerManager) {
speakerManager.songStartTime = songStartTime;
speakerManager.currentBeatIndex = 0;
@@ -2259,20 +2260,14 @@
}, {
"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,
@@ -9008,9 +9003,9 @@
"t": 169810,
"b": "2"
}]
}];
-var songUnlockLimit = [0, 100, 400];
+var songUnlockLimit = [0, 100, 600];
var specialOrbsTimers = [{
41851: true,
55488: true,
93720: true,
@@ -9064,8 +9059,10 @@
var jumpDistance = -1200;
var lastHitSoundTime = 0;
var hitSoundCooldown = 100;
var skipBeatDelay = 900;
+var screenWidth = 2048;
+var thirdWidth = screenWidth / 3;
var lastBeatTime = 0;
var lastGateHitTime = 0;
var gatePenaltyValue = -2;
var currentMenuLocks = [];
@@ -9414,10 +9411,8 @@
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) {
@@ -9437,10 +9432,8 @@
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) {
@@ -9458,9 +9451,8 @@
}
lastMouseZone = currentZone;
}
};
-game.up = function (x, y, obj) {};
function filterSpeakerData(trackIndex) {
if (!songListV4[trackIndex]) {
return [];
}
@@ -9591,9 +9583,9 @@
dropShadowDistance: 5
});
trackText.anchor.set(0.5, 0.5);
trackText.x = menuData[i].x;
- trackText.y = menuData[i].y;
+ trackText.y = menuData[i].y - 40;
menuContainer.addChild(trackText);
var highScore = songHighscore[i] || 0; // Use refreshed songHighscore
var highScoreText = new Text2('Best: ' + highScore, {
size: 70,
@@ -9609,14 +9601,14 @@
visible: !!highScore
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.x = menuData[i].x;
- highScoreText.y = menuData[i].y + 120; // Position it below the track name
+ highScoreText.y = menuData[i].y + 110; // Position it below the track name
menuContainer.addChild(highScoreText);
(function (menuTile, menuText, highScoreTextDisplay, delay, trackIndex) {
// Added highScoreTextDisplay
var currentScore = LK.getScore();
- var theHighScore = Math.max(0, songHighscore[0], songHighscore[1], songHighscore[2]);
+ var theHighScore = songHighscore[0] + songHighscore[1] + songHighscore[2];
var isLocked = theHighScore < songUnlockLimit[trackIndex];
LK.setTimeout(function () {
tween(menuTile, {
alpha: 1,
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