accretion

field tech: accretion - health power ups follow you around and they travel with you to the to next level
  spawn 6 heal power ups
  negative mass, plasma torch

foam gun tech cavitation - more knock back, and 25% to make a foam bullet extra large and fast

foam-bots now discharge a few bullets in a stream with a long reload time
laser-bot +5% energy drain, -5% damage
nail-bot +10% fire rate
This commit is contained in:
landgreen
2023-03-26 19:52:07 -07:00
parent 3ea8bfd638
commit c6144515cd
13 changed files with 370 additions and 194 deletions

BIN
img/accretion.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
img/cavitation.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -119,7 +119,9 @@
<option value="crossfire"> <option value="crossfire">
<option value="temple"> <option value="temple">
<option value="run"> <option value="run">
<!-- biohazard <!--
fortress
biohazard
islands islands
tunnel tunnel
clock clock
@@ -139,7 +141,8 @@
dripp dripp
crossfire crossfire
temple temple
run --> run
-->
</datalist> </datalist>
<br> <br>
<label for="classic-select" title="play older versions of n-gon">classic n-gon:</label> <label for="classic-select" title="play older versions of n-gon">classic n-gon:</label>

View File

@@ -4064,6 +4064,10 @@ const b = {
// Matter.Body.setVelocity(bullet[me], velocity); // Matter.Body.setVelocity(bullet[me], velocity);
// }, // },
foam(position, velocity, radius) { foam(position, velocity, radius) {
if (tech.isFoamCavitation && Math.random() < 0.25) {
velocity = Vector.mult(velocity, 1.35)
radius = 1.2 * radius + 13
}
// radius *= Math.sqrt(tech.bulletSize) // radius *= Math.sqrt(tech.bulletSize)
const me = bullet.length; const me = bullet.length;
bullet[me] = Bodies.polygon(position.x, position.y, 20, radius, { bullet[me] = Bodies.polygon(position.x, position.y, 20, radius, {
@@ -4840,7 +4844,7 @@ const b = {
minDmgSpeed: 2, minDmgSpeed: 2,
// lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20, // lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20,
lastLookCycle: simulation.cycle + 60 * Math.random(), lastLookCycle: simulation.cycle + 60 * Math.random(),
delay: Math.floor((tech.isNailBotUpgrade ? 20 : 110) * b.fireCDscale), delay: Math.floor((tech.isNailBotUpgrade ? 20 : 100) * b.fireCDscale),
acceleration: 0.005 * (1 + 0.5 * Math.random()), acceleration: 0.005 * (1 + 0.5 * Math.random()),
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
endCycle: Infinity, endCycle: Infinity,
@@ -4875,7 +4879,7 @@ const b = {
b.nail(this.position, Vector.mult(unit, SPEED)) b.nail(this.position, Vector.mult(unit, SPEED))
this.force = Vector.mult(unit, -0.018 * this.mass) this.force = Vector.mult(unit, -0.018 * this.mass)
} else { } else {
const SPEED = 35 const SPEED = 40
b.nail(this.position, Vector.mult(unit, SPEED)) b.nail(this.position, Vector.mult(unit, SPEED))
this.force = Vector.mult(unit, -0.01 * this.mass) this.force = Vector.mult(unit, -0.01 * this.mass)
} }
@@ -4965,10 +4969,7 @@ const b = {
}) })
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
}, },
foamBot(position = { foamBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true) {
x: player.position.x + 50 * (Math.random() - 0.5),
y: player.position.y + 50 * (Math.random() - 0.5)
}, isConsole = true) {
if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.foamBot()`); if (isConsole) simulation.makeTextLog(`<span class='color-var'>b</span>.foamBot()`);
const me = bullet.length; const me = bullet.length;
const dir = m.angle; const dir = m.angle;
@@ -4983,11 +4984,13 @@ const b = {
restitution: 0.6 * (1 + 0.5 * Math.random()), restitution: 0.6 * (1 + 0.5 * Math.random()),
dmg: 0, // 0.14 //damage done in addition to the damage from momentum dmg: 0, // 0.14 //damage done in addition to the damage from momentum
minDmgSpeed: 2, minDmgSpeed: 2,
lookFrequency: 60 + Math.floor(17 * Math.random()) - 45 * tech.isFoamBotUpgrade, lookFrequency: 60 + Math.floor(17 * Math.random()) - 50 * tech.isFoamBotUpgrade,
cd: 0, cd: 0,
delay: 20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade, fireCount: 0,
fireLimit: 5 + 2 * tech.isFoamBotUpgrade,
delay: Math.floor((200 + (tech.isFoamBotUpgrade ? 0 : 300)) * b.fireCDscale),// + 30 - 20 * tech.isFoamBotUpgrade,//20 + Math.floor(85 * b.fireCDscale) - 20 * tech.isFoamBotUpgrade,
acceleration: 0.005 * (1 + 0.5 * Math.random()), acceleration: 0.005 * (1 + 0.5 * Math.random()),
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(), //how far from the player the bot will move
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -4996,29 +4999,93 @@ const b = {
}, },
beforeDmg() { }, beforeDmg() { },
onEnd() { }, onEnd() { },
do() { fireTarget: { x: 0, y: 0 },
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, m.pos)) fire() {
if (distanceToPlayer > this.range) { //if far away move towards player this.fireCount++
this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, this.position)), this.mass * this.acceleration) if (this.fireCount > this.fireLimit) {
} else { //close to player this.fireCount = 0
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity this.cd = simulation.cycle + this.delay;
} // else {this.cd = simulation.cycle + 1;}
if (this.cd < simulation.cycle && !(simulation.cycle % this.lookFrequency) && !m.isCloak) { const radius = 5 + 3 * Math.random()
let target const SPEED = Math.max(5, 25 - radius * 0.4); //(m.crouch ? 32 : 20) - radius * 0.7;
const velocity = Vector.mult(Vector.normalise(Vector.sub(this.fireTarget, this.position)), SPEED)
b.foam(this.position, Vector.rotate(velocity, 0.07 * (Math.random() - 0.5)), radius + 6 * this.isUpgraded)
//recoil
// const force = Vector.mult(Vector.normalise(velocity), 0.005 * this.mass * (tech.isFoamCavitation ? 2 : 1))
const force = Vector.mult(velocity, 0.0001 * this.mass * (tech.isFoamCavitation ? 2 : 1))
this.force.x -= force.x
this.force.y -= force.y
},
do() {
if (this.fireCount === 0) { //passive mode: look for targets and following player
const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, m.pos))
if (distanceToPlayer > this.range) { //if far away move towards player
this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, this.position)), this.mass * this.acceleration)
} else { //close to player
Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
}
if (this.cd < simulation.cycle && !m.isCloak && !(simulation.cycle % this.lookFrequency)) {
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
if (dist2 < 1000000 && !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && !mob[i].isInvulnerable) { if (dist2 < 1700000 && !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && !mob[i].isInvulnerable) {
this.cd = simulation.cycle + this.delay; this.fireTarget = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60)) //set target to where the mob will be in 1 second
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60)) this.fire()
const radius = 6 + 7 * Math.random()
const SPEED = 29 - radius * 0.4; //(m.crouch ? 32 : 20) - radius * 0.7;
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
b.foam(this.position, velocity, radius + 7.5 * this.isUpgraded)
break; break;
} }
} }
} }
} else { //fire mode: quickly fire at targets and doesn't follow player
this.fire()
} }
// const distanceToPlayer = Vector.magnitude(Vector.sub(this.position, m.pos))
// if (distanceToPlayer > this.range) { //if far away move towards player
// this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, this.position)), this.mass * this.acceleration)
// } else { //close to player
// Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity
// //&& !(simulation.cycle % this.lookFrequency)
// if (this.cd < simulation.cycle && !m.isCloak) {
// let target
// for (let i = 0, len = mob.length; i < len; i++) {
// const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
// if (dist2 < 2000000 && !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && !mob[i].isInvulnerable) {
// this.fireCount++
// if (this.fireCount > 5) {
// this.fireCount = 0
// this.cd = simulation.cycle + this.delay;
// } else {
// // this.cd = simulation.cycle + 1;
// }
// target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
// const radius = 6 + 7 * Math.random()
// const SPEED = Math.max(5, 25 - radius * 0.4); //(m.crouch ? 32 : 20) - radius * 0.7;
// const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
// b.foam(this.position, velocity, radius + 7.5 * this.isUpgraded)
// //recoil
// // const force = Vector.mult(Vector.normalise(velocity), 0.005 * this.mass * (tech.isFoamCavitation ? 2 : 1))
// const force = Vector.mult(velocity, 0.0003 * this.mass * (tech.isFoamCavitation ? 2 : 1))
// this.force.x -= force.x
// this.force.y -= force.y
// break;
// }
// }
// }
// }
} }
}) })
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
@@ -5040,17 +5107,14 @@ const b = {
restitution: 0.5 * (1 + 0.5 * Math.random()), restitution: 0.5 * (1 + 0.5 * Math.random()),
acceleration: 0.0015 * (1 + 0.3 * Math.random()), acceleration: 0.0015 * (1 + 0.3 * Math.random()),
playerRange: 140 + Math.floor(30 * Math.random()) + 2 * b.totalBots(), playerRange: 140 + Math.floor(30 * Math.random()) + 2 * b.totalBots(),
offPlayer: { offPlayer: { x: 0, y: 0, },
x: 0,
y: 0,
},
dmg: 0, //damage done in addition to the damage from momentum dmg: 0, //damage done in addition to the damage from momentum
minDmgSpeed: 2, minDmgSpeed: 2,
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade, lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()), range: (700 + 500 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,// laser bot will not attack if the player is below this energy drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,// laser bot will not attack if the player is below this energy
drain: (0.52 - 0.44 * tech.isLaserBotUpgrade) * tech.laserDrain, drain: (0.57 - 0.45 * tech.isLaserBotUpgrade) * tech.laserDrain,
laserDamage: 0.82 + 0.8 * tech.isLaserBotUpgrade, laserDamage: 0.75 + 0.75 * tech.isLaserBotUpgrade,
endCycle: Infinity, endCycle: Infinity,
classType: "bullet", classType: "bullet",
collisionFilter: { collisionFilter: {
@@ -7139,11 +7203,15 @@ const b = {
name: "foam", //8 name: "foam", //8
description: "spray bubbly foam that <strong>sticks</strong> to mobs<br><strong class='color-s'>slows</strong> mobs and does <strong class='color-d'>damage</strong> over time", description: "spray bubbly foam that <strong>sticks</strong> to mobs<br><strong class='color-s'>slows</strong> mobs and does <strong class='color-d'>damage</strong> over time",
ammo: 0, ammo: 0,
ammoPack: 24, //set in froth flotation ammoPack: 24,
have: false, have: false,
charge: 0, charge: 0,
isDischarge: false, isDischarge: false,
knockBack: 0.001, knockBack: 0.0005, //set in tech: cavitation
applyKnock(velocity) {
player.force.x -= this.knockBack * velocity.x
player.force.y -= 2 * this.knockBack * velocity.y
},
chooseFireMethod() { chooseFireMethod() {
if (tech.isFoamPressure) { if (tech.isFoamPressure) {
this.do = this.doCharges this.do = this.doCharges
@@ -7171,9 +7239,7 @@ const b = {
y: m.pos.y + 30 * Math.sin(m.angle) y: m.pos.y + 30 * Math.sin(m.angle)
} }
b.foam(position, Vector.rotate(velocity, spread), radius) b.foam(position, Vector.rotate(velocity, spread), radius)
//knock back player this.applyKnock(velocity)
player.force.x -= this.knockBack * velocity.x
player.force.y -= this.knockBack * velocity.y
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale); m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
}, },
doCharges() { doCharges() {
@@ -7200,9 +7266,7 @@ const b = {
y: m.pos.y + 30 * Math.sin(m.angle) y: m.pos.y + 30 * Math.sin(m.angle)
} }
b.foam(position, Vector.rotate(velocity, spread), radius) b.foam(position, Vector.rotate(velocity, spread), radius)
//knock back player this.applyKnock(velocity)
player.force.x -= this.knockBack * velocity.x
player.force.y -= this.knockBack * velocity.y
this.charge -= 0.75 this.charge -= 0.75
m.fireCDcycle = m.cycle + 2; //disable firing and adding more charge until empty m.fireCDcycle = m.cycle + 2; //disable firing and adding more charge until empty
} else if (!input.fire) { } else if (!input.fire) {
@@ -7248,9 +7312,7 @@ const b = {
// } else { // } else {
// } // }
b.foam(position, Vector.rotate(velocity, spread), radius) b.foam(position, Vector.rotate(velocity, spread), radius)
//knock back player this.applyKnock(velocity)
player.force.x -= this.knockBack * velocity.x
player.force.y -= this.knockBack * velocity.y
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale); m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
this.charge += 1 + tech.isCapacitor this.charge += 1 + tech.isCapacitor
}, },

View File

@@ -10,7 +10,7 @@ const level = {
// playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"], // playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"],
//see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , gauntlet, final) added later //see level.populateLevels: (intro, ... , reservoir or factory, reactor, ... , gauntlet, final) added later
playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"], playableLevels: ["labs", "rooftops", "skyscrapers", "warehouse", "highrise", "office", "aerie", "satellite", "sewers", "testChamber", "pavilion", "lock"],
communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "n-gon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour"], communityLevels: ["stronghold", "basement", "crossfire", "vats", "run", "ngon", "house", "perplex", "coliseum", "tunnel", "islands", "temple", "dripp", "biohazard", "stereoMadness", "yingYang", "staircase", "fortress", "commandeer", "clock", "buttonbutton", "downpour"],
trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"], trainingLevels: ["walk", "crouch", "jump", "hold", "throw", "throwAt", "deflect", "heal", "fire", "nailGun", "shotGun", "superBall", "matterWave", "missile", "stack", "mine", "grenades", "harpoon"],
levels: [], levels: [],
start() { start() {
@@ -18,7 +18,7 @@ const level = {
// simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode // simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode
// simulation.isHorizontalFlipped = true // simulation.isHorizontalFlipped = true
// tech.giveTech("performance") // tech.giveTech("performance")
// level.difficultyIncrease(0 * 4) //30 is near max on hard //60 is near max on why // level.difficultyIncrease(4 * 4) //30 is near max on hard //60 is near max on why
// spawn.setSpawnList(); // spawn.setSpawnList();
// spawn.setSpawnList(); // spawn.setSpawnList();
// m.maxHealth = m.health = 100 // m.maxHealth = m.health = 100
@@ -27,7 +27,7 @@ const level = {
// m.immuneCycle = Infinity //you can't take damage // m.immuneCycle = Infinity //you can't take damage
// tech.tech[297].frequency = 100 // tech.tech[297].frequency = 100
// m.couplingChange(5) // m.couplingChange(5)
// m.setField("metamaterial cloaking") //1 standing wave 2 perfect diamagnetism 3 negative mass 4 molecular assembler 5 plasma torch 6 time dilation 7 metamaterial cloaking 8 pilot wave 9 wormhole // m.setField("negative mass") //1 standing wave 2 perfect diamagnetism 3 negative mass 4 molecular assembler 5 plasma torch 6 time dilation 7 metamaterial cloaking 8 pilot wave 9 wormhole
// simulation.molecularMode = 2 // simulation.molecularMode = 2
// m.damage(0.1); // m.damage(0.1);
// b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser // b.giveGuns("nail gun") //0 nail gun 1 shotgun 2 super balls 3 wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
@@ -35,20 +35,21 @@ const level = {
// b.guns[3].ammo = 100000000 // b.guns[3].ammo = 100000000
// tech.giveTech("recycling") // tech.giveTech("recycling")
// tech.giveTech("pressure vessel") // tech.giveTech("pressure vessel")
// for (let i = 0; i < 1; ++i) tech.giveTech("pseudoscience") // for (let i = 0; i < 1; ++i) tech.giveTech("cavitation")
// for (let i = 0; i < 1; ++i) tech.giveTech("options exchange") // for (let i = 0; i < 1; ++i) tech.giveTech("accretion")
// for (let i = 0; i < 1; i++) tech.giveTech("laser-bot") // for (let i = 0; i < 1; ++i) tech.giveTech("superdeterminism")
// for (let i = 0; i < 1; i++) tech.giveTech("simulated annealing") // requestAnimationFrame(() => { for (let i = 0; i < 1; i++) tech.giveTech("foam-bot") });
// for (let i = 0; i < 1; i++) tech.giveTech("foam-bot upgrade")
// for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech"); // for (let i = 0; i < 3; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "boost");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
// level.downpour(); // level.testing();
// spawn.nodeGroup(3200, -300, "sniper") // spawn.nodeGroup(3200, -300, "sniper")
// spawn.nodeGroup(2200, -300, "sniper") // spawn.nodeGroup(2200, -300, "sniper")
// spawn.nodeGroup(2200, -300, "sniper") // spawn.nodeGroup(2200, -300, "sniper")
// spawn.mantisBoss(1900, -500) // spawn.mantisBoss(1900, -500)
// spawn.sneakBoss(1900, -500) // spawn.sneakBoss(1900, -500)
// spawn.starter(1900, -500, 50) // spawn.starter(1900, -500, 250)
// spawn.sneaker(1900, -500, 25) // spawn.sneaker(1900, -500, 25)
// spawn.sniper(2000, -450) // spawn.sniper(2000, -450)
// spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color) // spawn.zombie(1000 + 1000 * Math.random(), -500 + 300 * Math.random(), 30, 5, "white") // zombie(x, y, radius, sides, color)
@@ -65,7 +66,7 @@ const level = {
// simulation.setZoom(); // simulation.setZoom();
// for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech"); // for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
// for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "gun"); // for (let i = 0; i < 2; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "gun");
// for (let i = 0; i < 10; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research"); // for (let i = 0; i < 10; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "heal");
// for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "field", false); // for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + Math.random() * 50, player.position.y - Math.random() * 50, "field", false);
//lore testing //lore testing
// for (let i = 0; i < 5; i++) tech.giveTech("undefined") // for (let i = 0; i < 5; i++) tech.giveTech("undefined")
@@ -1313,6 +1314,13 @@ const level = {
Matter.Body.setVelocity(bullet[i], { x: 0, y: 0 }); Matter.Body.setVelocity(bullet[i], { x: 0, y: 0 });
} }
} }
if (tech.isHealAttract && (m.fieldMode === 3 || m.fieldMode === 5)) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal" && Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 1000000) {
Matter.Body.setPosition(powerUp[i], Vector.add(this.portalPair.portal.position, { x: 500 * (Math.random() - 0.5), y: 500 * (Math.random() - 0.5) }));
}
}
}
} }
// if (body.length) { // if (body.length) {
for (let i = 0, len = body.length; i < len; i++) { for (let i = 0, len = body.length; i < len; i++) {
@@ -9249,8 +9257,8 @@ const level = {
portal2[2].draw() portal2[2].draw()
} }
}, },
"n-gon"() { //make by Oranger ngon() { //make by Oranger
simulation.makeTextLog(`<strong>"n-gon"</strong> by <span class='color-var'>Oranger</span>`); simulation.makeTextLog(`<strong>"ngon"</strong> by <span class='color-var'>Oranger</span>`);
document.body.style.backgroundColor = "#dcdcde"; document.body.style.backgroundColor = "#dcdcde";
let needGravity = []; let needGravity = [];
@@ -18166,7 +18174,6 @@ const level = {
}, },
downpour() { downpour() {
simulation.makeTextLog(`<strong>Downpour</strong> by <span class='color-var'>DesBoot</span>`); simulation.makeTextLog(`<strong>Downpour</strong> by <span class='color-var'>DesBoot</span>`);
simulation.makeTextLog(`<span class='color-var'>level</span>.onLevel = "Downpour"`);
let mobsspawned = 0 let mobsspawned = 0
const laser = level.hazard(7492, -2612, 10, 500, 0.3) //laserintro const laser = level.hazard(7492, -2612, 10, 500, 0.3) //laserintro

View File

@@ -1854,7 +1854,7 @@ const m = {
}, },
setMaxEnergy() { setMaxEnergy() {
// (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling + // (m.fieldMode === 0 || m.fieldMode === 1) * 0.4 * m.coupling +
m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.66 * (m.fieldUpgrades[m.fieldMode].name === "standing wave") m.maxEnergy = (tech.isMaxEnergyTech ? 0.5 : 1) + tech.bonusEnergy + tech.healMaxEnergyBonus + tech.harmonicEnergy + 2 * tech.isGroundState + 3 * tech.isRelay * tech.isFlipFlopOn * tech.isRelayEnergy + 0.66 * (m.fieldMode === 1)
// if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.defense()) // if (tech.isEnergyHealth) m.maxEnergy *= Math.sqrt(m.defense())
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-f'>maxEnergy</span> <span class='color-symbol'>=</span> ${(m.maxEnergy.toFixed(2))}`) simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-f'>maxEnergy</span> <span class='color-symbol'>=</span> ${(m.maxEnergy.toFixed(2))}`)
}, },
@@ -3050,6 +3050,29 @@ const m = {
this.fieldDrawRadius = 0 this.fieldDrawRadius = 0
} }
m.drawRegenEnergy("rgba(0,0,0,0.2)") m.drawRegenEnergy("rgba(0,0,0,0.2)")
if (tech.isHealAttract) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal") {
//&& Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 500000
let attract = Vector.mult(Vector.normalise(Vector.sub(m.pos, powerUp[i].position)), 0.01 * powerUp[i].mass)
powerUp[i].force.x += attract.x;
powerUp[i].force.y += attract.y - powerUp[i].mass * simulation.g; //negate gravity
Matter.Body.setVelocity(powerUp[i], Vector.mult(powerUp[i].velocity, 0.7));
}
}
}
// powerUp[i].force.x += 0.05 * (dxP / Math.sqrt(dist2)) * powerUp[i].mass;
// powerUp[i].force.y += 0.05 * (dyP / Math.sqrt(dist2)) * powerUp[i].mass - powerUp[i].mass * simulation.g; //negate gravity
// //extra friction
// Matter.Body.setVelocity(powerUp[i], {
// x: powerUp[i].velocity.x * 0.11,
// y: powerUp[i].velocity.y * 0.11
// });
} }
} }
}, },
@@ -3539,6 +3562,17 @@ const m = {
} }
m.drawRegenEnergy("rgba(0, 0, 0, 0.2)") m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
m.plasmaBall.do() m.plasmaBall.do()
if (tech.isHealAttract) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal") {
//&& Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 500000
let attract = Vector.mult(Vector.normalise(Vector.sub(m.pos, powerUp[i].position)), 0.01 * powerUp[i].mass)
powerUp[i].force.x += attract.x;
powerUp[i].force.y += attract.y - powerUp[i].mass * simulation.g; //negate gravity
Matter.Body.setVelocity(powerUp[i], Vector.mult(powerUp[i].velocity, 0.7));
}
}
}
} }
} else if (tech.isExtruder) { } else if (tech.isExtruder) {
m.hold = function () { m.hold = function () {
@@ -3581,6 +3615,17 @@ const m = {
ctx.lineWidth = tech.extruderRange; ctx.lineWidth = tech.extruderRange;
ctx.strokeStyle = "rgba(255,0,110,0.06)" ctx.strokeStyle = "rgba(255,0,110,0.06)"
ctx.stroke(); ctx.stroke();
if (tech.isHealAttract) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal") {
//&& Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 500000
let attract = Vector.mult(Vector.normalise(Vector.sub(m.pos, powerUp[i].position)), 0.01 * powerUp[i].mass)
powerUp[i].force.x += attract.x;
powerUp[i].force.y += attract.y - powerUp[i].mass * simulation.g; //negate gravity
Matter.Body.setVelocity(powerUp[i], Vector.mult(powerUp[i].velocity, 0.7));
}
}
}
} }
} else { } else {
m.hold = function () { m.hold = function () {
@@ -3599,6 +3644,17 @@ const m = {
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists) m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
} }
m.drawRegenEnergy("rgba(0, 0, 0, 0.2)") m.drawRegenEnergy("rgba(0, 0, 0, 0.2)")
if (tech.isHealAttract) {
for (let i = 0; i < powerUp.length; i++) {
if (powerUp[i].name === "heal") {
//&& Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 500000
let attract = Vector.mult(Vector.normalise(Vector.sub(m.pos, powerUp[i].position)), 0.01 * powerUp[i].mass)
powerUp[i].force.x += attract.x;
powerUp[i].force.y += attract.y - powerUp[i].mass * simulation.g; //negate gravity
Matter.Body.setVelocity(powerUp[i], Vector.mult(powerUp[i].velocity, 0.7));
}
}
}
} }
} }
}, },

