/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { level: 1, highScore: 0 }); /**** * Classes ****/ var Bully = Container.expand(function (type) { var self = Container.call(this); // Default values self.type = type || 'normal'; self.hp = 2; self.damage = 10; self.speed = 2; self.scoreValue = 10; // Configure bully based on type switch (self.type) { case 'big': self.hp = 5; self.damage = 25; self.speed = 1; self.scoreValue = 30; var bullyGraphics = self.attachAsset('bigBully', { anchorX: 0.5, anchorY: 0.5 }); break; case 'fast': self.hp = 1; self.damage = 5; self.speed = 4; self.scoreValue = 15; var bullyGraphics = self.attachAsset('fastBully', { anchorX: 0.5, anchorY: 0.5 }); break; default: var bullyGraphics = self.attachAsset('normalBully', { anchorX: 0.5, anchorY: 0.5 }); } self.targetX = 0; self.targetY = 0; self.isActive = true; self.down = function (x, y, obj) { if (!self.isActive) { return; } self.hp -= 1; // Feedback on hit LK.getSound('hit').play(); LK.effects.flashObject(self, 0xffffff, 100); // Slightly push back the bully when hit tween(self, { x: self.x + (self.x > player.x ? 30 : -30) }, { duration: 100, easing: tween.easeOut }); if (self.hp <= 0) { self.defeat(); } }; self.defeat = function () { if (!self.isActive) { return; } self.isActive = false; LK.setScore(LK.getScore() + self.scoreValue); // Animation for defeat tween(self, { alpha: 0, scaleX: 0.2, scaleY: 0.2 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { self.destroy(); // Remove from the bullies array var index = bullies.indexOf(self); if (index > -1) { bullies.splice(index, 1); } // Check if wave is complete if (bullies.length === 0 && pendingBullies.length === 0) { endWave(); } } }); }; self.update = function () { if (!self.isActive) { return; } // Move towards player var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 5) { self.x += dx / dist * self.speed; self.y += dy / dist * self.speed; } // Check collision with player if (self.intersects(player) && self.isActive) { player.takeDamage(self.damage); LK.getSound('defeat').play(); self.defeat(); } }; return self; }); var HealthBar = Container.expand(function () { var self = Container.call(this); var barWidth = 400; var barHeight = 30; var background = LK.getAsset('background', { width: barWidth + 4, height: barHeight + 4, anchorX: 0, anchorY: 0, tint: 0x000000 }); var healthFill = LK.getAsset('background', { width: barWidth, height: barHeight, anchorX: 0, anchorY: 0, tint: 0x2ecc71, x: 2, y: 2 }); self.addChild(background); self.addChild(healthFill); self.setHealth = function (current, max) { var percentage = Math.max(0, current / max); tween(healthFill, { width: barWidth * percentage }, { duration: 200, easing: tween.easeOut }); // Change color based on health percentage if (percentage > 0.6) { healthFill.tint = 0x2ecc71; // Green } else if (percentage > 0.3) { healthFill.tint = 0xf39c12; // Orange } else { healthFill.tint = 0xe74c3c; // Red } }; return self; }); var MainMenu = Container.expand(function () { var self = Container.call(this); // Add background image to the main menu var menuBackground = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5 }); menuBackground.x = 2048 / 2; menuBackground.y = 2732 / 2; self.addChild(menuBackground); // Create Play button var playButton = new Text2("Play", { size: 150, fill: 0xFFFFFF }); playButton.anchor.set(0.5, 0.5); playButton.x = 2048 / 2; playButton.y = 1000; playButton.interactive = true; playButton.buttonMode = true; playButton.down = function () { game.removeChild(self); gameActive = true; startGame(); }; self.addChild(playButton); // Create Leaderboard button var leaderboardButton = new Text2("Leaderboard", { size: 150, fill: 0xFFFFFF }); leaderboardButton.anchor.set(0.5, 0.5); leaderboardButton.x = 2048 / 2; leaderboardButton.y = 1400; leaderboardButton.interactive = true; leaderboardButton.buttonMode = true; leaderboardButton.down = function () { console.log("Leaderboard button pressed. This is a fictional button."); }; self.addChild(leaderboardButton); return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; self.isInvulnerable = false; self.takeDamage = function (damage) { if (self.isInvulnerable) { return; } self.health = Math.max(0, self.health - damage); // Flash player red when taking damage LK.effects.flashObject(self, 0xff0000, 500); if (self.health <= 0) { // Game over state LK.showGameOver(); } }; self.makeInvulnerable = function (duration) { self.isInvulnerable = true; // Visual feedback for invulnerability tween(playerGraphics, { alpha: 0.7 }, { duration: 200, easing: tween.easeInOut }); LK.setTimeout(function () { self.isInvulnerable = false; tween(playerGraphics, { alpha: 1 }, { duration: 200, easing: tween.easeInOut }); }, duration); }; return self; }); var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'health'; var powerupGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); // Customize appearance based on type switch (self.type) { case 'invulnerability': powerupGraphics.tint = 0xf1c40f; // Yellow powerupGraphics.filters = [new GlowFilter({ color: 0xf1c40f, distance: 15, outerStrength: 2 })]; powerupGraphics.scaleX = 1.5; powerupGraphics.scaleY = 1.5; break; case 'clearScreen': powerupGraphics.tint = 0x9b59b6; // Purple break; default: // health powerupGraphics.tint = 0x2ecc71; // Green } self.lifespan = 5000; // Powerups disappear after 5 seconds self.birthTime = Date.now(); self.down = function (x, y, obj) { LK.getSound('powerup').play(); // Apply effect based on type switch (self.type) { case 'health': player.health = Math.min(player.maxHealth, player.health + 30); healthBar.setHealth(player.health, player.maxHealth); break; case 'invulnerability': player.makeInvulnerable(5000); // 5 seconds of invulnerability break; case 'clearScreen': // Defeat all active bullies for (var i = bullies.length - 1; i >= 0; i--) { bullies[i].defeat(); } break; } self.destroy(); // Remove from powerups array var index = powerups.indexOf(self); if (index > -1) { powerups.splice(index, 1); } }; self.update = function () { // Check if powerup should disappear if (Date.now() - self.birthTime > self.lifespan) { tween(self, { alpha: 0 }, { duration: 300, easing: tween.linear, onFinish: function onFinish() { self.destroy(); var index = powerups.indexOf(self); if (index > -1) { powerups.splice(index, 1); } } }); } // Pulsating animation if (LK.ticks % 30 === 0) { tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeInOut }); } }); } }; return self; }); var WaveText = Container.expand(function () { var self = Container.call(this); var waveText = new Text2("Wave 1", { size: 120, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0.5); self.addChild(waveText); self.show = function (waveNumber) { waveText.setText("Wave " + waveNumber); self.alpha = 0; self.scaleX = 2; self.scaleY = 2; tween(self, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { LK.setTimeout(function () { tween(self, { alpha: 0 }, { duration: 500, easing: tween.easeIn }); }, 1000); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xecf0f1 // Light gray background }); /**** * Game Code ****/ function startGame() { // Initialize the player player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Initialize GUI elements healthBar = new HealthBar(); LK.gui.top.addChild(healthBar); healthBar.y = 20; healthBar.x = (2048 - 400) / 2; // Center healthbar // Score display scoreText = new Text2("Score: 0", { size: 60, fill: 0x34495E }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); scoreText.x = -20; scoreText.y = 20; // Level display levelText = new Text2("Level: " + currentLevel, { size: 60, fill: 0x34495E }); levelText.anchor.set(0, 0); LK.gui.topLeft.addChild(levelText); levelText.x = 120; // Keep away from top left corner levelText.y = 20; // Wave announcement text waveText = new WaveText(); waveText.x = 2048 / 2; waveText.y = 2732 / 2; game.addChild(waveText); // Start background music LK.playMusic('gameMusic', { fade: { start: 0, end: 0.5, duration: 1000 } }); // Start the first wave startWave(currentLevel); } function showLeaderboard() { // Placeholder for leaderboard display logic console.log("Show leaderboard"); } // Define a minimal GlowFilter class to fix the ReferenceError // Game state variables function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) { return t; } var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) { return i; } throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _classCallCheck(a, n) { if (!(a instanceof n)) { throw new TypeError("Cannot call a class as a function"); } } var GlowFilter = /*#__PURE__*/_createClass(function GlowFilter(options) { _classCallCheck(this, GlowFilter); options = options || {}; // Ensure options is defined this.color = options.color || 0xffffff; this.distance = options.distance || 10; options = options || {}; // Ensure options is defined options = options || {}; // Ensure options is defined this.outerStrength = options.outerStrength !== undefined ? options.outerStrength : 1; }); var currentLevel = storage.level || 1; var highScore = storage.highScore || 0; var player; var bullies = []; var powerups = []; var pendingBullies = []; var spawnTimer; var healthBar; var scoreText; var levelText; var waveText; var gameActive = false; var powerupChance = 0.2; // 20% chance of powerup spawn per bully defeated // Add background image var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5 }); background.x = 2048 / 2; background.y = 2732 / 2; game.addChild(background); // Initialize main menu var mainMenu = new MainMenu(); game.addChild(mainMenu); // Initialize the player player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Initialize GUI elements healthBar = new HealthBar(); LK.gui.top.addChild(healthBar); healthBar.y = 20; healthBar.x = (2048 - 400) / 2; // Center healthbar // Score display scoreText = new Text2("Score: 0", { size: 60, fill: 0x34495E }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); scoreText.x = -20; scoreText.y = 20; // Level display levelText = new Text2("Level: " + currentLevel, { size: 60, fill: 0x34495E }); levelText.anchor.set(0, 0); LK.gui.topLeft.addChild(levelText); levelText.x = 120; // Keep away from top left corner levelText.y = 20; // Wave announcement text waveText = new WaveText(); waveText.x = 2048 / 2; waveText.y = 2732 / 2; game.addChild(waveText); // Start background music LK.playMusic('gameMusic', { fade: { start: 0, end: 0.5, duration: 1000 } }); // Start the first wave startWave(currentLevel); function startWave(level) { // Clear any existing entities clearEntities(); // Show wave text waveText.show(level); // Configure wave based on level var numBullies = Math.min(5 + level * 2, 30); // Cap at 30 bullies var bigBullyChance = Math.min(0.1 + level * 0.03, 0.4); // Cap at 40% var fastBullyChance = Math.min(0.1 + level * 0.05, 0.5); // Cap at 50% // Check if it's time to spawn a boss if (level % 20 === 0) { pendingBullies.push('boss'); } else { // Create the wave of bullies for (var i = 0; i < numBullies; i++) { var bullyType = 'normal'; var rand = Math.random(); if (rand < bigBullyChance) { bullyType = 'big'; } else if (rand < bigBullyChance + fastBullyChance) { bullyType = 'fast'; } pendingBullies.push(bullyType); } } // Start spawning bullies spawnTimer = LK.setInterval(spawnBully, 1500 - Math.min(level * 100, 1000)); // Faster spawns at higher levels } function spawnBully() { if (pendingBullies.length === 0) { LK.clearInterval(spawnTimer); return; } var bullyType = pendingBullies.shift(); var bully = new Bully(bullyType); // Randomize start position (from edges of the screen) var side = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left switch (side) { case 0: // top bully.x = Math.random() * 2048; bully.y = -100; break; case 1: // right bully.x = 2148; bully.y = Math.random() * 2732; break; case 2: // bottom bully.x = Math.random() * 2048; bully.y = 2832; break; case 3: // left bully.x = -100; bully.y = Math.random() * 2732; break; } // Set target to player position bully.targetX = player.x; bully.targetY = player.y; bullies.push(bully); game.addChild(bully); // Spawn animation bully.alpha = 0; bully.scaleX = 0.5; bully.scaleY = 0.5; tween(bully, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeOut }); } function clearEntities() { // Clear bullies for (var i = bullies.length - 1; i >= 0; i--) { bullies[i].destroy(); } bullies = []; // Clear powerups for (var i = powerups.length - 1; i >= 0; i--) { powerups[i].destroy(); } powerups = []; // Clear any pending bullies pendingBullies = []; // Clear timers if (spawnTimer) { LK.clearInterval(spawnTimer); } } function endWave() { // Increase level currentLevel++; storage.level = currentLevel; // Update level text levelText.setText("Level: " + currentLevel); // Play completion sound LK.getSound('levelComplete').play(); // Update high score if needed if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } // Start the next wave after a delay LK.setTimeout(function () { startWave(currentLevel); }, 2000); } function spawnPowerup() { if (!gameActive) { return; } // Random position close to the player var px = player.x + (Math.random() * 400 - 200); // Random offset between -200 and 200 var py = player.y + (Math.random() * 400 - 200); // Random offset between -200 and 200 // Random powerup type var types = ['health', 'invulnerability', 'clearScreen']; var typeIndex = Math.floor(Math.random() * types.length); var powerup = new PowerUp(types[typeIndex]); powerup.x = px; powerup.y = py; // Add to game powerups.push(powerup); game.addChild(powerup); // Spawn animation powerup.alpha = 0; powerup.scaleX = 0; powerup.scaleY = 0; tween(powerup, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.elasticOut }); } // Event handlers game.down = function (x, y, obj) { // This event is primarily for tapping in empty space // Individual objects like bullies and powerups have their own down handlers }; // Game update loop game.update = function () { if (!gameActive || game.children.includes(mainMenu)) { return; } // Update score display scoreText.setText("Score: " + LK.getScore()); // Update health bar healthBar.setHealth(player.health, player.maxHealth); // Randomly spawn powerups (independent of bullies) if (LK.ticks % 300 === 0 && Math.random() < powerupChance) { spawnPowerup(); } // Update all bullies targets to follow player for (var i = 0; i < bullies.length; i++) { bullies[i].targetX = player.x; bullies[i].targetY = player.y; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
level: 1,
highScore: 0
});
/****
* Classes
****/
var Bully = Container.expand(function (type) {
var self = Container.call(this);
// Default values
self.type = type || 'normal';
self.hp = 2;
self.damage = 10;
self.speed = 2;
self.scoreValue = 10;
// Configure bully based on type
switch (self.type) {
case 'big':
self.hp = 5;
self.damage = 25;
self.speed = 1;
self.scoreValue = 30;
var bullyGraphics = self.attachAsset('bigBully', {
anchorX: 0.5,
anchorY: 0.5
});
break;
case 'fast':
self.hp = 1;
self.damage = 5;
self.speed = 4;
self.scoreValue = 15;
var bullyGraphics = self.attachAsset('fastBully', {
anchorX: 0.5,
anchorY: 0.5
});
break;
default:
var bullyGraphics = self.attachAsset('normalBully', {
anchorX: 0.5,
anchorY: 0.5
});
}
self.targetX = 0;
self.targetY = 0;
self.isActive = true;
self.down = function (x, y, obj) {
if (!self.isActive) {
return;
}
self.hp -= 1;
// Feedback on hit
LK.getSound('hit').play();
LK.effects.flashObject(self, 0xffffff, 100);
// Slightly push back the bully when hit
tween(self, {
x: self.x + (self.x > player.x ? 30 : -30)
}, {
duration: 100,
easing: tween.easeOut
});
if (self.hp <= 0) {
self.defeat();
}
};
self.defeat = function () {
if (!self.isActive) {
return;
}
self.isActive = false;
LK.setScore(LK.getScore() + self.scoreValue);
// Animation for defeat
tween(self, {
alpha: 0,
scaleX: 0.2,
scaleY: 0.2
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.destroy();
// Remove from the bullies array
var index = bullies.indexOf(self);
if (index > -1) {
bullies.splice(index, 1);
}
// Check if wave is complete
if (bullies.length === 0 && pendingBullies.length === 0) {
endWave();
}
}
});
};
self.update = function () {
if (!self.isActive) {
return;
}
// Move towards player
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 5) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
// Check collision with player
if (self.intersects(player) && self.isActive) {
player.takeDamage(self.damage);
LK.getSound('defeat').play();
self.defeat();
}
};
return self;
});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
var barWidth = 400;
var barHeight = 30;
var background = LK.getAsset('background', {
width: barWidth + 4,
height: barHeight + 4,
anchorX: 0,
anchorY: 0,
tint: 0x000000
});
var healthFill = LK.getAsset('background', {
width: barWidth,
height: barHeight,
anchorX: 0,
anchorY: 0,
tint: 0x2ecc71,
x: 2,
y: 2
});
self.addChild(background);
self.addChild(healthFill);
self.setHealth = function (current, max) {
var percentage = Math.max(0, current / max);
tween(healthFill, {
width: barWidth * percentage
}, {
duration: 200,
easing: tween.easeOut
});
// Change color based on health percentage
if (percentage > 0.6) {
healthFill.tint = 0x2ecc71; // Green
} else if (percentage > 0.3) {
healthFill.tint = 0xf39c12; // Orange
} else {
healthFill.tint = 0xe74c3c; // Red
}
};
return self;
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Add background image to the main menu
var menuBackground = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
menuBackground.x = 2048 / 2;
menuBackground.y = 2732 / 2;
self.addChild(menuBackground);
// Create Play button
var playButton = new Text2("Play", {
size: 150,
fill: 0xFFFFFF
});
playButton.anchor.set(0.5, 0.5);
playButton.x = 2048 / 2;
playButton.y = 1000;
playButton.interactive = true;
playButton.buttonMode = true;
playButton.down = function () {
game.removeChild(self);
gameActive = true;
startGame();
};
self.addChild(playButton);
// Create Leaderboard button
var leaderboardButton = new Text2("Leaderboard", {
size: 150,
fill: 0xFFFFFF
});
leaderboardButton.anchor.set(0.5, 0.5);
leaderboardButton.x = 2048 / 2;
leaderboardButton.y = 1400;
leaderboardButton.interactive = true;
leaderboardButton.buttonMode = true;
leaderboardButton.down = function () {
console.log("Leaderboard button pressed. This is a fictional button.");
};
self.addChild(leaderboardButton);
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.isInvulnerable = false;
self.takeDamage = function (damage) {
if (self.isInvulnerable) {
return;
}
self.health = Math.max(0, self.health - damage);
// Flash player red when taking damage
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
// Game over state
LK.showGameOver();
}
};
self.makeInvulnerable = function (duration) {
self.isInvulnerable = true;
// Visual feedback for invulnerability
tween(playerGraphics, {
alpha: 0.7
}, {
duration: 200,
easing: tween.easeInOut
});
LK.setTimeout(function () {
self.isInvulnerable = false;
tween(playerGraphics, {
alpha: 1
}, {
duration: 200,
easing: tween.easeInOut
});
}, duration);
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'health';
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Customize appearance based on type
switch (self.type) {
case 'invulnerability':
powerupGraphics.tint = 0xf1c40f; // Yellow
powerupGraphics.filters = [new GlowFilter({
color: 0xf1c40f,
distance: 15,
outerStrength: 2
})];
powerupGraphics.scaleX = 1.5;
powerupGraphics.scaleY = 1.5;
break;
case 'clearScreen':
powerupGraphics.tint = 0x9b59b6; // Purple
break;
default:
// health
powerupGraphics.tint = 0x2ecc71;
// Green
}
self.lifespan = 5000; // Powerups disappear after 5 seconds
self.birthTime = Date.now();
self.down = function (x, y, obj) {
LK.getSound('powerup').play();
// Apply effect based on type
switch (self.type) {
case 'health':
player.health = Math.min(player.maxHealth, player.health + 30);
healthBar.setHealth(player.health, player.maxHealth);
break;
case 'invulnerability':
player.makeInvulnerable(5000); // 5 seconds of invulnerability
break;
case 'clearScreen':
// Defeat all active bullies
for (var i = bullies.length - 1; i >= 0; i--) {
bullies[i].defeat();
}
break;
}
self.destroy();
// Remove from powerups array
var index = powerups.indexOf(self);
if (index > -1) {
powerups.splice(index, 1);
}
};
self.update = function () {
// Check if powerup should disappear
if (Date.now() - self.birthTime > self.lifespan) {
tween(self, {
alpha: 0
}, {
duration: 300,
easing: tween.linear,
onFinish: function onFinish() {
self.destroy();
var index = powerups.indexOf(self);
if (index > -1) {
powerups.splice(index, 1);
}
}
});
}
// Pulsating animation
if (LK.ticks % 30 === 0) {
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
};
return self;
});
var WaveText = Container.expand(function () {
var self = Container.call(this);
var waveText = new Text2("Wave 1", {
size: 120,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0.5);
self.addChild(waveText);
self.show = function (waveNumber) {
waveText.setText("Wave " + waveNumber);
self.alpha = 0;
self.scaleX = 2;
self.scaleY = 2;
tween(self, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
LK.setTimeout(function () {
tween(self, {
alpha: 0
}, {
duration: 500,
easing: tween.easeIn
});
}, 1000);
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xecf0f1 // Light gray background
});
/****
* Game Code
****/
function startGame() {
// Initialize the player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 / 2;
game.addChild(player);
// Initialize GUI elements
healthBar = new HealthBar();
LK.gui.top.addChild(healthBar);
healthBar.y = 20;
healthBar.x = (2048 - 400) / 2; // Center healthbar
// Score display
scoreText = new Text2("Score: 0", {
size: 60,
fill: 0x34495E
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
scoreText.x = -20;
scoreText.y = 20;
// Level display
levelText = new Text2("Level: " + currentLevel, {
size: 60,
fill: 0x34495E
});
levelText.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelText);
levelText.x = 120; // Keep away from top left corner
levelText.y = 20;
// Wave announcement text
waveText = new WaveText();
waveText.x = 2048 / 2;
waveText.y = 2732 / 2;
game.addChild(waveText);
// Start background music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
// Start the first wave
startWave(currentLevel);
}
function showLeaderboard() {
// Placeholder for leaderboard display logic
console.log("Show leaderboard");
}
// Define a minimal GlowFilter class to fix the ReferenceError
// Game state variables
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function _defineProperties(e, r) {
for (var t = 0; t < r.length; t++) {
var o = r[t];
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
}
}
function _createClass(e, r, t) {
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
writable: !1
}), e;
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
function _toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) {
return t;
}
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) {
return i;
}
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
function _classCallCheck(a, n) {
if (!(a instanceof n)) {
throw new TypeError("Cannot call a class as a function");
}
}
var GlowFilter = /*#__PURE__*/_createClass(function GlowFilter(options) {
_classCallCheck(this, GlowFilter);
options = options || {}; // Ensure options is defined
this.color = options.color || 0xffffff;
this.distance = options.distance || 10;
options = options || {}; // Ensure options is defined
options = options || {}; // Ensure options is defined
this.outerStrength = options.outerStrength !== undefined ? options.outerStrength : 1;
});
var currentLevel = storage.level || 1;
var highScore = storage.highScore || 0;
var player;
var bullies = [];
var powerups = [];
var pendingBullies = [];
var spawnTimer;
var healthBar;
var scoreText;
var levelText;
var waveText;
var gameActive = false;
var powerupChance = 0.2; // 20% chance of powerup spawn per bully defeated
// Add background image
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
background.x = 2048 / 2;
background.y = 2732 / 2;
game.addChild(background);
// Initialize main menu
var mainMenu = new MainMenu();
game.addChild(mainMenu);
// Initialize the player
player = new Player();
player.x = 2048 / 2;
player.y = 2732 / 2;
game.addChild(player);
// Initialize GUI elements
healthBar = new HealthBar();
LK.gui.top.addChild(healthBar);
healthBar.y = 20;
healthBar.x = (2048 - 400) / 2; // Center healthbar
// Score display
scoreText = new Text2("Score: 0", {
size: 60,
fill: 0x34495E
});
scoreText.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreText);
scoreText.x = -20;
scoreText.y = 20;
// Level display
levelText = new Text2("Level: " + currentLevel, {
size: 60,
fill: 0x34495E
});
levelText.anchor.set(0, 0);
LK.gui.topLeft.addChild(levelText);
levelText.x = 120; // Keep away from top left corner
levelText.y = 20;
// Wave announcement text
waveText = new WaveText();
waveText.x = 2048 / 2;
waveText.y = 2732 / 2;
game.addChild(waveText);
// Start background music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
// Start the first wave
startWave(currentLevel);
function startWave(level) {
// Clear any existing entities
clearEntities();
// Show wave text
waveText.show(level);
// Configure wave based on level
var numBullies = Math.min(5 + level * 2, 30); // Cap at 30 bullies
var bigBullyChance = Math.min(0.1 + level * 0.03, 0.4); // Cap at 40%
var fastBullyChance = Math.min(0.1 + level * 0.05, 0.5); // Cap at 50%
// Check if it's time to spawn a boss
if (level % 20 === 0) {
pendingBullies.push('boss');
} else {
// Create the wave of bullies
for (var i = 0; i < numBullies; i++) {
var bullyType = 'normal';
var rand = Math.random();
if (rand < bigBullyChance) {
bullyType = 'big';
} else if (rand < bigBullyChance + fastBullyChance) {
bullyType = 'fast';
}
pendingBullies.push(bullyType);
}
}
// Start spawning bullies
spawnTimer = LK.setInterval(spawnBully, 1500 - Math.min(level * 100, 1000)); // Faster spawns at higher levels
}
function spawnBully() {
if (pendingBullies.length === 0) {
LK.clearInterval(spawnTimer);
return;
}
var bullyType = pendingBullies.shift();
var bully = new Bully(bullyType);
// Randomize start position (from edges of the screen)
var side = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
switch (side) {
case 0:
// top
bully.x = Math.random() * 2048;
bully.y = -100;
break;
case 1:
// right
bully.x = 2148;
bully.y = Math.random() * 2732;
break;
case 2:
// bottom
bully.x = Math.random() * 2048;
bully.y = 2832;
break;
case 3:
// left
bully.x = -100;
bully.y = Math.random() * 2732;
break;
}
// Set target to player position
bully.targetX = player.x;
bully.targetY = player.y;
bullies.push(bully);
game.addChild(bully);
// Spawn animation
bully.alpha = 0;
bully.scaleX = 0.5;
bully.scaleY = 0.5;
tween(bully, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
}
function clearEntities() {
// Clear bullies
for (var i = bullies.length - 1; i >= 0; i--) {
bullies[i].destroy();
}
bullies = [];
// Clear powerups
for (var i = powerups.length - 1; i >= 0; i--) {
powerups[i].destroy();
}
powerups = [];
// Clear any pending bullies
pendingBullies = [];
// Clear timers
if (spawnTimer) {
LK.clearInterval(spawnTimer);
}
}
function endWave() {
// Increase level
currentLevel++;
storage.level = currentLevel;
// Update level text
levelText.setText("Level: " + currentLevel);
// Play completion sound
LK.getSound('levelComplete').play();
// Update high score if needed
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
}
// Start the next wave after a delay
LK.setTimeout(function () {
startWave(currentLevel);
}, 2000);
}
function spawnPowerup() {
if (!gameActive) {
return;
}
// Random position close to the player
var px = player.x + (Math.random() * 400 - 200); // Random offset between -200 and 200
var py = player.y + (Math.random() * 400 - 200); // Random offset between -200 and 200
// Random powerup type
var types = ['health', 'invulnerability', 'clearScreen'];
var typeIndex = Math.floor(Math.random() * types.length);
var powerup = new PowerUp(types[typeIndex]);
powerup.x = px;
powerup.y = py;
// Add to game
powerups.push(powerup);
game.addChild(powerup);
// Spawn animation
powerup.alpha = 0;
powerup.scaleX = 0;
powerup.scaleY = 0;
tween(powerup, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.elasticOut
});
}
// Event handlers
game.down = function (x, y, obj) {
// This event is primarily for tapping in empty space
// Individual objects like bullies and powerups have their own down handlers
};
// Game update loop
game.update = function () {
if (!gameActive || game.children.includes(mainMenu)) {
return;
}
// Update score display
scoreText.setText("Score: " + LK.getScore());
// Update health bar
healthBar.setHealth(player.health, player.maxHealth);
// Randomly spawn powerups (independent of bullies)
if (LK.ticks % 300 === 0 && Math.random() < powerupChance) {
spawnPowerup();
}
// Update all bullies targets to follow player
for (var i = 0; i < bullies.length; i++) {
bullies[i].targetX = player.x;
bullies[i].targetY = player.y;
}
};
A school kid ready to punch. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A bully. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A shining star. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Bully. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
A school classroom from above. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows