/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var NumberDisplay = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('numberDisplay', { anchorX: 0.5, anchorY: 0.5 }); var numberText = new Text2('?', { size: 80, fill: 0xFFFFFF }); numberText.anchor.set(0.5, 0.5); self.addChild(numberText); self.currentNumber = 0; self.generateNumber = function () { self.currentNumber = Math.floor(Math.random() * 100) + 1; numberText.setText(self.currentNumber.toString()); // Enhanced pulse with color flash tween(self, { scaleX: 1.3, scaleY: 1.3 }, { duration: 200, easing: tween.easeOut }); tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.bounceOut }); // Color flash effect tween(bg, { tint: 0xffffff }, { duration: 100, easing: tween.easeOut }); tween(bg, { tint: 0x4a90e2 }, { duration: 200, easing: tween.easeIn }); }; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); var particle = self.attachAsset('numberDisplay', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.life = 1.0; self.decay = 0.02; self.init = function (color, size) { particle.tint = color; self.scaleX = size; self.scaleY = size; self.alpha = 1; // Random velocity self.vx = (Math.random() - 0.5) * 10; self.vy = (Math.random() - 0.5) * 10 - 5; }; self.update = function () { self.x += self.vx; self.y += self.vy; self.vy += 0.3; // gravity self.life -= self.decay; self.alpha = self.life; self.scaleX *= 0.98; self.scaleY *= 0.98; if (self.life <= 0) { self.destroy(); } }; return self; }); var ParticleSystem = Container.expand(function () { var self = Container.call(this); var particles = []; self.burst = function (x, y, color, count) { for (var i = 0; i < count; i++) { var particle = new Particle(); particle.x = x; particle.y = y; particle.init(color, Math.random() * 0.3 + 0.2); particles.push(particle); self.addChild(particle); } }; self.update = function () { for (var i = particles.length - 1; i >= 0; i--) { if (particles[i].life <= 0) { particles.splice(i, 1); } } }; return self; }); var StreakDisplay = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('streakBg', { anchorX: 0.5, anchorY: 0.5 }); var streakText = new Text2('Streak: 0', { size: 30, fill: 0x000000 }); streakText.anchor.set(0.5, 0.5); self.addChild(streakText); self.currentStreak = 0; self.updateStreak = function (streak) { self.currentStreak = streak; streakText.setText('Streak: ' + streak); if (streak > 0) { // Flash animation for streak tween(bg, { tint: 0xffffff }, { duration: 200 }); tween(bg, { tint: 0xffd700 }, { duration: 200 }); } }; return self; }); var TargetPattern = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('targetPattern', { anchorX: 0.5, anchorY: 0.5 }); var patternText = new Text2('Target: 50-60', { size: 40, fill: 0xFFFFFF }); patternText.anchor.set(0.5, 0.5); self.addChild(patternText); self.targetMin = 50; self.targetMax = 60; self.points = 10; self.generatePattern = function (difficulty) { // Slide out animation tween(self, { scaleX: 0.8, scaleY: 0.8, alpha: 0.5 }, { duration: 150, easing: tween.easeIn, onFinish: function onFinish() { var patternType = Math.floor(Math.random() * 3); if (patternType === 0) { // Range pattern var center = Math.floor(Math.random() * 80) + 10; var range = Math.max(5, 20 - difficulty * 2); self.targetMin = center - Math.floor(range / 2); self.targetMax = center + Math.floor(range / 2); patternText.setText('Target: ' + self.targetMin + '-' + self.targetMax); self.points = 10 + difficulty * 2; } else if (patternType === 1) { // Even/Odd pattern var isEven = Math.random() < 0.5; self.targetMin = isEven ? 2 : 1; self.targetMax = isEven ? 100 : 99; patternText.setText(isEven ? 'Target: EVEN' : 'Target: ODD'); self.points = 5 + difficulty; } else { // Divisible pattern var divisor = [3, 5, 7, 11][Math.floor(Math.random() * 4)]; self.targetMin = divisor; self.targetMax = divisor; patternText.setText('Target: ÷' + divisor); self.points = 15 + difficulty * 3; } // Slide in animation tween(self, { scaleX: 1.0, scaleY: 1.0, alpha: 1.0 }, { duration: 300, easing: tween.bounceOut }); } }); }; self.checkMatch = function (number) { if (self.targetMin === self.targetMax) { // Divisible pattern return number % self.targetMin === 0; } else if (self.targetMin === 1 || self.targetMin === 2) { // Even/Odd pattern return number % 2 === 0 && self.targetMin === 2 || number % 2 === 1 && self.targetMin === 1; } else { // Range pattern return number >= self.targetMin && number <= self.targetMax; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Game state variables var gameTime = 60000; // 60 seconds var timeRemaining = gameTime; var difficulty = 1; var currentStreak = 0; var multiplier = 1; var gameActive = true; var shakeIntensity = 0; var shakeDecay = 0.9; // Particle system var particleSystem = game.addChild(new ParticleSystem()); // UI Elements var scoreTxt = new Text2('0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); scoreTxt.alpha = 0; scoreTxt.y = -50; LK.gui.top.addChild(scoreTxt); // Animate score entrance tween(scoreTxt, { alpha: 1, y: 0 }, { duration: 600, easing: tween.bounceOut }); var timeTxt = new Text2('60', { size: 50, fill: 0xFF6B6B }); timeTxt.anchor.set(1, 0); timeTxt.x = -20; timeTxt.y = 20; timeTxt.alpha = 0; timeTxt.scaleX = 0; timeTxt.scaleY = 0; LK.gui.topRight.addChild(timeTxt); // Animate timer entrance LK.setTimeout(function () { tween(timeTxt, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.bounceOut }); }, 200); var difficultyTxt = new Text2('Level 1', { size: 40, fill: 0x4ECDC4 }); difficultyTxt.anchor.set(0, 0); difficultyTxt.x = 20; difficultyTxt.y = 120; difficultyTxt.alpha = 0; difficultyTxt.x = -100; LK.gui.topLeft.addChild(difficultyTxt); // Animate difficulty entrance LK.setTimeout(function () { tween(difficultyTxt, { alpha: 1, x: 20 }, { duration: 700, easing: tween.easeOut }); }, 400); // Game objects var tapArea = game.attachAsset('tapArea', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, alpha: 0 }); // Fade in tap area tween(tapArea, { alpha: 0.1 }, { duration: 1000, easing: tween.easeIn }); var numberDisplay = game.addChild(new NumberDisplay()); numberDisplay.x = 1024; numberDisplay.y = 800; numberDisplay.alpha = 0; numberDisplay.scaleX = 0.3; numberDisplay.scaleY = 0.3; // Animate number display entrance LK.setTimeout(function () { tween(numberDisplay, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 800, easing: tween.bounceOut }); }, 600); var targetPattern = game.addChild(new TargetPattern()); targetPattern.x = 1024; targetPattern.y = 400; targetPattern.alpha = 0; targetPattern.y = 300; // Animate target pattern entrance LK.setTimeout(function () { tween(targetPattern, { alpha: 1, y: 400 }, { duration: 600, easing: tween.easeOut }); }, 800); var streakDisplay = game.addChild(new StreakDisplay()); streakDisplay.x = 1024; streakDisplay.y = 1200; streakDisplay.alpha = 0; streakDisplay.y = 1300; // Animate streak display entrance LK.setTimeout(function () { tween(streakDisplay, { alpha: 1, y: 1200 }, { duration: 500, easing: tween.easeOut }); }, 1000); // Initialize first pattern after animations LK.setTimeout(function () { targetPattern.generatePattern(difficulty); }, 1200); // Instructions var instructionText = new Text2('TAP TO GENERATE NUMBERS!', { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 1024; instructionText.y = 600; instructionText.alpha = 0; game.addChild(instructionText); // Entrance animation for instructions tween(instructionText, { alpha: 1, y: 580 }, { duration: 800, easing: tween.bounceOut }); // Floating animation var _floatInstructions = function floatInstructions() { tween(instructionText, { y: 620 }, { duration: 2000, easing: tween.easeInOut, onFinish: function onFinish() { tween(instructionText, { y: 580 }, { duration: 2000, easing: tween.easeInOut, onFinish: _floatInstructions }); } }); }; LK.setTimeout(_floatInstructions, 800); // Fade out instructions after 3 seconds LK.setTimeout(function () { tween(instructionText, { alpha: 0, y: 550 }, { duration: 1000, easing: tween.easeIn }); }, 3000); // Game timer var gameTimer = LK.setInterval(function () { if (!gameActive) return; timeRemaining -= 100; var seconds = Math.ceil(timeRemaining / 1000); timeTxt.setText(seconds.toString()); // Dynamic background color based on time remaining if (timeRemaining < 10000) { // Gradually shift to red as time runs out var urgency = 1 - timeRemaining / 10000; var red = Math.floor(26 + urgency * 100); var green = Math.floor(26 * (1 - urgency)); var blue = Math.floor(46 * (1 - urgency)); game.setBackgroundColor(red << 16 | green << 8 | blue); } else if (currentStreak > 5) { // Golden background for high streaks game.setBackgroundColor(0x2a1810); } else { // Default background game.setBackgroundColor(0x1a1a2e); } if (timeRemaining <= 0) { gameActive = false; LK.clearInterval(gameTimer); if (LK.getScore() >= 500) { LK.showYouWin(); } else { LK.showGameOver(); } } }, 100); // Difficulty progression var difficultyTimer = LK.setInterval(function () { if (!gameActive) return; difficulty = Math.min(10, Math.floor((gameTime - timeRemaining) / 10000) + 1); difficultyTxt.setText('Level ' + difficulty); // Generate new pattern every 5 seconds if ((gameTime - timeRemaining) % 5000 < 100) { targetPattern.generatePattern(difficulty); } }, 100); // Touch handling game.down = function (x, y, obj) { if (!gameActive) return; numberDisplay.generateNumber(); LK.getSound('numberGenerate').play(); // Check for match if (targetPattern.checkMatch(numberDisplay.currentNumber)) { // Match found! currentStreak++; multiplier = Math.min(5, 1 + Math.floor(currentStreak / 3)); var points = targetPattern.points * multiplier; LK.setScore(LK.getScore() + points); scoreTxt.setText(LK.getScore().toString()); // Screen shake for big matches if (multiplier > 2) { shakeIntensity = Math.min(15, multiplier * 3); } // Particle burst for matches var particleColor = multiplier > 3 ? 0xFFD700 : 0x00FF00; var particleCount = Math.min(20, 5 + multiplier * 2); particleSystem.burst(numberDisplay.x, numberDisplay.y, particleColor, particleCount); // Enhanced score animation tween(scoreTxt, { scaleX: 1.3 + multiplier * 0.1, scaleY: 1.3 + multiplier * 0.1 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(scoreTxt, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); } }); // Enhanced number display celebration tween(numberDisplay, { rotation: Math.PI * 2 }, { duration: 600, easing: tween.easeOut }); streakDisplay.updateStreak(currentStreak); // Visual feedback LK.effects.flashObject(targetPattern, 0x00ff00, 500); if (currentStreak > 1) { LK.getSound('streak').play(); // Extra particles for streak particleSystem.burst(streakDisplay.x, streakDisplay.y, 0xFFD700, 8); } else { LK.getSound('match').play(); } // Generate new pattern targetPattern.generatePattern(difficulty); } else { // No match, reset streak if (currentStreak > 0) { currentStreak = 0; multiplier = 1; streakDisplay.updateStreak(currentStreak); // Flash red for missed match LK.effects.flashObject(numberDisplay, 0xff0000, 300); // Red particles for miss particleSystem.burst(numberDisplay.x, numberDisplay.y, 0xFF0000, 5); } } }; // Multiplier display var multiplierTxt = new Text2('x1', { size: 40, fill: 0xFFD700 }); multiplierTxt.anchor.set(0.5, 1); multiplierTxt.alpha = 0; multiplierTxt.y = 50; LK.gui.bottom.addChild(multiplierTxt); // Animate multiplier entrance LK.setTimeout(function () { tween(multiplierTxt, { alpha: 1, y: 0 }, { duration: 500, easing: tween.bounceOut }); }, 1200); game.update = function () { if (!gameActive) return; // Screen shake effect if (shakeIntensity > 0) { game.x = (Math.random() - 0.5) * shakeIntensity; game.y = (Math.random() - 0.5) * shakeIntensity; shakeIntensity *= shakeDecay; if (shakeIntensity < 0.5) { shakeIntensity = 0; game.x = 0; game.y = 0; } } // Update multiplier display multiplierTxt.setText('x' + multiplier); // Enhanced pulse multiplier when active if (multiplier > 1) { var pulse = Math.sin(LK.ticks * 0.15) * 0.15 + 1; multiplierTxt.scaleX = pulse; multiplierTxt.scaleY = pulse; // Color shift for high multipliers if (multiplier > 3) { var colorShift = Math.sin(LK.ticks * 0.1) * 0.5 + 0.5; multiplierTxt.tint = 0xFFFFFF * colorShift + 0xFF0000 * (1 - colorShift); } } else { multiplierTxt.scaleX = 1; multiplierTxt.scaleY = 1; multiplierTxt.tint = 0xFFD700; } // Enhanced time warning effect if (timeRemaining < 10000) { var flash = Math.sin(LK.ticks * 0.3) * 0.3 + 0.7; timeTxt.alpha = flash; // Pulse timer when very low if (timeRemaining < 5000) { var urgentPulse = Math.sin(LK.ticks * 0.2) * 0.2 + 1; timeTxt.scaleX = urgentPulse; timeTxt.scaleY = urgentPulse; } } // Subtle floating animation for number display numberDisplay.y = 800 + Math.sin(LK.ticks * 0.05) * 10; // Rainbow effect for high scores if (LK.getScore() > 200) { var rainbow = Math.sin(LK.ticks * 0.1) * 0.5 + 0.5; scoreTxt.tint = 0xFFFFFF * rainbow + 0x00FFFF * (1 - rainbow); } };
===================================================================
--- original.js
+++ change.js
@@ -52,8 +52,63 @@
});
};
return self;
});
+var Particle = Container.expand(function () {
+ var self = Container.call(this);
+ var particle = self.attachAsset('numberDisplay', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.vx = 0;
+ self.vy = 0;
+ self.life = 1.0;
+ self.decay = 0.02;
+ self.init = function (color, size) {
+ particle.tint = color;
+ self.scaleX = size;
+ self.scaleY = size;
+ self.alpha = 1;
+ // Random velocity
+ self.vx = (Math.random() - 0.5) * 10;
+ self.vy = (Math.random() - 0.5) * 10 - 5;
+ };
+ self.update = function () {
+ self.x += self.vx;
+ self.y += self.vy;
+ self.vy += 0.3; // gravity
+ self.life -= self.decay;
+ self.alpha = self.life;
+ self.scaleX *= 0.98;
+ self.scaleY *= 0.98;
+ if (self.life <= 0) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var ParticleSystem = Container.expand(function () {
+ var self = Container.call(this);
+ var particles = [];
+ self.burst = function (x, y, color, count) {
+ for (var i = 0; i < count; i++) {
+ var particle = new Particle();
+ particle.x = x;
+ particle.y = y;
+ particle.init(color, Math.random() * 0.3 + 0.2);
+ particles.push(particle);
+ self.addChild(particle);
+ }
+ };
+ self.update = function () {
+ for (var i = particles.length - 1; i >= 0; i--) {
+ if (particles[i].life <= 0) {
+ particles.splice(i, 1);
+ }
+ }
+ };
+ return self;
+});
var StreakDisplay = Container.expand(function () {
var self = Container.call(this);
var bg = self.attachAsset('streakBg', {
anchorX: 0.5,
@@ -177,8 +232,12 @@
var difficulty = 1;
var currentStreak = 0;
var multiplier = 1;
var gameActive = true;
+var shakeIntensity = 0;
+var shakeDecay = 0.9;
+// Particle system
+var particleSystem = game.addChild(new ParticleSystem());
// UI Elements
var scoreTxt = new Text2('0', {
size: 60,
fill: 0xFFFFFF
@@ -222,9 +281,9 @@
fill: 0x4ECDC4
});
difficultyTxt.anchor.set(0, 0);
difficultyTxt.x = 20;
-difficultyTxt.y = 20;
+difficultyTxt.y = 120;
difficultyTxt.alpha = 0;
difficultyTxt.x = -100;
LK.gui.topLeft.addChild(difficultyTxt);
// Animate difficulty entrance
@@ -355,8 +414,23 @@
if (!gameActive) return;
timeRemaining -= 100;
var seconds = Math.ceil(timeRemaining / 1000);
timeTxt.setText(seconds.toString());
+ // Dynamic background color based on time remaining
+ if (timeRemaining < 10000) {
+ // Gradually shift to red as time runs out
+ var urgency = 1 - timeRemaining / 10000;
+ var red = Math.floor(26 + urgency * 100);
+ var green = Math.floor(26 * (1 - urgency));
+ var blue = Math.floor(46 * (1 - urgency));
+ game.setBackgroundColor(red << 16 | green << 8 | blue);
+ } else if (currentStreak > 5) {
+ // Golden background for high streaks
+ game.setBackgroundColor(0x2a1810);
+ } else {
+ // Default background
+ game.setBackgroundColor(0x1a1a2e);
+ }
if (timeRemaining <= 0) {
gameActive = false;
LK.clearInterval(gameTimer);
if (LK.getScore() >= 500) {
@@ -388,30 +462,47 @@
multiplier = Math.min(5, 1 + Math.floor(currentStreak / 3));
var points = targetPattern.points * multiplier;
LK.setScore(LK.getScore() + points);
scoreTxt.setText(LK.getScore().toString());
- // Animate score update
+ // Screen shake for big matches
+ if (multiplier > 2) {
+ shakeIntensity = Math.min(15, multiplier * 3);
+ }
+ // Particle burst for matches
+ var particleColor = multiplier > 3 ? 0xFFD700 : 0x00FF00;
+ var particleCount = Math.min(20, 5 + multiplier * 2);
+ particleSystem.burst(numberDisplay.x, numberDisplay.y, particleColor, particleCount);
+ // Enhanced score animation
tween(scoreTxt, {
- scaleX: 1.2,
- scaleY: 1.2
+ scaleX: 1.3 + multiplier * 0.1,
+ scaleY: 1.3 + multiplier * 0.1
}, {
- duration: 150,
+ duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(scoreTxt, {
scaleX: 1,
scaleY: 1
}, {
- duration: 200,
+ duration: 300,
easing: tween.bounceOut
});
}
});
+ // Enhanced number display celebration
+ tween(numberDisplay, {
+ rotation: Math.PI * 2
+ }, {
+ duration: 600,
+ easing: tween.easeOut
+ });
streakDisplay.updateStreak(currentStreak);
// Visual feedback
LK.effects.flashObject(targetPattern, 0x00ff00, 500);
if (currentStreak > 1) {
LK.getSound('streak').play();
+ // Extra particles for streak
+ particleSystem.burst(streakDisplay.x, streakDisplay.y, 0xFFD700, 8);
} else {
LK.getSound('match').play();
}
// Generate new pattern
@@ -423,8 +514,10 @@
multiplier = 1;
streakDisplay.updateStreak(currentStreak);
// Flash red for missed match
LK.effects.flashObject(numberDisplay, 0xff0000, 300);
+ // Red particles for miss
+ particleSystem.burst(numberDisplay.x, numberDisplay.y, 0xFF0000, 5);
}
}
};
// Multiplier display
@@ -447,21 +540,51 @@
});
}, 1200);
game.update = function () {
if (!gameActive) return;
+ // Screen shake effect
+ if (shakeIntensity > 0) {
+ game.x = (Math.random() - 0.5) * shakeIntensity;
+ game.y = (Math.random() - 0.5) * shakeIntensity;
+ shakeIntensity *= shakeDecay;
+ if (shakeIntensity < 0.5) {
+ shakeIntensity = 0;
+ game.x = 0;
+ game.y = 0;
+ }
+ }
// Update multiplier display
multiplierTxt.setText('x' + multiplier);
- // Pulse multiplier when active
+ // Enhanced pulse multiplier when active
if (multiplier > 1) {
- var pulse = Math.sin(LK.ticks * 0.1) * 0.1 + 1;
+ var pulse = Math.sin(LK.ticks * 0.15) * 0.15 + 1;
multiplierTxt.scaleX = pulse;
multiplierTxt.scaleY = pulse;
+ // Color shift for high multipliers
+ if (multiplier > 3) {
+ var colorShift = Math.sin(LK.ticks * 0.1) * 0.5 + 0.5;
+ multiplierTxt.tint = 0xFFFFFF * colorShift + 0xFF0000 * (1 - colorShift);
+ }
} else {
multiplierTxt.scaleX = 1;
multiplierTxt.scaleY = 1;
+ multiplierTxt.tint = 0xFFD700;
}
- // Time warning effect
+ // Enhanced time warning effect
if (timeRemaining < 10000) {
var flash = Math.sin(LK.ticks * 0.3) * 0.3 + 0.7;
timeTxt.alpha = flash;
+ // Pulse timer when very low
+ if (timeRemaining < 5000) {
+ var urgentPulse = Math.sin(LK.ticks * 0.2) * 0.2 + 1;
+ timeTxt.scaleX = urgentPulse;
+ timeTxt.scaleY = urgentPulse;
+ }
}
+ // Subtle floating animation for number display
+ numberDisplay.y = 800 + Math.sin(LK.ticks * 0.05) * 10;
+ // Rainbow effect for high scores
+ if (LK.getScore() > 200) {
+ var rainbow = Math.sin(LK.ticks * 0.1) * 0.5 + 0.5;
+ scoreTxt.tint = 0xFFFFFF * rainbow + 0x00FFFF * (1 - rainbow);
+ }
};
\ No newline at end of file