/**** * 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";