/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var BowAndArrow = Container.expand(function () {
var self = Container.call(this);
var arrowGraphics = self.attachAsset('weapon', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 2 // Horizontal orientation
});
self.speed = 10;
self.damage = 5;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI // Face down
});
self.speed = 3 + Math.random() * 2;
self.damage = 10;
self.health = 1;
self.points = 10;
self.type = 'basic';
self.update = function () {
self.y += self.speed;
// Check if player is in path and shoot an arrow
if (Math.abs(gladiator.x - self.x) < 50) {
var arrow = new BowAndArrow();
arrow.x = self.x;
arrow.y = self.y;
weapons.push(arrow);
game.addChild(arrow);
}
self.lastArrowShot = self.lastArrowShot || 0;
if (Date.now() - self.lastArrowShot > 2000 && Math.random() < 0.05) {
// Shoot an arrow every 2 seconds on average
var arrow = new BowAndArrow();
arrow.x = self.x;
arrow.y = self.y;
weapons.push(arrow);
game.addChild(arrow);
self.lastArrowShot = Date.now();
}
};
self.takeDamage = function (amount) {
self.health -= amount;
// Flash red when hit
LK.effects.flashObject(enemyGraphics, 0xFF0000, 300);
if (self.health <= 0) {
return true; // Enemy died
}
return false; // Enemy still alive
};
return self;
});
var Horseman = Enemy.expand(function () {
var self = Enemy.call(this);
// Replace the enemy graphics with horseman graphics
self.removeChild(self.getChildAt(0));
var horsemanGraphics = self.attachAsset('horseman', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI // Face down
});
self.speed = 5 + Math.random() * 3;
self.damage = 20;
self.health = 2;
self.points = 25;
self.type = 'horseman';
return self;
});
var Gladiator = Container.expand(function () {
var self = Container.call(this);
var gladiatorGraphics = self.attachAsset('gladiator', {
anchorX: 0.5,
anchorY: 0.5
});
// Shield effect
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
y: 80,
alpha: 0
});
// Health bar
var healthBarBg = self.attachAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
y: -120,
width: 150,
color: 0xFF0000
});
var healthBarFg = self.attachAsset('healthBar', {
anchorX: 0,
anchorY: 0.5,
x: -75,
y: -120,
width: 150
});
self.health = 100;
self.maxHealth = 100;
self.shielding = false;
self.shieldDuration = 1500;
self.shieldCooldown = 0;
self.maxShieldCooldown = 3000;
self.down = function (x, y, obj) {
if (self.shieldCooldown <= 0) {
self.activateShield();
}
};
self.activateShield = function () {
self.shielding = true;
shieldGraphics.alpha = 0.8;
self.shieldCooldown = self.maxShieldCooldown;
LK.setTimeout(function () {
self.shielding = false;
shieldGraphics.alpha = 0;
}, self.shieldDuration);
};
self.takeDamage = function (amount) {
if (!self.shielding) {
self.health -= amount;
// Update health bar
var healthPercent = Math.max(0, self.health / self.maxHealth);
healthBarFg.width = 150 * healthPercent;
// Flash red when hit
LK.effects.flashObject(gladiatorGraphics, 0xFF0000, 300);
if (self.health <= 0) {
LK.getSound('death').play();
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
} else {
LK.getSound('hit').play();
}
return true; // Damage was dealt
} else {
// Shield blocked the hit
LK.effects.flashObject(shieldGraphics, 0xFFFFFF, 300);
LK.getSound('block').play();
return false; // Damage was blocked
}
};
self.update = function () {
// Update shield cooldown
if (self.shieldCooldown > 0) {
self.shieldCooldown -= 16.67; // Approximate ms per frame at 60fps
}
};
return self;
});
var Weapon = Container.expand(function () {
var self = Container.call(this);
var weaponGraphics = self.attachAsset('weapon', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 2 // Horizontal orientation
});
self.speed = 7;
self.damage = 15;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F4F4F
});
/****
* Game Code
****/
// Initialize arena
var arena = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
arena.x = 2048 / 2;
arena.y = 2732 / 2;
game.addChild(arena);
// Game variables
var score = 0;
var level = 1;
var enemies = [];
var weapons = [];
var spawnInterval = 2000; // Initial spawn interval in milliseconds
var lastSpawn = 0;
var weaponSpawnChance = 0.1;
var horsemanSpawnChance = 0.05;
var mouseX = 2048 / 2;
var mouseY = 2732 / 2;
var isDragging = false;
// Create player
var gladiator = new Gladiator();
gladiator.x = 2048 / 2;
gladiator.y = 2732 - 400;
game.addChild(gladiator);
// Score display
var scoreTxt = new Text2('SCORE: 0', {
size: 90,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Level display
var levelTxt = new Text2('LEVEL 1', {
size: 70,
fill: 0xFFFF00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 100;
LK.gui.top.addChild(levelTxt);
// High score display
var highScoreTxt = new Text2('HIGH SCORE: ' + storage.highScore, {
size: 60,
fill: 0xAAFFAA
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 180;
LK.gui.top.addChild(highScoreTxt);
// Handle touch/mouse events
game.down = function (x, y, obj) {
isDragging = true;
mouseX = x;
mouseY = y;
};
game.up = function (x, y, obj) {
isDragging = false;
};
game.move = function (x, y, obj) {
if (isDragging) {
mouseX = x;
mouseY = y;
}
};
// Spawn enemies
function spawnEnemy() {
var enemy;
// Random chance to spawn horseman based on current level
if (Math.random() < horsemanSpawnChance) {
enemy = new Horseman();
} else {
enemy = new Enemy();
}
// Position enemy randomly across top of the screen
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -200;
// Adjust difficulty based on level
enemy.speed += (level - 1) * 0.5;
enemy.health += Math.floor((level - 1) / 3);
enemies.push(enemy);
game.addChild(enemy);
// Random chance to spawn weapon
if (Math.random() < weaponSpawnChance) {
spawnWeapon();
}
}
// Spawn thrown weapons
function spawnWeapon() {
var weapon = new Weapon();
weapon.x = Math.random() * (2048 - 200) + 100;
weapon.y = -100;
weapons.push(weapon);
game.addChild(weapon);
}
// Track last update time
var lastUpdateTime = Date.now();
var elapsedGameTime = 0;
// Game update logic
game.update = function () {
// Calculate delta time
var currentTime = Date.now();
var deltaTime = currentTime - lastUpdateTime;
lastUpdateTime = currentTime;
// Move gladiator smoothly toward touch position
if (isDragging) {
var dx = mouseX - gladiator.x;
var dy = mouseY - gladiator.y;
// Limit player movement to bottom half of screen
var targetY = Math.min(mouseY, 2732 - 300);
targetY = Math.max(targetY, 2732 / 2);
gladiator.x += dx * 0.1;
gladiator.y += (targetY - gladiator.y) * 0.1;
}
// Keep track of elapsed time for spawning
elapsedGameTime += deltaTime;
// Spawn enemies based on interval
if (elapsedGameTime - lastSpawn > spawnInterval) {
spawnEnemy();
lastSpawn = elapsedGameTime;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Check for collision with gladiator
if (!enemy.collisionChecked && enemy.intersects(gladiator)) {
enemy.collisionChecked = true;
// Player attacks enemy
var enemyDied = enemy.takeDamage(1);
if (enemyDied) {
// Update score
score += enemy.points;
scoreTxt.setText('SCORE: ' + score);
// Check high score
if (score > storage.highScore) {
storage.highScore = score;
highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
}
// Remove enemy
enemy.destroy();
enemies.splice(i, 1);
// Level up check
if (score >= level * 100) {
levelUp();
}
} else {
// Enemy hits player if not killed
var damageDealt = gladiator.takeDamage(enemy.damage);
// If attack was blocked, knockback the enemy
if (!damageDealt) {
enemy.y -= 100;
}
}
} else if (enemy.y > 2732 + 100) {
// Enemy went off screen
enemy.destroy();
enemies.splice(i, 1);
}
}
// Update weapons
for (var i = weapons.length - 1; i >= 0; i--) {
var weapon = weapons[i];
// Check for collision with gladiator
if (!weapon.collisionChecked && weapon.intersects(gladiator)) {
weapon.collisionChecked = true;
// Weapon hits player
gladiator.takeDamage(weapon.damage);
// Remove weapon
weapon.destroy();
weapons.splice(i, 1);
} else if (weapon.y > 2732 + 50) {
// Weapon went off screen
weapon.destroy();
weapons.splice(i, 1);
}
}
// Gradually decrease spawn interval based on time (make game harder)
spawnInterval = Math.max(500, 2000 - elapsedGameTime / 10000);
};
// Level up function
function levelUp() {
level++;
levelTxt.setText('LEVEL ' + level);
// Increase difficulty
horsemanSpawnChance = Math.min(0.4, 0.05 + (level - 1) * 0.05);
weaponSpawnChance = Math.min(0.5, 0.1 + (level - 1) * 0.05);
// Visual effect
LK.effects.flashScreen(0xFFFF00, 500);
LK.getSound('levelUp').play();
}
// Start background music
LK.playMusic('arenaMusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var BowAndArrow = Container.expand(function () {
var self = Container.call(this);
var arrowGraphics = self.attachAsset('weapon', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 2 // Horizontal orientation
});
self.speed = 10;
self.damage = 5;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI // Face down
});
self.speed = 3 + Math.random() * 2;
self.damage = 10;
self.health = 1;
self.points = 10;
self.type = 'basic';
self.update = function () {
self.y += self.speed;
// Check if player is in path and shoot an arrow
if (Math.abs(gladiator.x - self.x) < 50) {
var arrow = new BowAndArrow();
arrow.x = self.x;
arrow.y = self.y;
weapons.push(arrow);
game.addChild(arrow);
}
self.lastArrowShot = self.lastArrowShot || 0;
if (Date.now() - self.lastArrowShot > 2000 && Math.random() < 0.05) {
// Shoot an arrow every 2 seconds on average
var arrow = new BowAndArrow();
arrow.x = self.x;
arrow.y = self.y;
weapons.push(arrow);
game.addChild(arrow);
self.lastArrowShot = Date.now();
}
};
self.takeDamage = function (amount) {
self.health -= amount;
// Flash red when hit
LK.effects.flashObject(enemyGraphics, 0xFF0000, 300);
if (self.health <= 0) {
return true; // Enemy died
}
return false; // Enemy still alive
};
return self;
});
var Horseman = Enemy.expand(function () {
var self = Enemy.call(this);
// Replace the enemy graphics with horseman graphics
self.removeChild(self.getChildAt(0));
var horsemanGraphics = self.attachAsset('horseman', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI // Face down
});
self.speed = 5 + Math.random() * 3;
self.damage = 20;
self.health = 2;
self.points = 25;
self.type = 'horseman';
return self;
});
var Gladiator = Container.expand(function () {
var self = Container.call(this);
var gladiatorGraphics = self.attachAsset('gladiator', {
anchorX: 0.5,
anchorY: 0.5
});
// Shield effect
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
y: 80,
alpha: 0
});
// Health bar
var healthBarBg = self.attachAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
y: -120,
width: 150,
color: 0xFF0000
});
var healthBarFg = self.attachAsset('healthBar', {
anchorX: 0,
anchorY: 0.5,
x: -75,
y: -120,
width: 150
});
self.health = 100;
self.maxHealth = 100;
self.shielding = false;
self.shieldDuration = 1500;
self.shieldCooldown = 0;
self.maxShieldCooldown = 3000;
self.down = function (x, y, obj) {
if (self.shieldCooldown <= 0) {
self.activateShield();
}
};
self.activateShield = function () {
self.shielding = true;
shieldGraphics.alpha = 0.8;
self.shieldCooldown = self.maxShieldCooldown;
LK.setTimeout(function () {
self.shielding = false;
shieldGraphics.alpha = 0;
}, self.shieldDuration);
};
self.takeDamage = function (amount) {
if (!self.shielding) {
self.health -= amount;
// Update health bar
var healthPercent = Math.max(0, self.health / self.maxHealth);
healthBarFg.width = 150 * healthPercent;
// Flash red when hit
LK.effects.flashObject(gladiatorGraphics, 0xFF0000, 300);
if (self.health <= 0) {
LK.getSound('death').play();
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
} else {
LK.getSound('hit').play();
}
return true; // Damage was dealt
} else {
// Shield blocked the hit
LK.effects.flashObject(shieldGraphics, 0xFFFFFF, 300);
LK.getSound('block').play();
return false; // Damage was blocked
}
};
self.update = function () {
// Update shield cooldown
if (self.shieldCooldown > 0) {
self.shieldCooldown -= 16.67; // Approximate ms per frame at 60fps
}
};
return self;
});
var Weapon = Container.expand(function () {
var self = Container.call(this);
var weaponGraphics = self.attachAsset('weapon', {
anchorX: 0.5,
anchorY: 0.5,
rotation: Math.PI / 2 // Horizontal orientation
});
self.speed = 7;
self.damage = 15;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F4F4F
});
/****
* Game Code
****/
// Initialize arena
var arena = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
arena.x = 2048 / 2;
arena.y = 2732 / 2;
game.addChild(arena);
// Game variables
var score = 0;
var level = 1;
var enemies = [];
var weapons = [];
var spawnInterval = 2000; // Initial spawn interval in milliseconds
var lastSpawn = 0;
var weaponSpawnChance = 0.1;
var horsemanSpawnChance = 0.05;
var mouseX = 2048 / 2;
var mouseY = 2732 / 2;
var isDragging = false;
// Create player
var gladiator = new Gladiator();
gladiator.x = 2048 / 2;
gladiator.y = 2732 - 400;
game.addChild(gladiator);
// Score display
var scoreTxt = new Text2('SCORE: 0', {
size: 90,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Level display
var levelTxt = new Text2('LEVEL 1', {
size: 70,
fill: 0xFFFF00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 100;
LK.gui.top.addChild(levelTxt);
// High score display
var highScoreTxt = new Text2('HIGH SCORE: ' + storage.highScore, {
size: 60,
fill: 0xAAFFAA
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 180;
LK.gui.top.addChild(highScoreTxt);
// Handle touch/mouse events
game.down = function (x, y, obj) {
isDragging = true;
mouseX = x;
mouseY = y;
};
game.up = function (x, y, obj) {
isDragging = false;
};
game.move = function (x, y, obj) {
if (isDragging) {
mouseX = x;
mouseY = y;
}
};
// Spawn enemies
function spawnEnemy() {
var enemy;
// Random chance to spawn horseman based on current level
if (Math.random() < horsemanSpawnChance) {
enemy = new Horseman();
} else {
enemy = new Enemy();
}
// Position enemy randomly across top of the screen
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -200;
// Adjust difficulty based on level
enemy.speed += (level - 1) * 0.5;
enemy.health += Math.floor((level - 1) / 3);
enemies.push(enemy);
game.addChild(enemy);
// Random chance to spawn weapon
if (Math.random() < weaponSpawnChance) {
spawnWeapon();
}
}
// Spawn thrown weapons
function spawnWeapon() {
var weapon = new Weapon();
weapon.x = Math.random() * (2048 - 200) + 100;
weapon.y = -100;
weapons.push(weapon);
game.addChild(weapon);
}
// Track last update time
var lastUpdateTime = Date.now();
var elapsedGameTime = 0;
// Game update logic
game.update = function () {
// Calculate delta time
var currentTime = Date.now();
var deltaTime = currentTime - lastUpdateTime;
lastUpdateTime = currentTime;
// Move gladiator smoothly toward touch position
if (isDragging) {
var dx = mouseX - gladiator.x;
var dy = mouseY - gladiator.y;
// Limit player movement to bottom half of screen
var targetY = Math.min(mouseY, 2732 - 300);
targetY = Math.max(targetY, 2732 / 2);
gladiator.x += dx * 0.1;
gladiator.y += (targetY - gladiator.y) * 0.1;
}
// Keep track of elapsed time for spawning
elapsedGameTime += deltaTime;
// Spawn enemies based on interval
if (elapsedGameTime - lastSpawn > spawnInterval) {
spawnEnemy();
lastSpawn = elapsedGameTime;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Check for collision with gladiator
if (!enemy.collisionChecked && enemy.intersects(gladiator)) {
enemy.collisionChecked = true;
// Player attacks enemy
var enemyDied = enemy.takeDamage(1);
if (enemyDied) {
// Update score
score += enemy.points;
scoreTxt.setText('SCORE: ' + score);
// Check high score
if (score > storage.highScore) {
storage.highScore = score;
highScoreTxt.setText('HIGH SCORE: ' + storage.highScore);
}
// Remove enemy
enemy.destroy();
enemies.splice(i, 1);
// Level up check
if (score >= level * 100) {
levelUp();
}
} else {
// Enemy hits player if not killed
var damageDealt = gladiator.takeDamage(enemy.damage);
// If attack was blocked, knockback the enemy
if (!damageDealt) {
enemy.y -= 100;
}
}
} else if (enemy.y > 2732 + 100) {
// Enemy went off screen
enemy.destroy();
enemies.splice(i, 1);
}
}
// Update weapons
for (var i = weapons.length - 1; i >= 0; i--) {
var weapon = weapons[i];
// Check for collision with gladiator
if (!weapon.collisionChecked && weapon.intersects(gladiator)) {
weapon.collisionChecked = true;
// Weapon hits player
gladiator.takeDamage(weapon.damage);
// Remove weapon
weapon.destroy();
weapons.splice(i, 1);
} else if (weapon.y > 2732 + 50) {
// Weapon went off screen
weapon.destroy();
weapons.splice(i, 1);
}
}
// Gradually decrease spawn interval based on time (make game harder)
spawnInterval = Math.max(500, 2000 - elapsedGameTime / 10000);
};
// Level up function
function levelUp() {
level++;
levelTxt.setText('LEVEL ' + level);
// Increase difficulty
horsemanSpawnChance = Math.min(0.4, 0.05 + (level - 1) * 0.05);
weaponSpawnChance = Math.min(0.5, 0.1 + (level - 1) * 0.05);
// Visual effect
LK.effects.flashScreen(0xFFFF00, 500);
LK.getSound('levelUp').play();
}
// Start background music
LK.playMusic('arenaMusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});