User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1272
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1286
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1272
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1286
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1286
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1272
User prompt
Please fix the bug: 'TypeError: catUpgrade.update is not a function' in or related to this line: 'catUpgrade.update();' Line Number: 1272
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'game.getChildByName is not a function' in or related to this line: 'var catPowerUpgrade = game.getChildByName("catPowerUpgrade");' Line Number: 1838
User prompt
Please fix the bug: 'game.getChildByName is not a function' in or related to this line: 'var catSpeedUpgrade = game.getChildByName("catSpeedUpgrade");' Line Number: 1835
User prompt
Please fix the bug: 'game.getChildByName is not a function' in or related to this line: 'var autoClickUpgrade = game.getChildByName("autoClickUpgrade"); // Assuming this exists' Line Number: 1831
User prompt
Please fix the bug: 'game.getChildByName is not a function' in or related to this line: 'var catUpgrade = game.getChildByName("catUpgrade"); // Assuming this exists' Line Number: 1826
User prompt
Please fix the bug: 'notificationArea is not defined' in or related to this line: 'notificationArea.x = 20; // Left edge with small margin' Line Number: 1816
User prompt
Please fix the bug: 'catStatusDisplay is not defined' in or related to this line: 'catStatusDisplay.x = 2048 - 150; // Move to right side' Line Number: 1812
User prompt
Please fix the bug: 'powerUpIndicator is not defined' in or related to this line: 'powerUpIndicator.x = 2048 - 150; // Move to right side' Line Number: 1809
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'LK.require is not a function' in or related to this line: 'var game = new LK.Game({' Line Number: 603
User prompt
Please fix the bug: 'LK.require is not a function' in or related to this line: 'var storage = LK.require('@upit/storage.v1');' Line Number: 605 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.cosmicCatGarden = gameState;' Line Number: 796 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'stringify')' in or related to this line: 'storage.setItem('cosmicCatGarden', JSON.stringify(gameState));' Line Number: 796 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'ReferenceError: storage is not defined' in or related to this line: 'return {' Line Number: 780 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'ReferenceError: storage is not defined' in or related to this line: 'storage.setItem('cosmicCatGarden', JSON.stringify(gameState));' Line Number: 791 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'RangeError: Maximum call stack size exceeded' in or related to this line: 'originalGameUpdate.apply(this, arguments);' Line Number: 1699
User prompt
Please fix the bug: 'RangeError: Maximum call stack size exceeded' in or related to this line: 'originalGameUpdate.apply(this, arguments);' Line Number: 1699
/**** * Plugins ****/ var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Add bird enemies to the game var Bird = Container.expand(function () { var self = Container.call(this); var birdGraphics = self.attachAsset('cat', { anchorX: 0.5, anchorY: 0.5, scale: 0.6 }); birdGraphics.tint = 0xFF0000; // Red tint for birds self.health = 20; self.speed = 1 + Math.random(); self.value = 10; self.update = function () { // Move toward nearest cat if (cats.length > 0) { var nearestCat = cats[0]; var minDist = 10000; cats.forEach(function (cat) { var dist = Math.sqrt(Math.pow(cat.x - self.x, 2) + Math.pow(cat.y - self.y, 2)); if (dist < minDist) { minDist = dist; nearestCat = cat; } }); // Move toward cat var dx = nearestCat.x - self.x; var dy = nearestCat.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { // Stop when close enough self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } // Check collision with cats if (dist < 50) { // Cat attacks bird self.health -= nearestCat.level; createSparkleEffect(self.x, self.y, 0xFF0000, 2); if (self.health <= 0) { // Bird defeated handleEnemyDefeat(self, self.value); game.removeChild(self); birds.splice(birds.indexOf(self), 1); } } } }; return self; }); // Cat class with enhanced features var Cat = Container.expand(function () { var self = Container.call(this); var catGraphics = self.attachAsset('cat', { anchorX: 0.5, anchorY: 0.5, scale: 0.8 }); self.level = 1; self.productionRate = 0.5; self.lastProductionTime = 0; // Level indicator var levelCircle = new Container(); var levelCircleGraphics = levelCircle.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 0.5 }); levelCircleGraphics.tint = 0x000000; levelCircle.x = 0; levelCircle.y = -catGraphics.height / 2 - 10; levelCircle.alpha = 0.7; self.addChild(levelCircle); var levelText = createGameText("Lvl " + self.level, { sizeFactor: 0.8, anchorX: 0.5, anchorY: 0.5, fill: 0xFFFFFF }); levelCircle.addChild(levelText); self.updateLevel = function (newLevel) { self.level = newLevel; updateTextProperties(levelText, { text: "Lvl " + self.level }); }; self.upgrade = function () { self.level++; self.productionRate *= 1.2; self.updateLevel(self.level); // Update level indicator levelCircleGraphics.tint = 0x000000; // Show level up effect var levelUpEffect = new Container(); var levelUpGraphics = levelUpEffect.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 1.5 }); levelUpGraphics.tint = 0xFFFFFF; levelUpEffect.x = 0; levelUpEffect.y = -catGraphics.height / 2 - 10; levelUpEffect.alpha = 1; self.addChild(levelUpEffect); // Animate level up effect var startTime = LK.ticks; levelUpEffect.update = function () { var elapsed = (LK.ticks - startTime) / 60; levelUpEffect.scale.set(1.5 - elapsed * 0.5); levelUpEffect.alpha = 1 - elapsed; if (elapsed >= 1) { self.removeChild(levelUpEffect); } }; }; self.update = function () { var currentTime = LK.ticks / 60; if (currentTime - self.lastProductionTime > 1) { sparkles += self.productionRate * self.level; self.lastProductionTime = currentTime; // Create sparkle effect if (Math.random() < 0.3) { createSparkleEffect(self.x, self.y); } } // Idle animation self.rotation = Math.sin(LK.ticks / 120) * 0.03; // Handle power-ups if (self.powerUps) { for (var type in self.powerUps) { if (self.powerUps[type] < LK.ticks) { // Power-up expired if (type === "speed") { self.speed /= 2; } else if (type === "attack") { self.level /= 2; } delete self.powerUps[type]; } else { // Show power-up indicator var color = type === "speed" ? 0x00FFFF : 0xFF0000; createSparkleEffect(self.x, self.y, color, 1); } } } }; return self; }); // Add a cat status display var CatStatusDisplay = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 3 }); bg.tint = 0x663300; bg.alpha = 0.7; var titleText = createGameText("Cat Status", { sizeFactor: 0.9, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = -fontSizeBase * 1.5; self.addChild(titleText); var countText = createGameText("Count: 0", { sizeFactor: 0.8 }); countText.anchor.set(0.5, 0); countText.y = -fontSizeBase * 0.5; self.addChild(countText); var powerText = createGameText("Power: 1.0", { sizeFactor: 0.8 }); powerText.anchor.set(0.5, 0); powerText.y = fontSizeBase * 0.5; self.addChild(powerText); self.update = function () { countText.text = "Count: " + cats.length; // Calculate average cat power var totalPower = 0; cats.forEach(function (cat) { totalPower += cat.level || 1; }); var avgPower = cats.length > 0 ? (totalPower / cats.length).toFixed(1) : "0.0"; powerText.text = "Avg Power: " + avgPower; }; return self; }); // Garden background var Garden = Container.expand(function () { var self = Container.call(this); var gardenGraphics = self.attachAsset('grass-back', { anchorX: 0.5, anchorY: 1, scale: 1.2 }); self.update = function () { // Subtle movement self.x += Math.sin(LK.ticks / 200) * 0.1; }; return self; }); // Add level indicator to the UI var LevelIndicator = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 3 }); bg.tint = 0x000000; bg.alpha = 0.7; var levelText = new Text2("Level " + playerLevel, { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); levelText.y = 10; self.addChild(levelText); var multiplierText = new Text2("x" + levelMultiplier.toFixed(1), { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFD700 }); multiplierText.anchor.set(0.5, 0); multiplierText.y = fontSizeBase * 2; self.addChild(multiplierText); self.update = function () { updateTextProperties(levelText, { text: "Level " + playerLevel }); updateTextProperties(multiplierText, { text: "x" + levelMultiplier.toFixed(1) }); }; return self; }); // Add a progress bar for the next level var LevelProgressBar = Container.expand(function () { var self = Container.call(this); // Background bar var bgBar = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.1 }); bgBar.tint = 0x333333; self.addChild(bgBar); // Progress bar var progressBar = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.1 }); progressBar.tint = 0x00FF00; self.progressBar = progressBar; self.addChild(progressBar); var labelText = createGameText("Next Level", { sizeFactor: 0.7 }); labelText.anchor.set(0.5, 1); labelText.y = -5; self.addChild(labelText); self.update = function () { // Calculate progress to next level (assuming 10 enemies per level) var enemiesForNextLevel = playerLevel * 10; var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel; var progress = currentLevelEnemies / enemiesForNextLevel; // Update progress bar progressBar.scale.x = progress * 2; // Scale the progress bar based on progress updateTextProperties(labelText, { text: "Next Level: " + currentLevelEnemies + "/" + enemiesForNextLevel }); }; return self; }); // Add level indicator to the game // Main garden area (clickable) var MainGarden = Container.expand(function () { var self = Container.call(this); var gardenGraphics = self.attachAsset('grass-front', { anchorX: 0.5, anchorY: 0.5, scale: 1.5 }); self.interactive = true; self.buttonMode = true; self.on('pointerdown', function (event) { sparkles += clickMultiplier; createSparkleEffect(event.data.global.x, event.data.global.y); // Play random sound on click if (Math.random() < 0.2) { var soundIndex = Math.floor(Math.random() * sounds.length); LK.getSound(sounds[soundIndex]).play(); } }); return self; }); // Add a notification area for game events var NotificationArea = Container.expand(function () { var self = Container.call(this); var messages = []; var maxMessages = 3; self.addMessage = function (message) { // Create new message text var messageText = createGameText(message, { sizeFactor: 0.7, fill: 0xFFFFFF }); messageText.anchor.set(0, 0); messageText.alpha = 1; self.addChild(messageText); // Add to messages array with creation time messages.push({ text: messageText, creationTime: LK.ticks }); // Position messages self.repositionMessages(); // Remove oldest if we exceed max if (messages.length > maxMessages) { var oldest = messages.shift(); self.removeChild(oldest.text); } }; self.repositionMessages = function () { for (var i = 0; i < messages.length; i++) { messages[i].text.y = i * fontSizeBase; } }; self.update = function () { // Fade out messages over time var messagesToRemove = []; messages.forEach(function (message) { var age = (LK.ticks - message.creationTime) / 60; // in seconds if (age > 5) { // Mark for removal if older than 5 seconds messagesToRemove.push(message); } else if (age > 3) { // Start fading after 3 seconds message.text.alpha = 1 - (age - 3) / 2; } }); // Remove old messages messagesToRemove.forEach(function (message) { var index = messages.indexOf(message); if (index !== -1) { messages.splice(index, 1); self.removeChild(message.text); } }); // Reposition remaining messages self.repositionMessages(); }; return self; }); // Add these new UI elements to the game // Add a power-up indicator var PowerUpIndicator = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 2 }); bg.tint = 0x0000FF; bg.alpha = 0.5; var titleText = createGameText("Power-ups", { sizeFactor: 0.9, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = -fontSizeBase; self.addChild(titleText); var activeText = createGameText("None Active", { sizeFactor: 0.8 }); activeText.anchor.set(0.5, 0); activeText.y = 0; self.addChild(activeText); self.update = function () { if (powerUps.length > 0) { activeText.text = powerUps.length + " Active"; } else { activeText.text = "None Active"; } }; return self; }); // Add a cat to the game // Sparkle counter display var SparkleCounter = Container.expand(function () { var self = Container.call(this); var counterText = new Text2("Sparkles: 0", { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF }); counterText.anchor.set(0, 0); self.addChild(counterText); var levelText = new Text2("Level: 1 (x1.0)", { fontFamily: "Arial", fontSize: fontSizeBase * 0.9, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.y = fontSizeBase * 1.5; self.addChild(levelText); self.update = function () { updateTextProperties(counterText, { text: "Sparkles: " + Math.floor(sparkles) }); updateTextProperties(levelText, { text: "Level: " + playerLevel + " (x" + levelMultiplier.toFixed(1) + ")" }); }; return self; }); // Add a stats panel to display game statistics var StatsPanel = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 4 }); bg.tint = 0x000000; bg.alpha = 0.7; var titleText = createGameText("Game Stats", { sizeFactor: 1, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = -fontSizeBase * 2; self.addChild(titleText); var enemiesText = createGameText("Enemies Defeated: 0", { sizeFactor: 0.8 }); enemiesText.anchor.set(0.5, 0); enemiesText.y = -fontSizeBase; self.addChild(enemiesText); var catsText = createGameText("Cats: 0", { sizeFactor: 0.8 }); catsText.anchor.set(0.5, 0); catsText.y = 0; self.addChild(catsText); var totalSparklesText = createGameText("Total Sparkles: 0", { sizeFactor: 0.8 }); totalSparklesText.anchor.set(0.5, 0); totalSparklesText.y = fontSizeBase; self.addChild(totalSparklesText); self.update = function () { enemiesText.text = "Enemies Defeated: " + enemiesDefeated; catsText.text = "Cats: " + cats.length; totalSparklesText.text = "Total Sparkles: " + Math.floor(totalSparklesEarned); }; return self; }); // Add UFO enemies var UFO = Container.expand(function () { var self = Container.call(this); var ufoGraphics = self.attachAsset('cat', { anchorX: 0.5, anchorY: 0.5, scale: 0.7 }); ufoGraphics.tint = 0x00FFFF; // Cyan tint for UFOs self.health = 40; self.speed = 0.7 + Math.random() * 0.5; self.value = 20; self.update = function () { // Similar to bird but with different behavior // Move in a more erratic pattern self.x += Math.sin(LK.ticks / 30) * self.speed; self.y += Math.cos(LK.ticks / 20) * self.speed; // Check collision with cats cats.forEach(function (cat) { var dist = Math.sqrt(Math.pow(cat.x - self.x, 2) + Math.pow(cat.y - self.y, 2)); if (dist < 60) { // Cat attacks UFO self.health -= cat.level; createSparkleEffect(self.x, self.y, 0x00FFFF, 1); if (self.health <= 0) { // UFO defeated handleEnemyDefeat(self, self.value); game.removeChild(self); ufos.splice(ufos.indexOf(self), 1); } } }); }; return self; }); // Add these variables to the game state // Enhanced sparkle effect with color options // Upgrade Button class var UpgradeButton = Container.expand(function (type, text, x, y) { var self = Container.call(this); var buttonGraphics = self.attachAsset('upgrade-button', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; var buttonText = new Text2(text, { fontFamily: "Arial", fontSize: fontSizeBase * 1.2, fill: 0xFFFFFF, align: 'center' }); buttonText.anchor.set(0.5, 0.5); // Position text in the center of the button buttonText.x = 0; buttonText.y = 0; self.addChild(buttonText); self.x = x; self.y = y; self.update = function () { // Update button text based on type if (self.type === "clickPower") { buttonText.text = "Click Power\nCost: " + Math.floor(upgrades.clickPower.cost); } else if (self.type === "autoCollect") { buttonText.text = "Auto Collect\nCost: " + Math.floor(upgrades.autoCollect.cost); } else if (self.type === "buyCat") { buttonText.text = "Buy Cat\nCost: " + Math.floor(upgrades.catCost); } else if (self.type === "upgradeCat") { var upgradeCost = 200 * playerLevel; buttonText.text = "Upgrade Cat\nCost: " + Math.floor(upgradeCost); // Update button appearance based on affordability if (cats.length > 0) { if (sparkles >= upgradeCost) { self.alpha = 1.0; } else { self.alpha = 0.7; } } else { buttonText.text = "No Cats"; self.alpha = 0.5; } } }; self.interactive = true; self.buttonMode = true; self.on('pointerdown', function () { if (self.type === "clickPower" && sparkles >= upgrades.clickPower.cost) { sparkles -= upgrades.clickPower.cost; upgrades.clickPower.level++; clickMultiplier *= 1.2; upgrades.clickPower.cost *= upgrades.clickPower.multiplier; LK.getSound('songbird1').play(); } else if (self.type === "autoCollect" && sparkles >= upgrades.autoCollect.cost) { sparkles -= upgrades.autoCollect.cost; upgrades.autoCollect.level++; autoSparkleRate += 0.5; upgrades.autoCollect.cost *= upgrades.autoCollect.multiplier; LK.getSound('songbird1').play(); } else if (self.type === "buyCat" && sparkles >= upgrades.catCost) { sparkles -= upgrades.catCost; addCat(); upgrades.catCost *= upgrades.catMultiplier; LK.getSound('wings1').play(); } }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Sky blue }); /**** * Game Code ****/ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) { return t; } var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) { return i; } throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var startButton = game.addChild(new UpgradeButton("start", "Start", 2048 - 150, 2732 - 100)); startButton.on('pointerdown', function () { // Reset game state sparkles = 0; totalSparklesEarned = 0; playerLevel = 1; levelMultiplier = 1; cats = []; birds = []; ufos = []; enemiesDefeated = 0; powerUps = []; // Add initial cat addCat(); // Start game logic game.update = function () { // Existing game update logic }; }); // Add a cat to the game // Game state variables var sparkles = 0; var totalSparklesEarned = 0; var sparkleRate = 1; var autoSparkleRate = 0; var clickMultiplier = 1; var cats = []; var playerLevel = 1; var levelMultiplier = 1; var lastSaveTime = Date.now(); var lastPlayTime = Date.now(); var achievements = { sparklesCollected: [{ threshold: 100, achieved: false, reward: 10 }, { threshold: 1000, achieved: false, reward: 50 }, { threshold: 10000, achieved: false, reward: 200 }], catsOwned: [{ threshold: 5, achieved: false, reward: 20 }, { threshold: 10, achieved: false, reward: 100 }, { threshold: 20, achieved: false, reward: 500 }], upgradesPurchased: [{ threshold: 5, achieved: false, reward: 30 }, { threshold: 15, achieved: false, reward: 150 }, { threshold: 30, achieved: false, reward: 600 }], catLevels: [{ threshold: 5, reward: 500, achieved: false }, { threshold: 10, reward: 1000, achieved: false }, { threshold: 20, reward: 2000, achieved: false }] }; var totalUpgradesPurchased = 0; var tutorialStep = 0; var tutorialComplete = false; var upgrades = { clickPower: { level: 1, cost: 10, multiplier: 1.5 }, autoCollect: { level: 0, cost: 50, multiplier: 2 }, catCost: 100, catMultiplier: 1.8 }; // Object pool for sparkle effects var sparklePool = []; var maxSparkles = 50; // Save game state function saveGame() { var gameState = { sparkles: sparkles, totalSparklesEarned: totalSparklesEarned, sparkleRate: sparkleRate, autoSparkleRate: autoSparkleRate, clickMultiplier: clickMultiplier, cats: cats.map(function (cat) { return { level: cat.level, productionRate: cat.productionRate, x: cat.x, y: cat.y }; }), playerLevel: playerLevel, levelMultiplier: levelMultiplier, lastSaveTime: Date.now(), achievements: achievements, totalUpgradesPurchased: totalUpgradesPurchased, tutorialComplete: tutorialComplete, upgrades: upgrades }; // Use the storage plugin instead of localStorage storage.cosmicCatGarden = { sparkles: gameState.sparkles, totalSparklesEarned: gameState.totalSparklesEarned, sparkleRate: gameState.sparkleRate, autoSparkleRate: gameState.autoSparkleRate, clickMultiplier: gameState.clickMultiplier, cats: gameState.cats.map(function (cat) { return { level: cat.level, productionRate: cat.productionRate, x: cat.x, y: cat.y }; }), playerLevel: gameState.playerLevel, levelMultiplier: gameState.levelMultiplier, lastSaveTime: gameState.lastSaveTime, achievements: gameState.achievements, totalUpgradesPurchased: gameState.totalUpgradesPurchased, tutorialComplete: gameState.tutorialComplete, upgrades: gameState.upgrades }; } // Load game state function loadGame() { try { var savedState = storage.getItem('cosmicCatGarden'); if (savedState) { var gameState = JSON.parse(savedState); // Restore basic variables sparkles = gameState.sparkles || 0; totalSparklesEarned = gameState.totalSparklesEarned || 0; sparkleRate = gameState.sparkleRate || 1; autoSparkleRate = gameState.autoSparkleRate || 0; clickMultiplier = gameState.clickMultiplier || 1; playerLevel = gameState.playerLevel || 1; levelMultiplier = gameState.levelMultiplier || 1; achievements = gameState.achievements || achievements; totalUpgradesPurchased = gameState.totalUpgradesPurchased || 0; tutorialComplete = gameState.tutorialComplete || false; upgrades = gameState.upgrades || upgrades; // Calculate offline progress var currentTime = Date.now(); var offlineTime = (currentTime - gameState.lastSaveTime) / 1000; // in seconds var offlineSparkles = 0; if (offlineTime > 0 && gameState.cats && gameState.cats.length > 0) { // Calculate sparkles earned while away var totalCatProduction = gameState.cats.reduce(function (total, cat) { return total + cat.productionRate * cat.level; }, 0); offlineSparkles = totalCatProduction * offlineTime; offlineSparkles += gameState.autoSparkleRate * offlineTime; // Apply level multiplier offlineSparkles *= gameState.levelMultiplier; // Add offline sparkles sparkles += offlineSparkles; totalSparklesEarned += offlineSparkles; // Show offline earnings notification showOfflineEarnings(offlineSparkles, offlineTime); } } } catch (e) { console.error("Error loading game:", e); // Initialize with default values if loading fails sparkles = 0; totalSparklesEarned = 0; playerLevel = 1; levelMultiplier = 1; } } // Show offline earnings notification function showOfflineEarnings(amount, time) { var notification = new Container(); var bg = notification.attachAsset('achievement-notification', {}); var titleText = new Text2("Welcome Back!", { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = 10; var messageText = new Text2("You earned " + Math.floor(amount) + " sparkles\nwhile away for " + Math.floor(time / 60) + " minutes", { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF, align: 'center' }); messageText.anchor.set(0.5, 0); messageText.y = 35; notification.addChild(titleText); notification.addChild(messageText); notification.x = 2048 / 2; notification.y = 2732 / 2; notification.alpha = 0; game.addChild(notification); // Animate in var startTime = LK.ticks; notification.update = function () { var elapsed = (LK.ticks - startTime) / 60; if (elapsed < 1) { notification.alpha = elapsed; } else if (elapsed < 5) { notification.alpha = 1; } else if (elapsed < 6) { notification.alpha = 6 - elapsed; } else { game.removeChild(notification); } }; } // Show achievement notification function showAchievement(title, description, reward) { var notification = new Container(); var bg = notification.attachAsset('achievement-notification', {}); var titleText = new Text2("Achievement: " + title, { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = 10; notification.addChild(titleText); var messageText = new Text2(description + "\nReward: " + reward + " sparkles", { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF, align: 'center' }); messageText.anchor.set(0.5, 0); messageText.y = fontSizeBase * 2; notification.addChild(messageText); // Position the notification in the center of the screen notification.x = 1024 / 2; notification.y = 2732 / 2 - bg.height / 2; game.addChild(notification); // Add animation and removal logic var startTime = LK.ticks; notification.update = function () { var elapsed = (LK.ticks - startTime) / 60; if (elapsed < 1) { notification.alpha = elapsed; } else if (elapsed < 5) { notification.alpha = 1; } else if (elapsed < 6) { notification.alpha = 6 - elapsed; } else { game.removeChild(notification); } }; } // Check achievements function checkAchievements() { // Check sparkles collected achievements achievements.sparklesCollected.forEach(function (achievement) { if (!achievement.achieved && totalSparklesEarned >= achievement.threshold) { achievement.achieved = true; sparkles += achievement.reward; totalSparklesEarned += achievement.reward; showAchievement("Sparkle Collector", "Collected " + achievement.threshold + " sparkles", achievement.reward); } }); // Check cats owned achievements achievements.catsOwned.forEach(function (achievement) { if (!achievement.achieved && cats.length >= achievement.threshold) { achievement.achieved = true; sparkles += achievement.reward; totalSparklesEarned += achievement.reward; showAchievement("Cat Collector", "Owned " + achievement.threshold + " cats", achievement.reward); } }); // Check upgrades purchased achievements achievements.upgradesPurchased.forEach(function (achievement) { if (!achievement.achieved && totalUpgradesPurchased >= achievement.threshold) { achievement.achieved = true; sparkles += achievement.reward; totalSparklesEarned += achievement.reward; showAchievement("Upgrade Master", "Purchased " + achievement.threshold + " upgrades", achievement.reward); } }); // Check cat level achievements var totalCatLevels = cats.reduce(function (sum, cat) { return sum + cat.level; }, 0); achievements.catLevels.forEach(function (achievement) { if (!achievement.achieved && totalCatLevels >= achievement.threshold) { achievement.achieved = true; sparkles += achievement.reward; totalSparklesEarned += achievement.reward; showAchievement("Cat Master", "Reached total cat level " + achievement.threshold, achievement.reward); } }); } // Check for level up function checkLevelUp() { var newLevel = Math.floor(Math.log(totalSparklesEarned / 100 + 1) / Math.log(1.5)) + 1; if (newLevel > playerLevel) { var oldLevel = playerLevel; playerLevel = newLevel; levelMultiplier = 1 + (playerLevel - 1) * 0.1; // Show level up notification showAchievement("Level Up!", "You reached level " + playerLevel, 0); // Random chance to upgrade a cat if (cats.length > 0 && Math.random() < 0.5) { var randomCat = cats[Math.floor(Math.random() * cats.length)]; randomCat.upgrade(); createSparkleEffect(randomCat.x, randomCat.y, 0xFFFFFF, 20); } } } // Tutorial system function showTutorial() { if (tutorialComplete) { return; } var tutorial = new Container(); var highlight = tutorial.attachAsset('tutorial-highlight', {}); var messageText = new Text2("", { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF, align: 'center', stroke: 0x000000, strokeThickness: 2 }); messageText.anchor.set(0.5, 0.5); tutorial.addChild(messageText); // Position based on tutorial step switch (tutorialStep) { case 0: // Click garden messageText.text = "Click on the garden\nto collect sparkles!"; tutorial.x = mainGarden.x; tutorial.y = mainGarden.y - 100; break; case 1: // Upgrade click power messageText.text = "Upgrade your click power\nto get more sparkles!"; tutorial.x = clickUpgrade.x; tutorial.y = clickUpgrade.y; break; case 2: // Buy a cat messageText.text = "Buy a cat to automatically\ngenerate sparkles!"; tutorial.x = catUpgrade.x; tutorial.y = catUpgrade.y; break; case 3: // Tutorial complete messageText.text = "Great job! Now keep\ncollecting sparkles!"; tutorial.x = 1024 / 2; tutorial.y = 300; tutorialComplete = true; break; } game.addChild(tutorial); // Animate var startTime = LK.ticks; tutorial.update = function () { var elapsed = (LK.ticks - startTime) / 60; highlight.scale.x = 1 + Math.sin(elapsed * 2) * 0.1; highlight.scale.y = 1 + Math.sin(elapsed * 2) * 0.1; if (elapsed > 10 || tutorialStep === 3 && elapsed > 5) { game.removeChild(tutorial); if (tutorialStep === 3) { saveGame(); } } }; } // Enhanced sparkle effect with color options function createSparkleEffect(x, y, color, count) { color = color || 0xFFD700; count = count || 1; for (var i = 0; i < count; i++) { var sparkle; // Use object pool if available if (sparklePool.length > 0) { sparkle = sparklePool.pop(); sparkle.x = x + (Math.random() * 60 - 30); sparkle.y = y + (Math.random() * 60 - 30); sparkle.alpha = 0.8; sparkle.scale.set(0.5 + Math.random() * 0.5); game.addChild(sparkle); } else { sparkle = new Container(); var sparkleGraphics = sparkle.attachAsset('sparkle', {}); sparkleGraphics.tint = color; sparkle.x = x + (Math.random() * 60 - 30); sparkle.y = y + (Math.random() * 60 - 30); sparkle.alpha = 0.8; sparkle.scale.set(0.5 + Math.random() * 0.5); game.addChild(sparkle); } // Add fade out animation without triggering save sparkle.update = function () { this.alpha -= 0.01; if (this.alpha <= 0) { game.removeChild(this); sparklePool.push(this); // Don't save game here - this was likely causing the error } }; } } // Add a cat to the game function addCat() { var cat = new Cat(); cat.x = 400 + Math.random() * 800; cat.y = 1800 + Math.random() * 500; game.addChild(cat); cats.push(cat); } // Initialize game elements var garden = game.addChild(new Garden()); garden.x = 1024 / 2; garden.y = 0; var mainGarden = game.addChild(new MainGarden()); mainGarden.x = 1024 / 2; mainGarden.y = 2732 / 2; var sparkleCounter = game.addChild(new SparkleCounter()); sparkleCounter.x = 1024 - 150; // Position in the right half of the screen sparkleCounter.y = 30; // Position 30 pixels from the top edge // Add level indicator to the game var levelIndicator = game.addChild(new LevelIndicator()); levelIndicator.x = 1024 - 150; // Position in the right half of the screen levelIndicator.y = 80; // Position below the SparkleCounter // Add upgrade buttons var clickUpgrade = game.addChild(new UpgradeButton("clickPower", "Click Power\nCost: 10", 0, 2732 - 150)); var autoUpgrade = game.addChild(new UpgradeButton("autoCollect", "Auto Collect\nCost: 50", 0, 2732 - 220)); var catUpgrade = game.addChild(new UpgradeButton("buyCat", "Buy Cat\nCost: 100", 0, 2732 - 290)); // Add initial cat addCat(); // Background sounds var sounds = ['cricket1', 'frog1', 'wings1', 'songbird1']; var currentAmbientSound = null; // Initialize random timers for ambient sounds sounds.forEach(function (soundId) { var sound = LK.getSound(soundId); var ambientSoundTimer = LK.setTimeout(function () { if (currentAmbientSound) { currentAmbientSound.stop(); } sound.play(); currentAmbientSound = sound; LK.setTimeout(function () { currentAmbientSound = null; }, sound.duration * 1000); ambientSoundTimer = LK.setTimeout(arguments.callee, Math.random() * 20000 + 30000); }, Math.random() * 20000 + 10000); }); // Add these variables to the game state var birds = []; var ufos = []; var enemiesDefeated = 0; var enemySpawnTimer = 0; var maxEnemies = 5; // Add enemy spawning to the game update loop game.update = function () { // Update all cats cats.forEach(function (cat) { cat.update(); }); // Update all birds birds.forEach(function (bird) { bird.update(); }); // Update all UFOs ufos.forEach(function (ufo) { ufo.update(); }); // Update all power-ups powerUps.forEach(function (powerUp) { powerUp.update(); }); // Update UI elements sparkleCounter.update(); clickUpgrade.update(); autoUpgrade.update(); catUpgrade.update(); // Auto-collect sparkles if (autoSparkleRate > 0) { sparkles += autoSparkleRate / 60; // Per frame rate } // Random sparkle effects if (Math.random() < 0.01 && cats.length > 0) { var randomCat = cats[Math.floor(Math.random() * cats.length)]; createSparkleEffect(randomCat.x, randomCat.y); } // Spawn enemies enemySpawnTimer++; if (enemySpawnTimer > 180 && birds.length + ufos.length < maxEnemies) { enemySpawnTimer = 0; // Spawn UFO every 5 levels if (playerLevel % 5 === 0 && Math.random() < 0.2) { spawnUFO(); } else { spawnBird(); } } // Check for special events checkSpecialEvents(); // Check achievements and level ups periodically if (LK.ticks % 300 === 0) { // Every 5 seconds (60 frames/second) checkAchievements(); checkLevelUp(); checkDailyBonus(); // Add daily bonus check } // Random cat upgrade chance if (Math.random() < 0.0001 && cats.length > 0) { // Very rare chance var randomCat = cats[Math.floor(Math.random() * cats.length)]; randomCat.upgrade(); createSparkleEffect(randomCat.x, randomCat.y, 0xFFFFFF, 20); showAchievement("Lucky Cat", randomCat.level + " level reached!", 0); } // Cat defense system catDefenseSystem(); // Check tutorials periodically if (LK.ticks % 180 === 0) { // Every 3 seconds checkTutorials(); } }; // Add enemy spawning functions function spawnBird() { var bird = new Bird(); // Spawn from edge of screen var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top bird.x = Math.random() * 1024; bird.y = 0; break; case 1: // Right bird.x = 1024; bird.y = Math.random() * 2732; break; case 2: // Bottom bird.x = Math.random() * 1024; bird.y = 2732; break; case 3: // Left bird.x = 0; bird.y = Math.random() * 2732; break; } game.addChild(bird); birds.push(bird); LK.getSound('wings1').play(); } function spawnUFO() { var ufo = new UFO(); // UFOs always spawn from top ufo.x = Math.random() * 1024; ufo.y = 0; game.addChild(ufo); ufos.push(ufo); LK.getSound('ufo1').play(); } // Add level indicator to the game var levelIndicator = game.addChild(new LevelIndicator()); levelIndicator.x = 2048 - levelIndicator.width - 20; // Position 20 pixels from the right edge levelIndicator.y = 80; // Position below the SparkleCounter // Play background music LK.playMusic('bgm1', { loop: true, fade: { start: 0, end: 0.02, duration: 4000 } }); // Add this function to handle enemy defeats function handleEnemyDefeat(enemy, value) { // Add sparkles based on enemy value sparkles += value * levelMultiplier; totalSparklesEarned += value * levelMultiplier; createSparkleEffect(enemy.x, enemy.y, 0xFFD700, value === 10 ? 10 : 15); // Chance to spawn power-up createPowerUp(enemy.x, enemy.y); // Increment enemy counter enemiesDefeated++; if (enemiesDefeated >= 10) { enemiesDefeated = 0; playerLevel++; levelMultiplier = 1 + (playerLevel - 1) * 0.1; showAchievement("Level Up!", "You reached level " + playerLevel, 0); } } // Add power-up variables var powerUps = []; var powerUpTypes = [{ type: "speed", color: 0x00FFFF, effect: function effect(cat) { cat.speed *= 2; } }, { type: "attack", color: 0xFF0000, effect: function effect(cat) { cat.level *= 2; } }]; // Create power-up function function createPowerUp(x, y) { if (Math.random() < 0.2) { // 20% chance to spawn power-up var powerUpType = powerUpTypes[Math.floor(Math.random() * powerUpTypes.length)]; var powerUp = new Container(); var powerUpGraphics = powerUp.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 0.7 }); powerUpGraphics.tint = powerUpType.color; powerUp.x = x; powerUp.y = y; powerUp.type = powerUpType.type; powerUp.effect = powerUpType.effect; powerUp.createdAt = LK.ticks; // Add to game and array game.addChild(powerUp); powerUps.push(powerUp); // Set timeout to remove if not collected powerUp.update = function () { // Check collision with cats cats.forEach(function (cat) { var dist = Math.sqrt(Math.pow(cat.x - powerUp.x, 2) + Math.pow(cat.y - powerUp.y, 2)); if (dist < 50) { // Apply power-up effect powerUpType.effect(cat); createSparkleEffect(cat.x, cat.y, powerUpType.color, 15); // Mark cat with power-up cat.powerUps = cat.powerUps || {}; cat.powerUps[powerUpType.type] = LK.ticks + 600; // 10 seconds (60fps * 10) // Remove power-up game.removeChild(powerUp); powerUps.splice(powerUps.indexOf(powerUp), 1); } }); // Remove if too old (10 seconds) if (LK.ticks - powerUp.createdAt > 600) { game.removeChild(powerUp); powerUps.splice(powerUps.indexOf(powerUp), 1); } }; } } // Add cat defense system function catDefenseSystem() { // Check for nearby enemies and defend cats.forEach(function (cat) { // Only cats level 2+ can defend if (cat.level >= 2) { // Check for nearby birds birds.forEach(function (bird) { var dist = Math.sqrt(Math.pow(cat.x - bird.x, 2) + Math.pow(cat.y - bird.y, 2)); if (dist < 150) { // Defense range // Attack bird based on cat level bird.health -= 0.1 * cat.level; // Visual effect createSparkleEffect(bird.x, bird.y, 0xFF0000, 3); // Sound effect if (Math.random() < 0.1) { LK.getSound('songbird1').play(); } } }); // Check for nearby UFOs ufos.forEach(function (ufo) { var dist = Math.sqrt(Math.pow(cat.x - ufo.x, 2) + Math.pow(cat.y - ufo.y, 2)); if (dist < 200) { // UFOs have larger detection range // Attack UFO based on cat level ufo.health -= 0.05 * cat.level; // UFOs are tougher // Visual effect createSparkleEffect(ufo.x, ufo.y, 0xFF0000, 3); } }); } }); } // Add daily bonus system var lastDailyBonusTime = 0; function checkDailyBonus() { var now = Date.now(); // Check if 24 hours have passed since last bonus if (now - lastDailyBonusTime > 24 * 60 * 60 * 1000) { // Calculate bonus based on player level var bonus = 100 * playerLevel; sparkles += bonus; totalSparklesEarned += bonus; // Show achievement notification showAchievement("Daily Bonus!", "You received " + bonus + " sparkles", bonus); // Update last bonus time lastDailyBonusTime = now; // Save this to game state saveGame(); } } // Add special event system var specialEvents = [{ name: "Sparkle Shower", chance: 0.0005, // Rare chance per update effect: function effect() { // Create lots of sparkles for (var i = 0; i < 50; i++) { createSparkleEffect(Math.random() * 1024, Math.random() * 2732, 0xFFD700, 5); } // Add bonus sparkles var bonus = 50 * playerLevel; sparkles += bonus; totalSparklesEarned += bonus; showAchievement("Sparkle Shower!", "You received " + bonus + " sparkles", bonus); } }, { name: "Cat Party", chance: 0.0003, // Very rare chance per update effect: function effect() { // All cats get temporary level boost cats.forEach(function (cat) { cat.powerUps = cat.powerUps || {}; cat.powerUps["party"] = LK.ticks + 600; // 10 seconds cat.oldLevel = cat.level; cat.level *= 2; createSparkleEffect(cat.x, cat.y, 0xFF00FF, 10); }); showAchievement("Cat Party!", "All cats are twice as productive", 0); } }]; function checkSpecialEvents() { specialEvents.forEach(function (event) { if (Math.random() < event.chance) { event.effect(); } }); } // Add cat upgrade button var catUpgradeButton = game.addChild(new UpgradeButton("upgradeCat", "Upgrade Cat\nCost: 200", 0, 2732 - 360)); var buttonText = new Text2("Upgrade Cat\nCost: 200", { fontFamily: "Arial", fontSize: 16, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); catUpgradeButton.addChild(buttonText); catUpgradeButton.update = function () { if (cats.length > 0) { var upgradeCost = 200 * playerLevel; buttonText.text = "Upgrade Cat\nCost: " + Math.floor(upgradeCost); // Update button appearance based on affordability if (sparkles >= upgradeCost) { this.alpha = 1.0; } else { this.alpha = 0.7; } } else { this.text.text = "No Cats"; this.alpha = 0.5; } }; // Add event handler for cat upgrade button catUpgradeButton.interactive = true; catUpgradeButton.buttonMode = true; catUpgradeButton.on('pointerdown', function () { if (cats.length > 0) { var upgradeCost = 200 * playerLevel; if (sparkles >= upgradeCost) { sparkles -= upgradeCost; // Find lowest level cat to upgrade var lowestCat = cats[0]; cats.forEach(function (cat) { if (cat.level < lowestCat.level) { lowestCat = cat; } }); // Upgrade the cat lowestCat.upgrade(); createSparkleEffect(lowestCat.x, lowestCat.y, 0xFFFFFF, 20); LK.getSound('songbird1').play(); } } }); // Add tutorial system var tutorialSteps = [{ message: "Welcome to Cat Garden! Click the garden to collect sparkles.", shown: false, condition: function condition() { return true; } // Show immediately }, { message: "Buy a cat to automatically collect sparkles for you!", shown: false, condition: function condition() { return sparkles >= 50; } // Show when player has 50 sparkles }, { message: "Cats will defend your garden from birds and UFOs!", shown: false, condition: function condition() { return cats.length >= 2; } // Show when player has 2 cats }, { message: "Upgrade cats to make them more powerful!", shown: false, condition: function condition() { return playerLevel >= 3; } // Show at player level 3 }]; function checkTutorials() { tutorialSteps.forEach(function (step) { if (!step.shown && step.condition()) { showAchievement("Tip", step.message, 0); step.shown = true; } }); } // Update font sizes to be 2% of screen height var fontSizeBase = Math.floor(2732 * 0.02); // 2% of screen height // Update existing text elements to use the new font size function updateFontSizes() { // Update SparkleCounter SparkleCounter = Container.expand(function () { var self = Container.call(this); var counterText = new Text2("Sparkles: 0", { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF }); counterText.anchor.set(0, 0); self.addChild(counterText); var levelText = new Text2("Level: 1 (x1.0)", { fontFamily: "Arial", fontSize: fontSizeBase * 0.9, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.y = fontSizeBase * 1.5; self.addChild(levelText); self.update = function () { counterText.text = "Sparkles: " + Math.floor(sparkles); levelText.text = "Level: " + playerLevel + " (x" + levelMultiplier.toFixed(1) + ")"; }; return self; }); // Update LevelIndicator LevelIndicator = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, scale: 3 }); bg.tint = 0x000000; bg.alpha = 0.7; var levelText = new Text2("Level " + playerLevel, { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF }); levelText.x = -fontSizeBase * 2; levelText.y = -fontSizeBase / 2; self.addChild(levelText); var multiplierText = new Text2("x" + levelMultiplier.toFixed(1), { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFD700 }); multiplierText.x = -fontSizeBase; multiplierText.y = fontSizeBase / 2; self.addChild(multiplierText); self.update = function () { levelText.text = "Level " + playerLevel; multiplierText.text = "x" + levelMultiplier.toFixed(1); }; return self; }); // Update UpgradeButton UpgradeButton = Container.expand(function (type, text, x, y) { var self = Container.call(this); var buttonGraphics = self.attachAsset('upgrade-button', {}); self.type = type; var buttonText = new Text2(text, { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF }); // Rest of the UpgradeButton code remains the same }); // Update showAchievement function showAchievement = function showAchievement(title, description, reward) { var notification = new Container(); var bg = notification.attachAsset('achievement-notification', {}); var titleText = new Text2("Achievement: " + title, { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF, fontWeight: 'bold' }); titleText.anchor.set(0.5, 0); titleText.y = 10; var messageText = new Text2(description + "\nReward: " + reward + " sparkles", { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF, align: 'center' }); // Rest of the showAchievement function remains the same }; // Update showOfflineEarnings function showOfflineEarnings = function showOfflineEarnings(amount, time) { var notification = new Container(); var bg = notification.attachAsset('achievement-notification', {}); var titleText = new Text2("Welcome Back!", { fontFamily: "Arial", fontSize: fontSizeBase, fill: 0xFFFFFF, fontWeight: 'bold' }); // Rest of the showOfflineEarnings function remains the same }; // Update showTutorial function showTutorial = function showTutorial() { if (tutorialComplete) { return; } var tutorial = new Container(); var highlight = tutorial.attachAsset('tutorial-highlight', {}); var messageText = new Text2("", { fontFamily: "Arial", fontSize: fontSizeBase * 0.8, fill: 0xFFFFFF, align: 'center', stroke: 0x000000, strokeThickness: 2 }); // Rest of the showTutorial function remains the same }; } // Call this function to update all font sizes updateFontSizes(); // Create a reusable function for creating text with consistent styling function createGameText(content) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var defaultOptions = { fontFamily: "Arial", fontSize: fontSizeBase * (options.sizeFactor || 1), fill: 0xFFFFFF, align: options.align || 'left', fontWeight: options.fontWeight || 'normal' }; return new Text2(content, _objectSpread(_objectSpread({}, defaultOptions), options)); } // Create a reusable function for attaching assets with common properties function attachGameAsset(container, assetName) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return container.attachAsset(assetName, {}); } // Create a reusable function for playing sounds with randomization function playGameSound(soundId) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var sound = LK.getSound(soundId); if (sound) { if (options.volume !== undefined) { sound.volume = options.volume; } sound.play(); } } // Create a reusable function for enemy spawning logic function spawnEnemy(type) { if (type === 'bird') { spawnBird(); } else if (type === 'ufo') { spawnUFO(); } } // Create a reusable function for checking conditions function checkCondition(condition, action) { if (condition()) { action(); } } // Enhanced text creation function with better positioning and sizing // Function to update text properties consistently function updateTextProperties(textObject) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (options.text !== undefined) { textObject.text = options.text; } if (options.fill !== undefined) { textObject.style.fill = options.fill; } if (options.fontSize !== undefined) { textObject.style.fontSize = options.fontSize; } if (options.alpha !== undefined) { textObject.alpha = options.alpha; } } // Add these new UI elements to the game with safe positioning var statsPanel = game.addChild(new StatsPanel()); statsPanel.x = 150; // Left side positioning statsPanel.y = 100; // Near top of screen var powerUpIndicator = game.addChild(new PowerUpIndicator()); // Add a separate timed save function that doesn't depend on sparkle cleanup var lastAutoSaveTime = Date.now(); function checkAutoSave() { var currentTime = Date.now(); // Save every 30 seconds if (currentTime - lastAutoSaveTime > 30000) { saveGame(); lastAutoSaveTime = currentTime; } } // Add the auto-save check to the game update loop checkAutoSave(); powerUpIndicator.x = 150; // Left side positioning powerUpIndicator.y = 250; // Below stats panel var catStatusDisplay = game.addChild(new CatStatusDisplay()); catStatusDisplay.x = 150; // Left side positioning catStatusDisplay.y = 400; // Below power-up indicator var levelProgressBar = game.addChild(new LevelProgressBar()); levelProgressBar.x = 512; // Center of screen (1024/2) levelProgressBar.y = 50; // Near top of screen var notificationArea = game.addChild(new NotificationArea()); notificationArea.x = 20; // Left edge with small margin notificationArea.y = 550; // Below other UI elements // Add safety checks to UI update functions to ensure elements stay in bounds function ensureInBounds(uiElement) { // Get canvas dimensions var canvasWidth = 1024; // Based on code context var canvasHeight = 2732; // Based on code context // Add padding var padding = 10; // Ensure x position is within bounds if (uiElement.x < padding) { uiElement.x = padding; } else if (uiElement.x > canvasWidth - padding) { uiElement.x = canvasWidth - padding; } // Ensure y position is within bounds if (uiElement.y < padding) { uiElement.y = padding; } else if (uiElement.y > canvasHeight - padding) { uiElement.y = canvasHeight - padding; } } // Update game update function to check bounds // Update UI elements statsPanel.update(); powerUpIndicator.update(); catStatusDisplay.update(); levelProgressBar.update(); notificationArea.update(); // Ensure all UI elements are within bounds ensureInBounds(statsPanel); ensureInBounds(powerUpIndicator); ensureInBounds(catStatusDisplay); ensureInBounds(levelProgressBar); ensureInBounds(notificationArea);
===================================================================
--- original.js
+++ change.js
@@ -770,9 +770,30 @@
tutorialComplete: tutorialComplete,
upgrades: upgrades
};
// Use the storage plugin instead of localStorage
- storage.cosmicCatGarden = gameState;
+ storage.cosmicCatGarden = {
+ sparkles: gameState.sparkles,
+ totalSparklesEarned: gameState.totalSparklesEarned,
+ sparkleRate: gameState.sparkleRate,
+ autoSparkleRate: gameState.autoSparkleRate,
+ clickMultiplier: gameState.clickMultiplier,
+ cats: gameState.cats.map(function (cat) {
+ return {
+ level: cat.level,
+ productionRate: cat.productionRate,
+ x: cat.x,
+ y: cat.y
+ };
+ }),
+ playerLevel: gameState.playerLevel,
+ levelMultiplier: gameState.levelMultiplier,
+ lastSaveTime: gameState.lastSaveTime,
+ achievements: gameState.achievements,
+ totalUpgradesPurchased: gameState.totalUpgradesPurchased,
+ tutorialComplete: gameState.tutorialComplete,
+ upgrades: gameState.upgrades
+ };
}
// Load game state
function loadGame() {
try {
an orange and white cat facing away from the camera. the cat is sitting straight up and looking up, ready to pounce. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
remove black box
fluffy translucent cloud. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
bright sun with wincing cartoon face and a black eye. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
a goofy ufo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
red gaming reticle. Minimal. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
sunny day, hilly landscape. there is an alien invasion taking place in the distance. cities burning.
large AUTUMN SHADES tree with sparse bunches of leaves. branches are exposed, but the tree is tough and old.. true-color, realistic, Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
glowing orange sphere. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
sideway view of a fighter jet. . . In-Game 2d asset. transparent background. horizontal. No shadows.
shiny purple and black attack ufo.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows