Code edit (1 edits merged)
Please save this source code
User prompt
Surprise Card Adventure
Initial prompt
Toca surprise cards (2017-2019). The powerpuff girls have some surprise cards š to open. To open the 5 cards š we say open the card. Ready? Yes! 1, 2, 3, open the card! Like this. Now you try
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Card = Container.expand(function () { var self = Container.call(this); self.isFlipped = false; self.isActive = false; self.cardIndex = 0; self.init = function (index) { self.cardIndex = index; // Create card back self.cardBack = self.attachAsset('cardBack', { anchorX: 0.5, anchorY: 0.5 }); // Create card front (hidden initially) var frontAssetName = 'cardFront' + (index + 1); self.cardFront = self.attachAsset(frontAssetName, { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); // Create character on front var characterAssetName = 'character' + (index + 1); self.character = self.attachAsset(characterAssetName, { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); // Add question mark text on card back self.questionMark = new Text2('?', { size: 120, fill: 0xFFFFFF }); self.questionMark.anchor.set(0.5, 0.5); self.addChild(self.questionMark); }; self.flipCard = function () { if (self.isFlipped) return; self.isFlipped = true; // Play flip sound LK.getSound('cardFlip').play(); // Flip animation tween(self.cardBack, { scaleX: 0 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { self.cardBack.alpha = 0; self.questionMark.alpha = 0; self.cardFront.alpha = 1; self.character.alpha = 1; tween(self.cardFront, { scaleX: 1 }, { duration: 300, easing: tween.easeInOut }); tween(self.character, { scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.bounceOut }); // Flash effect LK.effects.flashObject(self, 0xFFFFFF, 500); } }); tween(self.questionMark, { scaleX: 0 }, { duration: 300, easing: tween.easeInOut }); }; self.down = function (x, y, obj) { if (self.isActive && !self.isFlipped && waitingForInput) { handleCardOpen(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var cards = []; var currentCardIndex = 0; var gameState = 'waiting'; // 'waiting', 'countdown', 'input', 'flipping', 'completed' var countdownTimer = null; var inputTimer = null; var waitingForInput = false; var countdownCount = 3; // UI Elements var instructionText = new Text2('Ready to open a card?', { size: 80, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); LK.gui.top.addChild(instructionText); instructionText.y = 150; var countdownText = new Text2('', { size: 120, fill: 0xFFD700 }); countdownText.anchor.set(0.5, 0.5); LK.gui.center.addChild(countdownText); var promptText = new Text2('', { size: 60, fill: 0x00FF00 }); promptText.anchor.set(0.5, 0.5); LK.gui.bottom.addChild(promptText); promptText.y = -200; // Create and position cards function initializeCards() { var cardSpacing = 350; var startX = (2048 - 4 * cardSpacing) / 2; var topRowY = 1366 - 300; var bottomRowY = 1366 + 100; for (var i = 0; i < 5; i++) { var card = new Card(); card.init(i); if (i < 3) { // Top row card.x = startX + i * cardSpacing; card.y = topRowY; } else { // Bottom row card.x = startX + (i - 3) * cardSpacing + cardSpacing / 2; card.y = bottomRowY; } cards.push(card); game.addChild(card); } // Make first card active cards[0].isActive = true; tween(cards[0], { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeInOut }); } function startCountdown() { gameState = 'countdown'; countdownCount = 3; instructionText.setText('Get ready...'); function doCountdown() { if (countdownCount > 0) { countdownText.setText(countdownCount.toString()); LK.getSound('countdown').play(); countdownCount--; countdownTimer = LK.setTimeout(doCountdown, 1000); } else { countdownText.setText(''); startInputPhase(); } } doCountdown(); } function startInputPhase() { gameState = 'input'; waitingForInput = true; instructionText.setText('Say "Open the card!" or tap the card!'); promptText.setText('NOW!'); // Give player 3 seconds to respond inputTimer = LK.setTimeout(function () { if (waitingForInput) { waitingForInput = false; promptText.setText('Too slow! Try again...'); LK.setTimeout(function () { if (gameState !== 'completed') { resetForNextAttempt(); } }, 2000); } }, 3000); } function handleCardOpen() { if (!waitingForInput) return; waitingForInput = false; gameState = 'flipping'; if (inputTimer) { LK.clearTimeout(inputTimer); inputTimer = null; } instructionText.setText('Great job!'); promptText.setText(''); countdownText.setText(''); // Play success sound LK.getSound('success').play(); // Flip the current card cards[currentCardIndex].flipCard(); // Move to next card after delay LK.setTimeout(function () { currentCardIndex++; if (currentCardIndex >= cards.length) { // All cards opened gameState = 'completed'; instructionText.setText('Amazing! All cards opened!'); // Celebrate with screen flash LK.effects.flashScreen(0xFFD700, 2000); // Scale all cards for celebration for (var i = 0; i < cards.length; i++) { tween(cards[i], { scaleX: 1.2, scaleY: 1.2 }, { duration: 1000, easing: tween.bounceOut }); } } else { // Activate next card cards[currentCardIndex].isActive = true; tween(cards[currentCardIndex], { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeInOut }); // Reset for next card LK.setTimeout(resetForNextAttempt, 1500); } }, 2000); } function resetForNextAttempt() { if (gameState === 'completed') return; gameState = 'waiting'; instructionText.setText('Ready for the next card?'); promptText.setText(''); countdownText.setText(''); LK.setTimeout(function () { if (gameState === 'waiting') { startCountdown(); } }, 2000); } // Voice detection var lastVoiceCheck = false; game.update = function () { // Check for voice input during input phase if (waitingForInput && facekit.volume > 0.3) { if (!lastVoiceCheck) { // Voice just started handleCardOpen(); } } lastVoiceCheck = facekit.volume > 0.3; }; // Touch input for starting the game game.down = function (x, y, obj) { if (gameState === 'waiting' && currentCardIndex === 0 && !cards[0].isFlipped) { startCountdown(); } }; // Initialize the game initializeCards();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,276 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var facekit = LK.import("@upit/facekit.v1");
+
+/****
+* Classes
+****/
+var Card = Container.expand(function () {
+ var self = Container.call(this);
+ self.isFlipped = false;
+ self.isActive = false;
+ self.cardIndex = 0;
+ self.init = function (index) {
+ self.cardIndex = index;
+ // Create card back
+ self.cardBack = self.attachAsset('cardBack', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Create card front (hidden initially)
+ var frontAssetName = 'cardFront' + (index + 1);
+ self.cardFront = self.attachAsset(frontAssetName, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ // Create character on front
+ var characterAssetName = 'character' + (index + 1);
+ self.character = self.attachAsset(characterAssetName, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ // Add question mark text on card back
+ self.questionMark = new Text2('?', {
+ size: 120,
+ fill: 0xFFFFFF
+ });
+ self.questionMark.anchor.set(0.5, 0.5);
+ self.addChild(self.questionMark);
+ };
+ self.flipCard = function () {
+ if (self.isFlipped) return;
+ self.isFlipped = true;
+ // Play flip sound
+ LK.getSound('cardFlip').play();
+ // Flip animation
+ tween(self.cardBack, {
+ scaleX: 0
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ self.cardBack.alpha = 0;
+ self.questionMark.alpha = 0;
+ self.cardFront.alpha = 1;
+ self.character.alpha = 1;
+ tween(self.cardFront, {
+ scaleX: 1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ tween(self.character, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 500,
+ easing: tween.bounceOut
+ });
+ // Flash effect
+ LK.effects.flashObject(self, 0xFFFFFF, 500);
+ }
+ });
+ tween(self.questionMark, {
+ scaleX: 0
+ }, {
+ duration: 300,
+ easing: tween.easeInOut
+ });
+ };
+ self.down = function (x, y, obj) {
+ if (self.isActive && !self.isFlipped && waitingForInput) {
+ handleCardOpen();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2C3E50
+});
+
+/****
+* Game Code
+****/
+var cards = [];
+var currentCardIndex = 0;
+var gameState = 'waiting'; // 'waiting', 'countdown', 'input', 'flipping', 'completed'
+var countdownTimer = null;
+var inputTimer = null;
+var waitingForInput = false;
+var countdownCount = 3;
+// UI Elements
+var instructionText = new Text2('Ready to open a card?', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 0.5);
+LK.gui.top.addChild(instructionText);
+instructionText.y = 150;
+var countdownText = new Text2('', {
+ size: 120,
+ fill: 0xFFD700
+});
+countdownText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(countdownText);
+var promptText = new Text2('', {
+ size: 60,
+ fill: 0x00FF00
+});
+promptText.anchor.set(0.5, 0.5);
+LK.gui.bottom.addChild(promptText);
+promptText.y = -200;
+// Create and position cards
+function initializeCards() {
+ var cardSpacing = 350;
+ var startX = (2048 - 4 * cardSpacing) / 2;
+ var topRowY = 1366 - 300;
+ var bottomRowY = 1366 + 100;
+ for (var i = 0; i < 5; i++) {
+ var card = new Card();
+ card.init(i);
+ if (i < 3) {
+ // Top row
+ card.x = startX + i * cardSpacing;
+ card.y = topRowY;
+ } else {
+ // Bottom row
+ card.x = startX + (i - 3) * cardSpacing + cardSpacing / 2;
+ card.y = bottomRowY;
+ }
+ cards.push(card);
+ game.addChild(card);
+ }
+ // Make first card active
+ cards[0].isActive = true;
+ tween(cards[0], {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+}
+function startCountdown() {
+ gameState = 'countdown';
+ countdownCount = 3;
+ instructionText.setText('Get ready...');
+ function doCountdown() {
+ if (countdownCount > 0) {
+ countdownText.setText(countdownCount.toString());
+ LK.getSound('countdown').play();
+ countdownCount--;
+ countdownTimer = LK.setTimeout(doCountdown, 1000);
+ } else {
+ countdownText.setText('');
+ startInputPhase();
+ }
+ }
+ doCountdown();
+}
+function startInputPhase() {
+ gameState = 'input';
+ waitingForInput = true;
+ instructionText.setText('Say "Open the card!" or tap the card!');
+ promptText.setText('NOW!');
+ // Give player 3 seconds to respond
+ inputTimer = LK.setTimeout(function () {
+ if (waitingForInput) {
+ waitingForInput = false;
+ promptText.setText('Too slow! Try again...');
+ LK.setTimeout(function () {
+ if (gameState !== 'completed') {
+ resetForNextAttempt();
+ }
+ }, 2000);
+ }
+ }, 3000);
+}
+function handleCardOpen() {
+ if (!waitingForInput) return;
+ waitingForInput = false;
+ gameState = 'flipping';
+ if (inputTimer) {
+ LK.clearTimeout(inputTimer);
+ inputTimer = null;
+ }
+ instructionText.setText('Great job!');
+ promptText.setText('');
+ countdownText.setText('');
+ // Play success sound
+ LK.getSound('success').play();
+ // Flip the current card
+ cards[currentCardIndex].flipCard();
+ // Move to next card after delay
+ LK.setTimeout(function () {
+ currentCardIndex++;
+ if (currentCardIndex >= cards.length) {
+ // All cards opened
+ gameState = 'completed';
+ instructionText.setText('Amazing! All cards opened!');
+ // Celebrate with screen flash
+ LK.effects.flashScreen(0xFFD700, 2000);
+ // Scale all cards for celebration
+ for (var i = 0; i < cards.length; i++) {
+ tween(cards[i], {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 1000,
+ easing: tween.bounceOut
+ });
+ }
+ } else {
+ // Activate next card
+ cards[currentCardIndex].isActive = true;
+ tween(cards[currentCardIndex], {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ // Reset for next card
+ LK.setTimeout(resetForNextAttempt, 1500);
+ }
+ }, 2000);
+}
+function resetForNextAttempt() {
+ if (gameState === 'completed') return;
+ gameState = 'waiting';
+ instructionText.setText('Ready for the next card?');
+ promptText.setText('');
+ countdownText.setText('');
+ LK.setTimeout(function () {
+ if (gameState === 'waiting') {
+ startCountdown();
+ }
+ }, 2000);
+}
+// Voice detection
+var lastVoiceCheck = false;
+game.update = function () {
+ // Check for voice input during input phase
+ if (waitingForInput && facekit.volume > 0.3) {
+ if (!lastVoiceCheck) {
+ // Voice just started
+ handleCardOpen();
+ }
+ }
+ lastVoiceCheck = facekit.volume > 0.3;
+};
+// Touch input for starting the game
+game.down = function (x, y, obj) {
+ if (gameState === 'waiting' && currentCardIndex === 0 && !cards[0].isFlipped) {
+ startCountdown();
+ }
+};
+// Initialize the game
+initializeCards();
\ No newline at end of file