Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'boonLevels[boon]++;' Line Number: 431
User prompt
Fix Bug: 'ReferenceError: minorBoons is not defined' in this line: 'var availableBoons = Object.keys(minorBoons).filter(function (boon) {' Line Number: 126
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'for (var k = 0; k <= boonLevels['Luck']; k++) {' Line Number: 326
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'for (var k = 0; k <= boonLevels['Luck']; k++) {' Line Number: 315
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'if (crucifixPickups.length < 1 && Math.random() < Math.sqrt(boonLevels['Luck']) / 100) {' Line Number: 308
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'enemies[i].health -= 10 + 5 * boonLevels['Damage'];' Line Number: 306
Code edit (2 edits merged)
Please save this source code
User prompt
Fix Bug: 'ReferenceError: boonLevels is not defined' in this line: 'if (LK.ticks % Math.floor(120 / (1 + 0.25 * boonLevels['Rearm'])) === 0 && shootPos) {' Line Number: 408
User prompt
change variable name from `boonLevels` to `minorBoonLevels`. Make sure to update all occurrences of the variable
Code edit (1 edits merged)
Please save this source code
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
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 BoonSelection = Container.expand(function (boons, type, callback) {
var self = Container.call(this);
var availableBoons = Object.keys(boons).filter(function (boon) {
return boons[boon] < 5;
});
if (!availableBoons.length) {
self.destroy();
callback();
}
var selectedBoons = [];
while (selectedBoons.length < 3 && availableBoons.length > 0) {
var boonIndex = Math.floor(Math.random() * availableBoons.length);
selectedBoons.push(availableBoons.splice(boonIndex, 1)[0]);
}
var background = self.createAsset('boonBackground', 'Boon Selection Popup', 0.5, 0.5);
var boonMessageTitle = new Text2('Choose', {
size: 60,
fill: '#ffffff',
font: 'bold monospace'
});
background.y = 50;
boonMessageTitle.anchor.set(.5, 0);
boonMessageTitle.y = -220;
self.addChild(boonMessageTitle);
var boonMessageSubtitle = new Text2(type + ' Boon', {
size: 50,
fill: '#ffffff',
font: 'bold monospace'
});
boonMessageSubtitle.anchor.set(.5, 0);
boonMessageSubtitle.y = -160;
self.addChild(boonMessageSubtitle);
for (var i = 0; i < selectedBoons.length; i++) {
var boon = selectedBoons[i];
var boonButton = self.createAsset('boonButton', boon + ' Boon Button', 0.5, 0.5);
boonButton.y = i * 120;
boonButton.x = -100;
boonButton.on('down', function () {
self.destroy();
callback(boons, boon);
});
var boonLevel = new Text2(boons[boon], {
size: 50,
fill: '#ffffff',
font: 'bold monospace'
});
boonLevel.anchor.set(.5, .5);
boonLevel.y = boonButton.y;
boonLevel.x = boonButton.x;
self.addChild(boonLevel);
var boonName = new Text2(boon, {
size: 50,
fill: '#ffffff',
font: 'bold monospace'
});
boonName.anchor.set(0, .5);
boonName.y = boonButton.y;
boonName.x = boonButton.x + 60;
self.addChild(boonName);
}
});
var Game = Container.expand(function () {
var self = Container.call(this);
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 experience = 0;
var level = 1;
var levelRequirement = 20;
var countdown = 300;
var boonLevels = {
'Luck': 0,
'Scale': 0,
'Range': 0,
'Damage': 0,
'Rearm': 0
};
var minorBoonCount = 0;
var majorBoonCount = 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 boonCallback = function (boons, boon) {
if (boons && boon) {
boons[boon]++;
}
isPaused = false;
};
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);
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');
var boonSelection;
isPaused = true;
if (level % 5) {
minorBoonCount++;
boonSelection = new BoonSelection(boonLevels, 'Minor', boonCallback);
} else {
majorBoonCount++;
boonSelection = new BoonSelection(boonLevels, 'Major', boonCallback);
}
LK.gui.center.addChild(boonSelection);
}
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