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
/**** * 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(); };
===================================================================
--- original.js
+++ change.js
@@ -390,9 +390,9 @@
score = 0;
LK.setScore(0);
monsters = [];
bullets = [];
- pickups = [];
+ pickups = []; // Empty array, no pickups in this version
lastTime = Date.now();
// Reset player
player.health = 100;
player.ammo = 20;
@@ -467,31 +467,18 @@
monsters.push(monster);
game.addChild(monster);
}
function spawnPickup() {
- var pickup = new Pickup(Math.random() < 0.5 ? "battery" : "ammo");
- // Random position on screen with some padding
- var padding = 200;
- pickup.x = padding + Math.random() * (2048 - 2 * padding);
- pickup.y = padding + Math.random() * (2732 - 2 * padding);
- pickups.push(pickup);
- game.addChild(pickup);
+ // 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);
- // Chance to drop pickup
- if (Math.random() < 0.3) {
- var pickup = new Pickup(Math.random() < 0.5 ? "battery" : "ammo");
- pickup.x = monster.x;
- pickup.y = monster.y;
- pickups.push(pickup);
- game.addChild(pickup);
- }
+ // No pickups in this version
// Remove monster
monster.destroy();
monsters.splice(index, 1);
}
@@ -622,27 +609,14 @@
bullet.destroy();
bullets.splice(i, 1);
}
}
- // Update pickups
- for (var i = pickups.length - 1; i >= 0; i--) {
- var pickup = pickups[i];
- pickup.update();
- // Check if player collects pickup
- if (player.intersects(pickup)) {
- pickup.collect();
- pickup.destroy();
- pickups.splice(i, 1);
- }
- }
+ // No pickups in this version
// Spawn monsters based on difficulty
if (LK.ticks % Math.max(60, 120 - difficultyLevel * 10) === 0) {
spawnMonster();
}
- // Spawn pickups periodically
- if (LK.ticks % 300 === 0) {
- spawnPickup();
- }
+ // 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();
}