/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var FactoryStation = Container.expand(function (stationType) { var self = Container.call(this); var station = self.attachAsset('factoryStation', { anchorX: 0.5, anchorY: 0.5 }); if (stationType === 'mixer') { var mixer = self.attachAsset('mixer', { anchorX: 0.5, anchorY: 0.5, y: -20 }); self.mixer = mixer; } else if (stationType === 'oven') { var oven = self.attachAsset('oven', { anchorX: 0.5, anchorY: 0.5, y: -20 }); self.oven = oven; } self.stationType = stationType; self.active = false; self.completed = false; self.activate = function () { if (self.completed) return; self.active = true; LK.getSound('factorySound').play(); if (self.mixer) { tween(self.mixer, { rotation: self.mixer.rotation + Math.PI * 4 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { self.completed = true; self.active = false; stationProgress++; } }); } else if (self.oven) { tween(station, { tint: 0xFF4500 }, { duration: 1000 }); LK.setTimeout(function () { tween(station, { tint: 0xFFFFFF }, { duration: 1000 }); self.completed = true; self.active = false; stationProgress++; }, 2000); } else { LK.setTimeout(function () { self.completed = true; self.active = false; stationProgress++; }, 1500); } }; self.down = function (x, y, obj) { if (!self.completed && !self.active && characterSelected && currentCharacter) { self.activate(); } }; return self; }); var PowerpuffCharacter = Container.expand(function (characterType) { var self = Container.call(this); var character = self.attachAsset(characterType, { anchorX: 0.5, anchorY: 0.5 }); self.characterType = characterType; self.transformProgress = 0; self.moveToPosition = function (targetX, targetY, duration) { tween(self, { x: targetX, y: targetY }, { duration: duration || 1000, easing: tween.easeInOut }); }; self.transform = function (targetType) { LK.getSound('transform').play(); // Visual transformation effect tween(character, { scaleX: 1.5, scaleY: 1.5 }, { duration: 500 }); tween(character, { alpha: 0.5 }, { duration: 500, onFinish: function onFinish() { // Replace with target asset self.removeChild(character); character = self.attachAsset(targetType, { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, alpha: 0.5 }); tween(character, { scaleX: 1, scaleY: 1, alpha: 1 }, { duration: 500 }); } }); }; return self; }); var SpinWheel = Container.expand(function () { var self = Container.call(this); var background = self.attachAsset('wheelBackground', { anchorX: 0.5, anchorY: 0.5 }); var section1 = self.attachAsset('wheelSection1', { anchorX: 0.5, anchorY: 0.5, x: -80, y: -80 }); var section2 = self.attachAsset('wheelSection2', { anchorX: 0.5, anchorY: 0.5, x: 80, y: -80 }); var section3 = self.attachAsset('wheelSection3', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 80 }); // Character labels var blossomText = new Text2('Blossom', { size: 24, fill: '#FFFFFF' }); blossomText.anchor.set(0.5, 0.5); blossomText.x = -80; blossomText.y = -80; self.addChild(blossomText); var bubblesText = new Text2('Bubbles', { size: 24, fill: '#FFFFFF' }); bubblesText.anchor.set(0.5, 0.5); bubblesText.x = 80; bubblesText.y = -80; self.addChild(bubblesText); var buttercupText = new Text2('Buttercup', { size: 24, fill: '#FFFFFF' }); buttercupText.anchor.set(0.5, 0.5); buttercupText.x = 0; buttercupText.y = 80; self.addChild(buttercupText); self.spinning = false; self.selectedCharacter = null; self.spin = function () { if (self.spinning) return; self.spinning = true; LK.getSound('wheelSpin').play(); var randomRotation = Math.PI * 4 + Math.random() * Math.PI * 2; tween(self, { rotation: self.rotation + randomRotation }, { duration: 2000, easing: tween.easeOut, onFinish: function onFinish() { self.spinning = false; var normalizedRotation = (self.rotation % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2); if (normalizedRotation < Math.PI * 2 / 3) { self.selectedCharacter = 'blossom'; } else if (normalizedRotation < Math.PI * 4 / 3) { self.selectedCharacter = 'bubbles'; } else { self.selectedCharacter = 'buttercup'; } characterSelected = true; } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Sounds // UI elements // Daily transformation targets // Factory elements // Powerpuff Girls // Character wheel assets // Game state variables var gamePhase = 'selection'; // 'selection', 'factory', 'complete' var characterSelected = false; var currentCharacter = null; var wheel = null; var spinButton = null; var conveyorBelt = null; var stations = []; var stationProgress = 0; var totalStations = 3; var transformationProgress = 0; // Daily themes var dailyThemes = ['gingerbread', 'bell', 'pudding', 'gift']; var currentTheme = dailyThemes[Math.floor(Math.random() * dailyThemes.length)]; // UI elements var titleText = new Text2('Powerpuff Factory Adventures', { size: 60, fill: '#FF1493' }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); var instructionText = new Text2('Spin the wheel to choose your Powerpuff Girl!', { size: 40, fill: '#FFFFFF' }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 1024; instructionText.y = 1000; game.addChild(instructionText); var progressBarBg = LK.getAsset('progressBackground', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 200 }); var progressBar = LK.getAsset('progressBar', { anchorX: 0, anchorY: 0.5, x: 824, y: 200, scaleX: 0 }); LK.gui.addChild(progressBarBg); LK.gui.addChild(progressBar); // Create spin wheel wheel = game.addChild(new SpinWheel()); wheel.x = 1024; wheel.y = 1366; // Create spin button spinButton = LK.getAsset('spinButton', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1800 }); game.addChild(spinButton); var spinButtonText = new Text2('SPIN!', { size: 36, fill: '#000000' }); spinButtonText.anchor.set(0.5, 0.5); spinButtonText.x = 1024; spinButtonText.y = 1800; game.addChild(spinButtonText); function initializeFactory() { gamePhase = 'factory'; // Hide wheel and button wheel.visible = false; spinButton.visible = false; spinButtonText.visible = false; instructionText.setText('Tap the factory stations to transform your character!'); // Create conveyor belt conveyorBelt = LK.getAsset('conveyorBelt', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2000 }); game.addChild(conveyorBelt); // Create factory stations var stationTypes = ['mixer', 'oven', 'normal']; for (var i = 0; i < totalStations; i++) { var station = new FactoryStation(stationTypes[i % stationTypes.length]); station.x = 400 + i * 600; station.y = 1800; stations.push(station); game.addChild(station); } // Create character currentCharacter = new PowerpuffCharacter(wheel.selectedCharacter); currentCharacter.x = 200; currentCharacter.y = 1800; game.addChild(currentCharacter); // Move character along conveyor currentCharacter.moveToPosition(stations[0].x, stations[0].y + 100, 2000); } function updateProgress() { var progress = stationProgress / totalStations; tween(progressBar, { scaleX: progress }, { duration: 500 }); if (progress >= 1) { completeTransformation(); } } function completeTransformation() { gamePhase = 'complete'; instructionText.setText('Transformation Complete! Today\'s theme: ' + currentTheme); // Transform character to daily theme currentCharacter.transform(currentTheme); LK.setTimeout(function () { LK.setScore(LK.getScore() + 100); LK.showYouWin(); }, 2000); } // Event handlers spinButton.down = function (x, y, obj) { if (gamePhase === 'selection' && !wheel.spinning) { wheel.spin(); } }; game.update = function () { if (characterSelected && gamePhase === 'selection') { LK.setTimeout(function () { initializeFactory(); }, 1000); characterSelected = false; // Prevent multiple calls } if (gamePhase === 'factory') { // Update progress var currentProgress = stationProgress / totalStations; if (Math.abs(progressBar.scaleX - currentProgress) > 0.01) { updateProgress(); } // Move character to next station when current completes if (stationProgress > 0 && stationProgress <= totalStations && currentCharacter) { var nextStationIndex = Math.min(stationProgress, totalStations - 1); if (stations[nextStationIndex] && !stations[nextStationIndex].active) { currentCharacter.moveToPosition(stations[nextStationIndex].x, stations[nextStationIndex].y + 100, 1000); } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var FactoryStation = Container.expand(function (stationType) {
var self = Container.call(this);
var station = self.attachAsset('factoryStation', {
anchorX: 0.5,
anchorY: 0.5
});
if (stationType === 'mixer') {
var mixer = self.attachAsset('mixer', {
anchorX: 0.5,
anchorY: 0.5,
y: -20
});
self.mixer = mixer;
} else if (stationType === 'oven') {
var oven = self.attachAsset('oven', {
anchorX: 0.5,
anchorY: 0.5,
y: -20
});
self.oven = oven;
}
self.stationType = stationType;
self.active = false;
self.completed = false;
self.activate = function () {
if (self.completed) return;
self.active = true;
LK.getSound('factorySound').play();
if (self.mixer) {
tween(self.mixer, {
rotation: self.mixer.rotation + Math.PI * 4
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
self.completed = true;
self.active = false;
stationProgress++;
}
});
} else if (self.oven) {
tween(station, {
tint: 0xFF4500
}, {
duration: 1000
});
LK.setTimeout(function () {
tween(station, {
tint: 0xFFFFFF
}, {
duration: 1000
});
self.completed = true;
self.active = false;
stationProgress++;
}, 2000);
} else {
LK.setTimeout(function () {
self.completed = true;
self.active = false;
stationProgress++;
}, 1500);
}
};
self.down = function (x, y, obj) {
if (!self.completed && !self.active && characterSelected && currentCharacter) {
self.activate();
}
};
return self;
});
var PowerpuffCharacter = Container.expand(function (characterType) {
var self = Container.call(this);
var character = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 0.5
});
self.characterType = characterType;
self.transformProgress = 0;
self.moveToPosition = function (targetX, targetY, duration) {
tween(self, {
x: targetX,
y: targetY
}, {
duration: duration || 1000,
easing: tween.easeInOut
});
};
self.transform = function (targetType) {
LK.getSound('transform').play();
// Visual transformation effect
tween(character, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500
});
tween(character, {
alpha: 0.5
}, {
duration: 500,
onFinish: function onFinish() {
// Replace with target asset
self.removeChild(character);
character = self.attachAsset(targetType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5,
alpha: 0.5
});
tween(character, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 500
});
}
});
};
return self;
});
var SpinWheel = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('wheelBackground', {
anchorX: 0.5,
anchorY: 0.5
});
var section1 = self.attachAsset('wheelSection1', {
anchorX: 0.5,
anchorY: 0.5,
x: -80,
y: -80
});
var section2 = self.attachAsset('wheelSection2', {
anchorX: 0.5,
anchorY: 0.5,
x: 80,
y: -80
});
var section3 = self.attachAsset('wheelSection3', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 80
});
// Character labels
var blossomText = new Text2('Blossom', {
size: 24,
fill: '#FFFFFF'
});
blossomText.anchor.set(0.5, 0.5);
blossomText.x = -80;
blossomText.y = -80;
self.addChild(blossomText);
var bubblesText = new Text2('Bubbles', {
size: 24,
fill: '#FFFFFF'
});
bubblesText.anchor.set(0.5, 0.5);
bubblesText.x = 80;
bubblesText.y = -80;
self.addChild(bubblesText);
var buttercupText = new Text2('Buttercup', {
size: 24,
fill: '#FFFFFF'
});
buttercupText.anchor.set(0.5, 0.5);
buttercupText.x = 0;
buttercupText.y = 80;
self.addChild(buttercupText);
self.spinning = false;
self.selectedCharacter = null;
self.spin = function () {
if (self.spinning) return;
self.spinning = true;
LK.getSound('wheelSpin').play();
var randomRotation = Math.PI * 4 + Math.random() * Math.PI * 2;
tween(self, {
rotation: self.rotation + randomRotation
}, {
duration: 2000,
easing: tween.easeOut,
onFinish: function onFinish() {
self.spinning = false;
var normalizedRotation = (self.rotation % (Math.PI * 2) + Math.PI * 2) % (Math.PI * 2);
if (normalizedRotation < Math.PI * 2 / 3) {
self.selectedCharacter = 'blossom';
} else if (normalizedRotation < Math.PI * 4 / 3) {
self.selectedCharacter = 'bubbles';
} else {
self.selectedCharacter = 'buttercup';
}
characterSelected = true;
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Sounds
// UI elements
// Daily transformation targets
// Factory elements
// Powerpuff Girls
// Character wheel assets
// Game state variables
var gamePhase = 'selection'; // 'selection', 'factory', 'complete'
var characterSelected = false;
var currentCharacter = null;
var wheel = null;
var spinButton = null;
var conveyorBelt = null;
var stations = [];
var stationProgress = 0;
var totalStations = 3;
var transformationProgress = 0;
// Daily themes
var dailyThemes = ['gingerbread', 'bell', 'pudding', 'gift'];
var currentTheme = dailyThemes[Math.floor(Math.random() * dailyThemes.length)];
// UI elements
var titleText = new Text2('Powerpuff Factory Adventures', {
size: 60,
fill: '#FF1493'
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
var instructionText = new Text2('Spin the wheel to choose your Powerpuff Girl!', {
size: 40,
fill: '#FFFFFF'
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1000;
game.addChild(instructionText);
var progressBarBg = LK.getAsset('progressBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 200
});
var progressBar = LK.getAsset('progressBar', {
anchorX: 0,
anchorY: 0.5,
x: 824,
y: 200,
scaleX: 0
});
LK.gui.addChild(progressBarBg);
LK.gui.addChild(progressBar);
// Create spin wheel
wheel = game.addChild(new SpinWheel());
wheel.x = 1024;
wheel.y = 1366;
// Create spin button
spinButton = LK.getAsset('spinButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1800
});
game.addChild(spinButton);
var spinButtonText = new Text2('SPIN!', {
size: 36,
fill: '#000000'
});
spinButtonText.anchor.set(0.5, 0.5);
spinButtonText.x = 1024;
spinButtonText.y = 1800;
game.addChild(spinButtonText);
function initializeFactory() {
gamePhase = 'factory';
// Hide wheel and button
wheel.visible = false;
spinButton.visible = false;
spinButtonText.visible = false;
instructionText.setText('Tap the factory stations to transform your character!');
// Create conveyor belt
conveyorBelt = LK.getAsset('conveyorBelt', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2000
});
game.addChild(conveyorBelt);
// Create factory stations
var stationTypes = ['mixer', 'oven', 'normal'];
for (var i = 0; i < totalStations; i++) {
var station = new FactoryStation(stationTypes[i % stationTypes.length]);
station.x = 400 + i * 600;
station.y = 1800;
stations.push(station);
game.addChild(station);
}
// Create character
currentCharacter = new PowerpuffCharacter(wheel.selectedCharacter);
currentCharacter.x = 200;
currentCharacter.y = 1800;
game.addChild(currentCharacter);
// Move character along conveyor
currentCharacter.moveToPosition(stations[0].x, stations[0].y + 100, 2000);
}
function updateProgress() {
var progress = stationProgress / totalStations;
tween(progressBar, {
scaleX: progress
}, {
duration: 500
});
if (progress >= 1) {
completeTransformation();
}
}
function completeTransformation() {
gamePhase = 'complete';
instructionText.setText('Transformation Complete! Today\'s theme: ' + currentTheme);
// Transform character to daily theme
currentCharacter.transform(currentTheme);
LK.setTimeout(function () {
LK.setScore(LK.getScore() + 100);
LK.showYouWin();
}, 2000);
}
// Event handlers
spinButton.down = function (x, y, obj) {
if (gamePhase === 'selection' && !wheel.spinning) {
wheel.spin();
}
};
game.update = function () {
if (characterSelected && gamePhase === 'selection') {
LK.setTimeout(function () {
initializeFactory();
}, 1000);
characterSelected = false; // Prevent multiple calls
}
if (gamePhase === 'factory') {
// Update progress
var currentProgress = stationProgress / totalStations;
if (Math.abs(progressBar.scaleX - currentProgress) > 0.01) {
updateProgress();
}
// Move character to next station when current completes
if (stationProgress > 0 && stationProgress <= totalStations && currentCharacter) {
var nextStationIndex = Math.min(stationProgress, totalStations - 1);
if (stations[nextStationIndex] && !stations[nextStationIndex].active) {
currentCharacter.moveToPosition(stations[nextStationIndex].x, stations[nextStationIndex].y + 100, 1000);
}
}
}
};