/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var EnvironmentObject = Container.expand(function (objectType, x, y, scale) { var self = Container.call(this); var objectGraphics = self.attachAsset(objectType, { anchorX: 0.5, anchorY: 0.5, scaleX: scale || 1, scaleY: scale || 1 }); self.x = x; self.y = y; return self; }); var MenuButton = Container.expand(function (levelName, color, x, y) { var self = Container.call(this); var buttonGraphics = self.attachAsset(levelName + 'Button', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2(levelName.toUpperCase(), { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.x = x; self.y = y; self.levelName = levelName; self.down = function (x, y, obj) { LK.getSound('buttonClick').play(); tween(self, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100 }); currentLevel = self.levelName; showLevel(); }; self.up = function (x, y, obj) { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 100 }); }; return self; }); var PowerpuffGirl = Container.expand(function (girlType, x, y) { var self = Container.call(this); var girlGraphics = self.attachAsset(girlType, { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.girlType = girlType; self.found = false; self.alpha = 0.8; // Slightly transparent to make them harder to spot self.down = function (x, y, obj) { if (!self.found) { self.found = true; LK.getSound('found').play(); // Visual feedback - flash and grow tween(self, { scaleX: 1.5, scaleY: 1.5, alpha: 1 }, { duration: 300 }); LK.effects.flashObject(self, 0xffffff, 500); charactersFound++; updateFoundCounter(); if (charactersFound >= 3) { LK.setTimeout(function () { levelComplete(); }, 800); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c2c54 }); /**** * Game Code ****/ // Sound effects // Environment objects // Powerpuff Girls characters // Menu level buttons // Background environments var currentScreen = 'menu'; // 'menu' or 'level' var currentLevel = ''; var charactersFound = 0; var levelContainer = null; var menuContainer = null; var foundCounterText = null; // Level completion tracking var completedLevels = storage.completedLevels || []; // Initialize menu function createMenu() { menuContainer = new Container(); game.addChild(menuContainer); // Title var titleText = new Text2('POWERPUFF GIRLS\nHIDDEN HEROES', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 400; menuContainer.addChild(titleText); // Instruction text var instructionText = new Text2('Find Buttercup, Bubbles & Blossom!', { size: 50, fill: 0xFFFF99 }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 2048 / 2; instructionText.y = 550; menuContainer.addChild(instructionText); // Level buttons in a grid var levels = ['lava', 'water', 'sandstorm', 'snowstorm', 'dino']; var buttonSpacing = 350; var startX = 2048 / 2 - buttonSpacing; var startY = 800; for (var i = 0; i < levels.length; i++) { var x = startX + i % 3 * buttonSpacing; var y = startY + Math.floor(i / 3) * 280; var button = new MenuButton(levels[i], 0x4a4a4a, x, y); menuContainer.addChild(button); } } function showLevel() { if (menuContainer) { menuContainer.destroy(); menuContainer = null; } currentScreen = 'level'; charactersFound = 0; levelContainer = new Container(); game.addChild(levelContainer); // Add background var background = levelContainer.attachAsset(currentLevel + 'Background', { anchorX: 0, anchorY: 0 }); // Add environment objects based on level createEnvironmentObjects(); // Add hidden Powerpuff Girls createHiddenCharacters(); // Add UI elements createLevelUI(); } function createEnvironmentObjects() { var objects = []; switch (currentLevel) { case 'lava': objects = [{ type: 'lavaRock', x: 300, y: 800, scale: 1.2 }, { type: 'lavaRock', x: 800, y: 1200, scale: 0.8 }, { type: 'lavaRock', x: 1500, y: 900, scale: 1.5 }, { type: 'lavaRock', x: 1200, y: 1800, scale: 1.0 }, { type: 'lavaRock', x: 600, y: 2000, scale: 1.3 }]; break; case 'water': objects = [{ type: 'coral', x: 200, y: 1000, scale: 1.0 }, { type: 'coral', x: 700, y: 1500, scale: 1.2 }, { type: 'coral', x: 1300, y: 800, scale: 0.9 }, { type: 'coral', x: 1600, y: 1700, scale: 1.1 }, { type: 'coral', x: 400, y: 2200, scale: 0.8 }]; break; case 'sandstorm': objects = [{ type: 'sandDune', x: 350, y: 700, scale: 1.1 }, { type: 'sandDune', x: 900, y: 1100, scale: 1.4 }, { type: 'sandDune', x: 1400, y: 1400, scale: 0.9 }, { type: 'sandDune', x: 500, y: 1900, scale: 1.2 }, { type: 'sandDune', x: 1100, y: 2300, scale: 1.0 }]; break; case 'snowstorm': objects = [{ type: 'snowPile', x: 250, y: 900, scale: 1.3 }, { type: 'snowPile', x: 750, y: 1300, scale: 1.0 }, { type: 'snowPile', x: 1350, y: 1000, scale: 1.2 }, { type: 'snowPile', x: 1000, y: 1800, scale: 0.9 }, { type: 'snowPile', x: 1700, y: 2100, scale: 1.1 }]; break; case 'dino': objects = [{ type: 'tree', x: 200, y: 800, scale: 1.0 }, { type: 'tree', x: 800, y: 1200, scale: 1.2 }, { type: 'dinosaur', x: 1300, y: 1500, scale: 0.8 }, { type: 'tree', x: 1600, y: 900, scale: 0.9 }, { type: 'dinosaur', x: 600, y: 2000, scale: 1.0 }]; break; } for (var i = 0; i < objects.length; i++) { var obj = objects[i]; var envObj = new EnvironmentObject(obj.type, obj.x, obj.y, obj.scale); levelContainer.addChild(envObj); } } function createHiddenCharacters() { var positions = getCharacterPositions(); var girls = ['buttercup', 'bubbles', 'blossom']; for (var i = 0; i < girls.length; i++) { var girl = new PowerpuffGirl(girls[i], positions[i].x, positions[i].y); levelContainer.addChild(girl); } } function getCharacterPositions() { var positions = []; switch (currentLevel) { case 'lava': positions = [{ x: 280, y: 780 }, // Near first lava rock { x: 820, y: 1180 }, // Near second lava rock { x: 1480, y: 880 } // Near third lava rock ]; break; case 'water': positions = [{ x: 220, y: 980 }, // Near first coral { x: 720, y: 1480 }, // Near second coral { x: 1320, y: 780 } // Near third coral ]; break; case 'sandstorm': positions = [{ x: 370, y: 680 }, // Near first sand dune { x: 920, y: 1080 }, // Near second sand dune { x: 1420, y: 1380 } // Near third sand dune ]; break; case 'snowstorm': positions = [{ x: 270, y: 880 }, // Near first snow pile { x: 770, y: 1280 }, // Near second snow pile { x: 1370, y: 980 } // Near third snow pile ]; break; case 'dino': positions = [{ x: 220, y: 780 }, // Near first tree { x: 820, y: 1180 }, // Near second tree { x: 1320, y: 1480 } // Near dinosaur ]; break; } return positions; } function createLevelUI() { // Back button var backButton = new Text2('← BACK', { size: 60, fill: 0xFFFFFF }); backButton.anchor.set(0, 0); backButton.x = 150; backButton.y = 150; levelContainer.addChild(backButton); backButton.down = function (x, y, obj) { LK.getSound('buttonClick').play(); showMenu(); }; // Found counter foundCounterText = new Text2('Found: 0/3', { size: 50, fill: 0xFFFFFF }); foundCounterText.anchor.set(1, 0); foundCounterText.x = 1900; foundCounterText.y = 150; levelContainer.addChild(foundCounterText); // Level name var levelNameText = new Text2(currentLevel.toUpperCase() + ' LEVEL', { size: 60, fill: 0xFFFF99 }); levelNameText.anchor.set(0.5, 0); levelNameText.x = 2048 / 2; levelNameText.y = 150; levelContainer.addChild(levelNameText); } function updateFoundCounter() { if (foundCounterText) { foundCounterText.setText('Found: ' + charactersFound + '/3'); } } function levelComplete() { LK.getSound('levelComplete').play(); // Add to completed levels if (completedLevels.indexOf(currentLevel) === -1) { completedLevels.push(currentLevel); storage.completedLevels = completedLevels; } // Show completion message var completeText = new Text2('LEVEL COMPLETE!\nAll Heroes Found!', { size: 80, fill: 0x00FF00 }); completeText.anchor.set(0.5, 0.5); completeText.x = 2048 / 2; completeText.y = 2732 / 2; levelContainer.addChild(completeText); // Flash screen LK.effects.flashScreen(0x00ff00, 1000); // Auto return to menu after delay LK.setTimeout(function () { showMenu(); }, 3000); } function showMenu() { if (levelContainer) { levelContainer.destroy(); levelContainer = null; } currentScreen = 'menu'; createMenu(); } // Initialize the game createMenu(); game.update = function () { // Game logic updates if needed };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var EnvironmentObject = Container.expand(function (objectType, x, y, scale) {
var self = Container.call(this);
var objectGraphics = self.attachAsset(objectType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: scale || 1,
scaleY: scale || 1
});
self.x = x;
self.y = y;
return self;
});
var MenuButton = Container.expand(function (levelName, color, x, y) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset(levelName + 'Button', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(levelName.toUpperCase(), {
size: 40,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.x = x;
self.y = y;
self.levelName = levelName;
self.down = function (x, y, obj) {
LK.getSound('buttonClick').play();
tween(self, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
currentLevel = self.levelName;
showLevel();
};
self.up = function (x, y, obj) {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
};
return self;
});
var PowerpuffGirl = Container.expand(function (girlType, x, y) {
var self = Container.call(this);
var girlGraphics = self.attachAsset(girlType, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.girlType = girlType;
self.found = false;
self.alpha = 0.8; // Slightly transparent to make them harder to spot
self.down = function (x, y, obj) {
if (!self.found) {
self.found = true;
LK.getSound('found').play();
// Visual feedback - flash and grow
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 1
}, {
duration: 300
});
LK.effects.flashObject(self, 0xffffff, 500);
charactersFound++;
updateFoundCounter();
if (charactersFound >= 3) {
LK.setTimeout(function () {
levelComplete();
}, 800);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c2c54
});
/****
* Game Code
****/
// Sound effects
// Environment objects
// Powerpuff Girls characters
// Menu level buttons
// Background environments
var currentScreen = 'menu'; // 'menu' or 'level'
var currentLevel = '';
var charactersFound = 0;
var levelContainer = null;
var menuContainer = null;
var foundCounterText = null;
// Level completion tracking
var completedLevels = storage.completedLevels || [];
// Initialize menu
function createMenu() {
menuContainer = new Container();
game.addChild(menuContainer);
// Title
var titleText = new Text2('POWERPUFF GIRLS\nHIDDEN HEROES', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
menuContainer.addChild(titleText);
// Instruction text
var instructionText = new Text2('Find Buttercup, Bubbles & Blossom!', {
size: 50,
fill: 0xFFFF99
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 550;
menuContainer.addChild(instructionText);
// Level buttons in a grid
var levels = ['lava', 'water', 'sandstorm', 'snowstorm', 'dino'];
var buttonSpacing = 350;
var startX = 2048 / 2 - buttonSpacing;
var startY = 800;
for (var i = 0; i < levels.length; i++) {
var x = startX + i % 3 * buttonSpacing;
var y = startY + Math.floor(i / 3) * 280;
var button = new MenuButton(levels[i], 0x4a4a4a, x, y);
menuContainer.addChild(button);
}
}
function showLevel() {
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
}
currentScreen = 'level';
charactersFound = 0;
levelContainer = new Container();
game.addChild(levelContainer);
// Add background
var background = levelContainer.attachAsset(currentLevel + 'Background', {
anchorX: 0,
anchorY: 0
});
// Add environment objects based on level
createEnvironmentObjects();
// Add hidden Powerpuff Girls
createHiddenCharacters();
// Add UI elements
createLevelUI();
}
function createEnvironmentObjects() {
var objects = [];
switch (currentLevel) {
case 'lava':
objects = [{
type: 'lavaRock',
x: 300,
y: 800,
scale: 1.2
}, {
type: 'lavaRock',
x: 800,
y: 1200,
scale: 0.8
}, {
type: 'lavaRock',
x: 1500,
y: 900,
scale: 1.5
}, {
type: 'lavaRock',
x: 1200,
y: 1800,
scale: 1.0
}, {
type: 'lavaRock',
x: 600,
y: 2000,
scale: 1.3
}];
break;
case 'water':
objects = [{
type: 'coral',
x: 200,
y: 1000,
scale: 1.0
}, {
type: 'coral',
x: 700,
y: 1500,
scale: 1.2
}, {
type: 'coral',
x: 1300,
y: 800,
scale: 0.9
}, {
type: 'coral',
x: 1600,
y: 1700,
scale: 1.1
}, {
type: 'coral',
x: 400,
y: 2200,
scale: 0.8
}];
break;
case 'sandstorm':
objects = [{
type: 'sandDune',
x: 350,
y: 700,
scale: 1.1
}, {
type: 'sandDune',
x: 900,
y: 1100,
scale: 1.4
}, {
type: 'sandDune',
x: 1400,
y: 1400,
scale: 0.9
}, {
type: 'sandDune',
x: 500,
y: 1900,
scale: 1.2
}, {
type: 'sandDune',
x: 1100,
y: 2300,
scale: 1.0
}];
break;
case 'snowstorm':
objects = [{
type: 'snowPile',
x: 250,
y: 900,
scale: 1.3
}, {
type: 'snowPile',
x: 750,
y: 1300,
scale: 1.0
}, {
type: 'snowPile',
x: 1350,
y: 1000,
scale: 1.2
}, {
type: 'snowPile',
x: 1000,
y: 1800,
scale: 0.9
}, {
type: 'snowPile',
x: 1700,
y: 2100,
scale: 1.1
}];
break;
case 'dino':
objects = [{
type: 'tree',
x: 200,
y: 800,
scale: 1.0
}, {
type: 'tree',
x: 800,
y: 1200,
scale: 1.2
}, {
type: 'dinosaur',
x: 1300,
y: 1500,
scale: 0.8
}, {
type: 'tree',
x: 1600,
y: 900,
scale: 0.9
}, {
type: 'dinosaur',
x: 600,
y: 2000,
scale: 1.0
}];
break;
}
for (var i = 0; i < objects.length; i++) {
var obj = objects[i];
var envObj = new EnvironmentObject(obj.type, obj.x, obj.y, obj.scale);
levelContainer.addChild(envObj);
}
}
function createHiddenCharacters() {
var positions = getCharacterPositions();
var girls = ['buttercup', 'bubbles', 'blossom'];
for (var i = 0; i < girls.length; i++) {
var girl = new PowerpuffGirl(girls[i], positions[i].x, positions[i].y);
levelContainer.addChild(girl);
}
}
function getCharacterPositions() {
var positions = [];
switch (currentLevel) {
case 'lava':
positions = [{
x: 280,
y: 780
},
// Near first lava rock
{
x: 820,
y: 1180
},
// Near second lava rock
{
x: 1480,
y: 880
} // Near third lava rock
];
break;
case 'water':
positions = [{
x: 220,
y: 980
},
// Near first coral
{
x: 720,
y: 1480
},
// Near second coral
{
x: 1320,
y: 780
} // Near third coral
];
break;
case 'sandstorm':
positions = [{
x: 370,
y: 680
},
// Near first sand dune
{
x: 920,
y: 1080
},
// Near second sand dune
{
x: 1420,
y: 1380
} // Near third sand dune
];
break;
case 'snowstorm':
positions = [{
x: 270,
y: 880
},
// Near first snow pile
{
x: 770,
y: 1280
},
// Near second snow pile
{
x: 1370,
y: 980
} // Near third snow pile
];
break;
case 'dino':
positions = [{
x: 220,
y: 780
},
// Near first tree
{
x: 820,
y: 1180
},
// Near second tree
{
x: 1320,
y: 1480
} // Near dinosaur
];
break;
}
return positions;
}
function createLevelUI() {
// Back button
var backButton = new Text2('← BACK', {
size: 60,
fill: 0xFFFFFF
});
backButton.anchor.set(0, 0);
backButton.x = 150;
backButton.y = 150;
levelContainer.addChild(backButton);
backButton.down = function (x, y, obj) {
LK.getSound('buttonClick').play();
showMenu();
};
// Found counter
foundCounterText = new Text2('Found: 0/3', {
size: 50,
fill: 0xFFFFFF
});
foundCounterText.anchor.set(1, 0);
foundCounterText.x = 1900;
foundCounterText.y = 150;
levelContainer.addChild(foundCounterText);
// Level name
var levelNameText = new Text2(currentLevel.toUpperCase() + ' LEVEL', {
size: 60,
fill: 0xFFFF99
});
levelNameText.anchor.set(0.5, 0);
levelNameText.x = 2048 / 2;
levelNameText.y = 150;
levelContainer.addChild(levelNameText);
}
function updateFoundCounter() {
if (foundCounterText) {
foundCounterText.setText('Found: ' + charactersFound + '/3');
}
}
function levelComplete() {
LK.getSound('levelComplete').play();
// Add to completed levels
if (completedLevels.indexOf(currentLevel) === -1) {
completedLevels.push(currentLevel);
storage.completedLevels = completedLevels;
}
// Show completion message
var completeText = new Text2('LEVEL COMPLETE!\nAll Heroes Found!', {
size: 80,
fill: 0x00FF00
});
completeText.anchor.set(0.5, 0.5);
completeText.x = 2048 / 2;
completeText.y = 2732 / 2;
levelContainer.addChild(completeText);
// Flash screen
LK.effects.flashScreen(0x00ff00, 1000);
// Auto return to menu after delay
LK.setTimeout(function () {
showMenu();
}, 3000);
}
function showMenu() {
if (levelContainer) {
levelContainer.destroy();
levelContainer = null;
}
currentScreen = 'menu';
createMenu();
}
// Initialize the game
createMenu();
game.update = function () {
// Game logic updates if needed
};