/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var BuffDog = Container.expand(function (team, x, y) { var self = Container.call(this); self.team = team; self.health = 3; self.lastShotTime = 0; self.shootCooldown = 1000; self.hasPowerUp = true; // BuffDog is always powered up self.speed = 120; // Ultra-fast speed making it appear as just a dot to human eye var petGraphics = self.attachAsset('Buffdog', { anchorX: 0.5, anchorY: 0.5, scaleX: 4.0, // Make it even bigger like a large brown dot that's highly visible scaleY: 4.0, // Make it even bigger like a large brown dot that's highly visible tint: 0x8B4513 // Big brown dot color for maximum visibility when moving fast }); // Add intense pulsing effect to emphasize the big brown dot appearance tween(petGraphics, { scaleX: 4.5, scaleY: 4.5, alpha: 0.9 }, { duration: 100, easing: tween.easeInOut, onFinish: function onFinish() { tween(petGraphics, { scaleX: 4.0, scaleY: 4.0, alpha: 1.0 }, { duration: 100, easing: tween.easeInOut }); } }); self.x = x; self.y = y; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 500); if (self.health <= 0) { self.destroy(); return true; // Pet is dead } return false; }; self.shoot = function (targetX, targetY) { var currentTime = Date.now(); if (currentTime - self.lastShotTime >= self.shootCooldown) { var bullet = new Bullet(self.team, self.x, self.y, targetX, targetY); game.addChild(bullet); bullets.push(bullet); self.lastShotTime = currentTime; LK.getSound('shoot').play(); } }; // BuffDog has aimbot - automatically targets and kills nearest enemy self.update = function () { if (gamePhase !== 'playing') return; var nearestTarget = null; var nearestDistance = Infinity; // Find nearest cat with aimbot precision for (var i = 0; i < enemyPets.length; i++) { var enemy = enemyPets[i]; if (enemy && enemy.parent && enemy.team === 'cat') { var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = enemy; } } } // Move towards nearest cat at extreme speed (dot-like movement) if (nearestTarget) { var dx = nearestTarget.x - self.x; var dy = nearestTarget.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { // Extreme speed movement making BuffDog appear as just a big brown dot self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; // Add additional movement blur for dot effect if (LK.ticks % 2 === 0) { self.x += dx / distance * (self.speed * 0.5); self.y += dy / distance * (self.speed * 0.5); } // Add motion blur effect to emphasize speed tween(petGraphics, { alpha: 0.6 }, { duration: 50, onFinish: function onFinish() { tween(petGraphics, { alpha: 1.0 }, { duration: 50 }); } }); } // Aimbot with instant kill - larger detection range if (distance < 150) { nearestTarget.health = 0; // Instant kill with aimbot precision LK.effects.flashObject(nearestTarget, 0xFFFF00, 800); var targetToDestroy = nearestTarget; tween(nearestTarget, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { if (targetToDestroy && targetToDestroy.parent) { targetToDestroy.destroy(); } } }); // Remove from enemy array for (var k = 0; k < enemyPets.length; k++) { if (enemyPets[k] === nearestTarget) { enemyPets.splice(k, 1); break; } } // Update score if (playerTeam === 'dog') { dogScore++; } updateScore(); updateLivesDisplay(); } // Auto-shoot with aimbot precision every few frames if (LK.ticks % 10 === 0 && nearestTarget) { self.shoot(nearestTarget.x, nearestTarget.y); } } }; return self; }); var Bullet = Container.expand(function (team, startX, startY, targetX, targetY) { var self = Container.call(this); self.team = team; self.speed = 8; var bulletGraphics = self.attachAsset(team === 'cat' ? 'catBullet' : 'dogBullet', { anchorX: 0.5, anchorY: 0.5 }); self.x = startX; self.y = startY; // Calculate direction var dx = targetX - startX; var dy = targetY - startY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.velocityX = dx / distance * self.speed; self.velocityY = dy / distance * self.speed; } else { self.velocityX = 0; self.velocityY = 0; } self.update = function () { self.x += self.velocityX; self.y += self.velocityY; }; return self; }); var BulletOfDeath = Container.expand(function (team, startX, startY, targetX, targetY) { var self = Container.call(this); self.team = team; self.speed = 15; // Faster than normal bullets self.isBulletOfDeath = true; // Mark as special bullet var bulletGraphics = self.attachAsset('Bulletofdeath', { anchorX: 0.5, anchorY: 0.5, tint: 0xFFD700 // Golden tint for BulletOfDeath }); // Add pulsing glow effect tween(bulletGraphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeInOut, onFinish: function onFinish() { tween(bulletGraphics, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeInOut }); } }); self.x = startX; self.y = startY; // Calculate direction var dx = targetX - startX; var dy = targetY - startY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.velocityX = dx / distance * self.speed; self.velocityY = dy / distance * self.speed; } else { self.velocityX = 0; self.velocityY = 0; } self.update = function () { self.x += self.velocityX; self.y += self.velocityY; }; return self; }); var Pet = Container.expand(function (team, x, y) { var self = Container.call(this); self.team = team; self.health = 3; self.lastShotTime = 0; self.shootCooldown = 1000; // 1 second between shots self.hasPowerUp = false; // Track if pet has power-up active var petGraphics = self.attachAsset(team, { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 500); if (self.health <= 0) { self.destroy(); return true; // Pet is dead } return false; }; self.shoot = function (targetX, targetY) { var currentTime = Date.now(); if (currentTime - self.lastShotTime >= self.shootCooldown) { var bullet; var finalTargetX = targetX; var finalTargetY = targetY; // If this is a powered-up cat, use smart targeting to find nearest enemy if (self.hasPowerUp && self.team === 'cat') { // Cats with powerup always shoot BulletOfDeath bullet = new BulletOfDeath(self.team, self.x, self.y, targetX, targetY); } else { bullet = new Bullet(self.team, self.x, self.y, targetX, targetY); } game.addChild(bullet); bullets.push(bullet); self.lastShotTime = currentTime; LK.getSound('shoot').play(); } }; return self; }); var PowerUp = Container.expand(function (x, y) { var self = Container.call(this); var powerupGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.type = 'speed'; // Could be expanded later // Gentle pulsing animation tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 1000, easing: tween.easeInOut }); } }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x90EE90 }); /**** * Game Code ****/ var gamePhase = 'teamSelect'; // 'teamSelect', 'playing', 'gameOver' var playerTeam = null; var playerPet = null; var enemyPets = []; var bullets = []; var powerups = []; var catScore = 0; var dogScore = 0; var targetScore = 25; var dragNode = null; var lastPowerupSpawn = 0; var powerupSpawnInterval = 10000; // 10 seconds // UI Elements var playerLivesText = new Text2('Your Lives: 3', { size: 40, fill: 0xFFFFFF }); playerLivesText.anchor.set(0, 0); playerLivesText.x = 120; // Avoid top-left platform menu playerLivesText.y = 50; var enemyLivesText = new Text2('Enemy Lives: 9', { size: 40, fill: 0xFFFFFF }); enemyLivesText.anchor.set(1, 0); enemyLivesText.x = 1948; // Top-right corner enemyLivesText.y = 50; var teamSelectText = new Text2('Choose Your Team!', { size: 80, fill: 0xFFFFFF }); teamSelectText.anchor.set(0.5, 0.5); teamSelectText.x = 1024; teamSelectText.y = 400; var catButton = LK.getAsset('cat', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); catButton.x = 700; catButton.y = 600; var dogButton = LK.getAsset('dog', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); dogButton.x = 1348; dogButton.y = 600; var catLabel = new Text2('CATS', { size: 60, fill: 0xFF6B35 }); catLabel.anchor.set(0.5, 0.5); catLabel.x = 700; catLabel.y = 750; var dogLabel = new Text2('DOGS', { size: 60, fill: 0x4A90E2 }); dogLabel.anchor.set(0.5, 0.5); dogLabel.x = 1348; dogLabel.y = 750; // Score display removed // Add team selection UI game.addChild(teamSelectText); game.addChild(catButton); game.addChild(dogButton); game.addChild(catLabel); game.addChild(dogLabel); function startGame(selectedTeam) { playerTeam = selectedTeam; gamePhase = 'playing'; // Remove team selection UI teamSelectText.destroy(); catButton.destroy(); dogButton.destroy(); catLabel.destroy(); dogLabel.destroy(); // Add lives GUI to overlay LK.gui.topLeft.addChild(playerLivesText); LK.gui.topRight.addChild(enemyLivesText); // Create player pet playerPet = new Pet(selectedTeam, 1024, 2000); game.addChild(playerPet); // Create enemy pets var enemyTeam = selectedTeam === 'cat' ? 'dog' : 'cat'; for (var i = 0; i < 3; i++) { var enemyX = 300 + i * 700; var enemyY = 500 + Math.random() * 300; var enemy = new Pet(enemyTeam, enemyX, enemyY); game.addChild(enemy); enemyPets.push(enemy); } lastPowerupSpawn = Date.now(); } function updateLivesDisplay() { if (playerLivesText && playerPet) { playerLivesText.setText('Your Lives: ' + playerPet.health); } // Count enemy team lives based on player's team var enemyTeamName = playerTeam === 'cat' ? 'dog' : 'cat'; var totalEnemyLives = 0; // Count enemy pets lives for (var i = 0; i < enemyPets.length; i++) { var enemy = enemyPets[i]; if (enemy && enemy.parent) { totalEnemyLives += enemy.health; } } if (enemyLivesText) { var displayText = (enemyTeamName === 'cat' ? 'Cat' : 'Dog') + ' Lives: ' + totalEnemyLives; enemyLivesText.setText(displayText); } } function updateScore() { if (catScore >= targetScore) { gamePhase = 'gameOver'; LK.showYouWin(); } else if (dogScore >= targetScore) { gamePhase = 'gameOver'; LK.showGameOver(); } } function findNearestTarget(pet) { var nearestTarget = null; var nearestDistance = Infinity; if (pet === playerPet) { // Player pet targets enemies for (var i = 0; i < enemyPets.length; i++) { var enemy = enemyPets[i]; if (enemy && enemy.parent) { var dx = enemy.x - pet.x; var dy = enemy.y - pet.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance) { nearestDistance = distance; nearestTarget = enemy; } } } } else { // Enemy pets target player if (playerPet && playerPet.parent) { nearestTarget = playerPet; } } return nearestTarget; } function spawnPowerup() { var currentTime = Date.now(); if (currentTime - lastPowerupSpawn >= powerupSpawnInterval && powerups.length < 2) { var x, y; if (playerTeam === 'cat') { // Spawn near player pet (cat) - bottom area of screen if (playerPet && playerPet.parent) { x = playerPet.x + (Math.random() - 0.5) * 400; // Within 200px left/right of player y = playerPet.y + (Math.random() - 0.5) * 300; // Within 150px up/down of player } else { // Fallback to bottom area if no player pet x = 500 + Math.random() * 1048; y = 1800 + Math.random() * 500; } } else if (playerTeam === 'dog') { // Spawn near enemy pets (also dogs in this case, but we need to spawn near player's allies) // Since player is dog team, we spawn near player pet if (playerPet && playerPet.parent) { x = playerPet.x + (Math.random() - 0.5) * 400; // Within 200px left/right of player y = playerPet.y + (Math.random() - 0.5) * 300; // Within 150px up/down of player } else { // Fallback to bottom area if no player pet x = 500 + Math.random() * 1048; y = 1800 + Math.random() * 500; } } // Ensure powerup stays within screen bounds x = Math.max(100, Math.min(1948, x)); y = Math.max(100, Math.min(2632, y)); var powerup = new PowerUp(x, y); game.addChild(powerup); powerups.push(powerup); lastPowerupSpawn = currentTime; } } // Event handlers catButton.down = function () { if (gamePhase === 'teamSelect') { startGame('cat'); } }; dogButton.down = function () { if (gamePhase === 'teamSelect') { startGame('dog'); } }; game.down = function (x, y, obj) { if (gamePhase === 'playing' && playerPet) { dragNode = playerPet; playerPet.x = x; playerPet.y = y; } }; game.move = function (x, y, obj) { if (gamePhase === 'playing' && dragNode === playerPet) { playerPet.x = Math.max(60, Math.min(1988, x)); playerPet.y = Math.max(60, Math.min(2672, y)); } }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { if (gamePhase !== 'playing') return; // Add enhanced trail effect for BuffDog to make big brown dot movement visible if (playerPet && playerPet.constructor === BuffDog) { // Create multiple flash effects for big brown dot trail LK.effects.flashObject(playerPet, 0x8B4513, 100); // Brown flash if (LK.ticks % 3 === 0) { LK.effects.flashObject(playerPet, 0xA0522D, 75); // Sandy brown flash } if (LK.ticks % 5 === 0) { LK.effects.flashObject(playerPet, 0xD2691E, 50); // Chocolate flash } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Check if bullet is off screen if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet collisions var hitTarget = null; if (bullet.team === playerTeam) { // Player bullet hitting enemies for (var j = 0; j < enemyPets.length; j++) { var enemy = enemyPets[j]; if (enemy && enemy.parent && bullet.intersects(enemy)) { hitTarget = enemy; if (playerTeam === 'cat') { catScore++; } else { dogScore++; } break; } } } else { // Enemy bullet hitting player if (playerPet && playerPet.parent && bullet.intersects(playerPet)) { hitTarget = playerPet; if (playerTeam === 'cat') { dogScore++; } else { catScore++; } } } if (hitTarget) { LK.getSound('hit').play(); var isDead = false; // Check if it's a BulletOfDeath hitting a dog - instant kill! if (bullet.isBulletOfDeath && hitTarget.team === 'dog') { hitTarget.health = 0; // Set health to 0 for instant kill isDead = true; // Special death effect for BulletOfDeath kills LK.effects.flashObject(hitTarget, 0xFFFF00, 800); // Golden flash for instant kill var targetToDestroy = hitTarget; // Store reference before tween tween(hitTarget, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { if (targetToDestroy && targetToDestroy.parent) { targetToDestroy.destroy(); } } }); } else { isDead = hitTarget.takeDamage(); } if (isDead) { if (hitTarget === playerPet) { // Respawn player after 2 seconds LK.setTimeout(function () { if (gamePhase === 'playing') { playerPet = new Pet(playerTeam, 1024, 2000); game.addChild(playerPet); } }, 2000); } else { // Remove from enemy array for (var k = 0; k < enemyPets.length; k++) { if (enemyPets[k] === hitTarget) { enemyPets.splice(k, 1); break; } } // Respawn enemy after 3 seconds LK.setTimeout(function () { if (gamePhase === 'playing') { var enemyTeam = playerTeam === 'cat' ? 'dog' : 'cat'; var enemyX = 300 + Math.random() * 1448; var enemyY = 300 + Math.random() * 800; var newEnemy = new Pet(enemyTeam, enemyX, enemyY); game.addChild(newEnemy); enemyPets.push(newEnemy); } }, 3000); } } bullet.destroy(); bullets.splice(i, 1); updateScore(); updateLivesDisplay(); continue; } } // Auto-shooting for all pets if (playerPet && playerPet.parent) { var target = findNearestTarget(playerPet); if (target) { playerPet.shoot(target.x, target.y); } } for (var i = 0; i < enemyPets.length; i++) { var enemy = enemyPets[i]; if (enemy && enemy.parent) { var target = findNearestTarget(enemy); if (target) { enemy.shoot(target.x, target.y); } } } // Check powerup collisions - both cats and dogs can use powerups for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; if (playerPet && playerPet.parent && powerup.intersects(playerPet)) { LK.getSound('powerup').play(); if (playerPet.team === 'cat') { // Cat power-up behavior (existing) playerPet.shootCooldown = 16; // Super fast shooting - 60 bullets per second! playerPet.hasPowerUp = true; // Enable BulletOfDeath mode // Add visual effect to show cat is powered up tween(playerPet, { scaleX: 1.3, scaleY: 1.3 }, { duration: 200, easing: tween.easeOut }); // Reset after 2 minutes (120 seconds) for extended mayhem LK.setTimeout(function () { if (playerPet && playerPet.parent) { playerPet.shootCooldown = 1000; playerPet.hasPowerUp = false; // Disable BulletOfDeath mode // Return cat to normal size tween(playerPet, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeOut }); } }, 120000); } else if (playerPet.team === 'dog') { // Dog power-up behavior - extremely rare chance to transform into BuffDog for ultimate speed and aimbot var buffDogChance = 0.0000000000000000000000000034; // 0000000000.000.000.00000.000.000.0.0.0.000000.0.34% chance to become BuffDog with aimbot and instant kill if (Math.random() < buffDogChance) { // Transform into BuffDog (extremely rare) var buffDogX = playerPet.x; var buffDogY = playerPet.y; var buffDogHealth = playerPet.health; // Remove old dog playerPet.destroy(); // Create BuffDog playerPet = new BuffDog('dog', buffDogX, buffDogY); playerPet.health = buffDogHealth; game.addChild(playerPet); // Add visual transformation effect tween(playerPet, { scaleX: 1.5, scaleY: 1.5 }, { duration: 300, easing: tween.easeOut }); // Revert back to normal dog after 10 seconds LK.setTimeout(function () { if (playerPet && playerPet.parent) { var normalDogX = playerPet.x; var normalDogY = playerPet.y; var normalDogHealth = playerPet.health; // Remove BuffDog playerPet.destroy(); // Create normal dog playerPet = new Pet('dog', normalDogX, normalDogY); playerPet.health = normalDogHealth; game.addChild(playerPet); } }, 10000); } else { // Normal dog power-up - faster shooting playerPet.shootCooldown = 200; // Faster shooting for normal dog playerPet.hasPowerUp = true; // Add visual effect to show dog is powered up tween(playerPet, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); // Reset after 8 seconds LK.setTimeout(function () { if (playerPet && playerPet.parent) { playerPet.shootCooldown = 1000; playerPet.hasPowerUp = false; // Return dog to normal size tween(playerPet, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeOut }); } }, 8000); } } powerup.destroy(); powerups.splice(i, 1); } } // Spawn powerups occasionally spawnPowerup(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BuffDog = Container.expand(function (team, x, y) {
var self = Container.call(this);
self.team = team;
self.health = 3;
self.lastShotTime = 0;
self.shootCooldown = 1000;
self.hasPowerUp = true; // BuffDog is always powered up
self.speed = 120; // Ultra-fast speed making it appear as just a dot to human eye
var petGraphics = self.attachAsset('Buffdog', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 4.0,
// Make it even bigger like a large brown dot that's highly visible
scaleY: 4.0,
// Make it even bigger like a large brown dot that's highly visible
tint: 0x8B4513 // Big brown dot color for maximum visibility when moving fast
});
// Add intense pulsing effect to emphasize the big brown dot appearance
tween(petGraphics, {
scaleX: 4.5,
scaleY: 4.5,
alpha: 0.9
}, {
duration: 100,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(petGraphics, {
scaleX: 4.0,
scaleY: 4.0,
alpha: 1.0
}, {
duration: 100,
easing: tween.easeInOut
});
}
});
self.x = x;
self.y = y;
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 500);
if (self.health <= 0) {
self.destroy();
return true; // Pet is dead
}
return false;
};
self.shoot = function (targetX, targetY) {
var currentTime = Date.now();
if (currentTime - self.lastShotTime >= self.shootCooldown) {
var bullet = new Bullet(self.team, self.x, self.y, targetX, targetY);
game.addChild(bullet);
bullets.push(bullet);
self.lastShotTime = currentTime;
LK.getSound('shoot').play();
}
};
// BuffDog has aimbot - automatically targets and kills nearest enemy
self.update = function () {
if (gamePhase !== 'playing') return;
var nearestTarget = null;
var nearestDistance = Infinity;
// Find nearest cat with aimbot precision
for (var i = 0; i < enemyPets.length; i++) {
var enemy = enemyPets[i];
if (enemy && enemy.parent && enemy.team === 'cat') {
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestTarget = enemy;
}
}
}
// Move towards nearest cat at extreme speed (dot-like movement)
if (nearestTarget) {
var dx = nearestTarget.x - self.x;
var dy = nearestTarget.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
// Extreme speed movement making BuffDog appear as just a big brown dot
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
// Add additional movement blur for dot effect
if (LK.ticks % 2 === 0) {
self.x += dx / distance * (self.speed * 0.5);
self.y += dy / distance * (self.speed * 0.5);
}
// Add motion blur effect to emphasize speed
tween(petGraphics, {
alpha: 0.6
}, {
duration: 50,
onFinish: function onFinish() {
tween(petGraphics, {
alpha: 1.0
}, {
duration: 50
});
}
});
}
// Aimbot with instant kill - larger detection range
if (distance < 150) {
nearestTarget.health = 0; // Instant kill with aimbot precision
LK.effects.flashObject(nearestTarget, 0xFFFF00, 800);
var targetToDestroy = nearestTarget;
tween(nearestTarget, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
if (targetToDestroy && targetToDestroy.parent) {
targetToDestroy.destroy();
}
}
});
// Remove from enemy array
for (var k = 0; k < enemyPets.length; k++) {
if (enemyPets[k] === nearestTarget) {
enemyPets.splice(k, 1);
break;
}
}
// Update score
if (playerTeam === 'dog') {
dogScore++;
}
updateScore();
updateLivesDisplay();
}
// Auto-shoot with aimbot precision every few frames
if (LK.ticks % 10 === 0 && nearestTarget) {
self.shoot(nearestTarget.x, nearestTarget.y);
}
}
};
return self;
});
var Bullet = Container.expand(function (team, startX, startY, targetX, targetY) {
var self = Container.call(this);
self.team = team;
self.speed = 8;
var bulletGraphics = self.attachAsset(team === 'cat' ? 'catBullet' : 'dogBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = startX;
self.y = startY;
// Calculate direction
var dx = targetX - startX;
var dy = targetY - startY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
} else {
self.velocityX = 0;
self.velocityY = 0;
}
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var BulletOfDeath = Container.expand(function (team, startX, startY, targetX, targetY) {
var self = Container.call(this);
self.team = team;
self.speed = 15; // Faster than normal bullets
self.isBulletOfDeath = true; // Mark as special bullet
var bulletGraphics = self.attachAsset('Bulletofdeath', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xFFD700 // Golden tint for BulletOfDeath
});
// Add pulsing glow effect
tween(bulletGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(bulletGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeInOut
});
}
});
self.x = startX;
self.y = startY;
// Calculate direction
var dx = targetX - startX;
var dy = targetY - startY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.velocityX = dx / distance * self.speed;
self.velocityY = dy / distance * self.speed;
} else {
self.velocityX = 0;
self.velocityY = 0;
}
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Pet = Container.expand(function (team, x, y) {
var self = Container.call(this);
self.team = team;
self.health = 3;
self.lastShotTime = 0;
self.shootCooldown = 1000; // 1 second between shots
self.hasPowerUp = false; // Track if pet has power-up active
var petGraphics = self.attachAsset(team, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFF0000, 500);
if (self.health <= 0) {
self.destroy();
return true; // Pet is dead
}
return false;
};
self.shoot = function (targetX, targetY) {
var currentTime = Date.now();
if (currentTime - self.lastShotTime >= self.shootCooldown) {
var bullet;
var finalTargetX = targetX;
var finalTargetY = targetY;
// If this is a powered-up cat, use smart targeting to find nearest enemy
if (self.hasPowerUp && self.team === 'cat') {
// Cats with powerup always shoot BulletOfDeath
bullet = new BulletOfDeath(self.team, self.x, self.y, targetX, targetY);
} else {
bullet = new Bullet(self.team, self.x, self.y, targetX, targetY);
}
game.addChild(bullet);
bullets.push(bullet);
self.lastShotTime = currentTime;
LK.getSound('shoot').play();
}
};
return self;
});
var PowerUp = Container.expand(function (x, y) {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
self.type = 'speed'; // Could be expanded later
// Gentle pulsing animation
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 1000,
easing: tween.easeInOut
});
}
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x90EE90
});
/****
* Game Code
****/
var gamePhase = 'teamSelect'; // 'teamSelect', 'playing', 'gameOver'
var playerTeam = null;
var playerPet = null;
var enemyPets = [];
var bullets = [];
var powerups = [];
var catScore = 0;
var dogScore = 0;
var targetScore = 25;
var dragNode = null;
var lastPowerupSpawn = 0;
var powerupSpawnInterval = 10000; // 10 seconds
// UI Elements
var playerLivesText = new Text2('Your Lives: 3', {
size: 40,
fill: 0xFFFFFF
});
playerLivesText.anchor.set(0, 0);
playerLivesText.x = 120; // Avoid top-left platform menu
playerLivesText.y = 50;
var enemyLivesText = new Text2('Enemy Lives: 9', {
size: 40,
fill: 0xFFFFFF
});
enemyLivesText.anchor.set(1, 0);
enemyLivesText.x = 1948; // Top-right corner
enemyLivesText.y = 50;
var teamSelectText = new Text2('Choose Your Team!', {
size: 80,
fill: 0xFFFFFF
});
teamSelectText.anchor.set(0.5, 0.5);
teamSelectText.x = 1024;
teamSelectText.y = 400;
var catButton = LK.getAsset('cat', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
catButton.x = 700;
catButton.y = 600;
var dogButton = LK.getAsset('dog', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
dogButton.x = 1348;
dogButton.y = 600;
var catLabel = new Text2('CATS', {
size: 60,
fill: 0xFF6B35
});
catLabel.anchor.set(0.5, 0.5);
catLabel.x = 700;
catLabel.y = 750;
var dogLabel = new Text2('DOGS', {
size: 60,
fill: 0x4A90E2
});
dogLabel.anchor.set(0.5, 0.5);
dogLabel.x = 1348;
dogLabel.y = 750;
// Score display removed
// Add team selection UI
game.addChild(teamSelectText);
game.addChild(catButton);
game.addChild(dogButton);
game.addChild(catLabel);
game.addChild(dogLabel);
function startGame(selectedTeam) {
playerTeam = selectedTeam;
gamePhase = 'playing';
// Remove team selection UI
teamSelectText.destroy();
catButton.destroy();
dogButton.destroy();
catLabel.destroy();
dogLabel.destroy();
// Add lives GUI to overlay
LK.gui.topLeft.addChild(playerLivesText);
LK.gui.topRight.addChild(enemyLivesText);
// Create player pet
playerPet = new Pet(selectedTeam, 1024, 2000);
game.addChild(playerPet);
// Create enemy pets
var enemyTeam = selectedTeam === 'cat' ? 'dog' : 'cat';
for (var i = 0; i < 3; i++) {
var enemyX = 300 + i * 700;
var enemyY = 500 + Math.random() * 300;
var enemy = new Pet(enemyTeam, enemyX, enemyY);
game.addChild(enemy);
enemyPets.push(enemy);
}
lastPowerupSpawn = Date.now();
}
function updateLivesDisplay() {
if (playerLivesText && playerPet) {
playerLivesText.setText('Your Lives: ' + playerPet.health);
}
// Count enemy team lives based on player's team
var enemyTeamName = playerTeam === 'cat' ? 'dog' : 'cat';
var totalEnemyLives = 0;
// Count enemy pets lives
for (var i = 0; i < enemyPets.length; i++) {
var enemy = enemyPets[i];
if (enemy && enemy.parent) {
totalEnemyLives += enemy.health;
}
}
if (enemyLivesText) {
var displayText = (enemyTeamName === 'cat' ? 'Cat' : 'Dog') + ' Lives: ' + totalEnemyLives;
enemyLivesText.setText(displayText);
}
}
function updateScore() {
if (catScore >= targetScore) {
gamePhase = 'gameOver';
LK.showYouWin();
} else if (dogScore >= targetScore) {
gamePhase = 'gameOver';
LK.showGameOver();
}
}
function findNearestTarget(pet) {
var nearestTarget = null;
var nearestDistance = Infinity;
if (pet === playerPet) {
// Player pet targets enemies
for (var i = 0; i < enemyPets.length; i++) {
var enemy = enemyPets[i];
if (enemy && enemy.parent) {
var dx = enemy.x - pet.x;
var dy = enemy.y - pet.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestTarget = enemy;
}
}
}
} else {
// Enemy pets target player
if (playerPet && playerPet.parent) {
nearestTarget = playerPet;
}
}
return nearestTarget;
}
function spawnPowerup() {
var currentTime = Date.now();
if (currentTime - lastPowerupSpawn >= powerupSpawnInterval && powerups.length < 2) {
var x, y;
if (playerTeam === 'cat') {
// Spawn near player pet (cat) - bottom area of screen
if (playerPet && playerPet.parent) {
x = playerPet.x + (Math.random() - 0.5) * 400; // Within 200px left/right of player
y = playerPet.y + (Math.random() - 0.5) * 300; // Within 150px up/down of player
} else {
// Fallback to bottom area if no player pet
x = 500 + Math.random() * 1048;
y = 1800 + Math.random() * 500;
}
} else if (playerTeam === 'dog') {
// Spawn near enemy pets (also dogs in this case, but we need to spawn near player's allies)
// Since player is dog team, we spawn near player pet
if (playerPet && playerPet.parent) {
x = playerPet.x + (Math.random() - 0.5) * 400; // Within 200px left/right of player
y = playerPet.y + (Math.random() - 0.5) * 300; // Within 150px up/down of player
} else {
// Fallback to bottom area if no player pet
x = 500 + Math.random() * 1048;
y = 1800 + Math.random() * 500;
}
}
// Ensure powerup stays within screen bounds
x = Math.max(100, Math.min(1948, x));
y = Math.max(100, Math.min(2632, y));
var powerup = new PowerUp(x, y);
game.addChild(powerup);
powerups.push(powerup);
lastPowerupSpawn = currentTime;
}
}
// Event handlers
catButton.down = function () {
if (gamePhase === 'teamSelect') {
startGame('cat');
}
};
dogButton.down = function () {
if (gamePhase === 'teamSelect') {
startGame('dog');
}
};
game.down = function (x, y, obj) {
if (gamePhase === 'playing' && playerPet) {
dragNode = playerPet;
playerPet.x = x;
playerPet.y = y;
}
};
game.move = function (x, y, obj) {
if (gamePhase === 'playing' && dragNode === playerPet) {
playerPet.x = Math.max(60, Math.min(1988, x));
playerPet.y = Math.max(60, Math.min(2672, y));
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gamePhase !== 'playing') return;
// Add enhanced trail effect for BuffDog to make big brown dot movement visible
if (playerPet && playerPet.constructor === BuffDog) {
// Create multiple flash effects for big brown dot trail
LK.effects.flashObject(playerPet, 0x8B4513, 100); // Brown flash
if (LK.ticks % 3 === 0) {
LK.effects.flashObject(playerPet, 0xA0522D, 75); // Sandy brown flash
}
if (LK.ticks % 5 === 0) {
LK.effects.flashObject(playerPet, 0xD2691E, 50); // Chocolate flash
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Check if bullet is off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet collisions
var hitTarget = null;
if (bullet.team === playerTeam) {
// Player bullet hitting enemies
for (var j = 0; j < enemyPets.length; j++) {
var enemy = enemyPets[j];
if (enemy && enemy.parent && bullet.intersects(enemy)) {
hitTarget = enemy;
if (playerTeam === 'cat') {
catScore++;
} else {
dogScore++;
}
break;
}
}
} else {
// Enemy bullet hitting player
if (playerPet && playerPet.parent && bullet.intersects(playerPet)) {
hitTarget = playerPet;
if (playerTeam === 'cat') {
dogScore++;
} else {
catScore++;
}
}
}
if (hitTarget) {
LK.getSound('hit').play();
var isDead = false;
// Check if it's a BulletOfDeath hitting a dog - instant kill!
if (bullet.isBulletOfDeath && hitTarget.team === 'dog') {
hitTarget.health = 0; // Set health to 0 for instant kill
isDead = true;
// Special death effect for BulletOfDeath kills
LK.effects.flashObject(hitTarget, 0xFFFF00, 800); // Golden flash for instant kill
var targetToDestroy = hitTarget; // Store reference before tween
tween(hitTarget, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
if (targetToDestroy && targetToDestroy.parent) {
targetToDestroy.destroy();
}
}
});
} else {
isDead = hitTarget.takeDamage();
}
if (isDead) {
if (hitTarget === playerPet) {
// Respawn player after 2 seconds
LK.setTimeout(function () {
if (gamePhase === 'playing') {
playerPet = new Pet(playerTeam, 1024, 2000);
game.addChild(playerPet);
}
}, 2000);
} else {
// Remove from enemy array
for (var k = 0; k < enemyPets.length; k++) {
if (enemyPets[k] === hitTarget) {
enemyPets.splice(k, 1);
break;
}
}
// Respawn enemy after 3 seconds
LK.setTimeout(function () {
if (gamePhase === 'playing') {
var enemyTeam = playerTeam === 'cat' ? 'dog' : 'cat';
var enemyX = 300 + Math.random() * 1448;
var enemyY = 300 + Math.random() * 800;
var newEnemy = new Pet(enemyTeam, enemyX, enemyY);
game.addChild(newEnemy);
enemyPets.push(newEnemy);
}
}, 3000);
}
}
bullet.destroy();
bullets.splice(i, 1);
updateScore();
updateLivesDisplay();
continue;
}
}
// Auto-shooting for all pets
if (playerPet && playerPet.parent) {
var target = findNearestTarget(playerPet);
if (target) {
playerPet.shoot(target.x, target.y);
}
}
for (var i = 0; i < enemyPets.length; i++) {
var enemy = enemyPets[i];
if (enemy && enemy.parent) {
var target = findNearestTarget(enemy);
if (target) {
enemy.shoot(target.x, target.y);
}
}
}
// Check powerup collisions - both cats and dogs can use powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (playerPet && playerPet.parent && powerup.intersects(playerPet)) {
LK.getSound('powerup').play();
if (playerPet.team === 'cat') {
// Cat power-up behavior (existing)
playerPet.shootCooldown = 16; // Super fast shooting - 60 bullets per second!
playerPet.hasPowerUp = true; // Enable BulletOfDeath mode
// Add visual effect to show cat is powered up
tween(playerPet, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 200,
easing: tween.easeOut
});
// Reset after 2 minutes (120 seconds) for extended mayhem
LK.setTimeout(function () {
if (playerPet && playerPet.parent) {
playerPet.shootCooldown = 1000;
playerPet.hasPowerUp = false; // Disable BulletOfDeath mode
// Return cat to normal size
tween(playerPet, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut
});
}
}, 120000);
} else if (playerPet.team === 'dog') {
// Dog power-up behavior - extremely rare chance to transform into BuffDog for ultimate speed and aimbot
var buffDogChance = 0.0000000000000000000000000034; // 0000000000.000.000.00000.000.000.0.0.0.000000.0.34% chance to become BuffDog with aimbot and instant kill
if (Math.random() < buffDogChance) {
// Transform into BuffDog (extremely rare)
var buffDogX = playerPet.x;
var buffDogY = playerPet.y;
var buffDogHealth = playerPet.health;
// Remove old dog
playerPet.destroy();
// Create BuffDog
playerPet = new BuffDog('dog', buffDogX, buffDogY);
playerPet.health = buffDogHealth;
game.addChild(playerPet);
// Add visual transformation effect
tween(playerPet, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
easing: tween.easeOut
});
// Revert back to normal dog after 10 seconds
LK.setTimeout(function () {
if (playerPet && playerPet.parent) {
var normalDogX = playerPet.x;
var normalDogY = playerPet.y;
var normalDogHealth = playerPet.health;
// Remove BuffDog
playerPet.destroy();
// Create normal dog
playerPet = new Pet('dog', normalDogX, normalDogY);
playerPet.health = normalDogHealth;
game.addChild(playerPet);
}
}, 10000);
} else {
// Normal dog power-up - faster shooting
playerPet.shootCooldown = 200; // Faster shooting for normal dog
playerPet.hasPowerUp = true;
// Add visual effect to show dog is powered up
tween(playerPet, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut
});
// Reset after 8 seconds
LK.setTimeout(function () {
if (playerPet && playerPet.parent) {
playerPet.shootCooldown = 1000;
playerPet.hasPowerUp = false;
// Return dog to normal size
tween(playerPet, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut
});
}
}, 8000);
}
}
powerup.destroy();
powerups.splice(i, 1);
}
}
// Spawn powerups occasionally
spawnPowerup();
};