User prompt
add more bullet levels and more enemy types and other bosses
User prompt
add more bullet levels and more enemy types and other bosses
User prompt
make assest cool and realistic
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'weaponTxt.style.fill = 0x66ffff;' Line Number: 741
User prompt
add level upp and new weaponnnsss and make realistic enemy aliens and spaceships
Code edit (1 edits merged)
Please save this source code
User prompt
Cosmic Defender: Orbital Showdown
User prompt
Please continue polishing my design document.
Initial prompt
Make a drawing game, have 5 levels and ask us to draw something in each level, but after the 5th level, let's make it a horror game where we become enemies with the things we draw.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 20;
self.maxHealth = 20;
self.points = 2000;
self.speed = 1;
self.phase = 1;
self.fireRate = 60; // Frames between shots
self.lastShot = 0;
self.movementTimer = 0;
self.attacking = false;
self.update = function () {
// Boss enters from top
if (self.y < 400) {
self.y += self.speed;
} else {
self.attacking = true;
// Phase-based movement
if (self.phase === 1) {
// Side-to-side movement
self.x += Math.sin(self.movementTimer / 30) * 5;
self.movementTimer++;
// Regular shooting
self.lastShot++;
if (self.lastShot >= self.fireRate) {
self.shoot();
self.lastShot = 0;
}
} else if (self.phase === 2) {
// More aggressive movement
self.x += Math.sin(self.movementTimer / 20) * 7;
self.y += Math.cos(self.movementTimer / 40) * 2;
self.movementTimer++;
// More frequent shooting
self.lastShot++;
if (self.lastShot >= self.fireRate * 0.7) {
self.shoot();
self.lastShot = 0;
}
} else if (self.phase === 3) {
// Erratic movement
self.x += Math.sin(self.movementTimer / 10) * 8;
self.y += Math.cos(self.movementTimer / 15) * 3;
self.movementTimer++;
// Rapid shooting
self.lastShot++;
if (self.lastShot >= self.fireRate * 0.4) {
self.shoot();
self.lastShot = 0;
}
}
}
// Change phase based on health
if (self.health <= self.maxHealth * 0.65 && self.phase === 1) {
self.phase = 2;
LK.effects.flashObject(self, 0xff0000, 500);
} else if (self.health <= self.maxHealth * 0.3 && self.phase === 2) {
self.phase = 3;
LK.effects.flashObject(self, 0xff0000, 500);
}
};
self.shoot = function () {
// Different shot patterns based on phase
if (self.phase === 1) {
// Single shot
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 80;
game.addChild(bullet);
enemyBullets.push(bullet);
} else if (self.phase === 2) {
// Double shot
for (var i = -1; i <= 1; i += 2) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 50;
bullet.y = self.y + 80;
game.addChild(bullet);
enemyBullets.push(bullet);
}
} else if (self.phase === 3) {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 50;
bullet.y = self.y + 80;
game.addChild(bullet);
enemyBullets.push(bullet);
}
}
LK.getSound('enemyShoot').play();
};
self.takeDamage = function (amount) {
self.health -= amount;
// Flash when taking damage
LK.effects.flashObject(self, 0xffffff, 200);
if (self.health <= 0) {
// Multiple explosions for boss
for (var i = 0; i < 5; i++) {
var explosion = new Explosion();
explosion.x = self.x + (Math.random() * 200 - 100);
explosion.y = self.y + (Math.random() * 100 - 50);
game.addChild(explosion);
}
// Add points to score
score += self.points;
updateScore();
// Drop power-up
var powerUp = new PowerUp();
powerUp.x = self.x;
powerUp.y = self.y;
powerUp.type = "weapon";
game.addChild(powerUp);
powerUps.push(powerUp);
LK.getSound('explosion').play();
// Level complete
levelComplete = true;
self.destroy();
return true;
}
return false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 1;
self.points = 100;
self.speed = 2;
self.fireRate = 180; // Frames between shots
self.lastShot = 0;
self.movementPattern = "straight"; // Default movement
self.movementTimer = 0;
self.update = function () {
// Handle movement patterns
if (self.movementPattern === "straight") {
self.y += self.speed;
} else if (self.movementPattern === "zigzag") {
self.y += self.speed;
self.x += Math.sin(self.movementTimer / 20) * 3;
self.movementTimer++;
} else if (self.movementPattern === "circle") {
self.y += self.speed * 0.7;
self.x += Math.sin(self.movementTimer / 15) * 4;
self.movementTimer++;
}
// Shooting logic
self.lastShot++;
if (self.lastShot >= self.fireRate && self.y > 0 && Math.random() < 0.3) {
self.shoot();
self.lastShot = 0;
}
};
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 40;
game.addChild(bullet);
enemyBullets.push(bullet);
LK.getSound('enemyShoot').play();
};
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
// Create explosion
var explosion = new Explosion();
explosion.x = self.x;
explosion.y = self.y;
game.addChild(explosion);
// Add points to score
score += self.points;
updateScore();
// Random chance to drop power-up
if (Math.random() < 0.1) {
var powerUp = new PowerUp();
powerUp.x = self.x;
powerUp.y = self.y;
// Random power-up type
var rand = Math.random();
if (rand < 0.6) {
powerUp.type = "weapon";
} else {
powerUp.type = "shield";
}
game.addChild(powerUp);
powerUps.push(powerUp);
}
LK.getSound('explosion').play();
self.destroy();
return true;
}
return false;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.damage = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
self.lifetime = 30; // frames
self.update = function () {
self.lifetime--;
// Scale up and fade out
explosionGraphics.scale.x = 1 + (30 - self.lifetime) / 15;
explosionGraphics.scale.y = 1 + (30 - self.lifetime) / 15;
explosionGraphics.alpha = self.lifetime / 30;
if (self.lifetime <= 0) {
self.destroy();
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.maxHealth = 3;
self.weaponLevel = 1;
self.weaponTimer = 0;
self.speed = 10;
self.fireRate = 15; // Frames between shots
self.lastShot = 0;
self.shieldActive = false;
self.shieldTimer = 0;
self.invulnerable = false;
self.invulnerabilityTimer = 0;
self.update = function () {
// Decrement timers
if (self.weaponTimer > 0) {
self.weaponTimer--;
if (self.weaponTimer === 0) {
self.weaponLevel = 1; // Reset weapon level when timer expires
}
}
if (self.shieldActive) {
self.shieldTimer--;
if (self.shieldTimer === 0) {
self.shieldActive = false;
}
}
if (self.invulnerable) {
self.invulnerabilityTimer--;
// Flash while invulnerable
self.visible = self.invulnerabilityTimer % 6 < 3;
if (self.invulnerabilityTimer === 0) {
self.invulnerable = false;
self.visible = true;
}
}
// Auto-fire
self.lastShot++;
if (self.lastShot >= self.fireRate) {
self.shoot();
self.lastShot = 0;
}
};
self.shoot = function () {
if (self.weaponLevel === 1) {
// Single shot
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 40;
game.addChild(bullet);
playerBullets.push(bullet);
} else if (self.weaponLevel === 2) {
// Double shot
for (var i = -1; i <= 1; i += 2) {
var bullet = new PlayerBullet();
bullet.x = self.x + i * 20;
bullet.y = self.y - 40;
game.addChild(bullet);
playerBullets.push(bullet);
}
} else if (self.weaponLevel >= 3) {
// Triple shot
for (var i = -1; i <= 1; i++) {
var bullet = new PlayerBullet();
bullet.x = self.x + i * 25;
bullet.y = self.y - 40;
game.addChild(bullet);
playerBullets.push(bullet);
}
}
LK.getSound('playerShoot').play();
};
self.takeDamage = function (amount) {
if (self.invulnerable) {
return false;
}
if (self.shieldActive) {
// Shield absorbs the hit
self.shieldActive = false;
self.shieldTimer = 0;
return false;
}
self.health -= amount;
LK.getSound('damage').play();
// Make player invulnerable briefly
self.invulnerable = true;
self.invulnerabilityTimer = 90; // 1.5 seconds at 60fps
if (self.health <= 0) {
// Game over logic
var explosion = new Explosion();
explosion.x = self.x;
explosion.y = self.y;
game.addChild(explosion);
LK.getSound('explosion').play();
// Record high score if needed
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
}
gameOver = true;
return true;
}
return false;
};
self.collectPowerUp = function (powerUp) {
if (powerUp.type === "weapon") {
self.weaponLevel = Math.min(self.weaponLevel + 1, 3);
self.weaponTimer = 600; // 10 seconds at 60fps
} else if (powerUp.type === "shield") {
self.shieldActive = true;
self.shieldTimer = 600; // 10 seconds at 60fps
}
LK.getSound('powerUp').play();
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.damage = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = "weapon"; // Default type
self.speed = 5;
self.update = function () {
self.y += self.speed;
// Slight oscillation for visual effect
self.x += Math.sin(LK.ticks / 10) * 1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
// Game variables
var score = 0;
var highScore = storage.highScore || 0;
var level = 1;
var enemySpawnTimer = 0;
var enemySpawnRate = 60; // Frames between enemy spawns
var playerBullets = [];
var enemyBullets = [];
var enemies = [];
var powerUps = [];
var bossSpawned = false;
var levelComplete = false;
var gameOver = false;
var nextEnemy = 0;
// UI elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topLeft.addChild(levelTxt);
// Move it away from the top-left corner
levelTxt.x = 200;
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0xFFFFFF
});
healthTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(healthTxt);
// Create player
var player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
// Function to update score display
function updateScore() {
scoreTxt.setText('Score: ' + score);
// Update LK score system for leaderboards
LK.setScore(score);
}
// Function to update health display
function updateHealth() {
healthTxt.setText('Health: ' + player.health);
}
// Function to update level display
function updateLevel() {
levelTxt.setText('Level: ' + level);
}
// Function to spawn regular enemies
function spawnEnemy() {
var enemy = new Enemy();
// Random position at top of screen
enemy.x = 200 + Math.random() * (2048 - 400);
enemy.y = -100;
// Different enemy types based on level
if (level === 1) {
enemy.health = 1;
enemy.movementPattern = "straight";
enemy.fireRate = 180;
} else if (level === 2) {
// Level 2 has tougher enemies
if (Math.random() < 0.5) {
enemy.health = 2;
enemy.points = 200;
enemy.movementPattern = "zigzag";
enemy.fireRate = 150;
} else {
enemy.health = 1;
enemy.movementPattern = "straight";
enemy.fireRate = 180;
}
} else if (level >= 3) {
// Level 3+ has even tougher enemies
var rand = Math.random();
if (rand < 0.4) {
enemy.health = 3;
enemy.points = 300;
enemy.movementPattern = "circle";
enemy.fireRate = 120;
} else if (rand < 0.7) {
enemy.health = 2;
enemy.points = 200;
enemy.movementPattern = "zigzag";
enemy.fireRate = 150;
} else {
enemy.health = 1;
enemy.movementPattern = "straight";
enemy.fireRate = 180;
}
}
game.addChild(enemy);
enemies.push(enemy);
}
// Function to spawn boss
function spawnBoss() {
var boss = new Boss();
boss.x = 2048 / 2;
boss.y = -200;
// Scale boss difficulty with level
boss.health = 20 + (level - 1) * 10;
boss.maxHealth = boss.health;
game.addChild(boss);
enemies.push(boss);
bossSpawned = true;
}
// Function to start the next level
function startNextLevel() {
level++;
updateLevel();
enemies = [];
enemyBullets = [];
bossSpawned = false;
levelComplete = false;
nextEnemy = 0;
// Speed up enemy spawns as level increases
enemySpawnRate = Math.max(60 - (level - 1) * 5, 30);
}
// Mouse/Touch handlers
var dragNode = null;
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp position to stay on screen
dragNode.x = Math.max(60, Math.min(x, 2048 - 60));
dragNode.y = Math.max(60, Math.min(y, 2732 - 60));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game update loop
game.update = function () {
if (gameOver) {
// Show game over screen
LK.showGameOver();
return;
}
if (levelComplete) {
startNextLevel();
}
// Update player
player.update();
updateHealth();
// Spawn enemies
if (!bossSpawned) {
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnRate) {
enemySpawnTimer = 0;
spawnEnemy();
nextEnemy++;
// Spawn boss after certain number of enemies
if (nextEnemy >= 15 + level * 5) {
spawnBoss();
}
}
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
// Check if bullet is off screen
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check for collisions with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage(bullet.damage)) {
enemies.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
// Check if bullet is off screen
if (bullet.y > 2732 + 50) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check for collision with player
if (bullet.intersects(player)) {
if (player.takeDamage(bullet.damage)) {
// Player destroyed, game over
gameOver = true;
}
bullet.destroy();
enemyBullets.splice(i, 1);
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Check if enemy is off screen
if (enemy.y > 2732 + 100) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check for collision with player
if (enemy.intersects(player)) {
if (player.takeDamage(1)) {
// Player destroyed, game over
gameOver = true;
}
// Enemy also takes damage
if (enemy.takeDamage(1)) {
enemies.splice(i, 1);
}
continue;
}
}
// Update power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
// Check if power-up is off screen
if (powerUp.y > 2732 + 50) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check for collision with player
if (powerUp.intersects(player)) {
player.collectPowerUp(powerUp);
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Check if level is complete (no enemies and boss killed)
if (bossSpawned && enemies.length === 0) {
levelComplete = true;
}
};
// Start background music
LK.playMusic('bgMusic'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,655 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ var bossGraphics = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 20;
+ self.maxHealth = 20;
+ self.points = 2000;
+ self.speed = 1;
+ self.phase = 1;
+ self.fireRate = 60; // Frames between shots
+ self.lastShot = 0;
+ self.movementTimer = 0;
+ self.attacking = false;
+ self.update = function () {
+ // Boss enters from top
+ if (self.y < 400) {
+ self.y += self.speed;
+ } else {
+ self.attacking = true;
+ // Phase-based movement
+ if (self.phase === 1) {
+ // Side-to-side movement
+ self.x += Math.sin(self.movementTimer / 30) * 5;
+ self.movementTimer++;
+ // Regular shooting
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate) {
+ self.shoot();
+ self.lastShot = 0;
+ }
+ } else if (self.phase === 2) {
+ // More aggressive movement
+ self.x += Math.sin(self.movementTimer / 20) * 7;
+ self.y += Math.cos(self.movementTimer / 40) * 2;
+ self.movementTimer++;
+ // More frequent shooting
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate * 0.7) {
+ self.shoot();
+ self.lastShot = 0;
+ }
+ } else if (self.phase === 3) {
+ // Erratic movement
+ self.x += Math.sin(self.movementTimer / 10) * 8;
+ self.y += Math.cos(self.movementTimer / 15) * 3;
+ self.movementTimer++;
+ // Rapid shooting
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate * 0.4) {
+ self.shoot();
+ self.lastShot = 0;
+ }
+ }
+ }
+ // Change phase based on health
+ if (self.health <= self.maxHealth * 0.65 && self.phase === 1) {
+ self.phase = 2;
+ LK.effects.flashObject(self, 0xff0000, 500);
+ } else if (self.health <= self.maxHealth * 0.3 && self.phase === 2) {
+ self.phase = 3;
+ LK.effects.flashObject(self, 0xff0000, 500);
+ }
+ };
+ self.shoot = function () {
+ // Different shot patterns based on phase
+ if (self.phase === 1) {
+ // Single shot
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 80;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ } else if (self.phase === 2) {
+ // Double shot
+ for (var i = -1; i <= 1; i += 2) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x + i * 50;
+ bullet.y = self.y + 80;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ }
+ } else if (self.phase === 3) {
+ // Triple shot
+ for (var i = -1; i <= 1; i++) {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x + i * 50;
+ bullet.y = self.y + 80;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ }
+ }
+ LK.getSound('enemyShoot').play();
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ // Flash when taking damage
+ LK.effects.flashObject(self, 0xffffff, 200);
+ if (self.health <= 0) {
+ // Multiple explosions for boss
+ for (var i = 0; i < 5; i++) {
+ var explosion = new Explosion();
+ explosion.x = self.x + (Math.random() * 200 - 100);
+ explosion.y = self.y + (Math.random() * 100 - 50);
+ game.addChild(explosion);
+ }
+ // Add points to score
+ score += self.points;
+ updateScore();
+ // Drop power-up
+ var powerUp = new PowerUp();
+ powerUp.x = self.x;
+ powerUp.y = self.y;
+ powerUp.type = "weapon";
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+ LK.getSound('explosion').play();
+ // Level complete
+ levelComplete = true;
+ self.destroy();
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 1;
+ self.points = 100;
+ self.speed = 2;
+ self.fireRate = 180; // Frames between shots
+ self.lastShot = 0;
+ self.movementPattern = "straight"; // Default movement
+ self.movementTimer = 0;
+ self.update = function () {
+ // Handle movement patterns
+ if (self.movementPattern === "straight") {
+ self.y += self.speed;
+ } else if (self.movementPattern === "zigzag") {
+ self.y += self.speed;
+ self.x += Math.sin(self.movementTimer / 20) * 3;
+ self.movementTimer++;
+ } else if (self.movementPattern === "circle") {
+ self.y += self.speed * 0.7;
+ self.x += Math.sin(self.movementTimer / 15) * 4;
+ self.movementTimer++;
+ }
+ // Shooting logic
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate && self.y > 0 && Math.random() < 0.3) {
+ self.shoot();
+ self.lastShot = 0;
+ }
+ };
+ self.shoot = function () {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 40;
+ game.addChild(bullet);
+ enemyBullets.push(bullet);
+ LK.getSound('enemyShoot').play();
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ if (self.health <= 0) {
+ // Create explosion
+ var explosion = new Explosion();
+ explosion.x = self.x;
+ explosion.y = self.y;
+ game.addChild(explosion);
+ // Add points to score
+ score += self.points;
+ updateScore();
+ // Random chance to drop power-up
+ if (Math.random() < 0.1) {
+ var powerUp = new PowerUp();
+ powerUp.x = self.x;
+ powerUp.y = self.y;
+ // Random power-up type
+ var rand = Math.random();
+ if (rand < 0.6) {
+ powerUp.type = "weapon";
+ } else {
+ powerUp.type = "shield";
+ }
+ game.addChild(powerUp);
+ powerUps.push(powerUp);
+ }
+ LK.getSound('explosion').play();
+ self.destroy();
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.damage = 1;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ var explosionGraphics = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.9
+ });
+ self.lifetime = 30; // frames
+ self.update = function () {
+ self.lifetime--;
+ // Scale up and fade out
+ explosionGraphics.scale.x = 1 + (30 - self.lifetime) / 15;
+ explosionGraphics.scale.y = 1 + (30 - self.lifetime) / 15;
+ explosionGraphics.alpha = self.lifetime / 30;
+ if (self.lifetime <= 0) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 3;
+ self.maxHealth = 3;
+ self.weaponLevel = 1;
+ self.weaponTimer = 0;
+ self.speed = 10;
+ self.fireRate = 15; // Frames between shots
+ self.lastShot = 0;
+ self.shieldActive = false;
+ self.shieldTimer = 0;
+ self.invulnerable = false;
+ self.invulnerabilityTimer = 0;
+ self.update = function () {
+ // Decrement timers
+ if (self.weaponTimer > 0) {
+ self.weaponTimer--;
+ if (self.weaponTimer === 0) {
+ self.weaponLevel = 1; // Reset weapon level when timer expires
+ }
+ }
+ if (self.shieldActive) {
+ self.shieldTimer--;
+ if (self.shieldTimer === 0) {
+ self.shieldActive = false;
+ }
+ }
+ if (self.invulnerable) {
+ self.invulnerabilityTimer--;
+ // Flash while invulnerable
+ self.visible = self.invulnerabilityTimer % 6 < 3;
+ if (self.invulnerabilityTimer === 0) {
+ self.invulnerable = false;
+ self.visible = true;
+ }
+ }
+ // Auto-fire
+ self.lastShot++;
+ if (self.lastShot >= self.fireRate) {
+ self.shoot();
+ self.lastShot = 0;
+ }
+ };
+ self.shoot = function () {
+ if (self.weaponLevel === 1) {
+ // Single shot
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 40;
+ game.addChild(bullet);
+ playerBullets.push(bullet);
+ } else if (self.weaponLevel === 2) {
+ // Double shot
+ for (var i = -1; i <= 1; i += 2) {
+ var bullet = new PlayerBullet();
+ bullet.x = self.x + i * 20;
+ bullet.y = self.y - 40;
+ game.addChild(bullet);
+ playerBullets.push(bullet);
+ }
+ } else if (self.weaponLevel >= 3) {
+ // Triple shot
+ for (var i = -1; i <= 1; i++) {
+ var bullet = new PlayerBullet();
+ bullet.x = self.x + i * 25;
+ bullet.y = self.y - 40;
+ game.addChild(bullet);
+ playerBullets.push(bullet);
+ }
+ }
+ LK.getSound('playerShoot').play();
+ };
+ self.takeDamage = function (amount) {
+ if (self.invulnerable) {
+ return false;
+ }
+ if (self.shieldActive) {
+ // Shield absorbs the hit
+ self.shieldActive = false;
+ self.shieldTimer = 0;
+ return false;
+ }
+ self.health -= amount;
+ LK.getSound('damage').play();
+ // Make player invulnerable briefly
+ self.invulnerable = true;
+ self.invulnerabilityTimer = 90; // 1.5 seconds at 60fps
+ if (self.health <= 0) {
+ // Game over logic
+ var explosion = new Explosion();
+ explosion.x = self.x;
+ explosion.y = self.y;
+ game.addChild(explosion);
+ LK.getSound('explosion').play();
+ // Record high score if needed
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ }
+ gameOver = true;
+ return true;
+ }
+ return false;
+ };
+ self.collectPowerUp = function (powerUp) {
+ if (powerUp.type === "weapon") {
+ self.weaponLevel = Math.min(self.weaponLevel + 1, 3);
+ self.weaponTimer = 600; // 10 seconds at 60fps
+ } else if (powerUp.type === "shield") {
+ self.shieldActive = true;
+ self.shieldTimer = 600; // 10 seconds at 60fps
+ }
+ LK.getSound('powerUp').play();
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -15;
+ self.damage = 1;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = "weapon"; // Default type
+ self.speed = 5;
+ self.update = function () {
+ self.y += self.speed;
+ // Slight oscillation for visual effect
+ self.x += Math.sin(LK.ticks / 10) * 1;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var score = 0;
+var highScore = storage.highScore || 0;
+var level = 1;
+var enemySpawnTimer = 0;
+var enemySpawnRate = 60; // Frames between enemy spawns
+var playerBullets = [];
+var enemyBullets = [];
+var enemies = [];
+var powerUps = [];
+var bossSpawned = false;
+var levelComplete = false;
+var gameOver = false;
+var nextEnemy = 0;
+// UI elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(1, 0);
+LK.gui.topLeft.addChild(levelTxt);
+// Move it away from the top-left corner
+levelTxt.x = 200;
+var healthTxt = new Text2('Health: 3', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+healthTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(healthTxt);
+// Create player
+var player = new Player();
+player.x = 2048 / 2;
+player.y = 2732 - 300;
+game.addChild(player);
+// Function to update score display
+function updateScore() {
+ scoreTxt.setText('Score: ' + score);
+ // Update LK score system for leaderboards
+ LK.setScore(score);
+}
+// Function to update health display
+function updateHealth() {
+ healthTxt.setText('Health: ' + player.health);
+}
+// Function to update level display
+function updateLevel() {
+ levelTxt.setText('Level: ' + level);
+}
+// Function to spawn regular enemies
+function spawnEnemy() {
+ var enemy = new Enemy();
+ // Random position at top of screen
+ enemy.x = 200 + Math.random() * (2048 - 400);
+ enemy.y = -100;
+ // Different enemy types based on level
+ if (level === 1) {
+ enemy.health = 1;
+ enemy.movementPattern = "straight";
+ enemy.fireRate = 180;
+ } else if (level === 2) {
+ // Level 2 has tougher enemies
+ if (Math.random() < 0.5) {
+ enemy.health = 2;
+ enemy.points = 200;
+ enemy.movementPattern = "zigzag";
+ enemy.fireRate = 150;
+ } else {
+ enemy.health = 1;
+ enemy.movementPattern = "straight";
+ enemy.fireRate = 180;
+ }
+ } else if (level >= 3) {
+ // Level 3+ has even tougher enemies
+ var rand = Math.random();
+ if (rand < 0.4) {
+ enemy.health = 3;
+ enemy.points = 300;
+ enemy.movementPattern = "circle";
+ enemy.fireRate = 120;
+ } else if (rand < 0.7) {
+ enemy.health = 2;
+ enemy.points = 200;
+ enemy.movementPattern = "zigzag";
+ enemy.fireRate = 150;
+ } else {
+ enemy.health = 1;
+ enemy.movementPattern = "straight";
+ enemy.fireRate = 180;
+ }
+ }
+ game.addChild(enemy);
+ enemies.push(enemy);
+}
+// Function to spawn boss
+function spawnBoss() {
+ var boss = new Boss();
+ boss.x = 2048 / 2;
+ boss.y = -200;
+ // Scale boss difficulty with level
+ boss.health = 20 + (level - 1) * 10;
+ boss.maxHealth = boss.health;
+ game.addChild(boss);
+ enemies.push(boss);
+ bossSpawned = true;
+}
+// Function to start the next level
+function startNextLevel() {
+ level++;
+ updateLevel();
+ enemies = [];
+ enemyBullets = [];
+ bossSpawned = false;
+ levelComplete = false;
+ nextEnemy = 0;
+ // Speed up enemy spawns as level increases
+ enemySpawnRate = Math.max(60 - (level - 1) * 5, 30);
+}
+// Mouse/Touch handlers
+var dragNode = null;
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ // Clamp position to stay on screen
+ dragNode.x = Math.max(60, Math.min(x, 2048 - 60));
+ dragNode.y = Math.max(60, Math.min(y, 2732 - 60));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = player;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game update loop
+game.update = function () {
+ if (gameOver) {
+ // Show game over screen
+ LK.showGameOver();
+ return;
+ }
+ if (levelComplete) {
+ startNextLevel();
+ }
+ // Update player
+ player.update();
+ updateHealth();
+ // Spawn enemies
+ if (!bossSpawned) {
+ enemySpawnTimer++;
+ if (enemySpawnTimer >= enemySpawnRate) {
+ enemySpawnTimer = 0;
+ spawnEnemy();
+ nextEnemy++;
+ // Spawn boss after certain number of enemies
+ if (nextEnemy >= 15 + level * 5) {
+ spawnBoss();
+ }
+ }
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ // Check if bullet is off screen
+ if (bullet.y < -50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check for collisions with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ if (enemy.takeDamage(bullet.damage)) {
+ enemies.splice(j, 1);
+ }
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ // Check if bullet is off screen
+ if (bullet.y > 2732 + 50) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check for collision with player
+ if (bullet.intersects(player)) {
+ if (player.takeDamage(bullet.damage)) {
+ // Player destroyed, game over
+ gameOver = true;
+ }
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ // Check if enemy is off screen
+ if (enemy.y > 2732 + 100) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check for collision with player
+ if (enemy.intersects(player)) {
+ if (player.takeDamage(1)) {
+ // Player destroyed, game over
+ gameOver = true;
+ }
+ // Enemy also takes damage
+ if (enemy.takeDamage(1)) {
+ enemies.splice(i, 1);
+ }
+ continue;
+ }
+ }
+ // Update power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ // Check if power-up is off screen
+ if (powerUp.y > 2732 + 50) {
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ continue;
+ }
+ // Check for collision with player
+ if (powerUp.intersects(player)) {
+ player.collectPowerUp(powerUp);
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+ // Check if level is complete (no enemies and boss killed)
+ if (bossSpawned && enemies.length === 0) {
+ levelComplete = true;
+ }
+};
+// Start background music
+LK.playMusic('bgMusic');
\ No newline at end of file
a boss robot space ship . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a enemy space ship. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a red enemy bullet plasma. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a enemy space ship crarrier ship. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a explosion. In-Game asset. 2d. High contrast. No shadows
a enemy space ship hunter ship. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a blue plasma laser. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a blue plasma flame fire. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a player bullet. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a player space ship good. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a level up power up orb. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a tiny enemy ship. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a shield. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat