/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
playerLevel: 1,
playerHealth: 100,
playerMaxHealth: 100,
playerStrength: 10,
playerDefense: 5,
playerAgility: 5,
wins: 0
});
/****
* Classes
****/
var ActionButton = Container.expand(function (label, callback) {
var self = Container.call(this);
var button = self.attachAsset('actionButton', {
anchorX: 0.5,
anchorY: 0.5
});
var text = new Text2(label, {
size: 40,
fill: 0xFFFFFF
});
text.anchor.set(0.5, 0.5);
self.addChild(text);
self.setEnabled = function (enabled) {
self.enabled = enabled;
self.alpha = enabled ? 1.0 : 0.5;
};
self.down = function () {
if (self.enabled) {
tween(button, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
}
};
self.up = function () {
if (self.enabled) {
tween(button, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100
});
if (callback) {
callback();
}
}
};
self.setEnabled(true);
return self;
});
var CoinDisplay = Container.expand(function () {
var self = Container.call(this);
var coinIcon = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
x: -30,
y: 0
});
var coinText = new Text2(storage.coins.toString(), {
size: 40,
fill: 0xFFFFFF
});
coinText.anchor.set(0, 0.5);
coinText.x = 10;
self.addChild(coinText);
self.update = function () {
coinText.setText(storage.coins.toString());
};
return self;
});
var CombatLog = Container.expand(function () {
var self = Container.call(this);
var logText = new Text2("", {
size: 35,
fill: 0xFFFFFF
});
logText.anchor.set(0.5, 0);
self.addChild(logText);
self.addEntry = function (message) {
logText.setText(message);
// Clear the message after a delay
LK.setTimeout(function () {
if (logText.text === message) {
// Only clear if it hasn't been changed
logText.setText("");
}
}, 3000);
};
return self;
});
var Gladiator = Container.expand(function (isPlayer) {
var self = Container.call(this);
var sprite = self.attachAsset(isPlayer ? 'player' : 'enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.isPlayer = isPlayer;
self.health = isPlayer ? storage.playerMaxHealth : 0;
self.maxHealth = isPlayer ? storage.playerMaxHealth : 0;
self.strength = isPlayer ? storage.playerStrength : 0;
self.defense = isPlayer ? storage.playerDefense : 0;
self.agility = isPlayer ? storage.playerAgility : 0;
self.level = isPlayer ? storage.playerLevel : 1;
self.healthBar = new HealthBar();
self.healthBar.y = -sprite.height / 2 - 40;
self.healthBar.x = -self.healthBar.width / 2;
self.addChild(self.healthBar);
var levelText = new Text2("Lvl " + self.level, {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
levelText.y = sprite.height / 2 + 40;
self.addChild(levelText);
self.takeDamage = function (amount) {
var actualDamage = Math.max(1, amount - self.defense / 2);
self.health = Math.max(0, self.health - actualDamage);
self.healthBar.setHealth(self.health, self.maxHealth);
// Visual feedback
tween(sprite, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(sprite, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
return actualDamage;
};
self.heal = function (amount) {
self.health = Math.min(self.maxHealth, self.health + amount);
self.healthBar.setHealth(self.health, self.maxHealth);
// Visual feedback
tween(sprite, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(sprite, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.isDead = function () {
return self.health <= 0;
};
self.reset = function () {
if (self.isPlayer) {
self.health = storage.playerMaxHealth;
self.maxHealth = storage.playerMaxHealth;
self.strength = storage.playerStrength;
self.defense = storage.playerDefense;
self.agility = storage.playerAgility;
self.level = storage.playerLevel;
levelText.setText("Lvl " + self.level);
}
self.healthBar.setHealth(self.health, self.maxHealth);
};
self.generateEnemy = function (difficulty) {
if (!self.isPlayer) {
self.level = Math.max(1, difficulty);
self.health = 80 + self.level * 20;
self.maxHealth = self.health;
self.strength = 8 + self.level * 2;
self.defense = 3 + Math.floor(self.level * 1.5);
self.agility = 3 + Math.floor(self.level * 1.2);
levelText.setText("Lvl " + self.level);
self.healthBar.setHealth(self.health, self.maxHealth);
}
};
self.healthBar.setHealth(self.health, self.maxHealth);
return self;
});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
var bar = self.attachAsset('healthBar', {
anchorX: 0,
anchorY: 0
});
self.setHealth = function (current, max) {
var percentage = Math.max(0, Math.min(1, current / max));
bar.scale.x = percentage;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x302b2a
});
/****
* Game Code
****/
// Game state
var gameState = "menu"; // menu, combat, upgrade, victory, defeat
var currentTurn = "player"; // player, enemy
var currentRound = 0;
var battleWon = false;
// Create arena
var arena = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5
});
arena.x = 2048 / 2;
arena.y = 2732 / 2;
game.addChild(arena);
// Create gladiators
var player = new Gladiator(true);
player.x = 2048 / 2 - 300;
player.y = 2732 / 2;
game.addChild(player);
var enemy = new Gladiator(false);
enemy.x = 2048 / 2 + 300;
enemy.y = 2732 / 2;
game.addChild(enemy);
// Generate enemy based on player's level
enemy.generateEnemy(storage.playerLevel);
// Create UI elements
var combatLog = new CombatLog();
combatLog.x = 2048 / 2;
combatLog.y = 2732 / 2 - 300;
game.addChild(combatLog);
var coinDisplay = new CoinDisplay();
coinDisplay.x = 2048 - 150;
coinDisplay.y = 150;
game.addChild(coinDisplay);
// Battle UI
var actionButtons = [];
// Attack button
var attackButton = new ActionButton("Attack", function () {
performPlayerAttack();
});
attackButton.x = 2048 / 2 - 250;
attackButton.y = 2732 - 200;
game.addChild(attackButton);
actionButtons.push(attackButton);
// Defend button
var defendButton = new ActionButton("Defend", function () {
performPlayerDefend();
});
defendButton.x = 2048 / 2;
defendButton.y = 2732 - 200;
game.addChild(defendButton);
actionButtons.push(defendButton);
// Special attack button
var specialButton = new ActionButton("Special", function () {
performPlayerSpecial();
});
specialButton.x = 2048 / 2 + 250;
specialButton.y = 2732 - 200;
game.addChild(specialButton);
actionButtons.push(specialButton);
// Next battle button (shown after victory)
var nextBattleButton = new ActionButton("Next Battle", function () {
startNextBattle();
});
nextBattleButton.x = 2048 / 2;
nextBattleButton.y = 2732 - 200;
nextBattleButton.visible = false;
game.addChild(nextBattleButton);
// Upgrade buttons (shown after victory)
var upgradeButtons = [];
var upgradeHealthButton = new ActionButton("Health +20", function () {
upgradeHealth();
});
upgradeHealthButton.x = 2048 / 2 - 250;
upgradeHealthButton.y = 2732 - 300;
upgradeHealthButton.visible = false;
game.addChild(upgradeHealthButton);
upgradeButtons.push(upgradeHealthButton);
var upgradeStrengthButton = new ActionButton("Strength +2", function () {
upgradeStrength();
});
upgradeStrengthButton.x = 2048 / 2;
upgradeStrengthButton.y = 2732 - 300;
upgradeStrengthButton.visible = false;
game.addChild(upgradeStrengthButton);
upgradeButtons.push(upgradeStrengthButton);
var upgradeDefenseButton = new ActionButton("Defense +2", function () {
upgradeDefense();
});
upgradeDefenseButton.x = 2048 / 2 + 250;
upgradeDefenseButton.y = 2732 - 300;
upgradeDefenseButton.visible = false;
game.addChild(upgradeDefenseButton);
upgradeButtons.push(upgradeDefenseButton);
// Title text
var titleText = new Text2("ARENA GLADIATOR", {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 500;
game.addChild(titleText);
// Start game button
var startButton = new ActionButton("Start Battle", function () {
startGame();
});
startButton.x = 2048 / 2;
startButton.y = 800;
game.addChild(startButton);
// Status text
var statusText = new Text2("", {
size: 60,
fill: 0xFFFFFF
});
statusText.anchor.set(0.5, 0.5);
statusText.x = 2048 / 2;
statusText.y = 400;
game.addChild(statusText);
// Game functions
function startGame() {
gameState = "combat";
currentTurn = "player";
currentRound = 1;
battleWon = false;
// Reset gladiators
player.reset();
enemy.generateEnemy(storage.playerLevel);
// Update UI visibility
titleText.visible = false;
startButton.visible = false;
showCombatUI(true);
showUpgradeUI(false);
nextBattleButton.visible = false;
statusText.setText("Round " + currentRound);
combatLog.addEntry("The battle begins! It's your turn.");
// Play arena music
LK.playMusic('arenaMusic');
}
function showCombatUI(visible) {
for (var i = 0; i < actionButtons.length; i++) {
actionButtons[i].visible = visible;
}
}
function showUpgradeUI(visible) {
for (var i = 0; i < upgradeButtons.length; i++) {
upgradeButtons[i].visible = visible;
}
}
function performPlayerAttack() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Calculate damage
var baseDamage = player.strength;
var criticalChance = player.agility / 100;
var isCritical = Math.random() < criticalChance;
var damage = baseDamage * (isCritical ? 2 : 1);
// Apply damage to enemy
var actualDamage = enemy.takeDamage(damage);
// Show combat log
if (isCritical) {
combatLog.addEntry("Critical hit! You dealt " + actualDamage + " damage!");
LK.getSound('critical').play();
} else {
combatLog.addEntry("You attacked for " + actualDamage + " damage!");
LK.getSound('hit').play();
}
// Check if enemy is defeated
if (enemy.isDead()) {
LK.setTimeout(function () {
endBattle(true);
}, 1000);
} else {
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
}
function performPlayerDefend() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Add temporary defense bonus
var tempDefenseBonus = Math.floor(player.defense * 0.5);
player.defense += tempDefenseBonus;
combatLog.addEntry("You take a defensive stance! (+" + tempDefenseBonus + " DEF)");
LK.getSound('block').play();
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
// Remove temporary defense bonus after enemy turn
LK.setTimeout(function () {
player.defense -= tempDefenseBonus;
}, 1000);
}, 1000);
}
function performPlayerSpecial() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Special attack has higher damage but might miss
var hitChance = 0.7 + player.agility / 100;
var isHit = Math.random() < hitChance;
if (isHit) {
// Calculate damage (higher than normal attack)
var damage = Math.floor(player.strength * 1.5);
var actualDamage = enemy.takeDamage(damage);
combatLog.addEntry("Special attack hits for " + actualDamage + " damage!");
LK.getSound('critical').play();
// Check if enemy is defeated
if (enemy.isDead()) {
LK.setTimeout(function () {
endBattle(true);
}, 1000);
} else {
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
} else {
combatLog.addEntry("Special attack missed!");
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
}
function performEnemyTurn() {
if (gameState !== "combat" || currentTurn !== "enemy") {
return;
}
// Enemy AI - randomly choose between attack types
var moveType = Math.random();
if (moveType < 0.7) {
// Basic attack
var damage = enemy.strength;
var actualDamage = player.takeDamage(damage);
combatLog.addEntry("Enemy attacks for " + actualDamage + " damage!");
LK.getSound('hit').play();
} else if (moveType < 0.9) {
// Strong attack
var damage = Math.floor(enemy.strength * 1.3);
var actualDamage = player.takeDamage(damage);
combatLog.addEntry("Enemy strikes hard for " + actualDamage + " damage!");
LK.getSound('critical').play();
} else {
// Heal
var healAmount = Math.floor(enemy.maxHealth * 0.1);
enemy.heal(healAmount);
combatLog.addEntry("Enemy recovers " + healAmount + " health!");
}
// Check if player is defeated
if (player.isDead()) {
LK.setTimeout(function () {
endBattle(false);
}, 1000);
} else {
// Player turn after a delay
LK.setTimeout(function () {
currentTurn = "player";
currentRound++;
statusText.setText("Round " + currentRound);
combatLog.addEntry("Your turn!");
setActionButtonsEnabled(true);
}, 1000);
}
}
function endBattle(playerWon) {
gameState = playerWon ? "victory" : "defeat";
battleWon = playerWon;
if (playerWon) {
// Award coins based on enemy level
var coinsEarned = 10 + enemy.level * 5;
storage.coins += coinsEarned;
storage.wins += 1;
coinDisplay.update();
statusText.setText("VICTORY!");
combatLog.addEntry("You won! Earned " + coinsEarned + " coins.");
LK.getSound('victory').play();
// Show upgrade options
showCombatUI(false);
showUpgradeUI(true);
nextBattleButton.visible = true;
} else {
statusText.setText("DEFEAT!");
combatLog.addEntry("You were defeated. Try again!");
LK.getSound('defeat').play();
// Show restart button
showCombatUI(false);
startButton.visible = true;
startButton.x = 2048 / 2;
startButton.y = 2732 - 200;
}
}
function startNextBattle() {
if (gameState !== "victory") {
return;
}
// Level up player
storage.playerLevel += 1;
// Start new battle
startGame();
}
function upgradeHealth() {
if (gameState !== "victory" || storage.coins < 20) {
return;
}
storage.coins -= 20;
storage.playerMaxHealth += 20;
coinDisplay.update();
combatLog.addEntry("Health increased! (20 coins spent)");
updateUpgradeButtons();
}
function upgradeStrength() {
if (gameState !== "victory" || storage.coins < 15) {
return;
}
storage.coins -= 15;
storage.playerStrength += 2;
coinDisplay.update();
combatLog.addEntry("Strength increased! (15 coins spent)");
updateUpgradeButtons();
}
function upgradeDefense() {
if (gameState !== "victory" || storage.coins < 15) {
return;
}
storage.coins -= 15;
storage.playerDefense += 2;
coinDisplay.update();
combatLog.addEntry("Defense increased! (15 coins spent)");
updateUpgradeButtons();
}
function updateUpgradeButtons() {
upgradeHealthButton.setEnabled(storage.coins >= 20);
upgradeStrengthButton.setEnabled(storage.coins >= 15);
upgradeDefenseButton.setEnabled(storage.coins >= 15);
}
function setActionButtonsEnabled(enabled) {
for (var i = 0; i < actionButtons.length; i++) {
actionButtons[i].setEnabled(enabled);
}
}
// Initialize button states
updateUpgradeButtons();
// Game initialization state
player.visible = false;
enemy.visible = false;
statusText.visible = false;
combatLog.visible = false;
// Game main update loop
game.update = function () {
// Update game state
if (gameState === "menu") {
titleText.visible = true;
startButton.visible = true;
player.visible = false;
enemy.visible = false;
statusText.visible = false;
combatLog.visible = false;
showCombatUI(false);
showUpgradeUI(false);
nextBattleButton.visible = false;
} else if (gameState === "combat" || gameState === "victory" || gameState === "defeat") {
titleText.visible = false;
player.visible = true;
enemy.visible = true;
statusText.visible = true;
combatLog.visible = true;
}
};
// Start with menu
gameState = "menu"; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
playerLevel: 1,
playerHealth: 100,
playerMaxHealth: 100,
playerStrength: 10,
playerDefense: 5,
playerAgility: 5,
wins: 0
});
/****
* Classes
****/
var ActionButton = Container.expand(function (label, callback) {
var self = Container.call(this);
var button = self.attachAsset('actionButton', {
anchorX: 0.5,
anchorY: 0.5
});
var text = new Text2(label, {
size: 40,
fill: 0xFFFFFF
});
text.anchor.set(0.5, 0.5);
self.addChild(text);
self.setEnabled = function (enabled) {
self.enabled = enabled;
self.alpha = enabled ? 1.0 : 0.5;
};
self.down = function () {
if (self.enabled) {
tween(button, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
}
};
self.up = function () {
if (self.enabled) {
tween(button, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100
});
if (callback) {
callback();
}
}
};
self.setEnabled(true);
return self;
});
var CoinDisplay = Container.expand(function () {
var self = Container.call(this);
var coinIcon = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
x: -30,
y: 0
});
var coinText = new Text2(storage.coins.toString(), {
size: 40,
fill: 0xFFFFFF
});
coinText.anchor.set(0, 0.5);
coinText.x = 10;
self.addChild(coinText);
self.update = function () {
coinText.setText(storage.coins.toString());
};
return self;
});
var CombatLog = Container.expand(function () {
var self = Container.call(this);
var logText = new Text2("", {
size: 35,
fill: 0xFFFFFF
});
logText.anchor.set(0.5, 0);
self.addChild(logText);
self.addEntry = function (message) {
logText.setText(message);
// Clear the message after a delay
LK.setTimeout(function () {
if (logText.text === message) {
// Only clear if it hasn't been changed
logText.setText("");
}
}, 3000);
};
return self;
});
var Gladiator = Container.expand(function (isPlayer) {
var self = Container.call(this);
var sprite = self.attachAsset(isPlayer ? 'player' : 'enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.isPlayer = isPlayer;
self.health = isPlayer ? storage.playerMaxHealth : 0;
self.maxHealth = isPlayer ? storage.playerMaxHealth : 0;
self.strength = isPlayer ? storage.playerStrength : 0;
self.defense = isPlayer ? storage.playerDefense : 0;
self.agility = isPlayer ? storage.playerAgility : 0;
self.level = isPlayer ? storage.playerLevel : 1;
self.healthBar = new HealthBar();
self.healthBar.y = -sprite.height / 2 - 40;
self.healthBar.x = -self.healthBar.width / 2;
self.addChild(self.healthBar);
var levelText = new Text2("Lvl " + self.level, {
size: 40,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
levelText.y = sprite.height / 2 + 40;
self.addChild(levelText);
self.takeDamage = function (amount) {
var actualDamage = Math.max(1, amount - self.defense / 2);
self.health = Math.max(0, self.health - actualDamage);
self.healthBar.setHealth(self.health, self.maxHealth);
// Visual feedback
tween(sprite, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(sprite, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
return actualDamage;
};
self.heal = function (amount) {
self.health = Math.min(self.maxHealth, self.health + amount);
self.healthBar.setHealth(self.health, self.maxHealth);
// Visual feedback
tween(sprite, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(sprite, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
};
self.isDead = function () {
return self.health <= 0;
};
self.reset = function () {
if (self.isPlayer) {
self.health = storage.playerMaxHealth;
self.maxHealth = storage.playerMaxHealth;
self.strength = storage.playerStrength;
self.defense = storage.playerDefense;
self.agility = storage.playerAgility;
self.level = storage.playerLevel;
levelText.setText("Lvl " + self.level);
}
self.healthBar.setHealth(self.health, self.maxHealth);
};
self.generateEnemy = function (difficulty) {
if (!self.isPlayer) {
self.level = Math.max(1, difficulty);
self.health = 80 + self.level * 20;
self.maxHealth = self.health;
self.strength = 8 + self.level * 2;
self.defense = 3 + Math.floor(self.level * 1.5);
self.agility = 3 + Math.floor(self.level * 1.2);
levelText.setText("Lvl " + self.level);
self.healthBar.setHealth(self.health, self.maxHealth);
}
};
self.healthBar.setHealth(self.health, self.maxHealth);
return self;
});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
var bar = self.attachAsset('healthBar', {
anchorX: 0,
anchorY: 0
});
self.setHealth = function (current, max) {
var percentage = Math.max(0, Math.min(1, current / max));
bar.scale.x = percentage;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x302b2a
});
/****
* Game Code
****/
// Game state
var gameState = "menu"; // menu, combat, upgrade, victory, defeat
var currentTurn = "player"; // player, enemy
var currentRound = 0;
var battleWon = false;
// Create arena
var arena = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5
});
arena.x = 2048 / 2;
arena.y = 2732 / 2;
game.addChild(arena);
// Create gladiators
var player = new Gladiator(true);
player.x = 2048 / 2 - 300;
player.y = 2732 / 2;
game.addChild(player);
var enemy = new Gladiator(false);
enemy.x = 2048 / 2 + 300;
enemy.y = 2732 / 2;
game.addChild(enemy);
// Generate enemy based on player's level
enemy.generateEnemy(storage.playerLevel);
// Create UI elements
var combatLog = new CombatLog();
combatLog.x = 2048 / 2;
combatLog.y = 2732 / 2 - 300;
game.addChild(combatLog);
var coinDisplay = new CoinDisplay();
coinDisplay.x = 2048 - 150;
coinDisplay.y = 150;
game.addChild(coinDisplay);
// Battle UI
var actionButtons = [];
// Attack button
var attackButton = new ActionButton("Attack", function () {
performPlayerAttack();
});
attackButton.x = 2048 / 2 - 250;
attackButton.y = 2732 - 200;
game.addChild(attackButton);
actionButtons.push(attackButton);
// Defend button
var defendButton = new ActionButton("Defend", function () {
performPlayerDefend();
});
defendButton.x = 2048 / 2;
defendButton.y = 2732 - 200;
game.addChild(defendButton);
actionButtons.push(defendButton);
// Special attack button
var specialButton = new ActionButton("Special", function () {
performPlayerSpecial();
});
specialButton.x = 2048 / 2 + 250;
specialButton.y = 2732 - 200;
game.addChild(specialButton);
actionButtons.push(specialButton);
// Next battle button (shown after victory)
var nextBattleButton = new ActionButton("Next Battle", function () {
startNextBattle();
});
nextBattleButton.x = 2048 / 2;
nextBattleButton.y = 2732 - 200;
nextBattleButton.visible = false;
game.addChild(nextBattleButton);
// Upgrade buttons (shown after victory)
var upgradeButtons = [];
var upgradeHealthButton = new ActionButton("Health +20", function () {
upgradeHealth();
});
upgradeHealthButton.x = 2048 / 2 - 250;
upgradeHealthButton.y = 2732 - 300;
upgradeHealthButton.visible = false;
game.addChild(upgradeHealthButton);
upgradeButtons.push(upgradeHealthButton);
var upgradeStrengthButton = new ActionButton("Strength +2", function () {
upgradeStrength();
});
upgradeStrengthButton.x = 2048 / 2;
upgradeStrengthButton.y = 2732 - 300;
upgradeStrengthButton.visible = false;
game.addChild(upgradeStrengthButton);
upgradeButtons.push(upgradeStrengthButton);
var upgradeDefenseButton = new ActionButton("Defense +2", function () {
upgradeDefense();
});
upgradeDefenseButton.x = 2048 / 2 + 250;
upgradeDefenseButton.y = 2732 - 300;
upgradeDefenseButton.visible = false;
game.addChild(upgradeDefenseButton);
upgradeButtons.push(upgradeDefenseButton);
// Title text
var titleText = new Text2("ARENA GLADIATOR", {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 500;
game.addChild(titleText);
// Start game button
var startButton = new ActionButton("Start Battle", function () {
startGame();
});
startButton.x = 2048 / 2;
startButton.y = 800;
game.addChild(startButton);
// Status text
var statusText = new Text2("", {
size: 60,
fill: 0xFFFFFF
});
statusText.anchor.set(0.5, 0.5);
statusText.x = 2048 / 2;
statusText.y = 400;
game.addChild(statusText);
// Game functions
function startGame() {
gameState = "combat";
currentTurn = "player";
currentRound = 1;
battleWon = false;
// Reset gladiators
player.reset();
enemy.generateEnemy(storage.playerLevel);
// Update UI visibility
titleText.visible = false;
startButton.visible = false;
showCombatUI(true);
showUpgradeUI(false);
nextBattleButton.visible = false;
statusText.setText("Round " + currentRound);
combatLog.addEntry("The battle begins! It's your turn.");
// Play arena music
LK.playMusic('arenaMusic');
}
function showCombatUI(visible) {
for (var i = 0; i < actionButtons.length; i++) {
actionButtons[i].visible = visible;
}
}
function showUpgradeUI(visible) {
for (var i = 0; i < upgradeButtons.length; i++) {
upgradeButtons[i].visible = visible;
}
}
function performPlayerAttack() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Calculate damage
var baseDamage = player.strength;
var criticalChance = player.agility / 100;
var isCritical = Math.random() < criticalChance;
var damage = baseDamage * (isCritical ? 2 : 1);
// Apply damage to enemy
var actualDamage = enemy.takeDamage(damage);
// Show combat log
if (isCritical) {
combatLog.addEntry("Critical hit! You dealt " + actualDamage + " damage!");
LK.getSound('critical').play();
} else {
combatLog.addEntry("You attacked for " + actualDamage + " damage!");
LK.getSound('hit').play();
}
// Check if enemy is defeated
if (enemy.isDead()) {
LK.setTimeout(function () {
endBattle(true);
}, 1000);
} else {
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
}
function performPlayerDefend() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Add temporary defense bonus
var tempDefenseBonus = Math.floor(player.defense * 0.5);
player.defense += tempDefenseBonus;
combatLog.addEntry("You take a defensive stance! (+" + tempDefenseBonus + " DEF)");
LK.getSound('block').play();
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
// Remove temporary defense bonus after enemy turn
LK.setTimeout(function () {
player.defense -= tempDefenseBonus;
}, 1000);
}, 1000);
}
function performPlayerSpecial() {
if (gameState !== "combat" || currentTurn !== "player") {
return;
}
// Disable buttons during animation
setActionButtonsEnabled(false);
// Special attack has higher damage but might miss
var hitChance = 0.7 + player.agility / 100;
var isHit = Math.random() < hitChance;
if (isHit) {
// Calculate damage (higher than normal attack)
var damage = Math.floor(player.strength * 1.5);
var actualDamage = enemy.takeDamage(damage);
combatLog.addEntry("Special attack hits for " + actualDamage + " damage!");
LK.getSound('critical').play();
// Check if enemy is defeated
if (enemy.isDead()) {
LK.setTimeout(function () {
endBattle(true);
}, 1000);
} else {
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
} else {
combatLog.addEntry("Special attack missed!");
// Enemy turn after a delay
LK.setTimeout(function () {
currentTurn = "enemy";
performEnemyTurn();
}, 1000);
}
}
function performEnemyTurn() {
if (gameState !== "combat" || currentTurn !== "enemy") {
return;
}
// Enemy AI - randomly choose between attack types
var moveType = Math.random();
if (moveType < 0.7) {
// Basic attack
var damage = enemy.strength;
var actualDamage = player.takeDamage(damage);
combatLog.addEntry("Enemy attacks for " + actualDamage + " damage!");
LK.getSound('hit').play();
} else if (moveType < 0.9) {
// Strong attack
var damage = Math.floor(enemy.strength * 1.3);
var actualDamage = player.takeDamage(damage);
combatLog.addEntry("Enemy strikes hard for " + actualDamage + " damage!");
LK.getSound('critical').play();
} else {
// Heal
var healAmount = Math.floor(enemy.maxHealth * 0.1);
enemy.heal(healAmount);
combatLog.addEntry("Enemy recovers " + healAmount + " health!");
}
// Check if player is defeated
if (player.isDead()) {
LK.setTimeout(function () {
endBattle(false);
}, 1000);
} else {
// Player turn after a delay
LK.setTimeout(function () {
currentTurn = "player";
currentRound++;
statusText.setText("Round " + currentRound);
combatLog.addEntry("Your turn!");
setActionButtonsEnabled(true);
}, 1000);
}
}
function endBattle(playerWon) {
gameState = playerWon ? "victory" : "defeat";
battleWon = playerWon;
if (playerWon) {
// Award coins based on enemy level
var coinsEarned = 10 + enemy.level * 5;
storage.coins += coinsEarned;
storage.wins += 1;
coinDisplay.update();
statusText.setText("VICTORY!");
combatLog.addEntry("You won! Earned " + coinsEarned + " coins.");
LK.getSound('victory').play();
// Show upgrade options
showCombatUI(false);
showUpgradeUI(true);
nextBattleButton.visible = true;
} else {
statusText.setText("DEFEAT!");
combatLog.addEntry("You were defeated. Try again!");
LK.getSound('defeat').play();
// Show restart button
showCombatUI(false);
startButton.visible = true;
startButton.x = 2048 / 2;
startButton.y = 2732 - 200;
}
}
function startNextBattle() {
if (gameState !== "victory") {
return;
}
// Level up player
storage.playerLevel += 1;
// Start new battle
startGame();
}
function upgradeHealth() {
if (gameState !== "victory" || storage.coins < 20) {
return;
}
storage.coins -= 20;
storage.playerMaxHealth += 20;
coinDisplay.update();
combatLog.addEntry("Health increased! (20 coins spent)");
updateUpgradeButtons();
}
function upgradeStrength() {
if (gameState !== "victory" || storage.coins < 15) {
return;
}
storage.coins -= 15;
storage.playerStrength += 2;
coinDisplay.update();
combatLog.addEntry("Strength increased! (15 coins spent)");
updateUpgradeButtons();
}
function upgradeDefense() {
if (gameState !== "victory" || storage.coins < 15) {
return;
}
storage.coins -= 15;
storage.playerDefense += 2;
coinDisplay.update();
combatLog.addEntry("Defense increased! (15 coins spent)");
updateUpgradeButtons();
}
function updateUpgradeButtons() {
upgradeHealthButton.setEnabled(storage.coins >= 20);
upgradeStrengthButton.setEnabled(storage.coins >= 15);
upgradeDefenseButton.setEnabled(storage.coins >= 15);
}
function setActionButtonsEnabled(enabled) {
for (var i = 0; i < actionButtons.length; i++) {
actionButtons[i].setEnabled(enabled);
}
}
// Initialize button states
updateUpgradeButtons();
// Game initialization state
player.visible = false;
enemy.visible = false;
statusText.visible = false;
combatLog.visible = false;
// Game main update loop
game.update = function () {
// Update game state
if (gameState === "menu") {
titleText.visible = true;
startButton.visible = true;
player.visible = false;
enemy.visible = false;
statusText.visible = false;
combatLog.visible = false;
showCombatUI(false);
showUpgradeUI(false);
nextBattleButton.visible = false;
} else if (gameState === "combat" || gameState === "victory" || gameState === "defeat") {
titleText.visible = false;
player.visible = true;
enemy.visible = true;
statusText.visible = true;
combatLog.visible = true;
}
};
// Start with menu
gameState = "menu";