/****
* Classes
****/
// background image asset
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Attach enemy asset
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Enemy properties
self.speed = 4 + Math.random() * 2; // random speed
self.attackRange = 120;
self.isAttacking = false;
// Set a random direction towards the player
self.vx = 0;
self.vy = 0;
// Track last position for good practice
self.lastX = self.x;
self.lastY = self.y;
// Update enemy movement and attack logic
self.update = function () {
// Save last position
self.lastX = self.x;
self.lastY = self.y;
// Move towards the orange player if it exists
if (typeof orangePlayer !== "undefined" && orangePlayer) {
// Set the ground Y position (grass level)
var groundY = 2732 - 220;
// If enemy is not on the ground, move vertically to the ground first
if (Math.abs(self.y - groundY) > 2) {
// Only move vertically to the ground
var dy = groundY - self.y;
var step = Math.sign(dy) * Math.min(Math.abs(dy), self.speed);
self.x += 0;
self.y += step;
self.vx = 0;
self.vy = step;
self.isAttacking = false;
} else {
// Snap to ground
self.y = groundY;
// Move horizontally towards the player
var dx = orangePlayer.x - self.x;
var dist = Math.abs(dx);
if (dist > 0) {
self.vx = Math.sign(dx) * self.speed;
} else {
self.vx = 0;
}
self.x += self.vx;
self.vy = 0;
// Attack if close enough horizontally
self.isAttacking = dist < self.attackRange;
}
} else {
self.isAttacking = false;
}
};
return self;
});
// Orange player asset (orange box)
// Enemy asset (red box)
// Sword class
var Sword = Container.expand(function () {
var self = Container.call(this);
// Attach a simple sword asset (reuse orange asset for now, but smaller and offset)
var swordGraphics = self.attachAsset('orange', {
anchorX: 0.1,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.18
});
self.visible = false;
self.attackTimer = 0;
self.attackDuration = 18; // frames (0.3s at 60fps)
// Swing the sword (show for a short time)
self.swing = function () {
if (self.attackTimer <= 0) {
self.attackTimer = self.attackDuration;
self.visible = true;
}
};
// Update sword state
self.update = function () {
if (self.attackTimer > 0) {
self.attackTimer--;
self.visible = true;
// Animate sword swing (rotate a bit)
swordGraphics.rotation = -0.7 + 1.4 * (1 - self.attackTimer / self.attackDuration);
} else {
self.visible = false;
swordGraphics.rotation = 0;
}
};
return self;
});
/****
* Initialize Game
****/
// Create the orange player
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// --- MENU SCREEN SETUP ---
var menuContainer = new Container();
menuContainer.visible = true;
// Menu background
var menuBg = LK.getAsset('bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
menuContainer.addChild(menuBg);
// Title text
var titleText = new Text2("Orange Adventure", {
size: 180,
fill: 0xFFA500
});
titleText.anchor.set(0.5, 0);
titleText.x = 2048 / 2;
titleText.y = 320;
menuContainer.addChild(titleText);
// Start Game button
var startBtn = new Text2("Start Game", {
size: 110,
fill: "#fff"
});
startBtn.anchor.set(0.5, 0.5);
startBtn.x = 2048 / 2;
startBtn.y = 900;
startBtn.interactive = true;
startBtn.buttonMode = true;
startBtn.down = function () {
menuContainer.visible = false;
// Show gameplay UI
bg.visible = true;
orangePlayer.visible = true;
sword.visible = true;
attackBtn.visible = true;
shopBtn.visible = true;
stageText.visible = true;
// Hide shop if open
shopPage.visible = false;
// Play last.mp3 music
LK.playMusic('Last');
};
// Customize Character button
var customizeBtn = new Text2("Customize Character", {
size: 90,
fill: "#fff"
});
customizeBtn.anchor.set(0.5, 0.5);
customizeBtn.x = 2048 / 2;
customizeBtn.y = 1100;
customizeBtn.interactive = true;
customizeBtn.buttonMode = true;
customizeBtn.down = function () {
// For now, just show a placeholder popup
if (!menuContainer.customizePopup) {
var popup = new Container();
var popupBg = LK.getAsset('shopBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
popup.addChild(popupBg);
var popupText = new Text2("Customization coming soon!", {
size: 70,
fill: "#fff"
});
popupText.anchor.set(0.5, 0.5);
popupText.x = 2048 / 2;
popupText.y = 2732 / 2 - 60;
popup.addChild(popupText);
var closeBtn = new Text2("Close", {
size: 64,
fill: 0xFFA500
});
closeBtn.anchor.set(0.5, 0.5);
closeBtn.x = 2048 / 2;
closeBtn.y = 2732 / 2 + 200;
closeBtn.interactive = true;
closeBtn.buttonMode = true;
closeBtn.down = function () {
popup.visible = false;
};
popup.addChild(closeBtn);
menuContainer.addChild(popup);
menuContainer.customizePopup = popup;
}
menuContainer.customizePopup.visible = true;
};
menuContainer.addChild(startBtn);
menuContainer.addChild(customizeBtn);
// Add menu to game
game.addChild(menuContainer);
// Add background image to the game scene (for gameplay, hidden at menu)
var bg = LK.getAsset('bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
bg.visible = false;
game.addChild(bg);
// Orange player: bright orange ellipse with a white border
// Enemy: red box with a black border
// Sword: long thin yellow box
var orangePlayer = new Container();
var orangeGraphics = orangePlayer.attachAsset('orange', {
anchorX: 0.5,
anchorY: 0.5
});
orangePlayer.x = 2048 / 2;
orangePlayer.y = 2732 - 300;
game.addChild(orangePlayer);
orangePlayer.visible = false;
// Add sword to orange player
var sword = new Sword();
sword.x = 60; // Offset to the right of orange
sword.y = 0;
orangePlayer.addChild(sword);
sword.visible = false;
// Add shop button to GUI (in front of attack button, i.e. to the left)
var shopBtn = LK.getAsset('shopIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 - 420,
// 200px to the left of attack button
y: 2732 - 220
});
shopBtn.interactive = true;
shopBtn.buttonMode = true;
game.addChild(shopBtn);
shopBtn.visible = false;
// Shop page container (hidden by default)
var shopPage = new Container();
shopPage.visible = false;
// Shop background
var shopBg = LK.getAsset('shopBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
shopPage.addChild(shopBg);
// Shop items
var shopItems = [{
id: 'shopSword',
name: 'Sword Upgrade',
price: 100,
x: 2048 / 2 - 220,
y: 2732 / 2 - 100
}, {
id: 'shopShield',
name: 'Shield',
price: 80,
x: 2048 / 2,
y: 2732 / 2 - 100
}, {
id: 'shopPotion',
name: 'Health Potion',
price: 50,
x: 2048 / 2 + 220,
y: 2732 / 2 - 100
}];
for (var i = 0; i < shopItems.length; i++) {
var item = shopItems[i];
var itemIcon = LK.getAsset(item.id, {
anchorX: 0.5,
anchorY: 0.5,
x: item.x,
y: item.y
});
shopPage.addChild(itemIcon);
var itemText = new Text2(item.name + "\n" + item.price + " coins", {
size: 48,
fill: "#fff"
});
itemText.anchor.set(0.5, 0);
itemText.x = item.x;
itemText.y = item.y + 80;
shopPage.addChild(itemText);
}
// Shop close button
var shopCloseBtn = new Text2("Close", {
size: 64,
fill: 0xFF8800
});
shopCloseBtn.anchor.set(0.5, 0.5);
shopCloseBtn.x = 2048 / 2;
shopCloseBtn.y = 2732 / 2 + 500;
shopCloseBtn.interactive = true;
shopCloseBtn.buttonMode = true;
shopCloseBtn.down = function () {
shopPage.visible = false;
// Re-enable gameplay UI
orangePlayer.visible = true;
sword.visible = true;
attackBtn.visible = true;
shopBtn.visible = true;
stageText.visible = true;
};
shopPage.addChild(shopCloseBtn);
game.addChild(shopPage);
shopPage.visible = false;
// Shop button teleports to shop page
shopBtn.down = function () {
shopPage.visible = true;
// Hide gameplay UI while in shop
orangePlayer.visible = false;
sword.visible = false;
attackBtn.visible = false;
shopBtn.visible = false;
stageText.visible = false;
};
// Add attack button to GUI
var attackBtn = LK.getAsset('attackBtn', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 - 220,
y: 2732 - 220
});
attackBtn.interactive = true;
attackBtn.buttonMode = true;
attackBtn.down = function (x, y, obj) {
sword.swing();
};
game.addChild(attackBtn);
attackBtn.visible = false;
// Array to hold enemies
var enemies = [];
// Function to spawn an enemy at a random edge
function spawnEnemy() {
var enemy = new Enemy();
// Randomly choose spawn side
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// left
enemy.x = 0;
enemy.y = Math.random() * 2732;
} else if (side === 1) {
// right
enemy.x = 2048;
enemy.y = Math.random() * 2732;
} else if (side === 2) {
// top
enemy.x = Math.random() * 2048;
enemy.y = 0;
} else {
// bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732;
}
game.addChild(enemy);
enemies.push(enemy);
}
// Stage system variables
var stage = 1;
var enemiesToDefeat = 5;
var enemiesDefeated = 0;
var maxEnemiesOnScreen = 3;
var stageText = new Text2('Stage 1', {
size: 100,
fill: "#fff"
});
stageText.anchor.set(0.5, 0);
stageText.x = 2048 / 2;
stageText.y = 120;
LK.gui.top.addChild(stageText);
stageText.visible = false;
// Spawn initial enemies for stage 1
for (var i = 0; i < maxEnemiesOnScreen; i++) {
spawnEnemy();
}
// Touch move: move the orange player
game.move = function (x, y, obj) {
orangePlayer.x = x;
orangePlayer.y = y;
};
// Game update: update enemies and check for attacks
game.update = function () {
// Update sword
sword.update && sword.update();
// Update all enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.update();
// Check if enemy is attacking and close enough to the player
var dx = orangePlayer.x - enemy.x;
var dy = orangePlayer.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (enemy.isAttacking && dist < enemy.attackRange) {
// Enemy attacks the player!
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
return;
}
// Sword attack: if sword is visible and collides with enemy, destroy enemy
if (sword.visible && sword.attackTimer > 0) {
// Calculate sword's global position
var swordGlobalX = orangePlayer.x + sword.x;
var swordGlobalY = orangePlayer.y + sword.y;
var dxSword = enemy.x - swordGlobalX;
var dySword = enemy.y - swordGlobalY;
var swordDist = Math.sqrt(dxSword * dxSword + dySword * dySword);
if (swordDist < 90) {
// Enemy hit by sword!
LK.getSound('Boom').play();
enemy.destroy();
enemies.splice(i, 1);
enemiesDefeated++;
// Check for stage clear
if (enemiesDefeated >= enemiesToDefeat) {
// Advance to next stage
stage++;
enemiesDefeated = 0;
// Increase difficulty
maxEnemiesOnScreen = Math.min(3 + stage, 12);
enemiesToDefeat = 5 + stage * 2;
// Show stage text
stageText.setText('Stage ' + stage);
// Remove all remaining enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].destroy();
enemies.splice(j, 1);
}
// Spawn new enemies for the new stage
for (var k = 0; k < maxEnemiesOnScreen; k++) {
spawnEnemy();
}
// Briefly flash the screen to indicate stage up
LK.effects.flashScreen(0x00ff00, 500);
// Prevent further update this frame
return;
}
continue;
}
}
}
// Occasionally spawn new enemies, spawn rate increases with stage
var spawnRate = Math.max(60, 180 - stage * 15); // Faster spawn at higher stages, min 60
if (LK.ticks % spawnRate === 0 && enemies.length < maxEnemiesOnScreen) {
spawnEnemy();
}
}; /****
* Classes
****/
// background image asset
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Attach enemy asset
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Enemy properties
self.speed = 4 + Math.random() * 2; // random speed
self.attackRange = 120;
self.isAttacking = false;
// Set a random direction towards the player
self.vx = 0;
self.vy = 0;
// Track last position for good practice
self.lastX = self.x;
self.lastY = self.y;
// Update enemy movement and attack logic
self.update = function () {
// Save last position
self.lastX = self.x;
self.lastY = self.y;
// Move towards the orange player if it exists
if (typeof orangePlayer !== "undefined" && orangePlayer) {
// Set the ground Y position (grass level)
var groundY = 2732 - 220;
// If enemy is not on the ground, move vertically to the ground first
if (Math.abs(self.y - groundY) > 2) {
// Only move vertically to the ground
var dy = groundY - self.y;
var step = Math.sign(dy) * Math.min(Math.abs(dy), self.speed);
self.x += 0;
self.y += step;
self.vx = 0;
self.vy = step;
self.isAttacking = false;
} else {
// Snap to ground
self.y = groundY;
// Move horizontally towards the player
var dx = orangePlayer.x - self.x;
var dist = Math.abs(dx);
if (dist > 0) {
self.vx = Math.sign(dx) * self.speed;
} else {
self.vx = 0;
}
self.x += self.vx;
self.vy = 0;
// Attack if close enough horizontally
self.isAttacking = dist < self.attackRange;
}
} else {
self.isAttacking = false;
}
};
return self;
});
// Orange player asset (orange box)
// Enemy asset (red box)
// Sword class
var Sword = Container.expand(function () {
var self = Container.call(this);
// Attach a simple sword asset (reuse orange asset for now, but smaller and offset)
var swordGraphics = self.attachAsset('orange', {
anchorX: 0.1,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.18
});
self.visible = false;
self.attackTimer = 0;
self.attackDuration = 18; // frames (0.3s at 60fps)
// Swing the sword (show for a short time)
self.swing = function () {
if (self.attackTimer <= 0) {
self.attackTimer = self.attackDuration;
self.visible = true;
}
};
// Update sword state
self.update = function () {
if (self.attackTimer > 0) {
self.attackTimer--;
self.visible = true;
// Animate sword swing (rotate a bit)
swordGraphics.rotation = -0.7 + 1.4 * (1 - self.attackTimer / self.attackDuration);
} else {
self.visible = false;
swordGraphics.rotation = 0;
}
};
return self;
});
/****
* Initialize Game
****/
// Create the orange player
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// --- MENU SCREEN SETUP ---
var menuContainer = new Container();
menuContainer.visible = true;
// Menu background
var menuBg = LK.getAsset('bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
menuContainer.addChild(menuBg);
// Title text
var titleText = new Text2("Orange Adventure", {
size: 180,
fill: 0xFFA500
});
titleText.anchor.set(0.5, 0);
titleText.x = 2048 / 2;
titleText.y = 320;
menuContainer.addChild(titleText);
// Start Game button
var startBtn = new Text2("Start Game", {
size: 110,
fill: "#fff"
});
startBtn.anchor.set(0.5, 0.5);
startBtn.x = 2048 / 2;
startBtn.y = 900;
startBtn.interactive = true;
startBtn.buttonMode = true;
startBtn.down = function () {
menuContainer.visible = false;
// Show gameplay UI
bg.visible = true;
orangePlayer.visible = true;
sword.visible = true;
attackBtn.visible = true;
shopBtn.visible = true;
stageText.visible = true;
// Hide shop if open
shopPage.visible = false;
// Play last.mp3 music
LK.playMusic('Last');
};
// Customize Character button
var customizeBtn = new Text2("Customize Character", {
size: 90,
fill: "#fff"
});
customizeBtn.anchor.set(0.5, 0.5);
customizeBtn.x = 2048 / 2;
customizeBtn.y = 1100;
customizeBtn.interactive = true;
customizeBtn.buttonMode = true;
customizeBtn.down = function () {
// For now, just show a placeholder popup
if (!menuContainer.customizePopup) {
var popup = new Container();
var popupBg = LK.getAsset('shopBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
popup.addChild(popupBg);
var popupText = new Text2("Customization coming soon!", {
size: 70,
fill: "#fff"
});
popupText.anchor.set(0.5, 0.5);
popupText.x = 2048 / 2;
popupText.y = 2732 / 2 - 60;
popup.addChild(popupText);
var closeBtn = new Text2("Close", {
size: 64,
fill: 0xFFA500
});
closeBtn.anchor.set(0.5, 0.5);
closeBtn.x = 2048 / 2;
closeBtn.y = 2732 / 2 + 200;
closeBtn.interactive = true;
closeBtn.buttonMode = true;
closeBtn.down = function () {
popup.visible = false;
};
popup.addChild(closeBtn);
menuContainer.addChild(popup);
menuContainer.customizePopup = popup;
}
menuContainer.customizePopup.visible = true;
};
menuContainer.addChild(startBtn);
menuContainer.addChild(customizeBtn);
// Add menu to game
game.addChild(menuContainer);
// Add background image to the game scene (for gameplay, hidden at menu)
var bg = LK.getAsset('bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
bg.visible = false;
game.addChild(bg);
// Orange player: bright orange ellipse with a white border
// Enemy: red box with a black border
// Sword: long thin yellow box
var orangePlayer = new Container();
var orangeGraphics = orangePlayer.attachAsset('orange', {
anchorX: 0.5,
anchorY: 0.5
});
orangePlayer.x = 2048 / 2;
orangePlayer.y = 2732 - 300;
game.addChild(orangePlayer);
orangePlayer.visible = false;
// Add sword to orange player
var sword = new Sword();
sword.x = 60; // Offset to the right of orange
sword.y = 0;
orangePlayer.addChild(sword);
sword.visible = false;
// Add shop button to GUI (in front of attack button, i.e. to the left)
var shopBtn = LK.getAsset('shopIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 - 420,
// 200px to the left of attack button
y: 2732 - 220
});
shopBtn.interactive = true;
shopBtn.buttonMode = true;
game.addChild(shopBtn);
shopBtn.visible = false;
// Shop page container (hidden by default)
var shopPage = new Container();
shopPage.visible = false;
// Shop background
var shopBg = LK.getAsset('shopBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
shopPage.addChild(shopBg);
// Shop items
var shopItems = [{
id: 'shopSword',
name: 'Sword Upgrade',
price: 100,
x: 2048 / 2 - 220,
y: 2732 / 2 - 100
}, {
id: 'shopShield',
name: 'Shield',
price: 80,
x: 2048 / 2,
y: 2732 / 2 - 100
}, {
id: 'shopPotion',
name: 'Health Potion',
price: 50,
x: 2048 / 2 + 220,
y: 2732 / 2 - 100
}];
for (var i = 0; i < shopItems.length; i++) {
var item = shopItems[i];
var itemIcon = LK.getAsset(item.id, {
anchorX: 0.5,
anchorY: 0.5,
x: item.x,
y: item.y
});
shopPage.addChild(itemIcon);
var itemText = new Text2(item.name + "\n" + item.price + " coins", {
size: 48,
fill: "#fff"
});
itemText.anchor.set(0.5, 0);
itemText.x = item.x;
itemText.y = item.y + 80;
shopPage.addChild(itemText);
}
// Shop close button
var shopCloseBtn = new Text2("Close", {
size: 64,
fill: 0xFF8800
});
shopCloseBtn.anchor.set(0.5, 0.5);
shopCloseBtn.x = 2048 / 2;
shopCloseBtn.y = 2732 / 2 + 500;
shopCloseBtn.interactive = true;
shopCloseBtn.buttonMode = true;
shopCloseBtn.down = function () {
shopPage.visible = false;
// Re-enable gameplay UI
orangePlayer.visible = true;
sword.visible = true;
attackBtn.visible = true;
shopBtn.visible = true;
stageText.visible = true;
};
shopPage.addChild(shopCloseBtn);
game.addChild(shopPage);
shopPage.visible = false;
// Shop button teleports to shop page
shopBtn.down = function () {
shopPage.visible = true;
// Hide gameplay UI while in shop
orangePlayer.visible = false;
sword.visible = false;
attackBtn.visible = false;
shopBtn.visible = false;
stageText.visible = false;
};
// Add attack button to GUI
var attackBtn = LK.getAsset('attackBtn', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 - 220,
y: 2732 - 220
});
attackBtn.interactive = true;
attackBtn.buttonMode = true;
attackBtn.down = function (x, y, obj) {
sword.swing();
};
game.addChild(attackBtn);
attackBtn.visible = false;
// Array to hold enemies
var enemies = [];
// Function to spawn an enemy at a random edge
function spawnEnemy() {
var enemy = new Enemy();
// Randomly choose spawn side
var side = Math.floor(Math.random() * 4);
if (side === 0) {
// left
enemy.x = 0;
enemy.y = Math.random() * 2732;
} else if (side === 1) {
// right
enemy.x = 2048;
enemy.y = Math.random() * 2732;
} else if (side === 2) {
// top
enemy.x = Math.random() * 2048;
enemy.y = 0;
} else {
// bottom
enemy.x = Math.random() * 2048;
enemy.y = 2732;
}
game.addChild(enemy);
enemies.push(enemy);
}
// Stage system variables
var stage = 1;
var enemiesToDefeat = 5;
var enemiesDefeated = 0;
var maxEnemiesOnScreen = 3;
var stageText = new Text2('Stage 1', {
size: 100,
fill: "#fff"
});
stageText.anchor.set(0.5, 0);
stageText.x = 2048 / 2;
stageText.y = 120;
LK.gui.top.addChild(stageText);
stageText.visible = false;
// Spawn initial enemies for stage 1
for (var i = 0; i < maxEnemiesOnScreen; i++) {
spawnEnemy();
}
// Touch move: move the orange player
game.move = function (x, y, obj) {
orangePlayer.x = x;
orangePlayer.y = y;
};
// Game update: update enemies and check for attacks
game.update = function () {
// Update sword
sword.update && sword.update();
// Update all enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.update();
// Check if enemy is attacking and close enough to the player
var dx = orangePlayer.x - enemy.x;
var dy = orangePlayer.y - enemy.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (enemy.isAttacking && dist < enemy.attackRange) {
// Enemy attacks the player!
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
return;
}
// Sword attack: if sword is visible and collides with enemy, destroy enemy
if (sword.visible && sword.attackTimer > 0) {
// Calculate sword's global position
var swordGlobalX = orangePlayer.x + sword.x;
var swordGlobalY = orangePlayer.y + sword.y;
var dxSword = enemy.x - swordGlobalX;
var dySword = enemy.y - swordGlobalY;
var swordDist = Math.sqrt(dxSword * dxSword + dySword * dySword);
if (swordDist < 90) {
// Enemy hit by sword!
LK.getSound('Boom').play();
enemy.destroy();
enemies.splice(i, 1);
enemiesDefeated++;
// Check for stage clear
if (enemiesDefeated >= enemiesToDefeat) {
// Advance to next stage
stage++;
enemiesDefeated = 0;
// Increase difficulty
maxEnemiesOnScreen = Math.min(3 + stage, 12);
enemiesToDefeat = 5 + stage * 2;
// Show stage text
stageText.setText('Stage ' + stage);
// Remove all remaining enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].destroy();
enemies.splice(j, 1);
}
// Spawn new enemies for the new stage
for (var k = 0; k < maxEnemiesOnScreen; k++) {
spawnEnemy();
}
// Briefly flash the screen to indicate stage up
LK.effects.flashScreen(0x00ff00, 500);
// Prevent further update this frame
return;
}
continue;
}
}
}
// Occasionally spawn new enemies, spawn rate increases with stage
var spawnRate = Math.max(60, 180 - stage * 15); // Faster spawn at higher stages, min 60
if (LK.ticks % spawnRate === 0 && enemies.length < maxEnemiesOnScreen) {
spawnEnemy();
}
};
An orange fighter karate 8 bit style. In-Game asset. 2d. High contrast. No shadows
Angry warrior holding a sword. In-Game asset. 2d. High contrast. No shadows
Sharp blue sword. In-Game asset. 2d. High contrast. No shadows
Brick wall. In-Game asset. 2d. High contrast. No shadows
A sky with grass. In-Game asset. 2d. High contrast. No shadows
A shop with a guy selling stuff in the shells. In-Game asset. High contrast. No shadows
A magic potion. No shadows
A red magic shield with a orange symbol on it. In-Game asset. 2d. High contrast. No shadows