/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { chaoStats: { age: 0, happiness: 50, hunger: 50, energy: 50, lastTimestamp: 0 }, chaoEvolution: "baby", chaoColor: 7399423, gardenItems: [] }); /**** * Classes ****/ var Chao = Container.expand(function () { var self = Container.call(this); // Default chao stats self.stats = storage.chaoStats || { age: 0, happiness: 50, hunger: 50, energy: 50, lastTimestamp: Date.now() }; self.evolution = storage.chaoEvolution || 'baby'; self.color = storage.chaoColor || 0x70e7ff; // Create chao body parts var body = self.attachAsset('chaoBody', { anchorX: 0.5, anchorY: 0.5, y: 10 }); var head = self.attachAsset('chaoHead', { anchorX: 0.5, anchorY: 0.5, y: -40 }); // Eyes var leftEye = self.attachAsset('chaoEyes', { anchorX: 0.5, anchorY: 0.5, x: -20, y: -45 }); var rightEye = self.attachAsset('chaoEyes', { anchorX: 0.5, anchorY: 0.5, x: 20, y: -45 }); // Set color body.tint = self.color; head.tint = self.color; // Movement properties self.targetX = self.x; self.targetY = self.y; self.moveSpeed = 2; self.idleTime = 0; self.idleThreshold = 180; // 3 seconds at 60fps self.isWalking = false; // Timers self.statDecayInterval = 600; // 10 seconds at 60fps self.statDecayCounter = 0; // Apply evolution appearance self.updateEvolution = function () { storage.chaoEvolution = self.evolution; storage.chaoColor = self.color; var scale = 0.7; // Baby scale if (self.evolution === 'child') { scale = 0.85; } else if (self.evolution === 'adult') { scale = 1.0; } tween(self, { scaleX: scale, scaleY: scale }, { duration: 1000, easing: tween.easeOut }); body.tint = self.color; head.tint = self.color; }; // Update Chao stats self.updateStats = function () { self.statDecayCounter++; if (self.statDecayCounter >= self.statDecayInterval) { self.statDecayCounter = 0; // Slowly decrease stats over time self.stats.hunger = Math.max(0, self.stats.hunger - 2); self.stats.happiness = Math.max(0, self.stats.happiness - 1); self.stats.energy = Math.max(0, self.stats.energy - 1); // Update UI updateStatsUI(); // Save stats storage.chaoStats = self.stats; } // Check if should evolve if (self.stats.age >= 20 && self.evolution === 'baby') { self.evolution = 'child'; self.updateEvolution(); LK.getSound('happy').play(); } else if (self.stats.age >= 50 && self.evolution === 'child') { self.evolution = 'adult'; self.updateEvolution(); LK.getSound('happy').play(); } }; // Feed the Chao self.feed = function (amount) { self.stats.hunger = Math.min(100, self.stats.hunger + amount); self.stats.energy = Math.min(100, self.stats.energy + amount / 2); storage.chaoStats = self.stats; updateStatsUI(); // Do happy animation self.doHappyAnimation(); }; // Pet the Chao self.pet = function () { self.stats.happiness = Math.min(100, self.stats.happiness + 10); storage.chaoStats = self.stats; updateStatsUI(); LK.getSound('pet').play(); self.doHappyAnimation(); }; // Happy animation self.doHappyAnimation = function () { // Jump up and down tween(self, { y: self.y - 20 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { y: self.y + 20 }, { duration: 300, easing: tween.easeIn }); } }); }; // Move Chao to random spot self.moveToRandomSpot = function () { // Set target to random position within garden bounds self.targetX = 300 + Math.random() * 1400; self.targetY = 600 + Math.random() * 500; self.isWalking = true; }; // Down event for petting self.down = function (x, y, obj) { self.pet(); }; // Update method called every frame self.update = function () { // Update stats self.updateStats(); // Handle movement if (self.isWalking) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.moveSpeed) { // Reached target self.x = self.targetX; self.y = self.targetY; self.isWalking = false; } else { // Move towards target self.x += dx / dist * self.moveSpeed; self.y += dy / dist * self.moveSpeed; } } else { // Handle idle behavior self.idleTime++; if (self.idleTime > self.idleThreshold) { self.idleTime = 0; // Random chance to move if (Math.random() < 0.3) { self.moveToRandomSpot(); } } } }; // Initialize evolution appearance self.updateEvolution(); return self; }); var ChaoEgg = Container.expand(function () { var self = Container.call(this); var eggGraphic = self.attachAsset('chaoEgg', { anchorX: 0.5, anchorY: 0.5 }); self.wobbling = false; self.hatchProgress = 0; self.hatchThreshold = 10; self.wobble = function () { if (self.wobbling) { return; } self.wobbling = true; tween(self, { rotation: 0.1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { rotation: -0.1 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { self.wobbling = false; self.rotation = 0; } }); } }); self.hatchProgress++; if (self.hatchProgress >= self.hatchThreshold) { self.hatch(); } }; self.hatch = function () { LK.getSound('hatch').play(); // Create animation for hatching tween(eggGraphic, { alpha: 0 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { // Hatch complete, spawn Chao createChao(); self.destroy(); } }); }; self.down = function (x, y, obj) { self.wobble(); }; return self; }); var Fruit = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'apple'; var color = 0xff5555; if (self.type === 'orange') { color = 0xff9933; } if (self.type === 'banana') { color = 0xffee44; } var fruitGraphic = self.attachAsset('fruit' + self.type.charAt(0).toUpperCase() + self.type.slice(1), { anchorX: 0.5, anchorY: 0.5 }); self.nutritionValue = 10; if (self.type === 'orange') { self.nutritionValue = 15; } if (self.type === 'banana') { self.nutritionValue = 20; } self.down = function (x, y, obj) { self.dragging = true; self.dragOffsetX = x - self.x; self.dragOffsetY = y - self.y; }; self.up = function (x, y, obj) { self.dragging = false; // Check if dropped on Chao if (self.intersects(chao)) { chao.feed(self.nutritionValue); self.destroy(); fruitBasket.removeFruit(self); LK.getSound('eat').play(); } }; return self; }); var FruitBasket = Container.expand(function () { var self = Container.call(this); self.fruits = []; // Setup UI elements var appleButton = self.attachAsset('fruitApple', { anchorX: 0.5, anchorY: 0.5, x: 0 }); var orangeButton = self.attachAsset('fruitOrange', { anchorX: 0.5, anchorY: 0.5, x: 60 }); var bananaButton = self.attachAsset('fruitBanana', { anchorX: 0.5, anchorY: 0.5, x: 120 }); // Interaction handlers appleButton.interactive = true; orangeButton.interactive = true; bananaButton.interactive = true; appleButton.down = function () { self.createFruit('apple'); }; orangeButton.down = function () { self.createFruit('orange'); }; bananaButton.down = function () { self.createFruit('banana'); }; // Create fruit self.createFruit = function (type) { var fruit = new Fruit(type); fruit.x = self.x + self.fruits.length * 20 % 100; fruit.y = self.y + 80; self.fruits.push(fruit); game.addChild(fruit); }; // Remove fruit from array self.removeFruit = function (fruit) { var index = self.fruits.indexOf(fruit); if (index !== -1) { self.fruits.splice(index, 1); } }; return self; }); var StatsBar = Container.expand(function (type) { var self = Container.call(this); self.type = type; var color = 0x44cc44; // Green for hunger if (self.type === 'happiness') { color = 0x44aaff; // Blue for happiness } else if (self.type === 'energy') { color = 0xffcc44; // Yellow for energy } var background = self.attachAsset('statusBg', { anchorX: 0, anchorY: 0.5 }); var bar = self.attachAsset('statusBar', { anchorX: 0, anchorY: 0.5, x: 10, tint: color }); var label = new Text2(self.type.charAt(0).toUpperCase() + self.type.slice(1), { size: 24, fill: 0x333333 }); label.anchor.set(0, 0.5); label.x = 15; self.addChild(label); self.setValue = function (value) { // Calculate width based on percentage var maxWidth = 380; var width = value / 100 * maxWidth; tween(bar, { width: width }, { duration: 300, easing: tween.easeOut }); }; return self; }); var Toy = Container.expand(function () { var self = Container.call(this); var toyGraphic = self.attachAsset('toy', { anchorX: 0.5, anchorY: 0.5 }); self.down = function (x, y, obj) { self.dragging = true; self.dragOffsetX = x - self.x; self.dragOffsetY = y - self.y; }; self.up = function (x, y, obj) { self.dragging = false; // Check if dropped on Chao if (self.intersects(chao)) { chao.stats.happiness = Math.min(100, chao.stats.happiness + 15); chao.stats.energy = Math.max(0, chao.stats.energy - 10); storage.chaoStats = chao.stats; updateStatsUI(); LK.getSound('happy').play(); chao.doHappyAnimation(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Create garden background var garden = game.addChild(LK.getAsset('garden', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 400 })); // Create pond var pond = game.addChild(LK.getAsset('pond', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 800 })); // UI Elements var titleText = new Text2('Chao Paradise', { size: 100, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); // Stats UI var hungerBar = new StatsBar('hunger'); hungerBar.x = 50; hungerBar.y = 200; game.addChild(hungerBar); var happinessBar = new StatsBar('happiness'); happinessBar.x = 50; happinessBar.y = 280; game.addChild(happinessBar); var energyBar = new StatsBar('energy'); energyBar.x = 50; energyBar.y = 360; game.addChild(energyBar); var ageText = new Text2('Age: 0 days', { size: 36, fill: 0xFFFFFF }); ageText.anchor.set(0, 0.5); ageText.x = 50; ageText.y = 440; game.addChild(ageText); // Update UI elements based on current stats function updateStatsUI() { if (!chao) { return; } hungerBar.setValue(chao.stats.hunger); happinessBar.setValue(chao.stats.happiness); energyBar.setValue(chao.stats.energy); ageText.setText('Age: ' + chao.stats.age + ' days'); // Game over if stats are too low for too long if (chao.stats.hunger <= 0 && chao.stats.happiness <= 0 && chao.stats.energy <= 0) { LK.showGameOver(); } } // Create food controls var fruitBasket = new FruitBasket(); fruitBasket.x = 1600; fruitBasket.y = 150; game.addChild(fruitBasket); // Create toy var toy = new Toy(); toy.x = 1700; toy.y = 250; game.addChild(toy); // Global variables var chao = null; var chaoEgg = null; var dragTarget = null; var dayCounter = 0; var dayTimer = 0; var dayLength = 1800; // 30 seconds at 60fps // Start with an egg or existing Chao based on storage function initializeChao() { if (!storage.chaoStats || storage.chaoStats.age === 0) { // New game, start with egg chaoEgg = new ChaoEgg(); chaoEgg.x = 2048 / 2; chaoEgg.y = 800; game.addChild(chaoEgg); } else { // Existing Chao, restore it createChao(); } } // Create a new Chao function createChao() { chao = new Chao(); chao.x = 2048 / 2; chao.y = 800; game.addChild(chao); // Update UI with current stats updateStatsUI(); } // Drag handlers game.down = function (x, y, obj) { if (obj && obj.down) { // Let the object handle its own down event return; } }; game.move = function (x, y, obj) { // Check all draggable items if (toy && toy.dragging) { toy.x = x - toy.dragOffsetX; toy.y = y - toy.dragOffsetY; } // Check fruits if (fruitBasket && fruitBasket.fruits) { for (var i = 0; i < fruitBasket.fruits.length; i++) { var fruit = fruitBasket.fruits[i]; if (fruit.dragging) { fruit.x = x - fruit.dragOffsetX; fruit.y = y - fruit.dragOffsetY; } } } }; game.up = function (x, y, obj) { // Handled by individual objects }; // Update game state each frame game.update = function () { // Handle day cycle dayTimer++; if (dayTimer >= dayLength) { dayTimer = 0; dayCounter++; // Increment Chao age once per day if (chao) { chao.stats.age++; storage.chaoStats = chao.stats; updateStatsUI(); } } }; // Initialize game initializeChao(); LK.playMusic('gardenTheme');
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,554 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ chaoStats: {
+ age: 0,
+ happiness: 50,
+ hunger: 50,
+ energy: 50,
+ lastTimestamp: 0
+ },
+ chaoEvolution: "baby",
+ chaoColor: 7399423,
+ gardenItems: []
+});
+
+/****
+* Classes
+****/
+var Chao = Container.expand(function () {
+ var self = Container.call(this);
+ // Default chao stats
+ self.stats = storage.chaoStats || {
+ age: 0,
+ happiness: 50,
+ hunger: 50,
+ energy: 50,
+ lastTimestamp: Date.now()
+ };
+ self.evolution = storage.chaoEvolution || 'baby';
+ self.color = storage.chaoColor || 0x70e7ff;
+ // Create chao body parts
+ var body = self.attachAsset('chaoBody', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: 10
+ });
+ var head = self.attachAsset('chaoHead', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: -40
+ });
+ // Eyes
+ var leftEye = self.attachAsset('chaoEyes', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: -20,
+ y: -45
+ });
+ var rightEye = self.attachAsset('chaoEyes', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 20,
+ y: -45
+ });
+ // Set color
+ body.tint = self.color;
+ head.tint = self.color;
+ // Movement properties
+ self.targetX = self.x;
+ self.targetY = self.y;
+ self.moveSpeed = 2;
+ self.idleTime = 0;
+ self.idleThreshold = 180; // 3 seconds at 60fps
+ self.isWalking = false;
+ // Timers
+ self.statDecayInterval = 600; // 10 seconds at 60fps
+ self.statDecayCounter = 0;
+ // Apply evolution appearance
+ self.updateEvolution = function () {
+ storage.chaoEvolution = self.evolution;
+ storage.chaoColor = self.color;
+ var scale = 0.7; // Baby scale
+ if (self.evolution === 'child') {
+ scale = 0.85;
+ } else if (self.evolution === 'adult') {
+ scale = 1.0;
+ }
+ tween(self, {
+ scaleX: scale,
+ scaleY: scale
+ }, {
+ duration: 1000,
+ easing: tween.easeOut
+ });
+ body.tint = self.color;
+ head.tint = self.color;
+ };
+ // Update Chao stats
+ self.updateStats = function () {
+ self.statDecayCounter++;
+ if (self.statDecayCounter >= self.statDecayInterval) {
+ self.statDecayCounter = 0;
+ // Slowly decrease stats over time
+ self.stats.hunger = Math.max(0, self.stats.hunger - 2);
+ self.stats.happiness = Math.max(0, self.stats.happiness - 1);
+ self.stats.energy = Math.max(0, self.stats.energy - 1);
+ // Update UI
+ updateStatsUI();
+ // Save stats
+ storage.chaoStats = self.stats;
+ }
+ // Check if should evolve
+ if (self.stats.age >= 20 && self.evolution === 'baby') {
+ self.evolution = 'child';
+ self.updateEvolution();
+ LK.getSound('happy').play();
+ } else if (self.stats.age >= 50 && self.evolution === 'child') {
+ self.evolution = 'adult';
+ self.updateEvolution();
+ LK.getSound('happy').play();
+ }
+ };
+ // Feed the Chao
+ self.feed = function (amount) {
+ self.stats.hunger = Math.min(100, self.stats.hunger + amount);
+ self.stats.energy = Math.min(100, self.stats.energy + amount / 2);
+ storage.chaoStats = self.stats;
+ updateStatsUI();
+ // Do happy animation
+ self.doHappyAnimation();
+ };
+ // Pet the Chao
+ self.pet = function () {
+ self.stats.happiness = Math.min(100, self.stats.happiness + 10);
+ storage.chaoStats = self.stats;
+ updateStatsUI();
+ LK.getSound('pet').play();
+ self.doHappyAnimation();
+ };
+ // Happy animation
+ self.doHappyAnimation = function () {
+ // Jump up and down
+ tween(self, {
+ y: self.y - 20
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ y: self.y + 20
+ }, {
+ duration: 300,
+ easing: tween.easeIn
+ });
+ }
+ });
+ };
+ // Move Chao to random spot
+ self.moveToRandomSpot = function () {
+ // Set target to random position within garden bounds
+ self.targetX = 300 + Math.random() * 1400;
+ self.targetY = 600 + Math.random() * 500;
+ self.isWalking = true;
+ };
+ // Down event for petting
+ self.down = function (x, y, obj) {
+ self.pet();
+ };
+ // Update method called every frame
+ self.update = function () {
+ // Update stats
+ self.updateStats();
+ // Handle movement
+ if (self.isWalking) {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < self.moveSpeed) {
+ // Reached target
+ self.x = self.targetX;
+ self.y = self.targetY;
+ self.isWalking = false;
+ } else {
+ // Move towards target
+ self.x += dx / dist * self.moveSpeed;
+ self.y += dy / dist * self.moveSpeed;
+ }
+ } else {
+ // Handle idle behavior
+ self.idleTime++;
+ if (self.idleTime > self.idleThreshold) {
+ self.idleTime = 0;
+ // Random chance to move
+ if (Math.random() < 0.3) {
+ self.moveToRandomSpot();
+ }
+ }
+ }
+ };
+ // Initialize evolution appearance
+ self.updateEvolution();
+ return self;
+});
+var ChaoEgg = Container.expand(function () {
+ var self = Container.call(this);
+ var eggGraphic = self.attachAsset('chaoEgg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.wobbling = false;
+ self.hatchProgress = 0;
+ self.hatchThreshold = 10;
+ self.wobble = function () {
+ if (self.wobbling) {
+ return;
+ }
+ self.wobbling = true;
+ tween(self, {
+ rotation: 0.1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(self, {
+ rotation: -0.1
+ }, {
+ duration: 300,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ self.wobbling = false;
+ self.rotation = 0;
+ }
+ });
+ }
+ });
+ self.hatchProgress++;
+ if (self.hatchProgress >= self.hatchThreshold) {
+ self.hatch();
+ }
+ };
+ self.hatch = function () {
+ LK.getSound('hatch').play();
+ // Create animation for hatching
+ tween(eggGraphic, {
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // Hatch complete, spawn Chao
+ createChao();
+ self.destroy();
+ }
+ });
+ };
+ self.down = function (x, y, obj) {
+ self.wobble();
+ };
+ return self;
+});
+var Fruit = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'apple';
+ var color = 0xff5555;
+ if (self.type === 'orange') {
+ color = 0xff9933;
+ }
+ if (self.type === 'banana') {
+ color = 0xffee44;
+ }
+ var fruitGraphic = self.attachAsset('fruit' + self.type.charAt(0).toUpperCase() + self.type.slice(1), {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.nutritionValue = 10;
+ if (self.type === 'orange') {
+ self.nutritionValue = 15;
+ }
+ if (self.type === 'banana') {
+ self.nutritionValue = 20;
+ }
+ self.down = function (x, y, obj) {
+ self.dragging = true;
+ self.dragOffsetX = x - self.x;
+ self.dragOffsetY = y - self.y;
+ };
+ self.up = function (x, y, obj) {
+ self.dragging = false;
+ // Check if dropped on Chao
+ if (self.intersects(chao)) {
+ chao.feed(self.nutritionValue);
+ self.destroy();
+ fruitBasket.removeFruit(self);
+ LK.getSound('eat').play();
+ }
+ };
+ return self;
+});
+var FruitBasket = Container.expand(function () {
+ var self = Container.call(this);
+ self.fruits = [];
+ // Setup UI elements
+ var appleButton = self.attachAsset('fruitApple', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0
+ });
+ var orangeButton = self.attachAsset('fruitOrange', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 60
+ });
+ var bananaButton = self.attachAsset('fruitBanana', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 120
+ });
+ // Interaction handlers
+ appleButton.interactive = true;
+ orangeButton.interactive = true;
+ bananaButton.interactive = true;
+ appleButton.down = function () {
+ self.createFruit('apple');
+ };
+ orangeButton.down = function () {
+ self.createFruit('orange');
+ };
+ bananaButton.down = function () {
+ self.createFruit('banana');
+ };
+ // Create fruit
+ self.createFruit = function (type) {
+ var fruit = new Fruit(type);
+ fruit.x = self.x + self.fruits.length * 20 % 100;
+ fruit.y = self.y + 80;
+ self.fruits.push(fruit);
+ game.addChild(fruit);
+ };
+ // Remove fruit from array
+ self.removeFruit = function (fruit) {
+ var index = self.fruits.indexOf(fruit);
+ if (index !== -1) {
+ self.fruits.splice(index, 1);
+ }
+ };
+ return self;
+});
+var StatsBar = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type;
+ var color = 0x44cc44; // Green for hunger
+ if (self.type === 'happiness') {
+ color = 0x44aaff; // Blue for happiness
+ } else if (self.type === 'energy') {
+ color = 0xffcc44; // Yellow for energy
+ }
+ var background = self.attachAsset('statusBg', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ var bar = self.attachAsset('statusBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 10,
+ tint: color
+ });
+ var label = new Text2(self.type.charAt(0).toUpperCase() + self.type.slice(1), {
+ size: 24,
+ fill: 0x333333
+ });
+ label.anchor.set(0, 0.5);
+ label.x = 15;
+ self.addChild(label);
+ self.setValue = function (value) {
+ // Calculate width based on percentage
+ var maxWidth = 380;
+ var width = value / 100 * maxWidth;
+ tween(bar, {
+ width: width
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ };
+ return self;
+});
+var Toy = Container.expand(function () {
+ var self = Container.call(this);
+ var toyGraphic = self.attachAsset('toy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.down = function (x, y, obj) {
+ self.dragging = true;
+ self.dragOffsetX = x - self.x;
+ self.dragOffsetY = y - self.y;
+ };
+ self.up = function (x, y, obj) {
+ self.dragging = false;
+ // Check if dropped on Chao
+ if (self.intersects(chao)) {
+ chao.stats.happiness = Math.min(100, chao.stats.happiness + 15);
+ chao.stats.energy = Math.max(0, chao.stats.energy - 10);
+ storage.chaoStats = chao.stats;
+ updateStatsUI();
+ LK.getSound('happy').play();
+ chao.doHappyAnimation();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Create garden background
+var garden = game.addChild(LK.getAsset('garden', {
+ anchorX: 0.5,
+ anchorY: 0,
+ x: 2048 / 2,
+ y: 400
+}));
+// Create pond
+var pond = game.addChild(LK.getAsset('pond', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 800
+}));
+// UI Elements
+var titleText = new Text2('Chao Paradise', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+titleText.anchor.set(0.5, 0);
+LK.gui.top.addChild(titleText);
+// Stats UI
+var hungerBar = new StatsBar('hunger');
+hungerBar.x = 50;
+hungerBar.y = 200;
+game.addChild(hungerBar);
+var happinessBar = new StatsBar('happiness');
+happinessBar.x = 50;
+happinessBar.y = 280;
+game.addChild(happinessBar);
+var energyBar = new StatsBar('energy');
+energyBar.x = 50;
+energyBar.y = 360;
+game.addChild(energyBar);
+var ageText = new Text2('Age: 0 days', {
+ size: 36,
+ fill: 0xFFFFFF
+});
+ageText.anchor.set(0, 0.5);
+ageText.x = 50;
+ageText.y = 440;
+game.addChild(ageText);
+// Update UI elements based on current stats
+function updateStatsUI() {
+ if (!chao) {
+ return;
+ }
+ hungerBar.setValue(chao.stats.hunger);
+ happinessBar.setValue(chao.stats.happiness);
+ energyBar.setValue(chao.stats.energy);
+ ageText.setText('Age: ' + chao.stats.age + ' days');
+ // Game over if stats are too low for too long
+ if (chao.stats.hunger <= 0 && chao.stats.happiness <= 0 && chao.stats.energy <= 0) {
+ LK.showGameOver();
+ }
+}
+// Create food controls
+var fruitBasket = new FruitBasket();
+fruitBasket.x = 1600;
+fruitBasket.y = 150;
+game.addChild(fruitBasket);
+// Create toy
+var toy = new Toy();
+toy.x = 1700;
+toy.y = 250;
+game.addChild(toy);
+// Global variables
+var chao = null;
+var chaoEgg = null;
+var dragTarget = null;
+var dayCounter = 0;
+var dayTimer = 0;
+var dayLength = 1800; // 30 seconds at 60fps
+// Start with an egg or existing Chao based on storage
+function initializeChao() {
+ if (!storage.chaoStats || storage.chaoStats.age === 0) {
+ // New game, start with egg
+ chaoEgg = new ChaoEgg();
+ chaoEgg.x = 2048 / 2;
+ chaoEgg.y = 800;
+ game.addChild(chaoEgg);
+ } else {
+ // Existing Chao, restore it
+ createChao();
+ }
+}
+// Create a new Chao
+function createChao() {
+ chao = new Chao();
+ chao.x = 2048 / 2;
+ chao.y = 800;
+ game.addChild(chao);
+ // Update UI with current stats
+ updateStatsUI();
+}
+// Drag handlers
+game.down = function (x, y, obj) {
+ if (obj && obj.down) {
+ // Let the object handle its own down event
+ return;
+ }
+};
+game.move = function (x, y, obj) {
+ // Check all draggable items
+ if (toy && toy.dragging) {
+ toy.x = x - toy.dragOffsetX;
+ toy.y = y - toy.dragOffsetY;
+ }
+ // Check fruits
+ if (fruitBasket && fruitBasket.fruits) {
+ for (var i = 0; i < fruitBasket.fruits.length; i++) {
+ var fruit = fruitBasket.fruits[i];
+ if (fruit.dragging) {
+ fruit.x = x - fruit.dragOffsetX;
+ fruit.y = y - fruit.dragOffsetY;
+ }
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ // Handled by individual objects
+};
+// Update game state each frame
+game.update = function () {
+ // Handle day cycle
+ dayTimer++;
+ if (dayTimer >= dayLength) {
+ dayTimer = 0;
+ dayCounter++;
+ // Increment Chao age once per day
+ if (chao) {
+ chao.stats.age++;
+ storage.chaoStats = chao.stats;
+ updateStatsUI();
+ }
+ }
+};
+// Initialize game
+initializeChao();
+LK.playMusic('gardenTheme');
\ No newline at end of file