/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Cat = Container.expand(function () {
var self = Container.call(this);
self.mood = 'happy';
self.lastResponse = '';
// Cat body
var body = self.attachAsset('cat_body', {
anchorX: 0.5,
anchorY: 1
});
// Cat head
var head = self.attachAsset('cat_head', {
anchorX: 0.5,
anchorY: 0.5
});
head.y = -200;
// Cat ears
var leftEar = self.attachAsset('cat_ear', {
anchorX: 0.5,
anchorY: 1
});
leftEar.x = -60;
leftEar.y = -280;
var rightEar = self.attachAsset('cat_ear', {
anchorX: 0.5,
anchorY: 1
});
rightEar.x = 60;
rightEar.y = -280;
// Cat eyes
var leftEye = self.attachAsset('cat_eye', {
anchorX: 0.5,
anchorY: 0.5
});
leftEye.x = -40;
leftEye.y = -220;
var rightEye = self.attachAsset('cat_eye', {
anchorX: 0.5,
anchorY: 0.5
});
rightEye.x = 40;
rightEye.y = -220;
// Cat nose
var nose = self.attachAsset('cat_nose', {
anchorX: 0.5,
anchorY: 0.5
});
nose.y = -180;
self.animate = function (type) {
if (type === 'happy') {
tween(head, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
easing: tween.easeOut
});
tween(head, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
LK.getSound('purr').play();
} else if (type === 'excited') {
tween(self, {
y: self.y - 20
}, {
duration: 200,
easing: tween.easeOut
});
tween(self, {
y: self.y
}, {
duration: 200,
easing: tween.easeIn
});
LK.getSound('meow1').play();
} else if (type === 'thinking') {
tween(head, {
rotation: 0.2
}, {
duration: 500,
easing: tween.easeInOut
});
tween(head, {
rotation: -0.2
}, {
duration: 500,
easing: tween.easeInOut
});
tween(head, {
rotation: 0
}, {
duration: 500,
easing: tween.easeInOut
});
}
};
self.respond = function (message) {
var response = generateResponse(message);
self.lastResponse = response;
// Determine animation based on message content
var lowerMsg = message.toLowerCase();
if (lowerMsg.includes('good') || lowerMsg.includes('nice') || lowerMsg.includes('love')) {
self.animate('happy');
} else if (lowerMsg.includes('play') || lowerMsg.includes('fun') || lowerMsg.includes('game')) {
self.animate('excited');
} else {
self.animate('thinking');
}
showChatBubble(response);
};
return self;
});
var ChatBubble = Container.expand(function () {
var self = Container.call(this);
var bubble = self.attachAsset('chat_bubble', {
anchorX: 0.5,
anchorY: 1
});
var text = new Text2('', {
size: 30,
fill: 0xFFFFFF
});
text.anchor.set(0.5, 0.5);
text.y = -50;
self.addChild(text);
self.alpha = 0;
self.show = function (message) {
text.setText(message);
// Adjust bubble size based on text length
var textWidth = text.width + 40;
var textHeight = text.height + 40;
bubble.width = Math.max(textWidth, 200);
bubble.height = Math.max(textHeight, 60);
self.alpha = 0;
tween(self, {
alpha: 1
}, {
duration: 300,
easing: tween.easeOut
});
LK.setTimeout(function () {
tween(self, {
alpha: 0
}, {
duration: 500,
easing: tween.easeIn
});
}, 3000);
};
return self;
});
var Key = Container.expand(function (letter, x, y) {
var self = Container.call(this);
self.letter = letter;
self.isPressed = false;
var keyBg = self.attachAsset('key_normal', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2(letter, {
size: 40,
fill: 0x2C3E50
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.x = x;
self.y = y;
self.press = function () {
if (self.isPressed) return;
self.isPressed = true;
keyBg.removeFromParent();
keyBg = self.attachAsset('key_pressed', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(keyBg, 0);
LK.getSound('keypress').play();
LK.setTimeout(function () {
self.release();
}, 150);
};
self.release = function () {
self.isPressed = false;
keyBg.removeFromParent();
keyBg = self.attachAsset('key_normal', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(keyBg, 0);
};
self.down = function (x, y, obj) {
self.press();
if (self.letter === 'SEND') {
sendMessage();
} else if (self.letter === 'DEL') {
deleteLastChar();
} else if (self.letter === 'SPACE') {
addToMessage(' ');
} else {
addToMessage(self.letter);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x85C1E9
});
/****
* Game Code
****/
var currentMessage = '';
var messageHistory = [];
var keys = [];
var cat;
var chatBubble;
var messageDisplay;
// Keyboard layout
var keyboardLayout = [['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'], ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'], ['Z', 'X', 'C', 'V', 'B', 'N', 'M', 'DEL'], ['SPACE', 'SEND']];
// Create keyboard background
var keyboardBg = game.attachAsset('keyboard_bg', {
anchorX: 0.5,
anchorY: 1
});
keyboardBg.x = 1024;
keyboardBg.y = 2732;
// Create keyboard keys
var startY = 2732 - 380;
for (var row = 0; row < keyboardLayout.length; row++) {
var rowKeys = keyboardLayout[row];
var keyY = startY + row * 90;
var totalWidth = rowKeys.length * 130;
var startX = (2048 - totalWidth) / 2 + 65;
for (var col = 0; col < rowKeys.length; col++) {
var keyX = startX + col * 130;
var key = new Key(rowKeys[col], keyX, keyY);
if (rowKeys[col] === 'SPACE') {
key.width = 300;
keyX = 1024;
key.x = keyX;
} else if (rowKeys[col] === 'SEND') {
keyX = 1024 + 200;
key.x = keyX;
}
keys.push(key);
game.addChild(key);
}
}
// Create cat
cat = new Cat();
cat.x = 1024;
cat.y = 1200;
game.addChild(cat);
// Create chat bubble
chatBubble = new ChatBubble();
chatBubble.x = 1024;
chatBubble.y = 800;
game.addChild(chatBubble);
// Create message display
messageDisplay = new Text2('Type a message...', {
size: 40,
fill: 0x2C3E50
});
messageDisplay.anchor.set(0.5, 0.5);
messageDisplay.x = 1024;
messageDisplay.y = 1400;
game.addChild(messageDisplay);
function addToMessage(_char) {
if (currentMessage.length < 50) {
currentMessage += _char;
updateMessageDisplay();
}
}
function deleteLastChar() {
if (currentMessage.length > 0) {
currentMessage = currentMessage.slice(0, -1);
updateMessageDisplay();
}
}
function updateMessageDisplay() {
if (currentMessage.length === 0) {
messageDisplay.setText('Type a message...');
messageDisplay.alpha = 0.6;
} else {
messageDisplay.setText(currentMessage);
messageDisplay.alpha = 1;
}
}
function sendMessage() {
if (currentMessage.length === 0) return;
messageHistory.push(currentMessage);
cat.respond(currentMessage);
currentMessage = '';
updateMessageDisplay();
}
function generateResponse(message) {
var lowerMsg = message.toLowerCase();
var responses = [];
if (lowerMsg.includes('hello') || lowerMsg.includes('hi')) {
responses = ['Meow! Hello there!', 'Hi! Nice to meet you!', 'Purr... hello friend!'];
} else if (lowerMsg.includes('how are you')) {
responses = ['I\'m purr-fect!', 'Feeling great, meow!', 'I\'m having a paw-some day!'];
} else if (lowerMsg.includes('play') || lowerMsg.includes('game')) {
responses = ['Let\'s play! Meow!', 'I love games! What shall we play?', 'Pounce! I\'m ready to play!'];
} else if (lowerMsg.includes('food') || lowerMsg.includes('eat')) {
responses = ['Yum! I love tuna!', 'Meow! Food sounds great!', 'Purr... I\'m always hungry!'];
} else if (lowerMsg.includes('love') || lowerMsg.includes('like')) {
responses = ['Aww, I love you too!', 'Purr purr purr!', 'You make me so happy!'];
} else if (lowerMsg.includes('cat') || lowerMsg.includes('kitty')) {
responses = ['Yes, I\'m your virtual kitty!', 'Meow! That\'s me!', 'I\'m the best cat ever!'];
} else if (lowerMsg.includes('sleep') || lowerMsg.includes('tired')) {
responses = ['Zzz... cats love naps!', 'I could sleep for 16 hours!', 'Time for a cat nap!'];
} else if (lowerMsg.includes('funny') || lowerMsg.includes('joke')) {
responses = ['Why don\'t cats play poker? Too many cheetahs!', 'What do you call a cat magician? Abra-ca-tabby!', 'Meow meow! That\'s funny!'];
} else {
responses = ['Meow! Tell me more!', 'Interesting! Purr...', 'I understand! Meow!', 'That\'s cool! Purr purr!', 'Fascinating! What else?'];
}
return responses[Math.floor(Math.random() * responses.length)];
}
function showChatBubble(message) {
chatBubble.show(message);
}
// Make cat blink occasionally
var blinkTimer = 0;
game.update = function () {
blinkTimer++;
if (blinkTimer % 180 === 0) {
// Every 3 seconds
cat.animate('thinking');
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Cat = Container.expand(function () {
var self = Container.call(this);
self.mood = 'happy';
self.lastResponse = '';
// Cat body
var body = self.attachAsset('cat_body', {
anchorX: 0.5,
anchorY: 1
});
// Cat head
var head = self.attachAsset('cat_head', {
anchorX: 0.5,
anchorY: 0.5
});
head.y = -200;
// Cat ears
var leftEar = self.attachAsset('cat_ear', {
anchorX: 0.5,
anchorY: 1
});
leftEar.x = -60;
leftEar.y = -280;
var rightEar = self.attachAsset('cat_ear', {
anchorX: 0.5,
anchorY: 1
});
rightEar.x = 60;
rightEar.y = -280;
// Cat eyes
var leftEye = self.attachAsset('cat_eye', {
anchorX: 0.5,
anchorY: 0.5
});
leftEye.x = -40;
leftEye.y = -220;
var rightEye = self.attachAsset('cat_eye', {
anchorX: 0.5,
anchorY: 0.5
});
rightEye.x = 40;
rightEye.y = -220;
// Cat nose
var nose = self.attachAsset('cat_nose', {
anchorX: 0.5,
anchorY: 0.5
});
nose.y = -180;
self.animate = function (type) {
if (type === 'happy') {
tween(head, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
easing: tween.easeOut
});
tween(head, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
LK.getSound('purr').play();
} else if (type === 'excited') {
tween(self, {
y: self.y - 20
}, {
duration: 200,
easing: tween.easeOut
});
tween(self, {
y: self.y
}, {
duration: 200,
easing: tween.easeIn
});
LK.getSound('meow1').play();
} else if (type === 'thinking') {
tween(head, {
rotation: 0.2
}, {
duration: 500,
easing: tween.easeInOut
});
tween(head, {
rotation: -0.2
}, {
duration: 500,
easing: tween.easeInOut
});
tween(head, {
rotation: 0
}, {
duration: 500,
easing: tween.easeInOut
});
}
};
self.respond = function (message) {
var response = generateResponse(message);
self.lastResponse = response;
// Determine animation based on message content
var lowerMsg = message.toLowerCase();
if (lowerMsg.includes('good') || lowerMsg.includes('nice') || lowerMsg.includes('love')) {
self.animate('happy');
} else if (lowerMsg.includes('play') || lowerMsg.includes('fun') || lowerMsg.includes('game')) {
self.animate('excited');
} else {
self.animate('thinking');
}
showChatBubble(response);
};
return self;
});
var ChatBubble = Container.expand(function () {
var self = Container.call(this);
var bubble = self.attachAsset('chat_bubble', {
anchorX: 0.5,
anchorY: 1
});
var text = new Text2('', {
size: 30,
fill: 0xFFFFFF
});
text.anchor.set(0.5, 0.5);
text.y = -50;
self.addChild(text);
self.alpha = 0;
self.show = function (message) {
text.setText(message);
// Adjust bubble size based on text length
var textWidth = text.width + 40;
var textHeight = text.height + 40;
bubble.width = Math.max(textWidth, 200);
bubble.height = Math.max(textHeight, 60);
self.alpha = 0;
tween(self, {
alpha: 1
}, {
duration: 300,
easing: tween.easeOut
});
LK.setTimeout(function () {
tween(self, {
alpha: 0
}, {
duration: 500,
easing: tween.easeIn
});
}, 3000);
};
return self;
});
var Key = Container.expand(function (letter, x, y) {
var self = Container.call(this);
self.letter = letter;
self.isPressed = false;
var keyBg = self.attachAsset('key_normal', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2(letter, {
size: 40,
fill: 0x2C3E50
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.x = x;
self.y = y;
self.press = function () {
if (self.isPressed) return;
self.isPressed = true;
keyBg.removeFromParent();
keyBg = self.attachAsset('key_pressed', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(keyBg, 0);
LK.getSound('keypress').play();
LK.setTimeout(function () {
self.release();
}, 150);
};
self.release = function () {
self.isPressed = false;
keyBg.removeFromParent();
keyBg = self.attachAsset('key_normal', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChildAt(keyBg, 0);
};
self.down = function (x, y, obj) {
self.press();
if (self.letter === 'SEND') {
sendMessage();
} else if (self.letter === 'DEL') {
deleteLastChar();
} else if (self.letter === 'SPACE') {
addToMessage(' ');
} else {
addToMessage(self.letter);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x85C1E9
});
/****
* Game Code
****/
var currentMessage = '';
var messageHistory = [];
var keys = [];
var cat;
var chatBubble;
var messageDisplay;
// Keyboard layout
var keyboardLayout = [['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'], ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'], ['Z', 'X', 'C', 'V', 'B', 'N', 'M', 'DEL'], ['SPACE', 'SEND']];
// Create keyboard background
var keyboardBg = game.attachAsset('keyboard_bg', {
anchorX: 0.5,
anchorY: 1
});
keyboardBg.x = 1024;
keyboardBg.y = 2732;
// Create keyboard keys
var startY = 2732 - 380;
for (var row = 0; row < keyboardLayout.length; row++) {
var rowKeys = keyboardLayout[row];
var keyY = startY + row * 90;
var totalWidth = rowKeys.length * 130;
var startX = (2048 - totalWidth) / 2 + 65;
for (var col = 0; col < rowKeys.length; col++) {
var keyX = startX + col * 130;
var key = new Key(rowKeys[col], keyX, keyY);
if (rowKeys[col] === 'SPACE') {
key.width = 300;
keyX = 1024;
key.x = keyX;
} else if (rowKeys[col] === 'SEND') {
keyX = 1024 + 200;
key.x = keyX;
}
keys.push(key);
game.addChild(key);
}
}
// Create cat
cat = new Cat();
cat.x = 1024;
cat.y = 1200;
game.addChild(cat);
// Create chat bubble
chatBubble = new ChatBubble();
chatBubble.x = 1024;
chatBubble.y = 800;
game.addChild(chatBubble);
// Create message display
messageDisplay = new Text2('Type a message...', {
size: 40,
fill: 0x2C3E50
});
messageDisplay.anchor.set(0.5, 0.5);
messageDisplay.x = 1024;
messageDisplay.y = 1400;
game.addChild(messageDisplay);
function addToMessage(_char) {
if (currentMessage.length < 50) {
currentMessage += _char;
updateMessageDisplay();
}
}
function deleteLastChar() {
if (currentMessage.length > 0) {
currentMessage = currentMessage.slice(0, -1);
updateMessageDisplay();
}
}
function updateMessageDisplay() {
if (currentMessage.length === 0) {
messageDisplay.setText('Type a message...');
messageDisplay.alpha = 0.6;
} else {
messageDisplay.setText(currentMessage);
messageDisplay.alpha = 1;
}
}
function sendMessage() {
if (currentMessage.length === 0) return;
messageHistory.push(currentMessage);
cat.respond(currentMessage);
currentMessage = '';
updateMessageDisplay();
}
function generateResponse(message) {
var lowerMsg = message.toLowerCase();
var responses = [];
if (lowerMsg.includes('hello') || lowerMsg.includes('hi')) {
responses = ['Meow! Hello there!', 'Hi! Nice to meet you!', 'Purr... hello friend!'];
} else if (lowerMsg.includes('how are you')) {
responses = ['I\'m purr-fect!', 'Feeling great, meow!', 'I\'m having a paw-some day!'];
} else if (lowerMsg.includes('play') || lowerMsg.includes('game')) {
responses = ['Let\'s play! Meow!', 'I love games! What shall we play?', 'Pounce! I\'m ready to play!'];
} else if (lowerMsg.includes('food') || lowerMsg.includes('eat')) {
responses = ['Yum! I love tuna!', 'Meow! Food sounds great!', 'Purr... I\'m always hungry!'];
} else if (lowerMsg.includes('love') || lowerMsg.includes('like')) {
responses = ['Aww, I love you too!', 'Purr purr purr!', 'You make me so happy!'];
} else if (lowerMsg.includes('cat') || lowerMsg.includes('kitty')) {
responses = ['Yes, I\'m your virtual kitty!', 'Meow! That\'s me!', 'I\'m the best cat ever!'];
} else if (lowerMsg.includes('sleep') || lowerMsg.includes('tired')) {
responses = ['Zzz... cats love naps!', 'I could sleep for 16 hours!', 'Time for a cat nap!'];
} else if (lowerMsg.includes('funny') || lowerMsg.includes('joke')) {
responses = ['Why don\'t cats play poker? Too many cheetahs!', 'What do you call a cat magician? Abra-ca-tabby!', 'Meow meow! That\'s funny!'];
} else {
responses = ['Meow! Tell me more!', 'Interesting! Purr...', 'I understand! Meow!', 'That\'s cool! Purr purr!', 'Fascinating! What else?'];
}
return responses[Math.floor(Math.random() * responses.length)];
}
function showChatBubble(message) {
chatBubble.show(message);
}
// Make cat blink occasionally
var blinkTimer = 0;
game.update = function () {
blinkTimer++;
if (blinkTimer % 180 === 0) {
// Every 3 seconds
cat.animate('thinking');
}
};