diff --git a/.DS_Store b/.DS_Store index b62cbdd..d1b0483 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index a8e8d39..59f3371 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -425,10 +425,10 @@ const b = { if (dist < radius) { if (simulation.dmgScale) { const harm = tech.isExplosionHarm ? 0.075 : 0.05 - if (tech.isImmuneExplosion && m.energy > 0.15) { + if (tech.isImmuneExplosion && m.energy > 0.12) { // const mitigate = Math.min(1, Math.max(1 - m.energy * 0.5, 0)) - m.energy -= 0.15 - m.damage(0.01 * harm); //remove 99% of the damage 1-0.99 + m.energy -= 0.12 + // m.damage(0.01 * harm); //remove 99% of the damage 1-0.99 // console.log(Math.max(0, Math.min(0.15 - 0.01 * player.speed, 0.15))) knock = Vector.mult(Vector.normalise(sub), -0.6 * player.mass * Math.max(0, Math.min(0.15 - 0.002 * player.speed, 0.15))); player.force.x = knock.x; // not += so crazy forces can't build up with MIRV diff --git a/js/engine.js b/js/engine.js index 51658f2..1612c89 100644 --- a/js/engine.js +++ b/js/engine.js @@ -107,7 +107,7 @@ function collisionChecks(event) { !mob[k].isSlowed && !mob[k].isStunned ) { let dmg = Math.min(Math.max(0.025 * Math.sqrt(mob[k].mass), 0.05), 0.3) * simulation.dmgScale; //player damage is capped at 0.3*dmgScale of 1.0 - if (m.isCloak) dmg *= 0.5 + if (m.isCloak) dmg *= 0.75 mob[k].foundPlayer(); if (tech.isRewindAvoidDeath && m.energy > 0.66 && dmg > 0.01) { //CPT reversal runs in m.damage, but it stops the rest of the collision code here too m.damage(dmg); @@ -150,7 +150,7 @@ function collisionChecks(event) { y: mob[k].velocity.y - 8 * Math.sin(angle) }); - if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].isDropPowerUp && m.energy > 0.34 * m.maxEnergy) { + if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].isDropPowerUp && m.energy > 0.34 * m.maxEnergy && mob[k].damageReduction > 0) { m.energy -= 0.33 * Math.max(m.maxEnergy, m.energy) //0.33 * m.energy if (m.immuneCycle === m.cycle + tech.collisionImmuneCycles) m.immuneCycle = 0; //player doesn't go immune to collision damage mob[k].death(); diff --git a/js/index.js b/js/index.js index 8278b91..d155be7 100644 --- a/js/index.js +++ b/js/index.js @@ -219,6 +219,9 @@ for (let i = 0, len = tech.tech.length; i < len; i++) { if (!tech.tech[i].link) tech.tech[i].link = `${tech.tech[i].name}` } + +//
effective defense: ${(1-simulation.dmgScale*m.harmReduction()).toPrecision(3)} +//
effective damage: ${(tech.damageFromTech() * m.dmgScale).toPrecision(3)} const build = { pauseGrid() { //left side @@ -238,18 +241,18 @@ const build = { copy build url
` text += ` -
effective damage: ${(tech.damageFromTech() * m.dmgScale).toPrecision(4)} -
damage: ${((tech.damageFromTech())).toPrecision(4)}, difficulty: ${((m.dmgScale)).toPrecision(4)} +
damage: ${((tech.damageFromTech())).toPrecision(3)} +
difficulty: ${((m.dmgScale)).toPrecision(3)}
-
effective harm: ${(simulation.dmgScale*m.harmReduction()).toPrecision(4)} -
reduction: ${(m.harmReduction()).toPrecision(4)}, difficulty: ${(simulation.dmgScale).toPrecision(4)} +
+defense: ${(1-m.harmReduction()).toPrecision(3)} +
difficulty: ${(simulation.dmgScale).toPrecision(3)}
${botText}
health: (${(m.health*100).toFixed(0)} / ${(m.maxHealth*100).toFixed(0)})   energy: (${(m.energy*100).toFixed(0)} / ${(m.maxEnergy*100).toFixed(0)})
gun: ${b.activeGun === null || b.activeGun === undefined ? "undefined":b.guns[b.activeGun].name}   ammo: ${b.activeGun === null || b.activeGun === undefined ? "0":b.guns[b.activeGun].ammo}
fire delay decrease: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
duplication chance: ${(tech.duplicationChance()*100).toFixed(0)}% -
tech: ${tech.totalCount}   research: ${powerUps.research.count} +

tech: ${tech.totalCount}   research: ${powerUps.research.count}
position: (${player.position.x.toFixed(1)}, ${player.position.y.toFixed(1)})   velocity: (${player.velocity.x.toFixed(1)}, ${player.velocity.y.toFixed(1)})
mouse: (${simulation.mouseInGame.x.toFixed(1)}, ${simulation.mouseInGame.y.toFixed(1)})   mass: ${player.mass.toFixed(1)}
@@ -507,6 +510,7 @@ ${simulation.isCheating ? "

lore disabled": ""} } } else { text += `
${tech.tech[i].name}
${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
` + // text += `
${tech.tech[i].name}
${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
` } } } @@ -963,7 +967,7 @@ window.addEventListener("keydown", function(event) { H - harm immunity + +100% defense B diff --git a/js/level.js b/js/level.js index 8801865..593b963 100644 --- a/js/level.js +++ b/js/level.js @@ -18,9 +18,9 @@ const level = { // simulation.isHorizontalFlipped = true // m.addHealth(Infinity) // m.setField("time dilation") - // b.giveGuns("laser") - // tech.giveTech("closed timelike curve") - // tech.giveTech("translucent") + // b.giveGuns("shotgun") + // tech.giveTech("ice-shot") + // tech.giveTech("MACHO") // tech.giveTech("clock gating") // tech.giveTech("6s half-life") // for (let i = 0; i < 10; i++) tech.giveTech("replication") @@ -37,10 +37,10 @@ const level = { // m.immuneCycle = Infinity //you can't take damage // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why // simulation.enableConstructMode() //used to build maps in testing mode - // level.testing(); + // level.reservoir(); // spawn.cellBossCulture(1900, -500) - // spawn.launcherBoss(1900, -500) - // level.dripp(); //not in rotation, used for testing + // spawn.snakeBoss(1900, -500) + // level.testing(); //not in rotation, used for testing if (simulation.isTraining) { level.walk(); } else { level.intro(); } //normal starting level ************************************************ // powerUps.research.changeRerolls(3000) @@ -609,7 +609,18 @@ const level = { this.frictionAir = friction.up } } - + } + //edge limits + if (this.position.y < maxHeight) { + Matter.Body.setPosition(this, { + x: this.holdX, + y: maxHeight + }); + } else if (this.position.y > y) { + Matter.Body.setPosition(this, { + x: this.holdX, + y: y + }); } // hold horizontal position Matter.Body.setPosition(this, { @@ -3436,7 +3447,7 @@ const level = { let waterFallX = 0 let waterFallSmoothX = 0 let isWaterfallFilling = false - const riseRate = 0.25 + Math.min(1, simulation.difficulty * 0.01) + const riseRate = 0.30 + Math.min(1, simulation.difficulty * 0.005) const spinnerArray = [] // level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why @@ -8826,7 +8837,7 @@ const level = { } anotherBoss = (x, y) => { - if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) { + if (tech.isDuplicateBoss && Math.random() < tech.duplicationChance()) { tech.isScaleMobsWithDuplication = true spawn.randomLevelBoss(x, y, ["historyBoss"]); tech.isScaleMobsWithDuplication = false diff --git a/js/mob.js b/js/mob.js index 100a139..3f90abf 100644 --- a/js/mob.js +++ b/js/mob.js @@ -59,7 +59,9 @@ const mobs = { } function applySlow(whom) { - if (!whom.shield && !whom.isShielded) { + if (!whom.shield && !whom.isShielded && who.alive) { + if (tech.isIceMaxHealthLoss && who.health > 0.66 && who.damageReduction > 0) who.health = 0.66 + if (tech.isIceKill && who.health < 0.33 && who.damageReduction > 0) who.death(); if (whom.isBoss) cycles = Math.floor(cycles * 0.25) let i = whom.status.length while (i--) { @@ -68,8 +70,8 @@ const mobs = { whom.isSlowed = true; whom.status.push({ effect() { - if (whom.speed > 2) { - const drag = 0.95 + if (whom.speed > 1) { + const drag = 0.94 Matter.Body.setVelocity(whom, { x: whom.velocity.x * drag, y: whom.velocity.y * drag @@ -1065,7 +1067,7 @@ const mobs = { if ((!this.isShielded || isBypassShield) && this.alive) { dmg *= tech.damageFromTech() //mobs specific damage changes - if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 50% dmg at max range of 3500 + if (tech.isFarAwayDmg) dmg *= 1 + Math.sqrt(Math.max(500, Math.min(3000, this.distanceToPlayer())) - 500) * 0.0067 //up to 33% dmg at max range of 3000 dmg *= this.damageReduction //energy and heal drain should be calculated after damage boosts if (tech.energySiphon && dmg !== Infinity && this.isDropPowerUp && m.immuneCycle < m.cycle) m.energy += Math.min(this.health, dmg) * tech.energySiphon diff --git a/js/player.js b/js/player.js index e0a0ecd..f5e23e9 100644 --- a/js/player.js +++ b/js/player.js @@ -514,7 +514,7 @@ const m = { dmg *= m.fieldHarmReduction if (tech.isZeno) dmg *= 0.15 if (tech.isFieldHarmReduction) dmg *= 0.5 - if (tech.isHarmMACHO) dmg *= 0.33 + if (tech.isHarmMACHO) dmg *= 0.4 if (tech.isImmortal) dmg *= 0.66 if (tech.isHarmReduceNoKill && m.lastKillCycle + 300 < m.cycle) dmg *= 0.33 if (tech.healthDrain) dmg *= 1 + 3.33 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage @@ -537,7 +537,7 @@ const m = { rewind(steps) { // m.rewind(Math.floor(Math.min(599, 137 * m.energy))) if (tech.isRewindGrenade) { const immunityDuration = 65 - const immunityCycle = m.cycle + immunityDuration + 10 + const immunityCycle = m.cycle + immunityDuration + 10 + tech.isPetalsExplode * 30 + tech.isCircleExplode * 21 if (m.immuneCycle < immunityCycle) m.immuneCycle = immunityCycle; //player is immune to damage until after grenades might explode... for (let i = 1, len = Math.floor(4 + steps / 40); i < len; i++) { @@ -1523,9 +1523,9 @@ const m = { }, fieldUpgrades: [{ name: "field emitter", - //
energy regen disabled if immune to harm - description: "use energy to deflect mobs
store up to 100 energy
generate 6 energy/second", - // description: "use energy to deflect mobs,
grab power ups, and throw blocks
generate 6 energy/s, when not immune to harm", + //
energy regen disabled if immune to harm + description: "use energy to deflect mobs
100 max energy
generate 6 energy per second", + // description: "use energy to deflect mobs,
grab power ups, and throw blocks
generate 6 energy/s, when not immune to harm", effect: () => { m.hold = function() { if (m.isHolding) { @@ -1551,7 +1551,7 @@ const m = { { name: "standing wave", //deflecting protects you in every direction - description: "3 oscillating shields are permanently active
increase your max energy by 60
generate 6 energy/second", //drains energy //deflecting has 50% less recoil + description: "3 oscillating shields are permanently active
+60 max energy
generate 6 energy per second", //drains energy //deflecting has 50% less recoil drainCD: 0, effect: () => { m.fieldBlockCD = 0; @@ -1652,7 +1652,7 @@ const m = { }, { name: "perfect diamagnetism", - description: "deflecting does not drain energy
maintains functionality while inactive
generate 6 energy/second", + description: "deflecting does not drain energy
maintains functionality while inactive
generate 6 energy per second", //
attract power ups from far away // description: "attract power ups from far away
deflecting doesn't drain energy
thrown blocks have", // description: "gain energy when blocking
no recoil when blocking", @@ -1864,7 +1864,7 @@ const m = { { name: "negative mass", //
hold blocks as if they have a lower mass - description: "use energy to nullify  gravity
reduce harm by 55%
generate 6 energy/second", + description: "use energy to nullify  gravity
reduce harm by 55%
generate 6 energy per second", fieldDrawRadius: 0, effect: () => { m.fieldFire = true; @@ -2014,7 +2014,7 @@ const m = { }, { name: "molecular assembler", - description: "excess energy used to build drones
use energy to deflect mobs
generate 12 energy/second", + description: "excess energy used to build drones
use energy to deflect mobs
generate 12 energy per second", //double your default energy regeneration effect: () => { // m.fieldMeterColor = "#0c5" @@ -2150,7 +2150,7 @@ const m = { // }, { name: "plasma torch", - description: "use energy to emit short range plasma
damages and pushes mobs away
generate 6 energy/second", + description: "use energy to emit short range plasma
damages and pushes mobs away
generate 6 energy per second", set() { b.isExtruderOn = false if (m.plasmaBall) { @@ -2524,8 +2524,8 @@ const m = { }, { name: "time dilation", - // description: "use energy to stop time
while time is stopped you can move and fire
and collisions do 50% less harm", - description: "use energy to stop time
move, jump, and fire 25% faster
generate 18 energy/second", + // description: "use energy to stop time
while time is stopped you can move and fire
and collisions do 50% less harm", + description: "use energy to stop time
move, jump, and fire 25% faster
generate 18 energy per second", set() { m.fieldFireRate = 0.75 b.setFireCD(); @@ -2684,8 +2684,8 @@ const m = { }, { name: "metamaterial cloaking", //"weak photonic coupling" "electromagnetically induced transparency" "optical non-coupling" "slow light field" "electro-optic transparency" - //
collisions do 50% less harm when cloaked - description: "when not firing activate cloaking
+333% damage if no mob has died in 4 seconds
generate 6 energy/second", + //
collisions do 50% less harm when cloaked + description: "when not firing activate cloaking
+333% damage if no mob has died in 4 seconds
generate 6 energy per second", effect: () => { m.fieldFire = true; m.fieldMeterColor = "#333"; @@ -2984,7 +2984,7 @@ const m = { name: "pilot wave", //
blocks can't collide with intangible mobs //field radius decreases out of line of sight - description: "use energy to guide blocks
unlock tech from other fields
generate 6 energy/second", + description: "use energy to guide blocks
unlock tech from other fields
generate 6 energy per second", effect: () => { m.fieldPhase = 0; m.fieldPosition = { @@ -3180,7 +3180,7 @@ const m = { { name: "wormhole", //wormholes attract blocks and power ups
- description: "use energy to tunnel through a wormhole
4% chance to duplicate spawned power ups
generate 6 energy/second", //
bullets may also traverse wormholes + description: "use energy to tunnel through a wormhole
4% chance to duplicate spawned power ups
generate 6 energy per second", //
bullets may also traverse wormholes drain: 0, effect: function() { m.duplicateChance = 0.04 diff --git a/js/spawn.js b/js/spawn.js index 94741b7..f84383a 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -51,7 +51,7 @@ const spawn = { this[pick](x, y); } - if (tech.isMoreMobs) { + if (tech.isMoreMobs || (tech.isDuplicateBoss && Math.random() < tech.duplicationChance())) { const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)]; this[pick](x, y); } @@ -66,7 +66,7 @@ const spawn = { this[pick](x + Math.round((Math.random() - 0.5) * 20) + i * size * 2.5, y + Math.round((Math.random() - 0.5) * 20), size); } } - if (tech.isMoreMobs) { + if (tech.isMoreMobs || (tech.isDuplicateBoss && Math.random() < tech.duplicationChance())) { for (let i = 0; i < num; ++i) { const pick = this.pickList[Math.floor(Math.random() * this.pickList.length)]; this[pick](x + Math.round((Math.random() - 0.5) * 20) + i * size * 2.5, y + Math.round((Math.random() - 0.5) * 20), size); @@ -109,7 +109,7 @@ const spawn = { } }, secondaryBossChance(x, y) { - if (tech.isDuplicateBoss && Math.random() < 2 * tech.duplicationChance()) { + if (tech.isDuplicateBoss && Math.random() < tech.duplicationChance()) { tech.isScaleMobsWithDuplication = true spawn.randomLevelBoss(x, y); tech.isScaleMobsWithDuplication = false @@ -215,12 +215,12 @@ const spawn = { //aoe damage to player if (m.immuneCycle < m.cycle && Vector.magnitude(Vector.sub(player.position, this.position)) < this.radius) { - const DRAIN = tech.isRadioactiveResistance ? 0.07 * 0.25 : 0.07 + const DRAIN = tech.isRadioactiveResistance ? 0.05 * 0.25 : 0.05 if (m.energy > DRAIN) { if (m.immuneCycle < m.cycle) m.energy -= DRAIN } else { m.energy = 0; - m.damage((tech.isRadioactiveResistance ? 0.007 * 0.25 : 0.007) * simulation.dmgScale) + m.damage((tech.isRadioactiveResistance ? 0.005 * 0.25 : 0.005) * simulation.dmgScale) simulation.drawList.push({ //add dmg to draw queue x: this.position.x, y: this.position.y, @@ -5564,8 +5564,10 @@ const spawn = { for (let i = 0; i < nodes; ++i) { angle -= 0.15 + i * 0.008 - mag -= 5 - spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20); + mag -= (i < 2) ? -15 : 5 + spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), i === 0 ? 25 : 20); + // mag -= 5 + // spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20); if (i === 0) mob[mob.length - 1].snakeHeadID = me.id mob[mob.length - 1].previousTailID = previousTailID previousTailID = mob[mob.length - 1].id @@ -5609,11 +5611,11 @@ const spawn = { mobs.spawn(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 8, radius, color1); //"rgb(55,170,170)" let me = mob[mob.length - 1]; me.isBoss = true; - me.accelMag = 0.0004 + 0.0003 * Math.sqrt(simulation.accelScale) + me.accelMag = 0.00045 + 0.0002 * Math.sqrt(simulation.accelScale) me.memory = 250; me.laserRange = 500; Matter.Body.setDensity(me, 0.00165 + 0.00011 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger - me.startingDamageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) + me.startingDamageReduction = 0.2 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0 me.isInvulnerable = true @@ -5642,15 +5644,13 @@ const spawn = { let previousTailID = 0 for (let i = 0; i < nodes; ++i) { angle -= 0.15 + i * 0.008 - mag -= 5 - spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), 20); + mag -= (i < 2) ? -15 : 5 + spawn.snakeBody(x + mag * Math.cos(angle), y + mag * Math.sin(angle), i === 0 ? 25 : 20); if (i === 0) mob[mob.length - 1].snakeHeadID = me.id mob[mob.length - 1].previousTailID = previousTailID previousTailID = mob[mob.length - 1].id } - this.constrain2AdjacentMobs(nodes, Math.random() * 0.06 + 0.01); - for (let i = mob.length - 1, len = i - nodes; i > len; i--) { //set alternating colors if (i % 2) { mob[i].fill = "#333" @@ -5683,11 +5683,11 @@ const spawn = { mobs.spawn(x, y, 8, radius, "rgba(0,180,180,0.4)"); let me = mob[mob.length - 1]; me.collisionFilter.mask = cat.bullet | cat.player | cat.mob //| cat.body - me.accelMag = 0.0006 * simulation.accelScale; + me.accelMag = 0.0007 * simulation.accelScale; me.leaveBody = Math.random() < 0.33 ? true : false; me.showHealthBar = false; me.isDropPowerUp = false; - Matter.Body.setDensity(me, 0.003); //normal is 0.001 + Matter.Body.setDensity(me, 0.005); //normal is 0.001 me.frictionAir = 0.015; me.isSnakeTail = true; me.stroke = "transparent" diff --git a/js/tech.js b/js/tech.js index 56a2335..a5a7209 100644 --- a/js/tech.js +++ b/js/tech.js @@ -232,7 +232,7 @@ const tech = { if (tech.isEnergyLoss) dmg *= 1.55 if (tech.OccamDamage) dmg *= tech.OccamDamage if (tech.isTechDebt) dmg *= Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) - if (tech.isAxion && tech.isHarmMACHO) dmg *= 1 + 0.75 * (1 - m.harmReduction()) + if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.harmReduction() if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) @@ -249,7 +249,7 @@ const tech = { if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165) if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots() - if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.5 + if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.6 if (m.isSneakAttack && m.cycle > m.lastKillCycle + 240) dmg *= tech.sneakAttackDmg return dmg * tech.slowFire * tech.aimDamage }, @@ -328,7 +328,7 @@ const tech = { }, { name: "ad hoc", - description: `spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, field, ${powerUps.orb.ammo(1)}, or tech
for every gun in your inventory`, + description: `for each gun in your inventory
spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, field, ${powerUps.orb.ammo(1)}, or tech`, maxCount: 1, //random power up count: 0, frequency: 1, @@ -357,7 +357,7 @@ const tech = { }, { name: "applied science", - description: `get a random guntech
for each gun in your inventory`, //spawn ${powerUps.orb.research(1)} and + description: `for each gun in your inventory
get a random guntech`, //spawn ${powerUps.orb.research(1)} and maxCount: 9, count: 0, isNonRefundable: true, @@ -392,6 +392,47 @@ const tech = { }, remove() {} }, + { + name: "arsenal", + // descriptionFunction() { + // return `increase damage by ${14 * b.inventory.length}%
14% for each gun in your inventory` + // }, + description: "for each gun in your inventory
+13% damage", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect() { + tech.isDamageForGuns = true; + }, + remove() { + tech.isDamageForGuns = false; + } + }, + { + name: "active cooling", + description: "for each gun in your inventory
+20% fire rate", + maxCount: 1, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect() { + tech.isFireRateForGuns = true; + b.setFireCD(); + }, + remove() { + tech.isFireRateForGuns = false; + b.setFireCD(); + } + }, { name: "integrated armament", link: `integrated armament`, @@ -419,7 +460,7 @@ const tech = { simulation.boldActiveGunHUD(); }, 1000); }, - description: "while your first gun is equipped
reduce harm by 13% for each of your guns", + description: "if your first gun is equipped
+13% defense for each of your guns", maxCount: 1, count: 0, frequency: 1, @@ -466,51 +507,10 @@ const tech = { // } } }, - { - name: "arsenal", - // descriptionFunction() { - // return `increase damage by ${14 * b.inventory.length}%
14% for each gun in your inventory` - // }, - description: "increase damage by 13%
for each gun in your inventory", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return true - }, - requires: "", - effect() { - tech.isDamageForGuns = true; - }, - remove() { - tech.isDamageForGuns = false; - } - }, - { - name: "active cooling", - description: "20% decreased delay after firing
for each gun in your inventory", - maxCount: 1, - count: 0, - frequency: 1, - frequencyDefault: 1, - allowed() { - return true - }, - requires: "", - effect() { - tech.isFireRateForGuns = true; - b.setFireCD(); - }, - remove() { - tech.isFireRateForGuns = false; - b.setFireCD(); - } - }, { name: "supply chain", junk: 0.05, - descriptionFunction() { return `double your current ammo for all guns` }, + descriptionFunction() { return `for each gun in your inventory
double your current ammo` }, maxCount: 9, count: 0, frequency: 1, @@ -581,7 +581,7 @@ const tech = { }, { name: "catabolism", - description: `firing while out of ammo spawns ${powerUps.orb.ammo(4)}
but it reduces your maximum health by 1`, + description: `if you fire while out of ammo
spawn ${powerUps.orb.ammo(4)} and –1 maximum health`, maxCount: 1, count: 0, frequency: 1, @@ -599,7 +599,7 @@ const tech = { }, { name: "exciton", - description: `increase damage by 88%, but
${powerUps.orb.ammo()} will no longer spawn`, + description: `+88% damage
${powerUps.orb.ammo()} can't spawn`, maxCount: 1, count: 0, frequency: 1, @@ -618,7 +618,7 @@ const tech = { { name: "desublimated ammunition", link: `desublimated ammunition`, - description: `every other shot uses no ammo when crouching`, + description: `if crouching
alternating shots use no ammo`, maxCount: 1, count: 0, frequency: 1, @@ -636,7 +636,7 @@ const tech = { }, { name: "gun turret", - description: "reduce harm by 66% when crouching", + description: "if crouching
+66% defense ", maxCount: 1, count: 0, frequency: 1, @@ -654,7 +654,7 @@ const tech = { }, { name: "dead reckoning", - description: "increase damage by 36% when at rest", + description: "if your speed is 0
+36% damage", maxCount: 9, count: 0, frequency: 1, @@ -670,7 +670,7 @@ const tech = { }, { name: "Higgs mechanism", - description: "while firing your position is locked
50% decreased delay after firing", + description: "if firing
+50% fire rate and your position is locked", maxCount: 1, count: 0, frequency: 1, @@ -694,7 +694,7 @@ const tech = { }, { name: "squirrel-cage rotor", - description: "move and jump 30% faster
take 5% more harm", + description: "+30% movement and jumping
–5% defense", maxCount: 9, count: 0, frequency: 1, @@ -742,7 +742,7 @@ const tech = { // }, { name: "Newton's 1st law", - description: "moving at high speeds
reduces harm by up to 66%", + description: "defense is proportional to your speed
up to +66% defense at 40 speed", maxCount: 1, count: 0, frequency: 1, @@ -760,7 +760,7 @@ const tech = { }, { name: "Newton's 2nd law", - description: "moving at high speeds
increases damage by up to 66%", + description: "damage is proportional to your speed
up to +66% damage at 40 speed", maxCount: 1, count: 0, frequency: 1, @@ -776,7 +776,8 @@ const tech = { }, { name: "kinetic bombardment", - description: "increase damage by up to 33% at a distance
of up to 50 player widths from the target", + description: "damage is proportional to mob distance
up to +33% damage at 3000 displacement", + // description: "increase damage by up to 33% at a distance
of up to 50 player widths from the target", maxCount: 1, count: 0, frequency: 1, @@ -792,7 +793,7 @@ const tech = { }, { name: "regression", - description: "bullet collisions increase vulnerability to
damage by 5% for mobs (0.25% for bosses)", + description: "bullet collisions increase vulnerability to
damage by +5% for mobs (+0.25% for bosses)", maxCount: 1, count: 0, frequency: 1, @@ -809,7 +810,7 @@ const tech = { { name: "microstates", link: `microstates`, - description: "increase damage by 7%
for every 10 active projectiles", + description: "for each active bullets / bots
+0.7% damage", maxCount: 1, count: 0, frequency: 1, @@ -825,7 +826,7 @@ const tech = { }, { name: "simulated annealing", - description: "increase damage by 20%
20% increased delay after firing", + description: "+20% damage
–20% fire rate", maxCount: 1, count: 0, frequency: 1, @@ -842,7 +843,7 @@ const tech = { }, { name: "heuristics", - description: "33% decreased delay after firing", + description: "+33% fire rate", maxCount: 9, count: 0, frequency: 1, @@ -861,7 +862,7 @@ const tech = { { name: "fracture analysis", - description: "bullet impacts do 400% damage
to stunned mobs", + description: "if a mob is stunned it takes
+400% damage from bullet impacts", maxCount: 1, count: 0, frequency: 2, @@ -879,7 +880,7 @@ const tech = { }, { name: "thermal runaway", - description: "mobs explode when they die", + description: "after mobs die
they explode", maxCount: 1, count: 0, frequency: 1, @@ -897,7 +898,7 @@ const tech = { }, { name: "shear stress", - description: "mobs release a nail when they die
nails target nearby mobs", + description: "after mobs die
they release a nail that targets nearby mobs", maxCount: 9, count: 0, frequency: 1, @@ -916,7 +917,7 @@ const tech = { { name: "zoospore vector", link: `zoospore vector`, - description: "mobs produce spores when they die
10% chance", + description: "after mobs die
they have a +10% chance to grow spores", maxCount: 9, count: 0, frequency: 1, @@ -939,7 +940,7 @@ const tech = { }, { name: "reaction inhibitor", - description: "mobs spawn with 13% less health", + description: "mobs spawn with –13% health", maxCount: 3, count: 0, frequency: 1, @@ -962,7 +963,7 @@ const tech = { }, { name: "propagator", - description: "increase damage by 67%, but after
mobs die lose 0.5 seconds of time", + description: "after mobs die advance time 0.5 seconds
+67% damage", maxCount: 1, count: 0, frequency: 1, @@ -980,7 +981,7 @@ const tech = { }, { name: "decorrelation", - description: "reduce harm by 70% after not activating
your gun or field for 2 seconds", + description: "if your gun or field are unused for 2 seconds
+70% defense", maxCount: 1, count: 0, frequency: 1, @@ -1017,7 +1018,7 @@ const tech = { { name: "scrap bots", link: `scrap bots`, - description: "33% chance after killing a mob to build
a scrap bot that operates for 14 seconds", + description: "after mobs die you have a +33% chance
to build scrap bots that operate for 14 seconds", maxCount: 3, count: 0, frequency: 1, @@ -1037,7 +1038,7 @@ const tech = { { name: "scrap refit", link: `scrap refit`, - description: "killing a mob resets your functional scrap bots
to 14 seconds of operation", + description: "after mobs die
reset scrap bots to 14 seconds of operation", maxCount: 1, count: 0, frequency: 3, @@ -1348,7 +1349,7 @@ const tech = { { name: "dynamo-bot", link: `dynamo-bot`, - description: "a bot damages mobs while it traces your path
regen 7 energy per second when it's near", + description: "a bot damages mobs while it traces your path
when it's near generate 7 energy per second", maxCount: 9, count: 0, frequency: 1, @@ -1372,7 +1373,7 @@ const tech = { { name: "dynamo-bot upgrade", link: `dynamo-bot upgrade`, - description: "convert your bots to dynamo-bots
increase regen to 23 energy per second", + description: "convert your bots to dynamo-bots
when it's near generate 23 energy per second", maxCount: 1, count: 0, frequency: 3, @@ -1460,7 +1461,7 @@ const tech = { }, { name: "perimeter defense", - description: "reduce harm by 6%
for each of your permanent bots", + description: "for each permanent bot
+6% defense", maxCount: 1, count: 0, frequency: 2, @@ -1479,7 +1480,7 @@ const tech = { }, { name: "network effect", - description: "increase damage by 6%
for each of your permanent bots", + description: "for each permanent bot
+6% damage", maxCount: 1, count: 0, frequency: 2, @@ -1556,7 +1557,7 @@ const tech = { }, { name: "mass driver", - description: "increase block collision damage by 300%", + description: "+300% block collision damage", maxCount: 1, count: 0, frequency: 1, @@ -1575,7 +1576,7 @@ const tech = { { name: "inflation", link: `inflation`, - description: "throwing a block expands it by 300%
holding a block reduces harm by 85%", + description: "if holding a block +85% defense
after throwing a block it expands 300%", maxCount: 1, count: 0, frequency: 3, @@ -1593,7 +1594,7 @@ const tech = { }, { name: "restitution", - description: "throwing a block makes it very bouncy
increase block collision damage by 150%", + description: "+150% block collision damage
after throwing a block it becomes very bouncy", maxCount: 1, count: 0, frequency: 3, @@ -1611,7 +1612,7 @@ const tech = { }, { name: "flywheel", - description: "after a mob dies its block is flung at mobs
increase block collision damage by 150%", + description: "+150% block collision damage
after a mob dies its block is flung at mobs", maxCount: 1, count: 0, frequency: 3, @@ -1645,27 +1646,9 @@ const tech = { // tech.isBlockBullets = false // } // }, - // { - // name: "inelastic collision", - // description: "holding a block reduces harm by 85%
increase block collision damage by 150%", - // maxCount: 1, - // count: 0, - // frequency: 3, - // frequencyDefault: 3, - // allowed() { - // return tech.blockDamage > 0.075 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isEnergyHealth - // }, - // requires: "mass driver, a field that can hold things, not mass-energy", - // effect() { - // tech.isBlockHarm = true - // }, - // remove() { - // tech.isBlockHarm = false - // } - // }, { name: "buckling", - description: `if a block you threw kills a mob
spawn 1 ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`, + description: `if a block you threw kills a mob
spawn either ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`, maxCount: 1, count: 0, frequency: 3, @@ -1683,7 +1666,7 @@ const tech = { }, { name: "Pauli exclusion", - description: `after receiving harm from a collision become
immune to harm for 2.5 extra seconds`, + description: `after mob collisions
become invulnerable for +2.5 seconds`, maxCount: 9, count: 0, frequency: 1, @@ -1700,7 +1683,7 @@ const tech = { }, { name: "spin–statistics theorem", - description: `become immune to harm for 1.75 seconds
once every 7 seconds`, + description: `every 7 seconds
become invulnerable for 1.75 seconds`, maxCount: 3, count: 0, frequency: 1, @@ -1718,7 +1701,7 @@ const tech = { }, { name: "NOR gate", - description: "if flip-flop is in the OFF state
take 0 harm from collisions with mobs", + description: "if flip-flop is OFF
become invulnerable to your next collision", maxCount: 1, count: 0, frequency: 4, @@ -1736,7 +1719,7 @@ const tech = { }, { name: "shape-memory alloy", - description: "if flip-flop is in the ON state
increase your maximum health by 200", + description: "if flip-flop is ON
+200 maximum health", maxCount: 1, count: 0, frequency: 4, @@ -1793,27 +1776,9 @@ const tech = { m.eyeFillColor = 'transparent' } }, - // { - // name: "spacetime interval", - // description: "increase damage by 93%, but after mobs die
move into the past / future while ON / OFF", - // maxCount: 1, - // count: 0, - // frequency: 4, - // frequencyDefault: 4, - // allowed() { - // return tech.isFlipFlop || tech.isRelay - // }, - // requires: "ON/OFF tech", - // effect() { - // tech.isDeathSkipTime = true - // }, - // remove() { - // tech.isDeathSkipTime = false - // } - // }, { name: "NAND gate", - description: "if in the ON state
do 55.5% more damage", + description: "if ON
+55.5% damage", maxCount: 1, count: 0, frequency: 4, @@ -1831,7 +1796,7 @@ const tech = { }, { name: "transistor", - description: "if ON regen 20 energy per second
if OFF drain 1 energy per second", + description: "if ON generate 20 energy per second
if OFF drain 1 energy per second", maxCount: 1, count: 0, frequency: 4, @@ -1887,7 +1852,7 @@ const tech = { }, { name: "lithium-ion", - description: "if relay switch is in the ON state
increase your maximum energy by 300", + description: "if relay switch is ON
+300 maximum energy", maxCount: 1, count: 0, frequency: 4, @@ -1905,28 +1870,9 @@ const tech = { m.setMaxEnergy() } }, - // { - // name: "shift registers", - // description: "set to the ON state
at the start of a level", - // maxCount: 1, - // count: 0, - // frequency: 4, - // frequencyDefault: 4, - // allowed() { - // return tech.isFlipFlopEnergy || tech.isFlipFlopDamage || tech.isFlipFlopHarm || tech.relayIce - // }, - // requires: "2 ON/OFF techs", - // effect() { - // tech.isFlipFlopLevelReset = true; - // }, - // remove() { - // tech.isFlipFlopLevelReset = false; - // } - // }, - { name: "thermocouple", - description: "if relay switch is in the ON state
condense 4-13 ice IX crystals every second", + description: "if relay switch is ON
condense 4-13 ice IX crystals per second", maxCount: 9, count: 0, frequency: 4, @@ -1942,6 +1888,42 @@ const tech = { tech.relayIce = 0 } }, + { + name: "freezer burn", + description: "mobs frozen while below 33% health die", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 + }, + requires: "a freeze effect", + effect() { + tech.isIceKill = true + }, + remove() { + tech.isIceKill = false + } + }, + { + name: "flash freeze", + description: "mobs frozen while above 66% health
have their health reduced to 66%", + maxCount: 1, + count: 0, + frequency: 2, + frequencyDefault: 2, + allowed() { + return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 + }, + requires: "a freeze effect", + effect() { + tech.isIceMaxHealthLoss = true + }, + remove() { + tech.isIceMaxHealthLoss = false + } + }, { name: "crystallizer", description: "after frozen mobs die they
shatter into ice IX crystals", @@ -1980,7 +1962,7 @@ const tech = { }, { name: "superfluidity", - description: "freeze effects are applied to a small area", + description: "freeze effects are applied
to a small area around the target", maxCount: 1, count: 0, frequency: 2, @@ -1996,27 +1978,9 @@ const tech = { tech.isAoESlow = false } }, - // { - // name: "osmoprotectant", - // description: `collisions with stunned or frozen mobs
cause you no harm`, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.isStunField || tech.isExplosionStun || tech.isMineStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isNeedleIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot - // }, - // requires: "a freezing or stunning effect", - // effect() { - // tech.isFreezeHarmImmune = true; - // }, - // remove() { - // tech.isFreezeHarmImmune = false; - // } - // }, { name: "liquid cooling", - description: `freeze all mobs for 7 seconds
after receiving harm`, + description: `after losing health
freeze all mobs for 7 seconds`, maxCount: 1, count: 0, frequency: 2, @@ -2034,7 +1998,7 @@ const tech = { }, { name: "clock gating", - description: `slow time by 50% after receiving harm
reduce harm by 20%`, + description: `after losing health slow time by 50%
+20% defense`, maxCount: 1, count: 0, frequency: 1, @@ -2052,7 +2016,7 @@ const tech = { }, { name: "MACHO", - description: "a massive but compact object slowly follows you
take 66% less harm inside it's halo", + description: "a massive but compact object slowly follows you
if you are inside the MACHO +60% defense", maxCount: 1, count: 0, frequency: 1, @@ -2075,7 +2039,7 @@ const tech = { }, { name: "axion", - description: "while inside the MACHO 75% of your total
harm reduction is added to your damage", + description: "while inside the MACHO
defense increases damage", maxCount: 1, count: 0, frequency: 2, @@ -2093,7 +2057,7 @@ const tech = { }, { name: "ablative drones", - description: "rebuild your broken parts as drones
chance to occur after receiving harm", + description: "after losing health there is a chance
to rebuild your broken parts as drones", maxCount: 1, count: 0, frequency: 1, @@ -2113,7 +2077,7 @@ const tech = { { name: "non-Newtonian armor", link: `non-Newtonian armor`, - description: "for 10 seconds after receiving harm
reduce harm by 66%", + description: "after mob collisions
+66% defense for 10 seconds", maxCount: 1, count: 0, frequency: 1, @@ -2131,7 +2095,7 @@ const tech = { }, // { // name: "radiative equilibrium", - // description: "for 10 seconds after receiving harm
increase damage by 200%", + // description: "for 10 seconds after receiving defense
increase damage by 200%", // maxCount: 1, // count: 0, // frequency: 1, @@ -2149,7 +2113,8 @@ const tech = { // }, { name: "CPT symmetry", - description: "charge, parity, and time invert to undo harm
rewind (1.5—5) seconds for (66—220) energy", + // description: "charge, parity, and time invert to undo defense
rewind (1.5—5) seconds for (66—220) energy", + description: "if you have 66 energy after losing health
rewind time for 44 energy per second", maxCount: 1, count: 0, frequency: 1, @@ -2168,7 +2133,7 @@ const tech = { { name: "causality bots", link: `causality bots`, - description: "when you rewind, build several bots
that protect you for about 9 seconds", + description: "after you rewind, build several bots
that protect you for about 9 seconds", maxCount: 3, count: 0, frequency: 2, @@ -2188,7 +2153,7 @@ const tech = { { name: "causality bombs", link: `causality bombs`, - description: "when you rewind drop several grenades
become immune to harm until they explode", + description: "after you rewind drop several grenades
become invulnerable until they explode", maxCount: 1, count: 0, frequency: 2, @@ -2206,7 +2171,7 @@ const tech = { }, { name: "piezoelectricity", - description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15% + description: "if you collide with a mob
generate 2048 energy", //
reduce defense by 15% maxCount: 1, count: 0, frequency: 1, @@ -2225,8 +2190,8 @@ const tech = { }, { name: "mass-energy equivalence", - // description: "energy protects you instead of health
√ of harm reduction reduces max energy", - description: "energy protects you instead of health
harm reduction effects provide no benefit", + // description: "energy protects you instead of health
√ of defense reduction reduces max energy", + description: "energy protects you instead of health
defense provides no benefit", maxCount: 1, count: 0, frequency: 1, @@ -2260,7 +2225,7 @@ const tech = { { name: "1st ionization energy", link: `1st ionization energy`, - description: `each ${powerUps.orb.heal()} you collect
increases your maximum energy by 10`, + description: `after you collect ${powerUps.orb.heal()}
+10 maximum energy`, maxCount: 1, count: 0, frequency: 2, @@ -2287,7 +2252,7 @@ const tech = { }, { name: "weak interaction", - description: "each unused power up at the end of a level
adds 10 maximum energy", // (up to 51 health per level)", + description: "for each unused power up at the end of a level
+10 maximum energy", // (up to 51 health per level)", maxCount: 1, count: 0, frequency: 1, @@ -2305,7 +2270,7 @@ const tech = { }, { name: "electroweak interaction", - description: "unused power ups at the end of each level
are still activated (selections are random)", + description: "unused power ups at the end of a level
are still activated (selections are random)", maxCount: 1, count: 0, frequency: 2, @@ -2323,7 +2288,7 @@ const tech = { }, { name: "electronegativity", - description: "increase damage by 1%
for every 8 stored energy", + description: "+1% damage per 8 stored energy", maxCount: 1, count: 0, frequency: 1, @@ -2339,8 +2304,8 @@ const tech = { }, { name: "ground state", - description: "increase your max energy by 200
reduce passive energy regen by 66%", - // description: "reduce harm by 66%
you no longer passively regenerate energy", + description: "+200 maximum energy
–66% passive energy generation", + // description: "reduce defense by 66%
you no longer passively regenerate energy", maxCount: 1, count: 0, frequency: 1, @@ -2362,7 +2327,7 @@ const tech = { }, { name: "heat engine", - description: `increase damage by 50%, but
reduce maximum energy by 50`, + description: `+50% damage
–50 maximum energy`, maxCount: 1, count: 0, frequency: 1, @@ -2382,7 +2347,7 @@ const tech = { }, { name: "exothermic process", - description: "increase damage by 50%
if a mob dies drain energy by 25%", + description: "+50% damage
after mobs die –25% energy", maxCount: 1, count: 0, frequency: 1, @@ -2398,7 +2363,7 @@ const tech = { }, { name: "Gibbs free energy", - description: `increase damage by 0.7%
for each energy below 100`, + description: `for each energy below 100
+0.7% damage`, maxCount: 1, count: 0, frequency: 1, @@ -2416,7 +2381,7 @@ const tech = { }, { name: "overcharge", - description: "increase your maximum energy by 60
+10% JUNK to the potential tech pool", + description: "+60 maximum energy
+10% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -2440,7 +2405,7 @@ const tech = { }, { name: "Maxwell's demon", - description: "energy above your max decays 95% slower
+10% JUNK to the potential tech pool", + description: "energy above your max decays 95% slower
+10% JUNK to tech pool", maxCount: 1, count: 0, frequency: 2, @@ -2464,7 +2429,7 @@ const tech = { }, { name: "inductive coupling", - description: "passive energy regen is increased by 700%
but you only regen when crouched", + description: "if crouched +700% passive energy generation
if not crouched energy generation is disabled", maxCount: 1, count: 0, frequency: 1, @@ -2503,7 +2468,7 @@ const tech = { }, { name: "waste heat recovery", - description: "if a mob has died in the last 5 seconds
regen 5% of max energy every second", + description: "if a mob has died in the last 5 seconds
generate 5% of max energy per second", maxCount: 1, count: 0, frequency: 1, @@ -2519,7 +2484,7 @@ const tech = { }, { name: "recycling", - description: "if a mob has died in the last 5 seconds
regain 0.5% of max health every second", + description: "if a mob has died in the last 5 seconds
recover 0.5% of max health per second", maxCount: 1, count: 0, frequency: 1, @@ -2538,7 +2503,7 @@ const tech = { }, { name: "parasitism", - description: "if a mob has died in the last 5 seconds inhibit
passive energy regen and increase damage 50%", + description: "if a mob has died in the last 5 seconds
+60% damage, inhibit energy generation", maxCount: 1, count: 0, frequency: 1, @@ -2561,7 +2526,7 @@ const tech = { }, { name: "torpor", - description: "if a mob has not died in the last 5 seconds
reduce harm by 66%", + description: "if a mob has not died in the last 5 seconds
+66% defense", maxCount: 1, count: 0, frequency: 1, @@ -2579,8 +2544,8 @@ const tech = { }, { name: "Zeno's paradox", - description: "reduce harm by 85%, but every 5 seconds
remove 5% of your current health", - // description: "every 5 seconds remove 1/10 of your health
reduce harm by 90%", + description: "+85% defense
–5% of current health every 5 seconds", + // description: "every 5 seconds remove 1/10 of your health
reduce defense by 90%", maxCount: 1, count: 0, frequency: 1, @@ -2596,7 +2561,7 @@ const tech = { }, { name: "negative feedback", - description: "increase damage by 5%
for every 10 health below 100", + description: "for each 10 health below 100
+5% damage", maxCount: 1, count: 0, frequency: 1, @@ -2614,7 +2579,7 @@ const tech = { }, { name: "antiscience", - description: "increase damage by 90%
lose 11 health when you pick up a tech", + description: "+90% damage
–11 health after picking up a tech", maxCount: 1, count: 0, frequency: 1, @@ -2632,7 +2597,7 @@ const tech = { }, { name: "fluoroantimonic acid", - description: "increase damage by 35%
when your health is above 100", + description: "if your health is above 100
+35% damage", maxCount: 1, count: 0, frequency: 2, @@ -2650,7 +2615,7 @@ const tech = { }, { name: "tungsten carbide", - description: "increase your maximum health by 100
landings that force you to crouch cause harm", + description: "+100 maximum health
lose health after hard landings", maxCount: 1, count: 0, frequency: 1, @@ -2671,7 +2636,7 @@ const tech = { }, { name: "quenching", - description: `over healing from ${powerUps.orb.heal()} does harm
but it also increase your maximum health`, + description: `after over healing from ${powerUps.orb.heal()}
gain max health and lose current health`, maxCount: 1, count: 0, frequency: 1, @@ -2689,7 +2654,7 @@ const tech = { }, { name: "negative entropy", - description: `at the start of each level
spawn ${powerUps.orb.heal()} for every 26 missing health`, + description: `at the start of each level
for every 26 missing health spawn ${powerUps.orb.heal()}`, maxCount: 1, count: 0, frequency: 1, @@ -2708,7 +2673,7 @@ const tech = { }, { name: "adiabatic healing", - description: `${powerUps.orb.heal()} are 100% more effective
+5% JUNK to the potential tech pool`, + description: `${powerUps.orb.heal()} are 100% more effective
+5% JUNK to tech pool`, maxCount: 3, count: 0, frequency: 1, @@ -2737,7 +2702,7 @@ const tech = { }, { name: "enthalpy", - description: `doing damage can spawn ${powerUps.orb.heal(1)}
take 10% more harm`, + description: `doing damage has a chance to spawn ${powerUps.orb.heal(1)}
–10% defense`, maxCount: 9, count: 0, frequency: 1, @@ -2804,7 +2769,7 @@ const tech = { }, { name: "weak anthropic principle", - description: "after anthropic principle prevents your death
add 50% duplication chance for that level", + description: "after anthropic principle prevents your death
+50% duplication chance for that level", maxCount: 1, count: 0, frequency: 3, @@ -2824,7 +2789,7 @@ const tech = { }, { name: "strong anthropic principle", - description: "after anthropic principle prevents your death
increase damage by 137.03599% for that level", + description: "after anthropic principle prevents your death
+137.03599% damage for that level", maxCount: 1, count: 0, frequency: 3, @@ -2842,7 +2807,7 @@ const tech = { }, { name: "quantum immortality", - description: "reduce harm by 33%
after dying, continue in an alternate reality", + description: "+33% defense
after dying, continue in an alternate reality", maxCount: 1, count: 0, frequency: 1, @@ -2859,7 +2824,7 @@ const tech = { { name: "non-unitary operator", link: `non-unitary operator`, - description: "reduce combat difficulty by 2 levels, but
after a collision enter an alternate reality", + description: "reduce combat difficulty by 2 levels
after a collision enter an alternate reality", maxCount: 1, count: 0, frequency: 1, @@ -2901,7 +2866,7 @@ const tech = { { name: "Ψ(t) collapse", link: `Ψ(t) collapse`, - description: `enter an alternate reality after you research
spawn ${powerUps.orb.research(14)}`, + description: `after you research enter an alternate reality
spawn ${powerUps.orb.research(14)}`, maxCount: 1, count: 0, frequency: 1, @@ -2968,7 +2933,7 @@ const tech = { }, { name: "perturbation theory", - description: `66% decreased delay after firing
when you have no ${powerUps.orb.research(1)} in your inventory`, + description: `if you have no ${powerUps.orb.research(1)} in your inventory
+66% fire rate`, maxCount: 1, count: 0, frequency: 1, @@ -2990,7 +2955,7 @@ const tech = { }, { name: "ansatz", - description: `after choosing a field, tech, or gun
spawn ${powerUps.orb.research(2)}if you have no ${powerUps.orb.research(1)} in your inventory`, + description: `after choosing a field, tech, or gun
if you have no ${powerUps.orb.research(1)} in your inventory spawn ${powerUps.orb.research(2)}`, maxCount: 1, count: 0, frequency: 1, @@ -3008,7 +2973,7 @@ const tech = { }, { name: "Bayesian statistics", - description: `increase damage by 3.8%
for each ${powerUps.orb.research(1)} in your inventory`, + description: `for each ${powerUps.orb.research(1)} in your inventory
+3.8% damage`, maxCount: 1, count: 0, frequency: 2, @@ -3083,7 +3048,7 @@ const tech = { }, { name: "emergence", - description: "tech, fields, and guns have 5 choices
+5% JUNK to the potential tech pool", + description: "tech, fields, and guns have 5 choices
+5% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3231,7 +3196,7 @@ const tech = { { name: "eternalism", // description: `increase damage by 60%, but time doesn't pause
while choosing a choosing a field, tech, or gun`, //${powerUps.orb.heal()} or - description: "increase damage by 40%, but
time can't be paused (time dilation still works)", + description: "+40% damage
time can't be paused (time can be dilated)", maxCount: 1, count: 0, frequency: 1, @@ -3253,7 +3218,7 @@ const tech = { // description: `increase damage by 300%, but reduce damage
by 10% for tech you have learned`, descriptionFunction() { // return `increase damage by 300% minus 15%
for each tech you have learned (${Math.floor(100*(4 - 0.14 * tech.totalCount))-100}%)` - return `increase damage by 300% minus 15%
for each tech you have learned (${Math.floor(100*(Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) ))-100}%)` + return `+300% damage –15% damage
for each tech you have learned (${Math.floor(100*(Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) ))-100}%)` }, maxCount: 1, count: 0, @@ -3304,7 +3269,7 @@ const tech = { }, { name: "dark patterns", - description: "reduce combat difficulty by 1 level
+31% JUNK to the potential tech pool", + description: "reduce combat difficulty by 1 level
+31% JUNK to tech pool", maxCount: 1, count: 0, frequency: 1, @@ -3434,7 +3399,7 @@ const tech = { }, { name: "replication", - description: "10% chance to duplicate spawned power ups
+30% JUNK to the potential tech pool", + description: "+10% chance to duplicate spawned power ups
+30% JUNK to tech pool", maxCount: 9, count: 0, frequency: 1, @@ -3461,7 +3426,7 @@ const tech = { }, { name: "stimulated emission", - description: "15% chance to duplicate spawned power ups
but, after a collision eject 1 tech", + description: "+15% chance to duplicate spawned power ups
but, after a collision eject 1 tech", maxCount: 1, count: 0, frequency: 1, @@ -3482,7 +3447,7 @@ const tech = { }, { name: "metastability", - description: "12% chance to duplicate spawned power ups
duplicates explode with a 3 second half-life", + description: "+12% chance to duplicate spawned power ups
duplicates explode with a 3 second half-life", maxCount: 1, count: 0, frequency: 1, @@ -3503,7 +3468,7 @@ const tech = { }, { name: "correlated damage", - description: "your chance to duplicate power ups
increases your damage by the same percent", + description: "duplication increases damage", maxCount: 1, count: 0, frequency: 1, @@ -3521,7 +3486,7 @@ const tech = { }, { name: "parthenogenesis", - description: " bosses have a 2x chance to be duplicated, but their
health is increased by your duplication chance
", + description: "your duplication has a chance to
duplicate mobs and bosses", maxCount: 1, count: 0, frequency: 1, @@ -3596,7 +3561,7 @@ const tech = { // return `randomly remove ${this.removePercent * 100}% of your tech
for each removed gain ${this.damagePerRemoved * 100}% damage` // }, descriptionFunction() { - return `randomly remove half your tech
for each removed gain ${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : tech.OccamDamage*100}%)` + return `randomly remove half your tech
for each removed +${this.damagePerRemoved * 100 }% damage (~${(this.count === 0) ? this.damagePerRemoved * 50 * tech.totalCount : tech.OccamDamage*100}%)` }, maxCount: 1, count: 0, @@ -3678,7 +3643,7 @@ const tech = { }, { name: "strange attractor", - descriptionFunction() { return `use ${powerUps.orb.research(2)} to spawn 1 tech with double
your duplication chance (${(2*tech.duplicationChance()*100).toFixed(0)}%)` }, + descriptionFunction() { return `use ${powerUps.orb.research(2)} to spawn 1 tech with
double your duplication chance (${(2*tech.duplicationChance()*100).toFixed(0)}%)` }, // description: `use ${powerUps.orb.research(2)} to spawn 1 tech with double
your duplication chance (${(2*tech.duplicationChance()*100).toFixed(0)}%)`, maxCount: 1, count: 0, @@ -3815,7 +3780,7 @@ const tech = { // }, { name: "needle ice", - description: `when needles impact walls
they chip off 1-2 freezing ice IX crystals`, + description: `after needles impact walls
they chip off 1-2 freezing ice IX crystals`, isGunTech: true, maxCount: 1, count: 0, @@ -3834,7 +3799,7 @@ const tech = { }, { name: "nanowires", - description: `needles tunnel through blocks and map
increase needle damage by 20%`, + description: `needles tunnel through blocks and map
+20% needle damage`, isGunTech: true, maxCount: 1, count: 0, @@ -3924,78 +3889,9 @@ const tech = { tech.isRivets = false } }, - // { - // name: "slug", - // description: "shotgun lobs 1 huge bullet", - // isGunTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isIceShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles - // }, - // requires: "shotgun, not nail-shot, foam-shot, worm-shot, ice-shot, needle-shot", - // effect() { - // tech.isSlugShot = true; - // for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - // if (b.guns[i].name === "shotgun") { - // b.guns[i].do = function() { - // if (!input.field && input.down) { - // ctx.beginPath() - // const speed = input.down ? 212 : 160 - // const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky - // const where = { x: m.pos.x, y: m.pos.y } - // for (let i = 0; i < 20; i++) { - // v.x *= 0.9712 - // v.y = v.y * 0.977 + 9.87 - // where.x += v.x - // where.y += v.y - // ctx.lineTo(where.x, where.y) - // } - // ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map - // ctx.lineWidth = 2 - // ctx.stroke() - // } - // } - // break - // } - // } - // }, - // remove() { - // if (tech.isSlugShot) { - // for (i = 0, len = b.guns.length; i < len; i++) { //find which gun - // if (b.guns[i].name === "shotgun") { - // b.guns[i].do = function() {} - // break - // } - // } - // } - // tech.isSlugShot = false; - // } - // }, - // { - // name: "super sized", - // description: `increase super ball radius by 14%
increases damage by about 27%`, - // isGunTech: true, - // maxCount: 9, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.haveGunCheck("super balls") - // }, - // requires: "super balls", - // effect() { - // tech.bulletSize += 0.14 - // }, - // remove() { - // tech.bulletSize = 1; - // } - // }, { name: "caliber", - description: `rivets, needles, super balls, and nails
have 16% increased mass and physical damage`, + description: `rivets, needles, super balls, and nails
have +16% mass and physical damage`, isGunTech: true, maxCount: 9, count: 0, @@ -4014,7 +3910,7 @@ const tech = { }, { name: "pneumatic actuator", - description: "nail gun takes no time to ramp up
to its shortest delay after firing", + description: "nail gun takes no time to ramp up
to its fastest fire rate", isGunTech: true, maxCount: 1, count: 0, @@ -4127,7 +4023,7 @@ const tech = { { name: "irradiated nails", link: `irradiated nails`, - description: "nails, needles, and rivets are radioactive
about 90% more damage over 3 seconds", + description: "nails, needles, and rivets are radioactive
about +90% damage over 3 seconds", isGunTech: true, maxCount: 1, count: 0, @@ -4147,7 +4043,7 @@ const tech = { { name: "6s half-life", link: `6s half-life`, - description: "nails are made of plutonium-238
increase damage by 100% over 6 seconds", + description: "nails are made of plutonium-238
+100% damage over 6 seconds", isGunTech: true, maxCount: 1, count: 0, @@ -4187,7 +4083,7 @@ const tech = { { name: "spin-statistics", link: `spin-statistics`, - description: "immune to harm while firing the shotgun
shotgun has 50% fewer shots", + description: "invulnerable while firing the shotgun
shotgun has 50% fewer shots", isGunTech: true, maxCount: 1, count: 0, @@ -4226,7 +4122,7 @@ const tech = { }, { name: "Newton's 3rd law", - description: "shotgun recoil is increased
decrease shotgun delay after firing by 66%", + description: "+66% shotgun fire rate and recoil", isGunTech: true, maxCount: 1, count: 0, @@ -4246,7 +4142,7 @@ const tech = { { name: "Noether violation", link: `Noether violation`, - description: "increase shotgun damage 60%
its recoil is increased and reversed", + description: "+60% shotgun damage
shotgun recoil is increased and reversed", isGunTech: true, maxCount: 1, count: 0, @@ -4437,7 +4333,7 @@ const tech = { // { name: "phase velocity", - description: "matter wave propagates faster through solids
increase matter wave damage by 20%", + description: "matter wave propagates faster through solids
+20% matter wave damage", // description: "matter wave propagates faster through solids
up by 3000% in the map and 760% in blocks", isGunTech: true, maxCount: 1, @@ -4457,7 +4353,7 @@ const tech = { }, { name: "bound state", - description: "wave packets reflect backwards 2 times
range is reduced by 25%", + description: "wave packets reflect backwards 2 times
–25% range", isGunTech: true, maxCount: 9, count: 0, @@ -4476,7 +4372,7 @@ const tech = { }, { name: "amplitude", - description: "wave packet amplitude is 33% higher
wave damage is increased by 37%", + description: "+37% wave damage and amplitude", isGunTech: true, maxCount: 3, count: 0, @@ -4497,7 +4393,7 @@ const tech = { }, { name: "propagation", - description: "wave packet propagation speed is 25% slower
wave damage is increased by 37%", + description: "–25% wave packet propagation speed
+37% wave damage", isGunTech: true, maxCount: 9, count: 0, @@ -4558,7 +4454,7 @@ const tech = { }, { name: "isotropic radiator", - description: "matter wave expands in all directions
range reduced 40% and damage increased 50%", + description: "matter wave expands in all directions
–40% range and +50% damage", isGunTech: true, maxCount: 1, count: 0, @@ -4589,7 +4485,7 @@ const tech = { }, { name: "cruise missile", - description: "missiles travel 50% slower,
but have a 100% larger explosive payload", + description: "+100% missile explosive damage, radius
–50% missiles speed", isGunTech: true, maxCount: 1, count: 0, @@ -4608,7 +4504,7 @@ const tech = { }, { name: "ICBM", - description: "cruise missiles travel 66% slower,
but have a 100% larger explosive payload", + description: "+100% missile explosive damage, radius
–66% missiles speed", isGunTech: true, maxCount: 1, count: 0, @@ -4627,7 +4523,7 @@ const tech = { }, { name: "launch system", - description: `reduce missile launch cooldown 500%
gain 20% more missile ammo per ${powerUps.orb.ammo(1)}`, + description: `+500% missile fire rate
+20% missile ammo per ${powerUps.orb.ammo(1)}`, isGunTech: true, maxCount: 1, count: 0, @@ -4695,7 +4591,7 @@ const tech = { }, { name: "iridium-192", - description: "explosions release gamma radiation
100% more damage, but over 4 seconds", + description: "explosions release gamma radiation
+100% damage over 4 seconds", isGunTech: true, maxCount: 1, count: 0, @@ -4733,7 +4629,7 @@ const tech = { }, { name: "ammonium nitrate", - description: "increase explosive damage by 24%
increase explosive radius by 24%", + description: "+24% explosive damage, radius", isGunTech: true, maxCount: 9, count: 0, @@ -4752,7 +4648,7 @@ const tech = { }, { name: "nitroglycerin", - description: "increase explosive damage by 66%
decrease explosive radius by 33%", + description: "+66% explosive damage
–33% explosive radius", isGunTech: true, maxCount: 1, count: 0, @@ -4771,7 +4667,7 @@ const tech = { }, { name: "acetone peroxide", - description: "increase explosive radius by 70%, but
you take 50% more harm from explosions", + description: "+70% explosive radius
+50% explosive self damage", isGunTech: true, maxCount: 1, count: 0, @@ -4791,7 +4687,7 @@ const tech = { }, { name: "shock wave", - description: "mines and explosions stun for 1-2 seconds
decrease explosive damage by 30%", + description: "mines and explosions stun for 1-2 seconds
–30% explosive damage", isGunTech: true, maxCount: 1, count: 0, @@ -4808,29 +4704,9 @@ const tech = { tech.isExplosionStun = false; } }, - // { - // name: "blast mines", - // link: `blast mines`, - // description: "when a mine activates
it stuns nearby mobs for 2-4 seconds", - // isGunTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.haveGunCheck("mine") - // }, - // requires: "mines", - // effect() { - // tech.isMineStun = true; - // }, - // remove() { - // tech.isMineStun = false; - // } - // }, { name: "controlled explosion", - description: `use ${powerUps.orb.research(4)} to dynamically reduce all
explosions until they do no harm`, + description: `use ${powerUps.orb.research(4)} to dynamically reduce
all explosive radius to prevent self damage`, isGunTech: true, maxCount: 1, count: 0, @@ -4853,8 +4729,8 @@ const tech = { }, { name: "electric armor", - // description: "explosions do no harm
while your energy is above 98%", - description: "explosion harm is reduced by 99%, but
they drain 15 energy and have more force", + // description: "explosions do no defense
while your energy is above 98%", + description: "instead of causing self damage explosions
drain 12 energy and have more knockback", isGunTech: true, maxCount: 1, count: 0, @@ -4873,7 +4749,7 @@ const tech = { }, { name: "MIRV", - description: "fire +1 missile and grenade per shot
decrease explosion damage and radius 12%", + description: "fire +1 missile and grenade per shot
–12% explosion damage and radius", isGunTech: true, maxCount: 9, count: 0, @@ -4934,7 +4810,7 @@ const tech = { }, { name: "chain reaction", - description: "increase grenade radius and damage 33%
blocks caught in explosions also explode", + description: "+33% grenade radius and damage
blocks caught in explosions also explode", isGunTech: true, maxCount: 1, count: 0, @@ -4953,7 +4829,7 @@ const tech = { }, { name: "flame test", - description: "when grenades detonate they release
a colorful cluster of small explosions", + description: "after grenades detonate they release
a colorful cluster of small explosions", isGunTech: true, maxCount: 1, count: 0, @@ -4972,7 +4848,7 @@ const tech = { }, { name: "pyrotechnics", - description: "when grenades detonate they release
a colorful circle of explosions", + description: "after grenades detonate they release
a colorful circle of explosions", isGunTech: true, maxCount: 1, count: 0, @@ -4991,7 +4867,7 @@ const tech = { }, { name: "fireworks", - description: "when grenades detonate they release
colorful rings petals of explosions", + description: "after grenades detonate they release
colorful petals of explosions", isGunTech: true, maxCount: 1, count: 0, @@ -5010,7 +4886,7 @@ const tech = { }, { name: "neutron bomb", - description: "grenades are irradiated with Cf-252
does damage, harm, and drains energy", + description: "grenades are irradiated with Cf-252
does radioactive damage over time", isGunTech: true, maxCount: 1, count: 0, @@ -5069,7 +4945,7 @@ const tech = { }, { name: "nuclear transmutation", - description: "radiation does 47% more damage and harm
nail, drone, neutron bomb, iridium, string, deflect", + description: "+47% radiation damage
nail, drone, neutron bomb, iridium, string, deflect", isGunTech: true, maxCount: 9, count: 0, @@ -5108,7 +4984,7 @@ const tech = { }, { name: "booby trap", - description: "60% chance to drop a mine from power ups
+46% JUNK to the potential tech pool", + description: "60% chance to drop a mine from power ups
+46% JUNK to tech pool", isGunTech: true, maxCount: 1, count: 0, @@ -5252,7 +5128,7 @@ const tech = { }, { name: "mutualism", - description: "increase spore damage by 150%
they borrow 0.5 health until they die", + description: "+150% spore damage
spores borrow 0.5 health until they die", isGunTech: true, maxCount: 1, count: 0, @@ -5310,7 +5186,7 @@ const tech = { }, { name: "annelids", - description: "increase worm size and damage
by an average of 37%", + description: "+37% worm size and damage", isGunTech: true, maxCount: 3, count: 0, @@ -5349,7 +5225,7 @@ const tech = { { name: "anti-shear topology", link: `anti-shear topology`, - description: "some projectiles last 30% longer
drone, spore, worm, missile, foam, wave, neutron, ice", + description: "+30% projectile duration
drone, spore, worm, missile, foam, wave, neutron, ice", isGunTech: true, maxCount: 3, count: 0, @@ -5369,7 +5245,7 @@ const tech = { { name: "reduced tolerances", link: `reduced tolerances`, - description: `increase drones per ${powerUps.orb.ammo()} or energy by 66%
reduce average drone durability by 40%`, + description: `+66% drones per ${powerUps.orb.ammo()} and energy
–40% drone durability`, isGunTech: true, maxCount: 3, count: 0, @@ -5439,7 +5315,7 @@ const tech = { }, { name: "brushless motor", - description: "drones rapidly rush towards their target
increase drone collision damage by 33%", + description: "drones rapidly rush towards their target
+33% drone collision damage", isGunTech: true, maxCount: 1, count: 0, @@ -5458,7 +5334,7 @@ const tech = { }, { name: "axial flux motor", - description: "drones can rush 66% more often
increase drone collision damage by 44%", + description: "drones can rush 66% more often
+44% drone collision damage", isGunTech: true, maxCount: 1, count: 0, @@ -5478,7 +5354,7 @@ const tech = { { name: "irradiated drones", link: `irradiated drones`, - description: `the space around drones is irradiated
reduce drones per ${powerUps.orb.ammo()} or energy 75%`, + description: `the space around drones is irradiated
–75% drones per ${powerUps.orb.ammo()} and energy`, isGunTech: true, maxCount: 1, count: 0, @@ -5513,7 +5389,7 @@ const tech = { }, { name: "beta radiation", //"control rod ejection", - description: "reduce the average drone lifetime by 50%
increase radiation damage by 100%", + description: "–50% drone duration
+100% drone radiation damage", isGunTech: true, maxCount: 1, count: 0, @@ -5533,7 +5409,7 @@ const tech = { { name: "orthocyclic winding", link: `orthocyclic winding`, - description: "drones accelerate 66% faster
increase radiation damage by 33%", + description: "+66% drone acceleration
+33% radiation damage", isGunTech: true, maxCount: 1, count: 0, @@ -5587,7 +5463,7 @@ const tech = { }, { name: "surfactant", - description: "trade your foam gun for 2 foam-bots
and upgrade all bots to foam", + description: "trade your foam gun for 2 foam-bots
upgrade all bots to foam", isGunTech: true, isRemoveGun: true, maxCount: 1, @@ -5639,7 +5515,7 @@ const tech = { }, { name: "uncertainty principle", - description: "foam and wave particle positions are random
increase their damage by 47%", + description: "foam and wave positions are erratic
+47% foam and wave damage", isGunTech: true, maxCount: 1, count: 0, @@ -5677,7 +5553,7 @@ const tech = { }, { name: "aerogel", - description: "foam bubbles float and dissipate 50% faster
increase foam damage per second by 150%", + description: "–50% foam duration and foam bubbles float
+150% foam damage", isGunTech: true, maxCount: 1, count: 0, @@ -5698,7 +5574,7 @@ const tech = { }, { name: "surface tension", - description: "foam bubbles have improved adhesion which
does 41% more damage", + description: "+41% foam damage", isGunTech: true, maxCount: 9, count: 0, @@ -5717,7 +5593,7 @@ const tech = { }, { name: "foam fractionation", - description: "foam gun bubbles are 100% larger
when you have below 300 ammo", + description: "if you have below 300 ammo
+100% foam gun bubble size", isGunTech: true, maxCount: 1, count: 0, @@ -5736,7 +5612,7 @@ const tech = { }, { name: "ideal gas law", - description: `flush away all of your current foam ammo
gain 1200% more foam ammo from ${powerUps.orb.ammo(1)}`, + description: `remove all current foam ammo
+1200% foam ammo per ${powerUps.orb.ammo(1)}`, isGunTech: true, maxCount: 1, count: 0, @@ -5763,7 +5639,7 @@ const tech = { }, { name: "pressure vessel", - description: "the foam gun builds up pressure as you fire
that discharges foam after firing", + description: "build up charge while firing foam gun
after firing automatically discharge foam bubbles", isGunTech: true, maxCount: 1, count: 0, @@ -5814,7 +5690,7 @@ const tech = { }, { name: "railgun", - description: `harpoons are 50% denser, but don't retract
gain 800% more harpoon ammo per ${powerUps.orb.ammo(1)}`, + description: `+50% harpoon density, but they don't retract
+800% harpoon ammo per ${powerUps.orb.ammo(1)}`, isGunTech: true, maxCount: 1, count: 0, @@ -5852,44 +5728,6 @@ const tech = { } } }, - // { - // name: "dielectric polarization", - // description: "firing the railgun damages nearby mobs", - // isGunTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.haveGunCheck("railgun") - // }, - // requires: "railgun", - // effect() { - // tech.isRailAreaDamage = true; - // }, - // remove() { - // tech.isRailAreaDamage = false; - // } - // }, - // { - // name: "aerodynamic heating", - // description: "railgun rod damage nearby mobs", - // isGunTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return tech.haveGunCheck("railgun") - // }, - // requires: "railgun", - // effect() { - // tech.isRodAreaDamage = true; - // }, - // remove() { - // tech.isRodAreaDamage = false; - // } - // }, { name: "grappling hook", description: `harpoons attach to the map and pull you
your rope extends while holding fire`, @@ -5919,7 +5757,7 @@ const tech = { }, { name: "bulk modulus", - description: `become immune to harm while grappling
drains energy and prevents regen`, + description: `become immune to defense while grappling
drains energy and prevents generation`, isGunTech: true, maxCount: 1, count: 0, @@ -5938,7 +5776,7 @@ const tech = { }, { name: "alternator", - description: "harpoon, railgun, and grappling hook
drain 60% less energy", + description: "–60% harpoon energy drain", isGunTech: true, maxCount: 1, count: 0, @@ -5977,7 +5815,7 @@ const tech = { { name: "Bessemer process", descriptionFunction() { - return `increase harpoon size and damage
by 1/10 √ harpoon ammo (${(10 * Math.sqrt(b.guns[9].ammo)).toFixed(0)}%)` + return `+${(10 * Math.sqrt(b.guns[9].ammo)).toFixed(0)}% harpoon size and damage
(1/10 √ harpoon ammo)` }, // description: "increase the size of your harpoon
by 10% of √ of harpoon ammo", isGunTech: true, @@ -6000,7 +5838,6 @@ const tech = { name: "smelting", // description: `forge 3 ammo into a new harpoon
fire +1 harpoon with each shot`, descriptionFunction() { return `forge ${(tech.isRailGun ?5:3)*(2+this.count)} ammo into a new harpoon
fire +1 harpoon with each shot` }, - // description: `spend ${powerUps.orb.ammo(2)}to upgrade the harpoon
fire +1 harpoon with each shot`, // descriptionFunction() { return `forge ${tech.isRailGun? 10: 2} ammo into a new harpoon
fire +1 harpoon with each shot` }, isGunTech: true, maxCount: 9, @@ -6041,7 +5878,7 @@ const tech = { { name: "UHMWPE", descriptionFunction() { - return `increase the length of your harpoon's rope
by 1/100 of harpoon ammo (${(b.guns[9].ammo).toFixed(0)}%)` + return `+${(b.guns[9].ammo).toFixed(0)}% harpoon rope length
(1/100 of harpoon ammo)` }, // description: "increase the length of your harpoon's rope
by 1% per harpoon ammo", isGunTech: true, @@ -6062,7 +5899,7 @@ const tech = { }, { name: "induction furnace", - description: "increase the damage of your next harpoon
by 600% after using it to collect a power up", + description: "after using harpoon to collect a power up
+600% harpoon damage", isGunTech: true, maxCount: 1, count: 0, @@ -6144,14 +5981,14 @@ const tech = { }, { name: "laser diode", - description: "all lasers drain 30% less energy
affects laser-gun, laser-bot, laser-mines, pulse", + description: "–30% lasers energy drain
affects laser-gun, laser-bot, laser-mines, pulse", isGunTech: true, maxCount: 1, count: 0, frequency: 2, frequencyDefault: 2, allowed() { - return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine) && tech.laserDamage === 0.16 + return (tech.haveGunCheck("laser") || tech.isLaserBotUpgrade || tech.isLaserMine) && tech.laserDamage === 0.18 }, requires: "laser, not free-electron", effect() { @@ -6167,7 +6004,7 @@ const tech = { }, { name: "free-electron laser", - description: "increase all laser damage by 200%
increase all laser energy drain by 250%", + description: "+200% laser damage
+250% laser energy drain", isGunTech: true, maxCount: 1, count: 0, @@ -6192,7 +6029,7 @@ const tech = { }, { name: "relativistic momentum", - description: "all lasers push mobs and blocks away
affects laser-gun, laser-bot, and laser-mines", + description: "all lasers push mobs and blocks
affects laser-gun, laser-bot, and laser-mines", isGunTech: true, maxCount: 1, count: 0, @@ -6211,7 +6048,7 @@ const tech = { }, { name: "specular reflection", - description: "+2 reflection for all lasers
affects laser-gun, laser-bot, and laser-mines", + description: "+2 laser reflections
affects laser-gun, laser-bot, and laser-mines", isGunTech: true, maxCount: 3, count: 0, @@ -6230,7 +6067,7 @@ const tech = { }, { name: "diffraction grating", - description: `laser gains a diverging beam`, + description: `+1 angled laser gun beam`, isGunTech: true, maxCount: 9, count: 0, @@ -6258,7 +6095,7 @@ const tech = { { name: "diffuse beam", link: `diffuse beam`, - description: "laser beam is wider and doesn't reflect
increase full beam damage by 220%", + description: "laser beam is wider and doesn't reflect
220% laser damage", isGunTech: true, maxCount: 1, count: 0, @@ -6287,7 +6124,7 @@ const tech = { }, { name: "output coupler", - description: "widen diffuse laser beam by 30%
increase full beam damage by 30%", + description: "+30% laser beam width
30% laser damage", isGunTech: true, maxCount: 9, count: 0, @@ -6316,7 +6153,7 @@ const tech = { }, { name: "slow light", - description: "laser beam is spread into your recent past
increase total beam damage by 300%", + description: "laser beam is spread into your recent past
+300% total beam damage", isGunTech: true, maxCount: 9, count: 0, @@ -6352,7 +6189,7 @@ const tech = { frequency: 2, frequencyDefault: 2, allowed() { - return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDamage === 0.16 && !tech.isStuckOn + return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && tech.laserDamage === 0.18 && !tech.isStuckOn }, requires: "laser gun, not specular reflection, diffuse, free-electron laser, optical amplifier", effect() { @@ -6395,8 +6232,7 @@ const tech = { //************************************************** { name: "zero point energy", - description: `use ${powerUps.orb.research(2)}to increase your max energy by 100`, - // description: "use 2 research to
increase your maximum energy by 74", + description: `use ${powerUps.orb.research(2)}
+100 maximum energy`, isFieldTech: true, maxCount: 1, count: 0, @@ -6421,7 +6257,7 @@ const tech = { }, { name: "spherical harmonics", - description: "standing wave deflects 40% more efficiently
no longer deactivates with mob shields", //standing wave oscillates in a 3rd dimension
+ description: "+40% standing wave deflection efficiency
no longer deactivates on mob shields", //standing wave oscillates in a 3rd dimension
isFieldTech: true, maxCount: 9, count: 0, @@ -6444,7 +6280,7 @@ const tech = { }, { name: "expansion", - description: "standing wave deflects 40% more efficiently
using standing wave field expands its radius", + description: "+40% standing wave deflection efficiency
using standing wave field expands its radius", // description: "use energy to expand standing wave
the field slowly contracts when not used", isFieldTech: true, maxCount: 1, @@ -6486,7 +6322,7 @@ const tech = { }, { name: "cherenkov radiation", //deflecting and blocks - description: "bremsstrahlung's effects are radioactive
increase damage 300% over 6 seconds", + description: "bremsstrahlung's effects are radioactive
+300% damage over 6 seconds", isFieldTech: true, maxCount: 1, count: 0, @@ -6505,7 +6341,7 @@ const tech = { }, { name: "triple point", - description: "the pressure from deflecting is used
to condense ice IX crystals", + description: "deflecting condenses ice IX crystals", isFieldTech: true, maxCount: 9, count: 0, @@ -6524,7 +6360,7 @@ const tech = { }, { name: "flux pinning", - description: "deflecting mobs with your field
stuns them for 4 seconds", + description: "after deflecting a mob
it is stunned for upto 4 seconds", isFieldTech: true, maxCount: 9, count: 0, @@ -6543,7 +6379,7 @@ const tech = { }, { name: "eddy current brake", - description: "perfect diamagnetism slows nearby mobs
effect radius scales with stored energy", + description: "perfect diamagnetism slows nearby mobs
effect radius scales with stored energy", isFieldTech: true, maxCount: 1, count: 0, @@ -6562,7 +6398,7 @@ const tech = { }, { name: "Meissner effect", - description: "increase perfect diamagnetism field
radius by 55% and circular arc by 22°", + description: "+55% perfect diamagnetism radius
+22° perfect diamagnetism circular arc", isFieldTech: true, maxCount: 1, count: 0, @@ -6581,8 +6417,8 @@ const tech = { }, { name: "tessellation", - description: `use ${powerUps.orb.research(2)}to reduce harm by 50%`, - // description: "use 4 research
reduce harm by 50%", + description: `use ${powerUps.orb.research(2)}
+50% defense`, + // description: "use 4 research
reduce defense by 50%", isFieldTech: true, maxCount: 1, count: 0, @@ -6605,7 +6441,7 @@ const tech = { }, { name: "radiative equilibrium", - description: "for 10 seconds after receiving harm
increase damage by 200%", + description: "after losing health
+200% damage for 10 seconds", isFieldTech: true, maxCount: 1, count: 0, @@ -6624,7 +6460,7 @@ const tech = { }, { name: "neutronium", - description: `reduce harm by 90% when your field is active
move and jump 25% slower`, + description: `move and jump 25% slower
if your field is active +90% defense`, isFieldTech: true, maxCount: 1, count: 0, @@ -6652,7 +6488,7 @@ const tech = { }, { name: "annihilation", - description: "touching normal mobs annihilates them
but drains 33% of your maximum energy", + description: "after colliding with non-boss mobs
they are annihilated and –33% energy", isFieldTech: true, maxCount: 1, count: 0, @@ -6709,7 +6545,7 @@ const tech = { // }, { name: "pair production", - description: "picking up a power up gives you 200 energy", + description: "after picking up a power up
+200 energy", isFieldTech: true, maxCount: 1, count: 0, @@ -6755,7 +6591,7 @@ const tech = { }, { name: "bot prototypes", - description: `use ${powerUps.orb.research(3)}to build
2 random bots and upgrade all bots to that type`, + description: `use ${powerUps.orb.research(3)}to build 2 random bots
and upgrade all bots to that type`, isFieldTech: true, maxCount: 1, count: 0, @@ -6956,7 +6792,7 @@ const tech = { // }, { name: "degenerate matter", - description: "reduce harm by 75% while your field is active", + description: "if your field is active
+75% defense", isFieldTech: true, maxCount: 1, count: 0, @@ -7034,7 +6870,7 @@ const tech = { { name: "plasma jet", link: `plasma jet`, - description: `use ${powerUps.orb.research(2)} to increase plasma torch range 50%`, + description: `use ${powerUps.orb.research(2)}
+50% plasma torch range`, // description: "use 1 research to
increase plasma torch's range by 50%", isFieldTech: true, maxCount: 1, @@ -7138,7 +6974,7 @@ const tech = { }, { name: "retrocausality", - description: "time dilation uses energy to rewind your
health, velocity, and position up to 10 s", + description: "time dilation uses energy to rewind your
health, velocity, and position up to 10 seconds", isFieldTech: true, maxCount: 1, count: 0, @@ -7160,7 +6996,7 @@ const tech = { }, { name: "Lorentz transformation", - description: `use ${powerUps.orb.research(3)}to increase your time rate
move, jump, and shoot 50% faster`, + description: `use ${powerUps.orb.research(3)}
+50% movement, jumping, and fire rate`, isFieldTech: true, maxCount: 1, count: 0, @@ -7187,7 +7023,7 @@ const tech = { }, { name: "time crystals", - description: "quadruple your base energy regeneration", + description: "+400% passive energy generation", isFieldTech: true, maxCount: 1, count: 0, @@ -7208,7 +7044,7 @@ const tech = { }, { name: "no-cloning theorem", - description: `45% chance to duplicate spawned power ups
after a mob dies, lose 2% duplication chance`, + description: `+45% chance to duplicate spawned power ups
after a mob dies –2% duplication`, isFieldTech: true, maxCount: 1, count: 0, @@ -7230,7 +7066,7 @@ const tech = { }, { name: "symbiosis", - description: "after a mob dies, lose 0.45 max health
bosses spawn 1 extra tech after they die", + description: "bosses spawn +1 tech after they die
after a mob dies –0.45 maximum health", isFieldTech: true, maxCount: 1, count: 0, @@ -7247,54 +7083,10 @@ const tech = { tech.isAddRemoveMaxHealth = false } }, - // { - // name: "symbiosis", - // description: "after a mob dies, lose 0.5 max health
after picking up tech gain 10 max health", - // isFieldTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") - // }, - // requires: "metamaterial cloaking", - // effect() { - // tech.isAddRemoveMaxHealth = true - // tech.extraMaxHealth += 0.1 //increase max health - // m.setMaxHealth(); - // }, - // remove() { - // tech.isAddRemoveMaxHealth = false - // } - // }, - // { - // name: "symbiosis", - // description: "if a mob dies, lose 1% max health
at the end of each level spawn 2 tech", - // isFieldTech: true, - // maxCount: 1, - // count: 0, - // frequency: 2, - // frequencyDefault: 2, - // allowed() { - // return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking") && !tech.removeMaxHealthOnKill - // }, - // requires: "metamaterial cloaking, not -symbiosis-", - // effect() { - // tech.removeMaxHealthOnKill = 0.01 - // tech.isSpawnExitTech = true - // // for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 90 * (Math.random() - 0.5), player.position.y + 90 * (Math.random() - 0.5), "tech", false); //start - // for (let i = 0; i < 2; i++) powerUps.spawn(level.exit.x + 10 * (Math.random() - 0.5), level.exit.y - 100 + 10 * (Math.random() - 0.5), "tech", false) //exit - // }, - // remove() { - // tech.removeMaxHealthOnKill = 0 - // tech.isSpawnExitTech = false - // } - // }, { name: "boson composite", link: `boson composite`, - description: "intangible to blocks and mobs while cloaked
passing through shields drains your energy", + description: "while cloaked you are intangible
to blocks and mobs, but shields drains energy", isFieldTech: true, maxCount: 1, count: 0, @@ -7316,7 +7108,7 @@ const tech = { }, { name: "dazzler", - description: "decloaking stuns nearby mobs
and drains 10 energy", + description: "after decloaking stun nearby mobs
and –10 energy", isFieldTech: true, maxCount: 1, count: 0, @@ -7354,7 +7146,7 @@ const tech = { }, { name: "dynamical systems", - description: `use ${powerUps.orb.research(2)}to increase your damage by 35%`, + description: `use ${powerUps.orb.research(2)}
+35% damage`, // description: "use 1 research
increase your damage by 35%", isFieldTech: true, maxCount: 1, @@ -7378,7 +7170,7 @@ const tech = { }, { name: "discrete optimization", - description: "increase damage by 35%
35% increased delay after firing", + description: "+35% damage
–35% fire rate", isFieldTech: true, maxCount: 1, count: 0, @@ -7418,7 +7210,7 @@ const tech = { // }, { name: "WIMPs", - description: `at the end of each level spawn ${powerUps.orb.research(5)}
and a harmful particle that slowly chases you`, + description: `at the end of each level spawn ${powerUps.orb.research(5)}
and a harmful particle that slowly chases you`, isFieldTech: true, maxCount: 9, count: 0, @@ -7439,7 +7231,7 @@ const tech = { }, { name: "virtual particles", - description: `use ${powerUps.orb.research(4)}to exploit your field for a
12% chance to duplicate spawned power ups`, + description: `use ${powerUps.orb.research(4)}to exploit your field for a
+12% chance to duplicate spawned power ups`, isFieldTech: true, maxCount: 1, count: 0, @@ -7465,7 +7257,7 @@ const tech = { }, { name: "Penrose process", - description: "after a block falls into a wormhole
you gain 53 energy", + description: "after a block falls into a wormhole
+53 energy", isFieldTech: true, maxCount: 1, count: 0, @@ -7485,7 +7277,7 @@ const tech = { { name: "transdimensional worms", link: `transdimensional worms`, - description: "when blocks fall into a wormhole
higher dimension worms are summoned", + description: "after blocks fall into a wormhole
spawn a worm", isFieldTech: true, maxCount: 1, count: 0, @@ -7532,7 +7324,7 @@ const tech = { }, { name: "cosmic string", - description: "stun and do radioactive damage to mobs
if you tunnel through them with a wormhole", + description: "after tunneling through mobs with a wormhole
stun then and do radioactive damage", isFieldTech: true, maxCount: 1, count: 0, @@ -7551,7 +7343,7 @@ const tech = { }, { name: "invariant", - description: "use energy to pause time
while placing your wormhole", + description: "while placing your wormhole
use energy to pause time", isFieldTech: true, maxCount: 1, count: 0, @@ -7570,7 +7362,7 @@ const tech = { }, { name: "charmed baryons", - description: `wormholes require zero energy
move and jump 33% slower`, + description: `–33% movement and jumping
wormholes drain zero energy`, isFieldTech: true, maxCount: 1, count: 0, @@ -7598,7 +7390,7 @@ const tech = { }, { name: "affine connection", - description: "wormholes can tunnel through the map
at 200% increased energy cost", + description: "wormholes can tunnel through the map
for +200% energy drain", isFieldTech: true, maxCount: 1, count: 0, @@ -7765,7 +7557,7 @@ const tech = { }, { name: "-WIMP-", - description: "experiment: harmful particles slowly chase you", + description: "experiment: harmful particles slowly chase you", maxCount: 1, count: 0, frequency: 0, @@ -8153,7 +7945,7 @@ const tech = { }, { name: "catabolysis", - description: `set your maximum health to 1
double your current ammo 10 times`, + description: `set your maximum health to 1
double your current ammo 10 times`, maxCount: 1, count: 0, frequency: 0, @@ -9168,7 +8960,7 @@ const tech = { }, { name: "expert system", - description: "spawn a tech power up
+64% JUNK to the potential tech pool", + description: "spawn a tech power up
+64% JUNK to tech pool", maxCount: 9, count: 0, frequency: 0, @@ -9323,7 +9115,7 @@ const tech = { }, { name: "diegesis", - description: "indicate gun fire delay
through a rotation of your head", + description: "indicate fire cooldown
through a rotation of your head", maxCount: 1, count: 0, frequency: 0, @@ -10385,5 +10177,7 @@ const tech = { isClusterExplode: null, isCircleExplode: null, isPetalsExplode: null, - isDeathSkipTime: null + isDeathSkipTime: null, + isIceMaxHealthLoss: null, + isIceKill: null } \ No newline at end of file diff --git a/style.css b/style.css index abd7c01..f3e1632 100644 --- a/style.css +++ b/style.css @@ -692,10 +692,10 @@ summary { /* letter-spacing: 2px; */ } -.color-harm { +.color-defense { /* color: */ /* text-shadow: #FC0 1px 0 10px; */ - background-color: hsla(51, 100%, 71%, 0.187); + background-color: hsla(227, 9%, 71%, 0.279); padding: 2px; border-radius: 4px; letter-spacing: 1px; diff --git a/todo.txt b/todo.txt index 4b05dd4..07e27a0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,12 +1,71 @@ ******************************************************** NEXT PATCH ************************************************** -new community map: dripp! - enable the 13 community maps in settings +tech: freezer burn - if a mob is frozen while below 33% health, it dies +tech: flash freeze - if a mob is above 66% health it's health is set to 66% +snakeBoss 1st tail mob is larger and farther from boss +parthenogenesis your duplication effects extend to duplicate mobs and bosses +WIMPs do 33% less harm (because they are hard to deal with on reactor) +MACHO 66->60% defense +axion 75%-> 100% of defense added to damage +full tech wording rewrite (I probably made a few typos) + increase damage by 10% -> +10% damage + 20% fire delay reduction -> +20% fire rate + taking harm -> losing health + 50% harm reduction -> +50% defense + new defense text effect + extra long minus sign - -> – + +bug fixes *********************************************************** TODO ***************************************************** +scrap bots can't move? + +if a nail critical hits, fire a nail at the nearest mob + similar to mob death targeted nail code +nail gun needs a small damage buff + +JUNK tech: Pacifism + You cannot attack mobs, mobs cannot attack you + over write the mob.damage and player.damage methods + +JUNK tech: incubation: spawn something after 5 minutes + 4 bots? + +mob mechanic: beacon + periodically add locations to an array + teleport back to a location in the array + at random + if velocity not facing player? + +super balls do damage after bouncing? + how to check for bounce? + maybe just increases damage after hitting a mob + +put a shield on a shield on a shield ... + +dark mode: + look at Tinyfolks, 20 minutes till dawn + +super short range foam that acts like flame thrower + high fire rate + short life spawn + start large? + extra ammo? + or only 1/2 of ammo is used? + +laser tech where bots move around and follow you while firing lasers in the direction you are looking + they fire when you fire? + they aim at player history aim location, with 1s delay + bots position spread out perpendicular to the direction you are looking + can they get stuck? + maybe absolution position, no collide + do they need to be physics objects then? + make a special bot type for this + beam is similar to diffuse beam + block manufacturing - molecular assembler tech Holding r-click will create a slowly increasing in size block, which will be thrown on release