User prompt
play song1 in the background after starting game
User prompt
make sure sounds are only played once per bullet fired
User prompt
do not loop the sounds
User prompt
when enemy, tough enemy or boss enemy is destroyed play pew1
User prompt
when bullet is used play bullet1 sound
User prompt
add a flowery background
User prompt
currency is gained for killing enemy, tough enemy and boss enemy
User prompt
currency is not gained automatically
User prompt
add a currency
User prompt
after level 15 change the enemies to include enemy, tough enemy and boss enemy
User prompt
change Pfeilchen bullet to hit twice
User prompt
sonne should shoot automatically at all enemy types
User prompt
add sonne to the game
User prompt
reduce the frequency of fleisch by 90%
User prompt
Please fix the bug: 'TypeError: enemies[l].takeHit is not a function' in or related to this line: 'enemies[l].takeHit();' Line Number: 405
User prompt
after level 15 add 5 random enemy types to the normal enemy generation
User prompt
create bossenemy after lvl 10
User prompt
change boss to bossenemy
User prompt
fix enemy creation to have only 5 per level
User prompt
remove the automatic generation for enemies
User prompt
only create 5 enemies per level
User prompt
fix the level display displaying a wrong value
User prompt
rework the enemy and level design by creating one enemy for each level
User prompt
create a maximum of 5 enemies per level
User prompt
restrict level progression before all enemies are destroyed
/****
* Classes
****/
// Define a class for Aloe
var Aloe = Container.expand(function () {
var self = Container.call(this);
var aloeGraphics = self.attachAsset('aloe', {
anchorX: 0.5,
anchorY: 0.5
});
self.shieldActive = true; // Shield is active initially
// Method to deactivate the shield
self.deactivateShield = function () {
self.shieldActive = false;
self.destroy(); // Remove Aloe from the game
};
// Update method for Aloe
self.update = function () {
// Aloe follows the player
self.x = player.x;
self.y = player.y;
};
});
// Define a class for BossEnemy
var BossEnemy = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.hitPoints = 10; // Boss requires multiple hits to be destroyed
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = 0;
self.x = Math.random() * 2048;
}
};
self.takeHit = function () {
self.hitPoints -= 1;
if (self.hitPoints <= 0) {
self.destroy();
}
};
});
// Define a class for bullets
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -5;
self.update = function () {
self.x += self.speedX || 0;
self.y += self.speedY || self.speed;
if (self.y < 0 || self.x < 0 || self.x > 2048 || self.y > 2732) {
self.destroy();
}
};
});
// Define a class for the context menu
var ContextMenu = Container.expand(function () {
var self = Container.call(this);
var menuText = new Text2('Start Game', {
size: 150,
fill: 0xFFFFFF
});
menuText.anchor.set(0.5, 0.5);
self.addChild(menuText);
self.update = function () {
// Update logic for context menu
};
});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.hitPoints = 1; // Requires one hit to be destroyed
self.update = function () {
self.takeHit = function () {
self.hitPoints -= 1;
if (self.hitPoints <= 0) {
self.destroy();
}
};
self.y += self.speed;
if (self.y > 2732) {
self.y = 0;
self.x = Math.random() * 2048;
}
};
});
// Define a class for Fleisch
var Fleisch = Container.expand(function () {
var self = Container.call(this);
var fleischGraphics = self.attachAsset('Fleisch', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
// Add close distance multiple shots ability for Fleisch
if (LK.ticks % 600 == 0) {
for (var angle = -0.2; angle <= 0.2; angle += 0.1) {
var newBullet = new Bullet();
newBullet.x = self.x;
newBullet.y = self.y;
newBullet.speedX = Math.sin(angle) * self.speed;
newBullet.speedY = Math.cos(angle) * self.speed;
newBullet.lastY = newBullet.y;
newBullet.lastIntersecting = newBullet.intersects(centerNode);
bullets.push(newBullet);
game.addChild(newBullet);
}
}
};
});
// Define a class for Kaktus
var Kaktus = Container.expand(function () {
var self = Container.call(this);
var kaktusGraphics = self.attachAsset('Kaktus', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
// Check for collisions with all game objects
for (var i = game.children.length - 1; i >= 0; i--) {
if (self !== game.children[i] && self.intersects(game.children[i])) {
game.children[i].destroy();
}
}
};
});
// Define a class for Pfeilchen
var Pfeilchen = Container.expand(function () {
var self = Container.call(this);
var pfeilchenGraphics = self.attachAsset('Pfeilchen', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.shootDirection = 'up'; // Default shooting direction
// Method to shoot bullets in the specified direction
self.shoot = function () {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.speedX = 0; // Initialize speedX
bullet.speedY = 0; // Initialize speedY
switch (self.shootDirection) {
case 'up':
bullet.speedY = -self.speed;
break;
case 'down':
bullet.speedY = self.speed;
break;
case 'left':
bullet.speedX = -self.speed;
break;
case 'right':
bullet.speedX = self.speed;
break;
}
bullets.push(bullet);
game.addChild(bullet);
};
self.update = function () {
// Update logic for Pfeilchen
};
});
// Define a class for plants
var Plant = Container.expand(function () {
var self = Container.call(this);
self.update = function () {
// Update logic for plants
};
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.slot = 0; // Add slot property to player
self.currency = 0; // Initialize currency property
self.update = function () {
// Update logic for player
};
});
// Define a class for rose
var Rose = Container.expand(function () {
var self = Container.call(this);
var roseGraphics = self.attachAsset('rose', {
anchorX: 0.5,
anchorY: 0.5,
rotation: -Math.PI / 2 // Rotate 90 degrees to the left
});
self.speed = 5;
self.update = function () {
if (self.y < 0) {
self.destroy();
}
if (LK.ticks % 600 == 0) {
var newBullet = new Bullet();
newBullet.x = self.x;
newBullet.y = self.y;
var dx = fleisch.x - self.x;
var dy = fleisch.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
newBullet.speedX = dx / distance * self.speed;
newBullet.speedY = dy / distance * self.speed;
newBullet.lastY = newBullet.y;
newBullet.lastIntersecting = newBullet.intersects(centerNode);
bullets.push(newBullet);
game.addChild(newBullet);
}
};
});
// Define a class for Sonne
var Sonne = Container.expand(function () {
var self = Container.call(this);
var sonneGraphics = self.attachAsset('Sonne', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = 0;
self.x = Math.random() * 2048;
}
// Automatic shooting logic for Sonne
if (LK.ticks % 120 == 0) {
// Adjust the frequency as needed
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
var newBullet = new Bullet();
newBullet.x = self.x;
newBullet.y = self.y;
var dx = enemy.x - self.x;
var dy = enemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
newBullet.speedX = dx / distance * self.speed;
newBullet.speedY = dy / distance * self.speed;
newBullet.lastY = newBullet.y;
newBullet.lastIntersecting = newBullet.intersects(enemy);
bullets.push(newBullet);
game.addChild(newBullet);
}
}
};
});
// Define a class for ToughEnemy
var ToughEnemy = Container.expand(function () {
var self = Container.call(this);
var toughEnemyGraphics = self.attachAsset('toughEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.hitPoints = 2; // Requires two hits to be destroyed
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = 0;
self.x = Math.random() * 2048;
}
};
self.takeHit = function () {
self.hitPoints -= 1;
if (self.hitPoints <= 0) {
self.destroy();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
var background = LK.getAsset('floweryBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
game.addChild(background);
// Initialize Pfeilchen
var pfeilchen = game.addChild(new Pfeilchen());
pfeilchen.x = 1024; // Center horizontally on the screen
pfeilchen.y = 1466; // Move Pfeilchen 100 pixels down
// Initialize game state
var gameState = "menu";
// Initialize level
var level = 1;
// Initialize level text
var levelText;
// Initialize currency text
var currencyText = new Text2('Currency: 0', {
size: 100,
fill: 0xFFFFFF
});
currencyText.anchor.set(0.5, 0);
LK.gui.top.addChild(currencyText);
// Initialize context menu
var contextMenu = game.addChild(new ContextMenu());
contextMenu.x = 1024;
contextMenu.y = 1366;
// Initialize players
var players = [];
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
players.push(player);
// Initialize centerNode
var centerNode = game.addChild(LK.getAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Initialize Fleisch
var fleisch = game.addChild(new Fleisch());
fleisch.x = 1024; // Center horizontally on the screen
fleisch.y = 100; // Move Fleisch 80 pixels down from its current position
// Initialize rose
var rose = game.addChild(new Rose());
rose.x = 50; // Position at the left, accounting for asset width
rose.y = 2732 - 50; // Position at the bottom, accounting for asset height
// Initialize Aloe
var aloe = new Aloe();
aloe.x = player.x;
aloe.y = player.y;
game.addChild(aloe);
// Initialize Sonne
var sonne = game.addChild(new Sonne());
sonne.x = Math.random() * 2048;
sonne.y = Math.random() * 100;
// Initialize plants
var plants = [];
for (var i = 0; i < 5; i++) {
var plant = new Plant();
plant.x = Math.random() * 2048;
plant.y = Math.random() * 2732;
plants.push(plant);
game.addChild(plant);
}
// Add Kaktus to 4 random locations above Rose and below Fleisch
for (var j = 0; j < 4; j++) {
var kaktus = LK.getAsset('Kaktus', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 2048,
y: Math.random() * (fleisch.y - rose.y) + rose.y
});
game.addChild(kaktus);
}
// Initialize enemies
var enemies = [];
// Initialize bullets
var bullets = [];
// Handle player movement
game.move = function (x, y, obj) {
player.x = x;
player.y = y;
};
// Handle shooting
game.down = function (x, y, obj) {
if (gameState === "menu") {
gameState = "playing";
contextMenu.destroy();
// Initialize level text
levelText = new Text2('Level: ' + level, {
size: 100,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(levelText);
// Removed automatic enemy generation when game starts
} else if (gameState === "playing") {
// Handle shooting for Pfeilchen
// Determine shooting direction based on player input
if (x < pfeilchen.x) {
pfeilchen.shootDirection = 'left';
} else if (x > pfeilchen.x) {
pfeilchen.shootDirection = 'right';
} else if (y < pfeilchen.y) {
pfeilchen.shootDirection = 'up';
} else {
pfeilchen.shootDirection = 'down';
}
pfeilchen.shoot();
// Handle shooting for Player
var playerBullet = new Bullet();
playerBullet.x = player.x;
playerBullet.y = player.y;
playerBullet.speedX = (x - player.x) / Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2)) * player.speed;
playerBullet.speedY = (y - player.y) / Math.sqrt(Math.pow(x - player.x, 2) + Math.pow(y - player.y, 2)) * player.speed;
bullets.push(playerBullet);
game.addChild(playerBullet);
}
};
// Update game state
game.update = function () {
if (gameState === "playing") {
// Update player
player.update();
// Update enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update bullets
for (var j = bullets.length - 1; j >= 0; j--) {
bullets[j].update();
if (bullets[j].y < 0 || bullets[j].x < 0 || bullets[j].x > 2048 || bullets[j].y > 2732) {
bullets.splice(j, 1);
}
}
// Check for collisions
for (var k = bullets.length - 1; k >= 0; k--) {
for (var l = enemies.length - 1; l >= 0; l--) {
if (bullets[k].intersects(enemies[l])) {
bullets[k].destroy();
bullets.splice(k, 1);
enemies[l].takeHit();
if (enemies[l].hitPoints <= 0) {
player.currency += enemies[l] instanceof BossEnemy ? 10 : enemies[l] instanceof ToughEnemy ? 5 : 1;
currencyText.setText('Currency: ' + player.currency);
enemies.splice(l, 1);
}
break;
}
}
}
// Check for collisions between player and enemies
for (var m = 0; m < players.length; m++) {
for (var n = enemies.length - 1; n >= 0; n--) {
if (players[m].intersects(enemies[n])) {
if (aloe.shieldActive) {
aloe.deactivateShield(); // Use Aloe's shield to take the hit
} else {
players[m].destroy();
players.splice(m, 1);
}
break;
}
}
}
// Check for collisions between any object and Kaktus
for (var j = bullets.length - 1; j >= 0; j--) {
if (bullets[j].intersects(kaktus)) {
bullets[j].destroy();
bullets.splice(j, 1);
}
}
for (var m = 0; m < players.length; m++) {
if (players[m].intersects(kaktus)) {
if (aloe.shieldActive) {
aloe.deactivateShield(); // Use Aloe's shield to take the hit
} else {
players[m].destroy();
players.splice(m, 1);
}
}
}
for (var n = enemies.length - 1; n >= 0; n--) {
for (var k = 0; k < game.children.length; k++) {
if (game.children[k] instanceof Kaktus && enemies[n].intersects(game.children[k])) {
enemies[n].destroy();
enemies.splice(n, 1);
break;
}
}
}
// Display game over when no players are left
if (players.length === 0) {
LK.showGameOver();
}
// Reinitialize rose when it's destroyed
if (!rose.parent) {
rose = game.addChild(LK.getAsset('rose', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 1366
}));
}
// Increase level and start the next level immediately if all enemies are destroyed
if (enemies.length === 0) {
level++;
levelText.setText('Level: ' + level);
// Generate enemies for the next level
var enemyCount = 5; // Limit the number of enemies to 5 per level
for (var i = 0; i < enemyCount; i++) {
var enemy;
if (level > 15) {
enemy = Math.random() < 0.33 ? new BossEnemy() : Math.random() < 0.5 ? new ToughEnemy() : new Enemy();
} else if (level > 10) {
enemy = new BossEnemy();
} else if (level > 5) {
enemy = new ToughEnemy();
} else {
enemy = new Enemy();
}
enemy.x = Math.random() * 2048;
enemy.y = Math.random() * 1000;
enemies.push(enemy);
game.addChild(enemy);
}
}
} else if (gameState === "menu") {
// Update context menu
contextMenu.update();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -288,14 +288,21 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x000000 //Init game with black background
+ backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
+var background = LK.getAsset('floweryBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+});
+game.addChild(background);
// Initialize Pfeilchen
var pfeilchen = game.addChild(new Pfeilchen());
pfeilchen.x = 1024; // Center horizontally on the screen
pfeilchen.y = 1466; // Move Pfeilchen 100 pixels down
2D squirrel with cowboy hat. Single Game Texture. In-Game asset. 2d. High contrast. No shadows
crosshair. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Aloe. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
meat eating plant. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
fly. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
red dot. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
rose. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Cactee. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
pfeilchen flower. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
sparkling sun. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Lock. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows