User prompt
7 mucize ekle
User prompt
0.7 snde bir olsun
User prompt
erdo gidince 15 sn boyunca kalkan extradan 3lü patlayan mermi 5li normal mermiyi 0.2 snde bir atar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
erdo ile canlan çalışmıyo yine ölüyorum tekrar oyna yazıyo ama altında canlan tuşu yok bide erdo diye varlıklarda nesne yok
User prompt
sadece düşmanlara ateş etcek erdo yoksa oyun kasıyo ama her canlıya aynı anda bide tekrar oynanın altında erdo varken ölmeme rağmen canlan tuşu yok onu ekle
User prompt
erdo bi karakter olacak canın azalınca rasgele bi yönden ortaya doğru hareket edip ortada tüm düşmanlara aynı anada 15 sn boyunca çok hızlı mermi yağdırcak ölürsen ve erdo var ise tekrar oynanın altına erdo ile canlana basıp hayata tam can ile dönersin yeniden canlanırken dev bi patlama yaparsın etrafındakilerin canı azalır ve 8 sn donarlar sende 5li mermi atarsın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Erdo diye yardımcı karakter ekle canın azken gelir ve her yöne çok hızlı mermi fırlatır
User prompt
daha çok spawn olsunlar ve daha çok kan daha çok vahşet ve daha çok boss ve omega ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
kan izleri ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
oyuna kan ekle
User prompt
Please fix the bug: 'HeroBase is not defined' in or related to this line: 'heroBase = game.addChild(new HeroBase());' Line Number: 1742
User prompt
o baseyi kaldır ve yeni hayvanlar ve yeni 6 mucize ekle
User prompt
baseye girince menü açılıyo ve oyun donuyo menüye dair herşeyi yok et dedim
User prompt
AMAAAAN MENÜYÜ KALDIR GİTSİN
User prompt
menü açıkken hareket kapansın oyun dursun sadece menüden birini seçince devam etsin
User prompt
menü tüm ekranı kaplasın ve çalışsın lütfen
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = self.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 151
User prompt
baseye girince bi menü açılsın o menüden seçtiğimiz hayvan türünü 1 dk liğine kontrol edip kendi türlerine düşman etme ekle yeni hayvanlar ve omege hayvanlar ekle bossun olduğu levelleri arttır ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
daha da güçlendir hayvanları ama daha çok mucize ekle zman mucizesi vb. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
hipertavuk artık boss olacak skor 1000 küsürlerde gelcek canı çok olacak bide base yap bizim basemiz orası güvenli orda hayvanlar akumayabileceğimizz çıkabilirca basen bize destek olup hayvanlara saldıracaklar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
hiper hayvan ekle hiperşarj ekle yeni mucizeler ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
geliştir oyunu yeni miraculouslar yeni tip hayvanlar civciv yılan fare vb.
Code edit (1 edits merged)
Please save this source code
User prompt
Miraculous Farm Defense
Initial prompt
3d oyun yap fps oyunu koyun inek tavuk gibi düşmanlarla savaşıyoz muzize uğur böceğindeki mucizeleri kullanıyoruz veya hayvanları öldürerek elde ediyoruz
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BaseBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('baseBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.damage = 20;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var BaseMenu = Container.expand(function () {
var self = Container.call(this);
var menuBg = self.attachAsset('baseMenu', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x2c2c2c
});
self.isVisible = false;
self.visible = false;
self.buttons = [];
self.animalTypes = ['sheep', 'cow', 'chicken', 'pig', 'goat', 'duck'];
self.createButtons = function () {
var startY = -100;
for (var i = 0; i < self.animalTypes.length; i++) {
var button = LK.getAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x666666
});
button.x = 0;
button.y = startY + i * 60;
button.animalType = self.animalTypes[i];
self.addChild(button);
self.buttons.push(button);
var buttonText = new Text2(self.animalTypes[i].toUpperCase(), {
size: 20,
fill: 0xffffff
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = 0;
buttonText.y = startY + i * 60;
self.addChild(buttonText);
}
};
self.show = function () {
self.isVisible = true;
self.visible = true;
tween(self, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
};
self.hide = function () {
self.isVisible = false;
tween(self, {
alpha: 0,
scaleX: 0.8,
scaleY: 0.8
}, {
duration: 300,
onFinish: function onFinish() {
self.visible = false;
}
});
};
self.down = function (x, y, obj) {
if (!self.isVisible) return;
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
for (var i = 0; i < self.buttons.length; i++) {
var button = self.buttons[i];
var dx = localPos.x - button.x;
var dy = localPos.y - button.y;
if (Math.abs(dx) <= 75 && Math.abs(dy) <= 25) {
controlledAnimalType = button.animalType;
controlledAnimalDuration = 60000; // 1 minute
self.hide();
break;
}
}
};
self.alpha = 0;
self.scaleX = 0.8;
self.scaleY = 0.8;
self.createButtons();
return self;
});
var BaseTurret = Container.expand(function () {
var self = Container.call(this);
var turretGraphics = self.attachAsset('baseTurret', {
anchorX: 0.5,
anchorY: 0.5
});
self.lastShot = 0;
self.shootCooldown = 500;
self.range = 300;
self.damage = 20;
self.findNearestEnemy = function () {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance && distance <= self.range) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
return nearestEnemy;
};
self.shootAtEnemy = function (target) {
var bullet = new BaseBullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.setTarget(target.x, target.y);
bullet.damage = self.damage;
baseBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.update = function () {
if (LK.ticks - self.lastShot > self.shootCooldown / 16.67) {
var target = self.findNearestEnemy();
if (target) {
self.shootAtEnemy(target);
self.lastShot = LK.ticks;
var angle = Math.atan2(target.y - self.y, target.x - self.x);
turretGraphics.rotation = angle;
}
}
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.directionX = 0;
self.directionY = 0;
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
var dx = x - self.x;
var dy = y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
}
};
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var ControlledAnimal = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'sheep';
self.speed = 3;
self.damage = 30;
self.health = 100;
self.maxHealth = 100;
var animalGraphics = self.attachAsset('controlledAnimal', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x00ffff
});
self.takeDamage = function (damage) {
self.health -= damage;
tween(animalGraphics, {
tint: 0xff0000
}, {
duration: 100,
onFinish: function onFinish() {
tween(animalGraphics, {
tint: 0x00ffff
}, {
duration: 100
});
}
});
if (self.health <= 0) {
return true;
}
return false;
};
self.attackEnemies = function () {
var attackRange = 100;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.type === self.type) continue; // Don't attack same type
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= attackRange) {
var enemyDied = enemy.takeDamage(self.damage);
if (enemyDied) {
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
};
self.update = function () {
// Attack nearby enemies of different types
if (LK.ticks % 30 === 0) {
self.attackEnemies();
}
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'sheep';
self.speed = 1;
self.damage = 10;
self.health = 30;
self.maxHealth = 30;
var enemyGraphics;
if (self.type === 'sheep') {
enemyGraphics = self.attachAsset('sheep', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.8;
self.damage = 18;
self.health = 55;
self.maxHealth = 55;
} else if (self.type === 'cow') {
enemyGraphics = self.attachAsset('cow', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.2;
self.damage = 35;
self.health = 100;
self.maxHealth = 100;
} else if (self.type === 'chicken') {
enemyGraphics = self.attachAsset('chicken', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.5;
self.damage = 12;
self.health = 35;
self.maxHealth = 35;
} else if (self.type === 'chick') {
enemyGraphics = self.attachAsset('chick', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.damage = 8;
self.health = 20;
self.maxHealth = 20;
} else if (self.type === 'snake') {
enemyGraphics = self.attachAsset('snake', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.2;
self.damage = 28;
self.health = 50;
self.maxHealth = 50;
self.zigzagTimer = 0;
self.zigzagDirection = 1;
} else if (self.type === 'mouse') {
enemyGraphics = self.attachAsset('mouse', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.damage = 10;
self.health = 25;
self.maxHealth = 25;
self.jumpTimer = 0;
self.isJumping = false;
} else if (self.type === 'hyperSheep') {
enemyGraphics = self.attachAsset('hyperSheep', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.5;
self.damage = 45;
self.health = 150;
self.maxHealth = 150;
self.chargeTimer = 0;
self.isCharging = false;
} else if (self.type === 'hyperCow') {
enemyGraphics = self.attachAsset('hyperCow', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.5;
self.damage = 65;
self.health = 200;
self.maxHealth = 200;
self.rageMode = false;
self.rageDuration = 0;
} else if (self.type === 'hyperChicken') {
enemyGraphics = self.attachAsset('hyperChicken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 3.5;
self.damage = 60;
self.health = 800;
self.maxHealth = 800;
self.flightTimer = 0;
self.isFlying = false;
self.isBoss = true;
} else if (self.type === 'pig') {
enemyGraphics = self.attachAsset('pig', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1.5;
self.damage = 22;
self.health = 70;
self.maxHealth = 70;
self.rollTimer = 0;
self.isRolling = false;
} else if (self.type === 'goat') {
enemyGraphics = self.attachAsset('goat', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2.8;
self.damage = 32;
self.health = 85;
self.maxHealth = 85;
self.headbuttTimer = 0;
} else if (self.type === 'duck') {
enemyGraphics = self.attachAsset('duck', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3.2;
self.damage = 18;
self.health = 40;
self.maxHealth = 40;
self.quackTimer = 0;
} else if (self.type === 'rabbit') {
enemyGraphics = self.attachAsset('rabbit', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4.5;
self.damage = 15;
self.health = 30;
self.maxHealth = 30;
self.hopTimer = 0;
} else if (self.type === 'omegaSheep') {
enemyGraphics = self.attachAsset('omegaSheep', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 4.2;
self.damage = 80;
self.health = 350;
self.maxHealth = 350;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaCow') {
enemyGraphics = self.attachAsset('omegaCow', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 3.8;
self.damage = 100;
self.health = 450;
self.maxHealth = 450;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaChicken') {
enemyGraphics = self.attachAsset('omegaChicken', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 5.0;
self.damage = 70;
self.health = 300;
self.maxHealth = 300;
self.omegaTimer = 0;
self.isOmega = true;
} else if (self.type === 'omegaPig') {
enemyGraphics = self.attachAsset('omegaPig', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 4.5;
self.damage = 90;
self.health = 380;
self.maxHealth = 380;
self.omegaTimer = 0;
self.isOmega = true;
}
self.takeDamage = function (damage) {
self.health -= damage;
// Flash red when hit
tween(enemyGraphics, {
tint: 0xff0000
}, {
duration: 100
});
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 100
});
if (self.health <= 0) {
return true; // Enemy died
}
return false;
};
self.update = function () {
// Move towards hero
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
if (self.type === 'snake') {
// Snake moves in zigzag pattern
self.zigzagTimer++;
if (self.zigzagTimer > 20) {
self.zigzagDirection *= -1;
self.zigzagTimer = 0;
}
var zigzagOffset = self.zigzagDirection * 30;
self.x += dx / distance * self.speed + zigzagOffset * 0.02;
self.y += dy / distance * self.speed;
} else if (self.type === 'mouse') {
// Mouse jumps towards hero
self.jumpTimer++;
if (self.jumpTimer > 40 && !self.isJumping) {
self.isJumping = true;
self.jumpTimer = 0;
// Quick jump movement
tween(self, {
x: self.x + dx / distance * self.speed * 8,
y: self.y + dy / distance * self.speed * 8
}, {
duration: 300,
onComplete: function onComplete() {
self.isJumping = false;
}
});
} else if (!self.isJumping) {
// Slow movement when not jumping
self.x += dx / distance * (self.speed * 0.3);
self.y += dy / distance * (self.speed * 0.3);
}
} else if (self.type === 'hyperSheep') {
// HyperSheep charges at hero periodically
self.chargeTimer++;
if (self.chargeTimer > 60 && !self.isCharging) {
self.isCharging = true;
self.chargeTimer = 0;
// Charge attack with visual effect
tween(enemyGraphics, {
tint: 0xff0000
}, {
duration: 200
});
tween(self, {
x: self.x + dx / distance * self.speed * 12,
y: self.y + dy / distance * self.speed * 12
}, {
duration: 500,
onFinish: function onFinish() {
self.isCharging = false;
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
} else if (!self.isCharging) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else if (self.type === 'hyperCow') {
// HyperCow enters rage mode when low health
if (self.health <= self.maxHealth * 0.3 && !self.rageMode) {
self.rageMode = true;
self.rageDuration = 5000;
self.speed *= 2;
self.damage *= 1.5;
tween(enemyGraphics, {
tint: 0xff4400
}, {
duration: 300
});
}
if (self.rageMode) {
self.rageDuration -= 16.67;
if (self.rageDuration <= 0) {
self.rageMode = false;
self.speed /= 2;
self.damage /= 1.5;
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 300
});
}
}
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
} else if (self.type === 'hyperChicken') {
// HyperChicken flies in aerial patterns
self.flightTimer++;
if (self.flightTimer > 120 && !self.isFlying) {
self.isFlying = true;
self.flightTimer = 0;
// Aerial dive attack
tween(self, {
x: hero.x,
y: hero.y - 100
}, {
duration: 800,
onFinish: function onFinish() {
tween(self, {
x: hero.x,
y: hero.y
}, {
duration: 400,
onFinish: function onFinish() {
self.isFlying = false;
}
});
}
});
} else if (!self.isFlying) {
// Circle around hero
var angle = Math.atan2(dy, dx) + Math.sin(LK.ticks * 0.05) * 0.5;
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
}
} else if (self.type === 'pig') {
// Pig rolls towards hero
self.rollTimer++;
if (self.rollTimer > 80 && !self.isRolling) {
self.isRolling = true;
self.rollTimer = 0;
tween(self, {
x: self.x + dx / distance * self.speed * 6,
y: self.y + dy / distance * self.speed * 6
}, {
duration: 600,
onFinish: function onFinish() {
self.isRolling = false;
}
});
} else if (!self.isRolling) {
self.x += dx / distance * self.speed * 0.5;
self.y += dy / distance * self.speed * 0.5;
}
} else if (self.type === 'goat') {
// Goat charges with headbutt
self.headbuttTimer++;
if (self.headbuttTimer > 70) {
self.headbuttTimer = 0;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * self.speed * 2;
self.y += Math.sin(angle) * self.speed * 2;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else if (self.type === 'duck') {
// Duck waddles in wavy pattern
self.quackTimer++;
var waveOffset = Math.sin(self.quackTimer * 0.1) * 20;
self.x += dx / distance * self.speed + waveOffset * 0.02;
self.y += dy / distance * self.speed;
} else if (self.type === 'rabbit') {
// Rabbit hops quickly
self.hopTimer++;
if (self.hopTimer > 25) {
self.hopTimer = 0;
self.x += dx / distance * self.speed * 2;
self.y += dy / distance * self.speed * 2;
} else {
self.x += dx / distance * self.speed * 0.3;
self.y += dy / distance * self.speed * 0.3;
}
} else if (self.type.indexOf('omega') === 0) {
// Omega animals have enhanced movement
self.omegaTimer++;
if (self.omegaTimer > 60) {
self.omegaTimer = 0;
// Omega boost
tween(enemyGraphics, {
tint: 0xff00ff
}, {
duration: 200,
onFinish: function onFinish() {
tween(enemyGraphics, {
tint: 0xffffff
}, {
duration: 200
});
}
});
self.x += dx / distance * self.speed * 3;
self.y += dy / distance * self.speed * 3;
} else {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
} else {
// Normal movement for other enemies
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = self.maxHealth;
self.speed = 4;
self.normalSpeed = 4;
self.boostedSpeed = 8;
self.hasShield = false;
self.shieldDuration = 0;
self.rapidFire = false;
self.rapidFireDuration = 0;
self.lastShot = 0;
self.shootCooldown = 300; // milliseconds
self.normalShootCooldown = 300;
self.rapidShootCooldown = 100;
self.hyperchargeMode = false;
self.hyperhargeDuration = 0;
self.invisibilityMode = false;
self.invisibilityDuration = 0;
self.multiShotMode = false;
self.multiShotDuration = 0;
self.timeSlowMode = false;
self.timeSlowDuration = 0;
self.timeStopMode = false;
self.timeStopDuration = 0;
self.timeRewindMode = false;
self.timeRewindDuration = 0;
self.savedPosition = {
x: 0,
y: 0
};
self.savedHealth = 0;
var shieldGraphics = self.attachAsset('shieldEffect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
shieldGraphics.visible = false;
self.takeDamage = function (damage) {
if (self.hasShield) {
return false; // No damage taken
}
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
return true; // Hero died
}
return false;
};
self.activateShield = function () {
self.hasShield = true;
self.shieldDuration = 5000; // 5 seconds
shieldGraphics.visible = true;
LK.getSound('powerUp').play();
};
self.activateSpeedBoost = function () {
self.speed = self.boostedSpeed;
LK.getSound('powerUp').play();
LK.setTimeout(function () {
self.speed = self.normalSpeed;
}, 3000);
};
self.activateRapidFire = function () {
self.rapidFire = true;
self.rapidFireDuration = 4000; // 4 seconds
self.shootCooldown = self.rapidShootCooldown;
LK.getSound('powerUp').play();
};
self.activateFreeze = function () {
freezeEnemies();
LK.getSound('powerUp').play();
};
self.activateExplosion = function () {
explodeNearbyEnemies();
LK.getSound('powerUp').play();
};
self.activateHealing = function () {
self.health = Math.min(self.health + 30, self.maxHealth);
LK.getSound('powerUp').play();
};
self.activateHypercharge = function () {
self.hyperchargeMode = true;
self.hyperhargeDuration = 8000; // 8 seconds
self.speed = self.boostedSpeed * 1.5;
self.shootCooldown = 50; // Very fast shooting
heroGraphics.tint = 0xffff00; // Yellow tint
LK.getSound('hypercharge').play();
};
self.activateTeleport = function () {
// Teleport to random safe location
var safeX = Math.random() * (2048 - 160) + 80;
var safeY = Math.random() * (2732 - 160) + 80;
tween(self, {
x: safeX,
y: safeY
}, {
duration: 100
});
LK.getSound('teleport').play();
};
self.activateInvisibility = function () {
self.invisibilityMode = true;
self.invisibilityDuration = 5000; // 5 seconds
heroGraphics.alpha = 0.3;
LK.getSound('powerUp').play();
};
self.activateMultiShot = function () {
self.multiShotMode = true;
self.multiShotDuration = 6000; // 6 seconds
LK.getSound('powerUp').play();
};
self.activateTimeSlow = function () {
self.timeSlowMode = true;
self.timeSlowDuration = 8000; // 8 seconds
timeSlowFactor = 0.3; // Slow down time
LK.getSound('timeSlow').play();
};
self.activateTimeStop = function () {
self.timeStopMode = true;
self.timeStopDuration = 3000; // 3 seconds
timeStopActive = true;
LK.getSound('timeStop').play();
};
self.activateTimeRewind = function () {
// Save current position and health for rewind
self.savedPosition.x = self.x;
self.savedPosition.y = self.y;
self.savedHealth = self.health;
self.timeRewindMode = true;
self.timeRewindDuration = 5000; // 5 seconds
LK.getSound('timeRewind').play();
};
self.update = function () {
if (self.shieldDuration > 0) {
self.shieldDuration -= 16.67; // Approximately 60fps
if (self.shieldDuration <= 0) {
self.hasShield = false;
shieldGraphics.visible = false;
}
}
if (self.rapidFireDuration > 0) {
self.rapidFireDuration -= 16.67;
if (self.rapidFireDuration <= 0) {
self.rapidFire = false;
self.shootCooldown = self.normalShootCooldown;
}
}
if (self.hyperhargeDuration > 0) {
self.hyperhargeDuration -= 16.67;
if (self.hyperhargeDuration <= 0) {
self.hyperchargeMode = false;
self.speed = self.normalSpeed;
self.shootCooldown = self.normalShootCooldown;
heroGraphics.tint = 0xffffff;
}
}
if (self.invisibilityDuration > 0) {
self.invisibilityDuration -= 16.67;
if (self.invisibilityDuration <= 0) {
self.invisibilityMode = false;
heroGraphics.alpha = 1.0;
}
}
if (self.multiShotDuration > 0) {
self.multiShotDuration -= 16.67;
if (self.multiShotDuration <= 0) {
self.multiShotMode = false;
}
}
if (self.timeSlowDuration > 0) {
self.timeSlowDuration -= 16.67;
if (self.timeSlowDuration <= 0) {
self.timeSlowMode = false;
timeSlowFactor = 1.0; // Reset time speed
}
}
if (self.timeStopDuration > 0) {
self.timeStopDuration -= 16.67;
if (self.timeStopDuration <= 0) {
self.timeStopMode = false;
timeStopActive = false;
}
}
if (self.timeRewindDuration > 0) {
self.timeRewindDuration -= 16.67;
if (self.timeRewindDuration <= 0) {
self.timeRewindMode = false;
// Execute rewind effect
self.x = self.savedPosition.x;
self.y = self.savedPosition.y;
self.health = self.savedHealth;
tween(self, {
alpha: 0.5
}, {
duration: 300,
onFinish: function onFinish() {
tween(self, {
alpha: 1.0
}, {
duration: 300
});
}
});
}
}
};
return self;
});
var HeroBase = Container.expand(function () {
var self = Container.call(this);
var baseGraphics = self.attachAsset('heroBase', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x8b4513
});
self.turrets = [];
self.safeZone = true;
self.addTurret = function (offsetX, offsetY) {
var turret = new BaseTurret();
turret.x = self.x + offsetX;
turret.y = self.y + offsetY;
self.turrets.push(turret);
game.addChild(turret);
};
self.initializeTurrets = function () {
self.addTurret(-80, -80);
self.addTurret(80, -80);
self.addTurret(-80, 80);
self.addTurret(80, 80);
};
self.isHeroInSafeZone = function (heroX, heroY) {
var dx = heroX - self.x;
var dy = heroY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var inSafeZone = distance <= 100;
// Show base menu if hero enters safe zone
if (inSafeZone && !baseMenu.isVisible && controlledAnimal === null) {
baseMenu.show();
}
// Hide base menu if hero leaves safe zone
else if (!inSafeZone && baseMenu.isVisible) {
baseMenu.hide();
}
return inSafeZone;
};
self.update = function () {
for (var i = 0; i < self.turrets.length; i++) {
self.turrets[i].update();
}
};
return self;
});
var MiracleToken = Container.expand(function () {
var self = Container.call(this);
var tokenGraphics;
self.type = 'speed'; // speed, shield, rapidFire, freeze, explosion, healing
self.bobOffset = Math.random() * Math.PI * 2;
self.startY = 0;
self.setTokenType = function (type) {
self.type = type;
if (type === 'freeze') {
tokenGraphics = self.attachAsset('freezeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'explosion') {
tokenGraphics = self.attachAsset('explosionToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'healing') {
tokenGraphics = self.attachAsset('healingToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'hypercharge') {
tokenGraphics = self.attachAsset('hyperchargeToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'teleport') {
tokenGraphics = self.attachAsset('teleportToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'invisibility') {
tokenGraphics = self.attachAsset('invisibilityToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'multiShot') {
tokenGraphics = self.attachAsset('multiShotToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeSlow') {
tokenGraphics = self.attachAsset('timeSlowToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeStop') {
tokenGraphics = self.attachAsset('timeStopToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'timeRewind') {
tokenGraphics = self.attachAsset('timeRewindToken', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
tokenGraphics = self.attachAsset('miracleToken', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
// Initialize with default token
self.setTokenType('speed');
self.update = function () {
// Bobbing animation
self.y = self.startY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 10;
// Rotate
tokenGraphics.rotation += 0.05;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22 // Forest green background
});
/****
* Game Code
****/
// Game state variables
// Hero character
// Farm animal enemies
// Projectiles and power-ups
// UI elements
// Sound effects
var hero;
var enemies = [];
var bullets = [];
var miracleTokens = [];
var gameState = 'playing'; // playing, gameOver
var currentWave = 1;
var enemiesInWave = 3;
var enemiesSpawned = 0;
var waveSpawnTimer = 0;
var nextWaveTimer = 0;
var miracleTokenCount = 0;
var lastAutoShoot = 0;
var dragNode = null;
var frozenEnemies = [];
var freezeDuration = 0;
var heroBase;
var baseBullets = [];
var bossSpawned = false;
var baseMenu;
var controlledAnimal = null;
var controlledAnimalType = '';
var controlledAnimalDuration = 0;
var bossLevels = [1000, 2500, 5000, 8000, 12000];
var currentBossLevel = 0;
// UI elements
var healthBar;
var healthBarBg;
var scoreTxt;
var waveTxt;
var miracleCountTxt;
// Initialize UI
function initializeUI() {
// Health bar background
healthBarBg = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
tint: 0x444444,
width: 220,
height: 25
});
// Health bar
healthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0,
width: 200,
height: 20
});
LK.gui.topLeft.addChild(healthBarBg);
LK.gui.topLeft.addChild(healthBar);
healthBarBg.x = 120;
healthBarBg.y = 20;
healthBar.x = 130;
healthBar.y = 25;
// Score text
scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Wave text
waveTxt = new Text2('Wave: 1', {
size: 50,
fill: 0xFFFF00
});
waveTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(waveTxt);
waveTxt.x = -20;
waveTxt.y = 20;
// Miracle token count
miracleCountTxt = new Text2('Miracles: 0', {
size: 45,
fill: 0xFFD700
});
miracleCountTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(miracleCountTxt);
miracleCountTxt.x = -20;
miracleCountTxt.y = 80;
}
// Initialize hero
function initializeHero() {
hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
}
// Spawn enemy
function spawnEnemy() {
var enemy;
var rand = Math.random();
// Check if boss should spawn at different levels
var shouldSpawnBoss = false;
var bossType = 'hyperChicken';
for (var b = 0; b < bossLevels.length; b++) {
if (LK.getScore() >= bossLevels[b] && currentBossLevel <= b) {
shouldSpawnBoss = true;
currentBossLevel = b + 1;
if (b === 0) bossType = 'hyperChicken';else if (b === 1) bossType = 'omegaSheep';else if (b === 2) bossType = 'omegaCow';else if (b === 3) bossType = 'omegaChicken';else bossType = 'omegaPig';
break;
}
}
if (shouldSpawnBoss) {
enemy = new Enemy(bossType);
} else if (currentWave <= 2) {
enemy = new Enemy('sheep');
} else if (currentWave <= 4) {
if (rand < 0.7) {
enemy = new Enemy('sheep');
} else {
enemy = new Enemy('chicken');
}
} else {
if (rand < 0.12) {
enemy = new Enemy('sheep');
} else if (rand < 0.22) {
enemy = new Enemy('chicken');
} else if (rand < 0.32) {
enemy = new Enemy('cow');
} else if (rand < 0.42) {
enemy = new Enemy('chick');
} else if (rand < 0.52) {
enemy = new Enemy('snake');
} else if (rand < 0.62) {
enemy = new Enemy('mouse');
} else if (rand < 0.68) {
enemy = new Enemy('pig');
} else if (rand < 0.74) {
enemy = new Enemy('goat');
} else if (rand < 0.80) {
enemy = new Enemy('duck');
} else if (rand < 0.85) {
enemy = new Enemy('rabbit');
} else if (rand < 0.90) {
enemy = new Enemy('hyperSheep');
} else if (rand < 0.95) {
enemy = new Enemy('hyperCow');
} else {
enemy = new Enemy('hyperChicken');
}
}
// Spawn from random edge
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// Top
enemy.x = Math.random() * 2048;
enemy.y = -50;
} else if (side === 1) {
// Right
enemy.x = 2048 + 50;
enemy.y = Math.random() * 2732;
} else if (side === 2) {
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 50;
} else {
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
}
enemies.push(enemy);
game.addChild(enemy);
}
// Create bullet towards nearest enemy
function shootAtNearestEnemy() {
if (enemies.length === 0) return;
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < nearestDistance) {
nearestDistance = distance;
nearestEnemy = enemy;
}
}
if (nearestEnemy) {
if (hero.multiShotMode) {
// Fire 3 bullets in spread pattern
for (var i = -1; i <= 1; i++) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
var angle = Math.atan2(nearestEnemy.y - hero.y, nearestEnemy.x - hero.x) + i * 0.3;
var targetX = hero.x + Math.cos(angle) * 500;
var targetY = hero.y + Math.sin(angle) * 500;
bullet.setTarget(targetX, targetY);
bullets.push(bullet);
game.addChild(bullet);
}
} else {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
bullet.setTarget(nearestEnemy.x, nearestEnemy.y);
bullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
}
}
// Create miracle token
function createMiracleToken(x, y) {
var token = new MiracleToken();
token.x = x;
token.y = y;
token.startY = y;
var rand = Math.random();
if (rand < 0.08) {
token.setTokenType('speed');
} else if (rand < 0.16) {
token.setTokenType('shield');
} else if (rand < 0.24) {
token.setTokenType('rapidFire');
} else if (rand < 0.32) {
token.setTokenType('freeze');
} else if (rand < 0.40) {
token.setTokenType('explosion');
} else if (rand < 0.48) {
token.setTokenType('healing');
} else if (rand < 0.56) {
token.setTokenType('hypercharge');
} else if (rand < 0.64) {
token.setTokenType('teleport');
} else if (rand < 0.72) {
token.setTokenType('invisibility');
} else if (rand < 0.80) {
token.setTokenType('multiShot');
} else if (rand < 0.87) {
token.setTokenType('timeSlow');
} else if (rand < 0.94) {
token.setTokenType('timeStop');
} else {
token.setTokenType('timeRewind');
}
miracleTokens.push(token);
game.addChild(token);
}
// Freeze all enemies
function freezeEnemies() {
freezeDuration = 3000; // 3 seconds
for (var i = 0; i < enemies.length; i++) {
enemies[i].frozenSpeed = enemies[i].speed;
enemies[i].speed = 0;
enemies[i].isFrozen = true;
// Visual effect - tint blue
tween(enemies[i], {
tint: 0x0088ff
}, {
duration: 200
});
}
}
// Explode nearby enemies
function explodeNearbyEnemies() {
var explosionRadius = 200;
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
var dx = enemy.x - hero.x;
var dy = enemy.y - hero.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= explosionRadius) {
// Create explosion effect
LK.effects.flashObject(enemy, 0xff4400, 300);
var enemyDied = enemy.takeDamage(50);
if (enemyDied) {
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(i, 1);
}
}
}
}
// Handle move events
function handleMove(x, y, obj) {
if (gameState !== 'playing') return;
if (dragNode) {
// Keep hero within bounds
dragNode.x = Math.max(40, Math.min(2048 - 40, x));
dragNode.y = Math.max(40, Math.min(2732 - 40, y));
}
// Control animal if active
if (controlledAnimal && !dragNode) {
controlledAnimal.x = Math.max(40, Math.min(2048 - 40, x));
controlledAnimal.y = Math.max(40, Math.min(2732 - 40, y));
}
}
// Touch/mouse events
game.move = handleMove;
game.down = function (x, y, obj) {
if (gameState !== 'playing') return;
dragNode = hero;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Initialize base
function initializeBase() {
heroBase = game.addChild(new HeroBase());
heroBase.x = 2048 / 2;
heroBase.y = 2732 - 200;
heroBase.initializeTurrets();
}
// Initialize game
initializeUI();
initializeHero();
initializeBase();
// Initialize base menu
baseMenu = game.addChild(new BaseMenu());
baseMenu.x = 2048 / 2;
baseMenu.y = 2732 / 2;
// Main game update loop
game.update = function () {
if (gameState !== 'playing') return;
// Update hero
hero.update();
// Update controlled animal
if (controlledAnimal) {
controlledAnimal.update();
controlledAnimalDuration -= 16.67;
if (controlledAnimalDuration <= 0) {
controlledAnimal.destroy();
controlledAnimal = null;
controlledAnimalType = '';
}
}
// Create controlled animal if type selected
if (controlledAnimalType !== '' && controlledAnimal === null) {
controlledAnimal = game.addChild(new ControlledAnimal(controlledAnimalType));
controlledAnimal.x = heroBase.x;
controlledAnimal.y = heroBase.y - 50;
}
// Update base
heroBase.update();
// Check if hero is in safe zone
var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y);
// Update freeze duration
if (freezeDuration > 0) {
freezeDuration -= 16.67; // Approximately 60fps
if (freezeDuration <= 0) {
// Unfreeze all enemies
for (var i = 0; i < enemies.length; i++) {
if (enemies[i].isFrozen) {
enemies[i].speed = enemies[i].frozenSpeed;
enemies[i].isFrozen = false;
// Remove blue tint
tween(enemies[i], {
tint: 0xffffff
}, {
duration: 200
});
}
}
}
}
// Update health bar
var healthPercent = hero.health / hero.maxHealth;
healthBar.width = 200 * healthPercent;
// Auto shoot
if (LK.ticks - lastAutoShoot > hero.shootCooldown / 16.67) {
shootAtNearestEnemy();
lastAutoShoot = LK.ticks;
}
// Wave spawning
if (enemiesSpawned < enemiesInWave) {
waveSpawnTimer++;
if (waveSpawnTimer >= 90) {
// Spawn every 1.5 seconds
spawnEnemy();
enemiesSpawned++;
waveSpawnTimer = 0;
}
}
// Check for next wave
if (enemiesSpawned >= enemiesInWave && enemies.length === 0) {
nextWaveTimer++;
if (nextWaveTimer >= 120) {
// 2 second delay
currentWave++;
enemiesInWave = 3 + currentWave;
enemiesSpawned = 0;
nextWaveTimer = 0;
waveTxt.setText('Wave: ' + currentWave);
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Apply time effects to enemy movement
if (!timeStopActive) {
var originalSpeed = enemy.speed;
enemy.speed *= timeSlowFactor;
enemy.update();
enemy.speed = originalSpeed;
}
// Check collision with controlled animal
if (controlledAnimal && enemy.intersects(controlledAnimal) && enemy.type !== controlledAnimal.type) {
var animalDied = controlledAnimal.takeDamage(enemy.damage);
if (animalDied) {
controlledAnimal.destroy();
controlledAnimal = null;
controlledAnimalType = '';
controlledAnimalDuration = 0;
}
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with hero (only if not in safe zone)
if (enemy.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) {
var heroDied = hero.takeDamage(enemy.damage);
if (heroDied) {
gameState = 'gameOver';
LK.showGameOver();
return;
}
// Remove enemy after collision
enemy.destroy();
enemies.splice(i, 1);
LK.effects.flashScreen(0xff0000, 500);
continue;
}
// Remove enemies that are too far off screen
if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) {
enemy.destroy();
enemies.splice(i, 1);
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var enemyDied = enemy.takeDamage(bullet.damage);
if (enemyDied) {
// Create miracle token chance
if (Math.random() < 0.3) {
// 30% chance
createMiracleToken(enemy.x, enemy.y);
}
var scoreIncrease = enemy.isBoss ? 100 : 10;
LK.setScore(LK.getScore() + scoreIncrease);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
bullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
// Remove bullets that are off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
}
}
// Update base bullets
for (var i = baseBullets.length - 1; i >= 0; i--) {
var bullet = baseBullets[i];
bullet.update();
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
var enemyDied = enemy.takeDamage(bullet.damage);
if (enemyDied) {
// Create miracle token chance
if (Math.random() < 0.3) {
createMiracleToken(enemy.x, enemy.y);
}
var scoreIncrease = enemy.isBoss ? 100 : 10;
LK.setScore(LK.getScore() + scoreIncrease);
scoreTxt.setText('Score: ' + LK.getScore());
enemy.destroy();
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
baseBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (hitEnemy) continue;
// Remove bullets that are off screen
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
baseBullets.splice(i, 1);
}
}
// Update miracle tokens
for (var i = miracleTokens.length - 1; i >= 0; i--) {
var token = miracleTokens[i];
token.update();
// Check collision with hero
if (token.intersects(hero)) {
miracleTokenCount++;
miracleCountTxt.setText('Miracles: ' + miracleTokenCount);
// Activate power-up
if (token.type === 'speed') {
hero.activateSpeedBoost();
} else if (token.type === 'shield') {
hero.activateShield();
} else if (token.type === 'rapidFire') {
hero.activateRapidFire();
} else if (token.type === 'freeze') {
hero.activateFreeze();
} else if (token.type === 'explosion') {
hero.activateExplosion();
} else if (token.type === 'healing') {
hero.activateHealing();
} else if (token.type === 'hypercharge') {
hero.activateHypercharge();
} else if (token.type === 'teleport') {
hero.activateTeleport();
} else if (token.type === 'invisibility') {
hero.activateInvisibility();
} else if (token.type === 'multiShot') {
hero.activateMultiShot();
} else if (token.type === 'timeSlow') {
hero.activateTimeSlow();
} else if (token.type === 'timeStop') {
hero.activateTimeStop();
} else if (token.type === 'timeRewind') {
hero.activateTimeRewind();
}
LK.getSound('tokenCollect').play();
token.destroy();
miracleTokens.splice(i, 1);
}
}
};
var bossSpawned = false;
var timeSlowFactor = 1.0;
var timeStopActive = false;
// UI elements
var healthBar; ===================================================================
--- original.js
+++ change.js
@@ -34,8 +34,87 @@
self.y += self.directionY * self.speed;
};
return self;
});
+var BaseMenu = Container.expand(function () {
+ var self = Container.call(this);
+ var menuBg = self.attachAsset('baseMenu', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0x2c2c2c
+ });
+ self.isVisible = false;
+ self.visible = false;
+ self.buttons = [];
+ self.animalTypes = ['sheep', 'cow', 'chicken', 'pig', 'goat', 'duck'];
+ self.createButtons = function () {
+ var startY = -100;
+ for (var i = 0; i < self.animalTypes.length; i++) {
+ var button = LK.getAsset('menuButton', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0x666666
+ });
+ button.x = 0;
+ button.y = startY + i * 60;
+ button.animalType = self.animalTypes[i];
+ self.addChild(button);
+ self.buttons.push(button);
+ var buttonText = new Text2(self.animalTypes[i].toUpperCase(), {
+ size: 20,
+ fill: 0xffffff
+ });
+ buttonText.anchor.set(0.5, 0.5);
+ buttonText.x = 0;
+ buttonText.y = startY + i * 60;
+ self.addChild(buttonText);
+ }
+ };
+ self.show = function () {
+ self.isVisible = true;
+ self.visible = true;
+ tween(self, {
+ alpha: 1,
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 300
+ });
+ };
+ self.hide = function () {
+ self.isVisible = false;
+ tween(self, {
+ alpha: 0,
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ self.visible = false;
+ }
+ });
+ };
+ self.down = function (x, y, obj) {
+ if (!self.isVisible) return;
+ var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
+ for (var i = 0; i < self.buttons.length; i++) {
+ var button = self.buttons[i];
+ var dx = localPos.x - button.x;
+ var dy = localPos.y - button.y;
+ if (Math.abs(dx) <= 75 && Math.abs(dy) <= 25) {
+ controlledAnimalType = button.animalType;
+ controlledAnimalDuration = 60000; // 1 minute
+ self.hide();
+ break;
+ }
+ }
+ };
+ self.alpha = 0;
+ self.scaleX = 0.8;
+ self.scaleY = 0.8;
+ self.createButtons();
+ return self;
+});
var BaseTurret = Container.expand(function () {
var self = Container.call(this);
var turretGraphics = self.attachAsset('baseTurret', {
anchorX: 0.5,
@@ -111,8 +190,66 @@
self.y += self.directionY * self.speed;
};
return self;
});
+var ControlledAnimal = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'sheep';
+ self.speed = 3;
+ self.damage = 30;
+ self.health = 100;
+ self.maxHealth = 100;
+ var animalGraphics = self.attachAsset('controlledAnimal', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: 0x00ffff
+ });
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ tween(animalGraphics, {
+ tint: 0xff0000
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(animalGraphics, {
+ tint: 0x00ffff
+ }, {
+ duration: 100
+ });
+ }
+ });
+ if (self.health <= 0) {
+ return true;
+ }
+ return false;
+ };
+ self.attackEnemies = function () {
+ var attackRange = 100;
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.type === self.type) continue; // Don't attack same type
+ var dx = enemy.x - self.x;
+ var dy = enemy.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= attackRange) {
+ var enemyDied = enemy.takeDamage(self.damage);
+ if (enemyDied) {
+ LK.setScore(LK.getScore() + 15);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ }
+ };
+ self.update = function () {
+ // Attack nearby enemies of different types
+ if (LK.ticks % 30 === 0) {
+ self.attackEnemies();
+ }
+ };
+ return self;
+});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'sheep';
self.speed = 1;
@@ -213,8 +350,101 @@
self.maxHealth = 800;
self.flightTimer = 0;
self.isFlying = false;
self.isBoss = true;
+ } else if (self.type === 'pig') {
+ enemyGraphics = self.attachAsset('pig', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1.5;
+ self.damage = 22;
+ self.health = 70;
+ self.maxHealth = 70;
+ self.rollTimer = 0;
+ self.isRolling = false;
+ } else if (self.type === 'goat') {
+ enemyGraphics = self.attachAsset('goat', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2.8;
+ self.damage = 32;
+ self.health = 85;
+ self.maxHealth = 85;
+ self.headbuttTimer = 0;
+ } else if (self.type === 'duck') {
+ enemyGraphics = self.attachAsset('duck', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3.2;
+ self.damage = 18;
+ self.health = 40;
+ self.maxHealth = 40;
+ self.quackTimer = 0;
+ } else if (self.type === 'rabbit') {
+ enemyGraphics = self.attachAsset('rabbit', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4.5;
+ self.damage = 15;
+ self.health = 30;
+ self.maxHealth = 30;
+ self.hopTimer = 0;
+ } else if (self.type === 'omegaSheep') {
+ enemyGraphics = self.attachAsset('omegaSheep', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ self.speed = 4.2;
+ self.damage = 80;
+ self.health = 350;
+ self.maxHealth = 350;
+ self.omegaTimer = 0;
+ self.isOmega = true;
+ } else if (self.type === 'omegaCow') {
+ enemyGraphics = self.attachAsset('omegaCow', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ self.speed = 3.8;
+ self.damage = 100;
+ self.health = 450;
+ self.maxHealth = 450;
+ self.omegaTimer = 0;
+ self.isOmega = true;
+ } else if (self.type === 'omegaChicken') {
+ enemyGraphics = self.attachAsset('omegaChicken', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ self.speed = 5.0;
+ self.damage = 70;
+ self.health = 300;
+ self.maxHealth = 300;
+ self.omegaTimer = 0;
+ self.isOmega = true;
+ } else if (self.type === 'omegaPig') {
+ enemyGraphics = self.attachAsset('omegaPig', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ self.speed = 4.5;
+ self.damage = 90;
+ self.health = 380;
+ self.maxHealth = 380;
+ self.omegaTimer = 0;
+ self.isOmega = true;
}
self.takeDamage = function (damage) {
self.health -= damage;
// Flash red when hit
@@ -357,8 +587,80 @@
var angle = Math.atan2(dy, dx) + Math.sin(LK.ticks * 0.05) * 0.5;
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
}
+ } else if (self.type === 'pig') {
+ // Pig rolls towards hero
+ self.rollTimer++;
+ if (self.rollTimer > 80 && !self.isRolling) {
+ self.isRolling = true;
+ self.rollTimer = 0;
+ tween(self, {
+ x: self.x + dx / distance * self.speed * 6,
+ y: self.y + dy / distance * self.speed * 6
+ }, {
+ duration: 600,
+ onFinish: function onFinish() {
+ self.isRolling = false;
+ }
+ });
+ } else if (!self.isRolling) {
+ self.x += dx / distance * self.speed * 0.5;
+ self.y += dy / distance * self.speed * 0.5;
+ }
+ } else if (self.type === 'goat') {
+ // Goat charges with headbutt
+ self.headbuttTimer++;
+ if (self.headbuttTimer > 70) {
+ self.headbuttTimer = 0;
+ var angle = Math.atan2(dy, dx);
+ self.x += Math.cos(angle) * self.speed * 2;
+ self.y += Math.sin(angle) * self.speed * 2;
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ } else if (self.type === 'duck') {
+ // Duck waddles in wavy pattern
+ self.quackTimer++;
+ var waveOffset = Math.sin(self.quackTimer * 0.1) * 20;
+ self.x += dx / distance * self.speed + waveOffset * 0.02;
+ self.y += dy / distance * self.speed;
+ } else if (self.type === 'rabbit') {
+ // Rabbit hops quickly
+ self.hopTimer++;
+ if (self.hopTimer > 25) {
+ self.hopTimer = 0;
+ self.x += dx / distance * self.speed * 2;
+ self.y += dy / distance * self.speed * 2;
+ } else {
+ self.x += dx / distance * self.speed * 0.3;
+ self.y += dy / distance * self.speed * 0.3;
+ }
+ } else if (self.type.indexOf('omega') === 0) {
+ // Omega animals have enhanced movement
+ self.omegaTimer++;
+ if (self.omegaTimer > 60) {
+ self.omegaTimer = 0;
+ // Omega boost
+ tween(enemyGraphics, {
+ tint: 0xff00ff
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(enemyGraphics, {
+ tint: 0xffffff
+ }, {
+ duration: 200
+ });
+ }
+ });
+ self.x += dx / distance * self.speed * 3;
+ self.y += dy / distance * self.speed * 3;
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
} else {
// Normal movement for other enemies
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
@@ -604,9 +906,18 @@
self.isHeroInSafeZone = function (heroX, heroY) {
var dx = heroX - self.x;
var dy = heroY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
- return distance <= 100;
+ var inSafeZone = distance <= 100;
+ // Show base menu if hero enters safe zone
+ if (inSafeZone && !baseMenu.isVisible && controlledAnimal === null) {
+ baseMenu.show();
+ }
+ // Hide base menu if hero leaves safe zone
+ else if (!inSafeZone && baseMenu.isVisible) {
+ baseMenu.hide();
+ }
+ return inSafeZone;
};
self.update = function () {
for (var i = 0; i < self.turrets.length; i++) {
self.turrets[i].update();
@@ -723,8 +1034,14 @@
var freezeDuration = 0;
var heroBase;
var baseBullets = [];
var bossSpawned = false;
+var baseMenu;
+var controlledAnimal = null;
+var controlledAnimalType = '';
+var controlledAnimalDuration = 0;
+var bossLevels = [1000, 2500, 5000, 8000, 12000];
+var currentBossLevel = 0;
// UI elements
var healthBar;
var healthBarBg;
var scoreTxt;
@@ -788,12 +1105,21 @@
// Spawn enemy
function spawnEnemy() {
var enemy;
var rand = Math.random();
- // Check if boss should spawn
- if (LK.getScore() >= 1000 && !bossSpawned) {
- enemy = new Enemy('hyperChicken');
- bossSpawned = true;
+ // Check if boss should spawn at different levels
+ var shouldSpawnBoss = false;
+ var bossType = 'hyperChicken';
+ for (var b = 0; b < bossLevels.length; b++) {
+ if (LK.getScore() >= bossLevels[b] && currentBossLevel <= b) {
+ shouldSpawnBoss = true;
+ currentBossLevel = b + 1;
+ if (b === 0) bossType = 'hyperChicken';else if (b === 1) bossType = 'omegaSheep';else if (b === 2) bossType = 'omegaCow';else if (b === 3) bossType = 'omegaChicken';else bossType = 'omegaPig';
+ break;
+ }
+ }
+ if (shouldSpawnBoss) {
+ enemy = new Enemy(bossType);
} else if (currentWave <= 2) {
enemy = new Enemy('sheep');
} else if (currentWave <= 4) {
if (rand < 0.7) {
@@ -801,24 +1127,34 @@
} else {
enemy = new Enemy('chicken');
}
} else {
- if (rand < 0.2) {
+ if (rand < 0.12) {
enemy = new Enemy('sheep');
- } else if (rand < 0.35) {
+ } else if (rand < 0.22) {
enemy = new Enemy('chicken');
- } else if (rand < 0.45) {
+ } else if (rand < 0.32) {
enemy = new Enemy('cow');
- } else if (rand < 0.55) {
+ } else if (rand < 0.42) {
enemy = new Enemy('chick');
- } else if (rand < 0.65) {
+ } else if (rand < 0.52) {
enemy = new Enemy('snake');
- } else if (rand < 0.75) {
+ } else if (rand < 0.62) {
enemy = new Enemy('mouse');
+ } else if (rand < 0.68) {
+ enemy = new Enemy('pig');
+ } else if (rand < 0.74) {
+ enemy = new Enemy('goat');
+ } else if (rand < 0.80) {
+ enemy = new Enemy('duck');
} else if (rand < 0.85) {
+ enemy = new Enemy('rabbit');
+ } else if (rand < 0.90) {
enemy = new Enemy('hyperSheep');
- } else {
+ } else if (rand < 0.95) {
enemy = new Enemy('hyperCow');
+ } else {
+ enemy = new Enemy('hyperChicken');
}
}
// Spawn from random edge
var side = Math.floor(Math.random() * 4);
@@ -962,8 +1298,13 @@
// Keep hero within bounds
dragNode.x = Math.max(40, Math.min(2048 - 40, x));
dragNode.y = Math.max(40, Math.min(2732 - 40, y));
}
+ // Control animal if active
+ if (controlledAnimal && !dragNode) {
+ controlledAnimal.x = Math.max(40, Math.min(2048 - 40, x));
+ controlledAnimal.y = Math.max(40, Math.min(2732 - 40, y));
+ }
}
// Touch/mouse events
game.move = handleMove;
game.down = function (x, y, obj) {
@@ -984,13 +1325,33 @@
// Initialize game
initializeUI();
initializeHero();
initializeBase();
+// Initialize base menu
+baseMenu = game.addChild(new BaseMenu());
+baseMenu.x = 2048 / 2;
+baseMenu.y = 2732 / 2;
// Main game update loop
game.update = function () {
if (gameState !== 'playing') return;
// Update hero
hero.update();
+ // Update controlled animal
+ if (controlledAnimal) {
+ controlledAnimal.update();
+ controlledAnimalDuration -= 16.67;
+ if (controlledAnimalDuration <= 0) {
+ controlledAnimal.destroy();
+ controlledAnimal = null;
+ controlledAnimalType = '';
+ }
+ }
+ // Create controlled animal if type selected
+ if (controlledAnimalType !== '' && controlledAnimal === null) {
+ controlledAnimal = game.addChild(new ControlledAnimal(controlledAnimalType));
+ controlledAnimal.x = heroBase.x;
+ controlledAnimal.y = heroBase.y - 50;
+ }
// Update base
heroBase.update();
// Check if hero is in safe zone
var heroInSafeZone = heroBase.isHeroInSafeZone(hero.x, hero.y);
@@ -1052,8 +1413,21 @@
enemy.speed *= timeSlowFactor;
enemy.update();
enemy.speed = originalSpeed;
}
+ // Check collision with controlled animal
+ if (controlledAnimal && enemy.intersects(controlledAnimal) && enemy.type !== controlledAnimal.type) {
+ var animalDied = controlledAnimal.takeDamage(enemy.damage);
+ if (animalDied) {
+ controlledAnimal.destroy();
+ controlledAnimal = null;
+ controlledAnimalType = '';
+ controlledAnimalDuration = 0;
+ }
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
// Check collision with hero (only if not in safe zone)
if (enemy.intersects(hero) && !hero.invisibilityMode && !heroInSafeZone) {
var heroDied = hero.takeDamage(enemy.damage);
if (heroDied) {
mega star. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
bullet. In-Game asset. 2d. High contrast. No shadows
chicken. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
cow but square. In-Game asset. 2d. High contrast. No shadows
sheep but square. In-Game asset. 2d. High contrast. No shadows
star shield. In-Game asset. 2d. High contrast. No shadows
random miracle token. In-Game asset. 2d. High contrast. No shadows
chick. In-Game asset. 2d. High contrast. No shadows
snake but square. In-Game asset. 2d. High contrast. No shadows
donduruculuk gücü veren token. In-Game asset. 2d. High contrast. No shadows
şifa tokeni. In-Game asset. 2d. High contrast. No shadows
bomba token. In-Game asset. 2d. High contrast. No shadows
mause but square. In-Game asset. 2d. High contrast. No shadows
magic eye. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
prickly cube. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
only empty button. In-Game asset. 2d. High contrast. No shadows
hyper chicken but square. In-Game asset. 2d. High contrast. No shadows
no text egg menu. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat