Code edit (2 edits merged)
Please save this source code
User prompt
ensure all objects are initialized, as well s the game itself
Code edit (2 edits merged)
Please save this source code
User prompt
add shapes for all images, etc.
User prompt
ensure all objects are visible, initialized, etc.
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Text is not a constructor' in or related to this line: 'var buttonText = new Text(text, {' Line Number: 771
Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Text is not a constructor' in or related to this line: 'var buttonText = new Text(text, {' Line Number: 771
Code edit (3 edits merged)
Please save this source code
User prompt
continue
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'levelProgressBar is not defined' in or related to this line: 'if (levelProgressBar && typeof levelProgressBar.update === 'function') {' Line Number: 1489
User prompt
Please fix the bug: 'statsPanel is not defined' in or related to this line: 'if (statsPanel && typeof statsPanel.update === 'function') {' Line Number: 1477
Code edit (2 edits merged)
Please save this source code
User prompt
Please fix the bug: 'checkSpecialEvents is not defined' in or related to this line: 'checkSpecialEvents();' Line Number: 1464
User prompt
Please fix the bug: 'checkSpecialEvents is not defined' in or related to this line: 'checkSpecialEvents();' Line Number: 1460
User prompt
Please fix the bug: 'checkSpecialEvents is not defined' in or related to this line: 'checkSpecialEvents();' Line Number: 1460
User prompt
refactor all font related code.
User prompt
Please fix the bug: 'checkSpecialEvents is not defined' in or related to this line: 'checkSpecialEvents();' Line Number: 1468
/**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // --- Global Variables --- /** * Cat Defender - Idle Game * * A game where cats automatically defend against incoming birds and UFOs. * Features idle point accumulation, upgrades, and progressive difficulty. */ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) { throw o; } } } }; } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) { return _arrayLikeToArray(r, a); } var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) { return Array.from(r); } } function _arrayWithoutHoles(r) { if (Array.isArray(r)) { return _arrayLikeToArray(r); } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) { n[e] = r[e]; } return n; } function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } function _get() { return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) { var p = _superPropBase(e, t); if (p) { var n = Object.getOwnPropertyDescriptor(p, t); return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value; } }, _get.apply(null, arguments); } function _superPropBase(t, o) { for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));) { ; } return t; } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) { return e; } if (void 0 !== e) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(t, e) { if ("function" != typeof e && null !== e) { throw new TypeError("Super expression must either be null or a function"); } t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } 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 _classCallCheck(a, n) { if (!(a instanceof n)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), 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 cats = []; var kittens = []; var birds = []; var ufos = []; var powerUps = []; var sparkles = []; // Game State Variables var score = 0; var level = 1; var multiplier = 1.0; // Starts at 1.0, increases by 0.1 per level var idlePoints = 0; var enemiesDefeated = 0; var lastUpdateTime = Date.now(); var idlePointsLastCalculated = Date.now(); // Game Constants var ENEMIES_PER_LEVEL = 10; var BASE_IDLE_POINTS_RATE = 0.5; // Points per cat per second var BIRD_POINTS = 10; var UFO_POINTS = 20; var BIRD_SPAWN_INTERVAL = 2000; // ms var UFO_SPAWN_INTERVAL = 15000; // ms var MAX_BIRDS = 10; var MAX_UFOS = 3; // Timers var birdSpawnTimer = 0; var ufoSpawnTimer = 0; // --- Utility Functions --- function distance(x1, y1, x2, y2) { var dx = x1 - x2; var dy = y1 - y2; return Math.sqrt(dx * dx + dy * dy); } // --- Game Classes --- /** * Base class for game entities */ var GameObject = /*#__PURE__*/function () { function GameObject(x, y, width, height, assetId) { _classCallCheck(this, GameObject); this.x = x; this.y = y; this.width = width; this.height = height; this.assetId = assetId; this.active = true; } return _createClass(GameObject, [{ key: "update", value: function update(deltaTime) { // Override in subclasses } }, { key: "render", value: function render() { if (!this.active) { return; } // Draw the sprite LK.drawImage(this.assetId, this.x, this.y, this.width, this.height); } }, { key: "isColliding", value: function isColliding(other) { return this.x < other.x + other.width && this.x + this.width > other.x && this.y < other.y + other.height && this.y + this.height > other.y; } }]); }(); /** * Base class for defenders (Cats and Kittens) */ var Defender = /*#__PURE__*/function (_GameObject) { function Defender(x, y, width, height, assetId, attackRange, attackCooldown, attackDamage, moveSpeed) { var _this; _classCallCheck(this, Defender); _this = _callSuper(this, Defender, [x, y, width, height, assetId]); _this.attackRange = attackRange; _this.attackCooldown = attackCooldown; _this.attackDamage = attackDamage; _this.moveSpeed = moveSpeed; _this.attackTimer = 0; _this.target = null; return _this; } _inherits(Defender, _GameObject); return _createClass(Defender, [{ key: "update", value: function update(deltaTime) { if (!this.active) { return; } // Handle attack cooldown if (this.attackTimer > 0) { this.attackTimer -= deltaTime; } // Find target if none exists if (!this.target || !this.target.active) { this.findTarget(); } // Move towards target or attack if (this.target) { var dist = distance(this.x + this.width / 2, this.y + this.height / 2, this.target.x + this.target.width / 2, this.target.y + this.target.height / 2); if (dist <= this.attackRange) { this.attack(); } else { this.moveTowardsTarget(deltaTime); } } } }, { key: "findTarget", value: function findTarget() { // Find closest enemy var closestDist = Infinity; var closest = null; // Check birds first for (var _i = 0, _birds = birds; _i < _birds.length; _i++) { var bird = _birds[_i]; if (!bird.active) { continue; } var dist = distance(this.x + this.width / 2, this.y + this.height / 2, bird.x + bird.width / 2, bird.y + bird.height / 2); if (dist < closestDist) { closestDist = dist; closest = bird; } } // Check UFOs if no birds found or if this is a kitten (kittens prefer UFOs) if ((!closest || this instanceof Kitten) && ufos.length > 0) { for (var _i2 = 0, _ufos = ufos; _i2 < _ufos.length; _i2++) { var ufo = _ufos[_i2]; if (!ufo.active) { continue; } var dist = distance(this.x + this.width / 2, this.y + this.height / 2, ufo.x + ufo.width / 2, ufo.y + ufo.height / 2); if (dist < closestDist) { closestDist = dist; closest = ufo; } } } this.target = closest; } }, { key: "moveTowardsTarget", value: function moveTowardsTarget(deltaTime) { if (!this.target) { return; } var targetX = this.target.x + this.target.width / 2; var targetY = this.target.y + this.target.height / 2; var dx = targetX - (this.x + this.width / 2); var dy = targetY - (this.y + this.height / 2); var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { var moveX = dx / dist * this.moveSpeed * deltaTime; var moveY = dy / dist * this.moveSpeed * deltaTime; this.x += moveX; this.y += moveY; } } }, { key: "attack", value: function attack() { if (this.attackTimer <= 0 && this.target && this.target.active) { this.target.takeDamage(this.attackDamage); this.attackTimer = this.attackCooldown; // Create attack effect createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack'); } } }]); }(GameObject); /** * Cat Class - Standard defender */ var Cat = /*#__PURE__*/function (_Defender) { function Cat(x, y) { _classCallCheck(this, Cat); return _callSuper(this, Cat, [x, y, 64, 64, 'cat', 100, 1.0, 2, 2]); } _inherits(Cat, _Defender); return _createClass(Cat); }(Defender); /** * Kitten Class - Faster but weaker defender */ var Kitten = /*#__PURE__*/function (_Defender2) { function Kitten(x, y) { _classCallCheck(this, Kitten); return _callSuper(this, Kitten, [x, y, 48, 48, 'kitten', 60, 0.5, 1, 3]); } _inherits(Kitten, _Defender2); return _createClass(Kitten); }(Defender); /** * Enemy base class */ var Enemy = /*#__PURE__*/function (_GameObject2) { function Enemy(x, y, width, height, assetId, health, speed, pointValue) { var _this2; _classCallCheck(this, Enemy); _this2 = _callSuper(this, Enemy, [x, y, width, height, assetId]); _this2.health = health; _this2.maxHealth = health; _this2.speed = speed; _this2.pointValue = pointValue; _this2.targetX = LK.canvas.width / 2; _this2.targetY = LK.canvas.height / 2; return _this2; } _inherits(Enemy, _GameObject2); return _createClass(Enemy, [{ key: "update", value: function update(deltaTime) { if (!this.active) { return; } // Move towards center var dx = this.targetX - (this.x + this.width / 2); var dy = this.targetY - (this.y + this.height / 2); var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 10) { // Not too close to center var moveX = dx / dist * this.speed * deltaTime; var moveY = dy / dist * this.speed * deltaTime; this.x += moveX; this.y += moveY; } else { // Reached center, remove this.active = false; } } }, { key: "takeDamage", value: function takeDamage(amount) { this.health -= amount; if (this.health <= 0) { this.defeat(); } } }, { key: "defeat", value: function defeat() { this.active = false; // Add points var pointsEarned = this.pointValue * multiplier; score += pointsEarned; enemiesDefeated++; // Check for level up if (enemiesDefeated >= ENEMIES_PER_LEVEL) { levelUp(); } // Create sparkles for (var i = 0; i < 5; i++) { createSparkle(this.x + Math.random() * this.width, this.y + Math.random() * this.height, 'defeat'); } // Chance to spawn power-up if (Math.random() < 0.2) { // 20% chance spawnPowerUp(this.x, this.y); } } }, { key: "render", value: function render() { _superPropGet(Enemy, "render", this, 3)([]); // Draw health bar var healthPercent = this.health / this.maxHealth; var barWidth = this.width * 0.8; var barHeight = 5; var barX = this.x + (this.width - barWidth) / 2; var barY = this.y - 10; // Background LK.setFillStyle('rgba(0,0,0,0.5)'); LK.fillRect(barX, barY, barWidth, barHeight); // Health LK.setFillStyle('rgba(255,50,50,0.8)'); LK.fillRect(barX, barY, barWidth * healthPercent, barHeight); } }]); }(GameObject); /** * Bird Class - Standard enemy */ var Bird = /*#__PURE__*/function (_Enemy) { function Bird() { _classCallCheck(this, Bird); // Random position at edge of screen var side = Math.floor(Math.random() * 4); var x, y; switch (side) { case 0: // Top x = Math.random() * LK.canvas.width; y = -50; break; case 1: // Right x = LK.canvas.width + 50; y = Math.random() * LK.canvas.height; break; case 2: // Bottom x = Math.random() * LK.canvas.width; y = LK.canvas.height + 50; break; case 3: // Left x = -50; y = Math.random() * LK.canvas.height; break; } return _callSuper(this, Bird, [x, y, 32, 32, 'bird', 3, 50, BIRD_POINTS]); } _inherits(Bird, _Enemy); return _createClass(Bird); }(Enemy); /** * UFO Class - Rare, stronger enemy */ var UFO = /*#__PURE__*/function (_Enemy2) { function UFO() { _classCallCheck(this, UFO); // Random position at edge of screen var side = Math.floor(Math.random() * 4); var x, y; switch (side) { case 0: // Top x = Math.random() * LK.canvas.width; y = -50; break; case 1: // Right x = LK.canvas.width + 50; y = Math.random() * LK.canvas.height; break; case 2: // Bottom x = Math.random() * LK.canvas.width; y = LK.canvas.height + 50; break; case 3: // Left x = -50; y = Math.random() * LK.canvas.height; break; } return _callSuper(this, UFO, [x, y, 64, 32, 'ufo', 10, 30, UFO_POINTS]); } _inherits(UFO, _Enemy2); return _createClass(UFO); }(Enemy); /** * PowerUp Class - Temporary boosts for defenders */ var PowerUp = /*#__PURE__*/function (_GameObject3) { function PowerUp(x, y) { var _this3; _classCallCheck(this, PowerUp); _this3 = _callSuper(this, PowerUp, [x, y, 30, 30, 'powerup']); // Define possible power-up types and their effects _this3.effects = { damage: { color: '#ff5555', duration: 10, multiplier: 2 }, speed: { color: '#55ff55', duration: 15, multiplier: 1.5 }, range: { color: '#5555ff', duration: 12, multiplier: 1.5 }, multi: { color: '#ffaa55', duration: 8, multiplier: 1 }, chain: { color: '#55ffff', duration: 10, multiplier: 1 }, shield: { color: '#aaaaff', duration: 20, multiplier: 1 }, heal: { color: '#ff55ff', duration: 0, multiplier: 1 }, time: { color: '#ffff55', duration: 5, multiplier: 0.5 } }; // Select random type var types = Object.keys(_this3.effects); _this3.type = types[Math.floor(Math.random() * types.length)]; // Set duration _this3.duration = 10; // seconds _this3.lifespan = 10; // seconds before disappearing if not collected return _this3; } _inherits(PowerUp, _GameObject3); return _createClass(PowerUp, [{ key: "update", value: function update(deltaTime) { if (!this.active) { return; } // Decrease lifespan this.lifespan -= deltaTime; if (this.lifespan <= 0) { this.active = false; return; } // Check for collision with defenders for (var _i3 = 0, _cats = cats; _i3 < _cats.length; _i3++) { var cat = _cats[_i3]; if (this.isColliding(cat)) { this.applyEffect(cat); this.active = false; return; } } for (var _i4 = 0, _kittens = kittens; _i4 < _kittens.length; _i4++) { var kitten = _kittens[_i4]; if (this.isColliding(kitten)) { this.applyEffect(kitten); this.active = false; return; } } // Floating animation this.y += Math.sin(Date.now() / 200) * 0.5; } }, { key: "applyEffect", value: function applyEffect(defender) { var _this4 = this; // Apply effect based on type switch (this.type) { case 'damage': defender.attackDamage *= this.effects.damage.multiplier; setTimeout(function () { defender.attackDamage /= _this4.effects.damage.multiplier; }, this.effects.damage.duration * 1000); break; case 'speed': defender.moveSpeed *= this.effects.speed.multiplier; setTimeout(function () { defender.moveSpeed /= _this4.effects.speed.multiplier; }, this.effects.speed.duration * 1000); break; case 'range': defender.attackRange *= this.effects.range.multiplier; setTimeout(function () { defender.attackRange /= _this4.effects.range.multiplier; }, this.effects.range.duration * 1000); break; case 'multi': // Create temporary multi-attack effect var originalAttack = defender.attack; defender.attack = function () { if (this.attackTimer <= 0 && this.target && this.target.active) { this.target.takeDamage(this.attackDamage); // Attack additional enemies var count = 0; for (var _i5 = 0, _arr = [].concat(_toConsumableArray(birds), _toConsumableArray(ufos)); _i5 < _arr.length; _i5++) { var enemy = _arr[_i5]; if (enemy !== this.target && enemy.active && count < 2) { var dist = distance(this.x + this.width / 2, this.y + this.height / 2, enemy.x + enemy.width / 2, enemy.y + enemy.height / 2); if (dist <= this.attackRange * 1.5) { enemy.takeDamage(this.attackDamage / 2); count++; // Create attack effect createSparkle(enemy.x + enemy.width / 2, enemy.y + enemy.height / 2, 'attack'); } } } this.attackTimer = this.attackCooldown; // Create attack effect createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack'); } }; setTimeout(function () { defender.attack = originalAttack; }, this.effects.multi.duration * 1000); break; case 'chain': // Create chain attack effect var chainAttack = defender.attack; defender.attack = function () { if (this.attackTimer <= 0 && this.target && this.target.active) { // Initial attack this.target.takeDamage(this.attackDamage); // Chain to nearby enemies var lastEnemy = this.target; var chainCount = 0; for (var _i6 = 0, _arr2 = [].concat(_toConsumableArray(birds), _toConsumableArray(ufos)); _i6 < _arr2.length; _i6++) { var enemy = _arr2[_i6]; if (enemy !== lastEnemy && enemy.active && chainCount < 3) { var dist = distance(lastEnemy.x + lastEnemy.width / 2, lastEnemy.y + lastEnemy.height / 2, enemy.x + enemy.width / 2, enemy.y + enemy.height / 2); if (dist <= 100) { enemy.takeDamage(this.attackDamage * 0.7); chainCount++; lastEnemy = enemy; // Create chain effect createSparkle(enemy.x + enemy.width / 2, enemy.y + enemy.height / 2, 'chain'); } } } this.attackTimer = this.attackCooldown; // Create attack effect createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack'); } }; setTimeout(function () { defender.attack = chainAttack; }, this.effects.chain.duration * 1000); break; case 'shield': // Create shield effect defender.shielded = true; setTimeout(function () { defender.shielded = false; }, this.effects.shield.duration * 1000); break; case 'heal': // Heal all defenders for (var _i7 = 0, _cats2 = cats; _i7 < _cats2.length; _i7++) { var cat = _cats2[_i7]; } // Cats don't have health in this game, but could add temporary invincibility for (var _i8 = 0, _kittens2 = kittens; _i8 < _kittens2.length; _i8++) { var kitten = _kittens2[_i8]; } // Kittens don't have health in this game, but could add temporary invincibility break; case 'time': // Slow down all enemies for (var _i9 = 0, _birds2 = birds; _i9 < _birds2.length; _i9++) { var bird = _birds2[_i9]; if (bird.active) { bird.speed *= this.effects.time.multiplier; } } for (var _i10 = 0, _ufos2 = ufos; _i10 < _ufos2.length; _i10++) { var ufo = _ufos2[_i10]; if (ufo.active) { ufo.speed *= this.effects.time.multiplier; } } setTimeout(function () { for (var _i11 = 0, _birds3 = birds; _i11 < _birds3.length; _i11++) { var bird = _birds3[_i11]; if (bird.active) { bird.speed /= _this4.effects.time.multiplier; } } for (var _i12 = 0, _ufos3 = ufos; _i12 < _ufos3.length; _i12++) { var ufo = _ufos3[_i12]; if (ufo.active) { ufo.speed /= _this4.effects.time.multiplier; } } }, this.effects.time.duration * 1000); break; } // Create collection effect for (var i = 0; i < 10; i++) { createSparkle(this.x + Math.random() * this.width, this.y + Math.random() * this.height, 'powerup'); } } }, { key: "render", value: function render() { if (!this.active) { return; } // Draw power-up background LK.setFillStyle(this.effects[this.type].color); LK.fillRect(this.x, this.y, this.width, this.height); // Draw icon this.drawPowerUpIcon(); // Pulsing effect based on remaining lifespan if (this.lifespan < 3) { var alpha = 0.5 + 0.5 * Math.sin(Date.now() / 100); LK.setFillStyle("rgba(255,255,255,".concat(alpha, ")")); LK.fillRect(this.x, this.y, this.width, this.height); } } // Helper method to convert hex color to RGB format }, { key: "hexToRgb", value: function hexToRgb(hex) { // Remove # if present hex = hex.replace('#', ''); // Parse the hex values var r = parseInt(hex.substring(0, 2), 16); var g = parseInt(hex.substring(2, 4), 16); var b = parseInt(hex.substring(4, 6), 16); return "".concat(r, ",").concat(g, ",").concat(b); } // Draw an icon representing the power-up type }, { key: "drawPowerUpIcon", value: function drawPowerUpIcon() { var centerX = this.x + this.width / 2; var centerY = this.y + this.height / 2; var iconSize = this.width / 6; LK.setFillStyle('white'); switch (this.type) { case 'damage': // Draw a plus symbol LK.fillRect(centerX - iconSize, centerY - iconSize / 3, iconSize * 2, iconSize * 2 / 3); LK.fillRect(centerX - iconSize / 3, centerY - iconSize, iconSize * 2 / 3, iconSize * 2); break; case 'speed': // Draw a lightning bolt LK.setStrokeStyle('white'); LK.beginPath(); LK.moveTo(centerX - iconSize, centerY - iconSize); LK.lineTo(centerX + iconSize / 2, centerY); LK.lineTo(centerX - iconSize / 2, centerY); LK.lineTo(centerX + iconSize, centerY + iconSize); LK.stroke(); break; case 'range': // Draw a circle LK.drawCircle(centerX, centerY, iconSize); LK.setFillStyle(this.effects[this.type].color); LK.drawCircle(centerX, centerY, iconSize / 2); break; case 'multi': // Draw multiple dots for (var i = 0; i < 3; i++) { var angle = i / 3 * Math.PI * 2; LK.drawCircle(centerX + Math.cos(angle) * iconSize, centerY + Math.sin(angle) * iconSize, iconSize / 2); } break; case 'chain': // Draw connected dots var points = [{ x: centerX - iconSize, y: centerY - iconSize }, { x: centerX, y: centerY }, { x: centerX + iconSize, y: centerY + iconSize }]; // Draw lines connecting points LK.setStrokeStyle('white'); LK.beginPath(); LK.moveTo(points[0].x, points[0].y); LK.lineTo(points[1].x, points[1].y); LK.lineTo(points[2].x, points[2].y); LK.stroke(); // Draw points for (var _i13 = 0, _points = points; _i13 < _points.length; _i13++) { var point = _points[_i13]; LK.drawCircle(point.x, point.y, iconSize / 3); } break; case 'shield': // Draw shield shape LK.setStrokeStyle('white'); LK.beginPath(); LK.moveTo(centerX, centerY - iconSize); LK.lineTo(centerX + iconSize, centerY - iconSize / 2); LK.lineTo(centerX + iconSize, centerY + iconSize / 2); LK.lineTo(centerX, centerY + iconSize); LK.lineTo(centerX - iconSize, centerY + iconSize / 2); LK.lineTo(centerX - iconSize, centerY - iconSize / 2); LK.lineTo(centerX, centerY - iconSize); LK.stroke(); break; case 'heal': // Draw plus symbol LK.fillRect(centerX - iconSize, centerY - iconSize / 4, iconSize * 2, iconSize / 2); LK.fillRect(centerX - iconSize / 4, centerY - iconSize, iconSize / 2, iconSize * 2); break; case 'time': // Draw clock symbol LK.drawCircle(centerX, centerY, iconSize); LK.setStrokeStyle('white'); LK.beginPath(); LK.moveTo(centerX, centerY); LK.lineTo(centerX, centerY - iconSize * 0.7); LK.moveTo(centerX, centerY); LK.lineTo(centerX + iconSize * 0.5, centerY); LK.stroke(); break; } } }]); }(GameObject); /** * Sparkle Class - Visual effects */ var Sparkle = /*#__PURE__*/function (_GameObject4) { function Sparkle(x, y, type) { var _this5; _classCallCheck(this, Sparkle); _this5 = _callSuper(this, Sparkle, [x, y, 10, 10, 'sparkle']); _this5.type = type || 'defeat'; // defeat, attack, powerup _this5.lifespan = 0.5; // seconds _this5.velocity = { x: (Math.random() - 0.5) * 100, y: (Math.random() - 0.5) * 100 }; // Set color based on type switch (_this5.type) { case 'defeat': _this5.color = "rgba(255,255,".concat(Math.floor(Math.random() * 100) + 155, ",0.8)"); break; case 'attack': _this5.color = "rgba(255,".concat(Math.floor(Math.random() * 100) + 100, ",100,0.8)"); break; case 'powerup': _this5.color = "rgba(".concat(Math.floor(Math.random() * 155) + 100, ",").concat(Math.floor(Math.random() * 155) + 100, ",255,0.8)"); break; case 'chain': _this5.color = "rgba(100,255,".concat(Math.floor(Math.random() * 155) + 100, ",0.8)"); break; default: _this5.color = "rgba(255,255,255,0.8)"; } return _this5; } _inherits(Sparkle, _GameObject4); return _createClass(Sparkle, [{ key: "update", value: function update(deltaTime) { if (!this.active) { return; } // Update position this.x += this.velocity.x * deltaTime; this.y += this.velocity.y * deltaTime; // Decrease lifespan this.lifespan -= deltaTime; if (this.lifespan <= 0) { this.active = false; } } }, { key: "render", value: function render() { if (!this.active) { return; } // Draw sparkle var alpha = this.lifespan * 2; // Fade out LK.setFillStyle(this.color.replace('0.8', alpha)); LK.fillRect(this.x, this.y, this.width, this.height); } }]); }(GameObject); // --- Game Functions --- // Create a sparkle effect function createSparkle(x, y, type) { var sparkle = new Sparkle(x, y, type); sparkles.push(sparkle); return sparkle; } // Spawn a power-up function spawnPowerUp(x, y) { var powerUp = new PowerUp(x, y); powerUps.push(powerUp); return powerUp; } // Level up function function levelUp() { level++; multiplier = 1.0 + (level - 1) * 0.1; // Create level up effect var centerX = LK.canvas.width / 2; var centerY = LK.canvas.height / 2; // Create sparkles for level up effect for (var i = 0; i < 20; i++) { createSparkle(centerX + (Math.random() - 0.5) * 200, centerY + (Math.random() - 0.5) * 200, 'powerup'); } // Reset enemy counter enemiesDefeated = 0; } // Calculate idle points function calculateIdlePoints() { var currentTime = Date.now(); var elapsedSeconds = (currentTime - idlePointsLastCalculated) / 1000; // Calculate points based on cats and kittens var pointsPerSecond = cats.length * BASE_IDLE_POINTS_RATE; pointsPerSecond += kittens.length * (BASE_IDLE_POINTS_RATE * 0.6); // Kittens generate 60% of cat rate // Apply level multiplier pointsPerSecond *= multiplier; // Add points var pointsEarned = pointsPerSecond * elapsedSeconds; idlePoints += pointsEarned; score += pointsEarned; // Update last calculation time idlePointsLastCalculated = currentTime; return pointsEarned; } // Spawn a new cat function spawnCat(x, y) { if (idlePoints >= 50) { // Cost to spawn a cat idlePoints -= 50; var cat = new Cat(x, y); cats.push(cat); return cat; } return null; } // Spawn a new kitten function spawnKitten(x, y) { if (idlePoints >= 30) { // Cost to spawn a kitten idlePoints -= 30; var kitten = new Kitten(x, y); kittens.push(kitten); return kitten; } return null; } // Update game state function updateGame(deltaTime) { // Calculate idle points calculateIdlePoints(); // Update all game objects // Update cats for (var i = cats.length - 1; i >= 0; i--) { var cat = cats[i]; cat.update(deltaTime); } // Update kittens for (var i = kittens.length - 1; i >= 0; i--) { var kitten = kittens[i]; kitten.update(deltaTime); } // Update birds and remove inactive ones for (var i = birds.length - 1; i >= 0; i--) { var bird = birds[i]; bird.update(deltaTime); if (!bird.active) { birds.splice(i, 1); } } // Update UFOs and remove inactive ones for (var i = ufos.length - 1; i >= 0; i--) { var ufo = ufos[i]; ufo.update(deltaTime); if (!ufo.active) { ufos.splice(i, 1); } } // Update power-ups and remove inactive ones for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; powerUp.update(deltaTime); if (!powerUp.active) { powerUps.splice(i, 1); } } // Update sparkles and remove inactive ones for (var i = sparkles.length - 1; i >= 0; i--) { var sparkle = sparkles[i]; sparkle.update(deltaTime); if (!sparkle.active) { sparkles.splice(i, 1); } } // Spawn birds birdSpawnTimer += deltaTime * 1000; // Convert to milliseconds if (birds.length < MAX_BIRDS && birdSpawnTimer >= BIRD_SPAWN_INTERVAL) { var bird = new Bird(); birds.push(bird); birdSpawnTimer = 0; } // Spawn UFOs ufoSpawnTimer += deltaTime * 1000; // Convert to milliseconds if (ufos.length < MAX_UFOS && ufoSpawnTimer >= UFO_SPAWN_INTERVAL && level >= 3) { var ufo = new UFO(); ufos.push(ufo); ufoSpawnTimer = 0; } } // Render game function renderGame() { // Clear canvas LK.clear(); // Draw background LK.setFillStyle('#1a1a2e'); LK.fillRect(0, 0, LK.canvas.width, LK.canvas.height); // Render all game objects // Render sparkles first (background layer) var _iterator = _createForOfIteratorHelper(sparkles), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var sparkle = _step.value; sparkle.render(); } // Render power-ups } catch (err) { _iterator.e(err); } finally { _iterator.f(); } var _iterator2 = _createForOfIteratorHelper(powerUps), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var powerUp = _step2.value; powerUp.render(); } // Render birds } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } var _iterator3 = _createForOfIteratorHelper(birds), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var bird = _step3.value; bird.render(); } // Render UFOs } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } var _iterator4 = _createForOfIteratorHelper(ufos), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var ufo = _step4.value; ufo.render(); } // Render cats } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } var _iterator5 = _createForOfIteratorHelper(cats), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var cat = _step5.value; cat.render(); } // Render kittens } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } var _iterator6 = _createForOfIteratorHelper(kittens), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var kitten = _step6.value; kitten.render(); } // Render UI } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } renderUI(); } // Render UI elements function renderUI() { // Score LK.setFillStyle('#FFFFFF'); LK.setFont('24px Arial'); LK.fillText("Score: ".concat(Math.floor(score)), LK.canvas.width / 2, 30, { align: 'center' }); // Level LK.setFont('18px Arial'); LK.fillText("Level: ".concat(level), LK.canvas.width - 20, 30, { align: 'right' }); // Multiplier LK.fillText("Multiplier: x".concat(multiplier.toFixed(1)), LK.canvas.width - 20, 60, { align: 'right' }); // Idle Points LK.fillText("Idle Points: ".concat(Math.floor(idlePoints)), LK.canvas.width - 20, LK.canvas.height - 20, { align: 'right' }); // Enemies Defeated LK.fillText("Enemies: ".concat(enemiesDefeated, "/").concat(ENEMIES_PER_LEVEL), 20, 30, { align: 'left' }); // Cat Count LK.fillText("Cats: ".concat(cats.length), 20, 60, { align: 'left' }); // Kitten Count LK.fillText("Kittens: ".concat(kittens.length), 20, 90, { align: 'left' }); // Spawn buttons renderButton("Add Cat (50)", 20, LK.canvas.height - 60, 120, 40, idlePoints >= 50); renderButton("Add Kitten (30)", 150, LK.canvas.height - 60, 120, 40, idlePoints >= 30); } // Render a button function renderButton(text, x, y, width, height, enabled) { // Button background LK.setFillStyle(enabled ? '#33aa33' : '#666666'); LK.fillRect(x, y, width, height); // Button border LK.setStrokeStyle('#FFFFFF'); LK.strokeRect(x, y, width, height); // Button text LK.setFillStyle('#FFFFFF'); LK.setFont('14px Arial'); LK.fillText(text, x + width / 2, y + height / 2, { align: 'center', baseline: 'middle' }); } // Handle mouse click function handleMouseClick(x, y) { // Check if cat spawn button clicked if (x >= 20 && x <= 140 && y >= LK.canvas.height - 60 && y <= LK.canvas.height - 20) { spawnCat(Math.random() * LK.canvas.width, Math.random() * LK.canvas.height); } // Check if kitten spawn button clicked if (x >= 150 && x <= 270 && y >= LK.canvas.height - 60 && y <= LK.canvas.height - 20) { spawnKitten(Math.random() * LK.canvas.width, Math.random() * LK.canvas.height); } } // Initialize game function initGame() { // Reset game state cats = []; kittens = []; birds = []; ufos = []; powerUps = []; sparkles = []; score = 0; level = 1; multiplier = 1.0; idlePoints = 100; // Start with enough for 2 cats or 3 kittens enemiesDefeated = 0; lastUpdateTime = Date.now(); idlePointsLastCalculated = Date.now(); birdSpawnTimer = 0; ufoSpawnTimer = 0; // Create initial cats spawnCat(LK.canvas.width / 2, LK.canvas.height / 2); // Setup mouse click handler LK.onMouseDown = function (event) { handleMouseClick(event.x, event.y); }; // Start game loop startGameLoop(); } // Game loop var lastFrameTime = 0; function gameLoop(timestamp) { // Calculate delta time var deltaTime = (timestamp - lastFrameTime) / 1000; // Convert to seconds lastFrameTime = timestamp; // Update game state updateGame(deltaTime); // Render game renderGame(); // Request next frame requestAnimationFrame(gameLoop); } // Start game loop function startGameLoop() { lastFrameTime = performance.now(); requestAnimationFrame(gameLoop); } // Initialize game when page loads window.onload = function () { initGame(); };
===================================================================
--- original.js
+++ change.js
@@ -1,940 +1,197 @@
/****
-* Plugins
+* Initialize Game
****/
-var storage = LK.import("@upit/storage.v1");
+var game = new LK.Game({
+ backgroundColor: 0x000000
+});
/****
-* Classes
+* Game Code
****/
-var AchievementDisplay = 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("Achievements", {
- sizeFactor: 1,
- fontWeight: 'bold'
- });
- titleText.anchor.set(0.5, 0);
- titleText.y = -fontSizeBase * 2;
- self.addChild(titleText);
- var achievementTexts = [];
- self.update = function () {
- // Clear previous achievement texts
- achievementTexts.forEach(function (text) {
- self.removeChild(text);
- });
- achievementTexts = [];
- // Add achievement texts
- var yPos = -fontSizeBase;
- var categories = ['sparklesCollected', 'catsOwned', 'upgradesPurchased', 'catLevels'];
- var categoryNames = ['Sparkles', 'Cats', 'Upgrades', 'Cat Levels'];
- categories.forEach(function (category, index) {
- if (achievements[category]) {
- var categoryText = createGameText(categoryNames[index] + ":", {
- sizeFactor: 0.8,
- fontWeight: 'bold'
- });
- categoryText.anchor.set(0.5, 0);
- categoryText.y = yPos;
- self.addChild(categoryText);
- achievementTexts.push(categoryText);
- yPos += fontSizeBase;
- achievements[category].forEach(function (achievement) {
- var color = achievement.achieved ? 0x00FF00 : 0xFFFFFF;
- var text = achievement.achieved ? "✓ " + achievement.threshold + " (" + achievement.reward + " sparkles)" : "□ " + achievement.threshold + " (" + achievement.reward + " sparkles)";
- var achievementText = createGameText(text, {
- sizeFactor: 0.7,
- fill: color
- });
- achievementText.anchor.set(0.5, 0);
- achievementText.y = yPos;
- self.addChild(achievementText);
- achievementTexts.push(achievementText);
- yPos += fontSizeBase * 0.8;
- });
- yPos += fontSizeBase * 0.5;
- }
- });
- };
- return self;
-});
-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;
- self.health = 20;
- self.speed = 1 + Math.random();
- self.value = 10;
- self.update = function () {
- 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;
- }
- });
- var dx = nearestCat.x - self.x;
- var dy = nearestCat.y - self.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist > 10) {
- self.x += dx / dist * self.speed;
- self.y += dy / dist * self.speed;
- }
- if (dist < 50) {
- self.health -= nearestCat.level;
- createSparkleEffect(self.x, self.y, 0xFF0000, 2);
- if (self.health <= 0) {
- handleEnemyDefeat(self, self.value);
- game.removeChild(self);
- birds.splice(birds.indexOf(self), 1);
- }
- }
+// --- Global Variables ---
+/**
+* Cat Defender - Idle Game
+*
+* A game where cats automatically defend against incoming birds and UFOs.
+* Features idle point accumulation, upgrades, and progressive difficulty.
+*/
+function _createForOfIteratorHelper(r, e) {
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
+ if (!t) {
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
+ t && (r = t);
+ var _n = 0,
+ F = function F() {};
+ return {
+ s: F,
+ n: function n() {
+ return _n >= r.length ? {
+ done: !0
+ } : {
+ done: !1,
+ value: r[_n++]
+ };
+ },
+ e: function e(r) {
+ throw r;
+ },
+ f: F
+ };
}
- };
- return self;
-});
-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;
- self.speed = 2;
- self.attackPower = 10;
- self.attackRange = 150;
- self.type = 'cat';
- 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);
- var powerUpIndicator = new Container();
- var powerUpGraphics = powerUpIndicator.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 0.4
- });
- powerUpGraphics.tint = 0xFFFFFF;
- powerUpIndicator.x = 0;
- powerUpIndicator.y = catGraphics.height / 2 + 5;
- powerUpIndicator.alpha = 0;
- self.addChild(powerUpIndicator);
- self.updateLevel = function (newLevel) {
- self.level = newLevel;
- updateTextProperties(levelText, {
- text: "Lvl " + self.level
- });
- };
- self.upgrade = function () {
- self.level++;
- self.productionRate *= 1.2;
- self.speed *= 1.1;
- self.attackPower *= 1.2;
- self.attackRange *= 1.05;
- self.updateLevel(self.level);
- levelCircleGraphics.tint = 0x000000;
- 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);
- 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.applyPowerUp = function (type, duration) {
- self.powerUps = self.powerUps || {};
- self.powerUps[type] = LK.ticks + duration * 60;
- if (type === "speed") {
- self.speed *= 2;
- powerUpGraphics.tint = 0x00FFFF;
- } else if (type === "attack") {
- self.attackPower *= 2;
- powerUpGraphics.tint = 0xFF0000;
- }
- powerUpIndicator.alpha = 0.8;
- createSparkleEffect(self.x, self.y, powerUpGraphics.tint, 10);
- };
- self.update = function () {
- var currentTime = LK.ticks / 60;
- if (currentTime - self.lastProductionTime > 1) {
- sparkles += self.productionRate * self.level;
- self.lastProductionTime = currentTime;
- if (Math.random() < 0.3) {
- createSparkleEffect(self.x, self.y);
- }
- }
- self.rotation = Math.sin(LK.ticks / 120) * 0.03;
- if (self.powerUps) {
- var hasPowerUp = false;
- for (var type in self.powerUps) {
- if (self.powerUps[type] < LK.ticks) {
- if (type === "speed") {
- self.speed /= 2;
- } else if (type === "attack") {
- self.attackPower /= 2;
- }
- delete self.powerUps[type];
- } else {
- hasPowerUp = true;
- var color = type === "speed" ? 0x00FFFF : 0xFF0000;
- if (Math.random() < 0.1) {
- createSparkleEffect(self.x, self.y, color, 1);
- }
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+ var o,
+ a = !0,
+ u = !1;
+ return {
+ s: function s() {
+ t = t.call(r);
+ },
+ n: function n() {
+ var r = t.next();
+ return a = r.done, r;
+ },
+ e: function e(r) {
+ u = !0, o = r;
+ },
+ f: function f() {
+ try {
+ a || null == t["return"] || t["return"]();
+ } finally {
+ if (u) {
+ throw o;
}
}
- powerUpIndicator.alpha = hasPowerUp ? 0.8 : 0;
}
};
- return self;
-});
-var CatStatusDisplay = Container.expand(function () {
- var self = Container.call(this);
- var bg = self.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 2
- });
- bg.tint = 0x330033;
- bg.alpha = 0.7;
- var titleText = createGameText("Cat Status", {
- sizeFactor: 0.8,
- fontWeight: 'bold'
- });
- titleText.anchor.set(0.5, 0);
- titleText.y = -fontSizeBase;
- self.addChild(titleText);
- var catCountText = createGameText("Cats: 0", {
- sizeFactor: 0.7
- });
- catCountText.anchor.set(0.5, 0);
- catCountText.y = 0;
- self.addChild(catCountText);
- self.update = function () {
- if (typeof cats !== 'undefined') {
- catCountText.text = "Cats: " + (cats ? cats.length : 0);
+}
+function _toConsumableArray(r) {
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
+}
+function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+}
+function _unsupportedIterableToArray(r, a) {
+ if (r) {
+ if ("string" == typeof r) {
+ return _arrayLikeToArray(r, a);
}
- };
- return self;
-});
-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 () {
- self.x += Math.sin(LK.ticks / 200) * 0.1;
- };
- return self;
-});
-var Kitten = Container.expand(function () {
- var self = Container.call(this);
- var kittenGraphics = self.attachAsset('cat', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 0.6
- });
- kittenGraphics.tint = 0xFFCC99;
- self.level = 1;
- self.productionRate = 0.3;
- self.lastProductionTime = 0;
- self.speed = 3;
- self.attackPower = 5;
- self.attackRange = 100;
- self.type = 'kitten';
- var levelCircle = new Container();
- var levelCircleGraphics = levelCircle.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 0.4
- });
- levelCircleGraphics.tint = 0x000000;
- levelCircle.x = 0;
- levelCircle.y = -kittenGraphics.height / 2 - 8;
- levelCircle.alpha = 0.7;
- self.addChild(levelCircle);
- var levelText = createGameText("Lvl " + self.level, {
- sizeFactor: 0.7,
- anchorX: 0.5,
- anchorY: 0.5,
- fill: 0xFFFFFF
- });
- levelCircle.addChild(levelText);
- var powerUpIndicator = new Container();
- var powerUpGraphics = powerUpIndicator.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 0.3
- });
- powerUpGraphics.tint = 0xFFFFFF;
- powerUpIndicator.x = 0;
- powerUpIndicator.y = kittenGraphics.height / 2 + 4;
- powerUpIndicator.alpha = 0;
- self.addChild(powerUpIndicator);
- self.updateLevel = function (newLevel) {
- self.level = newLevel;
- updateTextProperties(levelText, {
- text: "Lvl " + self.level
- });
- };
- self.upgrade = function () {
- self.level++;
- self.productionRate *= 1.2;
- self.speed *= 1.15;
- self.attackPower *= 1.15;
- self.attackRange *= 1.03;
- self.updateLevel(self.level);
- levelCircleGraphics.tint = 0x000000;
- var levelUpEffect = new Container();
- var levelUpGraphics = levelUpEffect.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 1.2
- });
- levelUpGraphics.tint = 0xFFFFFF;
- levelUpEffect.x = 0;
- levelUpEffect.y = -kittenGraphics.height / 2 - 8;
- levelUpEffect.alpha = 1;
- self.addChild(levelUpEffect);
- var startTime = LK.ticks;
- levelUpEffect.update = function () {
- var elapsed = (LK.ticks - startTime) / 60;
- levelUpEffect.scale.set(1.2 - elapsed * 0.4);
- levelUpEffect.alpha = 1 - elapsed;
- if (elapsed >= 1) {
- self.removeChild(levelUpEffect);
- }
- };
- };
- self.applyPowerUp = function (type, duration) {
- self.powerUps = self.powerUps || {};
- self.powerUps[type] = LK.ticks + duration * 60;
- if (type === "speed") {
- self.speed *= 2;
- powerUpGraphics.tint = 0x00FFFF;
- } else if (type === "attack") {
- self.attackPower *= 2;
- powerUpGraphics.tint = 0xFF0000;
- }
- powerUpIndicator.alpha = 0.8;
- createSparkleEffect(self.x, self.y, powerUpGraphics.tint, 8);
- };
- self.update = function () {
- var currentTime = LK.ticks / 60;
- if (currentTime - self.lastProductionTime > 1) {
- sparkles += self.productionRate * self.level;
- self.lastProductionTime = currentTime;
- if (Math.random() < 0.3) {
- createSparkleEffect(self.x, self.y);
- }
- }
- self.rotation = Math.sin(LK.ticks / 90) * 0.05;
- if (self.powerUps) {
- var hasPowerUp = false;
- for (var type in self.powerUps) {
- if (self.powerUps[type] < LK.ticks) {
- if (type === "speed") {
- self.speed /= 2;
- } else if (type === "attack") {
- self.attackPower /= 2;
- }
- delete self.powerUps[type];
- } else {
- hasPowerUp = true;
- var color = type === "speed" ? 0x00FFFF : 0xFF0000;
- if (Math.random() < 0.1) {
- createSparkleEffect(self.x, self.y, color, 1);
- }
- }
- }
- powerUpIndicator.alpha = hasPowerUp ? 0.8 : 0;
- }
- };
- return self;
-});
-var LevelIndicator = Container.expand(function () {
- var self = Container.call(this);
- var levelText = createGameText("Level: 1", {
- sizeFactor: 0.9
- });
- levelText.anchor.set(0, 0);
- self.addChild(levelText);
- var multiplierText = createGameText("Multiplier: x1.0", {
- sizeFactor: 0.7
- });
- multiplierText.anchor.set(0, 0);
- multiplierText.y = fontSizeBase;
- self.addChild(multiplierText);
- self.update = function () {
- if (typeof playerLevel !== 'undefined') {
- levelText.text = "Level: " + playerLevel;
- }
- if (typeof levelMultiplier !== 'undefined') {
- multiplierText.text = "Multiplier: x" + levelMultiplier.toFixed(1);
- }
- };
- return self;
-});
-var LevelProgressBar = Container.expand(function () {
- var self = Container.call(this);
- var bgBar = self.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 2,
- scaleY: 0.1
- });
- bgBar.tint = 0x333333;
- self.addChild(bgBar);
- 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 () {
- var enemiesForNextLevel = playerLevel * 10;
- var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;
- var progress = currentLevelEnemies / enemiesForNextLevel;
- progressBar.scale.x = progress * 2;
- updateTextProperties(labelText, {
- text: "Next Level: " + currentLevelEnemies + "/" + enemiesForNextLevel
- });
- };
- return self;
-});
-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);
- if (Math.random() < 0.2) {
- var soundIndex = Math.floor(Math.random() * sounds.length);
- LK.getSound(sounds[soundIndex]).play();
- }
- });
- return self;
-});
-var NotificationArea = Container.expand(function () {
- var self = Container.call(this);
- var messages = [];
- var maxMessages = 3;
- self.addMessage = function (message) {
- var messageText = createGameText(message, {
- sizeFactor: 0.7,
- fill: 0xFFFFFF
- });
- messageText.anchor.set(0, 0);
- messageText.alpha = 1;
- self.addChild(messageText);
- messages.push({
- text: messageText,
- creationTime: LK.ticks
- });
- self.repositionMessages();
- 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 () {
- var messagesToRemove = [];
- messages.forEach(function (message) {
- var age = (LK.ticks - message.creationTime) / 60;
- if (age > 5) {
- messagesToRemove.push(message);
- } else if (age > 3) {
- message.text.alpha = 1 - (age - 3) / 2;
- }
- });
- messagesToRemove.forEach(function (message) {
- var index = messages.indexOf(message);
- if (index !== -1) {
- messages.splice(index, 1);
- self.removeChild(message.text);
- }
- });
- self.repositionMessages();
- };
- return self;
-});
-var PowerUp = Container.expand(function (type) {
- var self = Container.call(this);
- self.attachAsset('sparkle', {});
- self.type = type || (Math.random() < 0.5 ? 'speed' : 'attack');
- self.scale.set(1.5, 1.5);
- self.tint = self.type === 'speed' ? 0x00FFFF : 0xFF0000;
- self.expired = false;
- self.lifespan = 10000; // 10 seconds
- self.creationTime = Date.now();
- self.update = function () {
- // Float up and down slightly
- self.y += Math.sin(Date.now() / 300) * 0.3;
- // Check if expired
- if (Date.now() - self.creationTime > self.lifespan) {
- self.expired = true;
- }
- // Check for collision with cats or kittens
- cats.forEach(function (cat) {
- var dx = cat.x - self.x;
- var dy = cat.y - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance < 40) {
- // Apply power-up effect
- if (self.type === 'speed') {
- cat.speedBoost = true;
- cat.speedBoostEndTime = Date.now() + 10000; // 10 seconds
- showNotification("Speed Boost!", "Cat moves faster for 10 seconds");
- } else {
- cat.attackBoost = true;
- cat.attackBoostEndTime = Date.now() + 10000; // 10 seconds
- showNotification("Attack Boost!", "Cat attacks stronger for 10 seconds");
- }
- // Remove power-up
- self.expired = true;
- }
- });
- kittens.forEach(function (kitten) {
- var dx = kitten.x - self.x;
- var dy = kitten.y - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance < 30) {
- // Apply power-up effect
- if (self.type === 'speed') {
- kitten.speedBoost = true;
- kitten.speedBoostEndTime = Date.now() + 15000; // 15 seconds for kittens
- showNotification("Speed Boost!", "Kitten moves faster for 15 seconds");
- } else {
- kitten.attackBoost = true;
- kitten.attackBoostEndTime = Date.now() + 15000; // 15 seconds for kittens
- showNotification("Attack Boost!", "Kitten attacks stronger for 15 seconds");
- }
- // Remove power-up
- self.expired = true;
- }
- });
- };
- return self;
-});
-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 = 0x000033;
- bg.alpha = 0.7;
- var titleText = createGameText("Power-Ups", {
- sizeFactor: 0.8,
- fontWeight: 'bold'
- });
- titleText.anchor.set(0.5, 0);
- titleText.y = -fontSizeBase;
- self.addChild(titleText);
- var powerUpText = createGameText("None Active", {
- sizeFactor: 0.7
- });
- powerUpText.anchor.set(0.5, 0);
- powerUpText.y = 0;
- self.addChild(powerUpText);
- self.update = function () {
- if (powerUps && powerUps.length > 0) {
- powerUpText.text = powerUps.length + " Active";
- } else {
- powerUpText.text = "None Active";
- }
- };
- return self;
-});
-var Sparkle = Container.expand(function () {
- var self = Container.call(this);
- var sparkleGraphics = self.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5,
- scale: 0.5
- });
- sparkleGraphics.tint = 0xFFFFFF;
- self.alpha = 1;
- self.visible = false;
- self.vx = 0;
- self.vy = 0;
- self.update = function () {
- if (!self.visible) {
- return;
- }
- self.x += self.vx;
- self.y += self.vy;
- self.vy += 0.05; // Gravity
- self.alpha -= 0.01;
- if (self.alpha <= 0) {
- self.visible = false;
- }
- };
- return self;
-});
-var SparkleCounter = Container.expand(function () {
- var self = Container.call(this);
- var counterText = new Text("Sparkles: 0", {
- fontFamily: "Arial",
- fontSize: fontSizeBase,
- fill: 0xFFFFFF
- });
- counterText.anchor.set(0, 0);
- self.addChild(counterText);
- var levelText = new Text("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;
-});
-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 () {
- if (typeof enemiesDefeated !== 'undefined') {
- enemiesText.text = "Enemies Defeated: " + enemiesDefeated;
- }
- if (typeof cats !== 'undefined') {
- catsText.text = "Cats: " + (cats ? cats.length : 0);
- }
- if (typeof totalSparklesEarned !== 'undefined') {
- totalSparklesText.text = "Total Sparkles: " + Math.floor(totalSparklesEarned || 0);
- }
- };
- return self;
-});
-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;
- self.health = 40;
- self.speed = 0.7 + Math.random() * 0.5;
- self.value = 20;
- self.update = function () {
- self.x += Math.sin(LK.ticks / 30) * self.speed;
- self.y += Math.cos(LK.ticks / 20) * self.speed;
- 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) {
- self.health -= cat.level;
- createSparkleEffect(self.x, self.y, 0x00FFFF, 1);
- if (self.health <= 0) {
- handleEnemyDefeat(self, self.value);
- game.removeChild(self);
- ufos.splice(ufos.indexOf(self), 1);
- }
- }
- });
- };
- return self;
-});
-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);
- buttonText.x = 0;
- buttonText.y = 0;
- self.addChild(buttonText);
- self.x = x;
- self.y = y;
- self.update = function () {
- 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);
- if (cats.length > 0) {
- if (sparkles >= upgradeCost) {
- self.alpha = 1.0;
- } else {
- self.alpha = 0.7;
- }
- } else {
- if (self.buttonText) {
- self.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
-});
-
-/****
-* Game Code
-****/
-// Utility functions
-function createGameText(text, options) {
- options = options || {};
- var sizeFactor = options.sizeFactor || 1;
- var fontSize = fontSizeBase * sizeFactor;
- var textObj = new Text(text, {
- fontFamily: "Arial",
- fontSize: fontSize,
- fill: options.fill || 0xFFFFFF,
- fontWeight: options.fontWeight || 'normal',
- align: options.align || 'center'
- });
- if (options.anchorX !== undefined && options.anchorY !== undefined) {
- textObj.anchor.set(options.anchorX, options.anchorY);
+ var t = {}.toString.call(r).slice(8, -1);
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
- return textObj;
}
-function updateTextProperties(textObj, properties) {
- if (!textObj) {
- return;
+function _iterableToArray(r) {
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) {
+ return Array.from(r);
}
- if (properties.text !== undefined) {
- textObj.text = properties.text;
+}
+function _arrayWithoutHoles(r) {
+ if (Array.isArray(r)) {
+ return _arrayLikeToArray(r);
}
- if (properties.fill !== undefined) {
- textObj.style.fill = properties.fill;
+}
+function _arrayLikeToArray(r, a) {
+ (null == a || a > r.length) && (a = r.length);
+ for (var e = 0, n = Array(a); e < a; e++) {
+ n[e] = r[e];
}
- if (properties.fontSize !== undefined) {
- textObj.style.fontSize = properties.fontSize;
+ return n;
+}
+function _superPropGet(t, o, e, r) {
+ var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e);
+ return 2 & r && "function" == typeof p ? function (t) {
+ return p.apply(e, t);
+ } : p;
+}
+function _get() {
+ return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {
+ var p = _superPropBase(e, t);
+ if (p) {
+ var n = Object.getOwnPropertyDescriptor(p, t);
+ return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
+ }
+ }, _get.apply(null, arguments);
+}
+function _superPropBase(t, o) {
+ for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t));) {
+ ;
}
- if (properties.fontWeight !== undefined) {
- textObj.style.fontWeight = properties.fontWeight;
- }
+ return t;
}
-function ensureInBounds(element) {
- if (!element) {
- return;
+function _callSuper(t, o, e) {
+ return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));
+}
+function _possibleConstructorReturn(t, e) {
+ if (e && ("object" == _typeof(e) || "function" == typeof e)) {
+ return e;
}
- var padding = 10;
- if (element.x < padding) {
- element.x = padding;
+ if (void 0 !== e) {
+ throw new TypeError("Derived constructors may only return object or undefined");
}
- if (element.y < padding) {
- element.y = padding;
+ return _assertThisInitialized(t);
+}
+function _assertThisInitialized(e) {
+ if (void 0 === e) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
- if (element.x > game.width - padding) {
- element.x = game.width - padding;
- }
- if (element.y > game.height - padding) {
- element.y = game.height - padding;
- }
+ return e;
}
-var gameStorage = {
- save: function save(key, data) {
- try {
- storage.set(key, JSON.stringify(data));
- return true;
- } catch (e) {
- console.error("Error saving data:", e);
- return false;
- }
- },
- load: function load(key) {
- try {
- var data = storage.get(key);
- return data ? JSON.parse(data) : null;
- } catch (e) {
- console.error("Error loading data:", e);
- return null;
- }
- },
- clear: function clear(key) {
- try {
- storage.remove(key);
- return true;
- } catch (e) {
- console.error("Error clearing data:", e);
- return false;
- }
+function _isNativeReflectConstruct() {
+ try {
+ var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ } catch (t) {}
+ return (_isNativeReflectConstruct = function _isNativeReflectConstruct() {
+ return !!t;
+ })();
+}
+function _getPrototypeOf(t) {
+ return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
+ return t.__proto__ || Object.getPrototypeOf(t);
+ }, _getPrototypeOf(t);
+}
+function _inherits(t, e) {
+ if ("function" != typeof e && null !== e) {
+ throw new TypeError("Super expression must either be null or a function");
}
-};
+ t.prototype = Object.create(e && e.prototype, {
+ constructor: {
+ value: t,
+ writable: !0,
+ configurable: !0
+ }
+ }), Object.defineProperty(t, "prototype", {
+ writable: !1
+ }), e && _setPrototypeOf(t, e);
+}
+function _setPrototypeOf(t, e) {
+ return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
+ return t.__proto__ = e, t;
+ }, _setPrototypeOf(t, e);
+}
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);
+function _classCallCheck(a, n) {
+ if (!(a instanceof n)) {
+ throw new TypeError("Cannot call a class as a function");
}
- 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));
- });
+function _defineProperties(e, r) {
+ for (var t = 0; t < r.length; t++) {
+ var o = r[t];
+ o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
}
- 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 _createClass(e, r, t) {
+ return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
+ writable: !1
+ }), e;
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
@@ -952,923 +209,1101 @@
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 () {
- sparkles = 0;
- totalSparklesEarned = 0;
- playerLevel = 1;
- levelMultiplier = 1;
- cats = [];
- kittens = [];
- birds = [];
- ufos = [];
- enemiesDefeated = 0;
- powerUps = [];
- totalUpgradesPurchased = 0;
- addCat();
- addKitten();
- game.update = function () {
- updateGameElements();
- updateGameMechanics();
- updateUIElements();
- };
- function updateGameElements() {
- cats.forEach(function (cat) {
- if (cat && typeof cat.update === 'function') {
- cat.update();
- }
- });
- if (birds && Array.isArray(birds)) {
- birds.forEach(function (bird) {
- if (bird && typeof bird.update === 'function') {
- bird.update();
- }
- });
- }
- if (ufos && Array.isArray(ufos)) {
- ufos.forEach(function (ufo) {
- if (ufo && typeof ufo.update === 'function') {
- ufo.update();
- }
- });
- }
- if (powerUps && Array.isArray(powerUps)) {
- powerUps.forEach(function (powerUp) {
- if (powerUp && typeof powerUp.update === 'function') {
- powerUp.update();
- }
- });
- }
- if (Math.random() < 0.01 * (1 + playerLevel * 0.1)) {
- var bird = new Bird();
- bird.x = 2048 + 100;
- bird.y = 1500 + Math.random() * 800;
- game.addChild(bird);
- birds.push(bird);
- }
- if (playerLevel % 5 === 0 && Math.random() < 0.005) {
- var ufo = new UFO();
- ufo.x = 2048 + 100;
- ufo.y = 1200 + Math.random() * 1000;
- game.addChild(ufo);
- ufos.push(ufo);
- }
- if (Math.random() < 0.002 * (1 + playerLevel * 0.05)) {
- spawnPowerUp();
- }
- }
- function updateGameMechanics() {
- sparkles += autoSparkleRate * levelMultiplier / 60;
- totalSparklesEarned += autoSparkleRate * levelMultiplier / 60;
- checkAchievements();
- checkLevelUp();
- catDefenseSystem();
- }
- function updateUIElements() {
- if (sparkleCounter && typeof sparkleCounter.update === 'function') {
- sparkleCounter.update();
- }
- if (levelIndicator && typeof levelIndicator.update === 'function') {
- levelIndicator.update();
- }
- if (ensureInBounds) {
- [statsPanel, powerUpIndicator, catStatusDisplay, notificationArea, levelProgressBar].forEach(function (element) {
- if (element) {
- ensureInBounds(element);
- }
- });
- }
- [clickUpgrade, autoUpgrade, catUpgrade, autoClickUpgrade, catSpeedUpgrade, catPowerUpgrade].forEach(function (button) {
- if (button && typeof button.update === 'function') {
- button.update();
- }
- });
- }
- function checkSpecialEvents() {
- // Placeholder for special event logic
- // Add logic here to handle any special events in the game
- console.log("Checking for special events...");
- }
-});
-var fontSizeBase = 24; // Define a base font size
-var sparkles = 0;
-var totalSparklesEarned = 0;
-var sparkleRate = 1;
-var autoSparkleRate = 0;
-var clickMultiplier = 1;
var cats = [];
var kittens = [];
var birds = [];
var ufos = [];
var powerUps = [];
+var sparkles = [];
+// Game State Variables
+var score = 0;
+var level = 1;
+var multiplier = 1.0; // Starts at 1.0, increases by 0.1 per level
+var idlePoints = 0;
var enemiesDefeated = 0;
-var playerLevel = 1;
-var levelMultiplier = 1;
-var lastSaveTime = Date.now();
-var lastPlayTime = Date.now();
-var totalUpgradesPurchased = 0;
-var tutorialStep = 0;
-var tutorialComplete = false;
-var sounds = ['breeze1', 'chime1', 'chitter', 'cricket1', 'frog1', 'laser1', 'songbird1', 'teslacoil', 'ufo1', 'wings1'];
-var upgrades = {
- clickPower: {
- level: 1,
- cost: 10,
- multiplier: 1.5
- },
- autoCollect: {
- level: 0,
- cost: 50,
- multiplier: 2
- },
- catCost: 100,
- catMultiplier: 1.8
-};
-var sparklePool = [];
-var maxSparkles = 50;
-var sparkleCounter = null;
-var levelIndicator = null;
-var levelProgressBar = null;
-var statsPanel = null;
-var powerUpIndicator = null;
-var catStatusDisplay = null;
-var notificationArea = null;
-var achievementDisplay = null;
-// Utility functions
-function handleEnemyDefeat(enemy, value) {
- // Increment enemy defeat counter
- enemiesDefeated++;
- // Add sparkles based on enemy value and level multiplier
- sparkles += value * levelMultiplier;
- totalSparklesEarned += value * levelMultiplier;
- // Create sparkle effect at enemy position
- if (enemy && enemy.x !== undefined && enemy.y !== undefined) {
- var color = enemy.type === 'ufo' ? 0x00FFFF : 0xFF0000;
- createSparkleEffect(enemy.x, enemy.y, color, 10);
+var lastUpdateTime = Date.now();
+var idlePointsLastCalculated = Date.now();
+// Game Constants
+var ENEMIES_PER_LEVEL = 10;
+var BASE_IDLE_POINTS_RATE = 0.5; // Points per cat per second
+var BIRD_POINTS = 10;
+var UFO_POINTS = 20;
+var BIRD_SPAWN_INTERVAL = 2000; // ms
+var UFO_SPAWN_INTERVAL = 15000; // ms
+var MAX_BIRDS = 10;
+var MAX_UFOS = 3;
+// Timers
+var birdSpawnTimer = 0;
+var ufoSpawnTimer = 0;
+// --- Utility Functions ---
+function distance(x1, y1, x2, y2) {
+ var dx = x1 - x2;
+ var dy = y1 - y2;
+ return Math.sqrt(dx * dx + dy * dy);
+}
+// --- Game Classes ---
+/**
+* Base class for game entities
+*/
+var GameObject = /*#__PURE__*/function () {
+ function GameObject(x, y, width, height, assetId) {
+ _classCallCheck(this, GameObject);
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ this.assetId = assetId;
+ this.active = true;
}
- // Check if we've defeated enough enemies for a level up
- var enemiesForNextLevel = playerLevel * 10;
- var currentLevelEnemies = enemiesDefeated % enemiesForNextLevel;
- if (currentLevelEnemies >= enemiesForNextLevel) {
- playerLevel++;
- levelMultiplier = 1 + (playerLevel - 1) * 0.1;
- showAchievement("Level Up!", "You reached level " + playerLevel, playerLevel * 50);
- sparkles += playerLevel * 50;
- totalSparklesEarned += playerLevel * 50;
- // Play level up sound
- if (LK.getSound('chime1')) {
- LK.getSound('chime1').play();
+ return _createClass(GameObject, [{
+ key: "update",
+ value: function update(deltaTime) {
+ // Override in subclasses
}
+ }, {
+ key: "render",
+ value: function render() {
+ if (!this.active) {
+ return;
+ }
+ // Draw the sprite
+ LK.drawImage(this.assetId, this.x, this.y, this.width, this.height);
+ }
+ }, {
+ key: "isColliding",
+ value: function isColliding(other) {
+ return this.x < other.x + other.width && this.x + this.width > other.x && this.y < other.y + other.height && this.y + this.height > other.y;
+ }
+ }]);
+}();
+/**
+* Base class for defenders (Cats and Kittens)
+*/
+var Defender = /*#__PURE__*/function (_GameObject) {
+ function Defender(x, y, width, height, assetId, attackRange, attackCooldown, attackDamage, moveSpeed) {
+ var _this;
+ _classCallCheck(this, Defender);
+ _this = _callSuper(this, Defender, [x, y, width, height, assetId]);
+ _this.attackRange = attackRange;
+ _this.attackCooldown = attackCooldown;
+ _this.attackDamage = attackDamage;
+ _this.moveSpeed = moveSpeed;
+ _this.attackTimer = 0;
+ _this.target = null;
+ return _this;
}
-}
-function showNotification(title, message) {
- if (notificationArea) {
- notificationArea.addMessage(title + ": " + message);
- }
-}
-function catDefenseSystem() {
- // Check for cats attacking birds
- cats.forEach(function (cat) {
- birds.forEach(function (bird) {
- var dx = bird.x - cat.x;
- var dy = bird.y - cat.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < cat.attackRange) {
- // Cat is in range to attack
- bird.health -= cat.attackPower / 60; // Divide by 60 for per-frame damage
- if (Math.random() < 0.05) {
- createSparkleEffect(bird.x, bird.y, 0xFF0000, 1);
+ _inherits(Defender, _GameObject);
+ return _createClass(Defender, [{
+ key: "update",
+ value: function update(deltaTime) {
+ if (!this.active) {
+ return;
+ }
+ // Handle attack cooldown
+ if (this.attackTimer > 0) {
+ this.attackTimer -= deltaTime;
+ }
+ // Find target if none exists
+ if (!this.target || !this.target.active) {
+ this.findTarget();
+ }
+ // Move towards target or attack
+ if (this.target) {
+ var dist = distance(this.x + this.width / 2, this.y + this.height / 2, this.target.x + this.target.width / 2, this.target.y + this.target.height / 2);
+ if (dist <= this.attackRange) {
+ this.attack();
+ } else {
+ this.moveTowardsTarget(deltaTime);
}
- if (bird.health <= 0) {
- handleEnemyDefeat(bird, bird.value);
- game.removeChild(bird);
- birds.splice(birds.indexOf(bird), 1);
- }
}
- });
- // Check for cats attacking UFOs
- ufos.forEach(function (ufo) {
- var dx = ufo.x - cat.x;
- var dy = ufo.y - cat.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < cat.attackRange) {
- // Cat is in range to attack
- ufo.health -= cat.attackPower / 60; // Divide by 60 for per-frame damage
- if (Math.random() < 0.05) {
- createSparkleEffect(ufo.x, ufo.y, 0x00FFFF, 1);
+ }
+ }, {
+ key: "findTarget",
+ value: function findTarget() {
+ // Find closest enemy
+ var closestDist = Infinity;
+ var closest = null;
+ // Check birds first
+ for (var _i = 0, _birds = birds; _i < _birds.length; _i++) {
+ var bird = _birds[_i];
+ if (!bird.active) {
+ continue;
}
- if (ufo.health <= 0) {
- handleEnemyDefeat(ufo, ufo.value);
- game.removeChild(ufo);
- ufos.splice(ufos.indexOf(ufo), 1);
+ var dist = distance(this.x + this.width / 2, this.y + this.height / 2, bird.x + bird.width / 2, bird.y + bird.height / 2);
+ if (dist < closestDist) {
+ closestDist = dist;
+ closest = bird;
}
}
- });
- });
- // Also check for kittens attacking
- kittens.forEach(function (kitten) {
- birds.forEach(function (bird) {
- var dx = bird.x - kitten.x;
- var dy = bird.y - kitten.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- if (dist < kitten.attackRange) {
- // Kitten is in range to attack
- bird.health -= kitten.attackPower / 60; // Divide by 60 for per-frame damage
- if (Math.random() < 0.05) {
- createSparkleEffect(bird.x, bird.y, 0xFF9900, 1);
+ // Check UFOs if no birds found or if this is a kitten (kittens prefer UFOs)
+ if ((!closest || this instanceof Kitten) && ufos.length > 0) {
+ for (var _i2 = 0, _ufos = ufos; _i2 < _ufos.length; _i2++) {
+ var ufo = _ufos[_i2];
+ if (!ufo.active) {
+ continue;
+ }
+ var dist = distance(this.x + this.width / 2, this.y + this.height / 2, ufo.x + ufo.width / 2, ufo.y + ufo.height / 2);
+ if (dist < closestDist) {
+ closestDist = dist;
+ closest = ufo;
+ }
}
- if (bird.health <= 0) {
- handleEnemyDefeat(bird, bird.value);
- game.removeChild(bird);
- birds.splice(birds.indexOf(bird), 1);
- }
}
- });
- });
-}
-var clickUpgrade = null;
-var autoUpgrade = null;
-var catUpgrade = null;
-var autoClickUpgrade = null;
-var catSpeedUpgrade = null;
-var catPowerUpgrade = null;
-var achievements = {
- sparklesCollected: [{
- threshold: 100,
- reward: 50,
- achieved: false
+ this.target = closest;
+ }
}, {
- threshold: 1000,
- reward: 200,
- achieved: false
+ key: "moveTowardsTarget",
+ value: function moveTowardsTarget(deltaTime) {
+ if (!this.target) {
+ return;
+ }
+ var targetX = this.target.x + this.target.width / 2;
+ var targetY = this.target.y + this.target.height / 2;
+ var dx = targetX - (this.x + this.width / 2);
+ var dy = targetY - (this.y + this.height / 2);
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 0) {
+ var moveX = dx / dist * this.moveSpeed * deltaTime;
+ var moveY = dy / dist * this.moveSpeed * deltaTime;
+ this.x += moveX;
+ this.y += moveY;
+ }
+ }
}, {
- threshold: 10000,
- reward: 500,
- achieved: false
- }, {
- threshold: 100000,
- reward: 2000,
- achieved: false
- }, {
- threshold: 1000000,
- reward: 10000,
- achieved: false
- }],
- catsOwned: [{
- threshold: 1,
- reward: 50,
- achieved: false
- }, {
- threshold: 5,
- reward: 200,
- achieved: false
- }, {
- threshold: 10,
- reward: 500,
- achieved: false
- }, {
- threshold: 25,
- reward: 2000,
- achieved: false
- }, {
- threshold: 50,
- reward: 10000,
- achieved: false
- }],
- upgradesPurchased: [{
- threshold: 5,
- reward: 100,
- achieved: false
- }, {
- threshold: 15,
- reward: 300,
- achieved: false
- }, {
- threshold: 30,
- reward: 1000,
- achieved: false
- }, {
- threshold: 50,
- reward: 3000,
- achieved: false
- }, {
- threshold: 100,
- reward: 15000,
- achieved: false
- }],
- catLevels: [{
- threshold: 10,
- reward: 200,
- achieved: false
- }, {
- threshold: 25,
- reward: 500,
- achieved: false
- }, {
- threshold: 50,
- reward: 1500,
- achieved: false
- }, {
- threshold: 100,
- reward: 5000,
- achieved: false
- }, {
- threshold: 250,
- reward: 20000,
- achieved: false
- }]
-};
-function saveGame() {
- var gameData = {
- sparkles: sparkles,
- totalSparklesEarned: totalSparklesEarned,
- sparkleRate: sparkleRate,
- autoSparkleRate: autoSparkleRate,
- clickMultiplier: clickMultiplier,
- playerLevel: playerLevel,
- levelMultiplier: levelMultiplier,
- enemiesDefeated: enemiesDefeated,
- lastSaveTime: Date.now()
- };
- gameStorage.save('catDefenderSave', gameData);
-}
-function loadGame() {
- var gameState = gameStorage.load('cosmicCatGarden');
- if (gameState) {
- 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;
- tutorialStep = gameState.tutorialStep || 0;
- upgrades = gameState.upgrades || upgrades;
- var currentTime = Date.now();
- var offlineTime = (currentTime - gameState.lastSaveTime) / 1000;
- var offlineSparkles = 0;
- if (offlineTime > 0 && gameState.cats && gameState.cats.length > 0) {
- var totalCatProduction = gameState.cats.reduce(function (total, cat) {
- return total + cat.productionRate * cat.level;
- }, 0);
- offlineSparkles = totalCatProduction * offlineTime;
- offlineSparkles += gameState.autoSparkleRate * offlineTime;
- offlineSparkles *= gameState.levelMultiplier;
- sparkles += offlineSparkles;
- totalSparklesEarned += offlineSparkles;
- showOfflineEarnings(offlineSparkles, offlineTime);
+ key: "attack",
+ value: function attack() {
+ if (this.attackTimer <= 0 && this.target && this.target.active) {
+ this.target.takeDamage(this.attackDamage);
+ this.attackTimer = this.attackCooldown;
+ // Create attack effect
+ createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack');
+ }
}
- if (gameState.cats && gameState.cats.length > 0) {
- cats.forEach(function (cat) {
- game.removeChild(cat);
- });
- cats = [];
- 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;
+ }]);
+}(GameObject);
+/**
+* Cat Class - Standard defender
+*/
+var Cat = /*#__PURE__*/function (_Defender) {
+ function Cat(x, y) {
+ _classCallCheck(this, Cat);
+ return _callSuper(this, Cat, [x, y, 64, 64, 'cat', 100, 1.0, 2, 2]);
}
- return false;
-}
-function resetGame() {
- gameStorage.clear('cosmicCatGarden');
- sparkles = 0;
- totalSparklesEarned = 0;
- sparkleRate = 1;
- autoSparkleRate = 0;
- clickMultiplier = 1;
- playerLevel = 1;
- levelMultiplier = 1;
- cats.forEach(function (cat) {
- game.removeChild(cat);
- });
- cats = [];
- birds.forEach(function (bird) {
- game.removeChild(bird);
- });
- birds = [];
- ufos.forEach(function (ufo) {
- game.removeChild(ufo);
- });
- ufos = [];
- achievements = [];
- totalUpgradesPurchased = 0;
- tutorialComplete = false;
- upgrades = [];
- addCat();
- return true;
-}
-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;
- saveIndicator.y = 20;
- game.addChild(saveIndicator);
+ _inherits(Cat, _Defender);
+ return _createClass(Cat);
+}(Defender);
+/**
+* Kitten Class - Faster but weaker defender
+*/
+var Kitten = /*#__PURE__*/function (_Defender2) {
+ function Kitten(x, y) {
+ _classCallCheck(this, Kitten);
+ return _callSuper(this, Kitten, [x, y, 48, 48, 'kitten', 60, 0.5, 1, 3]);
}
- return saveIndicator;
-}
-function checkAutoSave() {
- var currentTime = Date.now();
- if (currentTime - lastAutoSaveTime > 30000) {
- var indicator = createSaveIndicator();
- indicator.alpha = 1;
- saveGame();
- lastAutoSaveTime = currentTime;
- setTimeout(function () {
- var fadeInterval = setInterval(function () {
- indicator.alpha -= 0.05;
- if (indicator.alpha <= 0) {
- clearInterval(fadeInterval);
- }
- }, 50);
- }, 1000);
+ _inherits(Kitten, _Defender2);
+ return _createClass(Kitten);
+}(Defender);
+/**
+* Enemy base class
+*/
+var Enemy = /*#__PURE__*/function (_GameObject2) {
+ function Enemy(x, y, width, height, assetId, health, speed, pointValue) {
+ var _this2;
+ _classCallCheck(this, Enemy);
+ _this2 = _callSuper(this, Enemy, [x, y, width, height, assetId]);
+ _this2.health = health;
+ _this2.maxHealth = health;
+ _this2.speed = speed;
+ _this2.pointValue = pointValue;
+ _this2.targetX = LK.canvas.width / 2;
+ _this2.targetY = LK.canvas.height / 2;
+ return _this2;
}
-}
-function showOfflineEarnings(amount, time) {
- var notification = new Container();
- // Create background
- notification.attachAsset('achievement-notification', {});
- // Create title text
- var titleText = new Text("Welcome Back!", {
- fontFamily: "Arial",
- fontSize: fontSizeBase,
- fill: 0xFFFFFF,
- fontWeight: 'bold'
- });
- titleText.anchor.set(0.5, 0);
- titleText.y = 10;
- // Create message text
- var messageText = new Text("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;
- // Add elements to notification
- notification.addChild(titleText);
- notification.addChild(messageText);
- // Position notification
- notification.x = 2048 / 2;
- notification.y = 2732 / 2;
- notification.alpha = 0;
- game.addChild(notification);
- // Set up fade in/out animation
- 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);
+ _inherits(Enemy, _GameObject2);
+ return _createClass(Enemy, [{
+ key: "update",
+ value: function update(deltaTime) {
+ if (!this.active) {
+ return;
+ }
+ // Move towards center
+ var dx = this.targetX - (this.x + this.width / 2);
+ var dy = this.targetY - (this.y + this.height / 2);
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 10) {
+ // Not too close to center
+ var moveX = dx / dist * this.speed * deltaTime;
+ var moveY = dy / dist * this.speed * deltaTime;
+ this.x += moveX;
+ this.y += moveY;
+ } else {
+ // Reached center, remove
+ this.active = false;
+ }
}
- };
-}
-function showAchievement(title, description, reward) {
- var notification = new Container();
- // Create background
- var achievementBg = notification.attachAsset('achievement-notification', {});
- // Create title text
- var titleText = new Text("Achievement: " + title, {
- fontFamily: "Arial",
- fontSize: fontSizeBase,
- fill: 0xFFFFFF,
- fontWeight: 'bold'
- });
- titleText.anchor.set(0.5, 0);
- titleText.y = 10;
- notification.addChild(titleText);
- // Create message text
- var messageText = new Text(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 notification
- notification.x = 2048 / 2;
- notification.y = 2732 / 2 - achievementBg.height / 2;
- game.addChild(notification);
- // Play achievement sound
- if (LK.getSound('chime1')) {
- LK.getSound('chime1').play();
- }
- // Set up fade in/out animation
- 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);
+ }, {
+ key: "takeDamage",
+ value: function takeDamage(amount) {
+ this.health -= amount;
+ if (this.health <= 0) {
+ this.defeat();
+ }
}
- };
-}
-function checkAchievements() {
- if (typeof achievements !== 'undefined' && achievements) {
- if (achievements.sparklesCollected) {
- 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);
- }
- });
+ }, {
+ key: "defeat",
+ value: function defeat() {
+ this.active = false;
+ // Add points
+ var pointsEarned = this.pointValue * multiplier;
+ score += pointsEarned;
+ enemiesDefeated++;
+ // Check for level up
+ if (enemiesDefeated >= ENEMIES_PER_LEVEL) {
+ levelUp();
+ }
+ // Create sparkles
+ for (var i = 0; i < 5; i++) {
+ createSparkle(this.x + Math.random() * this.width, this.y + Math.random() * this.height, 'defeat');
+ }
+ // Chance to spawn power-up
+ if (Math.random() < 0.2) {
+ // 20% chance
+ spawnPowerUp(this.x, this.y);
+ }
}
- if (achievements.catsOwned) {
- 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);
- }
- });
+ }, {
+ key: "render",
+ value: function render() {
+ _superPropGet(Enemy, "render", this, 3)([]);
+ // Draw health bar
+ var healthPercent = this.health / this.maxHealth;
+ var barWidth = this.width * 0.8;
+ var barHeight = 5;
+ var barX = this.x + (this.width - barWidth) / 2;
+ var barY = this.y - 10;
+ // Background
+ LK.setFillStyle('rgba(0,0,0,0.5)');
+ LK.fillRect(barX, barY, barWidth, barHeight);
+ // Health
+ LK.setFillStyle('rgba(255,50,50,0.8)');
+ LK.fillRect(barX, barY, barWidth * healthPercent, barHeight);
}
+ }]);
+}(GameObject);
+/**
+* Bird Class - Standard enemy
+*/
+var Bird = /*#__PURE__*/function (_Enemy) {
+ function Bird() {
+ _classCallCheck(this, Bird);
+ // Random position at edge of screen
+ var side = Math.floor(Math.random() * 4);
+ var x, y;
+ switch (side) {
+ case 0:
+ // Top
+ x = Math.random() * LK.canvas.width;
+ y = -50;
+ break;
+ case 1:
+ // Right
+ x = LK.canvas.width + 50;
+ y = Math.random() * LK.canvas.height;
+ break;
+ case 2:
+ // Bottom
+ x = Math.random() * LK.canvas.width;
+ y = LK.canvas.height + 50;
+ break;
+ case 3:
+ // Left
+ x = -50;
+ y = Math.random() * LK.canvas.height;
+ break;
+ }
+ return _callSuper(this, Bird, [x, y, 32, 32, 'bird', 3, 50, BIRD_POINTS]);
}
-}
-function checkLevelUp() {
- var newLevel = Math.floor(Math.log(totalSparklesEarned / 100 + 1) / Math.log(1.5)) + 1;
- if (newLevel > playerLevel) {
- // Store previous level for potential use
- playerLevel = newLevel;
- levelMultiplier = 1 + (playerLevel - 1) * 0.1;
- showAchievement("Level Up!", "You reached level " + playerLevel, playerLevel * 50);
- sparkles += playerLevel * 50;
- totalSparklesEarned += playerLevel * 50;
- if (LK.getSound('chime1')) {
- LK.getSound('chime1').play();
+ _inherits(Bird, _Enemy);
+ return _createClass(Bird);
+}(Enemy);
+/**
+* UFO Class - Rare, stronger enemy
+*/
+var UFO = /*#__PURE__*/function (_Enemy2) {
+ function UFO() {
+ _classCallCheck(this, UFO);
+ // Random position at edge of screen
+ var side = Math.floor(Math.random() * 4);
+ var x, y;
+ switch (side) {
+ case 0:
+ // Top
+ x = Math.random() * LK.canvas.width;
+ y = -50;
+ break;
+ case 1:
+ // Right
+ x = LK.canvas.width + 50;
+ y = Math.random() * LK.canvas.height;
+ break;
+ case 2:
+ // Bottom
+ x = Math.random() * LK.canvas.width;
+ y = LK.canvas.height + 50;
+ break;
+ case 3:
+ // Left
+ x = -50;
+ y = Math.random() * LK.canvas.height;
+ break;
}
+ return _callSuper(this, UFO, [x, y, 64, 32, 'ufo', 10, 30, UFO_POINTS]);
}
-}
-function initSparklePool() {
- for (var i = 0; i < maxSparkles; i++) {
- var sparkle = new Sparkle();
- sparkle.visible = false;
- sparklePool.push(sparkle);
- game.addChild(sparkle);
+ _inherits(UFO, _Enemy2);
+ return _createClass(UFO);
+}(Enemy);
+/**
+* PowerUp Class - Temporary boosts for defenders
+*/
+var PowerUp = /*#__PURE__*/function (_GameObject3) {
+ function PowerUp(x, y) {
+ var _this3;
+ _classCallCheck(this, PowerUp);
+ _this3 = _callSuper(this, PowerUp, [x, y, 30, 30, 'powerup']);
+ // Define possible power-up types and their effects
+ _this3.effects = {
+ damage: {
+ color: '#ff5555',
+ duration: 10,
+ multiplier: 2
+ },
+ speed: {
+ color: '#55ff55',
+ duration: 15,
+ multiplier: 1.5
+ },
+ range: {
+ color: '#5555ff',
+ duration: 12,
+ multiplier: 1.5
+ },
+ multi: {
+ color: '#ffaa55',
+ duration: 8,
+ multiplier: 1
+ },
+ chain: {
+ color: '#55ffff',
+ duration: 10,
+ multiplier: 1
+ },
+ shield: {
+ color: '#aaaaff',
+ duration: 20,
+ multiplier: 1
+ },
+ heal: {
+ color: '#ff55ff',
+ duration: 0,
+ multiplier: 1
+ },
+ time: {
+ color: '#ffff55',
+ duration: 5,
+ multiplier: 0.5
+ }
+ };
+ // Select random type
+ var types = Object.keys(_this3.effects);
+ _this3.type = types[Math.floor(Math.random() * types.length)];
+ // Set duration
+ _this3.duration = 10; // seconds
+ _this3.lifespan = 10; // seconds before disappearing if not collected
+ return _this3;
}
-}
-function initializeGame() {
- console.log("Initializing game...");
- sparkles = 0;
- totalSparklesEarned = 0;
- sparkleRate = 1;
- autoSparkleRate = 0;
- clickMultiplier = 1;
- playerLevel = 1;
- levelMultiplier = 1;
- enemiesDefeated = 0;
- totalUpgradesPurchased = 0;
- tutorialComplete = false;
- clearGameObjects();
- initSparklePool();
- addCat();
- addKitten();
- setupUI();
- if (LK.getMusic('bgm1')) {
- LK.getMusic('bgm1').play({
- loop: true,
- volume: 0.5
- });
- }
- game.update = function () {
- updateGameElements();
- updateGameMechanics();
- updateUIElements();
- if (Date.now() - lastSaveTime > 30000) {
- saveGame();
- lastSaveTime = Date.now();
+ _inherits(PowerUp, _GameObject3);
+ return _createClass(PowerUp, [{
+ key: "update",
+ value: function update(deltaTime) {
+ if (!this.active) {
+ return;
+ }
+ // Decrease lifespan
+ this.lifespan -= deltaTime;
+ if (this.lifespan <= 0) {
+ this.active = false;
+ return;
+ }
+ // Check for collision with defenders
+ for (var _i3 = 0, _cats = cats; _i3 < _cats.length; _i3++) {
+ var cat = _cats[_i3];
+ if (this.isColliding(cat)) {
+ this.applyEffect(cat);
+ this.active = false;
+ return;
+ }
+ }
+ for (var _i4 = 0, _kittens = kittens; _i4 < _kittens.length; _i4++) {
+ var kitten = _kittens[_i4];
+ if (this.isColliding(kitten)) {
+ this.applyEffect(kitten);
+ this.active = false;
+ return;
+ }
+ }
+ // Floating animation
+ this.y += Math.sin(Date.now() / 200) * 0.5;
}
- };
- console.log("Game initialized successfully");
-}
-function clearGameObjects() {
- cats.forEach(function (cat) {
- if (cat && game.children.includes(cat)) {
- game.removeChild(cat);
+ }, {
+ key: "applyEffect",
+ value: function applyEffect(defender) {
+ var _this4 = this;
+ // Apply effect based on type
+ switch (this.type) {
+ case 'damage':
+ defender.attackDamage *= this.effects.damage.multiplier;
+ setTimeout(function () {
+ defender.attackDamage /= _this4.effects.damage.multiplier;
+ }, this.effects.damage.duration * 1000);
+ break;
+ case 'speed':
+ defender.moveSpeed *= this.effects.speed.multiplier;
+ setTimeout(function () {
+ defender.moveSpeed /= _this4.effects.speed.multiplier;
+ }, this.effects.speed.duration * 1000);
+ break;
+ case 'range':
+ defender.attackRange *= this.effects.range.multiplier;
+ setTimeout(function () {
+ defender.attackRange /= _this4.effects.range.multiplier;
+ }, this.effects.range.duration * 1000);
+ break;
+ case 'multi':
+ // Create temporary multi-attack effect
+ var originalAttack = defender.attack;
+ defender.attack = function () {
+ if (this.attackTimer <= 0 && this.target && this.target.active) {
+ this.target.takeDamage(this.attackDamage);
+ // Attack additional enemies
+ var count = 0;
+ for (var _i5 = 0, _arr = [].concat(_toConsumableArray(birds), _toConsumableArray(ufos)); _i5 < _arr.length; _i5++) {
+ var enemy = _arr[_i5];
+ if (enemy !== this.target && enemy.active && count < 2) {
+ var dist = distance(this.x + this.width / 2, this.y + this.height / 2, enemy.x + enemy.width / 2, enemy.y + enemy.height / 2);
+ if (dist <= this.attackRange * 1.5) {
+ enemy.takeDamage(this.attackDamage / 2);
+ count++;
+ // Create attack effect
+ createSparkle(enemy.x + enemy.width / 2, enemy.y + enemy.height / 2, 'attack');
+ }
+ }
+ }
+ this.attackTimer = this.attackCooldown;
+ // Create attack effect
+ createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack');
+ }
+ };
+ setTimeout(function () {
+ defender.attack = originalAttack;
+ }, this.effects.multi.duration * 1000);
+ break;
+ case 'chain':
+ // Create chain attack effect
+ var chainAttack = defender.attack;
+ defender.attack = function () {
+ if (this.attackTimer <= 0 && this.target && this.target.active) {
+ // Initial attack
+ this.target.takeDamage(this.attackDamage);
+ // Chain to nearby enemies
+ var lastEnemy = this.target;
+ var chainCount = 0;
+ for (var _i6 = 0, _arr2 = [].concat(_toConsumableArray(birds), _toConsumableArray(ufos)); _i6 < _arr2.length; _i6++) {
+ var enemy = _arr2[_i6];
+ if (enemy !== lastEnemy && enemy.active && chainCount < 3) {
+ var dist = distance(lastEnemy.x + lastEnemy.width / 2, lastEnemy.y + lastEnemy.height / 2, enemy.x + enemy.width / 2, enemy.y + enemy.height / 2);
+ if (dist <= 100) {
+ enemy.takeDamage(this.attackDamage * 0.7);
+ chainCount++;
+ lastEnemy = enemy;
+ // Create chain effect
+ createSparkle(enemy.x + enemy.width / 2, enemy.y + enemy.height / 2, 'chain');
+ }
+ }
+ }
+ this.attackTimer = this.attackCooldown;
+ // Create attack effect
+ createSparkle(this.target.x + this.target.width / 2, this.target.y + this.target.height / 2, 'attack');
+ }
+ };
+ setTimeout(function () {
+ defender.attack = chainAttack;
+ }, this.effects.chain.duration * 1000);
+ break;
+ case 'shield':
+ // Create shield effect
+ defender.shielded = true;
+ setTimeout(function () {
+ defender.shielded = false;
+ }, this.effects.shield.duration * 1000);
+ break;
+ case 'heal':
+ // Heal all defenders
+ for (var _i7 = 0, _cats2 = cats; _i7 < _cats2.length; _i7++) {
+ var cat = _cats2[_i7];
+ } // Cats don't have health in this game, but could add temporary invincibility
+ for (var _i8 = 0, _kittens2 = kittens; _i8 < _kittens2.length; _i8++) {
+ var kitten = _kittens2[_i8];
+ } // Kittens don't have health in this game, but could add temporary invincibility
+ break;
+ case 'time':
+ // Slow down all enemies
+ for (var _i9 = 0, _birds2 = birds; _i9 < _birds2.length; _i9++) {
+ var bird = _birds2[_i9];
+ if (bird.active) {
+ bird.speed *= this.effects.time.multiplier;
+ }
+ }
+ for (var _i10 = 0, _ufos2 = ufos; _i10 < _ufos2.length; _i10++) {
+ var ufo = _ufos2[_i10];
+ if (ufo.active) {
+ ufo.speed *= this.effects.time.multiplier;
+ }
+ }
+ setTimeout(function () {
+ for (var _i11 = 0, _birds3 = birds; _i11 < _birds3.length; _i11++) {
+ var bird = _birds3[_i11];
+ if (bird.active) {
+ bird.speed /= _this4.effects.time.multiplier;
+ }
+ }
+ for (var _i12 = 0, _ufos3 = ufos; _i12 < _ufos3.length; _i12++) {
+ var ufo = _ufos3[_i12];
+ if (ufo.active) {
+ ufo.speed /= _this4.effects.time.multiplier;
+ }
+ }
+ }, this.effects.time.duration * 1000);
+ break;
+ }
+ // Create collection effect
+ for (var i = 0; i < 10; i++) {
+ createSparkle(this.x + Math.random() * this.width, this.y + Math.random() * this.height, 'powerup');
+ }
}
- });
- cats = [];
- kittens.forEach(function (kitten) {
- if (kitten && game.children.includes(kitten)) {
- game.removeChild(kitten);
+ }, {
+ key: "render",
+ value: function render() {
+ if (!this.active) {
+ return;
+ }
+ // Draw power-up background
+ LK.setFillStyle(this.effects[this.type].color);
+ LK.fillRect(this.x, this.y, this.width, this.height);
+ // Draw icon
+ this.drawPowerUpIcon();
+ // Pulsing effect based on remaining lifespan
+ if (this.lifespan < 3) {
+ var alpha = 0.5 + 0.5 * Math.sin(Date.now() / 100);
+ LK.setFillStyle("rgba(255,255,255,".concat(alpha, ")"));
+ LK.fillRect(this.x, this.y, this.width, this.height);
+ }
}
- });
- kittens = [];
- birds.forEach(function (bird) {
- if (bird && game.children.includes(bird)) {
- game.removeChild(bird);
+ // Helper method to convert hex color to RGB format
+ }, {
+ key: "hexToRgb",
+ value: function hexToRgb(hex) {
+ // Remove # if present
+ hex = hex.replace('#', '');
+ // Parse the hex values
+ var r = parseInt(hex.substring(0, 2), 16);
+ var g = parseInt(hex.substring(2, 4), 16);
+ var b = parseInt(hex.substring(4, 6), 16);
+ return "".concat(r, ",").concat(g, ",").concat(b);
}
- });
- birds = [];
- ufos.forEach(function (ufo) {
- if (ufo && game.children.includes(ufo)) {
- game.removeChild(ufo);
+ // Draw an icon representing the power-up type
+ }, {
+ key: "drawPowerUpIcon",
+ value: function drawPowerUpIcon() {
+ var centerX = this.x + this.width / 2;
+ var centerY = this.y + this.height / 2;
+ var iconSize = this.width / 6;
+ LK.setFillStyle('white');
+ switch (this.type) {
+ case 'damage':
+ // Draw a plus symbol
+ LK.fillRect(centerX - iconSize, centerY - iconSize / 3, iconSize * 2, iconSize * 2 / 3);
+ LK.fillRect(centerX - iconSize / 3, centerY - iconSize, iconSize * 2 / 3, iconSize * 2);
+ break;
+ case 'speed':
+ // Draw a lightning bolt
+ LK.setStrokeStyle('white');
+ LK.beginPath();
+ LK.moveTo(centerX - iconSize, centerY - iconSize);
+ LK.lineTo(centerX + iconSize / 2, centerY);
+ LK.lineTo(centerX - iconSize / 2, centerY);
+ LK.lineTo(centerX + iconSize, centerY + iconSize);
+ LK.stroke();
+ break;
+ case 'range':
+ // Draw a circle
+ LK.drawCircle(centerX, centerY, iconSize);
+ LK.setFillStyle(this.effects[this.type].color);
+ LK.drawCircle(centerX, centerY, iconSize / 2);
+ break;
+ case 'multi':
+ // Draw multiple dots
+ for (var i = 0; i < 3; i++) {
+ var angle = i / 3 * Math.PI * 2;
+ LK.drawCircle(centerX + Math.cos(angle) * iconSize, centerY + Math.sin(angle) * iconSize, iconSize / 2);
+ }
+ break;
+ case 'chain':
+ // Draw connected dots
+ var points = [{
+ x: centerX - iconSize,
+ y: centerY - iconSize
+ }, {
+ x: centerX,
+ y: centerY
+ }, {
+ x: centerX + iconSize,
+ y: centerY + iconSize
+ }];
+ // Draw lines connecting points
+ LK.setStrokeStyle('white');
+ LK.beginPath();
+ LK.moveTo(points[0].x, points[0].y);
+ LK.lineTo(points[1].x, points[1].y);
+ LK.lineTo(points[2].x, points[2].y);
+ LK.stroke();
+ // Draw points
+ for (var _i13 = 0, _points = points; _i13 < _points.length; _i13++) {
+ var point = _points[_i13];
+ LK.drawCircle(point.x, point.y, iconSize / 3);
+ }
+ break;
+ case 'shield':
+ // Draw shield shape
+ LK.setStrokeStyle('white');
+ LK.beginPath();
+ LK.moveTo(centerX, centerY - iconSize);
+ LK.lineTo(centerX + iconSize, centerY - iconSize / 2);
+ LK.lineTo(centerX + iconSize, centerY + iconSize / 2);
+ LK.lineTo(centerX, centerY + iconSize);
+ LK.lineTo(centerX - iconSize, centerY + iconSize / 2);
+ LK.lineTo(centerX - iconSize, centerY - iconSize / 2);
+ LK.lineTo(centerX, centerY - iconSize);
+ LK.stroke();
+ break;
+ case 'heal':
+ // Draw plus symbol
+ LK.fillRect(centerX - iconSize, centerY - iconSize / 4, iconSize * 2, iconSize / 2);
+ LK.fillRect(centerX - iconSize / 4, centerY - iconSize, iconSize / 2, iconSize * 2);
+ break;
+ case 'time':
+ // Draw clock symbol
+ LK.drawCircle(centerX, centerY, iconSize);
+ LK.setStrokeStyle('white');
+ LK.beginPath();
+ LK.moveTo(centerX, centerY);
+ LK.lineTo(centerX, centerY - iconSize * 0.7);
+ LK.moveTo(centerX, centerY);
+ LK.lineTo(centerX + iconSize * 0.5, centerY);
+ LK.stroke();
+ break;
+ }
}
- });
- ufos = [];
- powerUps.forEach(function (powerUp) {
- if (powerUp && game.children.includes(powerUp)) {
- game.removeChild(powerUp);
+ }]);
+}(GameObject);
+/**
+* Sparkle Class - Visual effects
+*/
+var Sparkle = /*#__PURE__*/function (_GameObject4) {
+ function Sparkle(x, y, type) {
+ var _this5;
+ _classCallCheck(this, Sparkle);
+ _this5 = _callSuper(this, Sparkle, [x, y, 10, 10, 'sparkle']);
+ _this5.type = type || 'defeat'; // defeat, attack, powerup
+ _this5.lifespan = 0.5; // seconds
+ _this5.velocity = {
+ x: (Math.random() - 0.5) * 100,
+ y: (Math.random() - 0.5) * 100
+ };
+ // Set color based on type
+ switch (_this5.type) {
+ case 'defeat':
+ _this5.color = "rgba(255,255,".concat(Math.floor(Math.random() * 100) + 155, ",0.8)");
+ break;
+ case 'attack':
+ _this5.color = "rgba(255,".concat(Math.floor(Math.random() * 100) + 100, ",100,0.8)");
+ break;
+ case 'powerup':
+ _this5.color = "rgba(".concat(Math.floor(Math.random() * 155) + 100, ",").concat(Math.floor(Math.random() * 155) + 100, ",255,0.8)");
+ break;
+ case 'chain':
+ _this5.color = "rgba(100,255,".concat(Math.floor(Math.random() * 155) + 100, ",0.8)");
+ break;
+ default:
+ _this5.color = "rgba(255,255,255,0.8)";
}
- });
- powerUps = [];
+ return _this5;
+ }
+ _inherits(Sparkle, _GameObject4);
+ return _createClass(Sparkle, [{
+ key: "update",
+ value: function update(deltaTime) {
+ if (!this.active) {
+ return;
+ }
+ // Update position
+ this.x += this.velocity.x * deltaTime;
+ this.y += this.velocity.y * deltaTime;
+ // Decrease lifespan
+ this.lifespan -= deltaTime;
+ if (this.lifespan <= 0) {
+ this.active = false;
+ }
+ }
+ }, {
+ key: "render",
+ value: function render() {
+ if (!this.active) {
+ return;
+ }
+ // Draw sparkle
+ var alpha = this.lifespan * 2; // Fade out
+ LK.setFillStyle(this.color.replace('0.8', alpha));
+ LK.fillRect(this.x, this.y, this.width, this.height);
+ }
+ }]);
+}(GameObject); // --- Game Functions ---
+// Create a sparkle effect
+function createSparkle(x, y, type) {
+ var sparkle = new Sparkle(x, y, type);
+ sparkles.push(sparkle);
+ return sparkle;
}
-function setupUI() {
- // Create UI elements if they don't exist
- if (!sparkleCounter) {
- sparkleCounter = game.addChild(new SparkleCounter());
- sparkleCounter.x = 1024 - 150;
- sparkleCounter.y = 30;
+// Spawn a power-up
+function spawnPowerUp(x, y) {
+ var powerUp = new PowerUp(x, y);
+ powerUps.push(powerUp);
+ return powerUp;
+}
+// Level up function
+function levelUp() {
+ level++;
+ multiplier = 1.0 + (level - 1) * 0.1;
+ // Create level up effect
+ var centerX = LK.canvas.width / 2;
+ var centerY = LK.canvas.height / 2;
+ // Create sparkles for level up effect
+ for (var i = 0; i < 20; i++) {
+ createSparkle(centerX + (Math.random() - 0.5) * 200, centerY + (Math.random() - 0.5) * 200, 'powerup');
}
- if (!levelIndicator) {
- levelIndicator = game.addChild(new LevelIndicator());
- levelIndicator.x = 1024 - 150;
- levelIndicator.y = 80;
+ // Reset enemy counter
+ enemiesDefeated = 0;
+}
+// Calculate idle points
+function calculateIdlePoints() {
+ var currentTime = Date.now();
+ var elapsedSeconds = (currentTime - idlePointsLastCalculated) / 1000;
+ // Calculate points based on cats and kittens
+ var pointsPerSecond = cats.length * BASE_IDLE_POINTS_RATE;
+ pointsPerSecond += kittens.length * (BASE_IDLE_POINTS_RATE * 0.6); // Kittens generate 60% of cat rate
+ // Apply level multiplier
+ pointsPerSecond *= multiplier;
+ // Add points
+ var pointsEarned = pointsPerSecond * elapsedSeconds;
+ idlePoints += pointsEarned;
+ score += pointsEarned;
+ // Update last calculation time
+ idlePointsLastCalculated = currentTime;
+ return pointsEarned;
+}
+// Spawn a new cat
+function spawnCat(x, y) {
+ if (idlePoints >= 50) {
+ // Cost to spawn a cat
+ idlePoints -= 50;
+ var cat = new Cat(x, y);
+ cats.push(cat);
+ return cat;
}
- if (!levelProgressBar) {
- levelProgressBar = game.addChild(new LevelProgressBar());
- levelProgressBar.x = 1024 - 150;
- levelProgressBar.y = 130;
+ return null;
+}
+// Spawn a new kitten
+function spawnKitten(x, y) {
+ if (idlePoints >= 30) {
+ // Cost to spawn a kitten
+ idlePoints -= 30;
+ var kitten = new Kitten(x, y);
+ kittens.push(kitten);
+ return kitten;
}
- if (!statsPanel) {
- statsPanel = game.addChild(new StatsPanel());
- statsPanel.x = 1024;
- statsPanel.y = 200;
- }
- if (!powerUpIndicator) {
- powerUpIndicator = game.addChild(new PowerUpIndicator());
- powerUpIndicator.x = 1024 - 150;
- powerUpIndicator.y = 250;
- }
- if (!catStatusDisplay) {
- catStatusDisplay = game.addChild(new CatStatusDisplay());
- catStatusDisplay.x = 1024 - 150;
- catStatusDisplay.y = 350;
- }
- if (!notificationArea) {
- notificationArea = game.addChild(new NotificationArea());
- notificationArea.x = 20;
- notificationArea.y = 550;
- }
- // Add achievement display
- if (!achievementDisplay) {
- achievementDisplay = game.addChild(new AchievementDisplay());
- achievementDisplay.x = 150;
- achievementDisplay.y = 200;
- achievementDisplay.visible = false; // Hidden by default, show on button click
- }
- // Update all UI elements
- updateUIElements();
+ return null;
}
-function updateGameElements() {
+// Update game state
+function updateGame(deltaTime) {
+ // Calculate idle points
+ calculateIdlePoints();
+ // Update all game objects
// Update cats
- cats.forEach(function (cat) {
- if (cat && typeof cat.update === 'function') {
- cat.update();
- }
- });
+ for (var i = cats.length - 1; i >= 0; i--) {
+ var cat = cats[i];
+ cat.update(deltaTime);
+ }
// Update kittens
- kittens.forEach(function (kitten) {
- if (kitten && typeof kitten.update === 'function') {
- kitten.update();
- }
- });
- // Update birds
+ for (var i = kittens.length - 1; i >= 0; i--) {
+ var kitten = kittens[i];
+ kitten.update(deltaTime);
+ }
+ // Update birds and remove inactive ones
for (var i = birds.length - 1; i >= 0; i--) {
var bird = birds[i];
- if (bird && typeof bird.update === 'function') {
- bird.update();
- }
- if (bird && bird.markedForRemoval) {
- game.removeChild(bird);
+ bird.update(deltaTime);
+ if (!bird.active) {
birds.splice(i, 1);
}
}
- // Update UFOs
+ // Update UFOs and remove inactive ones
for (var i = ufos.length - 1; i >= 0; i--) {
var ufo = ufos[i];
- if (ufo && typeof ufo.update === 'function') {
- ufo.update();
- }
- if (ufo && ufo.markedForRemoval) {
- game.removeChild(ufo);
+ ufo.update(deltaTime);
+ if (!ufo.active) {
ufos.splice(i, 1);
}
}
- // Update power-ups
+ // Update power-ups and remove inactive ones
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
- if (powerUp && typeof powerUp.update === 'function') {
- powerUp.update();
- }
- if (powerUp && powerUp.markedForRemoval) {
- game.removeChild(powerUp);
+ powerUp.update(deltaTime);
+ if (!powerUp.active) {
powerUps.splice(i, 1);
}
}
- // Update sparkles
- for (var i = 0; i < sparklePool.length; i++) {
- var sparkle = sparklePool[i];
- if (sparkle && sparkle.visible && typeof sparkle.update === 'function') {
- sparkle.update();
+ // Update sparkles and remove inactive ones
+ for (var i = sparkles.length - 1; i >= 0; i--) {
+ var sparkle = sparkles[i];
+ sparkle.update(deltaTime);
+ if (!sparkle.active) {
+ sparkles.splice(i, 1);
}
}
- // Spawn new birds based on level
- if (Math.random() < 0.01 * (1 + playerLevel * 0.1)) {
+ // Spawn birds
+ birdSpawnTimer += deltaTime * 1000; // Convert to milliseconds
+ if (birds.length < MAX_BIRDS && birdSpawnTimer >= BIRD_SPAWN_INTERVAL) {
var bird = new Bird();
- bird.x = 2048 + 100;
- bird.y = 1500 + Math.random() * 800;
- game.addChild(bird);
birds.push(bird);
+ birdSpawnTimer = 0;
}
- // Spawn UFOs every 5 levels
- if (playerLevel % 5 === 0 && Math.random() < 0.005) {
+ // Spawn UFOs
+ ufoSpawnTimer += deltaTime * 1000; // Convert to milliseconds
+ if (ufos.length < MAX_UFOS && ufoSpawnTimer >= UFO_SPAWN_INTERVAL && level >= 3) {
var ufo = new UFO();
- ufo.x = 2048 + 100;
- ufo.y = 1200 + Math.random() * 1000;
- game.addChild(ufo);
ufos.push(ufo);
+ ufoSpawnTimer = 0;
}
- // Spawn power-ups occasionally
- if (Math.random() < 0.002 * (1 + playerLevel * 0.05)) {
- spawnPowerUp();
- }
- // Run the cat defense system
- catDefenseSystem();
}
-function addCat(x, y) {
- if (x === undefined || y === undefined) {
- x = Math.random() * (2048 - 200) + 100;
- y = Math.random() * (2732 - 200) + 100;
+// Render game
+function renderGame() {
+ // Clear canvas
+ LK.clear();
+ // Draw background
+ LK.setFillStyle('#1a1a2e');
+ LK.fillRect(0, 0, LK.canvas.width, LK.canvas.height);
+ // Render all game objects
+ // Render sparkles first (background layer)
+ var _iterator = _createForOfIteratorHelper(sparkles),
+ _step;
+ try {
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
+ var sparkle = _step.value;
+ sparkle.render();
+ }
+ // Render power-ups
+ } catch (err) {
+ _iterator.e(err);
+ } finally {
+ _iterator.f();
}
- if (sparkles >= upgrades.catCost) {
- sparkles -= upgrades.catCost;
- var cat = new Cat();
- cat.x = x;
- cat.y = y;
- cats.push(cat);
- game.addChild(cat);
- upgrades.catCost = Math.floor(upgrades.catCost * upgrades.catMultiplier);
- checkAchievements();
- showNotification("New Cat", "A new cat has joined your garden!");
- return cat;
- } else {
- showNotification("Not Enough Sparkles", "You need " + Math.floor(upgrades.catCost) + " sparkles to buy a cat.");
- return false;
+ var _iterator2 = _createForOfIteratorHelper(powerUps),
+ _step2;
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var powerUp = _step2.value;
+ powerUp.render();
+ }
+ // Render birds
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
}
-}
-function addKitten(x, y) {
- if (x === undefined || y === undefined) {
- x = Math.random() * (2048 - 200) + 100;
- y = Math.random() * (2732 - 200) + 100;
+ var _iterator3 = _createForOfIteratorHelper(birds),
+ _step3;
+ try {
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
+ var bird = _step3.value;
+ bird.render();
+ }
+ // Render UFOs
+ } catch (err) {
+ _iterator3.e(err);
+ } finally {
+ _iterator3.f();
}
- var kittenCost = 30; // Base cost for a kitten
- if (sparkles >= kittenCost) {
- sparkles -= kittenCost;
- var kitten = new Kitten();
- kitten.x = x;
- kitten.y = y;
- kittens.push(kitten);
- game.addChild(kitten);
- checkAchievements();
- showNotification("New Kitten", "A new kitten has joined your garden!");
- return kitten;
- } else {
- showNotification("Not Enough Sparkles", "You need " + kittenCost + " sparkles to buy a kitten.");
- return false;
+ var _iterator4 = _createForOfIteratorHelper(ufos),
+ _step4;
+ try {
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
+ var ufo = _step4.value;
+ ufo.render();
+ }
+ // Render cats
+ } catch (err) {
+ _iterator4.e(err);
+ } finally {
+ _iterator4.f();
}
-}
-function spawnBird() {
- var bird = new Bird();
- bird.x = 2048 + 100;
- bird.y = 1500 + Math.random() * 800;
- birds.push(bird);
- game.addChild(bird);
- return bird;
-}
-function spawnUFO() {
- if (playerLevel % 5 === 0 && ufos.length < 3) {
- var ufo = new UFO();
- ufo.x = 2048 + 100;
- ufo.y = 1200 + Math.random() * 1000;
- ufos.push(ufo);
- game.addChild(ufo);
- return ufo;
+ var _iterator5 = _createForOfIteratorHelper(cats),
+ _step5;
+ try {
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
+ var cat = _step5.value;
+ cat.render();
+ }
+ // Render kittens
+ } catch (err) {
+ _iterator5.e(err);
+ } finally {
+ _iterator5.f();
}
- return null;
-}
-function spawnPowerUp() {
- if (Math.random() < 0.05 * (1 + playerLevel * 0.02)) {
- var type = Math.random() < 0.5 ? 'speed' : 'attack';
- var powerUp = new PowerUp(type);
- powerUp.x = Math.random() * (2048 - 200) + 100;
- powerUp.y = Math.random() * (2732 - 200) + 100;
- powerUps.push(powerUp);
- game.addChild(powerUp);
- return powerUp;
- }
- return null;
-}
-function createSparkleEffect(x, y, color, count) {
- color = color || 0xFFFFFF;
- count = count || 5;
- for (var c = 0; c < count; c++) {
- // Get a sparkle from the pool or create a new one
- var sparkle = null;
- for (var i = 0; i < sparklePool.length; i++) {
- if (!sparklePool[i].visible) {
- sparkle = sparklePool[i];
- break;
- }
+ var _iterator6 = _createForOfIteratorHelper(kittens),
+ _step6;
+ try {
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
+ var kitten = _step6.value;
+ kitten.render();
}
- if (!sparkle) {
- if (sparklePool.length < maxSparkles) {
- sparkle = new Sparkle();
- sparklePool.push(sparkle);
- game.addChild(sparkle);
- } else {
- // Reuse the oldest sparkle
- sparkle = sparklePool[0];
- sparklePool.push(sparklePool.shift());
- }
- }
- // Set up the sparkle
- sparkle.x = x + (Math.random() - 0.5) * 20;
- sparkle.y = y + (Math.random() - 0.5) * 20;
- sparkle.vx = (Math.random() - 0.5) * 3;
- sparkle.vy = (Math.random() - 0.5) * 3 - 2; // Bias upward
- sparkle.alpha = 1;
- sparkle.visible = true;
- sparkle.children[0].tint = color;
- // Play a sound occasionally
- if (c === 0 && Math.random() < 0.2 && sounds.length > 0) {
- var soundIndex = Math.floor(Math.random() * sounds.length);
- LK.getSound(sounds[soundIndex]).play();
- }
+ // Render UI
+ } catch (err) {
+ _iterator6.e(err);
+ } finally {
+ _iterator6.f();
}
+ renderUI();
}
-function updateGameMechanics() {
- // Auto-collect sparkles based on rate
- sparkles += autoSparkleRate * levelMultiplier / 60;
- totalSparklesEarned += autoSparkleRate * levelMultiplier / 60;
- // Spawn enemies based on level
- if (Math.random() < 0.01 * (1 + playerLevel * 0.05)) {
- spawnBird();
- }
- // Spawn UFOs every 5 levels
- if (playerLevel % 5 === 0 && Math.random() < 0.005) {
- spawnUFO();
- }
- // Spawn power-ups
- if (Math.random() < 0.001 * (1 + playerLevel * 0.02)) {
- spawnPowerUp();
- }
- // Check achievements
- checkAchievements();
+// Render UI elements
+function renderUI() {
+ // Score
+ LK.setFillStyle('#FFFFFF');
+ LK.setFont('24px Arial');
+ LK.fillText("Score: ".concat(Math.floor(score)), LK.canvas.width / 2, 30, {
+ align: 'center'
+ });
+ // Level
+ LK.setFont('18px Arial');
+ LK.fillText("Level: ".concat(level), LK.canvas.width - 20, 30, {
+ align: 'right'
+ });
+ // Multiplier
+ LK.fillText("Multiplier: x".concat(multiplier.toFixed(1)), LK.canvas.width - 20, 60, {
+ align: 'right'
+ });
+ // Idle Points
+ LK.fillText("Idle Points: ".concat(Math.floor(idlePoints)), LK.canvas.width - 20, LK.canvas.height - 20, {
+ align: 'right'
+ });
+ // Enemies Defeated
+ LK.fillText("Enemies: ".concat(enemiesDefeated, "/").concat(ENEMIES_PER_LEVEL), 20, 30, {
+ align: 'left'
+ });
+ // Cat Count
+ LK.fillText("Cats: ".concat(cats.length), 20, 60, {
+ align: 'left'
+ });
+ // Kitten Count
+ LK.fillText("Kittens: ".concat(kittens.length), 20, 90, {
+ align: 'left'
+ });
+ // Spawn buttons
+ renderButton("Add Cat (50)", 20, LK.canvas.height - 60, 120, 40, idlePoints >= 50);
+ renderButton("Add Kitten (30)", 150, LK.canvas.height - 60, 120, 40, idlePoints >= 30);
}
-function updateUIElements() {
- // Update sparkle counter
- if (sparkleCounter) {
- sparkleCounter.text = "Sparkles: " + Math.floor(sparkles);
+// Render a button
+function renderButton(text, x, y, width, height, enabled) {
+ // Button background
+ LK.setFillStyle(enabled ? '#33aa33' : '#666666');
+ LK.fillRect(x, y, width, height);
+ // Button border
+ LK.setStrokeStyle('#FFFFFF');
+ LK.strokeRect(x, y, width, height);
+ // Button text
+ LK.setFillStyle('#FFFFFF');
+ LK.setFont('14px Arial');
+ LK.fillText(text, x + width / 2, y + height / 2, {
+ align: 'center',
+ baseline: 'middle'
+ });
+}
+// Handle mouse click
+function handleMouseClick(x, y) {
+ // Check if cat spawn button clicked
+ if (x >= 20 && x <= 140 && y >= LK.canvas.height - 60 && y <= LK.canvas.height - 20) {
+ spawnCat(Math.random() * LK.canvas.width, Math.random() * LK.canvas.height);
}
- // Update level indicator
- if (levelIndicator) {
- levelIndicator.text = "Level: " + playerLevel;
+ // Check if kitten spawn button clicked
+ if (x >= 150 && x <= 270 && y >= LK.canvas.height - 60 && y <= LK.canvas.height - 20) {
+ spawnKitten(Math.random() * LK.canvas.width, Math.random() * LK.canvas.height);
}
- // Update level progress bar
- if (levelProgressBar) {
- levelProgressBar.scale.x = enemiesDefeated / 10;
- }
-}
\ No newline at end of file
+}
+// Initialize game
+function initGame() {
+ // Reset game state
+ cats = [];
+ kittens = [];
+ birds = [];
+ ufos = [];
+ powerUps = [];
+ sparkles = [];
+ score = 0;
+ level = 1;
+ multiplier = 1.0;
+ idlePoints = 100; // Start with enough for 2 cats or 3 kittens
+ enemiesDefeated = 0;
+ lastUpdateTime = Date.now();
+ idlePointsLastCalculated = Date.now();
+ birdSpawnTimer = 0;
+ ufoSpawnTimer = 0;
+ // Create initial cats
+ spawnCat(LK.canvas.width / 2, LK.canvas.height / 2);
+ // Setup mouse click handler
+ LK.onMouseDown = function (event) {
+ handleMouseClick(event.x, event.y);
+ };
+ // Start game loop
+ startGameLoop();
+}
+// Game loop
+var lastFrameTime = 0;
+function gameLoop(timestamp) {
+ // Calculate delta time
+ var deltaTime = (timestamp - lastFrameTime) / 1000; // Convert to seconds
+ lastFrameTime = timestamp;
+ // Update game state
+ updateGame(deltaTime);
+ // Render game
+ renderGame();
+ // Request next frame
+ requestAnimationFrame(gameLoop);
+}
+// Start game loop
+function startGameLoop() {
+ lastFrameTime = performance.now();
+ requestAnimationFrame(gameLoop);
+}
+// Initialize game when page loads
+window.onload = function () {
+ initGame();
+};
\ No newline at end of file
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