User prompt
make a "survive until 06:00 am" writing at the bottom of the screen
User prompt
if the clock is 06:00, make a YOU WIN! screen
User prompt
make the shotgun disappear
User prompt
make the night of the massacre at the top of the start game button
User prompt
make the "start game" button more far from the house
User prompt
change NPC count to 10
User prompt
make the NPC move speed like enemy
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'npc.x = house.x; // Position NPCs inside the house' Line Number: 431
User prompt
make all NPC inside the house when the game not started yet
User prompt
increase the enemy count to 10
User prompt
make the NPC gone when they're died
User prompt
make the enemy can chase NPC
User prompt
make the NPC stop when the game not started
User prompt
remove gas can
User prompt
increase the NPC count to 3
User prompt
increase the enemy count
User prompt
increase the enemy speed again
User prompt
increase the NPC speed
User prompt
make the npc move to every place
User prompt
make the NPC walking and can killed by enemy
User prompt
make a NPC shape like player
User prompt
decrease the "night of the massacre" word
User prompt
change the game logo to scary
User prompt
decrease enemy max to 5
User prompt
make the player stop every 10 seconds
/****
* Classes
****/
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Attach head
var head = self.attachAsset('enemyHead', {
anchorX: 0.5,
anchorY: 0.5,
y: -70
});
// Attach body
var body = self.attachAsset('enemyBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Attach arms
var leftArm = self.attachAsset('enemyArm', {
anchorX: 0.5,
anchorY: 0.5,
x: -45,
y: -20
});
var rightArm = self.attachAsset('enemyArm', {
anchorX: 0.5,
anchorY: 0.5,
x: 45,
y: -20
});
// Attach legs
var leftLeg = self.attachAsset('enemyLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: -20,
y: 60
});
var rightLeg = self.attachAsset('enemyLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: 20,
y: 60
});
self.tired = false;
self.energy = 100; // Initial energy level
self.update = function () {
// Decrease energy over time
self.energy -= 0.1; // Decrease energy over time
if (self.energy <= 0) {
self.tired = true; // Set tired state when energy is depleted
}
// Logic to make the enemy slow down when tired
if (self.tired) {
speed = 3; // Reduce speed when tired
}
// Enemy movement logic to chase the player or NPCs
if (!menuScreen.visible) {
var target = player;
var minDistance = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2));
// Find the closest NPC
for (var i = 0; i < npcs.length; i++) {
var npc = npcs[i];
var npcDistance = Math.sqrt(Math.pow(npc.x - self.x, 2) + Math.pow(npc.y - self.y, 2));
if (npcDistance < minDistance) {
minDistance = npcDistance;
target = npc;
}
}
var dx = target.x - self.x;
var dy = target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var speed = 10; // Speed at which the enemy chases the target
if (distance > 0) {
var newX = self.x + dx / distance * speed;
var newY = self.y + dy / distance * speed;
// Check if the new position would intersect with the house
self.x = newX;
self.y = newY;
if (self.intersects(house)) {
if (Math.abs(dx) > Math.abs(dy)) {
self.y += (dy > 0 ? 1 : -1) * speed;
} else {
self.x += (dx > 0 ? 1 : -1) * speed;
}
}
}
}
};
});
// Generator class
var Generator = Container.expand(function () {
var self = Container.call(this);
var generatorGraphic = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
self.isOn = false; // Initial state of the generator
self.energy = 100; // Initial energy level of the generator
self.toggle = function () {
self.isOn = !self.isOn;
console.log("Generator is now " + (self.isOn ? "ON" : "OFF"));
if (self.isOn && self.energy > 0) {
self.energy -= 0.1; // Decrease energy over time
console.log("Generator energy: " + self.energy.toFixed(1) + "/100");
if (self.energy <= 0) {
self.isOn = false; // Turn off the generator when energy is depleted
console.log("Generator is now OFF due to energy depletion");
}
}
};
self.update = function () {
if (self.isOn && self.energy > 0) {
self.energy -= 0.1; // Decrease energy over time
console.log("Generator energy: " + self.energy.toFixed(1) + "/100");
if (self.energy <= 0) {
self.isOn = false; // Turn off the generator when energy is depleted
console.log("Generator is now OFF due to energy depletion");
}
}
};
});
// House class
var House = Container.expand(function () {
var self = Container.call(this);
var houseBase = self.attachAsset('houseBase', {
anchorX: 0.5,
anchorY: 0.5
});
var houseRoof = self.attachAsset('houseRoof', {
anchorX: 0.5,
anchorY: 1.0,
y: -75
});
// Attach door
var houseDoor = self.attachAsset('houseBase', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 150,
color: 0x654321,
y: 75
});
});
// Joystick class
var Joystick = Container.expand(function () {
var self = Container.call(this);
var joystickButton = self.attachAsset('joystickButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.active = false;
self.startX = 0;
self.startY = 0;
self.down = function (x, y, obj) {
self.active = true;
self.startX = x;
self.startY = y;
};
self.move = function (x, y, obj) {
if (self.active) {
var dx = x - self.startX;
var dy = y - self.startY;
player.x += dx * 0.5; // Reduce speed by half
player.y += dy * 0.5; // Reduce speed by half
self.startX = x;
self.startY = y;
}
};
self.up = function (x, y, obj) {
self.active = false;
};
});
// MenuScreen class
var MenuScreen = Container.expand(function () {
var self = Container.call(this);
var titleText = new Text2('Night of the Massacre', {
size: 150,
fill: "#ff0000",
// Change color to red for a scarier look
font: "'Creepster', 'Arial Black', Tahoma" // Use a scary font
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 2732 / 2 - 650; // Position title above the start game button
self.addChild(titleText);
var startButton = new Text2('Start Game', {
size: 150,
fill: "#ffffff"
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 2732 / 2 - 500; // Position the start button further from the house
self.addChild(startButton);
startButton.down = function (x, y, obj) {
console.log("Start Game button pressed!");
self.visible = false; // Hide the menu screen
game.startGame(); // Call the start game function
};
});
// NPC class
var NPC = Container.expand(function () {
var self = Container.call(this);
// Attach head
var head = self.attachAsset('playerHead', {
anchorX: 0.5,
anchorY: 0.5,
y: -60
});
// Attach body
var body = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Attach arms
var leftArm = self.attachAsset('playerArm', {
anchorX: 0.5,
anchorY: 0.5,
x: -25,
y: -20
});
var rightArm = self.attachAsset('playerArm', {
anchorX: 0.5,
anchorY: 0.5,
x: 25,
y: -20
});
// Attach legs
var leftLeg = self.attachAsset('playerLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: -10,
y: 40
});
var rightLeg = self.attachAsset('playerLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: 10,
y: 40
});
self.speed = 10; // Set NPC speed to match enemy speed
self.update = function () {
if (!menuScreen.visible) {
// Random movement logic: NPC moves to random locations
if (!self.targetX || !self.targetY || Math.abs(self.x - self.targetX) < 5 && Math.abs(self.y - self.targetY) < 5) {
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
}
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
});
// Joystick controls
// The game engine will automatically load the required assets
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
// Attach head
var head = self.attachAsset('playerHead', {
anchorX: 0.5,
anchorY: 0.5,
y: -60
});
// Attach body
var body = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Attach arms
var leftArm = self.attachAsset('playerArm', {
anchorX: 0.5,
anchorY: 0.5,
x: -25,
y: -20
});
var rightArm = self.attachAsset('playerArm', {
anchorX: 0.5,
anchorY: 0.5,
x: 25,
y: -20
});
// Attach legs
var leftLeg = self.attachAsset('playerLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: -10,
y: 40
});
var rightLeg = self.attachAsset('playerLeg', {
anchorX: 0.5,
anchorY: 0.5,
x: 10,
y: 40
});
self.energy = 100; // Initial energy level
self.tired = false; // Initial tired state
self.update = function () {
// Decrease energy over time
self.energy -= 0.1;
if (self.energy <= 0) {
self.tired = true; // Set tired state when energy is depleted
console.log("Player is tired and cannot move!");
return; // Skip movement if player is tired
}
if (self.tired) {
return; // Skip movement if player is tired
}
// Decrease energy over time
self.energy -= 0.1;
if (self.energy <= 0) {
self.tired = true; // Set tired state when energy is depleted
console.log("Player is tired and cannot move!");
return;
}
for (var i = 0; i < shotguns.length; i++) {
if (self.intersects(shotguns[i])) {
// Logic to prevent player from grabbing the shotgun
console.log("Player cannot grab the shotgun!");
}
}
// Check if player intersects with the shed
if (self.intersects(shed)) {
console.log("Player touched the shed!");
// Logic to refill the generator
if (!generator.isOn) {
generator.energy = 100; // Refill generator energy
console.log("Generator refilled!");
}
}
};
});
// Shed class
var Shed = Container.expand(function () {
var self = Container.call(this);
var shedBase = self.attachAsset('houseBase', {
anchorX: 0.5,
anchorY: 0.5
});
var generator = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 50
});
});
// Shotgun class
var Shotgun = Container.expand(function () {
var self = Container.call(this);
var shotgunGraphic = self.attachAsset('playerBody', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
// Rotate the shotgun towards the player
var dx = player.x - self.x;
var dy = player.y - self.y;
self.rotation = Math.atan2(dy, dx);
// Fire logic: Check if the player is within a certain range and fire
var distanceToPlayer = Math.sqrt(dx * dx + dy * dy);
if (distanceToPlayer < 500) {
// Example range
// Logic to fire at the player
console.log("Shotgun fires at the player!");
// Implement firing effect or damage logic here
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x191970 // Init game with midnight blue background
});
/****
* Game Code
****/
// Initialize and display the menu screen
var menuScreen = game.addChild(new MenuScreen());
menuScreen.visible = true;
// Function to start the game
game.startGame = function () {
// Initialize game elements here if needed
menuScreen.visible = false; // Hide the menu screen
// Add other game initialization logic if necessary
};
// Initialize joystick
// Blood texture color
// Blood texture color
// Blood texture color
var joystick = game.addChild(new Joystick());
joystick.x = 150; // Position joystick on the screen
joystick.y = 2582; // Near the bottom of the screen
// Add a clock display to the game
var clockTxt = new Text2('00:00', {
size: 100,
fill: "#ffffff"
});
clockTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(clockTxt);
// Add 'Survive until 06:00 am' text at the bottom of the screen
var surviveText = new Text2('Survive until 06:00 am', {
size: 100,
fill: "#ffffff"
});
surviveText.anchor.set(0.5, 1);
surviveText.x = 2048 / 2;
surviveText.y = 2732;
LK.gui.bottom.addChild(surviveText);
// Add player to the game
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
var house = game.addChild(new House());
house.x = 2048 / 2;
house.y = 2732 / 2;
// Add NPCs to the game
var npcs = [];
for (var i = 0; i < 10; i++) {
var npc = game.addChild(new NPC());
npc.x = house.x; // Position NPCs inside the house
npc.y = house.y;
npcs.push(npc);
}
// Update the clock every second
var startTime = Date.now();
LK.setInterval(function () {
if (!menuScreen.visible) {
var elapsedTime = Math.floor((Date.now() - startTime) / 1000);
var minutes = Math.floor(elapsedTime / 60);
var seconds = elapsedTime % 60;
clockTxt.setText((minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
// Check if the clock reaches 06:00
if (minutes === 6 && seconds === 0) {
// Display 'YOU WIN!' screen
var winText = new Text2('YOU WIN!', {
size: 200,
fill: "#00ff00"
});
winText.anchor.set(0.5, 0.5);
winText.x = 2048 / 2;
winText.y = 2732 / 2;
LK.gui.center.addChild(winText);
// Pause the game
game.paused = true;
}
}
}, 1000);
// Add mouse movement control for player
game.move = function (x, y, obj) {
if (!menuScreen.visible) {
player.x = x;
player.y = y;
}
};
var enemies = [];
var enemy = game.addChild(new Enemy());
enemy.x = Math.random() * 2048;
enemy.y = Math.random() * 2732;
enemies.push(enemy);
// Track time for increasing enemy speed
var lastSpeedIncreaseTime = Date.now();
// Track time for stopping the player
var lastStopTime = Date.now();
// Game update function
game.update = function () {
// Stop the player every 10 seconds
if (Date.now() - lastStopTime >= 10000) {
player.tired = true;
console.log("Player stops for a moment!");
LK.setTimeout(function () {
player.tired = false;
console.log("Player can move again!");
}, 1000); // Player stops for 1 second
lastStopTime = Date.now();
}
if (menuScreen.visible) {
return; // Do not update game elements if the menu screen is visible
}
// Increase speed of all enemies every second
for (var i = 0; i < enemies.length; i++) {
enemies[i].speed = (enemies[i].speed || 7) + 10; // Initialize speed if undefined and increase by 10
}
// Game logic goes here
generator.update();
// Check if player is inside the house
if (player.intersects(house)) {
// Logic to make the player feel cold
// For example, decrease player's health or display a message
console.log("Player feels cold inside the house!");
// Implement logic to encourage player to leave the house
// This could be a visual effect, sound, or health decrease
}
// Check for collisions between player and enemies
for (var i = 0; i < enemies.length; i++) {
if (player.intersects(enemies[i])) {
if (shotguns.length === 0) {
// Enemy dies if player has grabbed the shotgun
enemies[i].destroy();
enemies.splice(i, 1);
} else {
// Flash screen red for 1 second (1000ms) to show player is killed
LK.effects.flashScreen(0xff0000, 1000);
// Show game over. The game will be automatically paused while game over is showing.
LK.showGameOver();
break;
}
}
for (var j = 0; j < npcs.length; j++) {
if (npcs[j].intersects(enemies[i])) {
// NPC is killed by enemy
console.log("NPC killed by enemy!");
npcs[j].destroy();
npcs.splice(j, 1);
}
}
}
// Increase enemy count by 1 every 5 seconds, with a maximum limit of 10 enemies
var enemyIncreaseInterval = LK.setInterval(function () {
if (!menuScreen.visible && enemies.length < 10) {
var newEnemy = game.addChild(new Enemy());
newEnemy.x = Math.random() * 2048;
newEnemy.y = Math.random() * 2732;
enemies.push(newEnemy);
}
}, 5000);
};
// Add a bloodmoon to the game
var bloodMoon = LK.getAsset('bloodMoon', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200
});
game.addChild(bloodMoon);
var house = game.addChild(new House());
house.x = 2048 / 2;
house.y = 2732 / 2;
// Add a shed with a generator inside to the game
var shed = game.addChild(new Shed());
shed.x = 500; // Position the shed at a specific location
shed.y = 2000; // Position the shed at a specific location
// Add a generator inside the shed
var generator = shed.addChild(new Generator());
generator.x = 0; // Center the generator inside the shed
generator.y = 50; // Position the generator inside the shed
// Remove the shotgun from the game by not adding it to the game scene
var shotguns = [];
// Keyboard controls for WASD movement are not supported in this environment ===================================================================
--- original.js
+++ change.js
@@ -403,8 +403,17 @@
fill: "#ffffff"
});
clockTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(clockTxt);
+// Add 'Survive until 06:00 am' text at the bottom of the screen
+var surviveText = new Text2('Survive until 06:00 am', {
+ size: 100,
+ fill: "#ffffff"
+});
+surviveText.anchor.set(0.5, 1);
+surviveText.x = 2048 / 2;
+surviveText.y = 2732;
+LK.gui.bottom.addChild(surviveText);
// Add player to the game
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;