User prompt
make a music for menu
User prompt
add a music to in game
User prompt
not fast enough
User prompt
make the enemy faster
User prompt
let the bullets go toward the enemy and let enemy down in one hit
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'healthText.style.fill = player.health > 30 ? 0x00ff00 : 0xff0000;' Line Number: 644
User prompt
create a function of each mode by your own
User prompt
make a choosing mode screen after pressing the start button
User prompt
make a menu screen
Code edit (1 edits merged)
Please save this source code
User prompt
remove all codes and assets
User prompt
remove the pickup
User prompt
Please fix the bug: 'TypeError: player.getBounds(...).intersects is not a function' in or related to this line: 'if (player.getBounds().intersects(pickup.getBounds())) {' Line Number: 653
Code edit (1 edits merged)
Please save this source code
User prompt
Night of the Massacre 3: Blood Moon Rising
Initial prompt
the 3rd game of my game series called the night of the massacre
/**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 });
===================================================================
--- original.js
+++ change.js
@@ -1,625 +1,6 @@
-/****
-* Plugins
-****/
-var tween = LK.import("@upit/tween.v1");
-var storage = LK.import("@upit/storage.v1");
-
-/****
-* Classes
-****/
-var Bullet = Container.expand(function () {
- var self = Container.call(this);
- var bulletSprite = self.attachAsset('bullet', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.speed = 15;
- self.dirX = 0;
- self.dirY = 0;
- self.distance = 0;
- self.maxDistance = 1500; // Maximum travel distance
- self.setDirection = function (dx, dy) {
- self.dirX = dx;
- self.dirY = dy;
- };
- self.update = function () {
- // Move bullet
- self.x += self.dirX * self.speed;
- self.y += self.dirY * self.speed;
- // Update traveled distance
- self.distance += self.speed;
- // Check if bullet has traveled its maximum distance
- if (self.distance >= self.maxDistance) {
- return true; // Signal for removal
- }
- // Check if bullet is off-screen
- if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
- return true; // Signal for removal
- }
- return false;
- };
- return self;
-});
-var Flashlight = Container.expand(function () {
- var self = Container.call(this);
- // Create the flashlight beam
- var beam = self.attachAsset('flashlight', {
- anchorX: 0.5,
- anchorY: 0.5,
- alpha: 0.6
- });
- // Create the flashlight handle
- var handle = self.attachAsset('flashlightHandle', {
- anchorX: 0.5,
- anchorY: 0,
- y: 0
- });
- // Position handle at bottom of beam
- handle.y = beam.height / 2;
- self.isOn = true;
- self.batteryLevel = 100; // Battery percentage
- self.batteryDrainRate = 0.05; // How much battery drains per tick
- self.toggle = function () {
- self.isOn = !self.isOn;
- beam.alpha = self.isOn ? 0.6 : 0;
- LK.getSound('flashlightToggle').play();
- };
- self.update = function () {
- if (self.isOn && self.batteryLevel > 0) {
- self.batteryLevel -= self.batteryDrainRate;
- if (self.batteryLevel <= 0) {
- self.batteryLevel = 0;
- self.isOn = false;
- beam.alpha = 0;
- }
- }
- };
- self.addBattery = function (amount) {
- self.batteryLevel = Math.min(100, self.batteryLevel + amount);
- if (!self.isOn && self.batteryLevel > 0) {
- self.isOn = true;
- beam.alpha = 0.6;
- }
- };
- self.pointAt = function (x, y) {
- // Calculate angle to target
- var dx = x - self.x;
- var dy = y - self.y;
- var angle = Math.atan2(dy, dx);
- // Apply rotation
- self.rotation = angle + Math.PI / 2; // Add 90 degrees to point forward
- };
- return self;
-});
-var Monster = Container.expand(function () {
- var self = Container.call(this);
- // Monster sprite
- var monsterSprite = self.attachAsset('monster', {
- anchorX: 0.5,
- anchorY: 0.5,
- alpha: 0.2 // Initially almost invisible in darkness
- });
- // Monster stats
- self.health = 3;
- self.speed = 2;
- self.damage = 10;
- self.visible = false;
- self.lastAttack = 0;
- self.attackCooldown = 1000; // ms between attacks
- self.type = "normal";
- self.update = function () {
- // Move towards player
- var dx = player.x - self.x;
- var dy = player.y - self.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- // Only move if not too close to player
- if (distance > 100) {
- // Normalize direction and apply speed
- self.x += dx / distance * self.speed;
- self.y += dy / distance * self.speed;
- } else {
- // Check if can attack
- var now = Date.now();
- if (now - self.lastAttack >= self.attackCooldown) {
- player.takeDamage(self.damage);
- self.lastAttack = now;
- }
- }
- };
- self.checkLight = function (flashlight) {
- if (!flashlight.isOn) {
- monsterSprite.alpha = 0.2;
- return;
- }
- // Calculate vector from flashlight to monster
- var dx = self.x - flashlight.parent.x;
- var dy = self.y - flashlight.parent.y;
- var distance = Math.sqrt(dx * dx + dy * dy);
- // Check if monster is in flashlight beam range (600 is flashlight radius)
- if (distance <= 600) {
- // Get flashlight direction vector
- var flashlightDirX = Math.sin(flashlight.rotation - Math.PI / 2);
- var flashlightDirY = -Math.cos(flashlight.rotation - Math.PI / 2);
- // Normalize monster direction
- var monsterDirX = dx / distance;
- var monsterDirY = dy / distance;
- // Calculate dot product to determine if monster is in flashlight cone
- var dotProduct = monsterDirX * flashlightDirX + monsterDirY * flashlightDirY;
- // Consider a 90-degree cone (cos(45) โ 0.7)
- if (dotProduct > 0.7) {
- // Monster is in the flashlight beam
- monsterSprite.alpha = 1;
- self.visible = true;
- } else {
- // Monster is out of the flashlight beam
- monsterSprite.alpha = 0.2;
- self.visible = false;
- }
- } else {
- // Monster is too far for flashlight
- monsterSprite.alpha = 0.2;
- self.visible = false;
- }
- };
- self.takeDamage = function (amount) {
- // Only take damage if visible in light
- if (self.visible) {
- self.health -= amount;
- LK.effects.flashObject(monsterSprite, 0xFFFFFF, 200);
- LK.getSound('monsterHit').play();
- return true;
- }
- return false;
- };
- return self;
-});
-var Pickup = Container.expand(function (type) {
- var self = Container.call(this);
- self.type = type || "battery"; // "battery" or "ammo"
- var pickupSprite;
- if (self.type === "battery") {
- pickupSprite = self.attachAsset('battery', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- } else {
- // Use bullet shape for ammo but larger
- pickupSprite = self.attachAsset('bullet', {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 2,
- scaleY: 2
- });
- }
- self.collect = function () {
- if (self.type === "battery") {
- player.flashlight.addBattery(30);
- LK.getSound('pickupBattery').play();
- } else {
- player.addAmmo(10);
- LK.getSound('pickupAmmo').play();
- }
- };
- // Add a subtle animation
- self.update = function () {
- pickupSprite.rotation += 0.02;
- };
- return self;
-});
-var Player = Container.expand(function () {
- var self = Container.call(this);
- // Player sprite
- var playerSprite = self.attachAsset('player', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- // Player stats
- self.health = 100;
- self.ammo = 20;
- self.moveSpeed = 5;
- self.isDragging = false;
- // Create and attach the flashlight
- self.flashlight = new Flashlight();
- self.addChild(self.flashlight);
- self.takeDamage = function (amount) {
- self.health -= amount;
- if (self.health <= 0) {
- self.health = 0;
- // Game over handled in main game code
- }
- // Flash the player red when damaged
- LK.effects.flashObject(playerSprite, 0xFF0000, 500);
- LK.getSound('playerHit').play();
- };
- self.addAmmo = function (amount) {
- self.ammo += amount;
- };
- self.shoot = function (targetX, targetY) {
- if (self.ammo <= 0) {
- return false;
- }
- self.ammo--;
- LK.getSound('gunshot').play();
- // Calculate direction of bullet
- var dx = targetX - self.x;
- var dy = targetY - self.y;
- var length = Math.sqrt(dx * dx + dy * dy);
- // Normalize direction
- dx = dx / length;
- dy = dy / length;
- return {
- x: self.x,
- y: self.y,
- dirX: dx,
- dirY: dy
- };
- };
- return self;
-});
-var ProgressBar = Container.expand(function () {
- var self = Container.call(this);
- var background = self.attachAsset('progressBarBg', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- var fill = self.attachAsset('progressBarFill', {
- anchorX: 0,
- anchorY: 0.5,
- x: -background.width / 2 + 2,
- y: 0
- });
- self.maxWidth = fill.width;
- self.setValue = function (percent) {
- var clampedPercent = Math.max(0, Math.min(100, percent));
- fill.width = self.maxWidth * (clampedPercent / 100);
- };
- return self;
-});
-
-/****
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x050505 // Very dark background
-});
-
-/****
-* Game Code
-****/
-// Game state
-var gameActive = true;
-var nightProgress = 0; // 0-100, where 100 means dawn has arrived
-var nightDuration = 180; // 3 minutes of gameplay before dawn
-var lastTime = Date.now();
-var difficultyLevel = 1;
-var score = 0;
-var player = null;
-var monsters = [];
-var bullets = [];
-var pickups = [];
-var dragTarget = null;
-// Blood moon in the sky
-var bloodMoon = LK.getAsset('bloodMoon', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 2048 - 200,
- y: 200,
- alpha: 0.8
-});
-game.addChild(bloodMoon);
-// Darkness overlay
-var darkness = LK.getAsset('backgroundOverlay', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 2048 / 2,
- y: 2732 / 2,
- alpha: 0.85
-});
-game.addChild(darkness);
-// Create player
-player = new Player();
-player.x = 2048 / 2;
-player.y = 2732 / 2;
-game.addChild(player);
-// UI elements
-// Health text
-var healthText = new Text2('Health: 100', {
- size: 50,
- fill: 0xFF0000
-});
-healthText.anchor.set(0, 0);
-healthText.x = 150;
-healthText.y = 50;
-LK.gui.topRight.addChild(healthText);
-// Ammo text
-var ammoText = new Text2('Ammo: 20', {
- size: 50,
- fill: 0xFFFF00
-});
-ammoText.anchor.set(0, 0);
-ammoText.x = 150;
-ammoText.y = 120;
-LK.gui.topRight.addChild(ammoText);
-// Battery text
-var batteryText = new Text2('Battery: 100%', {
- size: 50,
- fill: 0x00FF00
-});
-batteryText.anchor.set(0, 0);
-batteryText.x = 150;
-batteryText.y = 190;
-LK.gui.topRight.addChild(batteryText);
-// Score text
-var scoreText = new Text2('Score: 0', {
- size: 50,
- fill: 0xFFFFFF
-});
-scoreText.anchor.set(0.5, 0);
-LK.gui.top.addChild(scoreText);
-// Night progress bar
-var progressBar = new ProgressBar();
-progressBar.x = 2048 / 2;
-progressBar.y = 50;
-LK.gui.top.addChild(progressBar);
-// Dawn text
-var dawnText = new Text2('SURVIVE UNTIL DAWN', {
- size: 30,
- fill: 0xFFFF99
-});
-dawnText.anchor.set(0.5, 0);
-dawnText.x = 0;
-dawnText.y = 70;
-LK.gui.top.addChild(dawnText);
-// Wave text (shows current difficulty)
-var waveText = new Text2('Wave: 1', {
- size: 60,
- fill: 0xFF0000
-});
-waveText.anchor.set(0.5, 0);
-waveText.x = 0;
-waveText.y = 130;
-waveText.alpha = 0; // Start hidden
-LK.gui.center.addChild(waveText);
-// Start the game
-initGame();
-LK.playMusic('ambientHorror');
-function initGame() {
- gameActive = true;
- nightProgress = 0;
- difficultyLevel = 1;
- score = 0;
- LK.setScore(0);
- monsters = [];
- bullets = [];
- pickups = []; // Empty array, no pickups in this version
- lastTime = Date.now();
- // Reset player
- player.health = 100;
- player.ammo = 20;
- player.x = 2048 / 2;
- player.y = 2732 / 2;
- player.flashlight.batteryLevel = 100;
- player.flashlight.isOn = true;
- // Update UI
- updateUI();
- // Show first wave
- showWaveNotification(difficultyLevel);
-}
-function updateUI() {
- healthText.setText('Health: ' + player.health);
- ammoText.setText('Ammo: ' + player.ammo);
- batteryText.setText('Battery: ' + Math.floor(player.flashlight.batteryLevel) + '%');
- scoreText.setText('Score: ' + score);
- progressBar.setValue(nightProgress);
-}
-function showWaveNotification(wave) {
- waveText.setText('Wave: ' + wave);
- waveText.alpha = 1;
- // Fade out the notification after 2 seconds
- tween(waveText, {
- alpha: 0
- }, {
- duration: 1000,
- delay: 2000
- });
-}
-function spawnMonster() {
- var monster = new Monster();
- // Determine spawn location off-screen
- var side = Math.floor(Math.random() * 4); // 0: top, 1: right, 2: bottom, 3: left
- var padding = 100; // Distance from edge
- switch (side) {
- case 0:
- // Top
- monster.x = Math.random() * 2048;
- monster.y = -padding;
- break;
- case 1:
- // Right
- monster.x = 2048 + padding;
- monster.y = Math.random() * 2732;
- break;
- case 2:
- // Bottom
- monster.x = Math.random() * 2048;
- monster.y = 2732 + padding;
- break;
- case 3:
- // Left
- monster.x = -padding;
- monster.y = Math.random() * 2732;
- break;
- }
- // Adjust monster properties based on difficulty
- monster.health = 2 + Math.floor(difficultyLevel / 2);
- monster.speed = 2 + difficultyLevel * 0.3;
- monster.damage = 5 + difficultyLevel * 2;
- // Chance for stronger monster types in higher waves
- if (difficultyLevel > 3 && Math.random() < 0.2) {
- monster.type = "elite";
- monster.health += 3;
- monster.speed += 1;
- monster.damage += 5;
- // Tint elite monsters
- monster.children[0].tint = 0xFF00FF;
- }
- LK.getSound('monsterSpawn').play();
- monsters.push(monster);
- game.addChild(monster);
-}
-function spawnPickup() {
- // Function kept for compatibility but does nothing in this version
-}
-function handleMonsterHit(monster, index) {
- // If monster is killed
- if (monster.health <= 0) {
- // Add score based on monster type
- var points = monster.type === "elite" ? 25 : 10;
- score += points;
- LK.setScore(score);
- // No pickups in this version
- // Remove monster
- monster.destroy();
- monsters.splice(index, 1);
- }
-}
-function handleDayTimeProgress(delta) {
- // Progress night time
- nightProgress += delta / 1000 * (100 / nightDuration);
- // Cap at 100%
- nightProgress = Math.min(100, nightProgress);
- // Update difficulty based on progress
- var newDifficulty = 1 + Math.floor(nightProgress / 14.28); // 7 waves total
- // If difficulty increased
- if (newDifficulty > difficultyLevel) {
- difficultyLevel = newDifficulty;
- showWaveNotification(difficultyLevel);
- }
- // Adjust darkness based on progress
- darkness.alpha = Math.max(0.45, 0.85 - nightProgress / 100 * 0.4);
- // Check if night is over
- if (nightProgress >= 100) {
- // Player survived until dawn
- gameWon();
- }
-}
-function gameWon() {
- if (!gameActive) {
- return;
- }
- gameActive = false;
- // Add bonus points for remaining health
- score += player.health;
- LK.setScore(score);
- // Show you win screen
- LK.showYouWin();
-}
-function gameOver() {
- if (!gameActive) {
- return;
- }
- gameActive = false;
- // Show game over screen
- LK.showGameOver();
-}
-// Input handling
-function handleDrag(x, y) {
- // If dragging the player
- if (dragTarget === player) {
- player.x = x;
- player.y = y;
- // Keep player on screen
- player.x = Math.max(100, Math.min(2048 - 100, player.x));
- player.y = Math.max(100, Math.min(2732 - 100, player.y));
- }
-}
-// Event handlers
-game.down = function (x, y) {
- // Start dragging the player if clicked on
- if (x >= player.x - player.width / 2 && x <= player.x + player.width / 2 && y >= player.y - player.height / 2 && y <= player.y + player.height / 2) {
- dragTarget = player;
- } else {
- // Shoot at clicked location if player has ammo and flashlight is on
- if (player.ammo > 0 && player.flashlight.isOn) {
- var bulletInfo = player.shoot(x, y);
- if (bulletInfo) {
- var bullet = new Bullet();
- bullet.x = bulletInfo.x;
- bullet.y = bulletInfo.y;
- bullet.setDirection(bulletInfo.dirX, bulletInfo.dirY);
- bullets.push(bullet);
- game.addChild(bullet);
- }
- }
- }
-};
-game.up = function () {
- dragTarget = null;
-};
-game.move = function (x, y) {
- // Point flashlight at cursor
- player.flashlight.pointAt(x, y);
- // Handle dragging
- if (dragTarget) {
- handleDrag(x, y);
- }
-};
-// Main game loop
-game.update = function () {
- if (!gameActive) {
- return;
- }
- // Calculate delta time
- var currentTime = Date.now();
- var deltaTime = currentTime - lastTime;
- lastTime = currentTime;
- // Day/night cycle progression
- handleDayTimeProgress(deltaTime);
- // Update player
- player.flashlight.update();
- // Update all monsters
- for (var i = monsters.length - 1; i >= 0; i--) {
- var monster = monsters[i];
- monster.update();
- monster.checkLight(player.flashlight);
- // Check if monster kills player
- if (player.health <= 0) {
- gameOver();
- return;
- }
- }
- // Update bullets
- for (var i = bullets.length - 1; i >= 0; i--) {
- var bullet = bullets[i];
- var shouldRemove = bullet.update();
- // Check bullet collisions with monsters
- for (var j = monsters.length - 1; j >= 0; j--) {
- var monster = monsters[j];
- if (bullet.intersects(monster)) {
- // Try to damage monster
- var hitConfirmed = monster.takeDamage(1);
- if (hitConfirmed) {
- handleMonsterHit(monster, j);
- shouldRemove = true;
- break;
- }
- }
- }
- if (shouldRemove) {
- bullet.destroy();
- bullets.splice(i, 1);
- }
- }
- // No pickups in this version
- // Spawn monsters based on difficulty
- if (LK.ticks % Math.max(60, 120 - difficultyLevel * 10) === 0) {
- spawnMonster();
- }
- // No pickup spawning in this version
- // Flashlight toggle (at regular intervals for demo)
- if (LK.ticks % 600 === 0 && player.flashlight.batteryLevel <= 20) {
- player.flashlight.toggle();
- }
- // Update UI
- updateUI();
-};
\ No newline at end of file
+ backgroundColor: 0x000000
+});
\ No newline at end of file