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