/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var HidingSpot = Container.expand(function (spotType, isCorrectSpot) {
var self = Container.call(this);
var spotGraphics = self.attachAsset(spotType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isCorrect = isCorrectSpot;
self.hasBeenSearched = false;
self.down = function (x, y, obj) {
if (self.hasBeenSearched) return;
self.hasBeenSearched = true;
if (self.isCorrect) {
// Found Labubu!
LK.getSound('foundLabubu').play();
foundLabubu = true;
// Show Labubu with celebration animation
var labubuSprite = game.addChild(LK.getAsset('labubu', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
scaleX: 0.1,
scaleY: 0.1
}));
// Animate Labubu appearing
tween(labubuSprite, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(labubuSprite, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
// Flash the hiding spot green
LK.effects.flashObject(self, 0x00FF00, 1000);
} else {
// Wrong spot
LK.getSound('wrongSearch').play();
// Flash red and shake
LK.effects.flashObject(self, 0xFF0000, 500);
// Shake animation
var originalX = self.x;
tween(self, {
x: originalX - 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX + 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 50
});
}
});
}
});
}
// Create search effect
var effect = game.addChild(LK.getAsset('searchEffect', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
alpha: 0.7
}));
// Animate search effect
tween(effect, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
effect.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = storage.currentLevel || 1;
var foundLabubu = false;
var searchAttempts = 0;
var maxAttempts = 5;
var hidingSpots = [];
var hintTimer = null;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Create UI elements
var levelTextBg = new LK.getAsset('background', {
width: 300,
height: 120,
color: 0x000000,
anchorX: 0.5,
anchorY: 0
});
var levelText = new Text2('Level ' + currentLevel, {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
levelTextBg.addChild(levelText);
levelText.x = 0;
levelText.y = 0;
LK.gui.top.addChild(levelTextBg);
levelTextBg.y = 100;
var instructionText = new Text2('Tap to find Labubu!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 200;
var attemptsText = new Text2('Searches: ' + searchAttempts + '/' + maxAttempts, {
size: 50,
fill: 0xFFFFFF
});
attemptsText.anchor.set(0, 0);
LK.gui.topLeft.addChild(attemptsText);
attemptsText.x = 120;
attemptsText.y = 50;
// Function to create a new level
function createLevel() {
// Hide any found Labubu sprites from previous level
var labubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < labubuSprites.length; i++) {
labubuSprites[i].destroy();
}
// Clear existing hiding spots
for (var i = 0; i < hidingSpots.length; i++) {
hidingSpots[i].destroy();
}
hidingSpots = [];
// Reset game state
foundLabubu = false;
searchAttempts = 0;
// Update UI
levelText.setText('Level ' + currentLevel);
// Update background box width to fit new text
var textWidth = levelText.width + 40; // Add padding
levelTextBg.width = Math.max(textWidth, 200); // Minimum width
attemptsText.setText('Searches: ' + searchAttempts + '/' + maxAttempts);
// Create hiding spots based on level
var numSpots = Math.min(3 + currentLevel, 8);
var correctSpotIndex = Math.floor(Math.random() * numSpots);
for (var i = 0; i < numSpots; i++) {
var spotType = 'hidingSpot' + (Math.floor(Math.random() * 5) + 1);
var isCorrect = i === correctSpotIndex;
var spot = game.addChild(new HidingSpot(spotType, isCorrect));
// Position spots randomly but ensure they don't overlap
var placed = false;
var attempts = 0;
while (!placed && attempts < 50) {
spot.x = 200 + Math.random() * 1648;
spot.y = 400 + Math.random() * 1800;
var overlapping = false;
for (var j = 0; j < hidingSpots.length; j++) {
var distance = Math.sqrt(Math.pow(spot.x - hidingSpots[j].x, 2) + Math.pow(spot.y - hidingSpots[j].y, 2));
if (distance < 250) {
overlapping = true;
break;
}
}
if (!overlapping) {
placed = true;
}
attempts++;
}
hidingSpots.push(spot);
}
// Start hint timer
if (hintTimer) {
LK.clearTimeout(hintTimer);
}
hintTimer = LK.setTimeout(function () {
showHint();
}, 10000); // Show hint after 10 seconds
}
// Function to show hint
function showHint() {
// Find the correct hiding spot
for (var i = 0; i < hidingSpots.length; i++) {
if (hidingSpots[i].isCorrect) {
// Subtle glow effect as hint
tween(hidingSpots[i], {
alpha: 0.7
}, {
duration: 500,
onFinish: function onFinish() {
tween(hidingSpots[i], {
alpha: 1
}, {
duration: 500
});
}
});
break;
}
}
}
// Game over function
function gameOver() {
// Show game over message
var gameOverText = new Text2('Game Over! Try Again!', {
size: 80,
fill: 0xFF0000
});
gameOverText.anchor.set(0.5, 0.5);
gameOverText.x = 1024;
gameOverText.y = 1366;
game.addChild(gameOverText);
// Reset to level 1 after delay
LK.setTimeout(function () {
currentLevel = 1;
storage.currentLevel = currentLevel;
createLevel();
gameOverText.destroy();
}, 2000);
}
// Level complete function
function completeLevel() {
currentLevel++;
storage.currentLevel = currentLevel;
// Add score for completing level
LK.setScore(LK.getScore() + 100 * currentLevel);
// Hide the found Labubu sprite before showing completion message
var labubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < labubuSprites.length; i++) {
labubuSprites[i].destroy();
}
// Show level complete message
var completeText = new Text2('Labubu Found! Next Level!', {
size: 80,
fill: 0x00FF00
});
completeText.anchor.set(0.5, 0.5);
completeText.x = 1024;
completeText.y = 1366;
game.addChild(completeText);
// Check for win condition
if (currentLevel > 10) {
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
return;
}
// Continue to next level
LK.setTimeout(function () {
// Ensure any remaining Labubu sprites are hidden before new level
var remainingLabubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < remainingLabubuSprites.length; i++) {
remainingLabubuSprites[i].destroy();
}
createLevel();
completeText.destroy();
}, 2000);
}
// Game events
game.down = function (x, y, obj) {
if (foundLabubu) return;
searchAttempts++;
attemptsText.setText('Searches: ' + searchAttempts + '/' + maxAttempts);
// Check if search limit reached
if (searchAttempts >= maxAttempts && !foundLabubu) {
gameOver();
}
};
// Game update loop
game.update = function () {
// Check if Labubu was found
if (foundLabubu) {
// Clear hint timer
if (hintTimer) {
LK.clearTimeout(hintTimer);
hintTimer = null;
}
// Wait a moment then complete level
LK.setTimeout(function () {
completeLevel();
}, 1500);
foundLabubu = false; // Reset for next check
}
};
// Initialize first level
createLevel(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var HidingSpot = Container.expand(function (spotType, isCorrectSpot) {
var self = Container.call(this);
var spotGraphics = self.attachAsset(spotType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isCorrect = isCorrectSpot;
self.hasBeenSearched = false;
self.down = function (x, y, obj) {
if (self.hasBeenSearched) return;
self.hasBeenSearched = true;
if (self.isCorrect) {
// Found Labubu!
LK.getSound('foundLabubu').play();
foundLabubu = true;
// Show Labubu with celebration animation
var labubuSprite = game.addChild(LK.getAsset('labubu', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
scaleX: 0.1,
scaleY: 0.1
}));
// Animate Labubu appearing
tween(labubuSprite, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(labubuSprite, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
// Flash the hiding spot green
LK.effects.flashObject(self, 0x00FF00, 1000);
} else {
// Wrong spot
LK.getSound('wrongSearch').play();
// Flash red and shake
LK.effects.flashObject(self, 0xFF0000, 500);
// Shake animation
var originalX = self.x;
tween(self, {
x: originalX - 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX + 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 50
});
}
});
}
});
}
// Create search effect
var effect = game.addChild(LK.getAsset('searchEffect', {
anchorX: 0.5,
anchorY: 0.5,
x: self.x,
y: self.y,
alpha: 0.7
}));
// Animate search effect
tween(effect, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
effect.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = storage.currentLevel || 1;
var foundLabubu = false;
var searchAttempts = 0;
var maxAttempts = 5;
var hidingSpots = [];
var hintTimer = null;
// Create background
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
// Create UI elements
var levelTextBg = new LK.getAsset('background', {
width: 300,
height: 120,
color: 0x000000,
anchorX: 0.5,
anchorY: 0
});
var levelText = new Text2('Level ' + currentLevel, {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
levelTextBg.addChild(levelText);
levelText.x = 0;
levelText.y = 0;
LK.gui.top.addChild(levelTextBg);
levelTextBg.y = 100;
var instructionText = new Text2('Tap to find Labubu!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 200;
var attemptsText = new Text2('Searches: ' + searchAttempts + '/' + maxAttempts, {
size: 50,
fill: 0xFFFFFF
});
attemptsText.anchor.set(0, 0);
LK.gui.topLeft.addChild(attemptsText);
attemptsText.x = 120;
attemptsText.y = 50;
// Function to create a new level
function createLevel() {
// Hide any found Labubu sprites from previous level
var labubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < labubuSprites.length; i++) {
labubuSprites[i].destroy();
}
// Clear existing hiding spots
for (var i = 0; i < hidingSpots.length; i++) {
hidingSpots[i].destroy();
}
hidingSpots = [];
// Reset game state
foundLabubu = false;
searchAttempts = 0;
// Update UI
levelText.setText('Level ' + currentLevel);
// Update background box width to fit new text
var textWidth = levelText.width + 40; // Add padding
levelTextBg.width = Math.max(textWidth, 200); // Minimum width
attemptsText.setText('Searches: ' + searchAttempts + '/' + maxAttempts);
// Create hiding spots based on level
var numSpots = Math.min(3 + currentLevel, 8);
var correctSpotIndex = Math.floor(Math.random() * numSpots);
for (var i = 0; i < numSpots; i++) {
var spotType = 'hidingSpot' + (Math.floor(Math.random() * 5) + 1);
var isCorrect = i === correctSpotIndex;
var spot = game.addChild(new HidingSpot(spotType, isCorrect));
// Position spots randomly but ensure they don't overlap
var placed = false;
var attempts = 0;
while (!placed && attempts < 50) {
spot.x = 200 + Math.random() * 1648;
spot.y = 400 + Math.random() * 1800;
var overlapping = false;
for (var j = 0; j < hidingSpots.length; j++) {
var distance = Math.sqrt(Math.pow(spot.x - hidingSpots[j].x, 2) + Math.pow(spot.y - hidingSpots[j].y, 2));
if (distance < 250) {
overlapping = true;
break;
}
}
if (!overlapping) {
placed = true;
}
attempts++;
}
hidingSpots.push(spot);
}
// Start hint timer
if (hintTimer) {
LK.clearTimeout(hintTimer);
}
hintTimer = LK.setTimeout(function () {
showHint();
}, 10000); // Show hint after 10 seconds
}
// Function to show hint
function showHint() {
// Find the correct hiding spot
for (var i = 0; i < hidingSpots.length; i++) {
if (hidingSpots[i].isCorrect) {
// Subtle glow effect as hint
tween(hidingSpots[i], {
alpha: 0.7
}, {
duration: 500,
onFinish: function onFinish() {
tween(hidingSpots[i], {
alpha: 1
}, {
duration: 500
});
}
});
break;
}
}
}
// Game over function
function gameOver() {
// Show game over message
var gameOverText = new Text2('Game Over! Try Again!', {
size: 80,
fill: 0xFF0000
});
gameOverText.anchor.set(0.5, 0.5);
gameOverText.x = 1024;
gameOverText.y = 1366;
game.addChild(gameOverText);
// Reset to level 1 after delay
LK.setTimeout(function () {
currentLevel = 1;
storage.currentLevel = currentLevel;
createLevel();
gameOverText.destroy();
}, 2000);
}
// Level complete function
function completeLevel() {
currentLevel++;
storage.currentLevel = currentLevel;
// Add score for completing level
LK.setScore(LK.getScore() + 100 * currentLevel);
// Hide the found Labubu sprite before showing completion message
var labubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < labubuSprites.length; i++) {
labubuSprites[i].destroy();
}
// Show level complete message
var completeText = new Text2('Labubu Found! Next Level!', {
size: 80,
fill: 0x00FF00
});
completeText.anchor.set(0.5, 0.5);
completeText.x = 1024;
completeText.y = 1366;
game.addChild(completeText);
// Check for win condition
if (currentLevel > 10) {
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
return;
}
// Continue to next level
LK.setTimeout(function () {
// Ensure any remaining Labubu sprites are hidden before new level
var remainingLabubuSprites = game.children.filter(function (child) {
return child.texture && child.texture.baseTexture && child.texture.baseTexture.resource && child.texture.baseTexture.resource.url && child.texture.baseTexture.resource.url.includes('6872480361ffa48d4b84136a');
});
for (var i = 0; i < remainingLabubuSprites.length; i++) {
remainingLabubuSprites[i].destroy();
}
createLevel();
completeText.destroy();
}, 2000);
}
// Game events
game.down = function (x, y, obj) {
if (foundLabubu) return;
searchAttempts++;
attemptsText.setText('Searches: ' + searchAttempts + '/' + maxAttempts);
// Check if search limit reached
if (searchAttempts >= maxAttempts && !foundLabubu) {
gameOver();
}
};
// Game update loop
game.update = function () {
// Check if Labubu was found
if (foundLabubu) {
// Clear hint timer
if (hintTimer) {
LK.clearTimeout(hintTimer);
hintTimer = null;
}
// Wait a moment then complete level
LK.setTimeout(function () {
completeLevel();
}, 1500);
foundLabubu = false; // Reset for next check
}
};
// Initialize first level
createLevel();
Pink Labubu. In-Game asset. 2d. High contrast. No shadows
Tree. In-Game asset. 2d. High contrast. No shadows
Purple box. In-Game asset. 2d. High contrast. No shadows
Fish statue. In-Game asset. 2d. High contrast. No shadows
Green bush. In-Game asset. 2d. High contrast. No shadows
Red car. In-Game asset. 2d. High contrast. No shadows