View File

@@ -695,9 +695,11 @@ const powerUps = {
} }
text += `</span>&nbsp; <span class='research-select'>${tech.isResearchReality ? "<span class='alt'>alternate reality</span>" : "research"}</span></div></div></span>` text += `</span>&nbsp; <span class='research-select'>${tech.isResearchReality ? "<span class='alt'>alternate reality</span>" : "research"}</span></div></div></span>`
} else { } else {
text += `<span class='research-card' style="width: 275px;float: right; background-color: #bbb;">research</span>` //&zwnj; text += `<span class='research-card' style="width: 275px;float: right; background-color: #aaa;color:#888;">research</span>` //&zwnj;
} }
if (tech.isCancelTech) { if (tech.isSuperDeterminism) {
text += `<span class='cancel-card' style="width: 95px;float: right;background-color: #aaa;color:#888;">cancel</span>`
} else if (tech.isCancelTech) {
text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 115px;float: right;font-size:0.9em;padding-top:5px">randomize</span>` text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 115px;float: right;font-size:0.9em;padding-top:5px">randomize</span>`
} else { } else {
text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 95px;float: right;">cancel</span>` text += `<span class='cancel-card' onclick='powerUps.endDraft("${type}",true)' style="width: 95px;float: right;">cancel</span>`
@@ -873,7 +875,7 @@ const powerUps = {
for (let i = 0; i < b.guns.length; i++) { for (let i = 0; i < b.guns.length; i++) {
if (!b.guns[i].have) options.push(i); if (!b.guns[i].have) options.push(i);
} }
let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave"))) let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + (m.fieldMode === 8)))
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
function removeOption(index) { function removeOption(index) {
for (let i = 0; i < options.length; i++) { for (let i = 0; i < options.length; i++) {
@@ -937,7 +939,7 @@ const powerUps = {
for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter for (let i = 1; i < m.fieldUpgrades.length; i++) { //skip field emitter
if (i !== m.fieldMode) options.push(i); if (i !== m.fieldMode) options.push(i);
} }
let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave"))) let totalChoices = Math.min(options.length, (tech.isDeterminism ? 1 : 2 + tech.extraChoices + (m.fieldMode === 8)))
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
function removeOption(index) { function removeOption(index) {
@@ -1020,7 +1022,7 @@ const powerUps = {
} }
} }
//set total choices //set total choices
let totalChoices = (tech.isDeterminism ? 1 : 3 + tech.extraChoices + (m.fieldUpgrades[m.fieldMode].name === "pilot wave")) let totalChoices = (tech.isDeterminism ? 1 : 3 + tech.extraChoices + (m.fieldMode === 8))
if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay if (tech.isFlipFlopChoices) totalChoices += tech.isRelay ? (tech.isFlipFlopOn ? -1 : 7) : (tech.isFlipFlopOn ? 7 : -1) //flip the order for relay
if (optionLengthNoDuplicates < totalChoices + 1) { //if not enough options for all the choices if (optionLengthNoDuplicates < totalChoices + 1) { //if not enough options for all the choices
totalChoices = optionLengthNoDuplicates totalChoices = optionLengthNoDuplicates

View File

@@ -1,7 +1,7 @@
// game Object ******************************************************** // game Object ********************************************************
//********************************************************************* //*********************************************************************
const simulation = { const simulation = {
loop() {}, //main game loop, gets set to normal or testing loop loop() { }, //main game loop, gets set to normal or testing loop
normalLoop() { normalLoop() {
simulation.gravity(); simulation.gravity();
Engine.update(engine, simulation.delta); Engine.update(engine, simulation.delta);
@@ -591,16 +591,16 @@ const simulation = {
const swapPeriod = 150 const swapPeriod = 150
const len = 30 const len = 30
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
setTimeout(function() { setTimeout(function () {
simulation.wipe = function() { //set wipe to have trails simulation.wipe = function () { //set wipe to have trails
ctx.fillStyle = `rgba(221,221,221,${i*i*0.0005 +0.0025})`; ctx.fillStyle = `rgba(221,221,221,${i * i * 0.0005 + 0.0025})`;
ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillRect(0, 0, canvas.width, canvas.height);
} }
}, (i) * swapPeriod); }, (i) * swapPeriod);
} }
setTimeout(function() { setTimeout(function () {
simulation.wipe = function() { //set wipe to normal simulation.wipe = function () { //set wipe to normal
ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.clearRect(0, 0, canvas.width, canvas.height);
} }
}, len * swapPeriod); }, len * swapPeriod);
@@ -637,7 +637,7 @@ const simulation = {
// } // }
// requestAnimationFrame(loop); // requestAnimationFrame(loop);
// }, // },
wipe() {}, //set in simulation.startGame wipe() { }, //set in simulation.startGame
gravity() { gravity() {
function addGravity(bodies, magnitude) { function addGravity(bodies, magnitude) {
for (var i = 0; i < bodies.length; i++) { for (var i = 0; i < bodies.length; i++) {
@@ -661,7 +661,7 @@ const simulation = {
simulation.clearTimeouts(); simulation.clearTimeouts();
simulation.onTitlePage = true; simulation.onTitlePage = true;
document.getElementById("splash").onclick = function() { document.getElementById("splash").onclick = function () {
simulation.startGame(); simulation.startGame();
}; };
document.getElementById("choose-grid").style.visibility = "hidden" document.getElementById("choose-grid").style.visibility = "hidden"
@@ -784,7 +784,7 @@ const simulation = {
// m.maxEnergy = 1 // m.maxEnergy = 1
// m.energy = 1 // m.energy = 1
input.isPauseKeyReady = true input.isPauseKeyReady = true
simulation.wipe = function() { //set wipe to normal simulation.wipe = function () { //set wipe to normal
ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.clearRect(0, 0, canvas.width, canvas.height);
} }
m.hole.isOn = false m.hole.isOn = false
@@ -865,7 +865,7 @@ const simulation = {
requestAnimationFrame(cycle); //starts game loop requestAnimationFrame(cycle); //starts game loop
}, },
clearTimeouts() { clearTimeouts() {
let id = window.setTimeout(function() {}, 0); let id = window.setTimeout(function () { }, 0);
while (id--) { while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present window.clearTimeout(id); // will do nothing if no timeout with id is present
} }
@@ -943,6 +943,25 @@ const simulation = {
m.hole.isOn = false; m.hole.isOn = false;
simulation.drawList = []; simulation.drawList = [];
//send health power ups to the next level
if (tech.isHealAttract && m.alive && (m.fieldMode === 3 || m.fieldMode === 5)) {
let healCount = 0
for (let i = 0, len = powerUp.length; i < len; i++) {
if (powerUp[i].name === "heal" && Vector.magnitudeSquared(Vector.sub(powerUp[i].position, m.pos)) < 1000000) healCount++
}
//respawn health in animation frame
let respawnHeal = () => {
if (healCount > 0) {
requestAnimationFrame(respawnHeal);
if (!simulation.paused && !simulation.isChoosing) {
healCount--
powerUps.directSpawn(level.enter.x + 50 + 100 * (Math.random() - 0.5), level.enter.y - 60 + 100 * (Math.random() - 0.5), "heal");
}
}
}
requestAnimationFrame(respawnHeal);
}
if (tech.isDronesTravel && m.alive) { if (tech.isDronesTravel && m.alive) {
//count drones //count drones
let droneCount = 0 let droneCount = 0
@@ -1221,7 +1240,7 @@ const simulation = {
} }
if (tech.cyclicImmunity && m.immuneCycle < m.cycle + tech.cyclicImmunity) m.immuneCycle = m.cycle + tech.cyclicImmunity; //player is immune to damage for 60 cycles if (tech.cyclicImmunity && m.immuneCycle < m.cycle + tech.cyclicImmunity) m.immuneCycle = m.cycle + tech.cyclicImmunity; //player is immune to damage for 60 cycles
fallCheck = function(who, save = false) { fallCheck = function (who, save = false) {
let i = who.length; let i = who.length;
while (i--) { while (i--) {
if (who[i].position.y > simulation.fallHeight) { if (who[i].position.y > simulation.fallHeight) {
@@ -1584,9 +1603,9 @@ const simulation = {
outHTML += "<div>" + simulation.constructMapString[i] + "</div>" outHTML += "<div>" + simulation.constructMapString[i] + "</div>"
} }
console.log(out) console.log(out)
navigator.clipboard.writeText(out).then(function() { navigator.clipboard.writeText(out).then(function () {
/* clipboard successfully set */ /* clipboard successfully set */
}, function() { }, function () {
/* clipboard write failed */ /* clipboard write failed */
console.log('copy failed') console.log('copy failed')
}); });

View File

@@ -215,7 +215,7 @@ const tech = {
} }
}, },
hasExplosiveDamageCheck() { hasExplosiveDamageCheck() {
return tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) return tech.haveGunCheck("missiles") || (m.fieldMode === 4 && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
}, },
damage: 1, //used for tech changes to player damage that don't have complex conditions damage: 1, //used for tech changes to player damage that don't have complex conditions
damageFromTech() { damageFromTech() {
@@ -1954,7 +1954,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "wormhole" return m.fieldMode !== 9
}, },
requires: "not wormhole", requires: "not wormhole",
effect() { effect() {
@@ -1973,7 +1973,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return tech.blockDamage > 0.075 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak return tech.blockDamage > 0.075 && m.fieldMode !== 8 && m.fieldMode !== 9 && !tech.isTokamak
}, },
requires: "mass driver, not pilot wave, tokamak, wormhole", requires: "mass driver, not pilot wave, tokamak, wormhole",
effect() { effect() {
@@ -2027,7 +2027,7 @@ const tech = {
// frequency: 2, // frequency: 2,
// frequencyDefault: 2, // frequencyDefault: 2,
// allowed() { // allowed() {
// return (tech.blockDamage > 0.075 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isTokamak // return (tech.blockDamage > 0.075 || m.fieldMode === 8) && !tech.isTokamak
// }, // },
// requires: "mass driver or pilot wave, not tokamak", // requires: "mass driver or pilot wave, not tokamak",
// effect() { // effect() {
@@ -3018,9 +3018,9 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return true return !tech.isHealAttract
}, },
requires: "", requires: "not accretion",
effect() { effect() {
tech.isOverHeal = true; tech.isOverHeal = true;
}, },
@@ -4734,7 +4734,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)
}, },
requires: "a freeze effect", requires: "a freeze effect",
effect() { effect() {
@@ -4753,7 +4753,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)
}, },
requires: "a freeze effect", requires: "a freeze effect",
effect() { effect() {
@@ -4772,7 +4772,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3)) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
}, },
requires: "a localized freeze effect, no other mob death tech", requires: "a localized freeze effect, no other mob death tech",
effect() { effect() {
@@ -4791,7 +4791,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot return (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot
}, },
requires: "ice IX", requires: "ice IX",
effect() { effect() {
@@ -4810,7 +4810,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldMode === 4 && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || (m.coupling && m.fieldMode < 3) || tech.iceIXOnDeath || tech.isIceShot
}, },
requires: "a localized freeze effect", requires: "a localized freeze effect",
effect() { effect() {
@@ -4829,7 +4829,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || ((tech.haveGunCheck("super balls") || tech.isSuperMine) && !tech.isSuperBounce && !tech.isFoamBall && !tech.isSuperHarm) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport) return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || ((tech.haveGunCheck("super balls") || tech.isSuperMine) && !tech.isSuperBounce && !tech.isFoamBall && !tech.isSuperHarm) || (tech.isRivets && !tech.isNailCrit) || (m.fieldMode === 4 && simulation.molecularMode === 3) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport)
}, },
requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane, Zectron", requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane, Zectron",
effect() { effect() {
@@ -5182,7 +5182,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || (m.fieldMode === 4 && simulation.molecularMode === 1) || tech.missileBotCount
}, },
requires: "missiles, not launch system", requires: "missiles, not launch system",
effect() { effect() {
@@ -5201,7 +5201,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1)) && tech.isMissileBig return (tech.haveGunCheck("missiles") || (m.fieldMode === 4 && simulation.molecularMode === 1)) && tech.isMissileBig
}, },
requires: "missiles, cruise missile", requires: "missiles, cruise missile",
effect() { effect() {
@@ -5292,7 +5292,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isImmuneExplosion && tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.isBoomBotUpgrade || tech.isTokamak) return !tech.isImmuneExplosion && tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || (m.fieldMode === 4 && simulation.molecularMode === 1) || tech.isBoomBotUpgrade || tech.isTokamak)
}, },
requires: "an explosive damage source, not ammonium nitrate, nitroglycerin, chain reaction, fragmentation, electric armor", requires: "an explosive damage source, not ammonium nitrate, nitroglycerin, chain reaction, fragmentation, electric armor",
effect() { effect() {
@@ -5311,7 +5311,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075) return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || (m.fieldMode === 4 && simulation.molecularMode === 1) || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075)
}, },
requires: "grenades, missiles, rivets, harpoon, or mass driver, not iridium-192, not polyurethane foam", requires: "grenades, missiles, rivets, harpoon, or mass driver, not iridium-192, not polyurethane foam",
effect() { effect() {
@@ -5407,7 +5407,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)) return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 2) && (tech.haveGunCheck("missiles") || (m.fieldMode === 4 && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb))
}, },
requires: "an explosive damage source, not rocket propelled grenade", requires: "an explosive damage source, not rocket propelled grenade",
effect() { effect() {
@@ -5904,7 +5904,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
}, },
requires: "spores", requires: "spores",
effect() { effect() {
@@ -5926,7 +5926,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
}, },
requires: "spores", requires: "spores",
effect() { effect() {
@@ -5947,7 +5947,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
}, },
requires: "spores", requires: "spores",
effect() { effect() {
@@ -5973,7 +5973,7 @@ const tech = {
// frequency: 3, // frequency: 3,
// frequencyDefault: 3, // frequencyDefault: 3,
// allowed() { // allowed() {
// return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea // return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
// }, // },
// requires: "spores", // requires: "spores",
// effect() { // effect() {
@@ -6001,7 +6001,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0)) || tech.isSporeWorm || tech.isSporeFlea return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0)) || tech.isSporeWorm || tech.isSporeFlea
}, },
requires: "spores", requires: "spores",
effect() { effect() {
@@ -6039,7 +6039,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeWorm return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeWorm
}, },
requires: "spores, not worms", requires: "spores, not worms",
effect() { effect() {
@@ -6059,7 +6059,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldMode === 4 && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea
}, },
requires: "spores, not fleas", requires: "spores, not fleas",
effect() { effect() {
@@ -6099,7 +6099,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.isSporeFollow && (tech.haveGunCheck("spores") || (tech.haveGunCheck("shotgun") && tech.isSporeWorm))) || tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && (simulation.molecularMode === 0 || simulation.molecularMode === 3)) return (tech.isSporeFollow && (tech.haveGunCheck("spores") || (tech.haveGunCheck("shotgun") && tech.isSporeWorm))) || tech.haveGunCheck("drones") || (m.fieldMode === 4 && (simulation.molecularMode === 0 || simulation.molecularMode === 3))
}, },
requires: "spores, worms, flagella, drones", requires: "spores, worms, flagella, drones",
effect() { effect() {
@@ -6119,7 +6119,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3)) return !tech.isDroneRadioactive && (tech.haveGunCheck("drones") || (m.fieldMode === 4 && simulation.molecularMode === 3))
}, },
requires: "drones, not irradiated drones", requires: "drones, not irradiated drones",
effect() { effect() {
@@ -6149,7 +6149,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3) return tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldMode === 4 && simulation.molecularMode === 3)
}, },
requires: "drones", requires: "drones",
effect() { effect() {
@@ -6189,7 +6189,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3)) && !tech.isDroneRadioactive && !tech.isIncendiary return (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldMode === 4 && simulation.molecularMode === 3)) && !tech.isDroneRadioactive && !tech.isIncendiary
}, },
requires: "drones, molecular assembler, not irradiated drones, incendiary", requires: "drones, molecular assembler, not irradiated drones, incendiary",
effect() { effect() {
@@ -6228,7 +6228,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return tech.droneCycleReduction === 1 && !tech.isIncendiary && !tech.isDroneTeleport && (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 3)) return tech.droneCycleReduction === 1 && !tech.isIncendiary && !tech.isDroneTeleport && (tech.haveGunCheck("drones") || tech.isForeverDrones || (m.fieldMode === 4 && simulation.molecularMode === 3))
}, },
requires: "drones, not reduced tolerances, incendiary, torque bursts", requires: "drones, not reduced tolerances, incendiary, torque bursts",
effect() { effect() {
@@ -6453,6 +6453,27 @@ const tech = {
tech.foamDamage = 0.011; tech.foamDamage = 0.011;
} }
}, },
{
name: "cavitation",
description: "<strong>25%</strong> chance to discharge a huge <strong>foam</strong> bubble<br>increase <strong>foam</strong> <strong>recoil</strong> by <strong>100%</strong>",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("foam") || tech.isFoamBotUpgrade || tech.isFoamShot || tech.isFoamBall || tech.isFoamMine
},
requires: "foam",
effect() {
tech.isFoamCavitation = true;
b.guns[8].knockBack = 0.001
},
remove() {
tech.isFoamCavitation = false;
b.guns[8].knockBack = 0.0005
}
},
{ {
name: "foam fractionation", name: "foam fractionation",
description: "if you have below <strong>300</strong> <strong class='color-ammo'>ammo</strong><br><strong>+100%</strong> <strong>foam</strong> <strong class='color-g'>gun</strong> bubble <strong>size</strong>", description: "if you have below <strong>300</strong> <strong class='color-ammo'>ammo</strong><br><strong>+100%</strong> <strong>foam</strong> <strong class='color-g'>gun</strong> bubble <strong>size</strong>",
@@ -6520,27 +6541,6 @@ const tech = {
b.guns[8].chooseFireMethod() b.guns[8].chooseFireMethod()
} }
}, },
// {
// name: "cavitation",
// description: "increase <strong>foam</strong> <strong class='color-g'>gun</strong> <strong>recoil</strong> by <strong>300%</strong><br>",
// isGunTech: true,
// maxCount: 1,
// count: 0,
// frequency: 2,
// frequencyDefault: 2,
// allowed() {
// return tech.haveGunCheck("foam")
// },
// requires: "foam",
// effect() {
// tech.isFoamCavitation = true;
// b.guns[8].knockBack = 0.003
// },
// remove() {
// tech.isFoamCavitation = false;
// b.guns[8].knockBack = 0.001
// }
// },
{ {
name: "capacitor bank", name: "capacitor bank",
// description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>", // description: "<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, foam, railgun, pulse, tokamak</em>",
@@ -6579,11 +6579,11 @@ const tech = {
requires: "harpoon, railgun", requires: "harpoon, railgun",
effect() { effect() {
tech.railChargeRate *= 1.06 tech.railChargeRate *= 1.06
tech.harpoonDensity += 0.0065 tech.harpoonDensity += 0.007
}, },
remove() { remove() {
tech.railChargeRate = 0.97; tech.railChargeRate = 0.97;
tech.harpoonDensity = 0.0065 tech.harpoonDensity = 0.007
} }
}, },
{ {
@@ -7190,7 +7190,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation") && (build.isExperimentSelection || powerUps.research.count > 1) return (m.fieldMode === 1 || m.fieldMode === 8 || m.fieldMode === 6) && (build.isExperimentSelection || powerUps.research.count > 1)
}, },
requires: "standing wave, pilot wave, time dilation", requires: "standing wave, pilot wave, time dilation",
effect() { effect() {
@@ -7215,7 +7215,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave" return m.fieldMode === 1
}, },
requires: "standing wave", requires: "standing wave",
effect() { effect() {
@@ -7239,7 +7239,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave" return m.fieldMode === 1
}, },
requires: "standing wave", requires: "standing wave",
effect() { effect() {
@@ -7263,7 +7263,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" return m.fieldMode === 1 || m.fieldMode === 2
}, },
requires: "standing wave, perfect diamagnetism", requires: "standing wave, perfect diamagnetism",
effect() { effect() {
@@ -7286,7 +7286,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" return m.fieldMode === 1 || m.fieldMode === 2 || m.fieldMode === 8
}, },
requires: "standing wave, perfect diamagnetism, pilot wave", requires: "standing wave, perfect diamagnetism, pilot wave",
effect() { effect() {
@@ -7305,7 +7305,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.blockDmg return (m.fieldMode === 1 || m.fieldMode === 2 || m.fieldMode === 8) && tech.blockDmg
}, },
requires: "bremsstrahlung", requires: "bremsstrahlung",
effect() { effect() {
@@ -7324,7 +7324,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" return m.fieldMode === 2 || m.fieldMode === 1 || m.fieldMode === 4
}, },
requires: "a field that can block", requires: "a field that can block",
effect() { effect() {
@@ -7343,7 +7343,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" return m.fieldMode === 2
}, },
requires: "perfect diamagnetism", requires: "perfect diamagnetism",
effect() { effect() {
@@ -7362,7 +7362,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" return m.fieldMode === 2
}, },
requires: "perfect diamagnetism", requires: "perfect diamagnetism",
effect() { effect() {
@@ -7382,7 +7382,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "negative mass") && (build.isExperimentSelection || powerUps.research.count > 3) return (m.fieldMode === 8 || m.fieldMode === 2 || m.fieldMode === 3) && (build.isExperimentSelection || powerUps.research.count > 3)
}, },
requires: "perfect diamagnetism, negative mass, pilot wave", requires: "perfect diamagnetism, negative mass, pilot wave",
effect() { effect() {
@@ -7405,7 +7405,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" return m.fieldMode === 8 || m.fieldMode === 3
}, },
requires: "negative mass, pilot wave", requires: "negative mass, pilot wave",
effect() { effect() {
@@ -7427,7 +7427,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "standing wave") && !tech.isCloakHealLastHit return (m.fieldMode === 8 || m.fieldMode === 3 || m.fieldMode === 1) && !tech.isCloakHealLastHit
}, },
requires: "negative mass, pilot wave, standing wave, not patch", requires: "negative mass, pilot wave, standing wave, not patch",
effect() { effect() {
@@ -7446,7 +7446,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass" return m.fieldMode === 3
}, },
requires: "negative mass", requires: "negative mass",
effect() { effect() {
@@ -7465,6 +7465,26 @@ const tech = {
} }
} }
}, },
{
name: "accretion",
description: `${powerUps.orb.heal(1)} follow you, even between levels<br>spawn ${powerUps.orb.heal(6)}`,
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldMode === 3 || m.fieldMode === 5) && !tech.isOverHeal
},
requires: "negative mass, plasma torch, not quenching",
effect() {
tech.isHealAttract = true
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");
},
remove() {
tech.isHealAttract = false
},
},
{ {
name: "aerostat", name: "aerostat",
description: `<strong>+88%</strong> <strong class='color-d'>damage</strong> while <strong>off</strong> the <strong>ground</strong><br><strong>-22%</strong> <strong class='color-d'>damage</strong> while <strong>on</strong> the <strong>ground</strong>`, description: `<strong>+88%</strong> <strong class='color-d'>damage</strong> while <strong>off</strong> the <strong>ground</strong><br><strong>-22%</strong> <strong class='color-d'>damage</strong> while <strong>on</strong> the <strong>ground</strong>`,
@@ -7474,7 +7494,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass" return m.fieldMode === 3
}, },
requires: "negative mass", requires: "negative mass",
effect() { effect() {
@@ -7493,7 +7513,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth return m.fieldMode === 3 && !tech.isEnergyHealth
}, },
requires: "negative mass, not mass-energy", requires: "negative mass, not mass-energy",
effect() { effect() {
@@ -7512,7 +7532,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass" return m.fieldMode === 3
}, },
requires: "negative mass", requires: "negative mass",
effect() { effect() {
@@ -7531,7 +7551,7 @@ const tech = {
// frequency: 2, // frequency: 2,
// frequencyDefault: 2, // frequencyDefault: 2,
// allowed() { // allowed() {
// return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || (m.fieldUpgrades[m.fieldMode].name === "time dilation" && !tech.isRewindField) // return m.fieldMode === 8 || m.fieldMode === 3 || (m.fieldMode === 6 && !tech.isRewindField)
// }, // },
// requires: "pilot wave, negative mass, time dilation, not retrocausality", // requires: "pilot wave, negative mass, time dilation, not retrocausality",
// effect() { // effect() {
@@ -7552,7 +7572,7 @@ const tech = {
isBotTech: true, isBotTech: true,
isNonRefundable: true, isNonRefundable: true,
allowed() { allowed() {
return powerUps.research.count > 0 && (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") return powerUps.research.count > 0 && (m.fieldMode === 4 || m.fieldMode === 8)
}, },
requires: "molecular assembler, pilot wave", requires: "molecular assembler, pilot wave",
effect() { effect() {
@@ -7577,7 +7597,7 @@ const tech = {
isBotTech: true, isBotTech: true,
isNonRefundable: true, isNonRefundable: true,
allowed() { allowed() {
return powerUps.research.count > 1 && (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") return powerUps.research.count > 1 && (m.fieldMode === 4 || m.fieldMode === 8)
}, },
requires: "molecular assembler, pilot wave", requires: "molecular assembler, pilot wave",
effect() { effect() {
@@ -7652,7 +7672,7 @@ const tech = {
// frequency: 3, // frequency: 3,
// frequencyDefault: 3, // frequencyDefault: 3,
// allowed() { // allowed() {
// return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport) // return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldMode === 4 && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport)
// }, // },
// requires: "molecular assembler, no other manufacturing, no drone tech", // requires: "molecular assembler, no other manufacturing, no drone tech",
// effect() { // effect() {
@@ -7679,7 +7699,7 @@ const tech = {
// frequency: 3, // frequency: 3,
// frequencyDefault: 3, // frequencyDefault: 3,
// allowed() { // allowed() {
// return (build.isExperimentSelection || powerUps.research.count > 0) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel) // return (build.isExperimentSelection || powerUps.research.count > 0) && m.maxEnergy > 0.5 && m.fieldMode === 4 && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel)
// }, // },
// requires: "molecular assembler, no other manufacturing, no drone tech", // requires: "molecular assembler, no other manufacturing, no drone tech",
// effect() { // effect() {
@@ -7706,7 +7726,7 @@ const tech = {
// frequency: 3, // frequency: 3,
// frequencyDefault: 3, // frequencyDefault: 3,
// allowed() { // allowed() {
// return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel) // return (build.isExperimentSelection || powerUps.research.count > 0) && m.fieldMode === 4 && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab || tech.isDroneRadioactive || tech.isDroneTeleport || tech.isDronesTravel)
// }, // },
// requires: "molecular assembler, no other manufacturing, no drone tech", // requires: "molecular assembler, no other manufacturing, no drone tech",
// effect() { // effect() {
@@ -7731,7 +7751,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "standing wave" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" return m.fieldMode === 4 || m.fieldMode === 1 || m.fieldMode === 8
}, },
requires: "molecular assembler, pilot wave, standing wave", requires: "molecular assembler, pilot wave, standing wave",
effect() { effect() {
@@ -7751,7 +7771,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "molecular assembler" return m.fieldMode === 4
}, },
requires: "molecular assembler", requires: "molecular assembler",
effect() { effect() {
@@ -7770,7 +7790,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" return m.fieldMode === 5 || m.fieldMode === 6 || m.fieldMode === 7 || m.fieldMode === 8 || m.fieldMode === 4
}, },
requires: "cloaking, molecular assembler, plasma torch, pilot wave", requires: "cloaking, molecular assembler, plasma torch, pilot wave",
damage: 1.35, damage: 1.35,
@@ -7794,7 +7814,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" return m.fieldMode === 5 || m.fieldMode === 4
}, },
requires: "plasma torch, molecular assembler", requires: "plasma torch, molecular assembler",
effect() { effect() {
@@ -7813,7 +7833,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") return (m.fieldMode === 5 || m.fieldMode === 4 || m.fieldMode === 2 || m.fieldMode === 8)
}, },
requires: "molecular assembler, plasma torch, perfect diamagnetism, pilot wave", requires: "molecular assembler, plasma torch, perfect diamagnetism, pilot wave",
effect() { effect() {
@@ -7835,7 +7855,7 @@ const tech = {
isBot: true, isBot: true,
isBotTech: true, isBotTech: true,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isPlasmaBall && !tech.isExtruder && (build.isExperimentSelection || powerUps.research.count > 1) return m.fieldMode === 5 && !tech.isPlasmaBall && !tech.isExtruder && (build.isExperimentSelection || powerUps.research.count > 1)
}, },
requires: "plasma torch, not extruder, plasma ball", requires: "plasma torch, not extruder, plasma ball",
effect() { effect() {
@@ -7876,7 +7896,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (tech.plasmaBotCount || m.fieldUpgrades[m.fieldMode].name === "plasma torch") && (build.isExperimentSelection || powerUps.research.count > 1) && !tech.isPlasmaBall return (tech.plasmaBotCount || m.fieldMode === 5) && (build.isExperimentSelection || powerUps.research.count > 1) && !tech.isPlasmaBall
}, },
requires: "plasma torch, not plasma ball", requires: "plasma torch, not plasma ball",
effect() { effect() {
@@ -7899,7 +7919,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isPlasmaBall return m.fieldMode === 5 && !tech.isPlasmaBall
}, },
requires: "plasma torch, not plasma ball", requires: "plasma torch, not plasma ball",
effect() { effect() {
@@ -7908,7 +7928,7 @@ const tech = {
}, },
remove() { remove() {
tech.isExtruder = false; tech.isExtruder = false;
if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set() if (this.count && m.fieldMode === 5) m.fieldUpgrades[m.fieldMode].set()
} }
}, },
{ {
@@ -7920,7 +7940,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isExtruder return m.fieldMode === 5 && tech.isExtruder
}, },
requires: "extruder", requires: "extruder",
effect() { effect() {
@@ -7939,7 +7959,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isExtruder && tech.isPlasmaRange === 1 return m.fieldMode === 5 && !tech.isExtruder && tech.isPlasmaRange === 1
}, },
requires: "plasma torch, not extruder, plasma jet", requires: "plasma torch, not extruder, plasma jet",
effect() { effect() {
@@ -7948,7 +7968,7 @@ const tech = {
}, },
remove() { remove() {
tech.isPlasmaBall = false; tech.isPlasmaBall = false;
if (this.count && m.fieldUpgrades[m.fieldMode].name === "plasma torch") m.fieldUpgrades[m.fieldMode].set() if (this.count && m.fieldMode === 5) m.fieldUpgrades[m.fieldMode].set()
} }
}, },
{ {
@@ -7960,7 +7980,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isPlasmaBall return m.fieldMode === 5 && tech.isPlasmaBall
}, },
requires: "plasma ball", requires: "plasma ball",
effect() { effect() {
@@ -7979,7 +7999,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation" && !m.isShipMode && !tech.isRewindAvoidDeath && !tech.isTimeSkip return m.fieldMode === 6 && !m.isShipMode && !tech.isRewindAvoidDeath && !tech.isTimeSkip
}, },
requires: "time dilation, not CPT symmetry", requires: "time dilation, not CPT symmetry",
effect() { effect() {
@@ -8001,7 +8021,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation" return m.fieldMode === 6
}, },
requires: "time dilation", requires: "time dilation",
effect() { effect() {
@@ -8010,7 +8030,7 @@ const tech = {
}, },
remove() { remove() {
tech.isTimeStop = false; tech.isTimeStop = false;
if (m.fieldUpgrades[m.fieldMode].name === "time dilation") m.fieldHarmReduction = 1; if (m.fieldMode === 6) m.fieldHarmReduction = 1;
} }
}, },
{ {
@@ -8022,7 +8042,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation") && (build.isExperimentSelection || powerUps.research.count > 2) return (m.fieldMode === 6) && (build.isExperimentSelection || powerUps.research.count > 2)
}, },
requires: "time dilation", requires: "time dilation",
effect() { effect() {
@@ -8049,7 +8069,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return !tech.isGroundState && (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") return !tech.isGroundState && (m.fieldMode === 6 || m.fieldMode === 8)
}, },
requires: "time dilation or pilot wave, not ground state", requires: "time dilation or pilot wave, not ground state",
effect() { effect() {
@@ -8071,7 +8091,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") && !tech.isQuantumEraser return (m.fieldMode === 6 || m.fieldMode === 7) && !tech.isQuantumEraser
}, },
requires: "cloaking, time dilation, not quantum eraser", requires: "cloaking, time dilation, not quantum eraser",
effect() { effect() {
@@ -8096,7 +8116,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "time dilation") && !tech.cloakDuplication return (m.fieldMode === 7 || m.fieldMode === 6) && !tech.cloakDuplication
}, },
requires: "cloaking or time dilation", requires: "cloaking or time dilation",
effect() { effect() {
@@ -8121,7 +8141,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" //|| m.fieldUpgrades[m.fieldMode].name === "time dilation" return m.fieldMode === 7 //|| m.fieldMode === 6
}, },
requires: "cloaking", requires: "cloaking",
effect() { effect() {
@@ -8141,7 +8161,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" return m.fieldMode === 7
}, },
requires: "metamaterial cloaking", requires: "metamaterial cloaking",
effect() { effect() {
@@ -8164,7 +8184,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" && !tech.lastHitDamage && !tech.isEnergyHealth return m.fieldMode === 7 && !tech.lastHitDamage && !tech.isEnergyHealth
}, },
requires: "metamaterial cloaking, not dynamic equilibrium, mass-energy", requires: "metamaterial cloaking, not dynamic equilibrium, mass-energy",
effect() { effect() {
@@ -8184,7 +8204,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" return m.fieldMode === 7
}, },
requires: "metamaterial cloaking", requires: "metamaterial cloaking",
effect() { effect() {
@@ -8203,7 +8223,7 @@ const tech = {
// frequency: 2, // frequency: 2,
// frequencyDefault: 2, // frequencyDefault: 2,
// allowed() { // allowed() {
// return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" // return m.fieldMode === 7
// }, // },
// requires: "metamaterial cloaking", // requires: "metamaterial cloaking",
// effect() { // effect() {
@@ -8222,7 +8242,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1) return (m.fieldMode === 5 || m.fieldMode === 7 || m.fieldMode === 8) && (build.isExperimentSelection || powerUps.research.count > 1)
}, },
requires: "cloaking, pilot wave, or plasma torch", requires: "cloaking, pilot wave, or plasma torch",
damage: 1.35, damage: 1.35,
@@ -8250,7 +8270,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation" return m.fieldMode === 9 || m.fieldMode === 8 || m.fieldMode === 6
}, },
requires: "wormhole, pilot wave, time dilation", requires: "wormhole, pilot wave, time dilation",
effect() { effect() {
@@ -8271,7 +8291,7 @@ const tech = {
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 3) return (m.fieldMode === 8 || m.fieldMode === 3 || m.fieldMode === 6 || m.fieldMode === 9) && (build.isExperimentSelection || powerUps.research.count > 3)
}, },
requires: "wormhole, time dilation, negative mass, pilot wave", requires: "wormhole, time dilation, negative mass, pilot wave",
effect() { effect() {
@@ -8297,7 +8317,7 @@ const tech = {
// frequency: 2, // frequency: 2,
// frequencyDefault: 2, // frequencyDefault: 2,
// allowed() { // allowed() {
// return m.fieldUpgrades[m.fieldMode].name === "wormhole" // return m.fieldMode === 9
// }, // },
// requires: "wormhole", // requires: "wormhole",
// effect() { // effect() {
@@ -8317,7 +8337,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" return m.fieldMode === 9
}, },
requires: "wormhole", requires: "wormhole",
effect() { effect() {
@@ -8336,7 +8356,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" return m.fieldMode === 9
}, },
requires: "wormhole", requires: "wormhole",
effect() { effect() {
@@ -8362,7 +8382,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" return m.fieldMode === 9
}, },
requires: "wormhole", requires: "wormhole",
effect() { effect() {
@@ -8381,7 +8401,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isNoDraftPause return m.fieldMode === 9 && !tech.isNoDraftPause
}, },
requires: "wormhole, not eternalism", requires: "wormhole, not eternalism",
effect() { effect() {
@@ -8401,7 +8421,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isWormholeMapIgnore return m.fieldMode === 9 && !tech.isWormholeMapIgnore
}, },
requires: "wormhole, not affine connection", requires: "wormhole, not affine connection",
effect() { effect() {
@@ -8429,7 +8449,7 @@ const tech = {
frequency: 2, frequency: 2,
frequencyDefault: 2, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isFreeWormHole return m.fieldMode === 9 && !tech.isFreeWormHole
}, },
requires: "wormhole, not charmed baryons", requires: "wormhole, not charmed baryons",
effect() { effect() {
@@ -10012,7 +10032,7 @@ const tech = {
isNonRefundable: true, isNonRefundable: true,
isJunk: true, isJunk: true,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "negative mass" return true
}, },
requires: "", requires: "",
effect() { effect() {
@@ -11436,4 +11456,5 @@ const tech = {
isSuperBounce: null, isSuperBounce: null,
isDivisor: null, isDivisor: null,
isFoamCavitation: null, isFoamCavitation: null,
isHealAttract: null,
} }

View File

@@ -1,20 +1,25 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
community map downpour by DesBoot field tech: accretion - health power ups follow you around and they travel with you to the to next level
community map buttonbutton by ||Destabilized E|| spawn 6 heal power ups
negative mass, plasma torch
rounded borders on no-image mode selection cards foam gun tech cavitation - more knock back, and 25% to make a foam bullet extra large and fast
foam gun has some recoil
new superball gun image
bug fixes foam-bots now discharge a few bullets in a stream with a long reload time
laser-bot +5% energy drain, -5% damage
nail-bot +10% fire rate
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
foam gun tech cavitation - a knock back effect, and 1 out of 5 foam bullets are larger and faster?
extend accretion to all fields
run the code in power ups
tech: using research spawns a heal and ammo
Tech: Turbine - Energy generation is proportional to your speed up to +X% energy generation at 40 speed Tech: Turbine - Energy generation is proportional to your speed up to +X% energy generation at 40 speed
Tech: "Electric Reactive Armor": Defeanse increases by 2% for each 1 energy generation you have Tech: "Electric Reactive Armor": Defense increases by 2% for each 1 energy generation you have
wormhole tech - teleport away mobs with mass below 3 when they get too near the player wormhole tech - teleport away mobs with mass below 3 when they get too near the player
short CD, small energy cost, only mobs below a mass short CD, small energy cost, only mobs below a mass
@@ -1196,6 +1201,7 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
***past style themes*** ***past style themes***
field emitter - bipedal white robot spherical gun turret on bird legs field emitter - bipedal white robot spherical gun turret on bird legs
damaged dirty white robot spherical gun turret on bird legs in the style of Solarpunk damaged dirty white robot spherical gun turret on bird legs in the style of Solarpunk
a white spherical bipedal mech standing motionless while black lines travel quickly in the background, minimalist style --no arms --v5
standing wave - concentric transparent blue geometric circles science standing wave - concentric transparent blue geometric circles science
perfect diamagnetism - physics magnetic field chalk diagram perfect diamagnetism - physics magnetic field chalk diagram
time dilation - graphic of a hyperbolic equation Luminogram time dilation - graphic of a hyperbolic equation Luminogram
@@ -1215,7 +1221,7 @@ if pause is pressed while selecting power ups, display pause menu on top of sele
wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall wave - sound wave oscilloscope by Paul Catherall, concentric circles by Paul Catherall
Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5 Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5
foam - black blobs Ink doodle foam - black blobs Ink doodle
harpoon - by Eiichiro Oda harpoon - iron harpoon on a rope weapon art white background by Eiichiro Oda --no fish --ar 3:2 --v 5 --s 750
mine - by Dan McPharlin mine - by Dan McPharlin
laser - complex optical scientific equipment laser - complex optical scientific equipment