User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'y')' in or related to this line: 'mode2Button.y = 2732 / 1.7;' Line Number: 94
User prompt
make the easy and nightmare mode more little bit near to normal mode
User prompt
make easy and nightmare more far from normal mode
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'y')' in or related to this line: 'mode1Button.y = (easyModeButton.y + mode2Button.y) / 2;' Line Number: 93
User prompt
make the normal mode button in the middle of easy mode and nightmare mode
User prompt
make the normal mode stands between easy mode and normal mode
User prompt
make the easy mode is more far from nightmare mode
User prompt
buat tombol mode mudah jadi lebih menjarak dari mode mimpi buruk
User prompt
Move the easy mode button to above the normal mode button
User prompt
Add easy mode
User prompt
make the NPCs walk from start
User prompt
hilangkan bulet
User prompt
make the time shows mm:ss everytime
User prompt
when the time show 06:00, end the game
User prompt
remove the time text
User prompt
make the time from time: 0 to 00:00
User prompt
make a timer, and show it when the game started
User prompt
make the clock appear when the game started
/****
* Classes
****/
// Define a Bullet class
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.update = function () {
self.y += self.speed;
};
});
// Define an Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyBody = self.attachAsset('enemyBody', {
anchorX: 0.5,
anchorY: 0.5
});
var enemyArms = self.attachAsset('enemyArms', {
anchorX: 0.5,
anchorY: 0.5
});
var enemyLegs = self.attachAsset('enemyLegs', {
anchorX: 0.5,
anchorY: 0.5
});
var enemyHead = self.attachAsset('enemyHead', {
anchorX: 0.5,
anchorY: 0.5
});
enemyArms.y = -enemyBody.height / 4;
enemyLegs.y = enemyBody.height / 2;
enemyHead.y = -enemyBody.height / 2;
self.speed = 6;
self.update = function () {
// Calculate the direction vector between enemy and NPCs
var dxNpc = 0;
var dyNpc = 0;
var closestNpc = null;
var closestDistance = Infinity;
for (var i = 0; i < npcs.length; i++) {
var dx = npcs[i].x - self.x;
var dy = npcs[i].y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestNpc = npcs[i];
closestDistance = distance;
}
}
if (closestNpc) {
dxNpc = closestNpc.x - self.x;
dyNpc = closestNpc.y - self.y;
var magnitudeNpc = Math.sqrt(dxNpc * dxNpc + dyNpc * dyNpc);
// Normalize the direction vector
dxNpc /= magnitudeNpc;
dyNpc /= magnitudeNpc;
// Move the enemy towards the closest NPC
self.x += dxNpc * self.speed;
self.y += dyNpc * self.speed;
} else {
// Calculate the direction vector between enemy and player
var dxPlayer = player.x - self.x;
var dyPlayer = player.y - self.y;
var magnitudePlayer = Math.sqrt(dxPlayer * dxPlayer + dyPlayer * dyPlayer);
// Normalize the direction vector
dxPlayer /= magnitudePlayer;
dyPlayer /= magnitudePlayer;
// Move the enemy towards the player
self.x += dxPlayer * self.speed;
self.y += dyPlayer * self.speed;
}
};
});
// Define a MenuScreen class
var MenuScreen = Container.expand(function () {
var self = Container.call(this);
// Create a button for each game mode
var mode1Button = new Text2('Normal Mode', {
size: 100,
fill: "#ffffff"
});
mode1Button.anchor.set(0.5, 0.5);
mode1Button.x = 2048 / 2;
mode1Button.y = 2732 / 2;
self.addChild(mode1Button);
var mode2Button = new Text2('NIGHTMARE MODE', {
size: 100,
fill: "#ff0000"
});
mode2Button.anchor.set(0.5, 0.5);
mode2Button.x = 2048 / 2;
mode2Button.y = 2732 / 1.8;
self.addChild(mode2Button);
// Add event listeners to mode buttons
mode1Button.down = function () {
self.destroy(); // Remove menu screen
initializeGame('mode1'); // Start the game in mode 1
};
mode2Button.down = function () {
self.destroy(); // Remove menu screen
initializeGame('mode2'); // Start the game in mode 2
};
});
// Define a NPC class
var NPC = Container.expand(function () {
var self = Container.call(this);
var npcHead = self.attachAsset('playerHead', {
anchorX: 0.5,
anchorY: 0.5
});
npcHead.y = -80;
var npcBody = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
var npcArms = self.attachAsset('playerArms', {
anchorX: 0.5,
anchorY: 0.5
});
npcArms.y = -30;
var npcLegs = self.attachAsset('playerLegs', {
anchorX: 0.5,
anchorY: 0.5
});
npcLegs.y = 40;
self.speed = 4;
self.update = function () {
// Randomly change direction every 60 frames
if (LK.ticks % 60 == 0) {
self.direction = Math.random() * Math.PI * 2;
}
// Calculate dx and dy based on the current direction
var dx = Math.cos(self.direction);
var dy = Math.sin(self.direction);
// Move the NPC
self.x += dx * self.speed;
self.y += dy * self.speed;
// Ensure NPC stays within game boundaries
if (self.x < 0) {
self.x = 0;
self.direction = Math.PI - self.direction;
}
if (self.x > 2048) {
self.x = 2048;
self.direction = Math.PI - self.direction;
}
if (self.y < 0) {
self.y = 0;
self.direction = -self.direction;
}
if (self.y > 2732) {
self.y = 2732;
self.direction = -self.direction;
}
};
});
//<Assets used in the game will automatically appear here>
// Define a Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerHead = self.attachAsset('playerHead', {
anchorX: 0.5,
anchorY: 0.5
});
playerHead.y = -80;
var playerBody = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
var playerArms = self.attachAsset('playerArms', {
anchorX: 0.5,
anchorY: 0.5
});
playerArms.y = -30;
var playerLegs = self.attachAsset('playerLegs', {
anchorX: 0.5,
anchorY: 0.5
});
playerLegs.y = 40;
self.speed = 5;
self.update = function () {
// Player update logic
};
});
// Define a StartScreen class
var StartScreen = Container.expand(function () {
var self = Container.call(this);
// Create a title text for the start screen
var titleText = new Text2('NIGHT OF THE MASSACRE 2', {
size: 150,
fill: "#ffffff"
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 2732 / 4;
self.addChild(titleText);
// Create a start game button
var startButton = new Text2('Start Game', {
size: 150,
fill: "#00ff00"
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 2732 / 2;
self.addChild(startButton);
// Add event listener to start button
startButton.down = function () {
self.destroy(); // Remove start screen
var menuScreen = game.addChild(new MenuScreen()); // Show game mode selection
};
});
// Add the start screen to the game
// Define a Tree class
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeTrunk = self.attachAsset('treeTrunk', {
anchorX: 0.5,
anchorY: 1
});
var treeLeaves = self.attachAsset('treeLeaves', {
anchorX: 0.5,
anchorY: 1
});
treeLeaves.y = -treeTrunk.height;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0000FF //Init game with blue background
});
/****
* Game Code
****/
var enemies = [];
var player = null;
var bullets = [];
var npcs = [];
// Add the start screen to the game
var startScreen = game.addChild(new StartScreen());
// Create a clock shape to display time in the format 00:00
var clockText = new Text2('00:00', {
size: 100,
fill: "#ffffff"
});
clockText.anchor.set(0.5, 0.5);
clockText.x = 2048 / 2;
clockText.y = 100; // Position the clock at the top center of the screen
LK.gui.top.addChild(clockText);
function initializeGame(mode) {
console.log("Selected Game Mode:", mode);
if (mode === 'mode2') {
game.setBackgroundColor(0x8B0000); // Set background to dark red for NIGHTMARE MODE
}
// Initialize player
player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 - 150;
// Initialize enemies
var enemy = new Enemy();
enemy.x = Math.random() * 2048;
enemy.y = Math.random() * 1000;
if (mode === 'mode2') {
enemy.speed *= 1.5; // Increase enemy speed by 50% in NIGHTMARE MODE
}
enemies.push(enemy);
game.addChild(enemy);
// Initialize 30 trees and spread them across the game
var trees = [];
for (var i = 0; i < 30; i++) {
var tree = game.addChild(new Tree());
tree.x = Math.random() * 2048;
tree.y = Math.random() * 2732;
trees.push(tree);
}
// Initialize NPCs
for (var i = 0; i < 20; i++) {
var npc = game.addChild(new NPC());
npc.x = Math.random() * 2048;
npc.y = Math.random() * 2732;
npcs.push(npc);
}
// Create a clock shape to display time in the format 00:00
var clockText = new Text2('00:00', {
size: 100,
fill: "#ffffff"
});
clockText.anchor.set(0.5, 0.5);
clockText.x = 2048 / 2;
clockText.y = 100; // Position the clock at the top center of the screen
LK.gui.top.addChild(clockText);
}
// Handle player movement
game.move = function (x, y, obj) {
if (player) {
player.x = x;
player.y = y;
}
};
// Handle shooting
game.down = function (x, y, obj) {
if (player) {
var bullet = new Bullet();
bullet.x = player.x;
bullet.y = player.y;
bullets.push(bullet);
game.addChild(bullet);
}
};
// Game update loop
game.update = function () {
// Update enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
if (player.intersects(enemies[i])) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
// Check if any NPC intersects with enemy
for (var j = npcs.length - 1; j >= 0; j--) {
if (npcs[j] && npcs[j].intersects(enemies[i])) {
npcs[j].destroy(); // Destroy NPC
npcs.splice(j, 1); // Remove NPC from array
}
}
}
// Update bullets
for (var j = bullets.length - 1; j >= 0; j--) {
bullets[j].update();
for (var k = enemies.length - 1; k >= 0; k--) {
if (bullets[j] && bullets[j].intersects(enemies[k])) {
bullets[j].destroy();
bullets.splice(j, 1);
enemies[k].destroy();
enemies.splice(k, 1);
break;
}
}
if (bullets[j] && bullets[j].y < -50) {
bullets[j].destroy();
bullets.splice(j, 1);
}
}
};