From 45fb86189be74b7319d69f6c5fafce7a1e3b465b Mon Sep 17 00:00:00 2001 From: landgreen Date: Fri, 2 Apr 2021 10:53:44 -0700 Subject: [PATCH] drone repair tech: automatic - always fire, but get 2.5x ammo requires inertial frame tech: drone repair - while drones are your active gun, drones respawn with a 50% chance to consume ammo --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 138 +++++------ js/mob.js | 1 - js/player.js | 4 +- js/powerup.js | 4 +- js/simulation.js | 5 +- js/tech.js | 588 ++++++++++++++++++++++++++++++++--------------- todo.txt | 22 +- 8 files changed, 480 insertions(+), 282 deletions(-) diff --git a/.DS_Store b/.DS_Store index 3302d7b33c1221dc209475f186561b67bee68c87..f347eb73173b44763dc06e8c288a9560052ca475 100644 GIT binary patch delta 21 ccmZoMXffEJ#muz))npxJKgJ82tC>4R08{n{hyVZp delta 21 ccmZoMXffEJ#msarYO)TqAEUzNYUWN6080@DZvX%Q diff --git a/js/bullet.js b/js/bullet.js index 5716f52..fbb9097 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -10,7 +10,11 @@ const b = { if (tech.isFireMoveLock) { b.fire = b.fireFloat } else if (tech.isFireNotMove) { - b.fire = b.fireNotMove + if (tech.isAlwaysFire) { + b.fire = b.fireNotMoveAlwaysFire + } else { + b.fire = b.fireNotMove + } } else { b.fire = b.fireNormal } @@ -19,92 +23,40 @@ const b = { fireNormal() { if (input.fire && m.fireCDcycle < m.cycle && (!input.field || m.fieldFire) && b.inventory.length) { if (b.guns[b.activeGun].ammo > 0) { - b.guns[b.activeGun].fire(); - if (tech.isCrouchAmmo && m.crouch) { - if (tech.isCrouchAmmo % 2) { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } - tech.isCrouchAmmo++ //makes the no ammo toggle off and on - } else { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } + b.fireWithAmmo() } else { - if (tech.isAmmoFromHealth) { - if (m.health > 0.05) { - m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty - if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo"); - } - } - } else { - simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); - } - m.fireCDcycle = m.cycle + 30; //fire cooldown + b.outOfAmmo() } if (m.holdingTarget) m.drop(); } }, - fireNotMove() { - //added && player.speed < 0.5 && m.onGround ************************* + fireNotMove() { //added && player.speed < 0.5 && m.onGround if (input.fire && m.fireCDcycle < m.cycle && (!input.field || m.fieldFire) && b.inventory.length && player.speed < 0.5 && m.onGround && Math.abs(m.yOff - m.yOffGoal) < 1) { if (b.guns[b.activeGun].ammo > 0) { - b.guns[b.activeGun].fire(); - if (tech.isCrouchAmmo && m.crouch) { - if (tech.isCrouchAmmo % 2) { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } - tech.isCrouchAmmo++ //makes the no ammo toggle off and on - } else { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } + b.fireWithAmmo() } else { - if (tech.isAmmoFromHealth) { - if (m.health > 0.05) { - m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty - if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo"); - } - } - } else { - simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); - } - m.fireCDcycle = m.cycle + 30; //fire cooldown + b.outOfAmmo() } if (m.holdingTarget) m.drop(); } }, - fireFloat() { - //added && player.speed < 0.5 && m.onGround ************************* + fireNotMoveAlwaysFire() { //added && player.speed < 0.5 && m.onGround //removed input.fire && (!input.field || m.fieldFire) + if (m.fireCDcycle < m.cycle && b.inventory.length && player.speed < 0.5 && m.onGround && Math.abs(m.yOff - m.yOffGoal) < 1) { + if (b.guns[b.activeGun].ammo > 0) { + b.fireWithAmmo() + } else { + b.outOfAmmo() + } + if (m.holdingTarget) m.drop(); + } + }, + fireFloat() { //added && player.speed < 0.5 && m.onGround if (input.fire && (!input.field || m.fieldFire) && b.inventory.length) { if (m.fireCDcycle < m.cycle) { if (b.guns[b.activeGun].ammo > 0) { - b.guns[b.activeGun].fire(); - if (tech.isCrouchAmmo && m.crouch) { - if (tech.isCrouchAmmo % 2) { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } - tech.isCrouchAmmo++ //makes the no ammo toggle off and on - } else { - b.guns[b.activeGun].ammo--; - simulation.updateGunHUD(); - } + b.fireWithAmmo() } else { - if (tech.isAmmoFromHealth) { - if (m.health > 0.05) { - m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty - if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo"); - } - } - } else { - simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); - } - m.fireCDcycle = m.cycle + 30; //fire cooldown + b.outOfAmmo() } if (m.holdingTarget) m.drop(); } @@ -116,6 +68,31 @@ const b = { player.force.y = 0 } }, + fireWithAmmo() { //triggers after firing when you have ammo + b.guns[b.activeGun].fire(); + if (tech.isCrouchAmmo && m.crouch) { + if (tech.isCrouchAmmo % 2) { + b.guns[b.activeGun].ammo--; + simulation.updateGunHUD(); + } + tech.isCrouchAmmo++ //makes the no ammo toggle off and on + } else { + b.guns[b.activeGun].ammo--; + simulation.updateGunHUD(); + } + }, + outOfAmmo() { //triggers after firing when you have NO ammo + simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`); + m.fireCDcycle = m.cycle + 30; //fire cooldown + if (tech.isAmmoFromHealth) { + if (m.health > 0.05) { + m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty + if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered + for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo"); + } + } + } + }, giveGuns(gun = "random", ammoPacks = 10) { if (tech.isOneGun) b.removeAllGuns(); if (gun === "random") { @@ -2049,8 +2026,8 @@ const b = { deathCycles: 110 + RADIUS * 5, isImproved: false, beforeDmg(who) { - if (tech.isIncendiary) { - const max = Math.max(Math.min(this.endCycle - simulation.cycle, 1500), 0) + if (tech.isIncendiary && simulation.cycle + this.deathCycles < this.endCycle) { + const max = Math.max(Math.min(this.endCycle - simulation.cycle - this.deathCycles, 1500), 0) b.explosion(this.position, max * 0.08 + this.isImproved * 100 + 60 * Math.random()); //makes bullet do explosive damage at end this.endCycle -= max } else { @@ -2067,12 +2044,23 @@ const b = { } } }, - onEnd() {}, + onEnd() { + if (tech.isDroneRespawn) { + const who = b.guns[b.activeGun] + if (who.name === "drones" && who.ammo > 0 && mob.length) { + b.drone({ x: this.position.x, y: this.position.y }, 0) + if (Math.random() < 0.33) { + b.guns[b.activeGun].ammo--; + simulation.updateGunHUD(); + } + } + } + }, do() { if (simulation.cycle + this.deathCycles > this.endCycle) { //fall shrink and die this.force.y += this.mass * 0.0012; this.restitution = 0.2; - const scale = 0.99; + const scale = 0.995; Matter.Body.scale(this, scale, scale); } else { this.force.y += this.mass * 0.0002; diff --git a/js/mob.js b/js/mob.js index 41e0d8e..90e0d50 100644 --- a/js/mob.js +++ b/js/mob.js @@ -917,7 +917,6 @@ const mobs = { this.torque -= 0.000004 * this.inertia; } else if (this.noseLength > 1.5 && dot > 0 && dot < 0.03) { //fire - console.log(dot) spawn.bullet(this.vertices[1].x, this.vertices[1].y, 9 + Math.ceil(this.radius / 15)); const v = 15; Matter.Body.setVelocity(mob[mob.length - 1], { diff --git a/js/player.js b/js/player.js index de766c9..3972933 100644 --- a/js/player.js +++ b/js/player.js @@ -513,7 +513,7 @@ const m = { let dmg = 1 dmg *= m.fieldHarmReduction if (tech.isImmortal) dmg *= 0.79 - if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.25 : 1.25 + if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.50 : 1.1 if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage if (tech.isBlockHarm && m.isHolding) dmg *= 0.15 @@ -1487,6 +1487,8 @@ const m = { // m.fieldHarmReduction = 0.80; m.fieldBlockCD = 0; m.fieldHarmReduction = 0.8; + m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance + m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance) m.hold = function() { if (m.isHolding) { m.drawHold(m.holdingTarget); diff --git a/js/powerup.js b/js/powerup.js index f31035b..d1e20ad 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -187,7 +187,7 @@ const powerUps = { if (tech.isAmmoForGun && b.inventory.length > 0 && b.activeGun) { const target = b.guns[b.activeGun] if (target.ammo !== Infinity) { - const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(0.7 * Math.random() * target.ammoPack) + const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(0.7 * Math.random() * target.ammoPack) * (tech.isAlwaysFire ? 3 : 1) target.ammo += ammoAdded simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) } @@ -195,7 +195,7 @@ const powerUps = { for (let i = 0, len = b.inventory.length; i < len; i++) { const target = b.guns[b.inventory[i]] if (target.ammo !== Infinity) { - const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + const ammoAdded = Math.ceil(Math.random() * target.ammoPack) * (tech.isAlwaysFire ? 3 : 1) target.ammo += ammoAdded simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`) } diff --git a/js/simulation.js b/js/simulation.js index fceb6f1..5788659 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -563,6 +563,7 @@ const simulation = { b.setFireMethod() b.setFireCD(); // simulation.updateTechHUD(); + powerUps.tech.choiceLog = [] powerUps.totalPowerUps = 0; powerUps.research.count = 0; m.setFillColors(); @@ -785,7 +786,7 @@ const simulation = { // } // }, checks() { - if (!(m.cycle % 60)) { //once a second + if (!(simulation.cycle % 60) && !m.isBodiesAsleep) { //once a second //energy overfill if (m.energy > m.maxEnergy) m.energy = m.maxEnergy + (m.energy - m.maxEnergy) * tech.overfillDrain //every second energy above max energy loses 25% if (tech.isFlipFlopEnergy) { @@ -839,7 +840,7 @@ const simulation = { // } // } - if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob + if (m.lastKillCycle + 300 > simulation.cycle) { //effects active for 5 seconds after killing a mob if (tech.isEnergyRecovery) m.energy += m.maxEnergy * 0.05 if (tech.isHealthRecovery) m.addHealth(0.01 * m.maxHealth) } diff --git a/js/tech.js b/js/tech.js index cdfa004..ba3b1f1 100644 --- a/js/tech.js +++ b/js/tech.js @@ -126,7 +126,7 @@ if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ... if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 - if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.66 + if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.75 if (tech.isTechDamage) dmg *= 2 if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 @@ -450,6 +450,27 @@ } } }, + { + name: "automatic", + description: "always fire when at rest
ammo power ups give 250% ammo", + maxCount: 1, + count: 0, + frequency: 4, + allowed() { + return tech.isFireNotMove && !tech.isFireMoveLock + }, + requires: "inertial frame, not Higgs mechanism", + effect: () => { + tech.isAlwaysFire = true; + b.setFireMethod(); + }, + remove() { + if (tech.isAlwaysFire) { + tech.isAlwaysFire = false + b.setFireMethod(); + } + } + }, { name: "dead reckoning", description: "increase damage by 33% when at rest", @@ -475,9 +496,9 @@ count: 0, frequency: 2, allowed() { - return !tech.isEnergyHealth && !m.isShipMode + return !tech.isEnergyHealth && !m.isShipMode && !tech.isAlwaysFire }, - requires: "not mass energy, not ship mode", + requires: "not mass energy, not ship mode, not automatic", effect: () => { tech.isFireMoveLock = true; b.setFireMethod(); @@ -1167,7 +1188,8 @@ } } } - }, { + }, + { name: "dynamo-bot", description: "a bot damages mobs while it traces your path
regen 6 energy per second when it's near", maxCount: 9, @@ -1186,7 +1208,8 @@ remove() { tech.dynamoBotCount -= this.count; } - }, { + }, + { name: "dynamo-bot upgrade", description: "convert your bots to dynamo-bots
dynamo-bots regen 24 energy per second", maxCount: 1, @@ -1210,7 +1233,8 @@ if (bullet[i].botType === 'dynamo') bullet[i].isUpgraded = false } } - }, { + }, + { name: "bot fabrication", description: "anytime you collect 4 research
use them to build a random bot", maxCount: 1, @@ -1229,7 +1253,8 @@ remove() { tech.isRerollBots = false; } - }, { + }, + { name: "robotics", description: "use 1 research to spawn a random bot
quadruple the frequency of finding bot tech", maxCount: 1, @@ -1256,7 +1281,8 @@ } } } - }, { + }, + { name: "perimeter defense", description: "reduce harm by 6%
for each of your permanent bots", maxCount: 1, @@ -1273,7 +1299,8 @@ remove() { tech.isBotArmor = false } - }, { + }, + { name: "network effect", description: "increase damage by 6%
for each of your permanent bots", maxCount: 1, @@ -1290,7 +1317,8 @@ remove() { tech.isBotDamage = false } - }, { + }, + { name: "ersatz bots", description: "double your permanent bots
remove all of your guns", maxCount: 1, @@ -1325,7 +1353,8 @@ tech.missileBotCount *= 2 }, remove() {} - }, { + }, + { name: "mass driver", description: "increase block collision damage by 100%
charge throws more quickly for less energy", maxCount: 1, @@ -1341,7 +1370,8 @@ remove() { tech.throwChargeRate = 1 } - }, { + }, + { name: "restitution", description: "mobs killed by collisions with blocks
spawn a heal, ammo, or research", maxCount: 1, @@ -1358,7 +1388,8 @@ remove() { tech.isBlockPowerUps = false } - }, { + }, + { name: "inelastic collision", description: "while you are holding a block
reduce harm by 85%", maxCount: 1, @@ -1375,7 +1406,8 @@ remove() { tech.isBlockHarm = false } - }, { + }, + { name: "Pauli exclusion", description: `after receiving harm from a collision become
immune to harm for an extra 0.75 seconds`, maxCount: 9, @@ -1392,7 +1424,8 @@ remove() { tech.collisionImmuneCycles = 30; } - }, { + }, + { name: "complex spin-statistics", description: `become immune to harm for 1 second
once every 7 seconds`, maxCount: 3, @@ -1536,7 +1569,8 @@ remove() { tech.isFlipFlopDamage = false; } - }, { + }, + { name: "transistor", description: "if ON regen 22 energy per second
if OFF drain 3.1 energy per second", maxCount: 1, @@ -1553,7 +1587,8 @@ remove() { tech.isFlipFlopEnergy = false; } - }, { + }, + { name: "shift registers", description: "set to the ON state
at the start of a level", maxCount: 1, @@ -1587,7 +1622,8 @@ remove() { tech.isSlowFPS = false; } - }, { + }, + { name: "liquid cooling", description: `freeze all mobs for 7 seconds
after receiving harm`, maxCount: 1, @@ -1604,7 +1640,8 @@ remove() { tech.isHarmFreeze = false; } - }, { + }, + { name: "osmoprotectant", description: `collisions with stunned or frozen mobs
cause you no harm`, maxCount: 1, @@ -1657,7 +1694,8 @@ remove() { tech.isDroneOnDamage = false; } - }, { + }, + { name: "non-Newtonian armor", description: "for 10 seconds after receiving harm
reduce harm by 66%", maxCount: 1, @@ -1673,7 +1711,8 @@ remove() { tech.isHarmArmor = false; } - }, { + }, + { name: "radiative equilibrium", description: "for 10 seconds after receiving harm
increase damage by 200%", maxCount: 1, @@ -1689,7 +1728,8 @@ remove() { tech.isHarmDamage = false; } - }, { + }, + { name: "CPT reversal", description: "charge, parity, and time invert to undo harm
rewind (1.5—5) seconds for (66—220) energy", maxCount: 1, @@ -1705,7 +1745,8 @@ remove() { tech.isRewindAvoidDeath = false; } - }, { + }, + { name: "causality bots", description: "when you rewind, build several bots
that protect you for about 9 seconds", maxCount: 3, @@ -1722,7 +1763,8 @@ remove() { tech.isRewindBot = 0; } - }, { + }, + { name: "causality bombs", description: "before you rewind drop several grenades", maxCount: 1, @@ -1738,7 +1780,8 @@ remove() { tech.isRewindGrenade = false; } - }, { + }, + { name: "piezoelectricity", description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15% maxCount: 1, @@ -1755,7 +1798,8 @@ remove() { tech.isPiezo = false; } - }, { + }, + { name: "ground state", description: "reduce harm by 66%
you no longer passively regenerate energy", maxCount: 1, @@ -1773,7 +1817,8 @@ tech.energyRegen = 0.001; m.fieldRegen = tech.energyRegen; } - }, { + }, + { name: "mass-energy equivalence", description: "energy protects you instead of health
harm reduction effects provide no benefit", maxCount: 1, @@ -1802,7 +1847,8 @@ simulation.mobDmgColor = "rgba(255,0,0,0.7)" m.displayHealth(); } - }, { + }, + { name: "1st ionization energy", description: "each heal power up you collect
increases your maximum energy by 5", maxCount: 1, @@ -1827,7 +1873,8 @@ if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color } } - }, { + }, + { name: "electrolytes", description: "increase damage by 1%
for every 9 stored energy", maxCount: 1, @@ -1843,7 +1890,8 @@ remove() { tech.isEnergyDamage = false; } - }, { + }, + { name: "exciton-lattice", description: `increase damage by 50%, but
ammo will no longer spawn`, maxCount: 1, @@ -1859,7 +1907,8 @@ remove() { tech.isEnergyNoAmmo = false; } - }, { + }, + { name: "exothermic process", description: "increase damage by 50%
if a mob dies drain energy by 25%", maxCount: 1, @@ -1875,7 +1924,8 @@ remove() { tech.isEnergyLoss = false; } - }, { + }, + { name: "heat engine", description: `increase damage by 40%, but
reduce maximum energy by 50`, maxCount: 1, @@ -1894,7 +1944,8 @@ tech.isMaxEnergyTech = false; m.setMaxEnergy() } - }, { + }, + { name: "Gibbs free energy", description: `increase damage by 5%
for every 10 energy below 100`, maxCount: 1, @@ -1911,7 +1962,8 @@ remove() { tech.isLowEnergyDamage = false; } - }, { + }, + { name: "overcharge", description: "increase your maximum energy by 50", maxCount: 9, @@ -1931,7 +1983,8 @@ tech.bonusEnergy = 0; m.setMaxEnergy() } - }, { + }, + { name: "supercapacitor", description: "energy above your max decays 60% slower", maxCount: 1, @@ -1947,7 +2000,8 @@ remove() { tech.overfillDrain = 0.75 } - }, { + }, + { name: "energy conservation", description: "6% of damage done recovered as energy", maxCount: 9, @@ -1963,7 +2017,8 @@ remove() { tech.energySiphon = 0; } - }, { + }, + { name: "waste energy recovery", description: "if a mob has died in the last 5 seconds
regen 5% of max energy every second", maxCount: 1, @@ -1980,7 +2035,8 @@ remove() { tech.isEnergyRecovery = false; } - }, { + }, + { name: "scrap recycling", description: "if a mob has died in the last 5 seconds
regain 1% of max health every second", maxCount: 1, @@ -1998,9 +2054,10 @@ remove() { tech.isHealthRecovery = false; } - }, { + }, + { name: "dormancy", - description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 33%", + description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 25%", maxCount: 1, count: 0, frequency: 2, @@ -2014,9 +2071,10 @@ remove() { tech.isDamageAfterKill = false; } - }, { + }, + { name: "torpor", - description: "if a mob has died in the last 5 seconds
reduce harm by 75% else increase it by 25%", + description: "if a mob has died in the last 5 seconds
reduce harm by 50% else increase it by 10%", maxCount: 1, count: 0, frequency: 4, @@ -2031,7 +2089,8 @@ remove() { tech.isHarmReduceAfterKill = false; } - }, { + }, + { name: "negative feedback", description: "increase damage by 6%
for every 10 health below 100", maxCount: 1, @@ -2047,7 +2106,8 @@ remove() { tech.isLowHealthDmg = false; } - }, { + }, + { name: "antiscience", description: "increase damage by 100%
lose 11 health when you pick up a tech", maxCount: 1, @@ -2063,7 +2123,8 @@ remove() { tech.isTechDamage = false; } - }, { + }, + { name: "entropy exchange", description: "heal for 3% of damage done
take 8% more harm", maxCount: 9, @@ -2080,7 +2141,8 @@ remove() { tech.healthDrain = 0; } - }, { + }, + { name: "fluoroantimonic acid", description: "increase damage by 40%
when your health is above 100", maxCount: 1, @@ -2096,7 +2158,8 @@ remove() { tech.isAcidDmg = false; } - }, { + }, + { name: "supersaturation", description: "increase your maximum health by 50", maxCount: 9, @@ -2117,7 +2180,8 @@ m.setMaxHealth(); } - }, { + }, + { name: "inductive coupling", description: "for each unused power up at the end of a level
add 3 max health (up to 51 health per level)", maxCount: 1, @@ -2136,7 +2200,8 @@ // tech.armorFromPowerUps = 0; //this is now reset in tech.setupAllTech(); m.setMaxHealth(); } - }, { + }, + { name: "transceiver chip", description: "unused power ups at the end of each level
are still activated (selections are random)", maxCount: 1, @@ -2152,7 +2217,8 @@ remove() { tech.isEndLevelPowerUp = false; } - }, { + }, + { name: "negentropy", description: `at the start of each level
spawn a heal for every 50 missing health`, maxCount: 1, @@ -2169,7 +2235,8 @@ remove() { tech.isHealLowHealth = false; } - }, { + }, + { name: "adiabatic healing", description: "heal power ups are 100% more effective", maxCount: 3, @@ -2253,7 +2320,8 @@ remove() { tech.isDeathAvoid = false; } - }, { + }, + { name: "strong anthropic principle", description: "after anthropic principle prevents your death
increase damage by 137.03599% on that level", maxCount: 1, @@ -2270,7 +2338,8 @@ remove() { tech.isAnthropicDamage = false } - }, { + }, + { name: "quantum immortality", description: "after dying, continue in an alternate reality
reduce harm by 23%", //spawn 4 research maxCount: 1, @@ -2287,7 +2356,8 @@ remove() { tech.isImmortal = false; } - }, { + }, + { name: "many-worlds", description: "each new level is an alternate reality
find 2 tech power ups in that reality", maxCount: 1, @@ -2304,7 +2374,8 @@ remove() { tech.isSwitchReality = false; } - }, { + }, + { name: "Ψ(t) collapse", description: "enter an alternate reality after you research
spawn 11 research", maxCount: 1, @@ -2322,7 +2393,8 @@ remove() { tech.isResearchReality = false; } - }, { + }, + { name: "decoherence", description: "researched or canceled tech won't reoccur
spawn 5 research", maxCount: 1, @@ -2340,7 +2412,8 @@ tech.isBanish = false powerUps.tech.banishLog = [] //reset banish log } - }, { + }, + { name: "renormalization", description: "using a research for any purpose
has a 37% chance to spawn a research", maxCount: 1, @@ -2356,7 +2429,8 @@ remove() { tech.renormalization = false; } - }, { + }, + { name: "perturbation theory", description: "66% decreased delay after firing
when you have no research in your inventory", maxCount: 1, @@ -2376,7 +2450,8 @@ tech.researchHaste = 1; b.setFireCD(); } - }, { + }, + { name: "ansatz", description: "after choosing a field, tech, or gun
if you have no research spawn 2", maxCount: 1, @@ -2392,7 +2467,8 @@ remove() { tech.isAnsatz = false; } - }, { + }, + { name: "Bayesian statistics", description: "increase damage by 3.9%
for each research in your inventory", maxCount: 1, @@ -2408,7 +2484,8 @@ remove() { tech.isRerollDamage = false; } - }, { + }, + { name: "Born rule", description: "remove all current tech
spawn new tech to replace them", maxCount: 1, @@ -2557,7 +2634,8 @@ // tech.cancelCount = 0 if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal } - }, { + }, + { name: "commodities exchange", description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research", maxCount: 1, @@ -2573,7 +2651,8 @@ remove() { tech.isCancelRerolls = false } - }, { + }, + { name: "correlated damage", description: "your chance to duplicate power ups
increases your damage by the same percent", maxCount: 1, @@ -2589,7 +2668,8 @@ remove() { tech.isDupDamage = false; } - }, { + }, + { name: "parthenogenesis", description: "each level has a chance to spawn a level boss
equal to double your duplication chance", maxCount: 1, @@ -2605,7 +2685,8 @@ remove() { tech.isDuplicateBoss = false; } - }, { + }, + { name: "apomixis", description: "after reaching 100% duplication chance
immediately spawn 4 level bosses", maxCount: 1, @@ -2622,7 +2703,8 @@ remove() { tech.is100Duplicate = false; } - }, { + }, + { name: "exchange symmetry", description: "convert 1 a random tech into 3 new guns
recursive tech lose all stacks", maxCount: 1, @@ -2653,7 +2735,8 @@ simulation.updateTechHUD(); }, remove() {} - }, { + }, + { name: "monte carlo experiment", description: "spawn 2 tech
remove 1 random tech", maxCount: 1, @@ -2671,7 +2754,8 @@ for (let i = 0; i < removeTotal + 1; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); }, remove() {} - }, { + }, + { name: "strange attractor", description: `use 2 research to spawn 1 tech
with double your duplication chance`, maxCount: 1, @@ -2694,7 +2778,8 @@ tech.duplicateChance = chanceStore }, remove() {} - }, { + }, + { name: "mine synthesis", description: "drop a mine after picking up a power up", maxCount: 1, @@ -2712,7 +2797,8 @@ remove() { tech.isMineDrop = false; } - }, { + }, + { name: "unified field theory", description: `in the pause menu, change your field
by clicking on your field's box`, maxCount: 1, @@ -2822,7 +2908,8 @@ remove() { tech.isExtraChoice = false; } - }, { + }, + { name: "determinism", description: "spawn 6 tech, but you have no cancel
and 1 choice for tech, fields, and guns", maxCount: 1, @@ -2843,7 +2930,8 @@ tech.isDeterminism = false; for (let i = 0; i < 6; i++) powerUps.removeRandomTech() } - }, { + }, + { name: "superdeterminism", description: "spawn 5 tech
research, guns, and fields no longer spawn", maxCount: 1, @@ -2889,7 +2977,8 @@ level.difficultyIncrease(simulation.difficultyMode) } } - }, { + }, + { name: "ergodicity", description: "reduce combat difficulty by 2 levels
all healing has no effect", maxCount: 1, @@ -2966,7 +3055,8 @@ tech.isRewindGun = false } } - }, { + }, + { name: "needle gun", description: "nail gun fires 3 mob piercing needles
requires 3 times more ammo", isGunTech: true, @@ -3003,7 +3093,8 @@ } } } - }, { + }, + { name: "ceramic needles", description: `your needles pierce shields
directly damaging shielded mobs`, isGunTech: true, @@ -3020,7 +3111,8 @@ remove() { tech.isNeedleShieldPierce = false } - }, { + }, + { name: "rivet gun", description: "nail gun slowly fires a heavy rivet", isGunTech: true, @@ -3051,7 +3143,8 @@ } } } - }, { + }, + { name: "rivet diameter", description: `your rivets are 20% larger
increases mass and physical damage`, isGunTech: true, @@ -3068,7 +3161,8 @@ remove() { tech.rivetSize = 1; } - }, { + }, + { name: "ice crystal nucleation", description: "the nail gun uses energy to condense
unlimited freezing ice shards", isGunTech: true, @@ -3104,7 +3198,8 @@ } } } - }, { + }, + { name: "pneumatic actuator", description: "nail gun takes 45% less time to ramp up
to it's shortest delay after firing", isGunTech: true, @@ -3129,7 +3224,8 @@ } } } - }, { + }, + { name: "powder-actuated", description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed", isGunTech: true, @@ -3154,7 +3250,8 @@ } } } - }, { + }, + { name: "supercritical fission", description: "nails, needles, and rivets can explode
if they strike mobs near their center", isGunTech: true, @@ -3171,7 +3268,8 @@ remove() { tech.isNailCrit = false } - }, { + }, + { name: "irradiated nails", description: "nails and rivets are radioactive
about 90% more damage over 2 seconds", isGunTech: true, @@ -3188,7 +3286,8 @@ remove() { tech.isNailRadiation = false; } - }, { + }, + { name: "4s half-life", description: "nails are made of plutonium-238
increase damage by 100% over 6 seconds", isGunTech: true, @@ -3205,7 +3304,8 @@ remove() { tech.isSlowRadiation = false; } - }, { + }, + { name: "1/2s half-life", description: "nails are made of lithium-8
damage occurs after 1/2 a second", isGunTech: true, @@ -3222,7 +3322,8 @@ remove() { tech.isFastRadiation = false; } - }, { + }, + { name: "shotgun spin-statistics", description: "immune to harm while firing the shotgun
ammo costs are doubled", isGunTech: true, @@ -3261,7 +3362,8 @@ } } } - }, { + }, + { name: "nailshot", description: "the shotgun fires a burst of nails", isGunTech: true, @@ -3278,7 +3380,8 @@ remove() { tech.isNailShot = false; } - }, { + }, + { name: "shotgun slug", description: "the shotgun fires 1 large bullet", isGunTech: true, @@ -3295,7 +3398,8 @@ remove() { tech.isSlugShot = false; } - }, { + }, + { name: "Newton's 3rd law", description: "shotgun recoil is greatly increased
and has a 66% decreased delay after firing", isGunTech: true, @@ -3312,7 +3416,8 @@ remove() { tech.isShotgunRecoil = false; } - }, { + }, + { name: "super duper", description: "fire 1 additional super ball", isGunTech: true, @@ -3329,7 +3434,8 @@ remove() { tech.superBallNumber = 4; } - }, { + }, + { name: "super ball", description: "fire just 1 large super ball
that stuns mobs for 3 second", isGunTech: true, @@ -3346,7 +3452,8 @@ remove() { tech.oneSuperBall = false; } - }, { + }, + { name: "super sized", description: `your super balls are 20% larger
increases mass and physical damage`, isGunTech: true, @@ -3363,7 +3470,8 @@ remove() { tech.bulletSize = 1; } - }, { + }, + { name: "wave packet", description: "wave beam emits two oscillating particles
decrease wave damage by 20%", isGunTech: true, @@ -3380,7 +3488,8 @@ remove() { tech.waveHelix = 1 } - }, { + }, + { name: "phase velocity", description: "the wave beam propagates faster in solids", isGunTech: true, @@ -3399,7 +3508,8 @@ tech.waveSpeedMap = 0.08 tech.waveSpeedBody = 0.25 } - }, { + }, + { name: "bound state", description: "wave beam bullets last 5x longer
bullets are bound to a region around player", isGunTech: true, @@ -3416,7 +3526,8 @@ remove() { tech.isWaveReflect = false } - }, { + }, + { name: "cruise missile", description: "missiles travel 50% slower,
but have a 50% larger explosive payload", isGunTech: true, @@ -3433,7 +3544,8 @@ remove() { tech.missileSize = false } - }, { + }, + { name: "MIRV", description: "launch +1 missile at a time
decrease size and fire rate by 10%", isGunTech: true, @@ -3450,7 +3562,8 @@ remove() { tech.missileCount = 1; } - }, { + }, + { name: "missile-bot", description: "a bot fires missiles at far away mobs", isGunTech: true, @@ -3470,7 +3583,8 @@ remove() { tech.missileBotCount = 0; } - }, { + }, + { name: "rocket-propelled grenade", description: "grenades rapidly accelerate forward
map collisions trigger an explosion", isGunTech: true, @@ -3489,7 +3603,8 @@ tech.isRPG = false; b.setGrenadeMode() } - }, { + }, + { name: "vacuum bomb", description: "grenades fire slower, explode bigger
and, suck everything towards them", isGunTech: true, @@ -3508,7 +3623,8 @@ tech.isVacuumBomb = false; b.setGrenadeMode() } - }, { + }, + { name: "neutron bomb", description: "grenades are irradiated with Cf-252
does damage, harm, and drains energy", isGunTech: true, @@ -3527,7 +3643,8 @@ tech.isNeutronBomb = false; b.setGrenadeMode() } - }, { + }, + { name: "water shielding", description: "increase neutron bomb's range by 20%
player is immune to its harmful effects", isGunTech: true, @@ -3544,7 +3661,8 @@ remove() { tech.isNeutronImmune = false } - }, { + }, + { name: "vacuum permittivity", description: "increase neutron bomb's range by 20%
objects in range of the bomb are slowed", isGunTech: true, @@ -3561,7 +3679,8 @@ remove() { tech.isNeutronSlow = false } - }, { + }, + { name: "laser-mines", description: "mines hover in place until mobs get in range
mines use energy to emit 3 unaimed lasers", isGunTech: true, @@ -3578,7 +3697,8 @@ remove() { tech.isLaserMine = false; } - }, { + }, + { name: "mine reclamation", description: "retrieve ammo from all undetonated mines
and 20% of mines after detonation", isGunTech: true, @@ -3595,7 +3715,8 @@ remove() { tech.isMineAmmoBack = false; } - }, { + }, + { name: "sentry", description: "mines target mobs with nails over time
mines last about 12 seconds", isGunTech: true, @@ -3612,7 +3733,8 @@ remove() { tech.isMineSentry = false; } - }, { + }, + { name: "mycelial fragmentation", description: "sporangium release an extra spore
once a second during their growth phase", isGunTech: true, @@ -3629,7 +3751,8 @@ remove() { tech.isSporeGrowth = false } - }, { + }, + { name: "tinsellated flagella", description: "sporangium release 2 more spores
spores accelerate 50% faster", isGunTech: true, @@ -3646,7 +3769,8 @@ remove() { tech.isFastSpores = false } - }, { + }, + { name: "cryodesiccation", description: "sporangium release 2 more spores
spores freeze mobs for 1.5 second", //
spores do 1/3 damage @@ -3664,7 +3788,8 @@ remove() { tech.isSporeFreeze = false } - }, { + }, + { name: "diplochory", description: "spores use the player for dispersal
until they locate a viable host", isGunTech: true, @@ -3681,7 +3806,8 @@ remove() { tech.isSporeFollow = false } - }, { + }, + { name: "mutualism", description: "increase spore damage by 150%
spores borrow 0.5 health until they die", isGunTech: true, @@ -3698,7 +3824,8 @@ remove() { tech.isMutualism = false } - }, { + }, + { name: "brushless motor", description: "drones accelerate 50% faster", isGunTech: true, @@ -3715,7 +3842,8 @@ remove() { tech.isFastDrones = false } - }, { + }, + { name: "delivery drone", description: "if a drone picks up a power up,
it becomes larger, faster, and more durable", isGunTech: true, @@ -3732,9 +3860,10 @@ remove() { tech.isDroneGrab = false } - }, { + }, + { name: "reduced tolerances", - description: "reduce all drone production costs by 66%
reduce the average drone lifetime by 40%", + description: "reduce drone energy/ammo costs by 66%
reduce the average drone lifetime by 40%", isGunTech: true, maxCount: 3, count: 0, @@ -3757,7 +3886,26 @@ if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack } } - }, { + }, + { + name: "drone repair", + description: "broken drones repair if the drone gun is active
repairing has a 33% chance to use an ammo", + isGunTech: true, + maxCount: 1, + count: 0, + frequency: 2, + allowed() { + return tech.haveGunCheck("drones") + }, + requires: "drone gun", + effect() { + tech.isDroneRespawn = true + }, + remove() { + tech.isDroneRespawn = false + } + }, + { name: "necrophoresis", description: "foam bubbles grow and split into 3 copies
when the mob they are stuck to dies", isGunTech: true, @@ -3774,7 +3922,8 @@ remove() { tech.isFoamGrowOnDeath = false; } - }, { + }, + { name: "colloidal foam", description: "foam bubbles dissipate 40% faster
increase foam damage per second by 300%", isGunTech: true, @@ -3809,7 +3958,8 @@ remove() { tech.isFoamAttract = false } - }, { + }, + { name: "quantum foam", description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 127%", isGunTech: true, @@ -3826,7 +3976,8 @@ remove() { tech.foamFutureFire = 0; } - }, { + }, + { name: "foam fractionation", description: "foam gun bubbles are 100% larger
when you have below 300 ammo", isGunTech: true, @@ -3898,7 +4049,8 @@ remove() { tech.isRailEnergyGain = false; } - }, { + }, + { name: "dielectric polarization", description: "firing the rail gun damages nearby mobs", isGunTech: true, @@ -3915,7 +4067,8 @@ remove() { tech.isRailAreaDamage = false; } - }, { + }, + { name: "capacitor bank", description: "the rail gun no longer takes time to charge
rail gun rods are 66% less massive", isGunTech: true, @@ -3932,7 +4085,8 @@ remove() { tech.isCapacitor = false; } - }, { + }, + { name: "laser diodes", description: "all lasers drain 30% less energy
effects laser-gun, laser-bot, and laser-mines", isGunTech: true, @@ -3949,7 +4103,8 @@ remove() { tech.isLaserDiode = 1; } - }, { + }, + { name: "relativistic momentum", description: "all lasers push mobs away
effects laser-gun, laser-bot, and laser-mines", isGunTech: true, @@ -3989,7 +4144,8 @@ tech.laserDamage = 0.16; tech.laserFieldDrain = 0.0018; } - }, { + }, + { name: "diffraction grating", description: `your laser gains 2 diverging beams
decrease individual beam damage by 10%`, isGunTech: true, @@ -4014,7 +4170,8 @@ } } } - }, { + }, + { name: "diffuse beam", description: "laser beam is wider and doesn't reflect
increase full beam damage by 200%", isGunTech: true, @@ -4041,7 +4198,8 @@ } } } - }, { + }, + { name: "output coupler", description: "widen diffuse laser beam by 40%
increase full beam damage by 40%", isGunTech: true, @@ -4068,7 +4226,8 @@ if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() } } - }, { + }, + { name: "slow light propagation", description: "laser beam is spread into your recent past
increase total beam damage by 300%", isGunTech: true, @@ -4095,7 +4254,8 @@ } } } - }, { + }, + { name: "pulse", description: "use 25% of your energy in a pulsed laser
that instantly initiates a fusion explosion", isGunTech: true, @@ -4120,7 +4280,8 @@ } } } - }, { + }, + { name: "shock wave", description: "mobs caught in pulse's explosion are stunned
for up to 2 seconds", isGunTech: true, @@ -4137,7 +4298,8 @@ remove() { tech.isPulseStun = false; } - }, { + }, + { name: "neocognitron", description: "pulse automatically aims at a nearby mob
50% decreased delay after firing", isGunTech: true, @@ -4176,7 +4338,8 @@ remove() { tech.blockDmg = 0; } - }, { + }, + { name: "frequency resonance", description: "standing wave harmonics shield is retuned
increase size and blocking efficiency by 50%", isFieldTech: true, @@ -4188,14 +4351,17 @@ }, requires: "standing wave harmonics", effect() { - m.fieldRange += 175 * 0.25 - m.fieldShieldingScale *= 0.5 + tech.frequencyResonance = this.count + 1 // +1 because count updates later + m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance + m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance) }, remove() { m.fieldRange = 175; m.fieldShieldingScale = 1; + tech.frequencyResonance = 0 } - }, { + }, + { name: "flux pinning", description: "blocking with your field
stuns mobs for +2 second", isFieldTech: true, @@ -4212,7 +4378,8 @@ remove() { tech.isStunField = 0; } - }, { + }, + { name: "fracture analysis", description: "bullet impacts do 400% damage
to stunned mobs", isFieldTech: true, @@ -4229,7 +4396,8 @@ remove() { tech.isCrit = false; } - }, { + }, + { name: "eddy current brake", description: "your stored energy projects a field that
limits the top speed of mobs", isFieldTech: true, @@ -4246,7 +4414,8 @@ remove() { tech.isPerfectBrake = false; } - }, { + }, + { name: "pair production", description: "picking up a power up gives you 250 energy", isFieldTech: true, @@ -4264,7 +4433,8 @@ remove() { tech.isMassEnergy = false; } - }, { + }, + { name: "bot manufacturing", description: "use nano-scale manufacturing
to build 3 random bots", isFieldTech: true, @@ -4286,7 +4456,8 @@ b.randomBot() }, remove() {} - }, { + }, + { name: "bot prototypes", description: "use nano-scale manufacturing to upgrade
all bots to a random type and build 2 bots", isFieldTech: true, @@ -4373,7 +4544,8 @@ notUpgradedBots[Math.floor(Math.random() * notUpgradedBots.length)]() }, remove() {} - }, { + }, + { name: "mycelium manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to grow spores", isFieldTech: true, @@ -4390,7 +4562,8 @@ remove() { tech.isSporeField = false; } - }, { + }, + { name: "missile manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to construct missiles", isFieldTech: true, @@ -4407,7 +4580,8 @@ remove() { tech.isMissileField = false; } - }, { + }, + { name: "ice IX manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to condense ice IX", isFieldTech: true, @@ -4424,7 +4598,8 @@ remove() { tech.isIceField = false; } - }, { + }, + { name: "thermoelectric effect", description: "killing mobs with ice IX gives 4 health
and 80 energy", isFieldTech: true, @@ -4441,7 +4616,8 @@ remove() { tech.iceEnergy = 0; } - }, { + }, + { name: "degenerate matter", description: "reduce harm by 50%
while negative mass field is active", isFieldTech: true, @@ -4458,7 +4634,8 @@ remove() { tech.isHarmReduce = false; } - }, { + }, + { name: "annihilation", description: "touching normal mobs annihilates them
drains 33% of maximum energy", isFieldTech: true, @@ -4475,7 +4652,8 @@ remove() { tech.isAnnihilation = false; } - }, { + }, + { name: "Bose Einstein condensate", description: "mobs inside your field are frozen
pilot wave, negative mass, time dilation", isFieldTech: true, @@ -4567,7 +4745,8 @@ remove() { tech.isExtruder = false; } - }, { + }, + { name: "timelike world line", description: "time dilation doubles your relative time rate
and makes you immune to harm", isFieldTech: true, @@ -4586,7 +4765,8 @@ tech.isTimeSkip = false; b.setFireCD(); } - }, { + }, + { name: "Lorentz transformation", description: "permanently increase your relative time rate
move, jump, and shoot 40% faster", isFieldTech: true, @@ -4609,7 +4789,8 @@ m.setMovement(); b.setFireCD(); } - }, { + }, + { name: "time crystals", description: "quadruple your default energy regeneration", isFieldTech: true, @@ -4628,7 +4809,8 @@ tech.energyRegen = 0.001; m.fieldRegen = tech.energyRegen; } - }, { + }, + { name: "boson composite", description: "intangible to blocks and mobs while cloaked
passing through mobs drains your energy", isFieldTech: true, @@ -4645,7 +4827,8 @@ remove() { tech.isIntangible = false; } - }, { + }, + { name: "dazzler", description: "decloaking stuns nearby mobs
drains 30% of your stored energy", isFieldTech: true, @@ -4662,7 +4845,8 @@ remove() { tech.isCloakStun = false; } - }, { + }, + { name: "discrete optimization", description: "increase damage by 66%
50% increased delay after firing", isFieldTech: true, @@ -4681,7 +4865,8 @@ tech.aimDamage = 1 b.setFireCD(); } - }, { + }, + { name: "cosmic string", description: "stun and do radioactive damage to mobs
if you tunnel through them with a wormhole", isFieldTech: true, @@ -4698,7 +4883,8 @@ remove() { tech.isWormholeDamage = false } - }, { + }, + { name: "Penrose process", description: "after a block falls into a wormhole
you gain 63 energy", isFieldTech: true, @@ -4715,7 +4901,8 @@ remove() { tech.isWormholeEnergy = false } - }, { + }, + { name: "transdimensional spores", description: "when blocks fall into a wormhole
higher dimension spores are summoned", isFieldTech: true, @@ -4732,7 +4919,8 @@ remove() { tech.isWormSpores = false } - }, { + }, + { name: "traversable geodesics", description: "your bullets can traverse wormholes
spawn a gun and ammo", isFieldTech: true, @@ -4773,7 +4961,8 @@ m.shipMode() }, remove() {} - }, { + }, + { name: "quantum leap", description: "experiment: every 20 seconds
become an alternate version of yourself", maxCount: 1, @@ -4793,7 +4982,8 @@ }, 20000); //every 20 sections }, remove() {} - }, { + }, + { name: "shields", description: "experiment: every 5 seconds
all mobs gain a shield", maxCount: 1, @@ -4967,7 +5157,8 @@ for (let i = 0, len = tech.tech.length; i < len; i++) tech.tech[i].name = tech.tech[i].name.shuffle() }, remove() {} - }, { + }, + { name: "transparency", description: "become invisible to yourself
mobs can still see you", maxCount: 1, @@ -4984,7 +5175,8 @@ m.draw = () => {} }, remove() {} - }, { + }, + { name: "quantum leap", description: "become an alternate version of yourself
every 20 seconds", maxCount: 1, @@ -5004,7 +5196,8 @@ }, 20000); //every 30 sections }, remove() {} - }, { + }, + { name: "pop-ups", description: "sign up to learn endless easy ways to win n-gon
that Landgreen doesn't want you to know!!!1!!", maxCount: 1, @@ -5023,7 +5216,8 @@ }, 30000); //every 30 sections }, remove() {} - }, { + }, + { name: "music", description: "add music to n-gon", maxCount: 1, @@ -5040,7 +5234,8 @@ window.open('https://www.youtube.com/results?search_query=music', '_blank') }, remove() {} - }, { + }, + { name: "performance", description: "display performance stats to n-gon", maxCount: 1, @@ -5072,7 +5267,8 @@ document.getElementById("health-bg").style.left = "86px" }, remove() {} - }, { + }, + { name: "repartitioning", description: "set the frequency of finding normal tech to 0
spawn 5 tech", maxCount: 1, @@ -5096,7 +5292,8 @@ for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech"); }, remove() {} - }, { + }, + { name: "defragment", description: "set the frequency of finding JUNK tech to zero", maxCount: 1, @@ -5115,7 +5312,8 @@ } }, remove() {} - }, { + }, + { name: "ship", description: "fly around with no legs
reduce combat difficulty by 1 level", maxCount: 1, @@ -5172,7 +5370,8 @@ setInterval(() => { if (!simulation.paused) ctx.rotate(0.001 * Math.sin(simulation.cycle * 0.01)) }, 16); }, remove() {} - }, { + }, + { name: "umbra", description: "produce a blue glow around everything
and probably some simulation lag", maxCount: 1, @@ -5190,7 +5389,8 @@ ctx.shadowBlur = 25; }, remove() {} - }, { + }, + { name: "lighter", description: `ctx.globalCompositeOperation = "lighter"`, maxCount: 1, @@ -5207,7 +5407,8 @@ ctx.globalCompositeOperation = "lighter"; }, remove() {} - }, { + }, + { name: "rewind", description: "every 5 seconds rewind 2 seconds
lasts 120 seconds", maxCount: 9, @@ -5226,7 +5427,8 @@ } }, remove() {} - }, { + }, + { name: "energy to mass conversion", description: "convert your energy into blocks", maxCount: 9, @@ -5255,7 +5457,8 @@ }, remove() {} - }, { + }, + { name: "level.nextLevel()", description: "advance to the next level", maxCount: 9, @@ -5272,7 +5475,8 @@ level.nextLevel(); }, remove() {} - }, { + }, + { name: "expert system", description: "spawn a tech power up
add 64 JUNK tech to the potential pool", maxCount: 9, @@ -5290,7 +5494,8 @@ tech.addJunkTechToPool(64) }, remove() {} - }, { + }, + { name: "energy investment", description: "every 10 seconds drain your energy
return it doubled 10 seconds later
lasts 180 seconds", maxCount: 9, @@ -5315,7 +5520,8 @@ } }, remove() {} - }, { + }, + { name: "missile Launching System", description: "fire missiles for the next 60 seconds", maxCount: 9, @@ -5340,7 +5546,8 @@ } }, remove() {} - }, { + }, + { name: "grenade production", description: "drop grenades for the next 120 seconds", maxCount: 9, @@ -5439,7 +5646,8 @@ } }, remove() {} - }, { + }, + { name: "diegesis", description: "indicate gun fire delay
through a rotation of your head", maxCount: 1, @@ -5482,7 +5690,8 @@ } }, remove() {} - }, { + }, + { name: "pareidolia", description: "don't", maxCount: 1, @@ -5553,7 +5762,8 @@ } }, remove() {} - }, { + }, + { name: "prism", description: "you cycle through different colors", maxCount: 1, @@ -5578,7 +5788,8 @@ }, 10); }, remove() {} - }, { + }, + { name: "assimilation", description: "all your bots are converted to the same random model", maxCount: 1, @@ -5636,7 +5847,8 @@ for (let i = 0; i < total; i++) bots[index]() }, remove() {} - }, { + }, + { name: "growth hacking", description: "increase combat difficulty by 1 level", maxCount: 1, @@ -5653,7 +5865,8 @@ level.difficultyIncrease(simulation.difficultyMode) }, remove() {} - }, { + }, + { name: "stun", description: "stun all mobs for up to 8 seconds", maxCount: 9, @@ -5670,7 +5883,8 @@ for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 480) }, remove() {} - }, { + }, + { name: "re-arm", description: "eject all your guns", maxCount: 9, @@ -5697,7 +5911,8 @@ simulation.makeGunHUD(); //update gun HUD }, remove() {} - }, { + }, + { name: "re-research", description: "eject all your research", maxCount: 9, @@ -5715,7 +5930,8 @@ powerUps.research.count = 0 }, remove() {} - }, { + }, + { name: "quantum black hole", description: "use all your energy to spawn
inside the event horizon of a huge black hole", maxCount: 9, @@ -5733,7 +5949,8 @@ spawn.suckerBoss(m.pos.x, m.pos.y - 1000) }, remove() {} - }, { + }, + { name: "black hole cluster", description: "spawn 2 research
spawn 40 nearby black holes", maxCount: 9, @@ -6054,4 +6271,7 @@ droneCycleReduction: null, droneEnergyReduction: null, isNoHeals: null, + frequencyResonance: null, + isAlwaysFire: null, + isDroneRespawn: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index 26f9ced..c31fcd5 100644 --- a/todo.txt +++ b/todo.txt @@ -1,16 +1,9 @@ ******************************************************** NEXT PATCH ******************************************************** -added new graphics to several maps +tech: automatic - always fire, but get 2.5x ammo + requires inertial frame -to level developers: level.fillBG and level.fill no longer work, -you should draw backgrounds directly in level.custom like this: -level.custom = () => { - ctx.fillStyle = "rgba(0,255,255,0.1)"; - ctx.fillRect(6400, -550, 300, 350); - level.playerExitCheck(); - level.exit.draw(); - level.enter.draw(); -}; +tech: drone repair - while drones are your active gun, drones respawn with a 50% chance to consume ammo ******************************************************** BUGS ******************************************************** @@ -43,19 +36,14 @@ fix door.isOpen actually meaning isClosed? ******************************************************** TODO ******************************************************** +flipflop, but toggles after a kill + tech shotgun - crouching makes your spread very small remove spread reduction on nail shot doesn't apply to slug add water drops to sewers -move power ups in front of blocks, make blocks not transparent? - -consider adding canvas path shadows to levels in level.custom for non squared lighting - convert all level.BG into canvas draw in level.custom - draw exit and entrance in level - - new level: procedural generation several small rooms are linked by portals the portals have a randomized pattern