/**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.hitCount = 0; // Initialize hit count for the bullet self.update = function () { self.y -= self.speed; // Check collision with ghosts // Check collision with djinns djinns.forEach(function (djinn) { if (self.intersects(djinn)) { game.removeChild(djinn); // Remove the djinn from the game var index = djinns.indexOf(djinn); if (index > -1) { djinns.splice(index, 1); } self.destroy(); } }); closeRangeMonsters.forEach(function (monster) { if (self.intersects(monster)) { game.removeChild(monster); // Remove the monster from the game var index = closeRangeMonsters.indexOf(monster); if (index > -1) { closeRangeMonsters.splice(index, 1); } self.destroy(); } }); // Check collision with long range monsters longRangeMonsters.forEach(function (monster) { if (self.intersects(monster)) { game.removeChild(monster); // Remove the monster from the game var index = longRangeMonsters.indexOf(monster); if (index > -1) { longRangeMonsters.splice(index, 1); } self.destroy(); } }); // Check collision with goblins if (self.intersects(goblin)) { game.removeChild(goblin); // Remove the goblin from the game goblin = null; // Set goblin to null to indicate it's destroyed self.destroy(); } // Check collision with ghosts ghosts.forEach(function (ghost) { if (self.intersects(ghost)) { game.removeChild(ghost); // Remove the ghost from the game var index = ghosts.indexOf(ghost); if (index > -1) { ghosts.splice(index, 1); } self.destroy(); } }); // Destroy bullet if it goes off screen if (self.y < 0) { self.destroy(); } }; }); // Define the CloseRangeMonster class var CloseRangeMonster = Container.expand(function () { var self = Container.call(this); var monsterGraphics = self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 1; self.update = function () { var angle = Math.atan2(player.y - self.y, player.x - self.x); self.x += self.speed * Math.cos(angle); self.y += self.speed * Math.sin(angle); if (self.intersects(player)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }; }); var Ghost = Container.expand(function () { var self = Container.call(this); var ghostGraphics = self.attachAsset('ghost', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 3; self.update = function () { var angle = Math.atan2(player.y - self.y, player.x - self.x); self.x += self.speed * Math.cos(angle); self.y += self.speed * Math.sin(angle); if (self.intersects(player)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }; }); // Define the Goblin class var Goblin = Container.expand(function () { var self = Container.call(this); var goblinGraphics = self.attachAsset('goblin', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 3; self.freezeTime = 600; // 10 seconds in game ticks self.update = function () { var angle = Math.atan2(player.y - self.y, player.x - self.x); self.x += self.speed * Math.cos(angle); self.y += self.speed * Math.sin(angle); if (self.intersects(player)) { player.speed = 0; // Freeze the player // Display 'FrozeYou're back' on screen var freezeText = new Text2("FrozeYou're back", { size: 150, fill: 0xFFFFFF }); freezeText.anchor.set(0.5, 0); LK.gui.center.addChild(freezeText); LK.setTimeout(function () { player.speed = 5; // Unfreeze the player after 10 seconds // Remove 'FrozeYou're back' from screen LK.gui.center.removeChild(freezeText); }, self.freezeTime); } }; }); var LongRangeMonster = Container.expand(function () { var self = Container.call(this); var monsterGraphics = self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 1; self.update = function () { var angle = Math.atan2(player.y - self.y, player.x - self.x); self.x += self.speed * Math.cos(angle); self.y += self.speed * Math.sin(angle); if (self.intersects(player)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.speed = 5; self.weapon = new Weapon(); // Add a weapon property for the player self.life = 100; // Add a life property for the player self.superPower = false; // Add a super power property for the player self.healthBar = LK.getAsset('healthBar', { // Add a health bar for the player anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); self.addChild(self.healthBar); self.shoot = function () { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullets.push(bullet); game.addChild(bullet); }; self.update = function () { // Player update logic if (self.weapon) { self.weapon.update(); // Check if the weapon intersects with any monster closeRangeMonsters.forEach(function (monster) { if (self.weapon.intersects(monster)) { // Decrease monster's life monster.life -= self.weapon.damage; // If monster's life is less than or equal to 0, remove the monster if (monster.life <= 0) { game.removeChild(monster); var index = closeRangeMonsters.indexOf(monster); if (index > -1) { closeRangeMonsters.splice(index, 1); } } } }); longRangeMonsters.forEach(function (monster) { if (self.weapon.intersects(monster)) { // Decrease monster's life monster.life -= self.weapon.damage; // If monster's life is less than or equal to 0, remove the monster if (monster.life <= 0) { game.removeChild(monster); var index = longRangeMonsters.indexOf(monster); if (index > -1) { longRangeMonsters.splice(index, 1); } } } }); } self.healthBar.scaleX = self.life / 100; // Update the health bar according to the player's life if (self.superPower) { // Super power logic } }; }); // Define the Puzzle class var Puzzle = Container.expand(function () { var self = Container.call(this); var puzzleGraphics = self.attachAsset('puzzle', { anchorX: 0.5, anchorY: 0.5 }); self.solved = false; self.solve = function () { self.solved = true; // Puzzle solve logic }; }); // Define the Weapon class var Weapon = Container.expand(function () { var self = Container.call(this); self.damage = 10; // Damage that the weapon can cause self.update = function () { // Weapon update logic }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ var background = game.addChild(LK.getAsset('background', { anchorX: 0.0, anchorY: 0.0, x: 0, y: 0 })); // Update bullets if (bullets) { bullets.forEach(function (bullet) { bullet.update(); }); } // Update ghosts LK.playMusic('terribleSong', { loop: true }); // Initialize maze var maze = LK.getAsset('maze', { anchorX: 0.0, anchorY: 0.0, x: 0, y: 0 }); game.addChild(maze); // Define maze boundaries var mazeBoundaries = { left: 100, right: 1948, top: 100, bottom: 2632 }; // Check if player exits the maze function checkPlayerExit() { if (player.x > mazeBoundaries.right || player.x < mazeBoundaries.left || player.y > mazeBoundaries.bottom || player.y < mazeBoundaries.top) { LK.showGameOver(); // Using showGameOver as a placeholder for win screen } } var emptyItems = []; var player = game.addChild(new Player()); player.x = 1024; // Center horizontally player.y = 1366; // Center vertically for (var i = 0; i < 5; i++) { var emptyItem = LK.getAsset('emptyItem', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732 }); emptyItems.push(emptyItem); game.addChild(emptyItem); } // Check if player exits the maze checkPlayerExit(); var bullets = []; // Initialize bullets array to ensure it's defined before use var closeRangeMonsters = []; for (var i = 0; i < 1; i++) { var closeRangeMonster = new CloseRangeMonster(); closeRangeMonster.x = Math.random() * 2048; closeRangeMonster.y = Math.random() * 2732; closeRangeMonsters.push(closeRangeMonster); game.addChild(closeRangeMonster); } var djinns = []; var ghosts = []; for (var i = 0; i < 2; i++) { var ghost = new Ghost(); ghost.x = Math.random() * 2048; ghost.y = Math.random() * 2732; ghosts.push(ghost); game.addChild(ghost); } // Add a Goblin instance to the game var goblin = new Goblin(); goblin.x = Math.random() * 2048; goblin.y = Math.random() * 2732; game.addChild(goblin); var longRangeMonsters = []; var puzzles = []; for (var i = 0; i < 3; i++) { var puzzle = new Puzzle(); puzzle.x = Math.random() * 2048; puzzle.y = Math.random() * 2732; puzzles.push(puzzle); game.addChild(puzzle); } // Handle player movement game.down = function (x, y, obj) { var targetX = x; var targetY = y; var angle = Math.atan2(targetY - player.y, targetX - player.x); player.vx = player.speed * Math.cos(angle); player.vy = player.speed * Math.sin(angle); player.shoot(); }; game.up = function (x, y, obj) { player.vx = 0; player.vy = 0; }; // Update game logic game.update = function () { // Update player position player.x += player.vx; player.y += player.vy; // Increase player speed every 10 seconds if (LK.ticks % 600 == 0) { player.speed += 1; } // Check if player exits the maze checkPlayerExit(); // Check if all enemies are destroyed if (closeRangeMonsters.length === 0 && longRangeMonsters.length === 0 && ghosts.length === 0 && (!goblin || !goblin.parent)) { LK.showGameOver(); // Using showGameOver as a placeholder for win screen } // Update ghosts ghosts.forEach(function (ghost) { ghost.update(); }); // Update goblin if (goblin) { goblin.update(); } longRangeMonsters.forEach(function (monster) { var angle = Math.atan2(player.y - monster.y, player.x - monster.x); monster.x += monster.speed * Math.cos(angle); monster.y += monster.speed * Math.sin(angle); // Check collision with player if (player.intersects(monster)) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }); // Check puzzles puzzles.forEach(function (puzzle) { if (!puzzle.solved && player.intersects(puzzle)) { puzzle.solve(); // Update score or game state } }); };
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.hitCount = 0; // Initialize hit count for the bullet
self.update = function () {
self.y -= self.speed;
// Check collision with ghosts
// Check collision with djinns
djinns.forEach(function (djinn) {
if (self.intersects(djinn)) {
game.removeChild(djinn); // Remove the djinn from the game
var index = djinns.indexOf(djinn);
if (index > -1) {
djinns.splice(index, 1);
}
self.destroy();
}
});
closeRangeMonsters.forEach(function (monster) {
if (self.intersects(monster)) {
game.removeChild(monster); // Remove the monster from the game
var index = closeRangeMonsters.indexOf(monster);
if (index > -1) {
closeRangeMonsters.splice(index, 1);
}
self.destroy();
}
});
// Check collision with long range monsters
longRangeMonsters.forEach(function (monster) {
if (self.intersects(monster)) {
game.removeChild(monster); // Remove the monster from the game
var index = longRangeMonsters.indexOf(monster);
if (index > -1) {
longRangeMonsters.splice(index, 1);
}
self.destroy();
}
});
// Check collision with goblins
if (self.intersects(goblin)) {
game.removeChild(goblin); // Remove the goblin from the game
goblin = null; // Set goblin to null to indicate it's destroyed
self.destroy();
}
// Check collision with ghosts
ghosts.forEach(function (ghost) {
if (self.intersects(ghost)) {
game.removeChild(ghost); // Remove the ghost from the game
var index = ghosts.indexOf(ghost);
if (index > -1) {
ghosts.splice(index, 1);
}
self.destroy();
}
});
// Destroy bullet if it goes off screen
if (self.y < 0) {
self.destroy();
}
};
});
// Define the CloseRangeMonster class
var CloseRangeMonster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 1;
self.update = function () {
var angle = Math.atan2(player.y - self.y, player.x - self.x);
self.x += self.speed * Math.cos(angle);
self.y += self.speed * Math.sin(angle);
if (self.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
};
});
var Ghost = Container.expand(function () {
var self = Container.call(this);
var ghostGraphics = self.attachAsset('ghost', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 3;
self.update = function () {
var angle = Math.atan2(player.y - self.y, player.x - self.x);
self.x += self.speed * Math.cos(angle);
self.y += self.speed * Math.sin(angle);
if (self.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
};
});
// Define the Goblin class
var Goblin = Container.expand(function () {
var self = Container.call(this);
var goblinGraphics = self.attachAsset('goblin', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 3;
self.freezeTime = 600; // 10 seconds in game ticks
self.update = function () {
var angle = Math.atan2(player.y - self.y, player.x - self.x);
self.x += self.speed * Math.cos(angle);
self.y += self.speed * Math.sin(angle);
if (self.intersects(player)) {
player.speed = 0; // Freeze the player
// Display 'FrozeYou're back' on screen
var freezeText = new Text2("FrozeYou're back", {
size: 150,
fill: 0xFFFFFF
});
freezeText.anchor.set(0.5, 0);
LK.gui.center.addChild(freezeText);
LK.setTimeout(function () {
player.speed = 5; // Unfreeze the player after 10 seconds
// Remove 'FrozeYou're back' from screen
LK.gui.center.removeChild(freezeText);
}, self.freezeTime);
}
};
});
var LongRangeMonster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 1;
self.update = function () {
var angle = Math.atan2(player.y - self.y, player.x - self.x);
self.x += self.speed * Math.cos(angle);
self.y += self.speed * Math.sin(angle);
if (self.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
};
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.speed = 5;
self.weapon = new Weapon(); // Add a weapon property for the player
self.life = 100; // Add a life property for the player
self.superPower = false; // Add a super power property for the player
self.healthBar = LK.getAsset('healthBar', {
// Add a health bar for the player
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
self.addChild(self.healthBar);
self.shoot = function () {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullets.push(bullet);
game.addChild(bullet);
};
self.update = function () {
// Player update logic
if (self.weapon) {
self.weapon.update();
// Check if the weapon intersects with any monster
closeRangeMonsters.forEach(function (monster) {
if (self.weapon.intersects(monster)) {
// Decrease monster's life
monster.life -= self.weapon.damage;
// If monster's life is less than or equal to 0, remove the monster
if (monster.life <= 0) {
game.removeChild(monster);
var index = closeRangeMonsters.indexOf(monster);
if (index > -1) {
closeRangeMonsters.splice(index, 1);
}
}
}
});
longRangeMonsters.forEach(function (monster) {
if (self.weapon.intersects(monster)) {
// Decrease monster's life
monster.life -= self.weapon.damage;
// If monster's life is less than or equal to 0, remove the monster
if (monster.life <= 0) {
game.removeChild(monster);
var index = longRangeMonsters.indexOf(monster);
if (index > -1) {
longRangeMonsters.splice(index, 1);
}
}
}
});
}
self.healthBar.scaleX = self.life / 100; // Update the health bar according to the player's life
if (self.superPower) {
// Super power logic
}
};
});
// Define the Puzzle class
var Puzzle = Container.expand(function () {
var self = Container.call(this);
var puzzleGraphics = self.attachAsset('puzzle', {
anchorX: 0.5,
anchorY: 0.5
});
self.solved = false;
self.solve = function () {
self.solved = true;
// Puzzle solve logic
};
});
// Define the Weapon class
var Weapon = Container.expand(function () {
var self = Container.call(this);
self.damage = 10; // Damage that the weapon can cause
self.update = function () {
// Weapon update logic
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
var background = game.addChild(LK.getAsset('background', {
anchorX: 0.0,
anchorY: 0.0,
x: 0,
y: 0
}));
// Update bullets
if (bullets) {
bullets.forEach(function (bullet) {
bullet.update();
});
}
// Update ghosts
LK.playMusic('terribleSong', {
loop: true
});
// Initialize maze
var maze = LK.getAsset('maze', {
anchorX: 0.0,
anchorY: 0.0,
x: 0,
y: 0
});
game.addChild(maze);
// Define maze boundaries
var mazeBoundaries = {
left: 100,
right: 1948,
top: 100,
bottom: 2632
};
// Check if player exits the maze
function checkPlayerExit() {
if (player.x > mazeBoundaries.right || player.x < mazeBoundaries.left || player.y > mazeBoundaries.bottom || player.y < mazeBoundaries.top) {
LK.showGameOver(); // Using showGameOver as a placeholder for win screen
}
}
var emptyItems = [];
var player = game.addChild(new Player());
player.x = 1024; // Center horizontally
player.y = 1366; // Center vertically
for (var i = 0; i < 5; i++) {
var emptyItem = LK.getAsset('emptyItem', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
y: Math.random() * 2732
});
emptyItems.push(emptyItem);
game.addChild(emptyItem);
}
// Check if player exits the maze
checkPlayerExit();
var bullets = []; // Initialize bullets array to ensure it's defined before use
var closeRangeMonsters = [];
for (var i = 0; i < 1; i++) {
var closeRangeMonster = new CloseRangeMonster();
closeRangeMonster.x = Math.random() * 2048;
closeRangeMonster.y = Math.random() * 2732;
closeRangeMonsters.push(closeRangeMonster);
game.addChild(closeRangeMonster);
}
var djinns = [];
var ghosts = [];
for (var i = 0; i < 2; i++) {
var ghost = new Ghost();
ghost.x = Math.random() * 2048;
ghost.y = Math.random() * 2732;
ghosts.push(ghost);
game.addChild(ghost);
}
// Add a Goblin instance to the game
var goblin = new Goblin();
goblin.x = Math.random() * 2048;
goblin.y = Math.random() * 2732;
game.addChild(goblin);
var longRangeMonsters = [];
var puzzles = [];
for (var i = 0; i < 3; i++) {
var puzzle = new Puzzle();
puzzle.x = Math.random() * 2048;
puzzle.y = Math.random() * 2732;
puzzles.push(puzzle);
game.addChild(puzzle);
}
// Handle player movement
game.down = function (x, y, obj) {
var targetX = x;
var targetY = y;
var angle = Math.atan2(targetY - player.y, targetX - player.x);
player.vx = player.speed * Math.cos(angle);
player.vy = player.speed * Math.sin(angle);
player.shoot();
};
game.up = function (x, y, obj) {
player.vx = 0;
player.vy = 0;
};
// Update game logic
game.update = function () {
// Update player position
player.x += player.vx;
player.y += player.vy;
// Increase player speed every 10 seconds
if (LK.ticks % 600 == 0) {
player.speed += 1;
}
// Check if player exits the maze
checkPlayerExit();
// Check if all enemies are destroyed
if (closeRangeMonsters.length === 0 && longRangeMonsters.length === 0 && ghosts.length === 0 && (!goblin || !goblin.parent)) {
LK.showGameOver(); // Using showGameOver as a placeholder for win screen
}
// Update ghosts
ghosts.forEach(function (ghost) {
ghost.update();
});
// Update goblin
if (goblin) {
goblin.update();
}
longRangeMonsters.forEach(function (monster) {
var angle = Math.atan2(player.y - monster.y, player.x - monster.x);
monster.x += monster.speed * Math.cos(angle);
monster.y += monster.speed * Math.sin(angle);
// Check collision with player
if (player.intersects(monster)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
});
// Check puzzles
puzzles.forEach(function (puzzle) {
if (!puzzle.solved && player.intersects(puzzle)) {
puzzle.solve();
// Update score or game state
}
});
};