diff --git a/.DS_Store b/.DS_Store
index a208d48..21bb93d 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 5b8132c..e8631be 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -96,13 +96,16 @@ const b = {
outOfAmmo() { //triggers after firing when you have NO ammo
simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
m.fireCDcycle = m.cycle + 30; //fire cooldown
- if (tech.isAmmoFromHealth) {
- if (m.health > 0.03) {
- m.damage(0.03 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
- if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo");
- }
- }
+ if (tech.isAmmoFromHealth && m.maxHealth > 0.01) {
+ tech.extraMaxHealth -= 0.01 //decrease max health
+ m.setMaxHealth();
+ for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo");
+ // if (m.health > 0.03) {
+ // m.damage(0.03 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
+ // if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
+ //
+ // }
+ // }
}
},
giveGuns(gun = "random", ammoPacks = 10) {
@@ -1206,7 +1209,7 @@ const b = {
didExtruderDrain: false,
canExtruderFire: true,
extruder() {
- const DRAIN = 0.0006 + m.fieldRegen
+ const DRAIN = 0.0007 + m.fieldRegen
if (m.energy > DRAIN && b.canExtruderFire) {
m.energy -= DRAIN
if (m.energy < 0) {
@@ -1225,7 +1228,7 @@ const b = {
frictionAir: 0,
isInHole: true, //this keeps the bullet from entering wormholes
minDmgSpeed: 0,
- dmg: b.dmgScale * 1.5, //damage also changes when you divide by mob.mass on in .do()
+ dmg: b.dmgScale * 1.4, //damage also changes when you divide by mob.mass on in .do()
classType: "bullet",
isBranch: false,
restitution: 0,
@@ -2107,7 +2110,7 @@ const b = {
}
}
//power ups
- if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxHealth) {
+ if (!this.isImproved && !simulation.isChoosing && !tech.isExtraMaxEnergy) {
if (this.lockedOn) {
//grab, but don't lock onto nearby power up
for (let i = 0, len = powerUp.length; i < len; ++i) {
@@ -3460,8 +3463,8 @@ const b = {
name: "shotgun",
description: "fire a wide burst of short range bullets",
ammo: 0,
- ammoPack: 5.5,
- defaultAmmoPack: 5.5,
+ ammoPack: 5,
+ defaultAmmoPack: 5,
have: false,
do() {},
fire() {
diff --git a/js/index.js b/js/index.js
index b37ed73..96aa9ab 100644
--- a/js/index.js
+++ b/js/index.js
@@ -504,13 +504,30 @@ const build = {
if (isCustom) {
url += `&level=${Math.abs(Number(document.getElementById("starting-level").value))}`
url += `&noPower=${Number(document.getElementById("no-power-ups").checked)}`
- alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.')
+ // alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.')
} else {
simulation.makeTextLog("n-gon build URL copied to clipboard.
Paste into browser address bar.")
}
console.log('n-gon build URL copied to clipboard.\nPaste into browser address bar.')
console.log(url)
- simulation.copyToClipBoard(url)
+
+ navigator.clipboard.writeText(url).then(function() {
+ /* clipboard successfully set */
+ if (isCustom) {
+ setTimeout(function() {
+ alert('n-gon build URL copied to clipboard.\nPaste into browser address bar.')
+ }, 300);
+ }
+ }, function() {
+ /* clipboard write failed */
+ if (isCustom) {
+ setTimeout(function() {
+ alert('copy failed')
+ }, 300);
+ }
+ console.log('copy failed')
+ });
+
},
startExperiment() {
build.isExperimentSelection = false;
@@ -1165,7 +1182,6 @@ function cycle() {
simulation.clearMap();
level.start();
}
-
simulation.loop();
// if (isNaN(m.health) || isNaN(m.energy)) {
// console.log(`m.health = ${m.health}`)
diff --git a/js/level.js b/js/level.js
index 1d23970..e4b025d 100644
--- a/js/level.js
+++ b/js/level.js
@@ -80,9 +80,9 @@ const level = {
simulation.draw.setPaths();
b.respawnBots();
m.resetHistory();
- if (tech.isExtraMaxHealth) {
- tech.extraMaxHealth += Math.min(0.03 * powerUps.totalPowerUps, 0.51)
- m.setMaxHealth();
+ if (tech.isExtraMaxEnergy) {
+ tech.healMaxEnergyBonus += 0.03 * powerUps.totalPowerUps //Math.min(0.02 * powerUps.totalPowerUps, 0.51)
+ m.setMaxEnergy();
}
if (tech.isGunCycle) {
b.inventoryGun++;
@@ -1099,9 +1099,7 @@ const level = {
doCustomTopLayer = []
offset = { x: 0, y: 0 }
enterOptions = [
- () => { //lasers
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => { //lasers
level.setPosToSpawn(x + 2300, y - 800);
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20);
spawn.mapRect(x + 1850, y - 1350, 50, 450); //entrance left wall
@@ -1163,9 +1161,7 @@ const level = {
// }
]
exitOptions = [
- () => { //8 spinners
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => { //8 spinners
level.exit.x = x + 1250;
level.exit.y = y - 980;
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
@@ -1188,7 +1184,7 @@ const level = {
spawn.bodyRect(x + 1075, y - 1075, 100, 125, 0.25);
spawn.bodyRect(x + 1450, y - 1050, 100, 100, 0.25);
- const density = 0.001
+ const density = 0.0015 + (simulation.difficultyMode < 3 ? 0.003 : 0)
const angle = 0
const variance = Math.PI
const frictionAir = 0
@@ -1240,9 +1236,7 @@ const level = {
}
)
},
- () => { //7 spinners
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => { //7 spinners
level.exit.x = x + 2450;
level.exit.y = y - 980;
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20);
@@ -1252,33 +1246,39 @@ const level = {
spawn.bodyRect(x + 1275, y - 475, 125, 125, 0.25);
spawn.bodyRect(x + 1825, y - 125, 125, 125, 0.25);
spawn.bodyRect(x + 500, y - 100, 125, 100, 0.25);
- spawn.bodyRect(x + 0, y - 150, 100, 150, 0.25);
+ spawn.bodyRect(x + 800, y - 150, 100, 150, 0.25);
spawn.bodyRect(x + 2375, y - 150, 125, 150, 0.25);
if (Math.random() > 0.5) {
- const density = 0.0013
+ const density = 0.0012 + (simulation.difficultyMode < 3 ? 0.002 : 0)
const angle = Math.PI / 2
- const variance = 0.3 //Math.PI
- const frictionAir = 0.01
- balance1 = level.spinner(x + 1150, y - 500, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
- balance3 = level.spinner(x + 600, y - 600, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance2 = level.spinner(x + 125, y - 850, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance4 = level.spinner(x + 650, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance5 = level.spinner(x + 1100, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance6 = level.spinner(x + 1550, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance7 = level.spinner(x + 2000, y - 1145, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ const variance = 0.2 //Math.PI
+ const frictionAir = 0.012
+ const height = 35
+ balance1 = level.spinner(x + 1150, y - 500, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
+ balance3 = level.spinner(x + 600, y - 600, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ balance2 = level.spinner(x + 125, y - 850, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ balance4 = level.spinner(x + 650, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ balance5 = level.spinner(x + 1100, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ balance6 = level.spinner(x + 1550, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ balance7 = level.spinner(x + 2000, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
} else {
- const density = 0.0013
+ const density = 0.001 + (simulation.difficultyMode < 3 ? 0.002 : 0)
const angle = Math.PI / 2
- const variance = 0 //Math.PI
- const frictionAir = 0.01
- balance1 = level.spinner(x + 150, y - 500, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
- balance2 = level.spinner(x + 2300, y - 550, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance4 = level.spinner(x + 1850, y - 550, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance3 = level.spinner(x + 650, y - 700, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance5 = level.spinner(x + 1100, y - 900, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance6 = level.spinner(x + 1550, y - 900, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
- balance7 = level.spinner(x + 1970, y - 1150, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
+ const variance = Math.PI
+ const frictionAir = 0
+ const width = 200
+ const height = 200
+ const angularVelocity = 0.01
+ const spinVariance = 0.02
+
+ balance1 = level.spinner(x + 50, y - 350, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
+ balance4 = level.spinner(x + 350, y - 550, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance3 = level.spinner(x + 650, y - 700, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance5 = level.spinner(x + 950, y - 850, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance2 = level.spinner(x + 1250, y - 650, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance6 = level.spinner(x + 1600, y - 850, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance7 = level.spinner(x + 2000, y - 800, height, width, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
}
spawn.randomMob(x + 1175, y - 725, 0.1);
spawn.randomMob(x + 1450, y - 725, 0.2);
@@ -1314,35 +1314,78 @@ const level = {
}
]
emptyOptions = [ //nothing good here
- () => {
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => {
if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) spawn.randomLevelBoss(x + 1250, y - 600);
}
]
lootOptions = [ //has some power up reward //field, ammo, research, gun
- () => {
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => {
powerUps.spawnStartingPowerUps(x + 1250, y - 100);
}
]
upDownOptions = [ //extra tall vertical section 3000x3000 //this is where the level boss is
- () => {
- const x = offset.x
- const y = offset.y
+ (x = offset.x, y = offset.y) => {
+ const elevator1 = level.elevator(x + 1100, y - 200, 250, 30, -2100, 0.0015) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) {
+ const toggle = level.toggle(650, 0, false, true) // toggle(x, y, isOn = false, isLockOn = false) {
+ toggle.isAddedElements = false
-
- const elevator = level.elevator(x + 1200, y - 100, 380, 50, -2000, 0.001) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) {
-
- // if (simulation.difficulty > 3)
- spawn.randomLevelBoss(x + 1250, y - 1400);
doCustomTopLayer.push(
() => {
- elevator.move()
+ elevator1.move()
+ toggle.query();
+ if (toggle.isOn && !toggle.isAddedElements) {
+ toggle.isAddedElements = true //only do this once
+
+ // if (simulation.difficulty > 3)
+ spawn.randomLevelBoss(x + 1250, y - 1400);
+
+ spawn.mapRect(1375, -1400, 1375, 1225);
+ len = map.length - 1
+ map[len].collisionFilter.category = cat.map;
+ map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet;
+ Matter.Body.setStatic(map[len], true); //make static
+ World.add(engine.world, map[len]); //add to world
+
+ // spawn.mapRect(1800, -1825, 725, 1550);
+ spawn.mapRect(-175, -1400, 1250, 1225);
+ len = map.length - 1
+ map[len].collisionFilter.category = cat.map;
+ map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet;
+ Matter.Body.setStatic(map[len], true); //make static
+ World.add(engine.world, map[len]); //add to world
+
+ //see map in world
+ simulation.draw.setPaths() //update map graphics
+ }
}
)
+ },
+ (x = offset.x, y = offset.y) => {
+ const elevator1 = level.elevator(x + 1100, y - 200, 250, 30, -2100, 0.0015) // elevator(x, y, width, height, maxHeight, force = 0.003, friction = { up: 0.01, down: 0.2 }, isTeleport = false) {
+ // const elevator1 = level.elevator(x + 175, y - 200, 250, 30, -1400, 0.001)
+ // const elevator2 = level.elevator(x + 2175, y - 200, 250, 30, -1400, 0.001)
+ spawn.mapRect(-200, -1400, 350, 50); //up left door ledge
+ spawn.mapRect(2450, -1400, 350, 50); //up right door ledge
+
+ spawn.mapRect(225, -450, 350, 350); //left crawl zone
+ // spawn.mapRect(725, -175, 275, 75);
+ spawn.mapRect(725, -225, 350, 100);
+ spawn.mapRect(275, -750, 200, 200);
+ spawn.mapRect(1375, -700, 500, 750); //right side big elevator wall
+ spawn.mapRect(2375, -325, 350, 50);
+ spawn.mapRect(1800, -500, 250, 50);
+
+ //up high elevator
+ spawn.mapRect(1375, -2100, 500, 175);
+ spawn.mapRect(600, -2100, 475, 175);
+
+ if (simulation.difficulty > 3) spawn.randomLevelBoss(x + 1250, y - 1400);
+ doCustomTopLayer.push(
+ () => {
+ elevator1.move()
+ }
+ )
}
]
//pick which type of room spawns
@@ -1350,8 +1393,8 @@ const level = {
exit = exitOptions[Math.floor(Math.random() * exitOptions.length)];
empty = emptyOptions[Math.floor(Math.random() * emptyOptions.length)];
loot = lootOptions[Math.floor(Math.random() * lootOptions.length)];
- upDown = upDownOptions[Math.floor(Math.random() * upDownOptions.length)];
-
+ // upDown = upDownOptions[Math.floor(Math.random() * upDownOptions.length)];
+ upDown = upDownOptions[0] //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION ***************************************
//3x2: 4 short rooms (3000x1500), 1 double tall room (3000x3000)
//rooms
let rooms = ["enter", "empty", "loot", "exit"]
@@ -1457,7 +1500,7 @@ const level = {
};
powerUps.addResearchToLevel() //needs to run after mobs are spawned
- level.setPosToSpawn(0, 0); //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION ***************************************
+ level.setPosToSpawn(200, -100); //********************************* DO !NOT! RUN THIS LINE IN THE FINAL VERSION ***************************************
},
null() {
level.levels.pop(); //remove lore level from rotation
diff --git a/js/player.js b/js/player.js
index c6f6036..4b9d2e4 100644
--- a/js/player.js
+++ b/js/player.js
@@ -628,7 +628,7 @@ const m = {
}
if (tech.isEnergyHealth) {
- m.energy -= dmg * 1.1;
+ m.energy -= dmg * 1.15;
if (m.energy < 0 || isNaN(m.energy)) { //taking deadly damage
if (tech.isDeathAvoid && powerUps.research.count && !tech.isDeathAvoidedThisLevel) {
tech.isDeathAvoidedThisLevel = true
@@ -1312,7 +1312,7 @@ const m = {
x: player.velocity.x - (15 * unit.x) / massRoot,
y: player.velocity.y - (15 * unit.y) / massRoot
});
- if (mob[i].isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
+ if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
if (m.crouch) {
Matter.Body.setVelocity(player, {
@@ -1332,7 +1332,7 @@ const m = {
x: player.velocity.x - (20 * unit.x) / massRoot,
y: player.velocity.y - (20 * unit.y) / massRoot
});
- if (mob[i].isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
+ if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
if (who.isDropPowerUp && player.speed < 12) {
const massRootCap = Math.sqrt(Math.min(10, Math.max(0.4, who.mass))); // masses above 12 can start to overcome the push back
diff --git a/js/simulation.js b/js/simulation.js
index e75b58b..522c074 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -1104,42 +1104,6 @@ const simulation = {
// if line1 and line2 are segments, they intersect if both of the above are true
return result;
},
- copyToClipBoard(value) {
- // Create a fake textarea
- const textAreaEle = document.createElement('textarea');
-
- // Reset styles
- textAreaEle.style.border = '0';
- textAreaEle.style.padding = '0';
- textAreaEle.style.margin = '0';
-
- // Set the absolute position
- // User won't see the element
- textAreaEle.style.position = 'absolute';
- textAreaEle.style.left = '-9999px';
- textAreaEle.style.top = `0px`;
-
- // Set the value
- textAreaEle.value = value
-
- // Append the textarea to body
- document.body.appendChild(textAreaEle);
-
- // Focus and select the text
- textAreaEle.focus();
- textAreaEle.select();
-
- // Execute the "copy" command
- try {
- document.execCommand('copy');
- } catch (err) {
- // Unable to copy
- console.log(err)
- } finally {
- // Remove the textarea
- document.body.removeChild(textAreaEle);
- }
- },
constructMouseDownPosition: {
x: 0,
y: 0
@@ -1160,18 +1124,6 @@ const simulation = {
ctx.strokeRect(x, y, dx, dy);
}
},
- outputMapString(string) {
- if (string) simulation.constructMapString.push(string) //store command as a string in the next element of an array
- let out = "" //combine set of map strings to one string
- let outHTML = ""
- for (let i = 0, len = simulation.constructMapString.length; i < len; i++) {
- out += simulation.constructMapString[i];
- outHTML += "
" + simulation.constructMapString[i] + "
"
- }
- console.log(out)
- simulation.copyToClipBoard(out)
- document.getElementById("construct").innerHTML = outHTML
- },
enableConstructMode() {
simulation.isConstructionMode = true;
simulation.isHorizontalFlipped = false;
@@ -1203,8 +1155,8 @@ const simulation = {
map[len].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet;
Matter.Body.setStatic(map[len], true); //make static
World.add(engine.world, map[len]); //add to world
-
simulation.draw.setPaths() //update map graphics
+
} else if (e.which === 3) { //add body
simulation.outputMapString(`spawn.bodyRect(${x}, ${y}, ${dx}, ${dy});`);
@@ -1246,5 +1198,53 @@ const simulation = {
simulation.outputMapString();
}
});
- }
+ },
+ outputMapString(string) {
+ if (string) simulation.constructMapString.push(string) //store command as a string in the next element of an array
+ let out = "" //combine set of map strings to one string
+ let outHTML = ""
+ for (let i = 0, len = simulation.constructMapString.length; i < len; i++) {
+ out += simulation.constructMapString[i];
+ outHTML += "" + simulation.constructMapString[i] + "
"
+ }
+ console.log(out)
+ navigator.clipboard.writeText(out).then(function() { /* clipboard successfully set */ }, function() { /* clipboard write failed */ console.log('copy failed') });
+ document.getElementById("construct").innerHTML = outHTML
+ },
+ // copyToClipBoard(value) {
+ // // Create a fake textarea
+ // const textAreaEle = document.createElement('textarea');
+
+ // // Reset styles
+ // textAreaEle.style.border = '0';
+ // textAreaEle.style.padding = '0';
+ // textAreaEle.style.margin = '0';
+
+ // // Set the absolute position
+ // // User won't see the element
+ // textAreaEle.style.position = 'absolute';
+ // textAreaEle.style.left = '-9999px';
+ // textAreaEle.style.top = `0px`;
+
+ // // Set the value
+ // textAreaEle.value = value
+
+ // // Append the textarea to body
+ // document.body.appendChild(textAreaEle);
+
+ // // Focus and select the text
+ // textAreaEle.focus();
+ // textAreaEle.select();
+
+ // // Execute the "copy" command
+ // try {
+ // document.execCommand('copy');
+ // } catch (err) {
+ // // Unable to copy
+ // console.log(err)
+ // } finally {
+ // // Remove the textarea
+ // document.body.removeChild(textAreaEle);
+ // }
+ // },
};
\ No newline at end of file
diff --git a/js/spawn.js b/js/spawn.js
index 2cae736..c4c39a4 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -1477,7 +1477,7 @@ const spawn = {
mobs.spawn(x, y, 0, radius, "transparent");
let me = mob[mob.length - 1];
Matter.Body.setDensity(me, 0.25); //extra dense //normal is 0.001
- me.laserRange = 350;
+ me.laserRange = 300;
me.seeAtDistance2 = 2000000;
me.isBoss = true;
me.showHealthBar = false; //drawn in this.awake
@@ -1534,9 +1534,9 @@ const spawn = {
const rotation = simulation.cycle * 0.015
const phase = simulation.cycle * 0.021
ctx.lineWidth = 1;
- ctx.fillStyle = "rgba(150,0,255,0.1)"
+ ctx.fillStyle = "rgba(150,0,255,0.05)"
ctx.strokeStyle = "#70f"
- for (let i = 0, len = 7; i < len; i++) {
+ for (let i = 0, len = 6; i < len; i++) {
ctx.beginPath();
ctx.ellipse(this.position.x, this.position.y, this.laserRange * Math.abs(Math.sin(phase + i / len * Math.PI)), this.laserRange, rotation, 0, 2 * Math.PI);
ctx.fill();
diff --git a/js/tech.js b/js/tech.js
index 2b072ee..6fc84c3 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -181,7 +181,7 @@
return dmg * tech.slowFire * tech.aimDamage
},
duplicationChance() {
- return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.047 + tech.duplicateChance + m.duplicateChance
+ return (tech.isPowerUpsVanish ? 0.2 : 0) + (tech.isStimulatedEmission ? 0.22 : 0) + tech.cancelCount * 0.05 + tech.duplicateChance + m.duplicateChance
},
maxDuplicationEvent() {
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) {
@@ -204,6 +204,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return b.inventory.length === 1 //&& !tech.haveGunCheck("CPT gun")
},
@@ -233,6 +234,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return b.inventory.length > 1 && !tech.isEnergyHealth
},
@@ -254,6 +256,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return b.inventory.length > 1
},
@@ -271,6 +274,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return b.inventory.length > 1
},
@@ -290,6 +294,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.isDamageForGuns || tech.isFireRateForGuns) && (b.inventory.length + 5) < b.guns.length
},
@@ -364,6 +369,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyNoAmmo
},
@@ -381,6 +387,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
isNonRefundable: true,
isBadRandomOption: true,
allowed() {
@@ -397,14 +404,15 @@
},
{
name: "catabolism",
- description: "when you fire while out of ammo
gain 4 ammo, but lose 3 health",
+ description: "when you fire while out of ammo
gain 4 ammo, but lose 1 max health",
maxCount: 1,
count: 0,
- frequency: 2,
+ frequency: 1,
+ frequencyDefault: 1,
allowed() {
- return m.harmReduction() < 1 && !tech.isEnergyHealth && !tech.isEnergyNoAmmo
+ return !tech.isEnergyHealth && !tech.isEnergyNoAmmo
},
- requires: "some harm reduction, not mass-energy equivalence, exciton-lattice",
+ requires: "not mass-energy equivalence or exciton-lattice",
effect: () => {
tech.isAmmoFromHealth = true;
},
@@ -418,6 +426,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -471,6 +480,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !m.isShipMode && !tech.isAlwaysFire
},
@@ -494,6 +504,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -515,6 +526,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.Fx > 0.016 && !tech.isEnergyHealth
},
@@ -532,6 +544,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.Fx > 0.016
},
@@ -549,6 +562,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -566,6 +580,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -584,6 +599,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -621,6 +637,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isExplosionStun
},
@@ -638,6 +655,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isBulletsLastLonger > 1
},
@@ -656,6 +674,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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 || tech.isIceField || tech.relayIce || tech.blockingIce > 1
},
@@ -673,6 +692,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio
},
@@ -690,6 +710,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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 || tech.isBlockExplosion)
},
@@ -707,6 +728,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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 || tech.isBlockExplosion)
},
@@ -724,6 +746,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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 || tech.isBlockExplosion)
},
@@ -760,6 +783,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 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 || tech.isBlockExplosion)
},
@@ -778,6 +802,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 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 || tech.isBlockExplosion)
},
@@ -796,6 +821,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser || tech.isBlockExplosion
},
@@ -813,6 +839,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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
},
@@ -830,6 +857,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1
},
@@ -847,6 +875,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1 || tech.isBlockExplosion) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
@@ -864,6 +893,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
@@ -881,6 +911,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.iceIXOnDeath
},
@@ -901,6 +932,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath
},
@@ -923,6 +955,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (b.totalBots() > 1 || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && !tech.isEnergyHealth
},
@@ -940,6 +973,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNoFireDefense
},
@@ -1438,6 +1472,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "wormhole"
},
@@ -1473,6 +1508,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion
},
@@ -1544,6 +1580,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
allowed() {
return true
},
@@ -1562,6 +1599,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true //tech.collisionImmuneCycles > 30
},
@@ -1611,6 +1649,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
allowed() {
return !tech.isRelay
},
@@ -1648,6 +1687,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
allowed() {
return !tech.isFlipFlop
},
@@ -1743,6 +1783,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
},
@@ -1760,6 +1801,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath
},
@@ -1777,6 +1819,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1 || tech.iceIXOnDeath
},
@@ -1794,6 +1837,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isStunField || tech.isExplosionStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1 || tech.iceIXOnDeath
},
@@ -1829,6 +1873,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return simulation.fpsCapDefault > 45
},
@@ -1868,6 +1913,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.harmReduction() < 1
},
@@ -1888,6 +1934,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyHealth && m.harmReduction() < 1
},
@@ -1905,6 +1952,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.harmReduction() < 1
},
@@ -1922,6 +1970,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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
},
@@ -1957,6 +2006,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isExplosionHarm && tech.isRewindAvoidDeath
},
@@ -1974,6 +2024,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm)
},
@@ -1992,6 +2043,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isBlockExplosion) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
},
@@ -2011,13 +2063,13 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
- return !tech.isNoHeals && !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage
+ return !tech.isAmmoFromHealth && !tech.isNoHeals && !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage
},
requires: "not exothermic process, piezoelectricity, CPT, 1st law, negative mass , ...",
effect: () => {
m.health = 0
- // m.displayHealth();
document.getElementById("health").style.display = "none"
document.getElementById("health-bg").style.display = "none"
document.getElementById("dmg").style.backgroundColor = "#0cf";
@@ -2041,6 +2093,7 @@
maxCount: 1,
count: 0,
frequency: 3,
+ frequencyDefault: 3,
allowed() {
return tech.isEnergyHealth && !tech.isNoHeals
},
@@ -2054,19 +2107,56 @@
},
remove() {
tech.healGiveMaxEnergy = false;
- tech.healMaxEnergyBonus = 0
+ // tech.healMaxEnergyBonus = 0
powerUps.heal.color = "#0eb"
for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live
if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color
}
}
},
+ {
+ name: "inductive coupling",
+ description: "each unused power up at the end of a level
adds 3 max energy", // (up to 51 health per level)",
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return tech.isEnergyHealth && !tech.isDroneGrab
+ },
+ requires: "mass-energy equivalence, not drone harvester",
+ effect() {
+ tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth
+ },
+ remove() {
+ tech.isExtraMaxEnergy = false;
+ }
+ },
+ {
+ name: "transceiver chip",
+ description: "unused power ups at the end of each level
are still activated (selections are random)",
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return tech.isExtraMaxEnergy
+ },
+ requires: "inductive coupling",
+ effect() {
+ tech.isEndLevelPowerUp = true;
+ },
+ remove() {
+ tech.isEndLevelPowerUp = false;
+ }
+ },
{
name: "electrolytes",
description: "increase damage by 1%
for every 9 stored energy",
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.maxEnergy > 1 || tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isBlockExplosion
},
@@ -2084,6 +2174,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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"
},
@@ -2101,6 +2192,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyHealth
},
@@ -2156,6 +2248,7 @@
maxCount: 9,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
allowed() {
return true
},
@@ -2177,6 +2270,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 || tech.isMassEnergy || tech.isBlockExplosion
},
@@ -2196,6 +2290,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.damageFromTech() > 1
},
@@ -2250,6 +2345,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return true
},
@@ -2285,6 +2381,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.health < 0.5 || build.isExperimentSelection
},
@@ -2302,6 +2399,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (m.harmReduction() < 1 || tech.healthDrain || tech.isLowHealthDmg || tech.isHealthRecovery || tech.isHealLowHealth || tech.largerHeals > 1) && !tech.isEnergyHealth
},
@@ -2337,6 +2435,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.maxHealth > 1;
},
@@ -2374,8 +2473,8 @@
description: "increase your maximum health by 100
landings that force you to crouch cause harm",
maxCount: 1,
count: 0,
- frequency: 1,
- frequencyDefault: 1,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyHealth && !tech.isNoHeals
},
@@ -2395,8 +2494,8 @@
description: "if you're at full health heal power ups do harm
but they also increase your maximum health",
maxCount: 1,
count: 0,
- frequency: 1,
- frequencyDefault: 1,
+ frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isEnergyHealth && !tech.isNoHeals
},
@@ -2408,54 +2507,18 @@
tech.isOverHeal = false;
}
},
- {
- name: "inductive coupling",
- 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,
- frequencyDefault: 1,
- allowed() {
- return !tech.isEnergyHealth && !tech.isDroneGrab && !tech.isNoHeals
- },
- requires: "not mass-energy equivalence, not drone harvester, ergodicity",
- effect() {
- tech.isExtraMaxHealth = true; //tracked by tech.extraMaxHealth
- },
- remove() {
- tech.isExtraMaxHealth = false;
- // tech.extraMaxHealth = 0; //this is now reset in tech.setupAllTech();
- m.setMaxHealth();
- }
- },
- {
- name: "transceiver chip",
- description: "unused power ups at the end of each level
are still activated (selections are random)",
- maxCount: 1,
- count: 0,
- frequency: 2,
- allowed() {
- return tech.isExtraMaxHealth
- },
- requires: "inductive coupling",
- effect() {
- tech.isEndLevelPowerUp = true;
- },
- remove() {
- tech.isEndLevelPowerUp = false;
- }
- },
{
name: "negentropy",
description: `at the start of each level
spawn a heal for every 33 missing health`,
maxCount: 1,
count: 0,
- frequency: 2,
+ frequency: 1,
+ frequencyDefault: 1,
isHealTech: true,
allowed() {
- return m.health > 0.1 && (m.maxHealth > 1 || tech.isExtraMaxHealth) && !tech.isNoHeals
+ return m.health > 0.1 && !tech.isNoHeals
},
- requires: "increased max health, not ergodicity",
+ requires: "has some health, not ergodicity",
effect() {
tech.isHealLowHealth = true;
},
@@ -2469,6 +2532,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
isHealTech: true,
allowed() {
return ((m.health / m.maxHealth) < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth && !tech.isNoHeals
@@ -2514,6 +2578,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
isHealTech: true,
allowed() {
return powerUps.research.count > 0 || build.isExperimentSelection
@@ -2554,6 +2619,7 @@
maxCount: 1,
count: 0,
frequency: 4,
+ frequencyDefault: 4,
allowed() {
return !tech.isSwitchReality && !tech.isResearchReality && tech.isDeathAvoid && !tech.isCollisionRealitySwitch
},
@@ -2631,6 +2697,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism
},
@@ -2650,6 +2717,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (powerUps.research.count > 3 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste
},
@@ -2667,6 +2735,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return powerUps.research.count === 0 && !tech.isAnsatz
},
@@ -2688,6 +2757,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste
},
@@ -2705,6 +2775,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return powerUps.research.count > 4 || build.isExperimentSelection
},
@@ -2722,6 +2793,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
isNonRefundable: true,
isBadRandomOption: true,
allowed() {
@@ -2846,29 +2918,9 @@
powerUps.setDo(); //needed after adjusting duplication chance
}
},
- // {
- // name: "attract",
- // description: "",
- // maxCount: 1,
- // count: 0,
- // frequency: 1,
- // frequencyDefault: 1,
- // allowed() {
- // return true
- // },
- // requires: "",
- // effect: () => {
- // tech.isPowerUpsAttract = true
- // powerUps.setDo(); //needed after adjusting duplication chance
- // },
- // remove() {
- // tech.isPowerUpsAttract = false
- // powerUps.setDo(); //needed after adjusting duplication chance
- // }
- // },
{
name: "futures exchange",
- description: "clicking × to cancel a field, tech, or gun
adds 4.7% power up duplication chance",
+ description: "clicking × to cancel a field, tech, or gun
adds 5% power up duplication chance",
maxCount: 1,
count: 0,
frequency: 1,
@@ -2894,6 +2946,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
allowed() {
return !tech.isDeterminism
},
@@ -2911,6 +2964,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.duplicationChance() > 0.15
},
@@ -2928,6 +2982,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.duplicationChance() > 0
},
@@ -2945,6 +3000,7 @@
maxCount: 1,
count: 0,
frequency: 6,
+ frequencyDefault: 6,
allowed() {
return tech.duplicationChance() > 0.66
},
@@ -3116,6 +3172,7 @@
maxCount: 1,
count: 0,
frequency: 1,
+ frequencyDefault: 1,
isNonRefundable: true,
isBadRandomOption: true,
allowed() {
@@ -3143,6 +3200,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return !tech.isDeterminism
},
@@ -3267,6 +3325,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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 ||
},
@@ -3310,6 +3369,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isRivets
},
@@ -3348,6 +3408,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNeedles && !tech.isNailRadiation
},
@@ -3366,6 +3427,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isNeedles
},
@@ -3398,6 +3460,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isRivets
},
@@ -3416,6 +3479,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isRivets && !tech.isNeedles && !tech.isNailRadiation && !tech.isNailCrit
},
@@ -3453,6 +3517,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles
},
@@ -3479,6 +3544,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals
},
@@ -3505,6 +3571,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.isNailShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) && !tech.isIceCrystals
},
@@ -3523,6 +3590,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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
},
@@ -3541,6 +3609,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNailRadiation && !tech.isFastRadiation
},
@@ -3559,6 +3628,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNailRadiation && !tech.isSlowRadiation
},
@@ -3572,11 +3642,12 @@
},
{
name: "shotgun spin-statistics",
- description: "immune to harm while firing the shotgun
ammo costs are doubled",
+ description: "immune to harm while firing the shotgun
shotgun ammo gives 50% less shots",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("shotgun")
},
@@ -3617,6 +3688,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot
},
@@ -3635,6 +3707,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("shotgun") && !tech.isNailShot
},
@@ -3653,6 +3726,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("shotgun")
},
@@ -3671,6 +3745,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls") && !tech.oneSuperBall
},
@@ -3689,6 +3764,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls") && !tech.oneSuperBall
},
@@ -3715,6 +3791,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls") && tech.superBallNumber === 3 && !tech.superBallDelay
},
@@ -3741,6 +3818,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("super balls")
},
@@ -3759,6 +3837,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3777,6 +3856,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3800,6 +3880,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3820,6 +3901,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3840,6 +3922,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("wave beam")
},
@@ -3858,6 +3941,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("missiles") || tech.isMissileField
},
@@ -3876,6 +3960,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("missiles")
},
@@ -3894,6 +3979,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
isBot: true,
isBotTech: true,
allowed() {
@@ -3917,6 +4003,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("grenades")
},
@@ -3937,6 +4024,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("grenades") && !tech.isNeutronBomb
},
@@ -3957,6 +4045,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("grenades") && !tech.fragments && !tech.isVacuumBomb
},
@@ -3977,6 +4066,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNeutronBomb
},
@@ -3995,6 +4085,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isNeutronBomb
},
@@ -4013,6 +4104,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineSentry
},
@@ -4031,6 +4123,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("mine") && !tech.isMineSentry
},
@@ -4049,6 +4142,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine
},
@@ -4088,6 +4182,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("spores")
},
@@ -4106,6 +4201,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -4125,6 +4221,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -4143,6 +4240,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField
},
@@ -4161,6 +4259,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth
},
@@ -4179,6 +4278,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))
},
@@ -4197,8 +4297,9 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
- return !tech.isExtraMaxHealth && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)))
+ return !tech.isExtraMaxEnergy && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)))
},
requires: "drones, not inductive coupling",
effect() {
@@ -4215,6 +4316,7 @@
maxCount: 3,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))
},
@@ -4241,6 +4343,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("drones")
},
@@ -4259,6 +4362,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam") || tech.foamBotCount > 1
},
@@ -4277,6 +4381,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam") || tech.foamBotCount > 1
},
@@ -4297,6 +4402,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam") || tech.foamBotCount > 1
},
@@ -4315,6 +4421,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam")
},
@@ -4333,6 +4440,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam")
},
@@ -4351,6 +4459,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -4369,6 +4478,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -4387,6 +4497,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("rail gun")
},
@@ -4405,6 +4516,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") || tech.laserBotCount > 1 || tech.isLaserMine
},
@@ -4423,6 +4535,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.laserBotCount > 1
},
@@ -4442,6 +4555,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser
},
@@ -4464,6 +4578,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.isPulseAim && !tech.historyLaser
},
@@ -4490,6 +4605,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.historyLaser
},
@@ -4518,6 +4634,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") && tech.isWideLaser
},
@@ -4546,6 +4663,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isWideLaser
},
@@ -4574,6 +4692,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser
},
@@ -4600,6 +4719,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return tech.isPulseLaser && !tech.beamSplitter
},
@@ -4623,6 +4743,7 @@
maxCount: 9,
count: 0,
frequency: 3,
+ frequencyDefault: 3,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics"
},
@@ -4646,6 +4767,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics"
},
@@ -4665,6 +4787,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
},
@@ -4683,6 +4806,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
},
@@ -4701,6 +4825,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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"
},
@@ -4719,6 +4844,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
},
@@ -4840,6 +4966,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -4863,6 +4990,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -4886,6 +5014,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab)
},
@@ -4909,6 +5038,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -4928,6 +5058,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth
},
@@ -4946,6 +5077,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field"
},
@@ -4964,6 +5096,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field"
},
@@ -4982,6 +5115,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
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"
},
@@ -5041,6 +5175,7 @@
maxCount: 9,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder
},
@@ -5059,6 +5194,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch"
},
@@ -5077,6 +5213,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isPlasmaRange === 1
},
@@ -5095,6 +5232,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field"
},
@@ -5115,6 +5253,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation field"
},
@@ -5139,6 +5278,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation field") && tech.energyRegen !== 0
},
@@ -5159,6 +5299,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
},
@@ -5177,6 +5318,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
},
@@ -5213,6 +5355,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -5233,6 +5376,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
@@ -5270,6 +5414,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -5288,6 +5433,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -5306,6 +5452,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -5324,6 +5471,7 @@
maxCount: 1,
count: 0,
frequency: 2,
+ frequencyDefault: 2,
allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
},
@@ -6820,7 +6968,7 @@
squirrelJump: null,
fastTimeJump: null,
isFastRadiation: null,
- isExtraMaxHealth: null,
+ isExtraMaxEnergy: null,
isAmmoForGun: null,
isRapidPulse: null,
isPulseAim: null,
@@ -6862,7 +7010,7 @@
isCloakStun: null,
bonusEnergy: null,
healGiveMaxEnergy: null,
- healMaxEnergyBonus: null,
+ healMaxEnergyBonus: 0, //not null
aimDamage: null,
isNoFireDefense: null,
isNoFireDamage: null,
diff --git a/todo.txt b/todo.txt
index eb25533..3f935ae 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,11 +1,11 @@
******************************************************** NEXT PATCH ********************************************************
-tech: quenching - if you're at full health heal power ups do harm but they also increase your max health
+catabolism - lowers your max health by 1 (was 3 harm) and gives 4 ammo
+inductive coupling - gives max energy for leftover power ups (was max health)
+ now requires mass-energy equivalence
-you can play with camera smoothing now in the console
- m.lookSmoothing = 0.07, //1 is instant/jerky, 0.01 is slow zoom, 0.07 is standard
-
-more progress on level - labs
+switched to a newer copy, paste URL
+ this seems to fix issues with failed text copy in the level builder if you hold mouse down for over 6 seconds
******************************************************** BUGS ********************************************************