/****
* 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