/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
kittenAge: 0,
kittenHappiness: 50,
kittenHunger: 50,
lastFeedTime: 0
});
/****
* Classes
****/
var FoodBowl = Container.expand(function () {
var self = Container.call(this);
self.bowl = self.attachAsset('food_bowl', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Animate feeding
tween(self.bowl, {
scaleX: 1.2,
scaleY: 0.8
}, {
duration: 100,
onFinish: function onFinish() {
tween(self.bowl, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
if (kitten) {
kitten.feed();
}
};
return self;
});
var Kitten = Container.expand(function () {
var self = Container.call(this);
// Kitten properties
self.age = storage.kittenAge || 0; // 0=baby, 1=young, 2=adult
self.happiness = storage.kittenHappiness || 50;
self.hunger = storage.kittenHunger || 50;
self.isSleeping = false;
self.lastInteraction = Date.now();
// Visual elements
self.body = null;
self.sleepBubble = null;
self.hearts = [];
// Initialize kitten appearance
self.updateAppearance = function () {
if (self.body) {
self.removeChild(self.body);
}
var assetName = 'kitten_baby';
if (self.age === 1) assetName = 'kitten_young';else if (self.age === 2) assetName = 'kitten_adult';
self.body = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
};
// Show sleep indicator
self.showSleep = function () {
if (!self.sleepBubble) {
self.sleepBubble = self.attachAsset('sleep_bubble', {
anchorX: 0.5,
anchorY: 0.5,
y: -80,
alpha: 0
});
}
self.isSleeping = true;
tween(self.sleepBubble, {
alpha: 0.8
}, {
duration: 500
});
tween(self.body, {
scaleY: 0.8
}, {
duration: 1000,
easing: tween.easeInOut
});
};
// Wake up kitten
self.wakeUp = function () {
self.isSleeping = false;
if (self.sleepBubble) {
tween(self.sleepBubble, {
alpha: 0
}, {
duration: 300
});
}
tween(self.body, {
scaleY: 1
}, {
duration: 500,
easing: tween.bounceOut
});
LK.getSound('meow').play();
};
// Show happiness hearts
self.showHappiness = function () {
for (var i = 0; i < 3; i++) {
var heart = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: (i - 1) * 30,
y: -60,
alpha: 0,
scaleX: 0,
scaleY: 0
});
self.hearts.push(heart);
tween(heart, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(heart, {
alpha: 0,
y: heart.y - 50
}, {
duration: 1000,
onFinish: function onFinish() {
self.removeChild(heart);
var index = self.hearts.indexOf(heart);
if (index > -1) self.hearts.splice(index, 1);
}
});
}
});
}
};
// Pet interaction
self.pet = function () {
if (self.isSleeping) {
self.wakeUp();
return;
}
self.happiness = Math.min(100, self.happiness + 10);
self.lastInteraction = Date.now();
// Bounce animation
tween(self.body, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(self.body, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
}
});
self.showHappiness();
LK.getSound('purr').play();
// Save progress
storage.kittenHappiness = self.happiness;
};
// Feed interaction
self.feed = function () {
if (self.isSleeping) {
self.wakeUp();
return;
}
self.hunger = Math.min(100, self.hunger + 30);
self.happiness = Math.min(100, self.happiness + 5);
self.lastInteraction = Date.now();
// Growth check
if (self.age < 2 && self.hunger > 80) {
self.grow();
}
LK.getSound('eat').play();
storage.kittenHunger = self.hunger;
storage.kittenHappiness = self.happiness;
};
// Growth function
self.grow = function () {
if (self.age < 2) {
self.age++;
storage.kittenAge = self.age;
// Growth animation
tween(self.body, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
onFinish: function onFinish() {
self.updateAppearance();
tween(self.body, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
});
self.showHappiness();
LK.setScore(LK.getScore() + 100);
}
};
// Touch interaction
self.down = function (x, y, obj) {
self.pet();
};
// Initialize appearance
self.updateAppearance();
return self;
});
var ToyBall = Container.expand(function () {
var self = Container.call(this);
self.ball = self.attachAsset('toy_ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Bounce animation
tween(self.ball, {
y: self.ball.y - 30,
scaleX: 0.8,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.ball, {
y: 0,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut
});
}
});
if (kitten && !kitten.isSleeping) {
kitten.happiness = Math.min(100, kitten.happiness + 15);
kitten.showHappiness();
storage.kittenHappiness = kitten.happiness;
}
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0xFFE4E1 // Soft pink background
});
/****
* Game Code
****/
// Game variables
// Kitten assets for different growth stages
// Pink baby kitten
// Orange young kitten
// Brown adult cat
// Food and toy assets
// Blue food bowl
// Pink toy ball
// UI elements
// Love heart
// Sleep indicator
// Sound effects
var kitten;
var foodBowl;
var toyBall;
var happinessBar;
var hungerBar;
var instructionText;
// Create UI elements
var titleText = new Text2('My Kitten', {
size: 80,
fill: 0xFF69B4
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
var scoreText = new Text2('Love: 0', {
size: 60,
fill: 0x8B4513
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 140;
// Create status bars
happinessBar = new Text2('π 50/100', {
size: 50,
fill: 0x32CD32
});
happinessBar.anchor.set(0, 0);
LK.gui.topLeft.addChild(happinessBar);
happinessBar.x = 120;
happinessBar.y = 200;
hungerBar = new Text2('π½οΈ 50/100', {
size: 50,
fill: 0xFF4500
});
hungerBar.anchor.set(0, 0);
LK.gui.topLeft.addChild(hungerBar);
hungerBar.x = 120;
hungerBar.y = 270;
// Instructions
instructionText = new Text2('Tap your kitten to pet it!\nTap the food bowl to feed it!\nTap the toy to play!', {
size: 40,
fill: 0x4B0082
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
instructionText.y = -50;
// Create game objects
kitten = game.addChild(new Kitten());
kitten.x = 2048 / 2;
kitten.y = 2732 / 2;
foodBowl = game.addChild(new FoodBowl());
foodBowl.x = 2048 / 2 - 200;
foodBowl.y = 2732 / 2 + 300;
toyBall = game.addChild(new ToyBall());
toyBall.x = 2048 / 2 + 200;
toyBall.y = 2732 / 2 + 300;
// Game update loop
var lastStatusUpdate = 0;
var sleepTimer = 0;
game.update = function () {
var currentTime = Date.now();
// Update status every second
if (currentTime - lastStatusUpdate > 1000) {
lastStatusUpdate = currentTime;
// Decrease hunger and happiness over time
if (!kitten.isSleeping) {
kitten.hunger = Math.max(0, kitten.hunger - 0.5);
// If kitten is well-fed and happy, it might grow
if (kitten.hunger > 70 && kitten.happiness > 70 && Math.random() < 0.01) {
kitten.grow();
}
// Kitten gets sleepy if not interacted with for 10 seconds
if (currentTime - kitten.lastInteraction > 10000) {
sleepTimer++;
if (sleepTimer > 5 && !kitten.isSleeping) {
kitten.showSleep();
sleepTimer = 0;
}
} else {
sleepTimer = 0;
}
}
// Update UI
happinessBar.setText('π ' + Math.floor(kitten.happiness) + '/100');
hungerBar.setText('π½οΈ ' + Math.floor(kitten.hunger) + '/100');
scoreText.setText('Love: ' + LK.getScore());
// Change happiness bar color based on level
if (kitten.happiness > 70) {
happinessBar.fill = "#32CD32"; // Green
} else if (kitten.happiness > 30) {
happinessBar.fill = "#FFD700"; // Yellow
} else {
happinessBar.fill = "#FF6347"; // Red
}
// Change hunger bar color based on level
if (kitten.hunger > 70) {
hungerBar.fill = "#32CD32"; // Green
} else if (kitten.hunger > 30) {
hungerBar.fill = "#FFD700"; // Yellow
} else {
hungerBar.fill = "#FF4500"; // Red
}
// Update instruction text based on kitten age
var ageText = '';
if (kitten.age === 0) ageText = 'Baby Kitten';else if (kitten.age === 1) ageText = 'Young Cat';else ageText = 'Adult Cat';
instructionText.setText('Your ' + ageText + '\nTap to pet β’ Food bowl to feed β’ Toy to play');
// Save game state periodically
storage.kittenAge = kitten.age;
storage.kittenHappiness = kitten.happiness;
storage.kittenHunger = kitten.hunger;
storage.lastFeedTime = currentTime;
}
// Idle animations for kitten
if (LK.ticks % 180 === 0 && !kitten.isSleeping && Math.random() < 0.3) {
// Random small movements
tween(kitten, {
x: kitten.x + (Math.random() - 0.5) * 100,
y: kitten.y + (Math.random() - 0.5) * 50
}, {
duration: 2000,
easing: tween.easeInOut
});
}
// Toy ball idle animation
if (LK.ticks % 240 === 0) {
tween(toyBall, {
rotation: toyBall.rotation + Math.PI * 0.25
}, {
duration: 500
});
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
kittenAge: 0,
kittenHappiness: 50,
kittenHunger: 50,
lastFeedTime: 0
});
/****
* Classes
****/
var FoodBowl = Container.expand(function () {
var self = Container.call(this);
self.bowl = self.attachAsset('food_bowl', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Animate feeding
tween(self.bowl, {
scaleX: 1.2,
scaleY: 0.8
}, {
duration: 100,
onFinish: function onFinish() {
tween(self.bowl, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
});
if (kitten) {
kitten.feed();
}
};
return self;
});
var Kitten = Container.expand(function () {
var self = Container.call(this);
// Kitten properties
self.age = storage.kittenAge || 0; // 0=baby, 1=young, 2=adult
self.happiness = storage.kittenHappiness || 50;
self.hunger = storage.kittenHunger || 50;
self.isSleeping = false;
self.lastInteraction = Date.now();
// Visual elements
self.body = null;
self.sleepBubble = null;
self.hearts = [];
// Initialize kitten appearance
self.updateAppearance = function () {
if (self.body) {
self.removeChild(self.body);
}
var assetName = 'kitten_baby';
if (self.age === 1) assetName = 'kitten_young';else if (self.age === 2) assetName = 'kitten_adult';
self.body = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
};
// Show sleep indicator
self.showSleep = function () {
if (!self.sleepBubble) {
self.sleepBubble = self.attachAsset('sleep_bubble', {
anchorX: 0.5,
anchorY: 0.5,
y: -80,
alpha: 0
});
}
self.isSleeping = true;
tween(self.sleepBubble, {
alpha: 0.8
}, {
duration: 500
});
tween(self.body, {
scaleY: 0.8
}, {
duration: 1000,
easing: tween.easeInOut
});
};
// Wake up kitten
self.wakeUp = function () {
self.isSleeping = false;
if (self.sleepBubble) {
tween(self.sleepBubble, {
alpha: 0
}, {
duration: 300
});
}
tween(self.body, {
scaleY: 1
}, {
duration: 500,
easing: tween.bounceOut
});
LK.getSound('meow').play();
};
// Show happiness hearts
self.showHappiness = function () {
for (var i = 0; i < 3; i++) {
var heart = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
x: (i - 1) * 30,
y: -60,
alpha: 0,
scaleX: 0,
scaleY: 0
});
self.hearts.push(heart);
tween(heart, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
tween(heart, {
alpha: 0,
y: heart.y - 50
}, {
duration: 1000,
onFinish: function onFinish() {
self.removeChild(heart);
var index = self.hearts.indexOf(heart);
if (index > -1) self.hearts.splice(index, 1);
}
});
}
});
}
};
// Pet interaction
self.pet = function () {
if (self.isSleeping) {
self.wakeUp();
return;
}
self.happiness = Math.min(100, self.happiness + 10);
self.lastInteraction = Date.now();
// Bounce animation
tween(self.body, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(self.body, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
}
});
self.showHappiness();
LK.getSound('purr').play();
// Save progress
storage.kittenHappiness = self.happiness;
};
// Feed interaction
self.feed = function () {
if (self.isSleeping) {
self.wakeUp();
return;
}
self.hunger = Math.min(100, self.hunger + 30);
self.happiness = Math.min(100, self.happiness + 5);
self.lastInteraction = Date.now();
// Growth check
if (self.age < 2 && self.hunger > 80) {
self.grow();
}
LK.getSound('eat').play();
storage.kittenHunger = self.hunger;
storage.kittenHappiness = self.happiness;
};
// Growth function
self.grow = function () {
if (self.age < 2) {
self.age++;
storage.kittenAge = self.age;
// Growth animation
tween(self.body, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
onFinish: function onFinish() {
self.updateAppearance();
tween(self.body, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
}
});
self.showHappiness();
LK.setScore(LK.getScore() + 100);
}
};
// Touch interaction
self.down = function (x, y, obj) {
self.pet();
};
// Initialize appearance
self.updateAppearance();
return self;
});
var ToyBall = Container.expand(function () {
var self = Container.call(this);
self.ball = self.attachAsset('toy_ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
// Bounce animation
tween(self.ball, {
y: self.ball.y - 30,
scaleX: 0.8,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.ball, {
y: 0,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut
});
}
});
if (kitten && !kitten.isSleeping) {
kitten.happiness = Math.min(100, kitten.happiness + 15);
kitten.showHappiness();
storage.kittenHappiness = kitten.happiness;
}
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0xFFE4E1 // Soft pink background
});
/****
* Game Code
****/
// Game variables
// Kitten assets for different growth stages
// Pink baby kitten
// Orange young kitten
// Brown adult cat
// Food and toy assets
// Blue food bowl
// Pink toy ball
// UI elements
// Love heart
// Sleep indicator
// Sound effects
var kitten;
var foodBowl;
var toyBall;
var happinessBar;
var hungerBar;
var instructionText;
// Create UI elements
var titleText = new Text2('My Kitten', {
size: 80,
fill: 0xFF69B4
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
var scoreText = new Text2('Love: 0', {
size: 60,
fill: 0x8B4513
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 140;
// Create status bars
happinessBar = new Text2('π 50/100', {
size: 50,
fill: 0x32CD32
});
happinessBar.anchor.set(0, 0);
LK.gui.topLeft.addChild(happinessBar);
happinessBar.x = 120;
happinessBar.y = 200;
hungerBar = new Text2('π½οΈ 50/100', {
size: 50,
fill: 0xFF4500
});
hungerBar.anchor.set(0, 0);
LK.gui.topLeft.addChild(hungerBar);
hungerBar.x = 120;
hungerBar.y = 270;
// Instructions
instructionText = new Text2('Tap your kitten to pet it!\nTap the food bowl to feed it!\nTap the toy to play!', {
size: 40,
fill: 0x4B0082
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
instructionText.y = -50;
// Create game objects
kitten = game.addChild(new Kitten());
kitten.x = 2048 / 2;
kitten.y = 2732 / 2;
foodBowl = game.addChild(new FoodBowl());
foodBowl.x = 2048 / 2 - 200;
foodBowl.y = 2732 / 2 + 300;
toyBall = game.addChild(new ToyBall());
toyBall.x = 2048 / 2 + 200;
toyBall.y = 2732 / 2 + 300;
// Game update loop
var lastStatusUpdate = 0;
var sleepTimer = 0;
game.update = function () {
var currentTime = Date.now();
// Update status every second
if (currentTime - lastStatusUpdate > 1000) {
lastStatusUpdate = currentTime;
// Decrease hunger and happiness over time
if (!kitten.isSleeping) {
kitten.hunger = Math.max(0, kitten.hunger - 0.5);
// If kitten is well-fed and happy, it might grow
if (kitten.hunger > 70 && kitten.happiness > 70 && Math.random() < 0.01) {
kitten.grow();
}
// Kitten gets sleepy if not interacted with for 10 seconds
if (currentTime - kitten.lastInteraction > 10000) {
sleepTimer++;
if (sleepTimer > 5 && !kitten.isSleeping) {
kitten.showSleep();
sleepTimer = 0;
}
} else {
sleepTimer = 0;
}
}
// Update UI
happinessBar.setText('π ' + Math.floor(kitten.happiness) + '/100');
hungerBar.setText('π½οΈ ' + Math.floor(kitten.hunger) + '/100');
scoreText.setText('Love: ' + LK.getScore());
// Change happiness bar color based on level
if (kitten.happiness > 70) {
happinessBar.fill = "#32CD32"; // Green
} else if (kitten.happiness > 30) {
happinessBar.fill = "#FFD700"; // Yellow
} else {
happinessBar.fill = "#FF6347"; // Red
}
// Change hunger bar color based on level
if (kitten.hunger > 70) {
hungerBar.fill = "#32CD32"; // Green
} else if (kitten.hunger > 30) {
hungerBar.fill = "#FFD700"; // Yellow
} else {
hungerBar.fill = "#FF4500"; // Red
}
// Update instruction text based on kitten age
var ageText = '';
if (kitten.age === 0) ageText = 'Baby Kitten';else if (kitten.age === 1) ageText = 'Young Cat';else ageText = 'Adult Cat';
instructionText.setText('Your ' + ageText + '\nTap to pet β’ Food bowl to feed β’ Toy to play');
// Save game state periodically
storage.kittenAge = kitten.age;
storage.kittenHappiness = kitten.happiness;
storage.kittenHunger = kitten.hunger;
storage.lastFeedTime = currentTime;
}
// Idle animations for kitten
if (LK.ticks % 180 === 0 && !kitten.isSleeping && Math.random() < 0.3) {
// Random small movements
tween(kitten, {
x: kitten.x + (Math.random() - 0.5) * 100,
y: kitten.y + (Math.random() - 0.5) * 50
}, {
duration: 2000,
easing: tween.easeInOut
});
}
// Toy ball idle animation
if (LK.ticks % 240 === 0) {
tween(toyBall, {
rotation: toyBall.rotation + Math.PI * 0.25
}, {
duration: 500
});
}
};