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
BIN
img/accretion.webp
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
img/cavitation.webp
Normal file
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 23 KiB |
@@ -119,7 +119,9 @@
|
||||
<option value="crossfire">
|
||||
<option value="temple">
|
||||
<option value="run">
|
||||
<!-- biohazard
|
||||
<!--
|
||||
fortress
|
||||
biohazard
|
||||
islands
|
||||
tunnel
|
||||
clock
|
||||
@@ -139,7 +141,8 @@
|
||||
dripp
|
||||
crossfire
|
||||
temple
|
||||
run -->
|
||||
run
|
||||
-->
|
||||
</datalist>
|
||||
<br>
|
||||
<label for="classic-select" title="play older versions of n-gon">classic n-gon:</label>
|
||||
|
||||
144
js/bullet.js
@@ -4064,6 +4064,10 @@ const b = {
|
||||
// Matter.Body.setVelocity(bullet[me], velocity);
|
||||
// },
|
||||
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)
|
||||
const me = bullet.length;
|
||||
bullet[me] = Bodies.polygon(position.x, position.y, 20, radius, {
|
||||
@@ -4840,7 +4844,7 @@ const b = {
|
||||
minDmgSpeed: 2,
|
||||
// lookFrequency: 56 + Math.floor(17 * Math.random()) - isUpgraded * 20,
|
||||
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()),
|
||||
range: 60 * (1 + 0.3 * Math.random()) + 3 * b.totalBots(),
|
||||
endCycle: Infinity,
|
||||
@@ -4875,7 +4879,7 @@ const b = {
|
||||
b.nail(this.position, Vector.mult(unit, SPEED))
|
||||
this.force = Vector.mult(unit, -0.018 * this.mass)
|
||||
} else {
|
||||
const SPEED = 35
|
||||
const SPEED = 40
|
||||
b.nail(this.position, Vector.mult(unit, SPEED))
|
||||
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
|
||||
},
|
||||
foamBot(position = {
|
||||
x: player.position.x + 50 * (Math.random() - 0.5),
|
||||
y: player.position.y + 50 * (Math.random() - 0.5)
|
||||
}, isConsole = true) {
|
||||
foamBot(position = { 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()`);
|
||||
const me = bullet.length;
|
||||
const dir = m.angle;
|
||||
@@ -4983,11 +4984,13 @@ const b = {
|
||||
restitution: 0.6 * (1 + 0.5 * Math.random()),
|
||||
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
||||
minDmgSpeed: 2,
|
||||
lookFrequency: 60 + Math.floor(17 * Math.random()) - 45 * tech.isFoamBotUpgrade,
|
||||
lookFrequency: 60 + Math.floor(17 * Math.random()) - 50 * tech.isFoamBotUpgrade,
|
||||
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()),
|
||||
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,
|
||||
classType: "bullet",
|
||||
collisionFilter: {
|
||||
@@ -4996,29 +4999,93 @@ const b = {
|
||||
},
|
||||
beforeDmg() { },
|
||||
onEnd() { },
|
||||
do() {
|
||||
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
|
||||
fireTarget: { x: 0, y: 0 },
|
||||
fire() {
|
||||
this.fireCount++
|
||||
if (this.fireCount > this.fireLimit) {
|
||||
this.fireCount = 0
|
||||
this.cd = simulation.cycle + this.delay;
|
||||
} // else {this.cd = simulation.cycle + 1;}
|
||||
|
||||
if (this.cd < simulation.cycle && !(simulation.cycle % this.lookFrequency) && !m.isCloak) {
|
||||
let target
|
||||
const radius = 5 + 3 * 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(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++) {
|
||||
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) {
|
||||
this.cd = simulation.cycle + this.delay;
|
||||
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
||||
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)
|
||||
if (dist2 < 1700000 && !mob[i].isBadTarget && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && !mob[i].isInvulnerable) {
|
||||
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
|
||||
this.fire()
|
||||
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
|
||||
@@ -5040,17 +5107,14 @@ const b = {
|
||||
restitution: 0.5 * (1 + 0.5 * Math.random()),
|
||||
acceleration: 0.0015 * (1 + 0.3 * Math.random()),
|
||||
playerRange: 140 + Math.floor(30 * Math.random()) + 2 * b.totalBots(),
|
||||
offPlayer: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
},
|
||||
offPlayer: { x: 0, y: 0, },
|
||||
dmg: 0, //damage done in addition to the damage from momentum
|
||||
minDmgSpeed: 2,
|
||||
lookFrequency: 20 + Math.floor(7 * Math.random()) - 13 * tech.isLaserBotUpgrade,
|
||||
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
|
||||
drain: (0.52 - 0.44 * tech.isLaserBotUpgrade) * tech.laserDrain,
|
||||
laserDamage: 0.82 + 0.8 * tech.isLaserBotUpgrade,
|
||||
drain: (0.57 - 0.45 * tech.isLaserBotUpgrade) * tech.laserDrain,
|
||||
laserDamage: 0.75 + 0.75 * tech.isLaserBotUpgrade,
|
||||
endCycle: Infinity,
|
||||
classType: "bullet",
|
||||
collisionFilter: {
|
||||
@@ -7139,11 +7203,15 @@ const b = {
|
||||
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",
|
||||
ammo: 0,
|
||||
ammoPack: 24, //set in froth flotation
|
||||
ammoPack: 24,
|
||||
have: false,
|
||||
charge: 0,
|
||||
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() {
|
||||
if (tech.isFoamPressure) {
|
||||
this.do = this.doCharges
|
||||
@@ -7171,9 +7239,7 @@ const b = {
|
||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||
}
|
||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||
//knock back player
|
||||
player.force.x -= this.knockBack * velocity.x
|
||||
player.force.y -= this.knockBack * velocity.y
|
||||
this.applyKnock(velocity)
|
||||
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
|
||||
},
|
||||
doCharges() {
|
||||
@@ -7200,9 +7266,7 @@ const b = {
|
||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||
}
|
||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||
//knock back player
|
||||
player.force.x -= this.knockBack * velocity.x
|
||||
player.force.y -= this.knockBack * velocity.y
|
||||
this.applyKnock(velocity)
|
||||
this.charge -= 0.75
|
||||
m.fireCDcycle = m.cycle + 2; //disable firing and adding more charge until empty
|
||||
} else if (!input.fire) {
|
||||
@@ -7248,9 +7312,7 @@ const b = {
|
||||
// } else {
|
||||
// }
|
||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||
//knock back player
|
||||
player.force.x -= this.knockBack * velocity.x
|
||||
player.force.y -= this.knockBack * velocity.y
|
||||
this.applyKnock(velocity)
|
||||
m.fireCDcycle = m.cycle + Math.floor(1.5 * b.fireCDscale);
|
||||
this.charge += 1 + tech.isCapacitor
|
||||
},
|
||||
|
||||
33
js/level.js
@@ -10,7 +10,7 @@ const level = {
|
||||
// playableLevels: ["pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion", "pavilion"],
|
||||
//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"],
|
||||
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"],
|
||||
levels: [],
|
||||
start() {
|
||||
@@ -18,7 +18,7 @@ const level = {
|
||||
// simulation.enableConstructMode() //tech.giveTech('motion sickness') //used to build maps in testing mode
|
||||
// simulation.isHorizontalFlipped = true
|
||||
// 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();
|
||||
// m.maxHealth = m.health = 100
|
||||
@@ -27,7 +27,7 @@ const level = {
|
||||
// m.immuneCycle = Infinity //you can't take damage
|
||||
// tech.tech[297].frequency = 100
|
||||
// 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
|
||||
// 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
|
||||
@@ -35,20 +35,21 @@ const level = {
|
||||
// b.guns[3].ammo = 100000000
|
||||
// tech.giveTech("recycling")
|
||||
// tech.giveTech("pressure vessel")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("pseudoscience")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("options exchange")
|
||||
// for (let i = 0; i < 1; i++) tech.giveTech("laser-bot")
|
||||
// for (let i = 0; i < 1; i++) tech.giveTech("simulated annealing")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("cavitation")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("accretion")
|
||||
// for (let i = 0; i < 1; ++i) tech.giveTech("superdeterminism")
|
||||
// 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 < 10; i++) powerUps.directSpawn(1750, -500, "boost");
|
||||
// for (let i = 0; i < 10; i++) powerUps.directSpawn(1750, -500, "coupling");
|
||||
// level.downpour();
|
||||
// level.testing();
|
||||
// spawn.nodeGroup(3200, -300, "sniper")
|
||||
// spawn.nodeGroup(2200, -300, "sniper")
|
||||
// spawn.nodeGroup(2200, -300, "sniper")
|
||||
// spawn.mantisBoss(1900, -500)
|
||||
// spawn.sneakBoss(1900, -500)
|
||||
// spawn.starter(1900, -500, 50)
|
||||
// spawn.starter(1900, -500, 250)
|
||||
// spawn.sneaker(1900, -500, 25)
|
||||
// spawn.sniper(2000, -450)
|
||||
// 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();
|
||||
// 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 < 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);
|
||||
//lore testing
|
||||
// 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 });
|
||||
}
|
||||
}
|
||||
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) {
|
||||
for (let i = 0, len = body.length; i < len; i++) {
|
||||
@@ -9249,8 +9257,8 @@ const level = {
|
||||
portal2[2].draw()
|
||||
}
|
||||
},
|
||||
"n-gon"() { //make by Oranger
|
||||
simulation.makeTextLog(`<strong>"n-gon"</strong> by <span class='color-var'>Oranger</span>`);
|
||||
ngon() { //make by Oranger
|
||||
simulation.makeTextLog(`<strong>"ngon"</strong> by <span class='color-var'>Oranger</span>`);
|
||||
|
||||
document.body.style.backgroundColor = "#dcdcde";
|
||||
let needGravity = [];
|
||||
@@ -18166,7 +18174,6 @@ const level = {
|
||||
},
|
||||
downpour() {
|
||||
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
|
||||
const laser = level.hazard(7492, -2612, 10, 500, 0.3) //laserintro
|
||||
|
||||
|
||||
58
js/player.js
@@ -1854,7 +1854,7 @@ const m = {
|
||||
},
|
||||
setMaxEnergy() {
|
||||
// (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())
|
||||
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
|
||||
}
|
||||
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.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) {
|
||||
m.hold = function () {
|
||||
@@ -3581,6 +3615,17 @@ const m = {
|
||||
ctx.lineWidth = tech.extruderRange;
|
||||
ctx.strokeStyle = "rgba(255,0,110,0.06)"
|
||||
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 {
|
||||
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.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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -695,9 +695,11 @@ const powerUps = {
|
||||
}
|
||||
text += `</span> <span class='research-select'>${tech.isResearchReality ? "<span class='alt'>alternate reality</span>" : "research"}</span></div></div></span>`
|
||||
} else {
|
||||
text += `<span class='research-card' style="width: 275px;float: right; background-color: #bbb;">research</span>` //‌
|
||||
text += `<span class='research-card' style="width: 275px;float: right; background-color: #aaa;color:#888;">research</span>` //‌
|
||||
}
|
||||
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>`
|
||||
} else {
|
||||
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++) {
|
||||
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
|
||||
function removeOption(index) {
|
||||
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
|
||||
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
|
||||
|
||||
function removeOption(index) {
|
||||
@@ -1020,7 +1022,7 @@ const powerUps = {
|
||||
}
|
||||
}
|
||||
//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 (optionLengthNoDuplicates < totalChoices + 1) { //if not enough options for all the choices
|
||||
totalChoices = optionLengthNoDuplicates
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// game Object ********************************************************
|
||||
//*********************************************************************
|
||||
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() {
|
||||
simulation.gravity();
|
||||
Engine.update(engine, simulation.delta);
|
||||
@@ -591,16 +591,16 @@ const simulation = {
|
||||
const swapPeriod = 150
|
||||
const len = 30
|
||||
for (let i = 0; i < len; i++) {
|
||||
setTimeout(function() {
|
||||
simulation.wipe = function() { //set wipe to have trails
|
||||
ctx.fillStyle = `rgba(221,221,221,${i*i*0.0005 +0.0025})`;
|
||||
setTimeout(function () {
|
||||
simulation.wipe = function () { //set wipe to have trails
|
||||
ctx.fillStyle = `rgba(221,221,221,${i * i * 0.0005 + 0.0025})`;
|
||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||
}
|
||||
}, (i) * swapPeriod);
|
||||
}
|
||||
|
||||
setTimeout(function() {
|
||||
simulation.wipe = function() { //set wipe to normal
|
||||
setTimeout(function () {
|
||||
simulation.wipe = function () { //set wipe to normal
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
}
|
||||
}, len * swapPeriod);
|
||||
@@ -637,7 +637,7 @@ const simulation = {
|
||||
// }
|
||||
// requestAnimationFrame(loop);
|
||||
// },
|
||||
wipe() {}, //set in simulation.startGame
|
||||
wipe() { }, //set in simulation.startGame
|
||||
gravity() {
|
||||
function addGravity(bodies, magnitude) {
|
||||
for (var i = 0; i < bodies.length; i++) {
|
||||
@@ -661,7 +661,7 @@ const simulation = {
|
||||
|
||||
simulation.clearTimeouts();
|
||||
simulation.onTitlePage = true;
|
||||
document.getElementById("splash").onclick = function() {
|
||||
document.getElementById("splash").onclick = function () {
|
||||
simulation.startGame();
|
||||
};
|
||||
document.getElementById("choose-grid").style.visibility = "hidden"
|
||||
@@ -784,7 +784,7 @@ const simulation = {
|
||||
// m.maxEnergy = 1
|
||||
// m.energy = 1
|
||||
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);
|
||||
}
|
||||
m.hole.isOn = false
|
||||
@@ -865,7 +865,7 @@ const simulation = {
|
||||
requestAnimationFrame(cycle); //starts game loop
|
||||
},
|
||||
clearTimeouts() {
|
||||
let id = window.setTimeout(function() {}, 0);
|
||||
let id = window.setTimeout(function () { }, 0);
|
||||
while (id--) {
|
||||
window.clearTimeout(id); // will do nothing if no timeout with id is present
|
||||
}
|
||||
@@ -943,6 +943,25 @@ const simulation = {
|
||||
m.hole.isOn = false;
|
||||
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) {
|
||||
//count drones
|
||||
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
|
||||
|
||||
fallCheck = function(who, save = false) {
|
||||
fallCheck = function (who, save = false) {
|
||||
let i = who.length;
|
||||
while (i--) {
|
||||
if (who[i].position.y > simulation.fallHeight) {
|
||||
@@ -1584,9 +1603,9 @@ const simulation = {
|
||||
outHTML += "<div>" + simulation.constructMapString[i] + "</div>"
|
||||
}
|
||||
console.log(out)
|
||||
navigator.clipboard.writeText(out).then(function() {
|
||||
navigator.clipboard.writeText(out).then(function () {
|
||||
/* clipboard successfully set */
|
||||
}, function() {
|
||||
}, function () {
|
||||
/* clipboard write failed */
|
||||
console.log('copy failed')
|
||||
});
|
||||
|
||||
241
js/tech.js
@@ -215,7 +215,7 @@ const tech = {
|
||||
}
|
||||
},
|
||||
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
|
||||
damageFromTech() {
|
||||
@@ -1954,7 +1954,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name !== "wormhole"
|
||||
return m.fieldMode !== 9
|
||||
},
|
||||
requires: "not wormhole",
|
||||
effect() {
|
||||
@@ -1973,7 +1973,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -2027,7 +2027,7 @@ const tech = {
|
||||
// frequency: 2,
|
||||
// frequencyDefault: 2,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -3018,9 +3018,9 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return true
|
||||
return !tech.isHealAttract
|
||||
},
|
||||
requires: "",
|
||||
requires: "not accretion",
|
||||
effect() {
|
||||
tech.isOverHeal = true;
|
||||
},
|
||||
@@ -4734,7 +4734,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -4753,7 +4753,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -4772,7 +4772,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -4791,7 +4791,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -4810,7 +4810,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -4829,7 +4829,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5182,7 +5182,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5201,7 +5201,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5292,7 +5292,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5311,7 +5311,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5407,7 +5407,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5904,7 +5904,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5926,7 +5926,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5947,7 +5947,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -5973,7 +5973,7 @@ const tech = {
|
||||
// frequency: 3,
|
||||
// frequencyDefault: 3,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -6001,7 +6001,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6039,7 +6039,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6059,7 +6059,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6099,7 +6099,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6119,7 +6119,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6149,7 +6149,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6189,7 +6189,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6228,7 +6228,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -6453,6 +6453,27 @@ const tech = {
|
||||
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",
|
||||
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()
|
||||
}
|
||||
},
|
||||
// {
|
||||
// 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",
|
||||
// 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",
|
||||
effect() {
|
||||
tech.railChargeRate *= 1.06
|
||||
tech.harpoonDensity += 0.0065
|
||||
tech.harpoonDensity += 0.007
|
||||
},
|
||||
remove() {
|
||||
tech.railChargeRate = 0.97;
|
||||
tech.harpoonDensity = 0.0065
|
||||
tech.harpoonDensity = 0.007
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -7190,7 +7190,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7215,7 +7215,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "standing wave"
|
||||
return m.fieldMode === 1
|
||||
},
|
||||
requires: "standing wave",
|
||||
effect() {
|
||||
@@ -7239,7 +7239,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "standing wave"
|
||||
return m.fieldMode === 1
|
||||
},
|
||||
requires: "standing wave",
|
||||
effect() {
|
||||
@@ -7263,7 +7263,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7286,7 +7286,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7305,7 +7305,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7324,7 +7324,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7343,7 +7343,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
|
||||
return m.fieldMode === 2
|
||||
},
|
||||
requires: "perfect diamagnetism",
|
||||
effect() {
|
||||
@@ -7362,7 +7362,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism"
|
||||
return m.fieldMode === 2
|
||||
},
|
||||
requires: "perfect diamagnetism",
|
||||
effect() {
|
||||
@@ -7382,7 +7382,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7405,7 +7405,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7427,7 +7427,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7446,7 +7446,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "negative mass"
|
||||
return m.fieldMode === 3
|
||||
},
|
||||
requires: "negative mass",
|
||||
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",
|
||||
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,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "negative mass"
|
||||
return m.fieldMode === 3
|
||||
},
|
||||
requires: "negative mass",
|
||||
effect() {
|
||||
@@ -7493,7 +7513,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth
|
||||
return m.fieldMode === 3 && !tech.isEnergyHealth
|
||||
},
|
||||
requires: "negative mass, not mass-energy",
|
||||
effect() {
|
||||
@@ -7512,7 +7532,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "negative mass"
|
||||
return m.fieldMode === 3
|
||||
},
|
||||
requires: "negative mass",
|
||||
effect() {
|
||||
@@ -7531,7 +7551,7 @@ const tech = {
|
||||
// frequency: 2,
|
||||
// frequencyDefault: 2,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -7552,7 +7572,7 @@ const tech = {
|
||||
isBotTech: true,
|
||||
isNonRefundable: true,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7577,7 +7597,7 @@ const tech = {
|
||||
isBotTech: true,
|
||||
isNonRefundable: true,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7652,7 +7672,7 @@ const tech = {
|
||||
// frequency: 3,
|
||||
// frequencyDefault: 3,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -7679,7 +7699,7 @@ const tech = {
|
||||
// frequency: 3,
|
||||
// frequencyDefault: 3,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -7706,7 +7726,7 @@ const tech = {
|
||||
// frequency: 3,
|
||||
// frequencyDefault: 3,
|
||||
// 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",
|
||||
// effect() {
|
||||
@@ -7731,7 +7751,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7751,7 +7771,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
|
||||
return m.fieldMode === 4
|
||||
},
|
||||
requires: "molecular assembler",
|
||||
effect() {
|
||||
@@ -7770,7 +7790,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
damage: 1.35,
|
||||
@@ -7794,7 +7814,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7813,7 +7833,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7835,7 +7855,7 @@ const tech = {
|
||||
isBot: true,
|
||||
isBotTech: true,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7876,7 +7896,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7899,7 +7919,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isPlasmaBall
|
||||
return m.fieldMode === 5 && !tech.isPlasmaBall
|
||||
},
|
||||
requires: "plasma torch, not plasma ball",
|
||||
effect() {
|
||||
@@ -7908,7 +7928,7 @@ const tech = {
|
||||
},
|
||||
remove() {
|
||||
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,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isExtruder
|
||||
return m.fieldMode === 5 && tech.isExtruder
|
||||
},
|
||||
requires: "extruder",
|
||||
effect() {
|
||||
@@ -7939,7 +7959,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -7948,7 +7968,7 @@ const tech = {
|
||||
},
|
||||
remove() {
|
||||
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,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && tech.isPlasmaBall
|
||||
return m.fieldMode === 5 && tech.isPlasmaBall
|
||||
},
|
||||
requires: "plasma ball",
|
||||
effect() {
|
||||
@@ -7979,7 +7999,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8001,7 +8021,7 @@ const tech = {
|
||||
frequency: 1,
|
||||
frequencyDefault: 1,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "time dilation"
|
||||
return m.fieldMode === 6
|
||||
},
|
||||
requires: "time dilation",
|
||||
effect() {
|
||||
@@ -8010,7 +8030,7 @@ const tech = {
|
||||
},
|
||||
remove() {
|
||||
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,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8049,7 +8069,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8071,7 +8091,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8096,7 +8116,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8121,7 +8141,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8141,7 +8161,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
|
||||
return m.fieldMode === 7
|
||||
},
|
||||
requires: "metamaterial cloaking",
|
||||
effect() {
|
||||
@@ -8164,7 +8184,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8184,7 +8204,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
|
||||
return m.fieldMode === 7
|
||||
},
|
||||
requires: "metamaterial cloaking",
|
||||
effect() {
|
||||
@@ -8203,7 +8223,7 @@ const tech = {
|
||||
// frequency: 2,
|
||||
// frequencyDefault: 2,
|
||||
// allowed() {
|
||||
// return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking"
|
||||
// return m.fieldMode === 7
|
||||
// },
|
||||
// requires: "metamaterial cloaking",
|
||||
// effect() {
|
||||
@@ -8222,7 +8242,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
damage: 1.35,
|
||||
@@ -8250,7 +8270,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8271,7 +8291,7 @@ const tech = {
|
||||
frequency: 3,
|
||||
frequencyDefault: 3,
|
||||
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",
|
||||
effect() {
|
||||
@@ -8297,7 +8317,7 @@ const tech = {
|
||||
// frequency: 2,
|
||||
// frequencyDefault: 2,
|
||||
// allowed() {
|
||||
// return m.fieldUpgrades[m.fieldMode].name === "wormhole"
|
||||
// return m.fieldMode === 9
|
||||
// },
|
||||
// requires: "wormhole",
|
||||
// effect() {
|
||||
@@ -8317,7 +8337,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
|
||||
return m.fieldMode === 9
|
||||
},
|
||||
requires: "wormhole",
|
||||
effect() {
|
||||
@@ -8336,7 +8356,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
|
||||
return m.fieldMode === 9
|
||||
},
|
||||
requires: "wormhole",
|
||||
effect() {
|
||||
@@ -8362,7 +8382,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
|
||||
return m.fieldMode === 9
|
||||
},
|
||||
requires: "wormhole",
|
||||
effect() {
|
||||
@@ -8381,7 +8401,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isNoDraftPause
|
||||
return m.fieldMode === 9 && !tech.isNoDraftPause
|
||||
},
|
||||
requires: "wormhole, not eternalism",
|
||||
effect() {
|
||||
@@ -8401,7 +8421,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isWormholeMapIgnore
|
||||
return m.fieldMode === 9 && !tech.isWormholeMapIgnore
|
||||
},
|
||||
requires: "wormhole, not affine connection",
|
||||
effect() {
|
||||
@@ -8429,7 +8449,7 @@ const tech = {
|
||||
frequency: 2,
|
||||
frequencyDefault: 2,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isFreeWormHole
|
||||
return m.fieldMode === 9 && !tech.isFreeWormHole
|
||||
},
|
||||
requires: "wormhole, not charmed baryons",
|
||||
effect() {
|
||||
@@ -10012,7 +10032,7 @@ const tech = {
|
||||
isNonRefundable: true,
|
||||
isJunk: true,
|
||||
allowed() {
|
||||
return m.fieldUpgrades[m.fieldMode].name !== "negative mass"
|
||||
return true
|
||||
},
|
||||
requires: "",
|
||||
effect() {
|
||||
@@ -11436,4 +11456,5 @@ const tech = {
|
||||
isSuperBounce: null,
|
||||
isDivisor: null,
|
||||
isFoamCavitation: null,
|
||||
isHealAttract: null,
|
||||
}
|
||||
24
todo.txt
@@ -1,20 +1,25 @@
|
||||
******************************************************** NEXT PATCH **************************************************
|
||||
|
||||
community map downpour by DesBoot
|
||||
community map buttonbutton by ||Destabilized E||
|
||||
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
|
||||
|
||||
rounded borders on no-image mode selection cards
|
||||
foam gun has some recoil
|
||||
new superball gun image
|
||||
foam gun tech cavitation - more knock back, and 25% to make a foam bullet extra large and fast
|
||||
|
||||
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 *****************************************************
|
||||
|
||||
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: "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
|
||||
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***
|
||||
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
|
||||
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
|
||||
perfect diamagnetism - physics magnetic field chalk diagram
|
||||
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
|
||||
Barbara Takenaga's painting depicting a clean sound wave on aoscilloscope device --ar 3:2 --v 5
|
||||
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
|
||||
laser - complex optical scientific equipment
|
||||
|
||||
|
||||