diff --git a/img/accretion.webp b/img/accretion.webp new file mode 100644 index 0000000..6a7fc45 Binary files /dev/null and b/img/accretion.webp differ diff --git a/img/cavitation.webp b/img/cavitation.webp new file mode 100644 index 0000000..d02ca81 Binary files /dev/null and b/img/cavitation.webp differ diff --git a/img/ergodicity.webp b/img/ergodicity.webp index 6e82295..969e577 100644 Binary files a/img/ergodicity.webp and b/img/ergodicity.webp differ diff --git a/img/gun/foam.webp b/img/gun/foam.webp index 69944a5..f70c318 100644 Binary files a/img/gun/foam.webp and b/img/gun/foam.webp differ diff --git a/img/gun/harpoon.webp b/img/gun/harpoon.webp index 5e5298f..fb158cf 100644 Binary files a/img/gun/harpoon.webp and b/img/gun/harpoon.webp differ diff --git a/index.html b/index.html index 2c839bc..41913e6 100644 --- a/index.html +++ b/index.html @@ -119,7 +119,9 @@ - + run + --> classic n-gon: diff --git a/js/bullet.js b/js/bullet.js index 2f15fd8..89ecbd4 100644 --- a/js/bullet.js +++ b/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(`b.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 sticks to mobsslows mobs and does damage 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 }, diff --git a/js/level.js b/js/level.js index 040a9d0..2a446d5 100644 --- a/js/level.js +++ b/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(`"n-gon" by Oranger`); + ngon() { //make by Oranger + simulation.makeTextLog(`"ngon" by Oranger`); document.body.style.backgroundColor = "#dcdcde"; let needGravity = []; @@ -18166,7 +18174,6 @@ const level = { }, downpour() { simulation.makeTextLog(`Downpour by DesBoot`); - simulation.makeTextLog(`level.onLevel = "Downpour"`); let mobsspawned = 0 const laser = level.hazard(7492, -2612, 10, 500, 0.3) //laserintro diff --git a/js/player.js b/js/player.js index 23eabc9..83071a3 100644 --- a/js/player.js +++ b/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(`m.maxEnergy = ${(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)); + } + } + } } } }, diff --git a/js/powerup.js b/js/powerup.js index 53a5c91..c9ee175 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -695,9 +695,11 @@ const powerUps = { } text += ` ${tech.isResearchReality ? "alternate reality" : "research"}` } else { - text += `research` // + text += `research` // } - if (tech.isCancelTech) { + if (tech.isSuperDeterminism) { + text += `cancel` + } else if (tech.isCancelTech) { text += `randomize` } else { text += `cancel` @@ -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 diff --git a/js/simulation.js b/js/simulation.js index 6dc83ed..e20bdaf 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -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 += "" + simulation.constructMapString[i] + "" } 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') }); diff --git a/js/tech.js b/js/tech.js index 30553d4..2bbcf1f 100644 --- a/js/tech.js +++ b/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: "25% chance to discharge a huge foam bubbleincrease foam recoil by 100%", + 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 300 ammo+100% foam gun bubble size", @@ -6520,27 +6541,6 @@ const tech = { b.guns[8].chooseFireMethod() } }, - // { - // name: "cavitation", - // description: "increase foam gun recoil by 300%", - // 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: "charge effects build up almost instantlythrowing blocks, foam, railgun, pulse, tokamak", @@ -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 levelsspawn ${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: `+88% damage while off the ground-22% damage while on the ground`, @@ -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, } \ No newline at end of file diff --git a/todo.txt b/todo.txt index fb38687..111705b 100644 --- a/todo.txt +++ b/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