let powerUp = [];
const powerUps = {
choose(type, index) {
if (type === "gun") {
b.giveGuns(index)
// game.replaceTextLog = true;
// game.makeTextLog(`${game.SVGleftMouse} ${b.guns[index].name}
${b.guns[index].description}`, 500);
// game.replaceTextLog = false;
} else if (type === "field") {
mech.setField(index)
// game.replaceTextLog = true;
// game.makeTextLog(`${game.SVGrightMouse} ${mech.fieldUpgrades[mech.fieldMode].name}
${mech.fieldUpgrades[mech.fieldMode].description}`, 600);
// game.replaceTextLog = false;
} else if (type === "mod") {
b.giveMod(index)
// game.replaceTextLog = true;
// game.makeTextLog(`
${b.mods[index].name}
${b.mods[index].description}`, 500);
// game.replaceTextLog = false;
}
document.body.style.cursor = "none";
document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-background").style.display = "none"
game.paused = false;
game.isChoosing = false; //stops p from un pausing on key down
requestAnimationFrame(cycle);
},
cancel() {
document.body.style.cursor = "none";
document.getElementById("choose-grid").style.display = "none"
document.getElementById("choose-background").style.display = "none"
game.paused = false;
game.isChoosing = false; //stops p from un pausing on key down
requestAnimationFrame(cycle);
},
showDraft() {
document.getElementById("choose-grid").style.display = "grid"
document.getElementById("choose-background").style.display = "inline"
document.body.style.cursor = "auto";
game.paused = true;
game.isChoosing = true; //stops p from un pausing on key down
},
heal: {
name: "heal",
color: "#0eb",
size() {
return 40 * Math.sqrt(0.1 + Math.random() * 0.5);
},
effect() {
let heal = 0
for (let i = 0; i < b.modRecursiveHealing; i++) heal += ((this.size / 40) ** 2)
if (heal > 0) game.makeTextLog(" heal " + (Math.min(mech.maxHealth - mech.health, heal) * game.healScale * 100).toFixed(0) + "%", 300)
mech.addHealth(heal);
}
},
ammo: {
name: "ammo",
color: "#467",
size() {
return 17;
},
effect() {
//only get ammo for guns player has
let target;
// console.log(b.inventory.length)
if (b.inventory.length > 0) {
//add ammo to a gun in inventory
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]];
//try 3 more times to give ammo to a gun with ammo, not Infinity
if (target.ammo === Infinity) {
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (target.ammo === Infinity) {
target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
if (target.ammo === Infinity) target = b.guns[b.inventory[Math.floor(Math.random() * (b.inventory.length))]]
}
}
if (target.ammo === Infinity) {
mech.fieldMeter = mech.fieldEnergyMax;
if (!game.lastLogTime) game.makeTextLog("+energy", 300);
} else {
let ammo = Math.ceil((target.ammoPack * (1 + 0.1 * Math.random())));
if (level.isBuildRun) ammo = Math.floor(ammo * 1.1) //extra ammo on build run because no ammo from getting a new gun
target.ammo += ammo;
game.updateGunHUD();
game.makeTextLog(" +" + ammo + " ammo for " + target.name + "", 300);
}
} else {
// target = b.guns[Math.floor(Math.random() * b.guns.length)]; //if you don't have any guns just add ammo to a random gun you don't have yet
mech.fieldMeter = mech.fieldEnergyMax;
if (!game.lastLogTime) game.makeTextLog("+energy", 300);
}
}
},
field: {
name: "field",
color: "#0cf",
size() {
return 45;
},
effect() {
function pick(who, skip1 = -1, skip2 = -1, skip3 = -1) {
let options = [];
for (let i = 1; i < who.length; i++) {
if (i !== mech.fieldMode && i !== skip1 && i !== skip2 && i !== skip3) options.push(i);
}
if (options.length > 0) return options[Math.floor(Math.random() * options.length)]
}
let choice1 = pick(mech.fieldUpgrades)
let choice2 = pick(mech.fieldUpgrades, choice1)
let choice3 = -1
if (choice1 > -1) {
let text = `✕
choose a field
`
text += ` ${mech.fieldUpgrades[choice1].name}
${mech.fieldUpgrades[choice1].description}
`
if (choice2 > -1) text += ` ${mech.fieldUpgrades[choice2].name}
${mech.fieldUpgrades[choice2].description}
`
if (!b.isModBayesian) {
choice3 = pick(mech.fieldUpgrades, choice1, choice2)
if (choice3 > -1) text += ` ${mech.fieldUpgrades[choice3].name}
${mech.fieldUpgrades[choice3].description}
`
}
if (b.isModFourOptions) {
let choice4 = pick(mech.fieldUpgrades, choice1, choice2, choice3)
if (choice4 > -1) text += ` ${mech.fieldUpgrades[choice4].name}
${mech.fieldUpgrades[choice4].description}
`
}
// text += `${game.SVGrightMouse} activate the shield with the right mouse
fields shield you from damage
and let you pick up and throw blocks
`
document.getElementById("choose-grid").innerHTML = text
powerUps.showDraft();
} else {
powerUps.giveRandomAmmo()
}
}
},
mod: {
name: "mod",
color: "#a8f",
size() {
return 42;
},
effect() {
function pick(skip1 = -1, skip2 = -1, skip3 = -1) {
let options = [];
for (let i = 0; i < b.mods.length; i++) {
if (
b.mods[i].count < b.mods[i].maxCount &&
i !== skip1 && i !== skip2 && i !== skip3 &&
b.mods[i].allowed()
) {
options.push(i);
}
}
if (options.length > 0) return options[Math.floor(Math.random() * options.length)]
}
let choice1 = pick()
let choice2 = pick(choice1)
let choice3 = -1
if (choice1 > -1) {
let text = "✕
choose a mod
"
text += ` ${b.mods[choice1].description}
`
if (choice2 > -1) text += ` ${b.mods[choice2].description}
`
if (!b.isModBayesian) {
choice3 = pick(choice1, choice2)
if (choice3 > -1) text += ` ${b.mods[choice3].description}
`
}
if (b.isModFourOptions) {
let choice4 = pick(choice1, choice2, choice3)
if (choice4 > -1) text += ` ${b.mods[choice4].description}
`
}
document.getElementById("choose-grid").innerHTML = text
powerUps.showDraft();
} else {
powerUps.giveRandomAmmo()
}
}
},
gun: {
name: "gun",
color: "#26a",
size() {
return 35;
},
effect() {
function pick(who, skip1 = -1, skip2 = -1, skip3 = -1) {
let options = [];
for (let i = 0; i < who.length; i++) {
if (!who[i].have && i !== skip1 && i !== skip2 && i !== skip3) options.push(i);
}
if (options.length > 0) return options[Math.floor(Math.random() * options.length)]
}
let choice1 = pick(b.guns)
let choice2 = pick(b.guns, choice1)
let choice3 = -1
if (choice1 > -1) {
let text = "✕
choose a gun
"
text += ` ${b.guns[choice1].description}
`
if (choice2 > -1) text += ` ${b.guns[choice2].description}
`
if (!b.isModBayesian) {
choice3 = pick(b.guns, choice1, choice2)
if (choice3 > -1) text += ` ${b.guns[choice3].description}
`
}
if (b.isModFourOptions) {
let choice4 = pick(b.guns, choice1, choice2, choice3)
if (choice4 > -1) text += ` ${b.guns[choice4].description}
`
}
document.getElementById("choose-grid").innerHTML = text
powerUps.showDraft();
} else {
powerUps.giveRandomAmmo()
}
}
},
giveRandomAmmo() {
const ammoTarget = Math.floor(Math.random() * (b.guns.length));
const ammo = Math.ceil(b.guns[ammoTarget].ammoPack * 6);
b.guns[ammoTarget].ammo += ammo;
game.updateGunHUD();
game.makeTextLog("+" + ammo + " ammo for " + b.guns[ammoTarget].name + "", 300);
},
spawnRandomPowerUp(x, y) { //mostly used after mob dies
if (Math.random() * Math.random() - 0.3 > Math.sqrt(mech.health) || Math.random() < 0.035) { //spawn heal chance is higher at low health
powerUps.spawn(x, y, "heal");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "heal");
return;
}
if (Math.random() < 0.15 && b.inventory.length > 0) {
powerUps.spawn(x, y, "ammo");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "ammo");
return;
}
if (Math.random() < 0.0025 * (3 - b.inventory.length)) { //a new gun has a low chance for each not acquired gun up to 3
powerUps.spawn(x, y, "gun");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "gun");
return;
}
if (Math.random() < 0.003 * (12 - b.modCount)) { //a new mod has a low chance for each not acquired mod up to 7
powerUps.spawn(x, y, "mod");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "mod");
return;
}
if (Math.random() < 0.003) {
powerUps.spawn(x, y, "field");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field");
return;
}
},
spawnBossPowerUp(x, y) { //boss spawns field and gun mod upgrades
if (mech.fieldMode === 0) {
powerUps.spawn(x, y, "field")
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field")
} else if (Math.random() < 0.75) {
powerUps.spawn(x, y, "mod")
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "mod")
} else if (Math.random() < 0.2) {
powerUps.spawn(x, y, "gun")
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "gun")
} else if (Math.random() < 0.6) {
powerUps.spawn(x, y, "field");
if (Math.random() < b.isModBayesian) powerUps.spawn(x, y, "field");
} else if (mech.health < 0.7) {
powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal");
if (Math.random() < b.isModBayesian) {
powerUps.spawn(x, y, "heal");
powerUps.spawn(x, y, "heal");
}
} else {
powerUps.spawn(x, y, "ammo");
powerUps.spawn(x, y, "ammo");
powerUps.spawn(x, y, "ammo");
powerUps.spawn(x, y, "ammo");
if (Math.random() < b.isModBayesian) {
powerUps.spawn(x, y, "ammo");
powerUps.spawn(x, y, "ammo");
}
}
},
chooseRandomPowerUp(x, y) { //100% chance to drop a random power up //used in spawn.debris
if (Math.random() < 0.5) {
powerUps.spawn(x, y, "heal", false);
} else {
powerUps.spawn(x, y, "ammo", false);
}
},
spawnStartingPowerUps(x, y) { //used for map specific power ups, mostly to give player a starting gun
if (b.modCount < 1) {
powerUps.spawn(x, y, "mod", false); //starting gun
} else if (b.inventory.length < 2) {
powerUps.spawn(x, y, "gun", false); //starting gun
} else {
powerUps.spawnRandomPowerUp(x, y);
powerUps.spawnRandomPowerUp(x, y);
powerUps.spawnRandomPowerUp(x, y);
powerUps.spawnRandomPowerUp(x, y);
}
},
spawn(x, y, target, moving = true, mode = null) {
if (!level.isBuildRun || target === "heal" || target === "ammo") {
let index = powerUp.length;
target = powerUps[target];
size = target.size();
powerUp[index] = Matter.Bodies.polygon(x, y, 0, size, {
density: 0.001,
frictionAir: 0.01,
restitution: 0.8,
inertia: Infinity, //prevents rotation
collisionFilter: {
group: 0,
category: cat.powerUp,
mask: cat.map | cat.powerUp
},
color: target.color,
effect: target.effect,
name: target.name,
size: size
});
if (mode) {
// console.log(mode)
powerUp[index].mode = mode
}
if (moving) {
Matter.Body.setVelocity(powerUp[index], {
x: (Math.random() - 0.5) * 15,
y: Math.random() * -9 - 3
});
}
World.add(engine.world, powerUp[index]); //add to world
}
},
};