User prompt
Make when leveling up the game pauses and 3 show and can only pick one and then the game continues
User prompt
Make xp orbs be worth 1 xp and level need 10 xp and increses by 1.5x every level
User prompt
Make enemys have 1.2x more health every wave
User prompt
Make player regen 1 hp every second
User prompt
Make the health bar a little smaller
User prompt
Make so the player have a health bar and 100 hp and enemys deal 10
User prompt
Make so the player have a health bar and 100 hp and enemys deal 10
User prompt
make so the player moves with wasd keys
User prompt
make enemys drop xp orbs that when collected adds to a level ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make enemy hp bar drain when hit
User prompt
make bow shoot 50% slower and deal 50% less damage
User prompt
make enemys have hp and hp bar
User prompt
remove the power ups and make the bow shoot slower
User prompt
player starts with a arrow weapon
Code edit (1 edits merged)
Please save this source code
User prompt
Shadow Survivor
Initial prompt
rougelite survival
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.damage = 20;
self.targetX = 0;
self.targetY = 0;
self.lastPlayerCollision = false;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
var currentCollision = self.intersects(player);
if (!self.lastPlayerCollision && currentCollision) {
player.takeDamage(self.damage);
}
self.lastPlayerCollision = currentCollision;
};
return self;
});
var FastEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('fastEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.damage = 15;
self.targetX = 0;
self.targetY = 0;
self.lastPlayerCollision = false;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
var currentCollision = self.intersects(player);
if (!self.lastPlayerCollision && currentCollision) {
player.takeDamage(self.damage);
}
self.lastPlayerCollision = currentCollision;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 1;
self.hasShield = false;
self.shieldTime = 0;
self.damageMultiplier = 1;
self.damageMultiplierTime = 0;
self.invulnerable = false;
self.invulnerableTime = 0;
self.takeDamage = function (damage) {
if (self.invulnerable || self.hasShield) {
if (self.hasShield) {
self.hasShield = false;
self.shieldTime = 0;
playerGraphics.tint = 0xFFFFFF;
}
return;
}
self.health -= damage;
self.invulnerable = true;
self.invulnerableTime = 60; // 1 second of invulnerability
LK.getSound('playerDamage').play();
LK.effects.flashObject(self, 0xFF0000, 500);
if (self.health <= 0) {
self.health = 0;
gameOver = true;
}
};
self.heal = function (amount) {
self.health = Math.min(self.maxHealth, self.health + amount);
};
self.activateShield = function () {
self.hasShield = true;
self.shieldTime = 600; // 10 seconds
playerGraphics.tint = 0x9C27B0;
};
self.activateSpeed = function () {
self.speed = 2;
LK.setTimeout(function () {
self.speed = 1;
}, 5000);
};
self.activateDamageMultiplier = function () {
self.damageMultiplier = 2;
self.damageMultiplierTime = 600; // 10 seconds
playerGraphics.tint = 0xFFEB3B;
};
self.update = function () {
if (self.invulnerable) {
self.invulnerableTime--;
if (self.invulnerableTime <= 0) {
self.invulnerable = false;
}
}
if (self.hasShield) {
self.shieldTime--;
if (self.shieldTime <= 0) {
self.hasShield = false;
playerGraphics.tint = 0xFFFFFF;
}
}
if (self.damageMultiplierTime > 0) {
self.damageMultiplierTime--;
if (self.damageMultiplierTime <= 0) {
self.damageMultiplier = 1;
if (!self.hasShield) {
playerGraphics.tint = 0xFFFFFF;
}
}
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
self.type = 'health';
self.powerupGraphics = null;
self.lastPlayerCollision = false;
self.collected = false;
self.init = function (type) {
self.type = type;
var assetName = type + 'Powerup';
self.powerupGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
};
self.update = function () {
if (self.collected) return;
var currentCollision = self.intersects(player);
if (!self.lastPlayerCollision && currentCollision) {
self.collect();
}
self.lastPlayerCollision = currentCollision;
};
self.collect = function () {
if (self.collected) return;
self.collected = true;
LK.getSound('powerupCollect').play();
if (self.type === 'health') {
player.heal(30);
} else if (self.type === 'shield') {
player.activateShield();
} else if (self.type === 'speed') {
player.activateSpeed();
}
LK.effects.flashObject(self, 0xFFFFFF, 300);
LK.setTimeout(function () {
if (powerUps.indexOf(self) !== -1) {
powerUps.splice(powerUps.indexOf(self), 1);
self.destroy();
}
}, 100);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
var enemies = [];
var powerUps = [];
var gameOver = false;
var waveNumber = 1;
var enemiesSpawned = 0;
var enemiesPerWave = 5;
var spawnTimer = 0;
var powerUpTimer = 0;
var survivalTime = 0;
var dragNode = null;
// UI Elements
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0
});
var healthBar = LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0
});
LK.gui.top.addChild(healthBarBg);
LK.gui.top.addChild(healthBar);
var waveText = new Text2('Wave: 1', {
size: 80,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var timeText = new Text2('Time: 0s', {
size: 60,
fill: 0xFFFFFF
});
timeText.anchor.set(1, 0);
LK.gui.topRight.addChild(timeText);
// Position UI elements
healthBarBg.y = 120;
healthBar.y = 120;
waveText.y = 200;
timeText.y = 280;
timeText.x = -20;
function spawnEnemy() {
var enemy;
if (waveNumber > 3 && Math.random() < 0.3) {
enemy = new FastEnemy();
} else {
enemy = new Enemy();
}
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
enemy.x = Math.random() * 2048;
enemy.y = -50;
break;
case 1:
// Right
enemy.x = 2098;
enemy.y = Math.random() * 2732;
break;
case 2:
// Bottom
enemy.x = Math.random() * 2048;
enemy.y = 2782;
break;
case 3:
// Left
enemy.x = -50;
enemy.y = Math.random() * 2732;
break;
}
enemy.targetX = player.x;
enemy.targetY = player.y;
enemy.speed += Math.floor(waveNumber / 3) * 0.5;
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
function spawnPowerUp() {
var powerUp = new PowerUp();
var types = ['health', 'shield', 'speed'];
var type = types[Math.floor(Math.random() * types.length)];
powerUp.init(type);
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = Math.random() * 2400 + 166;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function updateHealthBar() {
var healthPercentage = player.health / player.maxHealth;
healthBar.width = 400 * healthPercentage;
if (healthPercentage > 0.6) {
healthBar.tint = 0x4CAF50;
} else if (healthPercentage > 0.3) {
healthBar.tint = 0xFFEB3B;
} else {
healthBar.tint = 0xFF5722;
}
}
function handleMove(x, y, obj) {
if (dragNode && !gameOver) {
var newX = Math.max(40, Math.min(2008, x));
var newY = Math.max(40, Math.min(2692, y));
var dx = newX - dragNode.x;
var dy = newY - dragNode.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var moveDistance = Math.min(distance, 8 * dragNode.speed);
dragNode.x += dx / distance * moveDistance;
dragNode.y += dy / distance * moveDistance;
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (!gameOver) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
if (gameOver) return;
survivalTime++;
// Update UI
updateHealthBar();
waveText.setText('Wave: ' + waveNumber);
timeText.setText('Time: ' + Math.floor(survivalTime / 60) + 's');
// Enemy spawning
spawnTimer++;
var spawnRate = Math.max(30, 120 - waveNumber * 5);
if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) {
spawnEnemy();
spawnTimer = 0;
}
// Power-up spawning
powerUpTimer++;
if (powerUpTimer >= 600 && powerUps.length < 2) {
// Every 10 seconds max 2 powerups
spawnPowerUp();
powerUpTimer = 0;
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.targetX = player.x;
enemy.targetY = player.y;
// Remove enemies that are too far off screen
if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) {
enemies.splice(i, 1);
enemy.destroy();
}
}
// Check wave completion
if (enemiesSpawned >= enemiesPerWave && enemies.length === 0) {
waveNumber++;
enemiesSpawned = 0;
enemiesPerWave = Math.min(20, 5 + waveNumber * 2);
// Bonus health for completing wave
player.heal(10);
LK.effects.flashScreen(0x4CAF50, 500);
}
// Clean up collected powerups
for (var j = powerUps.length - 1; j >= 0; j--) {
if (powerUps[j].collected) {
powerUps.splice(j, 1);
}
}
// Game over check
if (player.health <= 0) {
gameOver = true;
// Save best survival time
var bestTime = storage.bestTime || 0;
if (survivalTime > bestTime) {
storage.bestTime = survivalTime;
}
// Save total waves completed
var totalWaves = storage.totalWaves || 0;
storage.totalWaves = totalWaves + (waveNumber - 1);
LK.setScore(Math.floor(survivalTime / 60) + (waveNumber - 1) * 10);
LK.effects.flashScreen(0xFF0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,385 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1;
+ self.damage = 20;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.lastPlayerCollision = false;
+ self.update = function () {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 0) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ var currentCollision = self.intersects(player);
+ if (!self.lastPlayerCollision && currentCollision) {
+ player.takeDamage(self.damage);
+ }
+ self.lastPlayerCollision = currentCollision;
+ };
+ return self;
+});
+var FastEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('fastEnemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.damage = 15;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.lastPlayerCollision = false;
+ self.update = function () {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 0) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ var currentCollision = self.intersects(player);
+ if (!self.lastPlayerCollision && currentCollision) {
+ player.takeDamage(self.damage);
+ }
+ self.lastPlayerCollision = currentCollision;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.speed = 1;
+ self.hasShield = false;
+ self.shieldTime = 0;
+ self.damageMultiplier = 1;
+ self.damageMultiplierTime = 0;
+ self.invulnerable = false;
+ self.invulnerableTime = 0;
+ self.takeDamage = function (damage) {
+ if (self.invulnerable || self.hasShield) {
+ if (self.hasShield) {
+ self.hasShield = false;
+ self.shieldTime = 0;
+ playerGraphics.tint = 0xFFFFFF;
+ }
+ return;
+ }
+ self.health -= damage;
+ self.invulnerable = true;
+ self.invulnerableTime = 60; // 1 second of invulnerability
+ LK.getSound('playerDamage').play();
+ LK.effects.flashObject(self, 0xFF0000, 500);
+ if (self.health <= 0) {
+ self.health = 0;
+ gameOver = true;
+ }
+ };
+ self.heal = function (amount) {
+ self.health = Math.min(self.maxHealth, self.health + amount);
+ };
+ self.activateShield = function () {
+ self.hasShield = true;
+ self.shieldTime = 600; // 10 seconds
+ playerGraphics.tint = 0x9C27B0;
+ };
+ self.activateSpeed = function () {
+ self.speed = 2;
+ LK.setTimeout(function () {
+ self.speed = 1;
+ }, 5000);
+ };
+ self.activateDamageMultiplier = function () {
+ self.damageMultiplier = 2;
+ self.damageMultiplierTime = 600; // 10 seconds
+ playerGraphics.tint = 0xFFEB3B;
+ };
+ self.update = function () {
+ if (self.invulnerable) {
+ self.invulnerableTime--;
+ if (self.invulnerableTime <= 0) {
+ self.invulnerable = false;
+ }
+ }
+ if (self.hasShield) {
+ self.shieldTime--;
+ if (self.shieldTime <= 0) {
+ self.hasShield = false;
+ playerGraphics.tint = 0xFFFFFF;
+ }
+ }
+ if (self.damageMultiplierTime > 0) {
+ self.damageMultiplierTime--;
+ if (self.damageMultiplierTime <= 0) {
+ self.damageMultiplier = 1;
+ if (!self.hasShield) {
+ playerGraphics.tint = 0xFFFFFF;
+ }
+ }
+ }
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ self.type = 'health';
+ self.powerupGraphics = null;
+ self.lastPlayerCollision = false;
+ self.collected = false;
+ self.init = function (type) {
+ self.type = type;
+ var assetName = type + 'Powerup';
+ self.powerupGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ };
+ self.update = function () {
+ if (self.collected) return;
+ var currentCollision = self.intersects(player);
+ if (!self.lastPlayerCollision && currentCollision) {
+ self.collect();
+ }
+ self.lastPlayerCollision = currentCollision;
+ };
+ self.collect = function () {
+ if (self.collected) return;
+ self.collected = true;
+ LK.getSound('powerupCollect').play();
+ if (self.type === 'health') {
+ player.heal(30);
+ } else if (self.type === 'shield') {
+ player.activateShield();
+ } else if (self.type === 'speed') {
+ player.activateSpeed();
+ }
+ LK.effects.flashObject(self, 0xFFFFFF, 300);
+ LK.setTimeout(function () {
+ if (powerUps.indexOf(self) !== -1) {
+ powerUps.splice(powerUps.indexOf(self), 1);
+ self.destroy();
+ }
+ }, 100);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a1a1a
+});
+
+/****
+* Game Code
+****/
+var player = game.addChild(new Player());
+player.x = 1024;
+player.y = 1366;
+var enemies = [];
+var powerUps = [];
+var gameOver = false;
+var waveNumber = 1;
+var enemiesSpawned = 0;
+var enemiesPerWave = 5;
+var spawnTimer = 0;
+var powerUpTimer = 0;
+var survivalTime = 0;
+var dragNode = null;
+// UI Elements
+var healthBarBg = LK.getAsset('healthBarBg', {
+ anchorX: 0.5,
+ anchorY: 0
+});
+var healthBar = LK.getAsset('healthBar', {
+ anchorX: 0.5,
+ anchorY: 0
+});
+LK.gui.top.addChild(healthBarBg);
+LK.gui.top.addChild(healthBar);
+var waveText = new Text2('Wave: 1', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+waveText.anchor.set(0.5, 0);
+LK.gui.top.addChild(waveText);
+var timeText = new Text2('Time: 0s', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+timeText.anchor.set(1, 0);
+LK.gui.topRight.addChild(timeText);
+// Position UI elements
+healthBarBg.y = 120;
+healthBar.y = 120;
+waveText.y = 200;
+timeText.y = 280;
+timeText.x = -20;
+function spawnEnemy() {
+ var enemy;
+ if (waveNumber > 3 && Math.random() < 0.3) {
+ enemy = new FastEnemy();
+ } else {
+ enemy = new Enemy();
+ }
+ var side = Math.floor(Math.random() * 4);
+ switch (side) {
+ case 0:
+ // Top
+ enemy.x = Math.random() * 2048;
+ enemy.y = -50;
+ break;
+ case 1:
+ // Right
+ enemy.x = 2098;
+ enemy.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ enemy.x = Math.random() * 2048;
+ enemy.y = 2782;
+ break;
+ case 3:
+ // Left
+ enemy.x = -50;
+ enemy.y = Math.random() * 2732;
+ break;
+ }
+ enemy.targetX = player.x;
+ enemy.targetY = player.y;
+ enemy.speed += Math.floor(waveNumber / 3) * 0.5;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ enemiesSpawned++;
+}
+function spawnPowerUp() {
+ var powerUp = new PowerUp();
+ var types = ['health', 'shield', 'speed'];
+ var type = types[Math.floor(Math.random() * types.length)];
+ powerUp.init(type);
+ powerUp.x = Math.random() * 1800 + 124;
+ powerUp.y = Math.random() * 2400 + 166;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+}
+function updateHealthBar() {
+ var healthPercentage = player.health / player.maxHealth;
+ healthBar.width = 400 * healthPercentage;
+ if (healthPercentage > 0.6) {
+ healthBar.tint = 0x4CAF50;
+ } else if (healthPercentage > 0.3) {
+ healthBar.tint = 0xFFEB3B;
+ } else {
+ healthBar.tint = 0xFF5722;
+ }
+}
+function handleMove(x, y, obj) {
+ if (dragNode && !gameOver) {
+ var newX = Math.max(40, Math.min(2008, x));
+ var newY = Math.max(40, Math.min(2692, y));
+ var dx = newX - dragNode.x;
+ var dy = newY - dragNode.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 0) {
+ var moveDistance = Math.min(distance, 8 * dragNode.speed);
+ dragNode.x += dx / distance * moveDistance;
+ dragNode.y += dy / distance * moveDistance;
+ }
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ if (!gameOver) {
+ dragNode = player;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+game.update = function () {
+ if (gameOver) return;
+ survivalTime++;
+ // Update UI
+ updateHealthBar();
+ waveText.setText('Wave: ' + waveNumber);
+ timeText.setText('Time: ' + Math.floor(survivalTime / 60) + 's');
+ // Enemy spawning
+ spawnTimer++;
+ var spawnRate = Math.max(30, 120 - waveNumber * 5);
+ if (spawnTimer >= spawnRate && enemiesSpawned < enemiesPerWave) {
+ spawnEnemy();
+ spawnTimer = 0;
+ }
+ // Power-up spawning
+ powerUpTimer++;
+ if (powerUpTimer >= 600 && powerUps.length < 2) {
+ // Every 10 seconds max 2 powerups
+ spawnPowerUp();
+ powerUpTimer = 0;
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ enemy.targetX = player.x;
+ enemy.targetY = player.y;
+ // Remove enemies that are too far off screen
+ if (enemy.x < -200 || enemy.x > 2248 || enemy.y < -200 || enemy.y > 2932) {
+ enemies.splice(i, 1);
+ enemy.destroy();
+ }
+ }
+ // Check wave completion
+ if (enemiesSpawned >= enemiesPerWave && enemies.length === 0) {
+ waveNumber++;
+ enemiesSpawned = 0;
+ enemiesPerWave = Math.min(20, 5 + waveNumber * 2);
+ // Bonus health for completing wave
+ player.heal(10);
+ LK.effects.flashScreen(0x4CAF50, 500);
+ }
+ // Clean up collected powerups
+ for (var j = powerUps.length - 1; j >= 0; j--) {
+ if (powerUps[j].collected) {
+ powerUps.splice(j, 1);
+ }
+ }
+ // Game over check
+ if (player.health <= 0) {
+ gameOver = true;
+ // Save best survival time
+ var bestTime = storage.bestTime || 0;
+ if (survivalTime > bestTime) {
+ storage.bestTime = survivalTime;
+ }
+ // Save total waves completed
+ var totalWaves = storage.totalWaves || 0;
+ storage.totalWaves = totalWaves + (waveNumber - 1);
+ LK.setScore(Math.floor(survivalTime / 60) + (waveNumber - 1) * 10);
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1500);
+ }
+};
\ No newline at end of file