User prompt
Set a 0.5 second cooldown for rng casting
User prompt
Set a 1 second cooldown for rng casting
User prompt
Add the necessary features to the game
User prompt
make the game beautiful ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Lucky Numbers Rush
Initial prompt
Simple RNG Game by Numbers
/****
* 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;
var lastRngTime = 0;
var rngCooldown = 500; // 0.5 second cooldown in milliseconds
// 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;
// Check cooldown
var currentTime = Date.now();
if (currentTime - lastRngTime < rngCooldown) {
return; // Still in cooldown, ignore tap
}
lastRngTime = currentTime;
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
@@ -235,9 +235,9 @@
var gameActive = true;
var shakeIntensity = 0;
var shakeDecay = 0.9;
var lastRngTime = 0;
-var rngCooldown = 1000; // 1 second cooldown in milliseconds
+var rngCooldown = 500; // 0.5 second cooldown in milliseconds
// Particle system
var particleSystem = game.addChild(new ParticleSystem());
// UI Elements
var scoreTxt = new Text2('0', {