/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Animal = Container.expand(function (animalType) {
var self = Container.call(this);
var animalData = {
rabbit: {
asset: 'rabbit',
price: 10,
speed: 2,
health: 1,
chance: 0.85
},
deer: {
asset: 'deer',
price: 23,
speed: 1.5,
health: 2,
chance: 0.75
},
bear: {
asset: 'bear',
price: 62,
speed: 1,
health: 5,
chance: 0.30
},
lion: {
asset: 'lion',
price: 180,
speed: 2,
health: 4,
chance: 0.007
},
elephant: {
asset: 'elephant',
price: 250,
speed: 0.5,
health: 8,
chance: 0.005
},
rhino: {
asset: 'rhino',
price: 84,
speed: 1,
health: 6,
chance: 0.20
},
zebra: {
asset: 'zebra',
price: 62,
speed: 3,
health: 2,
chance: 0.60
},
giraffe: {
asset: 'giraffe',
price: 73,
speed: 1,
health: 3,
chance: 0.23
},
hippo: {
asset: 'hippo',
price: 90,
speed: 0.8,
health: 5,
chance: 0.17
},
crocodile: {
asset: 'crocodile',
price: 80,
speed: 1.2,
health: 3,
chance: 0.45
},
cheetah: {
asset: 'cheetah',
price: 50,
speed: 6,
health: 2,
chance: 0.10
},
cat: {
asset: 'cat',
price: 60,
speed: 1.5,
health: 1,
evasive: true,
chance: 0.10
},
trex: {
asset: 'trex',
price: 215,
speed: 1.5,
health: 10,
chance: 0.005
},
dragon: {
asset: 'dragon',
price: 300,
speed: 2,
health: 15,
chance: 0.0005
}
};
self.type = animalType;
self.data = animalData[animalType];
self.health = self.data.health;
self.maxHealth = self.data.health;
self.angle = Math.random() * Math.PI * 2;
self.speed = self.data.speed;
var animalGraphics = self.attachAsset(self.data.asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
// Cat evasion behavior
if (self.data.evasive && bullets) {
// Initialize tracking variables if not set
if (self.lastClosestDistance === undefined) {
self.lastClosestDistance = 999;
}
if (self.wasNearBullet === undefined) {
self.wasNearBullet = false;
}
var closestBullet = null;
var closestDistance = 150; // Detection range
for (var b = 0; b < bullets.length; b++) {
var bullet = bullets[b];
var dx = bullet.x - self.x;
var dy = bullet.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestBullet = bullet;
closestDistance = distance;
}
}
var isNearBullet = closestBullet !== null;
// Check if bullet is approaching (getting closer)
if (isNearBullet && !self.wasNearBullet) {
// Bullet just entered detection range - increase speed
self.speed = self.data.speed * 4;
// Calculate escape direction (opposite to bullet direction)
var bulletDx = closestBullet.velocityX;
var bulletDy = closestBullet.velocityY;
self.angle = Math.atan2(-bulletDy, -bulletDx) + (Math.random() - 0.5) * 0.5;
} else if (!isNearBullet && self.wasNearBullet) {
// Bullet left detection range - return to normal speed
self.speed = self.data.speed;
} else if (isNearBullet && closestDistance < self.lastClosestDistance) {
// Bullet is still approaching and getting closer - maintain high speed and update direction
self.speed = self.data.speed * 4;
var bulletDx = closestBullet.velocityX;
var bulletDy = closestBullet.velocityY;
self.angle = Math.atan2(-bulletDy, -bulletDx) + (Math.random() - 0.5) * 0.5;
}
// Update tracking variables
self.wasNearBullet = isNearBullet;
self.lastClosestDistance = isNearBullet ? closestDistance : 999;
}
self.x += Math.cos(self.angle) * self.speed;
self.y += Math.sin(self.angle) * self.speed;
// Change direction randomly
if (Math.random() < 0.02) {
self.angle = Math.random() * Math.PI * 2;
}
// Keep animals within bounds
if (self.x < 100) {
self.angle = Math.random() * Math.PI - Math.PI / 2;
}
if (self.x > 1948) {
self.angle = Math.random() * Math.PI + Math.PI / 2;
}
if (self.y < 100) {
self.angle = Math.random() * Math.PI;
}
if (self.y > 2632) {
self.angle = Math.random() * Math.PI + Math.PI;
}
animalGraphics.rotation = self.angle;
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
if (self.health <= 0) {
return true;
}
return false;
};
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.angle = 0;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Hunter = Container.expand(function () {
var self = Container.call(this);
var hunterGraphics = self.attachAsset('hunter', {
anchorX: 0.5,
anchorY: 0.5
});
self.aimAngle = 0;
self.weapon = 1;
self.reloadTime = 0;
self.maxReloadTime = 25; // Set initial reload time to 25
self.update = function () {
if (self.reloadTime > 0) {
self.reloadTime--;
}
hunterGraphics.rotation = self.aimAngle;
};
self.canShoot = function () {
return self.reloadTime <= 0;
};
self.shoot = function () {
if (self.canShoot()) {
self.reloadTime = self.maxReloadTime;
return true;
}
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Play background music
LK.playMusic('bgmusic');
var hunter = game.addChild(new Hunter());
hunter.x = 2048 / 2;
hunter.y = 2732 / 2;
hunter.weapon = 1;
hunter.maxReloadTime = 25; // Set initial reload time to 25
var bullets = [];
var animals = [];
var money = storage.money || 0;
var totalKills = storage.totalKills || 0;
upgradeCount = storage.upgradeCount || 0;
var huntedAnimals = []; // Array to store hunted animals before selling
var basicAnimalTypes = ['rabbit', 'deer', 'bear', 'rhino', 'zebra', 'crocodile', 'cheetah', 'cat'];
var advancedAnimalTypes = ['rabbit', 'deer', 'bear', 'lion', 'elephant', 'rhino', 'zebra', 'giraffe', 'hippo', 'crocodile', 'cheetah', 'cat', 'trex', 'dragon'];
// UI Elements - Money Counter
var moneyTxt = new Text2('$' + money, {
size: 80,
fill: 0xFFD700
});
moneyTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyTxt);
var killsTxt = new Text2('Kills: ' + totalKills, {
size: 60,
fill: 0xFFFFFF
});
killsTxt.anchor.set(0, 0);
killsTxt.y = 70;
LK.gui.topRight.addChild(killsTxt);
var weaponTxt = new Text2('Weapon: Level ' + hunter.weapon, {
size: 50,
fill: 0xFFFFFF
});
weaponTxt.anchor.set(0, 0);
weaponTxt.y = 140;
LK.gui.topRight.addChild(weaponTxt);
// Inventory counter
var inventoryTxt = new Text2('Inventory: 0', {
size: 40,
fill: 0x00FF00
});
inventoryTxt.anchor.set(0, 0);
inventoryTxt.y = 200;
LK.gui.topRight.addChild(inventoryTxt);
// Sell button
var sellBtn = new Text2('SELL ALL', {
size: 50,
fill: 0x00FF00
});
sellBtn.anchor.set(0.5, 1);
sellBtn.y = -100; // Move button 100 pixels higher
LK.gui.bottom.addChild(sellBtn);
// Upgrade button
var upgradeBtn = new Text2('UPGRADE', {
size: 50,
fill: 0x00FFFF
});
upgradeBtn.anchor.set(0.5, 1);
upgradeBtn.y = -200; // Position above sell button
LK.gui.bottom.addChild(upgradeBtn);
// Upgrade tracking
var upgradeCount = 0;
var maxUpgrades = 26;
// Stats display in lower left corner
var statsContainer = new Container();
LK.gui.bottomLeft.addChild(statsContainer);
var damageTxt = new Text2('Damage: ' + getCurrentDamage(), {
size: 40,
fill: 0xFFFFFF
});
damageTxt.anchor.set(0, 1);
damageTxt.y = -50;
statsContainer.addChild(damageTxt);
var reloadTxt = new Text2('Reload: ' + getCurrentReloadTime(), {
size: 40,
fill: 0xFFFFFF
});
reloadTxt.anchor.set(0, 1);
reloadTxt.y = -10;
statsContainer.addChild(reloadTxt);
// Upgrade system
var baseDamage = 1;
var baseReloadTime = 25;
function getUpgradePrice() {
if (upgradeCount >= maxUpgrades) {
return 500 + 250 * maxUpgrades; // Cap at 15 upgrades
}
return 500 + upgradeCount * 250;
}
function getCurrentDamage() {
var damage = baseDamage;
damage += Math.floor(upgradeCount / 4); // Increase damage by 1 every 4 upgrades
return damage;
}
function getCurrentReloadTime() {
return baseReloadTime - upgradeCount * 2; // Reload time decreases by 2 for each upgrade
}
function updateUI() {
moneyTxt.setText('$' + money);
killsTxt.setText('Kills: ' + totalKills);
weaponTxt.setText('Damage: ' + getCurrentDamage() + ' | Reload: ' + getCurrentReloadTime());
inventoryTxt.setText('Inventory: ' + huntedAnimals.length);
// Update stats display
damageTxt.setText('Damage: ' + getCurrentDamage());
reloadTxt.setText('Reload: ' + getCurrentReloadTime());
// Update sell button to show potential earnings
var totalValue = 0;
for (var i = 0; i < huntedAnimals.length; i++) {
totalValue += huntedAnimals[i].price;
}
if (huntedAnimals.length > 0) {
sellBtn.setText('SELL ALL ($' + totalValue + ')');
sellBtn.fill = 0x00FF00;
} else {
sellBtn.setText('SELL ALL');
sellBtn.fill = 0x666666;
}
// Update upgrade button
var upgradePrice = getUpgradePrice();
if (upgradeCount >= maxUpgrades) {
upgradeBtn.setText('UPGRADE (MAX)');
upgradeBtn.fill = 0x666666;
} else if (money >= upgradePrice) {
upgradeBtn.setText('UPGRADE ($' + upgradePrice + ')');
upgradeBtn.fill = 0x00FFFF;
} else {
upgradeBtn.setText('UPGRADE ($' + upgradePrice + ')');
upgradeBtn.fill = 0x666666;
}
}
function buyUpgrade() {
var upgradePrice = getUpgradePrice();
// Check if max upgrades reached
if (upgradeCount >= maxUpgrades) {
return;
}
if (money >= upgradePrice) {
money -= upgradePrice;
upgradeCount++;
hunter.maxReloadTime = getCurrentReloadTime();
updateUI();
storage.money = money;
storage.upgradeCount = upgradeCount;
LK.effects.flashScreen(0x00FF00, 300);
}
}
function sellAllAnimals() {
var totalValue = 0;
for (var i = 0; i < huntedAnimals.length; i++) {
totalValue += huntedAnimals[i].price;
}
money += totalValue;
huntedAnimals = [];
updateUI();
storage.money = money;
if (totalValue > 0) {
LK.effects.flashScreen(0x00FF00, 300);
}
}
function spawnAnimal() {
var currentAnimalTypes = totalKills > 8 ? advancedAnimalTypes : basicAnimalTypes;
var animalType = null;
var attempts = 0;
var maxAttempts = 50;
// Keep trying to spawn an animal based on chance until successful or max attempts reached
while (animalType === null && attempts < maxAttempts) {
var randomType = currentAnimalTypes[Math.floor(Math.random() * currentAnimalTypes.length)];
var tempAnimal = new Animal(randomType);
var chance = tempAnimal.data.chance || 1.0; // Default to 100% if no chance specified
if (Math.random() < chance) {
animalType = randomType;
} else {
tempAnimal.destroy(); // Clean up the temporary animal if not spawned
}
attempts++;
}
// If we couldn't spawn anything after max attempts, force spawn a common animal
if (animalType === null) {
animalType = 'rabbit'; // Fallback to rabbit as it has high chance
}
var animal = new Animal(animalType);
// Spawn at edge of screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
animal.x = Math.random() * 2048;
animal.y = 0;
break;
case 1:
// Right
animal.x = 2048;
animal.y = Math.random() * 2732;
break;
case 2:
// Bottom
animal.x = Math.random() * 2048;
animal.y = 2732;
break;
case 3:
// Left
animal.x = 0;
animal.y = Math.random() * 2732;
break;
}
animals.push(animal);
game.addChild(animal);
}
function shootBullet(targetX, targetY) {
if (hunter.shoot()) {
var bullet = new Bullet();
bullet.x = hunter.x;
bullet.y = hunter.y;
var dx = targetX - hunter.x;
var dy = targetY - hunter.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.velocityX = dx / distance * bullet.speed;
bullet.velocityY = dy / distance * bullet.speed;
bullet.angle = Math.atan2(dy, dx);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
}
game.down = function (x, y, obj) {
// Check if clicking sell button at bottom of screen (moved 100px higher) - larger hitbox for mobile
if (y > 2480 && y < 2620 && x > 800 && x < 1248) {
// Bottom area, centered button with expanded touch area
if (huntedAnimals.length > 0) {
sellAllAnimals();
LK.effects.flashObject(sellBtn, 0xFFFFFF, 200);
}
return;
}
// Check if clicking upgrade button above sell button
if (y > 2380 && y < 2480 && x > 800 && x < 1248) {
// Upgrade button area
buyUpgrade();
LK.effects.flashObject(upgradeBtn, 0xFFFFFF, 200);
return;
}
// Aim and shoot at clicked location - use x,y directly as they are already in game coordinates
var dx = x - hunter.x;
var dy = y - hunter.y;
hunter.aimAngle = Math.atan2(dy, dx);
shootBullet(x, y);
};
game.update = function () {
// Spawn animals
if (LK.ticks % 120 == 0) {
spawnAnimal();
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove off-screen bullets
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-animal collisions
for (var j = animals.length - 1; j >= 0; j--) {
var animal = animals[j];
if (bullet.intersects(animal)) {
var weaponDamage = getCurrentDamage();
if (animal.takeDamage(weaponDamage)) {
// Animal killed - add to inventory with complete pricing data
huntedAnimals.push({
type: animal.type,
price: animal.data.price,
asset: animal.data.asset
});
totalKills++;
LK.getSound('hit').play();
LK.effects.flashObject(animal, 0xFF0000, 200);
animal.destroy();
animals.splice(j, 1);
updateUI();
storage.totalKills = totalKills;
}
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Remove animals that are too far off screen
for (var k = animals.length - 1; k >= 0; k--) {
var animal = animals[k];
if (animal.x < -200 || animal.x > 2248 || animal.y < -200 || animal.y > 2932) {
animal.destroy();
animals.splice(k, 1);
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Animal = Container.expand(function (animalType) {
var self = Container.call(this);
var animalData = {
rabbit: {
asset: 'rabbit',
price: 10,
speed: 2,
health: 1,
chance: 0.85
},
deer: {
asset: 'deer',
price: 23,
speed: 1.5,
health: 2,
chance: 0.75
},
bear: {
asset: 'bear',
price: 62,
speed: 1,
health: 5,
chance: 0.30
},
lion: {
asset: 'lion',
price: 180,
speed: 2,
health: 4,
chance: 0.007
},
elephant: {
asset: 'elephant',
price: 250,
speed: 0.5,
health: 8,
chance: 0.005
},
rhino: {
asset: 'rhino',
price: 84,
speed: 1,
health: 6,
chance: 0.20
},
zebra: {
asset: 'zebra',
price: 62,
speed: 3,
health: 2,
chance: 0.60
},
giraffe: {
asset: 'giraffe',
price: 73,
speed: 1,
health: 3,
chance: 0.23
},
hippo: {
asset: 'hippo',
price: 90,
speed: 0.8,
health: 5,
chance: 0.17
},
crocodile: {
asset: 'crocodile',
price: 80,
speed: 1.2,
health: 3,
chance: 0.45
},
cheetah: {
asset: 'cheetah',
price: 50,
speed: 6,
health: 2,
chance: 0.10
},
cat: {
asset: 'cat',
price: 60,
speed: 1.5,
health: 1,
evasive: true,
chance: 0.10
},
trex: {
asset: 'trex',
price: 215,
speed: 1.5,
health: 10,
chance: 0.005
},
dragon: {
asset: 'dragon',
price: 300,
speed: 2,
health: 15,
chance: 0.0005
}
};
self.type = animalType;
self.data = animalData[animalType];
self.health = self.data.health;
self.maxHealth = self.data.health;
self.angle = Math.random() * Math.PI * 2;
self.speed = self.data.speed;
var animalGraphics = self.attachAsset(self.data.asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
// Cat evasion behavior
if (self.data.evasive && bullets) {
// Initialize tracking variables if not set
if (self.lastClosestDistance === undefined) {
self.lastClosestDistance = 999;
}
if (self.wasNearBullet === undefined) {
self.wasNearBullet = false;
}
var closestBullet = null;
var closestDistance = 150; // Detection range
for (var b = 0; b < bullets.length; b++) {
var bullet = bullets[b];
var dx = bullet.x - self.x;
var dy = bullet.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestBullet = bullet;
closestDistance = distance;
}
}
var isNearBullet = closestBullet !== null;
// Check if bullet is approaching (getting closer)
if (isNearBullet && !self.wasNearBullet) {
// Bullet just entered detection range - increase speed
self.speed = self.data.speed * 4;
// Calculate escape direction (opposite to bullet direction)
var bulletDx = closestBullet.velocityX;
var bulletDy = closestBullet.velocityY;
self.angle = Math.atan2(-bulletDy, -bulletDx) + (Math.random() - 0.5) * 0.5;
} else if (!isNearBullet && self.wasNearBullet) {
// Bullet left detection range - return to normal speed
self.speed = self.data.speed;
} else if (isNearBullet && closestDistance < self.lastClosestDistance) {
// Bullet is still approaching and getting closer - maintain high speed and update direction
self.speed = self.data.speed * 4;
var bulletDx = closestBullet.velocityX;
var bulletDy = closestBullet.velocityY;
self.angle = Math.atan2(-bulletDy, -bulletDx) + (Math.random() - 0.5) * 0.5;
}
// Update tracking variables
self.wasNearBullet = isNearBullet;
self.lastClosestDistance = isNearBullet ? closestDistance : 999;
}
self.x += Math.cos(self.angle) * self.speed;
self.y += Math.sin(self.angle) * self.speed;
// Change direction randomly
if (Math.random() < 0.02) {
self.angle = Math.random() * Math.PI * 2;
}
// Keep animals within bounds
if (self.x < 100) {
self.angle = Math.random() * Math.PI - Math.PI / 2;
}
if (self.x > 1948) {
self.angle = Math.random() * Math.PI + Math.PI / 2;
}
if (self.y < 100) {
self.angle = Math.random() * Math.PI;
}
if (self.y > 2632) {
self.angle = Math.random() * Math.PI + Math.PI;
}
animalGraphics.rotation = self.angle;
};
self.takeDamage = function (damage) {
damage = damage || 1;
self.health -= damage;
if (self.health <= 0) {
return true;
}
return false;
};
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.angle = 0;
self.velocityX = 0;
self.velocityY = 0;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
};
return self;
});
var Hunter = Container.expand(function () {
var self = Container.call(this);
var hunterGraphics = self.attachAsset('hunter', {
anchorX: 0.5,
anchorY: 0.5
});
self.aimAngle = 0;
self.weapon = 1;
self.reloadTime = 0;
self.maxReloadTime = 25; // Set initial reload time to 25
self.update = function () {
if (self.reloadTime > 0) {
self.reloadTime--;
}
hunterGraphics.rotation = self.aimAngle;
};
self.canShoot = function () {
return self.reloadTime <= 0;
};
self.shoot = function () {
if (self.canShoot()) {
self.reloadTime = self.maxReloadTime;
return true;
}
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Play background music
LK.playMusic('bgmusic');
var hunter = game.addChild(new Hunter());
hunter.x = 2048 / 2;
hunter.y = 2732 / 2;
hunter.weapon = 1;
hunter.maxReloadTime = 25; // Set initial reload time to 25
var bullets = [];
var animals = [];
var money = storage.money || 0;
var totalKills = storage.totalKills || 0;
upgradeCount = storage.upgradeCount || 0;
var huntedAnimals = []; // Array to store hunted animals before selling
var basicAnimalTypes = ['rabbit', 'deer', 'bear', 'rhino', 'zebra', 'crocodile', 'cheetah', 'cat'];
var advancedAnimalTypes = ['rabbit', 'deer', 'bear', 'lion', 'elephant', 'rhino', 'zebra', 'giraffe', 'hippo', 'crocodile', 'cheetah', 'cat', 'trex', 'dragon'];
// UI Elements - Money Counter
var moneyTxt = new Text2('$' + money, {
size: 80,
fill: 0xFFD700
});
moneyTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyTxt);
var killsTxt = new Text2('Kills: ' + totalKills, {
size: 60,
fill: 0xFFFFFF
});
killsTxt.anchor.set(0, 0);
killsTxt.y = 70;
LK.gui.topRight.addChild(killsTxt);
var weaponTxt = new Text2('Weapon: Level ' + hunter.weapon, {
size: 50,
fill: 0xFFFFFF
});
weaponTxt.anchor.set(0, 0);
weaponTxt.y = 140;
LK.gui.topRight.addChild(weaponTxt);
// Inventory counter
var inventoryTxt = new Text2('Inventory: 0', {
size: 40,
fill: 0x00FF00
});
inventoryTxt.anchor.set(0, 0);
inventoryTxt.y = 200;
LK.gui.topRight.addChild(inventoryTxt);
// Sell button
var sellBtn = new Text2('SELL ALL', {
size: 50,
fill: 0x00FF00
});
sellBtn.anchor.set(0.5, 1);
sellBtn.y = -100; // Move button 100 pixels higher
LK.gui.bottom.addChild(sellBtn);
// Upgrade button
var upgradeBtn = new Text2('UPGRADE', {
size: 50,
fill: 0x00FFFF
});
upgradeBtn.anchor.set(0.5, 1);
upgradeBtn.y = -200; // Position above sell button
LK.gui.bottom.addChild(upgradeBtn);
// Upgrade tracking
var upgradeCount = 0;
var maxUpgrades = 26;
// Stats display in lower left corner
var statsContainer = new Container();
LK.gui.bottomLeft.addChild(statsContainer);
var damageTxt = new Text2('Damage: ' + getCurrentDamage(), {
size: 40,
fill: 0xFFFFFF
});
damageTxt.anchor.set(0, 1);
damageTxt.y = -50;
statsContainer.addChild(damageTxt);
var reloadTxt = new Text2('Reload: ' + getCurrentReloadTime(), {
size: 40,
fill: 0xFFFFFF
});
reloadTxt.anchor.set(0, 1);
reloadTxt.y = -10;
statsContainer.addChild(reloadTxt);
// Upgrade system
var baseDamage = 1;
var baseReloadTime = 25;
function getUpgradePrice() {
if (upgradeCount >= maxUpgrades) {
return 500 + 250 * maxUpgrades; // Cap at 15 upgrades
}
return 500 + upgradeCount * 250;
}
function getCurrentDamage() {
var damage = baseDamage;
damage += Math.floor(upgradeCount / 4); // Increase damage by 1 every 4 upgrades
return damage;
}
function getCurrentReloadTime() {
return baseReloadTime - upgradeCount * 2; // Reload time decreases by 2 for each upgrade
}
function updateUI() {
moneyTxt.setText('$' + money);
killsTxt.setText('Kills: ' + totalKills);
weaponTxt.setText('Damage: ' + getCurrentDamage() + ' | Reload: ' + getCurrentReloadTime());
inventoryTxt.setText('Inventory: ' + huntedAnimals.length);
// Update stats display
damageTxt.setText('Damage: ' + getCurrentDamage());
reloadTxt.setText('Reload: ' + getCurrentReloadTime());
// Update sell button to show potential earnings
var totalValue = 0;
for (var i = 0; i < huntedAnimals.length; i++) {
totalValue += huntedAnimals[i].price;
}
if (huntedAnimals.length > 0) {
sellBtn.setText('SELL ALL ($' + totalValue + ')');
sellBtn.fill = 0x00FF00;
} else {
sellBtn.setText('SELL ALL');
sellBtn.fill = 0x666666;
}
// Update upgrade button
var upgradePrice = getUpgradePrice();
if (upgradeCount >= maxUpgrades) {
upgradeBtn.setText('UPGRADE (MAX)');
upgradeBtn.fill = 0x666666;
} else if (money >= upgradePrice) {
upgradeBtn.setText('UPGRADE ($' + upgradePrice + ')');
upgradeBtn.fill = 0x00FFFF;
} else {
upgradeBtn.setText('UPGRADE ($' + upgradePrice + ')');
upgradeBtn.fill = 0x666666;
}
}
function buyUpgrade() {
var upgradePrice = getUpgradePrice();
// Check if max upgrades reached
if (upgradeCount >= maxUpgrades) {
return;
}
if (money >= upgradePrice) {
money -= upgradePrice;
upgradeCount++;
hunter.maxReloadTime = getCurrentReloadTime();
updateUI();
storage.money = money;
storage.upgradeCount = upgradeCount;
LK.effects.flashScreen(0x00FF00, 300);
}
}
function sellAllAnimals() {
var totalValue = 0;
for (var i = 0; i < huntedAnimals.length; i++) {
totalValue += huntedAnimals[i].price;
}
money += totalValue;
huntedAnimals = [];
updateUI();
storage.money = money;
if (totalValue > 0) {
LK.effects.flashScreen(0x00FF00, 300);
}
}
function spawnAnimal() {
var currentAnimalTypes = totalKills > 8 ? advancedAnimalTypes : basicAnimalTypes;
var animalType = null;
var attempts = 0;
var maxAttempts = 50;
// Keep trying to spawn an animal based on chance until successful or max attempts reached
while (animalType === null && attempts < maxAttempts) {
var randomType = currentAnimalTypes[Math.floor(Math.random() * currentAnimalTypes.length)];
var tempAnimal = new Animal(randomType);
var chance = tempAnimal.data.chance || 1.0; // Default to 100% if no chance specified
if (Math.random() < chance) {
animalType = randomType;
} else {
tempAnimal.destroy(); // Clean up the temporary animal if not spawned
}
attempts++;
}
// If we couldn't spawn anything after max attempts, force spawn a common animal
if (animalType === null) {
animalType = 'rabbit'; // Fallback to rabbit as it has high chance
}
var animal = new Animal(animalType);
// Spawn at edge of screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
animal.x = Math.random() * 2048;
animal.y = 0;
break;
case 1:
// Right
animal.x = 2048;
animal.y = Math.random() * 2732;
break;
case 2:
// Bottom
animal.x = Math.random() * 2048;
animal.y = 2732;
break;
case 3:
// Left
animal.x = 0;
animal.y = Math.random() * 2732;
break;
}
animals.push(animal);
game.addChild(animal);
}
function shootBullet(targetX, targetY) {
if (hunter.shoot()) {
var bullet = new Bullet();
bullet.x = hunter.x;
bullet.y = hunter.y;
var dx = targetX - hunter.x;
var dy = targetY - hunter.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.velocityX = dx / distance * bullet.speed;
bullet.velocityY = dy / distance * bullet.speed;
bullet.angle = Math.atan2(dy, dx);
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
}
game.down = function (x, y, obj) {
// Check if clicking sell button at bottom of screen (moved 100px higher) - larger hitbox for mobile
if (y > 2480 && y < 2620 && x > 800 && x < 1248) {
// Bottom area, centered button with expanded touch area
if (huntedAnimals.length > 0) {
sellAllAnimals();
LK.effects.flashObject(sellBtn, 0xFFFFFF, 200);
}
return;
}
// Check if clicking upgrade button above sell button
if (y > 2380 && y < 2480 && x > 800 && x < 1248) {
// Upgrade button area
buyUpgrade();
LK.effects.flashObject(upgradeBtn, 0xFFFFFF, 200);
return;
}
// Aim and shoot at clicked location - use x,y directly as they are already in game coordinates
var dx = x - hunter.x;
var dy = y - hunter.y;
hunter.aimAngle = Math.atan2(dy, dx);
shootBullet(x, y);
};
game.update = function () {
// Spawn animals
if (LK.ticks % 120 == 0) {
spawnAnimal();
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
// Remove off-screen bullets
if (bullet.x < -50 || bullet.x > 2098 || bullet.y < -50 || bullet.y > 2782) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check bullet-animal collisions
for (var j = animals.length - 1; j >= 0; j--) {
var animal = animals[j];
if (bullet.intersects(animal)) {
var weaponDamage = getCurrentDamage();
if (animal.takeDamage(weaponDamage)) {
// Animal killed - add to inventory with complete pricing data
huntedAnimals.push({
type: animal.type,
price: animal.data.price,
asset: animal.data.asset
});
totalKills++;
LK.getSound('hit').play();
LK.effects.flashObject(animal, 0xFF0000, 200);
animal.destroy();
animals.splice(j, 1);
updateUI();
storage.totalKills = totalKills;
}
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Remove animals that are too far off screen
for (var k = animals.length - 1; k >= 0; k--) {
var animal = animals[k];
if (animal.x < -200 || animal.x > 2248 || animal.y < -200 || animal.y > 2932) {
animal.destroy();
animals.splice(k, 1);
}
}
};
Hunter pixel. In-Game asset. 2d. High contrast. No shadows
Pixel bear. In-Game asset. 2d. High contrast. No shadows
Pixel deer. In-Game asset. 2d. High contrast. No shadows
Pixel Cheetah. In-Game asset. 2d. High contrast. No shadows
Pixel Rabbit. In-Game asset. 2d. High contrast. No shadows
Pixel cat. In-Game asset. 2d. High contrast. No shadows
elephant pixel. In-Game asset. 2d. High contrast. No shadows
Hippo pixel. In-Game asset. 2d. High contrast. No shadows
Pixel lion. In-Game asset. 2d. High contrast. No shadows
Pixel rhino. In-Game asset. 2d. High contrast. No shadows
Giraffe Pixel. In-Game asset. 2d. High contrast. No shadows
Crocodile pixel. In-Game asset. 2d. High contrast. No shadows
Zebra pixel. In-Game asset. 2d. High contrast. No shadows
T rex 8bit. In-Game asset. 2d. High contrast. No shadows
Dragon 8 bit. In-Game asset. 2d. High contrast. No shadows