User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'update')' in or related to this line: 'powerUpIndicator.update();' Line Number: 1278
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'update')' in or related to this line: 'statsPanel.update();' Line Number: 1275
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'update')' in or related to this line: 'statsPanel.update();' Line Number: 1275
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
User prompt
Please fix the bug: 'enemiesDefeated is not defined' in or related to this line: 'var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;' Line Number: 299
/****
* 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({
// No title, no description
// Always backgroundColor is black
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Create a wrapper for storage operations with fallback
var gameStorage = {
save: function save(key, data) {
try {
storage.setItem(key, JSON.stringify(data));
return true;
} catch (e) {
console.error("Error saving data:", e);
return false;
}
},
load: function load(key) {
try {
var data = storage.getItem(key);
return data ? JSON.parse(data) : null;
} catch (e) {
console.error("Error loading data:", e);
return null;
}
},
clear: function clear(key) {
try {
storage.removeItem(key);
return true;
} catch (e) {
console.error("Error clearing data:", e);
return false;
}
}
};
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 = [];
var enemiesDefeated = 0;
// 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 wrapper
return gameStorage.save('cosmicCatGarden', gameState);
}
// Load game state
function loadGame() {
var gameState = gameStorage.load('cosmicCatGarden');
if (gameState) {
// 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);
}
// Recreate cats from saved data
if (gameState.cats && gameState.cats.length > 0) {
// Clear existing cats
cats.forEach(function (cat) {
game.removeChild(cat);
});
cats = [];
// Recreate cats from saved data
gameState.cats.forEach(function (catData) {
var cat = addCat(catData.x, catData.y);
cat.level = catData.level || 1;
cat.productionRate = catData.productionRate || 0.5;
});
}
return true;
}
return false;
}
// Add a reset game function for testing or player resets
function resetGame() {
gameStorage.clear('cosmicCatGarden');
// Reset all game variables to initial values
sparkles = 0;
totalSparklesEarned = 0;
sparkleRate = 1;
autoSparkleRate = 0;
clickMultiplier = 1;
playerLevel = 1;
levelMultiplier = 1;
// Clear existing cats
cats.forEach(function (cat) {
game.removeChild(cat);
});
cats = [];
// Reset other game elements
birds.forEach(function (bird) {
game.removeChild(bird);
});
birds = [];
ufos.forEach(function (ufo) {
game.removeChild(ufo);
});
ufos = [];
// Reset achievements and upgrades
achievements = [];
totalUpgradesPurchased = 0;
tutorialComplete = false;
upgrades = [];
// Add initial cat
addCat();
return true;
}
// Improve the auto-save function with status indicator
var lastAutoSaveTime = Date.now();
var saveIndicator = null;
function createSaveIndicator() {
if (!saveIndicator) {
saveIndicator = new Container();
var saveText = createGameText("Saving...", {
sizeFactor: 0.7,
fill: 0xFFFFFF,
align: 'right'
});
saveText.anchor.set(1, 0);
saveIndicator.addChild(saveText);
saveIndicator.alpha = 0;
saveIndicator.x = 1024 - 20; // Right side of screen
saveIndicator.y = 20; // Top of screen
game.addChild(saveIndicator);
}
return saveIndicator;
}
function checkAutoSave() {
var currentTime = Date.now();
// Save every 30 seconds
if (currentTime - lastAutoSaveTime > 30000) {
// Show save indicator
var indicator = createSaveIndicator();
indicator.alpha = 1;
// Perform save
saveGame();
lastAutoSaveTime = currentTime;
// Fade out indicator
setTimeout(function () {
var fadeInterval = setInterval(function () {
indicator.alpha -= 0.05;
if (indicator.alpha <= 0) {
clearInterval(fadeInterval);
}
}, 50);
}, 1000);
}
}
// 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 level progress bar to the game
var levelProgressBar = game.addChild(new LevelProgressBar());
levelProgressBar.x = 1024 / 2; // Center horizontally
levelProgressBar.y = 130; // Position below level indicator
// 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));
if (catUpgrade) {
catUpgrade.x = clickUpgrade.x + buttonGap;
catUpgrade.y = clickUpgrade.y;
// Ensure the update method is properly defined for this instance
if (!catUpgrade.update) {
catUpgrade.update = function () {
// Update button text based on type
if (this.type === "buyCat") {
this.text.text = "Buy Cat\nCost: " + Math.floor(upgrades.catCost);
// Update button appearance based on affordability
if (sparkles >= upgrades.catCost) {
this.alpha = 1.0;
} else {
this.alpha = 0.7;
}
}
};
}
}
var autoClickUpgrade = game.addChild(new UpgradeButton("autoClick", "Auto Click\nCost: 50", 0, 2732 - 220));
autoClickUpgrade.x = clickUpgrade.x + buttonGap * 2;
autoClickUpgrade.y = clickUpgrade.y;
// Update any other buttons that might exist
var catSpeedUpgrade = game.addChild(new UpgradeButton("catSpeed", "Cat Speed\nCost: 150", 0, 2732 - 360));
catSpeedUpgrade.x = clickUpgrade.x;
catSpeedUpgrade.y = clickUpgrade.y - buttonGap;
var catPowerUpgrade = game.addChild(new UpgradeButton("catPower", "Cat Power\nCost: 200", 0, 2732 - 430));
catPowerUpgrade.x = clickUpgrade.x + buttonGap;
catPowerUpgrade.y = clickUpgrade.y - buttonGap;
// Update the ensureInBounds function to account for the new positions
function ensureInBounds(uiElement) {
// Get canvas dimensions
var canvasWidth = 2048; // Updated based on code context
var canvasHeight = 2732; // Based on code context
// Add padding
var padding = 20;
// 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
if (statsPanel) {
statsPanel.update();
}
if (powerUpIndicator) {
powerUpIndicator.update();
}
if (catStatusDisplay) {
catStatusDisplay.update();
}
levelProgressBar.update();
notificationArea.update();
// Ensure all UI elements are within bounds
ensureInBounds(statsPanel);
ensureInBounds(powerUpIndicator);
ensureInBounds(catStatusDisplay);
ensureInBounds(levelProgressBar);
ensureInBounds(notificationArea);
// 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 = 2048 - 150; // Move to right side of screen
statsPanel.y = 150; // Position below other top-right elements
// Reposition sparkle counter and level indicator to create a consolidated UI group
sparkleCounter.x = 2048 - 150; // Right side positioning
sparkleCounter.y = 30; // Top position
levelIndicator.x = 2048 - 150; // Right side positioning
levelIndicator.y = 80; // Position below sparkle counter
// Reposition other UI elements that were previously on the left
var powerUpIndicator = game.addChild(new PowerUpIndicator());
powerUpIndicator.x = 2048 - 150; // Move to right side
powerUpIndicator.y = 250; // Position below stats panel
var catStatusDisplay = game.addChild(new CatStatusDisplay());
catStatusDisplay.x = 2048 - 150; // Move to right side
catStatusDisplay.y = 350; // Position below power-up indicator
// Keep notification area on the left but adjust position
var notificationArea = game.addChild(new NotificationArea());
notificationArea.x = 20; // Left edge with small margin
notificationArea.y = 550; // Below other UI elements
// Increase gap between buttons at bottom left
// Assuming buttons are positioned sequentially
var buttonGap = 120; // Increased gap between buttons (was likely around 80-100)
// Reposition upgrade buttons with increased gaps
clickUpgrade.x = 150; // First button position
clickUpgrade.y = 2732 - 150;
// Position other buttons with the new gap
var catUpgrade = game.addChild(new UpgradeButton("buyCat", "Buy Cat\nCost: 100", 0, 2732 - 290));
if (catUpgrade) {
catUpgrade.x = clickUpgrade.x + buttonGap;
catUpgrade.y = clickUpgrade.y;
}
var autoClickUpgrade = game.addChild(new UpgradeButton("autoClick", "Auto Click\nCost: 50", 0, 2732 - 220));
autoClickUpgrade.x = clickUpgrade.x + buttonGap * 2;
autoClickUpgrade.y = clickUpgrade.y;
// Update any other buttons that might exist
var catSpeedUpgrade = game.addChild(new UpgradeButton("catSpeed", "Cat Speed\nCost: 150", 0, 2732 - 360));
catSpeedUpgrade.x = clickUpgrade.x;
catSpeedUpgrade.y = clickUpgrade.y - buttonGap;
var catPowerUpgrade = game.addChild(new UpgradeButton("catPower", "Cat Power\nCost: 200", 0, 2732 - 430));
catPowerUpgrade.x = clickUpgrade.x + buttonGap;
catPowerUpgrade.y = clickUpgrade.y - buttonGap;
// Update the ensureInBounds function to account for the new positions
// 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
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