User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'laserBeams.forEach')' in or related to this line: 'laserBeams.forEach(function (beam) {' Line Number: 90
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'laserBeams.forEach')' in or related to this line: 'laserBeams.forEach(function (beam) {' Line Number: 90
User prompt
Remove the stretch on the laser beam. Attach additional laser beam assets end to end until it creates an uninterrupted beam. After the duration, destroy the beam.
User prompt
After laser charge up phase, create a laser using the laser beam asset that aims at the players location and stretches across the entire screen and off the other side. Beam lasts 1.5 seconds
User prompt
Create a laser attack sequence for the Blaster enemy: Have Blaster stop moving while charging. Phase 1: Charge-up Phase (2 seconds): - Spawn small glowing particles around enemy's front - Make particles spiral inward to a central firing point while growing in size slightly - Particles should gather into a bright point at the bottom center of the Blaster - Increase brightness as charge builds - Use 3-4 particles that rotate and converge
User prompt
Remove the tint change from laser beam
User prompt
Create a laser attack sequence for the Blaster enemy: 1. Charge-up Phase (0.6 seconds): - Spawn small glowing particles around enemy's front - Make particles spiral inward while growing slightly - Particles should gather into a bright point - Increase brightness as charge builds - Use 3-4 particles that rotate and converge 2. Fire Phase (0.3 seconds): - Spawn bright laser beam from enemy to bottom of screen - Make beam appear quickly and hold briefly - Fade out beam rapidly - Remove any remaining particles Properties to set: - Particle rotation speed: medium - Particle gather point: enemy's front center - Laser beam width: thin but visible - Beam color: bright red/orange - Particle colors: match beam color Make sure: - Attack feels threatening but fair - Player has time to see and dodge - Effects are visible but not overwhelming - Sequence runs smoothly and consistently, use laser charge particle and laser beam
User prompt
Double check that all enemies and bullets leaving the bottom of the screen are destroyed.
User prompt
The game is stuttering a lot when a certain number of enemies get past the player. Can you identify the issue or spot any places in the code where there are memory use problems?
User prompt
Path the enemies so that they attempt to move around each other on the way down
User prompt
Add chance for Blaster to spawn.
User prompt
Make a Blaster enemy class
User prompt
The dust particles spawned by the bruiser should be below the bruiser layer.
User prompt
Spawn dust particles under the bruiser as it walks.
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'rightPiece.speedX')' in or related to this line: 'rightPiece.speedX = Math.abs(rightPiece.speedX) * 1.5; // Increase force for right piece' Line Number: 421
User prompt
When the bruiser is destroyed move the pieces with greater force
User prompt
Add more outwards rotation to the bruiser pieces
User prompt
Have left and right bruiser pieces travel further out at destruction.
User prompt
Switch the direction of the bruiser left and right piece
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'rightPiece.x = enemies[k].x + enemies[k].width / 2')' in or related to this line: 'rightPiece.x = enemies[k].x + enemies[k].width / 2; // Position on the right side' Line Number: 419
User prompt
Please fix the bug: 'ReferenceError: Can't find variable: bruiserGraphics' in or related to this line: 'leftPiece.x = enemies[k].x - bruiserGraphics.width / 2; // Position on the left side' Line Number: 418
User prompt
Instead of having all bruiser pieces spawn from the center of Bruiser, spawn left and right pieces on their respective sides
User prompt
Reduce number of drones spawned at a time to 1-2
User prompt
If left and right bruiser pieces receive X movement on destruction they should only travel outwards from each other, never inwards.
User prompt
Left and right bruiser pieces have a reduced chance to travel towards each other.
/****
* Classes
****/
// Bruiser class representing a tougher enemy
var Bruiser = Container.expand(function () {
var self = Container.call(this);
var bruiserGraphics = self.attachAsset('Bruiser', {
anchorX: 0.5,
anchorY: 0.5
});
self.HitPoints = 10; // Higher hit points for Bruiser
self.speed = 4; // Increased speed for Bruiser
self.update = function () {
// Implement mechanical stomping movement
if (LK.ticks % 80 < 20) {
bruiserGraphics.scale.x = 1.1;
bruiserGraphics.scale.y = 0.9;
bruiserGraphics.rotation = 0.1; // Tilt right
} else if (LK.ticks % 80 < 40) {
bruiserGraphics.scale.x = 1.0;
bruiserGraphics.scale.y = 1.0;
bruiserGraphics.rotation = 0;
} else if (LK.ticks % 80 < 60) {
bruiserGraphics.scale.x = 1.1;
bruiserGraphics.scale.y = 0.9;
bruiserGraphics.rotation = -0.1; // Tilt left
} else {
bruiserGraphics.scale.x = 1.0;
bruiserGraphics.scale.y = 1.0;
bruiserGraphics.rotation = 0;
}
// Move downwards only during tilt phases
if (LK.ticks % 80 < 20 || LK.ticks % 80 >= 40 && LK.ticks % 80 < 60) {
self.y += self.speed;
}
if (self.y > 2732) {
self.destroy();
}
};
});
// BruiserPiece class for bruiser destruction effect
var BruiserPiece = Container.expand(function (assetType) {
var self = Container.call(this);
var pieceGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = Math.random() * 6 - 3; // Increased random horizontal speed
if (assetType === 'BruiserLeftPart') {
self.speedX = Math.abs(self.speedX); // Ensure left part moves right
} else if (assetType === 'BruiserRightPart') {
self.speedX = -Math.abs(self.speedX); // Ensure right part moves left
}
self.speedY = Math.random() * 4 - 2; // Random vertical speed
self.alphaDecay = 0.02; // Rate at which the piece fades out
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
pieceGraphics.rotation += Math.random() * 0.1 - 0.05; // Add slight random rotation
pieceGraphics.alpha -= self.alphaDecay;
if (pieceGraphics.alpha <= 0) {
self.destroy();
}
};
});
// Enemy class representing the enemy robots
var Drone = Container.expand(function () {
var self = Container.call(this);
var droneGraphics = self.attachAsset('Drone', {
anchorX: 0.5,
anchorY: 0.5
});
self.HitPoints = 3;
self.randomOffset = Math.random() * 100; // Random timing for each drone
self.speed = 2.25;
self.update = function () {
// Add robotic hover effects
self.y += self.speed * (Math.random() > 0.1 ? 1 : 0); // Brief pauses in downward movement
self.x += Math.sin(LK.ticks / 10 + self.randomOffset) * 2; // Small jerky side-to-side movements
if (Math.random() > 0.95) {
self.x += Math.random() * 4 - 2; // Quick position corrections
}
// Pulse effect on hit
if (self.pulseEffect) {
droneGraphics.scale.x = 1.2;
droneGraphics.scale.y = 1.2;
self.pulseEffect = false;
} else {
droneGraphics.scale.x = 1.0;
droneGraphics.scale.y = 1.0;
}
if (self.y > 2732) {
self.destroy();
}
};
});
// DronePiece class for drone destruction effect
var DronePiece = Container.expand(function (assetType) {
var self = Container.call(this);
var pieceGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = Math.random() * 6 - 3; // Increased random horizontal speed
self.speedY = Math.random() * 4 - 2; // Random vertical speed
self.alphaDecay = 0.02; // Rate at which the piece fades out
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
pieceGraphics.rotation += Math.random() * 0.1 - 0.05; // Add slight random rotation
pieceGraphics.alpha -= self.alphaDecay;
if (pieceGraphics.alpha <= 0) {
self.destroy();
}
};
});
// Dust class for dust particles
var Dust = Container.expand(function () {
var self = Container.call(this);
var dustGraphics = self.attachAsset('Dust', {
anchorX: 0.5,
anchorY: 0.5
});
dustGraphics.alpha = 0.75;
self.speed = Math.random() * 3 + 1;
self.rotationSpeed = Math.random() * 0.02 - 0.01; // Random rotation speed between -0.01 and 0.01
self.direction = Math.random() * Math.PI * 0.5;
self.update = function () {
self.y += self.speed;
self.x += Math.sin(self.direction) * self.speed; // Add slight X travel based on direction
self.rotation += self.rotationSpeed; // Add rotation
dustGraphics.alpha -= 0.01; // fade out at a medium pace
if (self.y > 2732 || dustGraphics.alpha <= 0) {
self.destroy();
}
};
});
// Assets will be automatically created and loaded by the LK engine based on their usage in the code.
// Hero class representing the player's spaceship
var Hero = Container.expand(function () {
var self = Container.call(this);
self.prevX = self.x; // Initialize prevX with the current x position
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.update = function () {
if (self.y > 2375) {
self.y -= self.speed;
}
// Add rotation based on movement direction
if (self.x > self.prevX) {
self.rotation += Math.PI / 180 * 1; // Rotate 1 degree to the right
if (self.rotation > Math.PI / 180 * 5) {
self.rotation = Math.PI / 180 * 5;
}
} else if (self.x < self.prevX) {
self.rotation -= Math.PI / 180 * 1; // Rotate 1 degree to the left
if (self.rotation < Math.PI / 180 * -5) {
self.rotation = Math.PI / 180 * -5;
}
} else {
if (self.rotation > 0) {
self.rotation -= Math.PI / 180 * 1;
if (self.rotation < 0) {
self.rotation = 0;
}
} else if (self.rotation < 0) {
self.rotation += Math.PI / 180 * 1;
if (self.rotation > 0) {
self.rotation = 0;
}
}
}
self.prevX = self.x; // Store the current x position for the next frame
// Add scale change to simulate footsteps
if (LK.ticks % 24 < 12) {
self.scale.x = 1.02;
} else {
self.scale.x = 0.98;
}
};
});
// Bullet class for hero's bullets
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('heroBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.Type = 'standard'; // Default type for bullets
self.Power = 1; // Default power level for bullets
self.update = function () {
self.y += self.speed;
if (self.y < 0) {
self.destroy();
}
};
});
// RailingLeft class for the scrolling left railing
var RailingLeft = Container.expand(function (assetType) {
var self = Container.call(this);
var railingGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0
});
self.speed = 2;
self.update = function () {
self.y += self.speed;
if (self.y >= 2732) {
self.y = -2732;
}
};
});
// RailingRight class for the scrolling right railing
var RailingRight = Container.expand(function (assetType) {
var self = Container.call(this);
var railingGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0
});
self.speed = 2;
self.update = function () {
self.y += self.speed;
if (self.y >= 2732) {
self.y = -2732;
}
};
});
// RoadScroll class for the scrolling road
var RoadScroll = Container.expand(function (assetType) {
var self = Container.call(this);
var roadGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0
});
if (assetType === 'CityBackgroundHD') {
self.speed = 1;
} else {
self.speed = 2;
}
self.update = function () {
self.y += self.speed;
if (self.y >= 2732) {
self.y = -2732;
}
};
});
// TitleScreen class for the title screen
var TitleScreen = Container.expand(function () {
var self = Container.call(this);
// Attach game logo
var logo = self.attachAsset('GameLogoHD', {
anchorX: 0.5,
anchorY: 0.5
});
logo.x = 2048 / 2;
logo.y = 2732 / 2 - 200;
// Attach play button
var playButton = self.attachAsset('PlayButton', {
anchorX: 0.5,
anchorY: 0.5
});
playButton.x = 2048 / 2;
playButton.y = logo.y + logo.height / 2 + playButton.height / 2 + 50;
// Event handler for play button
playButton.down = function (x, y, obj) {
isTitle = false;
isStarted = true;
self.destroy();
startGame();
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
// Initialize the city background for parallax effect
var cityBackground1 = game.addChild(new RoadScroll('CityBackgroundHD'));
var cityBackground2 = game.addChild(new RoadScroll('CityBackgroundHD'));
cityBackground1.x = 2048 / 2;
cityBackground2.x = 2048 / 2;
cityBackground1.y = 0;
cityBackground2.y = -2732;
// Initialize the road instances
var road1 = game.addChild(new RoadScroll('Road'));
var road2 = game.addChild(new RoadScroll('Road2'));
road2.x = 2048 / 2;
road1.x = 2048 / 2;
road1.y = 0;
road2.y = -2732;
// Initialize the left railing instances
var railingLeft1 = game.addChild(new RailingLeft('RailingStart'));
var railingLeft2 = game.addChild(new RailingLeft('RailingEnd'));
railingLeft1.x = 2048 * 0.16;
railingLeft2.x = 2048 * 0.16;
railingLeft1.y = 0;
railingLeft2.y = -2732;
// Initialize the right railing instances
var railingRight1 = game.addChild(new RailingRight('RailingEnd'));
var railingRight2 = game.addChild(new RailingRight('RailingStart'));
railingRight1.x = 2048 * 0.81; // Moved left by 3%
railingRight2.x = 2048 * 0.81; // Moved left by 3%
railingRight1.y = 0;
railingRight2.y = -2732;
// Initialize game state variables
var isTitle = true;
var isStarted = false;
// Initialize title screen
if (isTitle) {
var titleScreen = game.addChild(new TitleScreen());
}
// Function to start the game
function startGame() {
// Initialize hero
hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 + hero.height;
// Initialize enemies and bullets arrays
enemies = [];
heroBullets = [];
}
// Initialize variables
var hero;
var enemies = [];
var heroBullets = [];
// Function to handle game updates
game.update = function () {
// Update the city background instances for parallax effect
cityBackground1.update();
cityBackground2.update();
// Update the road instances
road1.update();
road2.update();
// Update the left railing instances
railingLeft1.update();
railingLeft2.update();
// Update the right railing instances
railingRight1.update();
railingRight2.update();
if (isStarted) {
if (dragNode) {
hero.x = dragNode.x;
hero.y = dragNode.y;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
if (enemies[i].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
// Update hero bullets
for (var j = heroBullets.length - 1; j >= 0; j--) {
heroBullets[j].update();
for (var k = enemies.length - 1; k >= 0; k--) {
if (heroBullets[j].intersects(enemies[k]) && enemies[k].y > 0) {
enemies[k].HitPoints -= heroBullets[j].Power;
// Apply an increased push back effect
if (!(enemies[k] instanceof Bruiser)) {
enemies[k].y -= 12; // Push the drone upwards slightly more
}
enemies[k].pulseEffect = true; // Trigger pulse effect
heroBullets[j].destroy();
heroBullets.splice(j, 1);
if (enemies[k].HitPoints <= 0) {
if (enemies[k] instanceof Drone) {
// Create drone pieces upon destruction
var centerPiece = new DronePiece('DroneCenterPart');
centerPiece.x = enemies[k].x;
centerPiece.y = enemies[k].y;
game.addChild(centerPiece);
var leftPiece = new DronePiece('DroneLeftPart');
leftPiece.x = enemies[k].x - 40; // Increase spread
leftPiece.y = enemies[k].y;
game.addChild(leftPiece);
var rightPiece = new DronePiece('DroneRightPart');
rightPiece.x = enemies[k].x + 40; // Increase spread
rightPiece.y = enemies[k].y;
game.addChild(rightPiece);
} else if (enemies[k] instanceof Bruiser) {
// Create bruiser pieces upon destruction
var centerPiece = new BruiserPiece('BruiserCenterPart');
centerPiece.x = enemies[k].x;
centerPiece.y = enemies[k].y;
game.addChild(centerPiece);
var leftPiece = new BruiserPiece('BruiserLeftPart');
leftPiece.x = enemies[k].x - 40; // Increase spread
leftPiece.y = enemies[k].y;
game.addChild(leftPiece);
var rightPiece = new BruiserPiece('BruiserRightPart');
rightPiece.x = enemies[k].x + 40; // Increase spread
rightPiece.y = enemies[k].y;
game.addChild(rightPiece);
}
enemies[k].destroy();
enemies.splice(k, 1);
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
}
break;
}
}
}
// Spawn Drones in groups of 2-3 within the Road area
if (LK.ticks % 120 == 0) {
var numberOfDrones = Math.floor(Math.random() * 2) + 2; // Randomly choose between 2 and 3 drones
for (var i = 0; i < numberOfDrones; i++) {
var newDrone = new Drone();
newDrone.x = 2048 * 0.21 + Math.random() * (2048 * 0.55); // Adjusted x position within the Road area with 5% margin
newDrone.y = -newDrone.height; // Start just outside the top of the screen
enemies.push(newDrone);
game.addChild(newDrone);
}
}
// Spawn Bruisers occasionally
if (LK.ticks % 360 == 0) {
var newBruiser = new Bruiser();
newBruiser.x = 2048 * 0.21 + Math.random() * (2048 * 0.55); // Adjusted x position within the Road area with 5% margin
newBruiser.y = -newBruiser.height; // Start just outside the top of the screen
enemies.push(newBruiser);
game.addChild(newBruiser);
}
// Fire bullets
if (LK.ticks % 18 == 0) {
var newBullet = new HeroBullet();
newBullet.x = hero.x;
newBullet.y = hero.y - hero.height / 2;
heroBullets.push(newBullet);
game.addChild(newBullet);
}
// Generate dust particles in sync with player pulsing
if (LK.ticks % 24 == 0) {
var newDust = new Dust();
newDust.x = hero.x - hero.width / 4; // Move dust spawn position right half as much as the last move
newDust.y = hero.y + hero.height / 2 * 0.93; // Move dust spawn point up 3% more
game.addChild(newDust);
} else if (LK.ticks % 24 == 12) {
var newDust = new Dust();
newDust.x = hero.x + hero.width / 4; // Create another dust spawn point an equal distance in from the right of the player asset
newDust.y = hero.y + hero.height / 2 * 0.93; // Move dust spawn point up 3% more
game.addChild(newDust);
}
}
};
// Handle touch input for hero movement
var dragNode = null;
game.down = function (x, y, obj) {
if (isStarted) {
dragNode = {
x: hero.x,
y: hero.y
};
// Add a tilt-back effect during initial movement
hero.rotation = x > hero.x ? Math.PI / 180 * -1 : Math.PI / 180 * 1;
}
};
game.move = function (x, y, obj) {
if (isStarted && dragNode) {
// Add a slight delay to the drag control to make the player feel like it has more weight
dragNode.x += (x - dragNode.x) * 0.1;
dragNode.y = hero.y; // Lock the y position to the hero's initial y position
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Display score
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.setText(LK.getScore());
View of a futuristic soldier from directly overhead. White armor with blue glowing cyberpunk details. Holding weapon forward.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
The lights of a futuristic city in the dark at night. Very high above it looking straight down like from an airplane or a map. Background for an endlessly scrolling game.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A big button that say Play to start playing a game. Use neon cyberpunk style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Overhead view. A hovering robot with a tapered midsection with two bulky arms with claw like hands and a giant red “eye” on top of its body. Looking straight down. Cyberpunk, black with red glowing highlights.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Overhead view. A heavily armored attack robot. Two arms with large gauntlet type fists. Four large red glowing eyes. Three distinct parts, body and two arms. Symmetrical design. Birds Eye view above them looking down on their head. Simple shapes. Low detail. Cyberpunk, black with red glowing highlights.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A red glowing line. Bright red core with subtle outer glow. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A blue transparent dome type shield. Simple graphics. Low details. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A ring of nuclear fire seen from overhead. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A thin robot with goggles riding a hover-bike. Twin blaster guns mounted on front. Top down view. Birds Eye view. Cyberpunk with red glowing highlights... Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Battle drone, circular. White with blue glowing highlights. Birds Eye view from overhead. Cyberpunk. Simple shapes.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
GameTheme
Music
TitleTheme
Music
HeroBlaster
Sound effect
Explosion
Sound effect
PowerUp
Sound effect
CloneSoldier
Sound effect
WeaponPowerUp
Sound effect
Drone
Sound effect
BinaryStorm
Sound effect
LaserCharge
Sound effect
LaserFire
Sound effect
BruiserStomp
Sound effect
RaiderSwoop
Sound effect
ShieldLevelUp
Sound effect
HeroHit
Sound effect
HeroScream
Sound effect