Code edit (3 edits merged)
Please save this source code
User prompt
hide the upgradebutton and availableboonstxt when there are no minorbooncount or majorbooncount
Code edit (3 edits merged)
Please save this source code
User prompt
Remove the play button and logic associated with it
Code edit (1 edits merged)
Please save this source code
User prompt
When leveling up, after incrementing the boon counts, set the availableBoonsTxt text to the sum of minorBoonCount and majorBoonCount
Code edit (4 edits merged)
Please save this source code
User prompt
instead of creating a boonSelection when leveling up, create a function called showBoonSelection which is called when clicking the upgradeButton
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'TypeError: LK.setInverval is not a function' in this line: 'LK.setInverval(function () {' Line Number: 43
Code edit (1 edits merged)
Please save this source code
User prompt
bloodsplatters should fade out over their lifetime
User prompt
Remove score increment
User prompt
Remove the score
Code edit (1 edits merged)
Please save this source code
User prompt
when leveling up, increase a new minorBoonCount variable by 1, or a new majorBoonCount by 1 if the level is a factor of 5
Code edit (2 edits merged)
Please save this source code
User prompt
Fix Bug: 'ReferenceError: minorBoonsLevels is not defined' in this line: 'return minorBoonsLevels[boon] < 5;' Line Number: 117
Code edit (1 edits merged)
Please save this source code
User prompt
Assets created in MinorBoonSelection should be attached to self not boonPopup
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'var boonLevel = new Text2(boonLevels[selectedBoons[i]] + ' ' + selectedBoons[i], {' Line Number: 146
User prompt
showMinorBoonSelection should be converted into a Container called MinorBoonSelection
Code edit (4 edits merged)
Please save this source code
User prompt
add an image asset to the start button
Code edit (1 edits merged)
Please save this source code
var BorderedText = Container.expand(function (string, settings) {
var self = Container.call(this);
var textList = [];
var offsets = [[-2, -2], [-2, 2], [2, 2], [2, -2], [0, 0]];
for (var i = 0; i < offsets.length; i++) {
var text = new Text2(string, settings);
text.x += offsets[i][0];
text.y += offsets[i][1];
textList.push(text);
self.addChild(text);
}
self.setText = function (string) {
for (var i = 0; i < textList.length; i++) {
textList[i].setText(string);
}
};
});
var ExperiencePickup = Container.expand(function (hero) {
var self = Container.call(this);
var pickupGraphics = self.createAsset('experiencePickup', 'Experience Pickup', .5, .5);
self.active = false;
self.move = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 400) {
self.active = true;
}
if (self.active) {
self.x += dx / distance * 20;
self.y += dy / distance * 20;
}
};
});
var CrucifixPickup = Container.expand(function () {
var self = Container.call(this);
var pickupGraphics = self.createAsset('crucifixPickup', 'Crucifix Pickup', .5, .5);
});
var BloodSplatter = Container.expand(function () {
var self = Container.call(this);
var splatterGraphics = self.createAsset('bloodSplatter', 'Blood Splatter', .5, .5);
self.lifetime = 0.2;
LK.setTimeout(function () {
self.destroy();
}, self.lifetime * 1000);
});
var HealingPickup = Container.expand(function () {
var self = Container.call(this);
var pickupGraphics = self.createAsset('healingPickup', 'Healing Pickup', .5, .5);
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('bullet', 'Bullet Graphics', .5, .5);
self.speed = 30;
self.travelDistance = 200;
self.move = function () {
self.x += self.speed * Math.cos(self.angle);
self.y += self.speed * Math.sin(self.angle);
self.rotation += 0.2;
self.travelDistance -= Math.abs(self.speed);
if (self.travelDistance <= 0 && self.speed > -30) {
self.speed -= 1;
}
};
});
var Enemy = Container.expand(function (hero) {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy character', .5, .5);
self.creationTick = LK.ticks;
self.health = 1;
self.move = function () {
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 100) {
self.x += dx / distance * 1.8;
self.y += dy / distance * 1.8 + Math.sin((LK.ticks - self.creationTick) / 10) * 2;
} else {
hero.health -= 1;
if (hero.health <= 0) {
LK.showGameOver();
}
}
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', .5, .5);
self.health = 100;
self.healthBarBorder = self.createAsset('healthBarBorder', 'Health Bar Border', 0.5, 1);
self.healthBarBorder.y = -115;
self.healthBar = self.createAsset('healthBar', 'Health Bar', 0.5, 1);
self.healthBar.y = -120;
self.healthBarBorder.x = self.healthBar.x;
self.healthBarBorder.width = self.healthBar.width + 10;
self.healthBarBorder.height = self.healthBar.height + 10;
self.move = function () {
self.healthBar.scale.x = self.health / 100;
if (self.targetPos) {
var dx = self.targetPos.x - self.x;
var dy = self.targetPos.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * 10;
self.y += dy / distance * 10;
} else {
self.x = self.targetPos.x;
self.y = self.targetPos.y;
self.targetPos = null;
}
}
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
function showMinorBoonSelection() {
isPaused = true;
var boons = ['Luck', 'Scale', 'Range', 'Damage', 'Rearm'];
var selectedBoons = [];
while (selectedBoons.length < 3) {
var boon = boons[Math.floor(Math.random() * boons.length)];
if (!selectedBoons.includes(boon)) {
selectedBoons.push(boon);
}
}
var boonPopup = LK.gui.center.createAsset('boonPopup', 'Boon Selection Popup', 0.5, 0.5);
var boonMessage1 = new Text2('Choose', {
size: 60,
fill: '#ffffff',
font: 'bold monospace'
});
boonMessage1.anchor.set(.5, 0);
boonMessage1.y = -190;
boonPopup.addChild(boonMessage1);
var boonMessage2 = new Text2('Minor Boon', {
size: 50,
fill: '#ffffff',
font: 'bold monospace'
});
boonMessage2.anchor.set(.5, 0);
boonMessage2.y = -130;
boonPopup.addChild(boonMessage2);
for (var i = 0; i < selectedBoons.length; i++) {
var boonButton = boonPopup.createAsset('boonButton', selectedBoons[i] + ' Boon Button', 0.5, 0.5);
boonButton.y = i * 120;
boonButton.x = -120;
boonButton.index = i;
var boonLevel = new Text2(boonLevels[selectedBoons[i]] + ' ' + selectedBoons[i], {
size: 50,
fill: '#ffffff',
font: 'bold monospace'
});
boonLevel.anchor.set(0, .5);
boonLevel.y = boonButton.y;
boonLevel.x = boonButton.x - 130;
boonPopup.addChild(boonLevel);
boonButton.on('down', function () {
boonLevels[boons[this.index]]++;
boonPopup.destroy();
isPaused = false;
});
}
}
;
var isPaused = true;
var grass = self.createAsset('grass', 'Grass Background', 0, 0);
var playButton = LK.gui.center.createAsset('playButton', 'Play Button', 0.5, 0.5);
playButton.on('down', function () {
isPaused = false;
playButton.destroy();
});
grass.width = 2048;
grass.height = 2732;
self.addChild(grass);
var hero = new Hero();
var canMove = false;
var score = 0;
var experience = 0;
var level = 1;
var levelRequirement = 20;
var countdown = 300;
var boonLevels = {
'Luck': 0,
'Scale': 0,
'Range': 0,
'Damage': 0,
'Rearm': 0
};
var countdownTxt = new Text2('05:00', {
size: 60,
fill: '#ffffff',
font: 'bold monospace'
});
var availableBoonsTxt = new Text2('0', {
size: 50,
fill: '#ff0000',
font: 'bold monospace'
});
var updateButton = LK.gui.topRight.createAsset('updateButton', 'Update Button', 0.5, 0.5);
LK.gui.topRight.addChild(availableBoonsTxt);
updateButton.x = -70;
updateButton.y = 70;
availableBoonsTxt.anchor.set(.5, .5);
availableBoonsTxt.x = -70;
availableBoonsTxt.y = 70;
updateButton.on('down', function () {});
var levelTxt = new Text2('Level ' + level + ' • XP', {
size: 80,
fill: '#ffffff',
font: 'bold monospace'
});
var progressBarBorder = LK.getAsset('progressBarBorder', 'Progress Bar Border', 0, .5);
var progressBar = LK.getAsset('progressBar', 'Progress Bar', 0, .5);
LK.gui.topCenter.addChild(progressBarBorder);
LK.gui.topCenter.addChild(progressBar);
LK.gui.topCenter.addChild(levelTxt);
LK.gui.topCenter.addChild(countdownTxt);
progressBarBorder.x = 20;
progressBarBorder.y = levelTxt.y + levelTxt.height / 2;
progressBar.x = 24;
progressBar.y = levelTxt.y + levelTxt.height / 2;
progressBar.scale.x = 0;
levelTxt.anchor.set(1.0, 0);
countdownTxt.y = levelTxt.height + 10;
countdownTxt.anchor.set(.5, 0);
LK.on('tick', function () {
if (!isPaused && LK.ticks % 60 === 0) {
countdown--;
var minutes = Math.floor(countdown / 60);
var seconds = countdown % 60;
countdownTxt.setText('0' + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
}
});
var heroBullets = [];
var enemyBullets = [];
var enemies = [];
var healthPickups = [];
var crucifixPickups = [];
var experiencePickups = [];
hero.x = 2048 / 2;
hero.y = 2732 / 2;
self.targetPos = null;
stage.on('down', function (obj) {
canMove = true;
hero.targetPos = obj.event.getLocalPosition(self);
});
stage.on('up', function (obj) {
canMove = false;
hero.targetPos = null;
});
var shootPos = null;
stage.on('move', function (obj) {
if (canMove) {
hero.targetPos = obj.event.getLocalPosition(self);
}
shootPos = obj.event.getLocalPosition(self);
if (!isPaused) {
if (shootPos.x < hero.x) {
hero.scale.x = -1;
} else {
hero.scale.x = 1;
}
}
});
self.addChild(hero);
var spawnEnemy = function () {
var side = Math.floor(Math.random() * 4);
var enemy = new Enemy(hero);
switch (side) {
case 0:
enemy.x = Math.random() * 2048;
enemy.y = 0;
break;
case 1:
enemy.x = 2048;
enemy.y = Math.random() * 2732;
break;
case 2:
enemy.x = Math.random() * 2048;
enemy.y = 2732;
break;
case 3:
enemy.x = 0;
enemy.y = Math.random() * 2732;
break;
}
enemies.push(enemy);
self.addChild(enemy);
};
LK.on('tick', function () {
if (!isPaused) {
hero.move();
for (var i = 0; i < heroBullets.length; i++) {
var heroBullet = heroBullets[i];
heroBullet.move();
if ((heroBullet.x < 0 || heroBullet.x > 2048 || heroBullet.y < 0 || heroBullet.y > 2732) && heroBullet.travelDistance < -1200 || heroBullet.intersects(hero) && heroBullet.speed < 0) {
heroBullet.destroy();
heroBullets.splice(i, 1);
i--;
}
}
for (var i = 0; i < enemyBullets.length; i++) {
enemyBullets[i].move();
}
for (var i = 0; i < enemies.length; i++) {
enemies[i].move();
for (var j = 0; j < heroBullets.length; j++) {
if (heroBullets[j].intersects(enemies[i])) {
enemies[i].health -= 10 + 5 * boonLevels['Damage'];
if (enemies[i].health <= 0) {
if (crucifixPickups.length < 1 && Math.random() < Math.sqrt(boonLevels['Luck'])) {
var crucifixPickup = new CrucifixPickup();
crucifixPickup.x = enemies[i].x;
crucifixPickup.y = enemies[i].y;
self.addChild(crucifixPickup);
crucifixPickups.push(crucifixPickup);
} else if (healthPickups.length < 5) {
for (var k = 0; k <= boonLevels['Luck']; k++) {
if (Math.random() < 0.05) {
var pickup = new HealingPickup();
pickup.x = enemies[i].x;
pickup.y = enemies[i].y;
self.addChild(pickup);
healthPickups.push(pickup);
break;
}
}
}
for (var k = 0; k <= boonLevels['Luck']; k++) {
if (Math.random() < 0.5) {
var experiencePickup = new ExperiencePickup(hero);
experiencePickup.x = enemies[i].x + Math.random() * 100 - 50;
experiencePickup.y = enemies[i].y + Math.random() * 100 - 50;
self.addChild(experiencePickup);
experiencePickups.push(experiencePickup);
break;
}
}
var bloodSplatter = new BloodSplatter();
bloodSplatter.x = enemies[i].x;
bloodSplatter.y = enemies[i].y;
self.addChild(bloodSplatter);
enemies[i].destroy();
enemies.splice(i, 1);
score++;
i--;
break;
}
}
}
}
for (var i = 0; i < healthPickups.length; i++) {
if (hero.intersects(healthPickups[i])) {
hero.health = Math.min(100, hero.health + 10);
healthPickups[i].destroy();
healthPickups.splice(i, 1);
i--;
}
}
for (var i = 0; i < crucifixPickups.length; i++) {
if (hero.intersects(crucifixPickups[i])) {
for (var j = 0; j < enemies.length; j++) {
enemies[j].destroy();
}
enemies = [];
for (var j = 0; j < enemyBullets.length; j++) {
enemyBullets[j].destroy();
}
enemyBullets = [];
for (var j = 0; j < healthPickups.length; j++) {
healthPickups[j].destroy();
}
healthPickups = [];
for (var j = 0; j < crucifixPickups.length; j++) {
crucifixPickups[j].destroy();
}
crucifixPickups = [];
for (var j = 0; j < experiencePickups.length; j++) {
experiencePickups[j].active = true;
}
LK.effects.flashScreen(0xffffff, 1000);
break;
}
}
for (var i = 0; i < experiencePickups.length; i++) {
var experiencePickup = experiencePickups[i];
experiencePickup.move();
if (experiencePickup.intersects(hero)) {
experiencePickup.destroy();
experiencePickups.splice(i, 1);
experience++;
if (experience >= levelRequirement) {
level++;
experience -= levelRequirement;
levelRequirement = Math.floor(levelRequirement * 1.2);
levelTxt.setText('Level ' + level + ' • XP');
showMinorBoonSelection();
}
progressBar.scale.x = experience / levelRequirement;
i--;
}
}
if (LK.ticks % (60 - Math.floor(55 * (1 - countdown / 300))) === 0) {
spawnEnemy();
}
if (LK.ticks % Math.floor(120 / (1 + 0.25 * boonLevels['Rearm'])) === 0 && shootPos) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
var dx = shootPos.x - hero.x;
var dy = shootPos.y - hero.y;
bullet.angle = Math.atan2(dy, dx);
heroBullets.push(bullet);
self.addChild(bullet);
}
}
});
});
pixel art cross with blue accents Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a white orb. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a white orb with a halo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a pulsating white heart with a halo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a dark goo projectile with red highlights. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art tall blue fireball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of an evil fantasy sword facing downward. Minor red details. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
backgroundAmbient
Sound effect
heroHealed
Sound effect
pickupExperience
Sound effect
heroLeveled
Sound effect
weaponCrossImpact
Sound effect
heroImpact
Sound effect
enemyDeath
Sound effect
pickupWeapon
Sound effect
pickupCrucifix
Sound effect
weaponCrossLaunch
Sound effect
heroDeath
Sound effect
enemyRoar
Sound effect
clockChime
Sound effect