diff --git a/.DS_Store b/.DS_Store
index 1d04de9..8e6031a 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 879bab5..b2fde2f 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -3922,48 +3922,34 @@ const b = {
ammoPack: 36,
have: false,
fire() {
+ m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down
+ const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12
+ const SPEED = 18 - radius * 0.4;
+ const dir = m.angle + 0.15 * (Math.random() - 0.5)
+ const velocity = {
+ x: SPEED * Math.cos(dir),
+ y: SPEED * Math.sin(dir)
+ }
+ const position = {
+ x: m.pos.x + 30 * Math.cos(m.angle),
+ y: m.pos.y + 30 * Math.sin(m.angle)
+ }
if (tech.foamFutureFire) {
- m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down
- const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12
- const SPEED = 18 - radius * 0.4;
- const dir = m.angle + 0.2 * (Math.random() - 0.5)
- const velocity = {
- x: SPEED * Math.cos(dir),
- y: SPEED * Math.sin(dir)
- }
- const position = {
- x: m.pos.x + 30 * Math.cos(m.angle),
- y: m.pos.y + 30 * Math.sin(m.angle)
- }
simulation.drawList.push({ //add dmg to draw queue
x: position.x,
y: position.y,
radius: 5,
color: "rgba(0,0,0,0.1)",
- time: 18 * tech.foamFutureFire
+ time: 15 * tech.foamFutureFire
});
-
setTimeout(() => {
if (!simulation.paused) {
- b.foam(position, velocity, radius)
- bullet[bullet.length - 1].damage = (1 + 1.53 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage
+ b.foam(position, Vector.rotate(velocity, 0.5 * (Math.random() - 0.5)), radius)
+ bullet[bullet.length - 1].damage = (1 + 1.43 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage
}
- }, 300 * tech.foamFutureFire);
-
+ }, 250 * tech.foamFutureFire);
} else {
- m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down
- const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12
- const SPEED = 18 - radius * 0.4;
- const dir = m.angle + 0.2 * (Math.random() - 0.5)
- const velocity = {
- x: SPEED * Math.cos(dir),
- y: SPEED * Math.sin(dir)
- }
- const position = {
- x: m.pos.x + 30 * Math.cos(m.angle),
- y: m.pos.y + 30 * Math.sin(m.angle)
- }
- b.foam(position, velocity, radius)
+ b.foam(position, Vector.rotate(velocity, 0.5 * (Math.random() - 0.5)), radius)
}
}
},
diff --git a/js/engine.js b/js/engine.js
index 762e2df..55e33f3 100644
--- a/js/engine.js
+++ b/js/engine.js
@@ -138,7 +138,7 @@ function collisionChecks(event) {
y: mob[k].velocity.y - 8 * Math.sin(angle)
});
- if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) {
+ if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) {
m.energy -= 0.33 * m.maxEnergy
m.immuneCycle = 0; //player doesn't go immune to collision damage
mob[k].death();
diff --git a/js/index.js b/js/index.js
index 46fcccd..e2d4c44 100644
--- a/js/index.js
+++ b/js/index.js
@@ -485,7 +485,9 @@ const build = {
removeOne();
}
simulation.isCheating = true;
- tech.removeLoreTechFromPool();
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isLore) tech.tech[i].frequency = 0;
+ }
document.body.style.cursor = "none";
document.body.style.overflow = "hidden"
document.getElementById("experiment-grid").style.display = "none"
@@ -766,7 +768,13 @@ window.addEventListener("keydown", function(event) {
if (simulation.isConstructionMode) document.getElementById("construct").style.display = 'inline'
if (!simulation.isCheating) {
simulation.isCheating = true;
- tech.removeLoreTechFromPool();
+ lore.techCount = 0;
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isLore) {
+ tech.tech[i].frequency = 0;
+ tech.tech[i].count = 0;
+ }
+ }
}
simulation.makeTextLog(
`
diff --git a/js/level.js b/js/level.js
index 593e011..c1a5df1 100644
--- a/js/level.js
+++ b/js/level.js
@@ -12,7 +12,7 @@ const level = {
start() {
if (level.levelsCleared === 0) { //this code only runs on the first level
// simulation.enableConstructMode() //used to build maps in testing mode
- // level.difficultyIncrease(5)
+ // level.difficultyIncrease(25)
// simulation.zoomScale = 1000;
// simulation.setZoom();
// m.setField("nano-scale manufacturing")
@@ -56,7 +56,6 @@ const level = {
// level.basement(); //fan level
// level.stronghold() //fan level
- for (let i = 0; i < 150; i++) tech.addLoreTechToPool();
// powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech");
// tech.giveTech("undefined")
// lore.techCount = 7
@@ -101,16 +100,16 @@ const level = {
const len = Math.floor((m.maxHealth - m.health) / 0.5)
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
}
- if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false);
- if (tech.isPerpetualAmmo) {
- for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false);
- }
- if (tech.isPerpetualHeal) {
- for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
- }
- if (tech.isPerpetualStun) {
- for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780)
- }
+ // if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false);
+ // if (tech.isPerpetualAmmo) {
+ // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false);
+ // }
+ // if (tech.isPerpetualHeal) {
+ // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
+ // }
+ // if (tech.isPerpetualStun) {
+ // for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780)
+ // }
if (tech.isFlipFlopHarm && tech.isFlipFlopLevelReset && !tech.isFlipFlopOn) {
tech.isFlipFlopOn = true
simulation.makeTextLog(`tech.isFlipFlopOn = true`);
@@ -4027,7 +4026,11 @@ const level = {
// if (simulation.difficulty > 4) spawn.nodeGroup(8000, 630, "spawns", 8, 20, 105);
// } else {
spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss", "orbitalBoss"]);
- let me = mob[mob.length - 1];
+ //find level boss index
+ let me
+ for (let i = 0, len = mob.length; i < len; i++) {
+ if (mob[i].isBoss) me = mob[i]
+ }
me.onDeath = function() {
this.removeCons(); //remove constraint
spawnCouloirEnHaut()
@@ -4036,7 +4039,10 @@ const level = {
// }
} else {
spawn.randomLevelBoss(8000, 630, ["shooterBoss"]);
- let me = mob[mob.length - 1];
+ let me
+ for (let i = 0, len = mob.length; i < len; i++) {
+ if (mob[i].isBoss) me = mob[i]
+ }
me.onDeath = function() {
spawnCouloirEnHaut()
doorSortieSalle.isOpen = false;
diff --git a/js/player.js b/js/player.js
index 6bff2f6..195e976 100644
--- a/js/player.js
+++ b/js/player.js
@@ -310,22 +310,30 @@ const m = {
//remove all tech and count current tech total
let totalTech = 0;
for (let i = 0, len = tech.tech.length; i < len; i++) {
- if (
- !tech.tech[i].isNonRefundable &&
- !tech.tech[i].isLore &&
- tech.tech[i].name !== "many-worlds" &&
- tech.tech[i].name !== "decoherence"
- ) {
- totalTech += tech.tech[i].count
- tech.tech[i].remove();
- tech.tech[i].isLost = false
- tech.tech[i].count = 0
+ if (!tech.tech[i].isLore) {
+ if (tech.tech[i].isJunk) {
+ tech.tech[i].frequency = 0
+ } else if (tech.tech[i].frequencyDefault) {
+ tech.tech[i].frequency = tech.tech[i].frequencyDefault
+ } else {
+ tech.tech[i].frequency = 1
+ }
+ if (
+ !tech.tech[i].isNonRefundable &&
+ tech.tech[i].name !== "many-worlds" &&
+ tech.tech[i].name !== "decoherence"
+ ) {
+ totalTech += tech.tech[i].count
+ tech.tech[i].remove();
+ tech.tech[i].isLost = false
+ tech.tech[i].count = 0
+ }
}
}
// lore.techCount = 0;
// tech.removeLoreTechFromPool();
// tech.addLoreTechToPool();
- tech.removeJunkTechFromPool();
+ // tech.removeJunkTechFromPool();
tech.armorFromPowerUps = 0;
tech.totalCount = 0;
const randomBotCount = b.totalBots()
@@ -508,7 +516,7 @@ const m = {
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34
if (tech.energyRegen === 0) dmg *= 0.34
- if (tech.isTurret && m.crouch) dmg *= 0.5;
+ if (tech.isTurret && m.crouch) dmg *= 0.55;
if (tech.isFireMoveLock && input.fire) dmg *= 0.4;
if (tech.isEntanglement && b.inventory[0] === b.activeGun) {
for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15
@@ -2833,7 +2841,7 @@ const m = {
y: mob[k].velocity.y - 8 * Math.sin(angle)
});
- if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) {
+ if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) {
m.energy -= 0.33 * m.maxEnergy
m.immuneCycle = 0; //player doesn't go immune to collision damage
mob[k].death();
diff --git a/js/powerup.js b/js/powerup.js
index 3909137..4dda1de 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -288,18 +288,14 @@ const powerUps = {
let options = [];
for (let i = 0; i < tech.tech.length; i++) {
if (tech.tech[i].count < tech.tech[i].maxCount && i !== skip1 && i !== skip2 && i !== skip3 && i !== skip4 && tech.tech[i].allowed()) {
- options.push(i);
+ for (let j = 0, len = tech.tech[i].frequency; j < len; j++) options.push(i);
}
}
powerUps.tech.lastTotalChoices = options.length //this is recorded so that banish can know how many tech were available
-
if (tech.isBanish) { //remove banished tech from last selection
for (let i = 0; i < powerUps.tech.banishLog.length; i++) {
for (let j = 0; j < options.length; j++) {
- if (powerUps.tech.banishLog[i] === options[j]) {
- options.splice(j, 1)
- break
- }
+ if (powerUps.tech.banishLog[i] === options[j]) options.splice(j, 1)
}
}
} else { //remove repeats from last selection
@@ -308,10 +304,7 @@ const powerUps = {
for (let i = 0; i < totalChoices; i++) { //repeat for each choice from the last selection
if (options.length > totalChoices) {
for (let j = 0, len = options.length; j < len; j++) {
- if (powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i] === options[j]) {
- options.splice(j, 1) //remove previous choice from option pool
- break
- }
+ if (powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i] === options[j]) options.splice(j, 1) //remove previous choice from option pool
}
}
}
diff --git a/js/spawn.js b/js/spawn.js
index 6fd415f..c8339bb 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -105,13 +105,12 @@ const spawn = {
level.levels.push("null")
level.exit.x = 5500;
level.exit.y = -330;
- simulation.makeTextLog(`undefined = ${lore.techCount}/${lore.techGoal}
level.levels.push("null")`);
+ simulation.makeTextLog(`undefined = ${lore.techCount}/${lore.techGoal}
level.levels.push("null")`);
//remove block map element so exit is clear
Matter.World.remove(engine.world, map[map.length - 1]);
map.splice(map.length - 1, 1);
simulation.draw.setPaths(); //redraw map draw path
- } else {
- //reset game
+ } else { //reset game
let count = 0
function loop() {
@@ -133,50 +132,15 @@ const spawn = {
if (!simulation.testing) requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
-
- // setTimeout(() => {
- // if (simulation.paused || simulation.testing) isEnding = false
- // simulation.makeTextLog(`simulation.complete()`);
- // let delay = 2000
- // for (let i = 0; i < 1; i += 0.01 + 0.2 * Math.random() * Math.random()) {
- // setTimeout(function() {
- // if (!simulation.paused && !simulation.testing) simulation.makeTextLog(`simulation.analysis = ${(i).toFixed(3)}`);
- // }, delay);
- // delay += 1000
- // }
- // setTimeout(function() {
- // if (isEnding) simulation.makeTextLog(`simulation.analysis = 1`);
- // setTimeout(() => {
- // if (isEnding) simulation.makeTextLog(`undefined = ${lore.techCount}/10`);
- // setTimeout(() => {
- // if (isEnding) {
- // if (isEnding) simulation.makeTextLog(`World.clear(engine.world)`);
- // setTimeout(() => { if (isEnding) m.death() }, 4000);
- // }
- // }, 3000);
- // }, 2000);
- // }, delay);
- // }, 5000);
}
- //ramp up damage
- for (let i = 0; i < 3; i++) level.difficultyIncrease(simulation.difficultyMode)
-
- //set game to the next highest difficulty level if not on why
- // if (simulation.difficultyMode < 6) {
- // if (simulation.difficultyMode === 0) {
- // simulation.difficultyMode = 1
- // } else if (simulation.difficultyMode === 1) {
- // simulation.difficultyMode = 2
- // } else if (simulation.difficultyMode === 2) {
- // simulation.difficultyMode = 4
- // } else {
- // simulation.difficultyMode = 6
- // }
- // document.getElementById("difficulty-select").value = simulation.difficultyMode
- // localSettings.difficultyMode = simulation.difficultyMode
- // localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
- // simulation.makeTextLog(`simulation.difficultyMode++`);
- // }
+ // for (let i = 0; i < 3; i++)
+ level.difficultyIncrease(simulation.difficultyMode) //ramp up damage
+ //remove power Ups, to avoid spamming console
+ function removeAll(array) {
+ for (let i = 0; i < array.length; ++i) Matter.World.remove(engine.world, array[i]);
+ }
+ removeAll(powerUp);
+ powerUp = [];
//pull in particles
for (let i = 0, len = body.length; i < len; ++i) {
@@ -186,12 +150,7 @@ const spawn = {
}
//damage all mobs
for (let i = 0, len = mob.length; i < len; ++i) {
- if (mob[i] !== this) {
- mob[i].damage(Infinity, true);
-
- // const velocity = Vector.mult(Vector.normalise(Vector.sub(this.position, mob[i].position)), -65)
- // Matter.Body.setVelocity(mob[i], Vector.add(mob[i].velocity, velocity));
- }
+ if (mob[i] !== this) mob[i].damage(Infinity, true);
}
//draw stuff
@@ -204,7 +163,6 @@ const spawn = {
time: 5 * (len - i + 1)
});
}
-
};
me.onDamage = function() {};
me.cycle = 420;
@@ -1242,7 +1200,6 @@ const spawn = {
};
me.awake = function() {
this.checkStatus();
-
//health bar needs to be here because the position is being set
const h = this.radius * 0.3;
const w = this.radius * 2;
@@ -1267,8 +1224,8 @@ const spawn = {
ctx.setLineDash([125 * Math.random(), 125 * Math.random()]);
// ctx.lineDashOffset = 6*(simulation.cycle % 215);
if (this.distanceToPlayer() < this.laserRange) {
- if (m.energy > 0.003) m.energy -= 0.003
- if (m.immuneCycle < m.cycle && m.energy < 0.1) m.damage(0.0003 * simulation.dmgScale);
+ if (m.energy > 0.002) m.energy -= 0.002
+ if (m.immuneCycle < m.cycle) m.damage(0.0001 * simulation.dmgScale);
ctx.beginPath();
ctx.moveTo(eye.x, eye.y);
ctx.lineTo(m.pos.x, m.pos.y);
@@ -1295,7 +1252,6 @@ const spawn = {
Matter.Body.setPosition(this, { x: history.position.x, y: history.position.y - history.yOff + 24.2859 }) //bullets move with player
}
}
-
me.do = function() {
if (this.seePlayer.recall || (!(simulation.cycle % this.seePlayerFreq) && this.distanceToPlayer2() < this.seeAtDistance2 && !m.isCloak)) {
setTimeout(() => {
diff --git a/js/tech.js b/js/tech.js
index 27dcca8..c3969c7 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -5,11 +5,18 @@
tech.tech[i].remove();
tech.tech[i].isLost = false
tech.tech[i].count = 0
+ if (tech.tech[i].isJunk) {
+ tech.tech[i].frequency = 0
+ } else if (tech.tech[i].frequencyDefault) {
+ tech.tech[i].frequency = tech.tech[i].frequencyDefault
+ } else {
+ tech.tech[i].frequency = 1
+ }
}
lore.techCount = 0;
- tech.removeJunkTechFromPool();
- tech.removeLoreTechFromPool();
- tech.addLoreTechToPool();
+ // tech.removeJunkTechFromPool();
+ // tech.removeLoreTechFromPool();
+ // tech.addLoreTechToPool();
tech.armorFromPowerUps = 0;
tech.totalCount = 0;
simulation.updateTechHUD();
@@ -27,33 +34,38 @@
// who.innerHTML = "removed"
// // who.style.display = "none"
// },
- removeLoreTechFromPool() {
- for (let i = tech.tech.length - 1; i > 0; i--) {
- if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
- }
- },
+ // removeLoreTechFromPool() {
+ // for (let i = tech.tech.length - 1; i > 0; i--) {
+ // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
+ // }
+ // },
addJunkTechToPool(num = 1) {
- for (let i = 0; i < num; i++) {
- // find an index that doesn't have dups first
- let index = null
- for (let i = 0; i < tech.junk.length; i++) {
- if (tech.junk[i].numberInPool === 0) {
- index = i
- break
- }
- }
- if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add
+ let options = [];
+ for (let i = 0; i < tech.tech.length; i++) {
+ if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].isJunk) options.push(i);
+ }
+ for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++
+ // for (let i = 0; i < num; i++) {
+ // // find an index that doesn't have dups first
+ // let index = null
+ // for (let i = 0; i < tech.junk.length; i++) {
+ // if (tech.junk[i].numberInPool === 0) {
+ // index = i
+ // break
+ // }
+ // }
+ // if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add
- tech.junk[index].numberInPool++
- tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool
- if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += ` - ${(tech.junk[index].numberInPool + 9).toString(36)}` //give it a unique name so it can be found
- }
- },
- removeJunkTechFromPool() {
- for (let i = tech.tech.length - 1; i > 0; i--) {
- if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1)
- }
+ // tech.junk[index].numberInPool++
+ // tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool
+ // if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += ` - ${(tech.junk[index].numberInPool + 9).toString(36)}` //give it a unique name so it can be found
+ // }
},
+ // removeJunkTechFromPool() {
+ // for (let i = tech.tech.length - 1; i > 0; i--) {
+ // if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1)
+ // }
+ // },
giveTech(index = 'random') {
if (index === 'random') {
let options = [];
@@ -150,6 +162,7 @@
description: `increase damage by 25%
your inventory can only hold 1 gun`,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.inventory.length < 2 //&& !tech.haveGunCheck("CPT gun")
},
@@ -178,6 +191,7 @@
description: "while your first gun is equipped
reduce harm by 13% for each of your guns",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.inventory.length > 1 && !tech.isEnergyHealth
},
@@ -198,6 +212,7 @@
description: "increase damage by 17%
for each gun in your inventory",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.inventory.length > 1
},
@@ -214,6 +229,7 @@
description: "17% decreased delay after firing
for each gun in your inventory",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.inventory.length > 1
},
@@ -232,6 +248,7 @@
description: "spawn 6 guns, but you can't switch guns
guns cycle automatically with each new level",
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
allowed() {
return (tech.isDamageForGuns || tech.isFireRateForGuns) && (b.inventory.length + 5) < b.guns.length
@@ -250,6 +267,7 @@
description: "for every gun in your inventory spawn a
heal, research, field, ammo, or tech",
maxCount: 1, //random power up
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -278,6 +296,7 @@
description: "ammo power ups give 200% ammo
but ammo is only added to your current gun",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyNoAmmo
},
@@ -294,6 +313,7 @@
description: "double your current ammo for all guns",
maxCount: 9,
count: 0,
+ frequency: 1,
isNonRefundable: true,
allowed() {
return tech.isAmmoForGun
@@ -312,6 +332,7 @@
description: "when you fire while out of ammo
gain 3 ammo, but lose 5 health",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth && !tech.isEnergyNoAmmo
},
@@ -323,27 +344,29 @@
tech.isAmmoFromHealth = false;
}
},
- {
- name: "perpetual ammo",
- description: "find 2 ammo at the start of each level",
- maxCount: 1,
- count: 0,
- allowed() {
- return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualReroll && !tech.isPerpetualStun && !tech.isEnergyNoAmmo
- },
- requires: "only 1 perpetual effect, not exciton lattice",
- effect() {
- tech.isPerpetualAmmo = true
- },
- remove() {
- tech.isPerpetualAmmo = false
- }
- },
+ // {
+ // name: "perpetual ammo",
+ // description: "find 3 ammo at the start of each level",
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // allowed() {
+ // return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualReroll && !tech.isPerpetualStun && !tech.isEnergyNoAmmo
+ // },
+ // requires: "only 1 perpetual effect, not exciton lattice",
+ // effect() {
+ // tech.isPerpetualAmmo = true
+ // },
+ // remove() {
+ // tech.isPerpetualAmmo = false
+ // }
+ // },
{
name: "desublimated ammunition",
description: "use 50% less ammo when crouching",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -357,9 +380,11 @@
},
{
name: "gun turret",
- description: "reduce harm by 50% when crouching",
+ description: "reduce harm by 55% when crouching",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isCrouchAmmo && !tech.isEnergyHealth
},
@@ -376,6 +401,7 @@
description: "66% decreased delay after firing
you can only fire when at rest",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -398,6 +424,8 @@
description: "increase damage by 33% when at rest",
maxCount: 9,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isFireNotMove
},
@@ -414,6 +442,7 @@
description: "while firing your position is locked
and harm is reduced by 60%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth
},
@@ -434,6 +463,7 @@
description: "move and jump about 30% faster
take 5% more harm",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -454,6 +484,7 @@
description: "moving at high speeds reduces harm
by up to 50%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.Fx > 0.016 && !tech.isEnergyHealth
},
@@ -470,6 +501,7 @@
description: "moving at high speeds increases damage
by up to 33%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.Fx > 0.016
},
@@ -486,6 +518,7 @@
// description: "reduce harm by 50% when at rest",
// maxCount: 1,
// count: 0,
+ // frequency: 1,
// allowed() {
// return tech.isFireNotMove || tech.isFireMoveLock
// },
@@ -502,6 +535,7 @@
description: "increase damage by up to 33%
at a distance of 40 steps from the target",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -518,6 +552,7 @@
description: "increase damage by 20%
20% increased delay after firing",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -535,6 +570,7 @@
description: "30% decreased delay after firing",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -553,6 +589,7 @@
description: "explosions release gamma radiation
100% more damage, but over 4 seconds",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1)
},
@@ -569,6 +606,7 @@
description: "increase explosive damage by 20%
increase explosive radius by 20%",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1)
},
@@ -585,6 +623,7 @@
description: "increase explosive damage by 60%
decrease explosive radius by 20%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1)
},
@@ -601,6 +640,7 @@
description: "increase explosive radius by 80%, but
you take 400% more harm from explosions",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField)
},
@@ -618,6 +658,7 @@
description: "harm from explosions is passively reduced
by 7% for every 10 stored energy",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser
},
@@ -634,6 +675,7 @@
description: "mobs explode when they die
be careful",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isBotSpawner
},
@@ -650,6 +692,7 @@
description: "mobs produce spores when they die
9% chance",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isBotSpawner
},
@@ -669,6 +712,7 @@
description: "mobs release a nail when they die
nails target nearby mobs",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.isBotSpawner
},
@@ -685,6 +729,7 @@
description: "mobs spawn with 11% less health",
maxCount: 3,
count: 0,
+ frequency: 1,
allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.isBotSpawner
},
@@ -706,6 +751,7 @@
description: "reduce harm by 66%
after not using your gun or field for 2 seconds",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (b.totalBots() > 1 || tech.haveGunCheck("drones") || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && !tech.isEnergyHealth
},
@@ -722,6 +768,7 @@
description: "increase damage by 100%
after not using your gun or field for 2 seconds",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNoFireDefense
},
@@ -738,6 +785,7 @@
description: "20% chance to build a bot after killing a mob
the bot lasts for about 20 seconds",
maxCount: 3,
count: 0,
+ frequency: 1,
allowed() {
return b.totalBots() > 0 && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob
},
@@ -754,6 +802,7 @@
description: "a bot fires nails at mobs in line of sight",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return true
@@ -772,6 +821,7 @@
description: "convert all your bots to nail-bots
500% increased nail-bot fire rate",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.nailBotCount > 1 && !b.hasBotUpgrade()
},
@@ -795,6 +845,7 @@
description: "a bot fires foam at nearby mobs",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return true
@@ -813,6 +864,7 @@
description: "convert all your bots to foam-bots
250% increased foam size and fire rate",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.foamBotCount > 1 && !b.hasBotUpgrade()
},
@@ -836,6 +888,7 @@
description: "a bot defends the space around you
ignites an explosion after hitting a mob",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return true
@@ -854,6 +907,7 @@
description: "convert all your bots to boom-bots
250% increased explosion damage and size",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.boomBotCount > 1 && !b.hasBotUpgrade()
},
@@ -877,6 +931,7 @@
description: "a bot uses energy to emit a laser beam
that targets nearby mobs",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return m.maxEnergy > 0.5
@@ -895,6 +950,7 @@
description: "convert all your bots to laser-bots
75% improved damage, efficiency, and range", // 400% increased laser-bot laser damage",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.laserBotCount > 1 && !b.hasBotUpgrade()
},
@@ -918,6 +974,7 @@
description: "a bot is locked in orbit around you
stuns and damages mobs on contact",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return true
@@ -936,6 +993,7 @@
description: "convert all your bots to orbital-bots
increase damage by 200% and radius by 30%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.orbitBotCount > 1 && !b.hasBotUpgrade()
},
@@ -969,6 +1027,7 @@
description: "a bot damages mobs while it traces your path
regen 6 energy per second when it's near",
maxCount: 9,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return true
@@ -987,6 +1046,7 @@
description: "convert your bots to dynamo-bots
dynamo-bots regen 24 energy per second",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.dynamoBotCount > 1 && !b.hasBotUpgrade()
},
@@ -1010,6 +1070,7 @@
description: "anytime you collect 4 research
use them to build a random bot",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return powerUps.research.count > 3 || build.isExperimentSelection
},
@@ -1028,6 +1089,7 @@
description: "reduce harm by 6%
for each of your permanent bots",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.totalBots() > 3 && !tech.isEnergyHealth
},
@@ -1043,6 +1105,7 @@
description: "increase damage by 6%
for each of your permanent bots",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return b.totalBots() > 3
},
@@ -1059,6 +1122,7 @@
description: "duplicate your permanent bots
remove all of your guns",
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
isBadRandomOption: true,
@@ -1094,6 +1158,7 @@
description: "increase block collision damage by 100%
charge throws more quickly for less energy",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "wormhole"
},
@@ -1110,6 +1175,8 @@
description: "mobs killed by collisions with blocks
spawn a heal, ammo, or research",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.throwChargeRate > 1
},
@@ -1126,10 +1193,12 @@
description: "while you are holding a block
reduce harm by 85%",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
- return tech.throwChargeRate > 1
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole"
},
- requires: "mass driver",
+ requires: "mass driver, a field that can hold things",
effect() {
tech.isBlockHarm = true
},
@@ -1137,27 +1206,29 @@
tech.isBlockHarm = false
}
},
- {
- name: "perpetual stun",
- description: "stun all mobs for up to 12 seconds
at the start of each level",
- maxCount: 1,
- count: 0,
- allowed() {
- return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualAmmo
- },
- requires: "only 1 perpetual effect",
- effect() {
- tech.isPerpetualStun = true
- },
- remove() {
- tech.isPerpetualStun = false
- }
- },
+ // {
+ // name: "perpetual stun",
+ // description: "stun all mobs for up to 12 seconds
at the start of each level",
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // allowed() {
+ // return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualAmmo
+ // },
+ // requires: "only 1 perpetual effect",
+ // effect() {
+ // tech.isPerpetualStun = true
+ // },
+ // remove() {
+ // tech.isPerpetualStun = false
+ // }
+ // },
{
name: "Pauli exclusion",
description: `after receiving harm from a collision become
immune to harm for an extra 0.75 seconds`,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -1175,6 +1246,7 @@
description: `become immune to harm for 1 second
once every 7 seconds`,
maxCount: 3,
count: 0,
+ frequency: 1,
allowed() {
return true //tech.collisionImmuneCycles > 30
},
@@ -1188,8 +1260,8 @@
},
{
name: "flip-flop",
- description: `collisions set flip-flop to OFF when ON
-
collisions set flip-flop to ON when OFF`,
+ description: `if flip-flop is ON, collisions set it to OFF
+
if flip-flop is OFF, collisions set it to ON`,
// description: `collisions toggle flip-flop ON and OFF
//
ON: 0 collision harm, OFF: 25% extra harm`,
// on your next collision take 0 harm
@@ -1209,6 +1281,7 @@
},
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -1255,6 +1328,7 @@
remove() {
tech.isFlipFlop = false
tech.isFlipFlopOn = false
+ m.eyeFillColor = 'transparent'
}
},
{
@@ -1262,6 +1336,8 @@
description: "if flip-flop is in the ON state
take 0 harm from collisions with mobs",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isFlipFlop
},
@@ -1279,6 +1355,8 @@
description: "if flip-flop is in the ON state
do 55.5% more damage",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isFlipFlop
},
@@ -1295,6 +1373,8 @@
description: "if flip-flop is ON regen 22 energy per second
if flip-flop is OFF drain 3.1 energy per second",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isFlipFlop
},
@@ -1311,6 +1391,8 @@
description: "set flip-flop to the ON state
at the start of a level",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isFlipFlopEnergy || tech.isFlipFlopDamage || tech.isFlipFlopHarm
},
@@ -1327,6 +1409,7 @@
description: `slow time by 50% after receiving harm
reduce harm by 20%`,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow
},
@@ -1343,6 +1426,8 @@
description: `freeze all mobs for 7 seconds
after receiving harm`,
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isSlowFPS
},
@@ -1359,6 +1444,7 @@
description: `collisions with stunned or frozen mobs
cause you no harm`,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage
},
@@ -1375,6 +1461,7 @@
description: "rebuild your broken parts as drones
chance to occur after receiving harm",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.harmReduction() < 1
},
@@ -1394,6 +1481,7 @@
description: "for 10 seconds after receiving harm
reduce harm by 66%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth && m.harmReduction() < 1
},
@@ -1410,6 +1498,7 @@
description: "for 10 seconds after receiving harm
increase damage by 200%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.harmReduction() < 1
},
@@ -1426,6 +1515,7 @@
description: "charge, parity, and time invert to undo harm
rewind (1.5—5) seconds for (66—220) energy",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" || m.maxEnergy > 1)
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave harmonics" && !tech.isEnergyHealth && !tech.isRewindGun
},
@@ -1442,6 +1532,7 @@
description: "when you rewind, build several bots
that protect you for about 9 seconds",
maxCount: 3,
count: 0,
+ frequency: 1,
allowed() {
return tech.isRewindAvoidDeath
},
@@ -1458,6 +1549,7 @@
description: "before you rewind drop several grenades",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isExplosionHarm && tech.isRewindAvoidDeath
},
@@ -1474,6 +1566,7 @@
description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15%
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm)
},
@@ -1491,6 +1584,7 @@
description: "reduce harm by 66%
you no longer passively regenerate energy",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
},
@@ -1509,6 +1603,7 @@
description: "energy protects you instead of health
harm reduction effects provide no benefit",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage
},
@@ -1536,6 +1631,7 @@
description: "each heal power up you collect
increases your maximum energy by 5",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isEnergyHealth
},
@@ -1561,6 +1657,7 @@
description: "increase damage by 1%
for every 9 stored energy",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.maxEnergy > 1 || tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0
},
@@ -1577,6 +1674,7 @@
description: `increase damage by 50%, but
ammo will no longer spawn`,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("nail gun") && tech.isIceCrystals) || tech.haveGunCheck("laser") || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -1593,6 +1691,7 @@
description: "increase damage by 50%
if a mob dies drain energy by 25%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth
},
@@ -1609,6 +1708,8 @@
description: `increase damage by 40%, but
reduce maximum energy by 50`,
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isEnergyLoss && m.maxEnergy < 1.1 && !tech.isSporeField && !tech.isRewindAvoidDeath
},
@@ -1627,6 +1728,8 @@
description: `increase damage by 5%
for every 10 energy below 100`,
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isEnergyLoss && m.maxEnergy < 1.1
},
@@ -1643,6 +1746,7 @@
description: "increase your maximum energy by 50",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return m.maxEnergy > 0.99
},
@@ -1663,6 +1767,7 @@
description: "energy above your max decays 60% slower",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0
},
@@ -1679,6 +1784,7 @@
description: "6% of damage done recovered as energy",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.damageFromTech() > 1
},
@@ -1695,10 +1801,11 @@
description: "if a mob has died in the last 5 seconds
regen 5% of max energy every second",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
- return m.maxEnergy > 0.99 && !tech.isHealthRecovery
+ return m.maxEnergy > 0.99
},
- requires: "max energy >= 1, not scrap recycling",
+ requires: "max energy >= 1",
effect() {
tech.isEnergyRecovery = true;
},
@@ -1711,10 +1818,12 @@
description: "if a mob has died in the last 5 seconds
regain 1% of max health every second",
maxCount: 1,
count: 0,
+ frequency: 1,
+ isHealTech: true,
allowed() {
- return !tech.isEnergyHealth && !tech.isEnergyRecovery
+ return !tech.isEnergyHealth
},
- requires: "not mass-energy equivalence, waste energy recovery",
+ requires: "not mass-energy equivalence",
effect() {
tech.isHealthRecovery = true;
},
@@ -1727,6 +1836,7 @@
description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 50%",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -1743,6 +1853,8 @@
description: "if a mob has died in the last 5 seconds
reduce harm by 75% else increase it by 25%",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isDamageAfterKill
},
@@ -1759,6 +1871,7 @@
description: "increase damage by 6%
for every 10 health below 100",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.health < 0.5 || build.isExperimentSelection
},
@@ -1774,6 +1887,7 @@
description: "increase damage by 100%
lose 11 health when you pick up a tech",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (m.harmReduction() < 1 || tech.healthDrain || tech.isLowHealthDmg || tech.isHealthRecovery || tech.isHealLowHealth || tech.largerHeals > 1 || tech.isPerpetualHeal) && !tech.isEnergyHealth
},
@@ -1790,6 +1904,8 @@
description: "heal for 3% of damage done
take 8% more harm",
maxCount: 9,
count: 0,
+ frequency: 1,
+ isHealTech: true,
allowed() {
return !tech.isEnergyHealth && tech.damageFromTech() > 1
},
@@ -1806,6 +1922,7 @@
description: "increase damage by 40%
when your health is above 100",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.maxHealth > 1;
},
@@ -1822,6 +1939,7 @@
description: "increase your maximum health by 50",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth
},
@@ -1842,6 +1960,7 @@
description: "for each unused power up at the end of a level
add 3 max health (up to 51 health per level)",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isEnergyHealth && !tech.isDroneGrab
},
@@ -1860,6 +1979,7 @@
description: "unused power ups at the end of each level
are still activated (selections are random)",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isArmorFromPowerUps
},
@@ -1876,6 +1996,8 @@
description: `at the start of each level
spawn a heal for every 50 missing health`,
maxCount: 1,
count: 0,
+ frequency: 1,
+ isHealTech: true,
allowed() {
return m.maxHealth > 1 || tech.isArmorFromPowerUps
},
@@ -1892,8 +2014,10 @@
description: "heal power ups are 100% more effective",
maxCount: 3,
count: 0,
+ frequency: 1,
+ isHealTech: true,
allowed() {
- return (m.health < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth
+ return (m.health < 0.75 || build.isExperimentSelection) && !tech.isEnergyHealth
},
requires: "not mass-energy equivalence",
effect() {
@@ -1903,22 +2027,24 @@
tech.largerHeals = 1;
}
},
- {
- name: "perpetual heals",
- description: "find 2 heals at the start of each level",
- maxCount: 1,
- count: 0,
- allowed() {
- return !tech.isPerpetualReroll && !tech.isPerpetualAmmo && !tech.isPerpetualStun
- },
- requires: "only 1 perpetual effect",
- effect() {
- tech.isPerpetualHeal = true
- },
- remove() {
- tech.isPerpetualHeal = false
- }
- },
+ // {
+ // name: "perpetual heals",
+ // description: "find 3 heals at the start of each level",
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // isHealTech: true,
+ // allowed() {
+ // return !tech.isPerpetualReroll && !tech.isPerpetualAmmo && !tech.isPerpetualStun
+ // },
+ // requires: "only 1 perpetual effect",
+ // effect() {
+ // tech.isPerpetualHeal = true
+ // },
+ // remove() {
+ // tech.isPerpetualHeal = false
+ // }
+ // },
{
name: "anthropic principle",
nameInfo: "",
@@ -1930,6 +2056,8 @@
description: "once per level use 1 research to avoid dying
and spawn 6 heal power ups",
maxCount: 1,
count: 0,
+ frequency: 1,
+ isHealTech: true,
allowed() {
return powerUps.research.count > 0 || build.isExperimentSelection
},
@@ -1950,6 +2078,8 @@
description: "after anthropic principle prevents your death
increase damage by 137.03599% on that level",
maxCount: 1,
count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isDeathAvoid
},
@@ -1966,6 +2096,7 @@
description: "after dying, continue in an alternate reality
reduce harm by 16%", //spawn 4 research
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isSwitchReality && !tech.isResearchReality
},
@@ -1983,6 +2114,7 @@
description: "each new level is an alternate reality
find 2 tech power ups in that reality",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isImmortal && !tech.isResearchReality
},
@@ -1995,10 +2127,11 @@
}
},
{
- name: "decoherence",
+ name: "Ψ(t) collapse",
description: "enter an alternate reality after you research
spawn 11 research",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isImmortal && !tech.isSwitchReality
},
@@ -2016,6 +2149,7 @@
description: "using a research for any purpose
has a 37% chance to spawn a research",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (powerUps.research.count > 1 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste
},
@@ -2028,10 +2162,11 @@
}
},
{
- name: "erase",
+ name: "decoherence",
description: "researched or canceled tech won't reoccur
spawn 5 research",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism
},
@@ -2046,10 +2181,11 @@
}
},
{
- name: "Ψ(t) collapse",
+ name: "perturbation theory",
description: "66% decreased delay after firing
when you have no research in your inventory",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return powerUps.research.count === 0 && !tech.manyWorlds
},
@@ -2070,6 +2206,7 @@
description: "after choosing a field, tech, or gun
if you have no research spawn 2",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
},
@@ -2086,6 +2223,7 @@
description: "increase damage by 3.9%
for each research in your inventory",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return powerUps.research.count > 4 || build.isExperimentSelection
},
@@ -2102,6 +2240,7 @@
description: "remove all current tech
spawn new tech to replace them",
maxCount: 1,
count: 0,
+ frequency: 1,
// isNonRefundable: true,
isBadRandomOption: true,
isExperimentHide: true,
@@ -2121,7 +2260,7 @@
if (tech.isSuperDeterminism) count -= 2 //remove the bonus tech
tech.setupAllTech(); // remove all tech
- tech.addLoreTechToPool();
+ // tech.addLoreTechToPool();
for (let i = 0; i < count; i++) { // spawn new tech power ups
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech");
}
@@ -2129,27 +2268,29 @@
},
remove() {}
},
- {
- name: "perpetual research",
- description: "find 1 research at the start of each level",
- maxCount: 1,
- count: 0,
- allowed() {
- return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun
- },
- requires: "only 1 perpetual effect, not superdeterminism",
- effect() {
- tech.isPerpetualReroll = true
- },
- remove() {
- tech.isPerpetualReroll = false
- }
- },
+ // {
+ // name: "perpetual research",
+ // description: "find 1 research at the start of each level",
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // allowed() {
+ // return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun
+ // },
+ // requires: "only 1 perpetual effect, not superdeterminism",
+ // effect() {
+ // tech.isPerpetualReroll = true
+ // },
+ // remove() {
+ // tech.isPerpetualReroll = false
+ // }
+ // },
{
name: "bubble fusion",
description: "after destroying a mob's natural shield
spawn 1-2 heals, ammo, or research",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return true
},
@@ -2166,6 +2307,7 @@
description: "20% chance to duplicate spawned power ups
after a collision, eject 1 tech",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() < 1
},
@@ -2185,6 +2327,7 @@
description: "7% chance to duplicate spawned power ups
add 12 junk tech to the potential pool",
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() < 1
},
@@ -2205,6 +2348,7 @@
description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() < 1 && !tech.isDeterminism && (level.levelsCleared < 5 || Math.random() < 0.5)
},
@@ -2225,6 +2369,7 @@
description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isCancelDuplication
},
@@ -2241,6 +2386,7 @@
description: "your chance to duplicate power ups
increases your damage by the same percent",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() > 0.15
},
@@ -2257,6 +2403,7 @@
description: "each level has a chance to spawn a level boss
equal to double your duplication chance",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() > 0
},
@@ -2273,6 +2420,7 @@
description: "after reaching 100% duplication chance
immediately spawn 4 level bosses",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isDuplicateBoss
},
@@ -2290,6 +2438,7 @@
description: "convert 1 a random tech into 3 new guns
recursive tech lose all stacks",
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -2320,6 +2469,7 @@
description: "spawn 2 tech
remove 1 random tech",
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -2347,6 +2497,7 @@
description: `use 2 research to spawn 1 tech
with double your duplication chance`,
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -2369,6 +2520,7 @@
description: "drop a mine after picking up a power up",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.duplicationChance() > 0
},
@@ -2386,6 +2538,7 @@
description: `in the pause menu, change your field
by clicking on your field's box`,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (b.inventory.length > 1) || build.isExperimentSelection && !tech.isSuperDeterminism
},
@@ -2404,6 +2557,7 @@
isNonRefundable: true,
isExperimentHide: true,
count: 0,
+ frequency: 1,
allowed() {
return level.onLevel < 8 && level.onLevel > 0
},
@@ -2421,6 +2575,7 @@
description: "tech, fields, and guns have 5 choices",
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isDeterminism
},
@@ -2437,6 +2592,7 @@
description: "spawn 5 tech
tech, fields, and guns have only 1 choice",
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isBadRandomOption: true,
allowed() {
@@ -2457,6 +2613,8 @@
description: "spawn 7 tech
research, guns, and fields no longer spawn",
maxCount: 1,
count: 0,
+ frequency: 3,
+ frequencyDefault: 3,
isNonRefundable: true,
isBadRandomOption: true,
allowed() {
@@ -2472,6 +2630,91 @@
tech.isSuperDeterminism = false;
}
},
+ {
+ name: "gun technology",
+ description: "double the frequency of finding gun tech
spawn a gun",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ isNonRefundable: true,
+ // isExperimentHide: true,
+ // isBadRandomOption: true,
+ allowed() {
+ return !tech.isSuperDeterminism
+ },
+ requires: "not superdeterminism",
+ effect() {
+ powerUps.spawn(m.pos.x, m.pos.y, "gun");
+ // this.count--
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 2
+ }
+ },
+ remove() {}
+ },
+ {
+ name: "ammo technology",
+ description: "double the frequency of finding gun tech
spawn 6 ammo",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ isNonRefundable: true,
+ // isExperimentHide: true,
+ // isBadRandomOption: true,
+ allowed() {
+ return !tech.isEnergyNoAmmo
+ },
+ requires: "not exciton lattice",
+ effect() {
+ for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 2
+ }
+ },
+ remove() {}
+ },
+ {
+ name: "field technology",
+ description: "double the frequency of finding field tech
spawn a field",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ isNonRefundable: true,
+ // isExperimentHide: true,
+ // isBadRandomOption: true,
+ allowed() {
+ return !tech.isSuperDeterminism
+ },
+ requires: "not superdeterminism",
+ effect() {
+ powerUps.spawn(m.pos.x, m.pos.y, "field");
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 2
+ }
+ },
+ remove() {}
+ },
+ {
+ name: "healing technology",
+ description: "double the frequency of finding healing tech
spawn 12 heals",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ isNonRefundable: true,
+ // isExperimentHide: true,
+ // isBadRandomOption: true,
+ allowed() {
+ return true
+ },
+ requires: "",
+ effect() {
+ for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal");
+ for (let i = 0, len = tech.tech.length; i < len; i++) {
+ if (tech.tech[i].isHealTech) tech.tech[i].frequency *= 200
+ }
+ },
+ remove() {}
+ },
//**************************************************
//************************************************** gun
//************************************************** tech
@@ -2482,6 +2725,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection ||
},
@@ -2524,6 +2768,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return ((m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) || tech.haveGunCheck("drones") || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot
},
@@ -2541,6 +2786,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
},
@@ -2558,6 +2804,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField
},
@@ -2575,6 +2822,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio
},
@@ -2592,6 +2840,7 @@
isGunTech: true,
maxCount: 3,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb
},
@@ -2609,6 +2858,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isBulletsLastLonger > 1
},
@@ -2626,6 +2876,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.isNailRadiation
},
@@ -2663,6 +2914,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNeedles && !tech.isNailRadiation
},
@@ -2680,6 +2932,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isNeedles
},
@@ -2711,6 +2964,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.isRivets
},
@@ -2728,6 +2982,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isRivets && !tech.isNeedles && !tech.isNailRadiation && !tech.isNailCrit
},
@@ -2764,6 +3019,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles
},
@@ -2789,6 +3045,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals
},
@@ -2814,6 +3071,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.isNailShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) && !tech.isIceCrystals
},
@@ -2831,6 +3089,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals
},
@@ -2848,6 +3107,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNailRadiation && !tech.isFastRadiation
},
@@ -2865,6 +3125,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNailRadiation && !tech.isSlowRadiation
},
@@ -2882,6 +3143,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("shotgun")
},
@@ -2921,6 +3183,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot
},
@@ -2938,6 +3201,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("shotgun") && !tech.isNailShot
},
@@ -2955,6 +3219,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("shotgun")
},
@@ -2972,6 +3237,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("super balls") && !tech.oneSuperBall
},
@@ -2989,6 +3255,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("super balls") && tech.superBallNumber === 4
},
@@ -3006,6 +3273,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("super balls")
},
@@ -3023,6 +3291,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3040,6 +3309,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("wave beam") && !tech.isWaveReflect
},
@@ -3059,6 +3329,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("wave beam") && tech.waveSpeedMap !== 3
},
@@ -3076,6 +3347,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("missiles") || tech.isMissileField
},
@@ -3093,6 +3365,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("missiles")
},
@@ -3110,6 +3383,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return tech.haveGunCheck("missiles")
@@ -3129,6 +3403,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("grenades")
},
@@ -3148,6 +3423,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("grenades") && !tech.isNeutronBomb
},
@@ -3167,6 +3443,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("grenades") && !tech.fragments && !tech.isVacuumBomb
},
@@ -3186,6 +3463,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNeutronBomb
},
@@ -3203,6 +3481,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isNeutronBomb
},
@@ -3220,6 +3499,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineSentry
},
@@ -3237,6 +3517,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("mine") && !tech.isMineSentry
},
@@ -3254,6 +3535,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine
},
@@ -3271,6 +3553,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("spores")
},
@@ -3288,6 +3571,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -3306,6 +3590,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -3323,6 +3608,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -3340,6 +3626,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth
},
@@ -3357,6 +3644,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))
},
@@ -3374,6 +3662,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return !tech.isArmorFromPowerUps && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)))
},
@@ -3391,6 +3680,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("foam") || tech.foamBotCount > 1
},
@@ -3408,8 +3698,9 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
- return tech.haveGunCheck("foam") || tech.foamBotCount > 2
+ return tech.haveGunCheck("foam") || tech.foamBotCount > 1
},
requires: "foam",
effect() {
@@ -3425,6 +3716,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("foam")
},
@@ -3438,10 +3730,11 @@
},
{
name: "quantum foam",
- description: "foam gun fires 0.3 seconds into the future
increase foam gun damage by 153%",
+ description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 143%",
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("foam")
},
@@ -3459,6 +3752,7 @@
// description: "increase foam damage by 200%
foam dissipates 50% faster",
// maxCount: 1,
// count: 0,
+ // frequency: 1,
// allowed() {
// return tech.haveGunCheck("foam") || tech.foamBotCount > 2
// },
@@ -3475,6 +3769,7 @@
// description: "slow time while charging the rail gun
charging no longer drains energy",
// maxCount: 1,
// count: 0,
+ // frequency: 1,
// allowed() {
// return simulation.fpsCapDefault > 45 && tech.haveGunCheck("rail gun") && !tech.isSlowFPS && !tech.isCapacitor
// },
@@ -3494,6 +3789,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -3511,6 +3807,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -3528,6 +3825,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -3545,6 +3843,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") || tech.laserBotCount > 1 || tech.isLaserMine
},
@@ -3562,6 +3861,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") || tech.laserBotCount > 1
},
@@ -3580,6 +3880,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
},
@@ -3601,6 +3902,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.isPulseAim && !tech.historyLaser
},
@@ -3626,6 +3928,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.historyLaser
},
@@ -3653,6 +3956,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") && tech.isWideLaser
},
@@ -3680,6 +3984,7 @@
isGunTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.isWideLaser
},
@@ -3707,6 +4012,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && !tech.historyLaser
},
@@ -3732,6 +4038,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isPulseLaser
},
@@ -3749,6 +4056,7 @@
isGunTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isPulseLaser && !tech.beamSplitter
},
@@ -3770,6 +4078,7 @@
isFieldTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics"
},
@@ -3787,6 +4096,7 @@
isFieldTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics"
},
@@ -3806,6 +4116,7 @@
isFieldTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
},
@@ -3823,6 +4134,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isPerpetualStun
},
@@ -3840,6 +4152,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
},
@@ -3857,6 +4170,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -3875,6 +4189,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -3895,6 +4210,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
isNonRefundable: true,
isExperimentHide: true,
allowed() {
@@ -3980,6 +4296,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -3997,6 +4314,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -4014,6 +4332,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -4031,6 +4350,7 @@
isFieldTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return tech.isIceField
},
@@ -4048,6 +4368,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field"
},
@@ -4061,10 +4382,11 @@
},
{
name: "annihilation",
- description: "after touching mobs, they are annihilated
drains 33% of maximum energy",
+ description: "touching normal mobs annihilates them
drains 33% of maximum energy",
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -4082,6 +4404,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation field"
},
@@ -4099,6 +4422,7 @@
// isFieldTech: true,
// maxCount: 1,
// count: 0,
+ // frequency: 1,
// allowed() {
// return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isEnergyHealth
// },
@@ -4116,6 +4440,7 @@
isFieldTech: true,
maxCount: 9,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch"
},
@@ -4133,6 +4458,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
isBotTech: true,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch"
@@ -4152,6 +4478,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch"
},
@@ -4169,6 +4496,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field"
},
@@ -4188,6 +4516,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -4211,6 +4540,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0;
},
@@ -4230,6 +4560,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
},
@@ -4247,6 +4578,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
},
@@ -4264,6 +4596,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -4283,6 +4616,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -4300,6 +4634,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -4317,6 +4652,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -4334,6 +4670,7 @@
isFieldTech: true,
maxCount: 1,
count: 0,
+ frequency: 1,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -4348,104 +4685,15 @@
}
},
//**************************************************
- //************************************************** spawn power up
- //************************************************** tech
+ //************************************************** experimental
+ //************************************************** modes
//**************************************************
- {
- name: "heals",
- description: "spawn 6 heals",
- maxCount: 9,
- count: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isBadRandomOption: true,
- allowed() {
- return true
- },
- requires: "",
- effect() {
- for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal");
- this.count--
- },
- remove() {}
- },
- {
- name: "ammo",
- description: "spawn 6 ammo",
- maxCount: 9,
- count: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isBadRandomOption: true,
- allowed() {
- return !tech.isEnergyNoAmmo
- },
- requires: "not exciton lattice",
- effect() {
- for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo");
- this.count--
- },
- remove() {}
- },
- {
- name: "research",
- description: "spawn 4 research",
- maxCount: 9,
- count: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isBadRandomOption: true,
- allowed() {
- return !tech.isSuperDeterminism
- },
- requires: "not superdeterminism",
- effect() {
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research");
- this.count--
- },
- remove() {}
- },
- {
- name: "gun",
- description: "spawn a gun",
- maxCount: 9,
- count: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isBadRandomOption: true,
- allowed() {
- return !tech.isSuperDeterminism
- },
- requires: "not superdeterminism",
- effect() {
- powerUps.spawn(m.pos.x, m.pos.y, "gun");
- this.count--
- },
- remove() {}
- },
- {
- name: "field",
- description: "spawn a field",
- maxCount: 9,
- count: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isBadRandomOption: true,
- allowed() {
- return !tech.isSuperDeterminism
- },
- requires: "not superdeterminism",
- effect() {
- powerUps.spawn(m.pos.x, m.pos.y, "field");
- this.count--
- },
- remove() {}
- },
{
name: "ship",
description: "experiment: fly around with no legs
aim with the keyboard",
maxCount: 1,
count: 0,
+ frequency: 0,
isNonRefundable: true,
isBadRandomOption: true,
isExperimentalMode: true,
@@ -4463,6 +4711,7 @@
description: "experiment: every 20 seconds
become an alternate version of yourself",
maxCount: 1,
count: 0,
+ frequency: 0,
isNonRefundable: true,
isBadRandomOption: true,
isExperimentalMode: true,
@@ -4483,6 +4732,7 @@
description: "experiment: every 5 seconds
all mobs gain a shield",
maxCount: 1,
count: 0,
+ frequency: 0,
isNonRefundable: true,
isBadRandomOption: true,
isExperimentalMode: true,
@@ -4499,45 +4749,16 @@
},
remove() {}
},
- ],
- addLoreTechToPool() { //adds lore tech to tech pool
- if (!simulation.isCheating) {
- tech.tech.push({
- name: `undefined`,
- description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`,
- maxCount: 1,
- count: 0,
- isLore: true,
- isNonRefundable: true,
- isExperimentHide: true,
- allowed() {
- return true
- },
- requires: "",
- effect() {
- setTimeout(() => { //a short delay, I can't remember why
- lore.techCount++
- if (lore.techCount > lore.techGoal - 1) {
- tech.removeLoreTechFromPool();
- } else {
- for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech
- if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`
- }
- for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
- }
- }, 1);
- },
- remove() {}
- })
- }
- },
- junk: [
+ //**************************************************
+ //************************************************** JUNK
+ //************************************************** tech
+ //**************************************************
// {
// name: "junk",
// description: "",
// maxCount: 9,
// count: 0,
- // numberInPool: 0,
+ // frequency: 0,
// isNonRefundable: true,
// isExperimentHide: true,
// isJunk: true,
@@ -4555,7 +4776,7 @@
description: "become an alternate version of yourself
every 20 seconds",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4576,7 +4797,7 @@
description: "sign up to learn endless easy ways to win n-gon
that landgreen doesn't want you to know about!!!1!!",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4596,7 +4817,7 @@
description: "add music to n-gon",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4614,7 +4835,7 @@
description: "display performance stats to n-gon",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4647,7 +4868,7 @@
description: "erase all junk tech from the possible pool
probably...",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4669,7 +4890,7 @@
description: "fly around with no legs
reduce combat difficulty by 1 level",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4688,7 +4909,7 @@
// description: "reduce block density and friction for this level",
// maxCount: 9,
// count: 0,
- // numberInPool: 0,
+ // frequency: 0,
// isNonRefundable: true,
// isExperimentHide: true,
// isJunk: true,
@@ -4709,7 +4930,7 @@
description: "oscillate the pitch of your world",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4727,7 +4948,7 @@
description: "produce a blue glow around everything
and probably some simulation lag",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4746,7 +4967,7 @@
description: `ctx.globalCompositeOperation = "lighter"`,
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4764,7 +4985,7 @@
description: "every 5 seconds rewind 2 seconds
lasts 120 seconds",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4784,7 +5005,7 @@
description: "convert your energy into blocks",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4814,7 +5035,7 @@
description: "advance to the next level",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4832,7 +5053,7 @@
description: "spawn a tech power up
add 64 junk tech to the potential pool",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4851,7 +5072,7 @@
description: "every 10 seconds drain your energy
return it doubled 10 seconds later
lasts 180 seconds",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4877,7 +5098,7 @@
description: "fire missiles for the next 60 seconds",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4903,7 +5124,7 @@
description: "drop grenades for the next 120 seconds",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -4925,36 +5146,36 @@
},
remove() {}
},
- {
- name: "inverted input",
- description: "left input becomes right and up input becomes down",
- maxCount: 9,
- count: 0,
- numberInPool: 0,
- isNonRefundable: true,
- isExperimentHide: true,
- isJunk: true,
- allowed() {
- return true
- },
- requires: "",
- effect() {
- const left = input.key.left
- input.key.left = input.key.right
- input.key.right = left
+ // {
+ // name: "inverted input",
+ // description: "left input becomes right and up input becomes down",
+ // maxCount: 9,
+ // count: 0,
+ // frequency: 0,
+ // isNonRefundable: true,
+ // isExperimentHide: true,
+ // isJunk: true,
+ // allowed() {
+ // return true
+ // },
+ // requires: "",
+ // effect() {
+ // const left = input.key.left
+ // input.key.left = input.key.right
+ // input.key.right = left
- const up = input.key.up
- input.key.up = input.key.down
- input.key.down = up
- },
- remove() {}
- },
+ // const up = input.key.up
+ // input.key.up = input.key.down
+ // input.key.down = up
+ // },
+ // remove() {}
+ // },
{
name: "Sleipnir",
description: "grow more legs",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5003,7 +5224,7 @@
description: "indicate gun fire delay through a rotation of your head",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5047,7 +5268,7 @@
description: "don't",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5119,7 +5340,7 @@
description: "you cycle through different colors",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5145,7 +5366,7 @@
description: "all your bots are converted to the same random model",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5203,7 +5424,7 @@
description: "increase combat difficulty by 1 level",
maxCount: 1,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5221,7 +5442,7 @@
description: "stun all mobs for up to 8 seconds",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5239,7 +5460,7 @@
description: "eject all your guns",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5267,7 +5488,7 @@
description: "eject all your research",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5286,7 +5507,7 @@
description: "use all your energy to
spawn inside the event horizon of a huge black hole",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5305,7 +5526,7 @@
description: "spawn 2 research
spawn 40 nearby black holes",
maxCount: 9,
count: 0,
- numberInPool: 0,
+ frequency: 0,
isNonRefundable: true,
isExperimentHide: true,
isJunk: true,
@@ -5326,7 +5547,84 @@
},
remove() {}
},
+ //**************************************************
+ //************************************************** undefined / lore
+ //************************************************** tech
+ //**************************************************
+ {
+ name: `undefined`,
+ // description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`,
+ description: `this`,
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ isLore: true,
+ isNonRefundable: true,
+ isExperimentHide: true,
+ allowed() {
+ return true
+ },
+ requires: "",
+ effect() {
+ setTimeout(() => { //a short delay, I can't remember why
+ lore.techCount++
+ if (lore.techCount === lore.techGoal) {
+ // tech.removeLoreTechFromPool();
+ this.frequency = 0;
+ this.description = `null is open`
+ } else {
+ this.frequency += lore.techGoal
+ // for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech
+ // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`
+ // }
+ // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
+ this.description = `uncaught error:
${lore.techGoal-lore.techCount} more required for access to null`
+ }
+ }, 1);
+ },
+ remove() {
+ this.maxCount = lore.techGoal
+ }
+ }
],
+ // addLoreTechToPool() { //adds lore tech to tech pool
+ // if (!simulation.isCheating) {
+ // tech.tech.push({
+ // name: `undefined`,
+ // description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // isLore: true,
+ // isNonRefundable: true,
+ // isExperimentHide: true,
+ // allowed() {
+ // return true
+ // },
+ // requires: "",
+ // effect() {
+ // setTimeout(() => { //a short delay, I can't remember why
+ // lore.techCount++
+ // if (lore.techCount > lore.techGoal - 1) {
+ // // tech.removeLoreTechFromPool();
+ // for (let i = tech.tech.length - 1; i > 0; i--) {
+ // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
+ // }
+ // } else {
+ // for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech
+ // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`
+ // }
+ // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool()
+ // }
+ // }, 1);
+ // },
+ // remove() {}
+ // })
+ // }
+ // },
+ // junk: [
+
+ // ],
//variables use for gun tech upgrades
fireRate: null,
bulletSize: null,
diff --git a/todo.txt b/todo.txt
index 1db2f81..438061b 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,10 +1,14 @@
******************************************************** NEXT PATCH ********************************************************
-tech: flip-flip - does nothing, except toggle on collisions
-tech: NOR gate - when flip-flip is ON take 0 harm from collisions
-tech: NAND gate - when flip-flip is ON do 55.5% damage
-tech: transistor - when flip-flop is ON regen 22 energy/s, when OFF drain 3.1 energy /s
-tech: shift registers - set flip-flop to ON with a new level
+some tech now has 2x,3x,4x frequency of showing up
+ (most tech is at 1x, a few are at 2x if they have a rare requirement to unlock)
+reworked junk and lore tech systems
+ (might be some new bugs)
+
+tech that used to just summon a power up now also increases tech frequency
+removed the 4 perpetual techs
+
+maybe fixed immune boss bug on detours level
******************************************************** BUGS ********************************************************
@@ -50,8 +54,6 @@ use the floor of portal sensor on the player? to unstuck player
******************************************************** TODO ********************************************************
-flip-flop: 13% dup chance while ON
-
tech- foam is attracted to mobs
use a gravitational attraction model?
could foam be attracted to other foam bullets too?