/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var GiftBox = Container.expand(function (type) {
var self = Container.call(this);
var boxType = type || 'giftBox1';
var boxGraphics = self.attachAsset(boxType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isOpened = false;
self.boxType = boxType;
self.down = function (x, y, obj) {
if (!self.isOpened) {
self.isOpened = true;
tween(boxGraphics, {
scaleX: 1.2,
scaleY: 1.2,
tint: 0xFFFFFF
}, {
duration: 300
});
LK.getSound('success').play();
// Check if all boxes are opened
var allOpened = true;
for (var i = 0; i < giftBoxes.length; i++) {
if (!giftBoxes[i].isOpened) {
allOpened = false;
break;
}
}
if (allOpened) {
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
}
};
return self;
});
var LevelButton = Container.expand(function (levelNum) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.levelNum = levelNum;
// Add level text
var levelText = new Text2('Level ' + levelNum, {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
self.addChild(levelText);
self.down = function (x, y, obj) {
startLevel(levelNum);
};
return self;
});
var OceanWave = Container.expand(function () {
var self = Container.call(this);
var waveGraphics = self.attachAsset('oceanWave', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseY = 0;
self.amplitude = 50;
self.frequency = 0.05;
self.phase = 0;
self.update = function () {
self.phase += 0.1;
self.y = self.baseY + Math.sin(self.phase) * self.amplitude;
};
return self;
});
var SummerItem = Container.expand(function (itemType) {
var self = Container.call(this);
var itemGraphics = self.attachAsset(itemType, {
anchorX: 0.5,
anchorY: 0.5
});
self.itemType = itemType;
self.isDragging = false;
self.isPacked = false;
self.originalX = 0;
self.originalY = 0;
self.down = function (x, y, obj) {
if (!self.isPacked) {
self.isDragging = true;
draggedItem = self;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var currentLevel = storage.currentLevel || 1;
var gameState = 'menu'; // 'menu', 'level1', 'level2', 'level3', 'level4'
var levelButtons = [];
var oceanWaves = [];
var giftBoxes = [];
var summerItems = [];
var adventureBag = null;
var draggedItem = null;
var whiteOverlay = null;
var cinemaScreen = null;
var erasedPixels = [];
// Title text
var titleText = new Text2('Powerpuff Girls\nSummer Holiday Adventure', {
size: 80,
fill: 0xFF1493
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 400;
LK.gui.center.addChild(titleText);
function createMenu() {
gameState = 'menu';
// Create level buttons
for (var i = 1; i <= 4; i++) {
var button = new LevelButton(i);
button.x = 400 + (i - 1) * 300;
button.y = 1000;
if (i > currentLevel) {
button.alpha = 0.5;
}
levelButtons.push(button);
game.addChild(button);
}
}
function startLevel(levelNum) {
if (levelNum > currentLevel) return;
clearGame();
gameState = 'level' + levelNum;
switch (levelNum) {
case 1:
initLevel1();
break;
case 2:
initLevel2();
break;
case 3:
initLevel3();
break;
case 4:
initLevel4();
break;
}
}
function initLevel1() {
// Ocean waves level
for (var i = 0; i < 5; i++) {
var wave = new OceanWave();
wave.x = 200 + i * 350;
wave.y = 1366 + i * 50;
wave.baseY = wave.y;
wave.phase = i * 0.5;
oceanWaves.push(wave);
game.addChild(wave);
}
// Complete level after 5 seconds
LK.setTimeout(function () {
nextLevel();
}, 5000);
}
function initLevel2() {
// Gift boxes level
var boxTypes = ['giftBox1', 'giftBox2', 'giftBox3'];
for (var i = 0; i < 3; i++) {
var box = new GiftBox(boxTypes[i]);
box.x = 400 + i * 400;
box.y = 1366;
giftBoxes.push(box);
game.addChild(box);
}
// Add instruction text
var instructionText = new Text2('Tap the gift boxes!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 800;
game.addChild(instructionText);
}
function initLevel3() {
// Bag packing level
adventureBag = game.addChild(LK.getAsset('adventureBag', {
anchorX: 0.5,
anchorY: 0.5
}));
adventureBag.x = 1024;
adventureBag.y = 2000;
// Create summer items
var itemTypes = ['sunglasses', 'beachBall', 'sunscreen', 'towel', 'hat'];
for (var i = 0; i < 5; i++) {
var item = new SummerItem(itemTypes[i]);
item.x = 200 + i * 300;
item.y = 1000;
item.originalX = item.x;
item.originalY = item.y;
summerItems.push(item);
game.addChild(item);
}
// Add instruction text
var instructionText = new Text2('Drag items to the bag!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 600;
game.addChild(instructionText);
}
function initLevel4() {
// Cinema reveal level
cinemaScreen = game.addChild(LK.getAsset('cinemaScreen', {
anchorX: 0.5,
anchorY: 0.5
}));
cinemaScreen.x = 1024;
cinemaScreen.y = 1366;
whiteOverlay = game.addChild(LK.getAsset('whiteOverlay', {
anchorX: 0.5,
anchorY: 0.5
}));
whiteOverlay.x = 1024;
whiteOverlay.y = 1366;
// Add instruction text
var instructionText = new Text2('Rub to reveal the cinema!', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
game.addChild(instructionText);
}
function clearGame() {
// Remove all game objects
for (var i = 0; i < levelButtons.length; i++) {
levelButtons[i].destroy();
}
levelButtons = [];
for (var i = 0; i < oceanWaves.length; i++) {
oceanWaves[i].destroy();
}
oceanWaves = [];
for (var i = 0; i < giftBoxes.length; i++) {
giftBoxes[i].destroy();
}
giftBoxes = [];
for (var i = 0; i < summerItems.length; i++) {
summerItems[i].destroy();
}
summerItems = [];
if (adventureBag) {
adventureBag.destroy();
adventureBag = null;
}
if (whiteOverlay) {
whiteOverlay.destroy();
whiteOverlay = null;
}
if (cinemaScreen) {
cinemaScreen.destroy();
cinemaScreen = null;
}
// Clear any remaining children
while (game.children.length > 0) {
game.children[0].destroy();
}
draggedItem = null;
erasedPixels = [];
}
function nextLevel() {
LK.getSound('complete').play();
currentLevel++;
storage.currentLevel = currentLevel;
if (currentLevel > 4) {
// Game completed
LK.showYouWin();
} else {
// Return to menu
clearGame();
createMenu();
}
}
function handleMove(x, y, obj) {
if (gameState === 'level3' && draggedItem) {
draggedItem.x = x;
draggedItem.y = y;
}
if (gameState === 'level4' && whiteOverlay) {
// Erase white overlay by reducing alpha in touched area
var distance = Math.sqrt(Math.pow(x - whiteOverlay.x, 2) + Math.pow(y - whiteOverlay.y, 2));
if (distance < 100) {
whiteOverlay.alpha -= 0.02;
if (whiteOverlay.alpha <= 0) {
whiteOverlay.alpha = 0;
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
}
}
}
function handleDown(x, y, obj) {
// Handle level 3 item selection
if (gameState === 'level3') {
for (var i = 0; i < summerItems.length; i++) {
var item = summerItems[i];
if (!item.isPacked && item.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
draggedItem = item;
break;
}
}
}
}
function handleUp(x, y, obj) {
if (gameState === 'level3' && draggedItem && adventureBag) {
// Check if item is dropped on bag
if (draggedItem.intersects(adventureBag)) {
draggedItem.isPacked = true;
draggedItem.x = adventureBag.x;
draggedItem.y = adventureBag.y;
draggedItem.alpha = 0.5;
LK.getSound('success').play();
// Check if all items are packed
var allPacked = true;
for (var i = 0; i < summerItems.length; i++) {
if (!summerItems[i].isPacked) {
allPacked = false;
break;
}
}
if (allPacked) {
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
} else {
// Return to original position
draggedItem.x = draggedItem.originalX;
draggedItem.y = draggedItem.originalY;
}
}
draggedItem = null;
}
game.move = handleMove;
game.down = handleDown;
game.up = handleUp;
game.update = function () {
// Update ocean waves
for (var i = 0; i < oceanWaves.length; i++) {
oceanWaves[i].update();
}
};
// Initialize the game
createMenu(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var GiftBox = Container.expand(function (type) {
var self = Container.call(this);
var boxType = type || 'giftBox1';
var boxGraphics = self.attachAsset(boxType, {
anchorX: 0.5,
anchorY: 0.5
});
self.isOpened = false;
self.boxType = boxType;
self.down = function (x, y, obj) {
if (!self.isOpened) {
self.isOpened = true;
tween(boxGraphics, {
scaleX: 1.2,
scaleY: 1.2,
tint: 0xFFFFFF
}, {
duration: 300
});
LK.getSound('success').play();
// Check if all boxes are opened
var allOpened = true;
for (var i = 0; i < giftBoxes.length; i++) {
if (!giftBoxes[i].isOpened) {
allOpened = false;
break;
}
}
if (allOpened) {
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
}
};
return self;
});
var LevelButton = Container.expand(function (levelNum) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.levelNum = levelNum;
// Add level text
var levelText = new Text2('Level ' + levelNum, {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
self.addChild(levelText);
self.down = function (x, y, obj) {
startLevel(levelNum);
};
return self;
});
var OceanWave = Container.expand(function () {
var self = Container.call(this);
var waveGraphics = self.attachAsset('oceanWave', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseY = 0;
self.amplitude = 50;
self.frequency = 0.05;
self.phase = 0;
self.update = function () {
self.phase += 0.1;
self.y = self.baseY + Math.sin(self.phase) * self.amplitude;
};
return self;
});
var SummerItem = Container.expand(function (itemType) {
var self = Container.call(this);
var itemGraphics = self.attachAsset(itemType, {
anchorX: 0.5,
anchorY: 0.5
});
self.itemType = itemType;
self.isDragging = false;
self.isPacked = false;
self.originalX = 0;
self.originalY = 0;
self.down = function (x, y, obj) {
if (!self.isPacked) {
self.isDragging = true;
draggedItem = self;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var currentLevel = storage.currentLevel || 1;
var gameState = 'menu'; // 'menu', 'level1', 'level2', 'level3', 'level4'
var levelButtons = [];
var oceanWaves = [];
var giftBoxes = [];
var summerItems = [];
var adventureBag = null;
var draggedItem = null;
var whiteOverlay = null;
var cinemaScreen = null;
var erasedPixels = [];
// Title text
var titleText = new Text2('Powerpuff Girls\nSummer Holiday Adventure', {
size: 80,
fill: 0xFF1493
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 400;
LK.gui.center.addChild(titleText);
function createMenu() {
gameState = 'menu';
// Create level buttons
for (var i = 1; i <= 4; i++) {
var button = new LevelButton(i);
button.x = 400 + (i - 1) * 300;
button.y = 1000;
if (i > currentLevel) {
button.alpha = 0.5;
}
levelButtons.push(button);
game.addChild(button);
}
}
function startLevel(levelNum) {
if (levelNum > currentLevel) return;
clearGame();
gameState = 'level' + levelNum;
switch (levelNum) {
case 1:
initLevel1();
break;
case 2:
initLevel2();
break;
case 3:
initLevel3();
break;
case 4:
initLevel4();
break;
}
}
function initLevel1() {
// Ocean waves level
for (var i = 0; i < 5; i++) {
var wave = new OceanWave();
wave.x = 200 + i * 350;
wave.y = 1366 + i * 50;
wave.baseY = wave.y;
wave.phase = i * 0.5;
oceanWaves.push(wave);
game.addChild(wave);
}
// Complete level after 5 seconds
LK.setTimeout(function () {
nextLevel();
}, 5000);
}
function initLevel2() {
// Gift boxes level
var boxTypes = ['giftBox1', 'giftBox2', 'giftBox3'];
for (var i = 0; i < 3; i++) {
var box = new GiftBox(boxTypes[i]);
box.x = 400 + i * 400;
box.y = 1366;
giftBoxes.push(box);
game.addChild(box);
}
// Add instruction text
var instructionText = new Text2('Tap the gift boxes!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 800;
game.addChild(instructionText);
}
function initLevel3() {
// Bag packing level
adventureBag = game.addChild(LK.getAsset('adventureBag', {
anchorX: 0.5,
anchorY: 0.5
}));
adventureBag.x = 1024;
adventureBag.y = 2000;
// Create summer items
var itemTypes = ['sunglasses', 'beachBall', 'sunscreen', 'towel', 'hat'];
for (var i = 0; i < 5; i++) {
var item = new SummerItem(itemTypes[i]);
item.x = 200 + i * 300;
item.y = 1000;
item.originalX = item.x;
item.originalY = item.y;
summerItems.push(item);
game.addChild(item);
}
// Add instruction text
var instructionText = new Text2('Drag items to the bag!', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 600;
game.addChild(instructionText);
}
function initLevel4() {
// Cinema reveal level
cinemaScreen = game.addChild(LK.getAsset('cinemaScreen', {
anchorX: 0.5,
anchorY: 0.5
}));
cinemaScreen.x = 1024;
cinemaScreen.y = 1366;
whiteOverlay = game.addChild(LK.getAsset('whiteOverlay', {
anchorX: 0.5,
anchorY: 0.5
}));
whiteOverlay.x = 1024;
whiteOverlay.y = 1366;
// Add instruction text
var instructionText = new Text2('Rub to reveal the cinema!', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
game.addChild(instructionText);
}
function clearGame() {
// Remove all game objects
for (var i = 0; i < levelButtons.length; i++) {
levelButtons[i].destroy();
}
levelButtons = [];
for (var i = 0; i < oceanWaves.length; i++) {
oceanWaves[i].destroy();
}
oceanWaves = [];
for (var i = 0; i < giftBoxes.length; i++) {
giftBoxes[i].destroy();
}
giftBoxes = [];
for (var i = 0; i < summerItems.length; i++) {
summerItems[i].destroy();
}
summerItems = [];
if (adventureBag) {
adventureBag.destroy();
adventureBag = null;
}
if (whiteOverlay) {
whiteOverlay.destroy();
whiteOverlay = null;
}
if (cinemaScreen) {
cinemaScreen.destroy();
cinemaScreen = null;
}
// Clear any remaining children
while (game.children.length > 0) {
game.children[0].destroy();
}
draggedItem = null;
erasedPixels = [];
}
function nextLevel() {
LK.getSound('complete').play();
currentLevel++;
storage.currentLevel = currentLevel;
if (currentLevel > 4) {
// Game completed
LK.showYouWin();
} else {
// Return to menu
clearGame();
createMenu();
}
}
function handleMove(x, y, obj) {
if (gameState === 'level3' && draggedItem) {
draggedItem.x = x;
draggedItem.y = y;
}
if (gameState === 'level4' && whiteOverlay) {
// Erase white overlay by reducing alpha in touched area
var distance = Math.sqrt(Math.pow(x - whiteOverlay.x, 2) + Math.pow(y - whiteOverlay.y, 2));
if (distance < 100) {
whiteOverlay.alpha -= 0.02;
if (whiteOverlay.alpha <= 0) {
whiteOverlay.alpha = 0;
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
}
}
}
function handleDown(x, y, obj) {
// Handle level 3 item selection
if (gameState === 'level3') {
for (var i = 0; i < summerItems.length; i++) {
var item = summerItems[i];
if (!item.isPacked && item.intersects({
x: x,
y: y,
width: 1,
height: 1
})) {
draggedItem = item;
break;
}
}
}
}
function handleUp(x, y, obj) {
if (gameState === 'level3' && draggedItem && adventureBag) {
// Check if item is dropped on bag
if (draggedItem.intersects(adventureBag)) {
draggedItem.isPacked = true;
draggedItem.x = adventureBag.x;
draggedItem.y = adventureBag.y;
draggedItem.alpha = 0.5;
LK.getSound('success').play();
// Check if all items are packed
var allPacked = true;
for (var i = 0; i < summerItems.length; i++) {
if (!summerItems[i].isPacked) {
allPacked = false;
break;
}
}
if (allPacked) {
LK.setTimeout(function () {
nextLevel();
}, 1000);
}
} else {
// Return to original position
draggedItem.x = draggedItem.originalX;
draggedItem.y = draggedItem.originalY;
}
}
draggedItem = null;
}
game.move = handleMove;
game.down = handleDown;
game.up = handleUp;
game.update = function () {
// Update ocean waves
for (var i = 0; i < oceanWaves.length; i++) {
oceanWaves[i].update();
}
};
// Initialize the game
createMenu();