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 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;
// 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 = 20;
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());
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());
// Animate score update
tween(scoreTxt, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(scoreTxt, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.bounceOut
});
}
});
streakDisplay.updateStreak(currentStreak);
// Visual feedback
LK.effects.flashObject(targetPattern, 0x00ff00, 500);
if (currentStreak > 1) {
LK.getSound('streak').play();
} 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);
}
}
};
// 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;
// Update multiplier display
multiplierTxt.setText('x' + multiplier);
// Pulse multiplier when active
if (multiplier > 1) {
var pulse = Math.sin(LK.ticks * 0.1) * 0.1 + 1;
multiplierTxt.scaleX = pulse;
multiplierTxt.scaleY = pulse;
} else {
multiplierTxt.scaleX = 1;
multiplierTxt.scaleY = 1;
}
// Time warning effect
if (timeRemaining < 10000) {
var flash = Math.sin(LK.ticks * 0.3) * 0.3 + 0.7;
timeTxt.alpha = flash;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -21,21 +21,34 @@
self.currentNumber = 0;
self.generateNumber = function () {
self.currentNumber = Math.floor(Math.random() * 100) + 1;
numberText.setText(self.currentNumber.toString());
- // Pulse animation
+ // Enhanced pulse with color flash
tween(self, {
- scaleX: 1.2,
- scaleY: 1.2
+ scaleX: 1.3,
+ scaleY: 1.3
}, {
- duration: 150,
+ duration: 200,
easing: tween.easeOut
});
tween(self, {
scaleX: 1.0,
scaleY: 1.0
}, {
- duration: 150,
+ 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;
@@ -87,32 +100,52 @@
self.targetMin = 50;
self.targetMax = 60;
self.points = 10;
self.generatePattern = function (difficulty) {
- 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 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
@@ -150,59 +183,172 @@
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 = 20;
+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;
-// Initialize first pattern
-targetPattern.generatePattern(difficulty);
+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
+ alpha: 0,
+ y: 550
}, {
- duration: 1000
+ duration: 1000,
+ easing: tween.easeIn
});
}, 3000);
// Game timer
var gameTimer = LK.setInterval(function () {
@@ -242,8 +388,25 @@
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
+ tween(scoreTxt, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 150,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(scoreTxt, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.bounceOut
+ });
+ }
+ });
streakDisplay.updateStreak(currentStreak);
// Visual feedback
LK.effects.flashObject(targetPattern, 0x00ff00, 500);
if (currentStreak > 1) {
@@ -269,9 +432,21 @@
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;
// Update multiplier display
multiplierTxt.setText('x' + multiplier);