const tech={totalCount:null,setupAllTech(){for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].count=0,tech.tech[e].isLost=!1,tech.tech[e].remove(),tech.tech[e].isJunk?tech.tech[e].frequency=0:tech.tech[e].frequencyDefault?tech.tech[e].frequency=tech.tech[e].frequencyDefault:tech.tech[e].frequency=2;if(lore.techCount=0,simulation.isCheating||localSettings.runCount<1)for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isLore&&(tech.tech[e].frequency=0,tech.tech[e].count=0);tech.extraMaxHealth=0,tech.totalCount=0,simulation.updateTechHUD()},removeTech(e="random"){if("random"===e){const t=[];for(let e=0;e<tech.tech.length;e++)tech.tech[e].count>0&&!tech.tech[e].isNonRefundable&&t.push(e);if(!t.length)return 0;e=t[Math.floor(Math.random()*t.length)]}else if(isNaN(e)){let t=!1;for(let o=0;o<tech.tech.length;o++)if(e===tech.tech[o].name){e=o,t=!0;break}if(!t)return 0}if(0===tech.tech[e].count)return 0;const t=tech.tech[e].count;return simulation.makeTextLog(`<span class='color-var'>tech</span>.removeTech("<span class='color-text'>${tech.tech[e].name}</span>")`),tech.tech[e].remove(),tech.tech[e].count=0,simulation.updateTechHUD(),tech.tech[e].isLost=!0,simulation.updateTechHUD(),t},addJunkTechToPool(e){let t=0;for(let e=0,o=tech.tech.length;e<o;e++)tech.tech[e].count<tech.tech[e].maxCount&&tech.tech[e].allowed()&&!tech.tech[e].isJunk&&(t+=tech.tech[e].frequency);let o=[];for(let e=0;e<tech.tech.length;e++)tech.tech[e].count<tech.tech[e].maxCount&&tech.tech[e].isJunk&&o.push(e);if(o.length){const n=e*t;for(let e=0;e<n;e++)tech.tech[o[Math.floor(Math.random()*o.length)]].frequency++;return simulation.makeTextLog(`<span class='color-var'>tech</span>.tech.push(${n.toFixed(0)} <span class='color-text'>JUNK</span>)`),n}return 0},removeJunkTechFromPool(e=1){for(let t=0;t<e;t++)for(let e=0;e<tech.tech.length;e++)if(tech.tech[e].isJunk&&tech.tech[e].frequency>0&&tech.tech[e].count<tech.tech[e].maxCount){tech.tech[e].frequency--;break}},giveTech(e="random"){if("random"===e){let e=[];for(let t=0;t<tech.tech.length;t++)tech.tech[t].count<tech.tech[t].maxCount&&tech.tech[t].allowed()&&!tech.tech[t].isJunk&&!tech.tech[t].isLore&&!tech.tech[t].isBadRandomOption&&e.push(t);if(e.length>0){let t=e[Math.floor(Math.random()*e.length)];tech.giveTech(t),simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${tech.tech[t].name}</span>")<em> //random tech</em>`)}}else{if(isNaN(e)){let t=!1;for(let o=0;o<tech.tech.length;o++)if(e===tech.tech[o].name){e=o,t=!0;break}if(!t)return}if(tech.isMetaAnalysis&&tech.tech[e].isJunk){simulation.makeTextLog("//tech: meta-analysis replaced junk tech with random tech"),tech.giveTech("random");for(let e=0;e<3;e++)powerUps.spawn(m.pos.x+40*Math.random(),m.pos.y+40*Math.random(),"research");return}tech.tech[e].isLost&&(tech.tech[e].isLost=!1),tech.tech[e].effect(),tech.tech[e].count++,tech.totalCount++,simulation.updateTechHUD()}},setCheating(){if(!simulation.isCheating){simulation.isCheating=!0,level.levelAnnounce(),lore.techCount=0;for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isLore&&(tech.tech[e].frequency=0,tech.tech[e].count=0);console.log("cheating"),sound.tone(250),sound.tone(300),sound.tone(375)}},haveGunCheck(e,t=!0){if(build.isExperimentSelection||!t){for(i=0,len=b.inventory.length;i<len;i++)if(b.guns[b.inventory[i]].name===e)return!0;return!1}return b.inventory.length>0&&b.guns[b.activeGun].name===e},hasExplosiveDamageCheck:()=>tech.haveGunCheck("missiles")||tech.isMissileField||tech.missileBotCount>0||tech.boomBotCount>1||tech.isIncendiary||tech.isPulseLaser||tech.isTokamak||tech.haveGunCheck("grenades")&&!tech.isNeutronBomb,damageFromTech(){let e=1;return tech.isAxion&&tech.isHarmMACHO&&(e*=1+.75*(1-m.harmReduction())),tech.OccamDamage&&(e*=tech.OccamDamage),tech.isCloakingDamage&&(e*=1.35),tech.isFlipFlopDamage&&tech.isFlipFlopOn&&(e*=1.5),tech.isAnthropicDamage&&tech.isDeathAvoidedThisLevel&&(e*=2.3703599),m.isSneakAttack&&m.cycle>m.lastKillCycle+240&&(e*=tech.sneakAttackDmg),tech.isTechDamage&&(e*=1.9),tech.isDupDamage&&(e*=1+Math.min(1,tech.duplicationChance())),tech.isLowEnergyDamage&&(e*=1+.7*Math.max(0,1-m.energy)),tech.isMaxEnergyTech&&(e*=1.5),tech.isEnergyNoAmmo&&(e*=1.66),tech.isDamageForGuns&&(e*=1+.12*b.inventory.length),tech.isLowHealthDmg&&(e*=1+.5*Math.max(0,1-m.health)),tech.isHarmDamage&&m.lastHarmCycle+600>m.cycle&&(e*=3),tech.isEnergyLoss&&(e*=1.55),tech.isAcidDmg&&m.health>1&&(e*=1.35),tech.restDamage>1&&player.speed<1&&(e*=tech.restDamage),tech.isEnergyDamage&&(e*=1+.11*m.energy),tech.isDamageFromBulletCount&&(e*=1+.007*bullet.length),tech.isRerollDamage&&(e*=1+.037*powerUps.research.count),tech.isOneGun&&b.inventory.length<2&&(e*=1.25),tech.isNoFireDamage&&m.cycle>m.fireCDcycle+120&&(e*=2),tech.isSpeedDamage&&(e*=1+Math.min(.66,.0165*player.speed)),tech.isBotDamage&&(e*=1+.07*b.totalBots()),tech.isDamageAfterKillNoRegen&&m.lastKillCycle+300>m.cycle&&(e*=1.5),e*tech.slowFire*tech.aimDamage},duplicationChance:()=>Math.max(0,(tech.isPowerUpsVanish?.12:0)+(tech.isStimulatedEmission?.15:0)+.043*tech.cancelCount+tech.duplicateChance+m.duplicateChance+tech.wormDuplicate+tech.cloakDuplication+(tech.isAnthropicTech&&tech.isDeathAvoidedThisLevel?.5:0)),isScaleMobsWithDuplication:!1,maxDuplicationEvent(){if(tech.is111Duplicate&&tech.duplicationChance()>1.11){tech.is111Duplicate=!1;const e=1300;tech.isScaleMobsWithDuplication=!0;for(let t=0,o=9;t<o;t++){const n=2*Math.PI*t/o;spawn.randomLevelBoss(m.pos.x+e*Math.cos(n),m.pos.y+e*Math.sin(n),spawn.nonCollideBossList)}spawn.historyBoss(0,0),spawn.pulsarBoss(level.exit.x,level.exit.y,70,!0),spawn.blockBoss(level.enter.x,level.enter.y),tech.isScaleMobsWithDuplication=!1}},setTechFrequency(e,t){for(let o=0,n=tech.tech.length;o<n;o++)tech.tech[o].name===e&&(tech.tech[o].frequency=t)},setBotTechFrequency(e=0){for(let t=0,o=tech.tech.length;t<o;t++)if(tech.tech[t].isBotTech)switch(tech.tech[t].name){case"dynamo-bot":case"orbital-bot":case"laser-bot":case"boom-bot":case"foam-bot":case"nail-bot":tech.tech[t].frequency=e}},tech:[{name:"gun sciences",description:"</strong>triple</strong> the <strong class='flicker'>frequency</strong> of finding <strong class='color-g'>gun</strong><strong class='color-m'>tech</strong><br>spawn a <strong class='color-g'>gun</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>!tech.isSuperDeterminism,requires:"NOT EXPERIMENT MODE, not superdeterminism",effect(){powerUps.spawn(m.pos.x,m.pos.y,"gun");for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isGunTech&&(tech.tech[e].frequency*=3)},remove(){}},{name:"ad hoc",description:`spawn a ${powerUps.orb.heal()}, ${powerUps.orb.research(1)}, <strong class='color-f'>field</strong>, ${powerUps.orb.ammo(1)}, or <strong class='color-m'>tech</strong><br>for every <strong class='color-g'>gun</strong> in your inventory`,maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,allowed:()=>b.inventory.length>1,requires:"NOT EXPERIMENT MODE, at least 2 guns",effect(){for(let e=0;e<b.inventory.length;e++)Math.random()<.2?powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"tech"):Math.random()<.25?powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"field"):Math.random()<.33?powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"heal"):Math.random()<.5?powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"ammo"):powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"research")},remove(){}},{name:"applied science",description:"get a random <strong class='color-g'>gun</strong><strong class='color-m'>tech</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",maxCount:9,count:0,isNonRefundable:!0,frequency:2,frequencyDefault:2,allowed:()=>b.inventory.length>1,requires:"NOT EXPERIMENT MODE, at least 2 guns",effect(){for(let e=b.inventory.length-1;e>-1;e--){const t=[];for(let o=0,n=tech.tech.length;o<n;o++){const n=b.activeGun;if(b.activeGun=b.inventory[e],tech.tech[o].isGunTech&&tech.tech[o].allowed()&&!tech.tech[o].isJunk&&!tech.tech[o].isBadRandomOption&&tech.tech[o].count<tech.tech[o].maxCount){const n=tech.tech[o].requires.search(b.guns[b.inventory[e]].name),r=tech.tech[o].requires.search(" not ");-1!==n&&(-1===r||r>n)&&t.push(o)}b.activeGun=n}if(t.length){const e=Math.floor(Math.random()*t.length);tech.giveTech(t[e]),simulation.makeTextLog(`<span class='color-var'>tech</span>.giveTech("<span class='color-text'>${tech.tech[t[e]].name}</span>")`)}}simulation.boldActiveGunHUD()},remove(){}},{name:"integrated armament",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Weapon\' class="link">integrated armament</a>',description:"<span style = 'font-size:95%;'>increase <strong class='color-d'>damage</strong> by <strong>25%</strong>, but new <strong class='color-g'>guns</strong><br>replace your current <strong class='color-g'>gun</strong> and convert <strong class='color-g'>gun</strong><strong class='color-m'>tech</strong></span>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>1===b.inventory.length,requires:"only 1 gun",effect(){tech.isOneGun=!0},remove(){tech.isOneGun=!1}},{name:"entanglement",nameInfo:"<span id = 'tech-entanglement'></span>",addNameInfo(){setTimeout((function(){simulation.boldActiveGunHUD()}),1e3)},description:"while your <strong>first</strong> <strong class='color-g'>gun</strong> is equipped<br>reduce <strong class='color-harm'>harm</strong> by <strong>13%</strong> for each of your <strong class='color-g'>guns</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isEntanglement=!0,setTimeout((function(){simulation.boldActiveGunHUD()}),1e3)},remove(){tech.isEntanglement=!1}},{name:"generalist",description:"spawn <strong>8</strong> <strong class='color-g'>guns</strong>, but you can't <strong>switch</strong> <strong class='color-g'>guns</strong><br><strong class='color-g'>guns</strong> cycle automatically with each new level",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>b.inventory.length<b.guns.length-5,requires:"less than 7 guns",effect(){tech.isGunCycle=!0;for(let e=0;e<8;e++)powerUps.spawn(m.pos.x+10*Math.random(),m.pos.y+10*Math.random(),"gun")},remove(){if(tech.isGunCycle){for(let e=0;e<8;e++)b.inventory.length&&b.removeGun(b.guns[b.inventory[b.inventory.length-1]].name);tech.isGunCycle=!1}}},{name:"arsenal",description:"increase <strong class='color-d'>damage</strong> by <strong>12%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isDamageForGuns=!0},remove(){tech.isDamageForGuns=!1}},{name:"active cooling",description:"<strong>18%</strong> decreased <strong><em>delay</em></strong> after firing<br>for each <strong class='color-g'>gun</strong> in your inventory",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isFireRateForGuns=!0,b.setFireCD()},remove(){tech.isFireRateForGuns=!1,b.setFireCD()}},{name:"supply chain",junk:.05,descriptionFunction(){return`double your current <strong class='color-ammo'>ammo</strong> for all <strong class='color-g'>guns</strong><br><strong>+${100*this.junk}%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool`},maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){for(let e=0;e<b.guns.length;e++)b.guns[e].have&&(b.guns[e].ammo=Math.floor(2*b.guns[e].ammo));simulation.makeGunHUD(),this.refundAmount+=tech.addJunkTechToPool(this.junk)},refundAmount:0,remove(){for(let e=0;e<this.count;e++)for(let e=0;e<b.guns.length;e++)b.guns[e].have&&(b.guns[e].ammo=Math.floor(.5*b.guns[e].ammo));simulation.makeGunHUD(),this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"logistics",description:`${powerUps.orb.ammo()} give <strong>80%</strong> more <strong class='color-ammo'>ammo</strong>, but<br>it's only added to your current <strong class='color-g'>gun</strong>`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyNoAmmo,requires:"not exciton",effect(){tech.isAmmoForGun=!0},remove(){tech.isAmmoForGun=!1}},{name:"cache",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Cache_(computing)\' class="link">cache</a>',description:`${powerUps.orb.ammo()} give <strong>13x</strong> more <strong class='color-ammo'>ammo</strong>, but<br>you can't <strong>store</strong> any more <strong class='color-ammo'>ammo</strong> than that`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyNoAmmo,requires:"not exciton",effect(){tech.ammoCap=13,powerUps.ammo.effect()},remove(){tech.ammoCap=0}},{name:"catabolism",description:`firing while <strong>out</strong> of <strong class='color-ammo'>ammo</strong> spawns ${powerUps.orb.ammo(4)}<br>but it reduces your <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>1</strong>`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyNoAmmo&&!tech.isEnergyHealth,requires:"not exciton, mass-energy",effect:()=>{tech.isAmmoFromHealth=!0},remove(){tech.isAmmoFromHealth=!1}},{name:"exciton",description:`increase <strong class='color-d'>damage</strong> by <strong>66%</strong>, but<br>${powerUps.orb.ammo()} will no longer <strong>spawn</strong>`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isAmmoFromHealth,requires:"not catabolism",effect(){tech.isEnergyNoAmmo=!0},remove(){tech.isEnergyNoAmmo=!1}},{name:"desublimated ammunition",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Deposition_(phase_transition)\' class="link">desublimated ammunition</a>',description:"every other shot uses no <strong class='color-ammo'>ammo</strong> when <strong>crouching</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>build.isExperimentSelection,requires:"",effect(){tech.isCrouchAmmo=!0},remove(){tech.isCrouchAmmo=!1}},{name:"gun turret",description:"reduce <strong class='color-harm'>harm</strong> by <strong>66%</strong> when <strong>crouching</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isTurret=!0},remove(){tech.isTurret=!1}},{name:"dead reckoning",description:"increase <strong class='color-d'>damage</strong> by <strong>36%</strong> when at <strong>rest</strong>",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect:()=>{tech.restDamage+=.36},remove(){tech.restDamage=1}},{name:"Higgs mechanism",description:"while <strong>firing</strong> your <strong>position</strong> is locked<br><strong>50%</strong> decreased <strong><em>delay</em></strong> after firing",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!m.isShipMode&&!tech.isAlwaysFire,requires:"not ship mode, not automatic",effect:()=>{tech.isFireMoveLock=!0,b.setFireCD(),b.setFireMethod()},remove(){tech.isFireMoveLock&&(tech.isFireMoveLock=!1,b.setFireCD(),b.setFireMethod())}},{name:"squirrel-cage rotor",description:"<strong>move</strong> and <strong>jump</strong> <strong>30%</strong> faster<br>take <strong>5%</strong> more <strong class='color-harm'>harm</strong>",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.squirrelFx+=.25,tech.squirrelJump+=.1,m.setMovement()},remove(){tech.squirrelFx=1,tech.squirrelJump=1,m.setMovement()}},{name:"Newton's 1st law",description:"moving at high <strong>speeds</strong><br>reduces <strong class='color-harm'>harm</strong> by up to <strong>66%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy equivalence",effect(){tech.isSpeedHarm=!0},remove(){tech.isSpeedHarm=!1}},{name:"Newton's 2nd law",description:"moving at high <strong>speeds</strong><br>increases <strong class='color-d'>damage</strong> by up to <strong>66%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isSpeedDamage=!0},remove(){tech.isSpeedDamage=!1}},{name:"kinetic bombardment",description:"increase <strong class='color-d'>damage</strong> by up to <strong>33%</strong> at a <strong>distance</strong><br>of up to 50 player widths from the target",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isFarAwayDmg=!0},remove(){tech.isFarAwayDmg=!1}},{name:"regression",description:"bullet <strong>collisions</strong> increase <strong>vulnerability</strong> to<br><strong class='color-d'>damage</strong> by <strong>6%</strong> for mobs <em>(1% for bosses)</em>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isLessDamageReduction=!0},remove(){tech.isLessDamageReduction=!1}},{name:"microstates",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Microstate_(statistical_mechanics)\' class="link">microstates</a>',description:"increase <strong class='color-d'>damage</strong> by <strong>7%</strong><br>for every <strong>10</strong> active <strong>projectiles</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isDamageFromBulletCount=!0},remove(){tech.isDamageFromBulletCount=!1}},{name:"simulated annealing",description:"increase <strong class='color-d'>damage</strong> by <strong>20%</strong><br><strong>20%</strong> increased <strong><em>delay</em></strong> after firing",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,effect(){tech.slowFire=1.2,b.setFireCD()},remove(){tech.slowFire=1,b.setFireCD()}},{name:"heuristics",description:"<strong>30%</strong> decreased <strong><em>delay</em></strong> after firing",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.fireRate*=.7,b.setFireCD()},remove(){tech.fireRate=1,b.setFireCD()}},{name:"fracture analysis",description:"bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isStunField||tech.oneSuperBall||tech.isCloakStun||tech.orbitBotCount>1||tech.isExplosionStun||tech.isMineStun,requires:"a stun effect",effect(){tech.isCrit=!0},remove(){tech.isCrit=!1}},{name:"thermal runaway",description:"mobs <strong class='color-e'>explode</strong> when they <strong>die</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!(tech.sporesOnDeath||tech.nailsDeathMob||tech.botSpawner||tech.isMobBlockFling||tech.iceIXOnDeath),requires:"no other mob death tech",effect:()=>{tech.isExplodeMob=!0},remove(){tech.isExplodeMob=!1}},{name:"shear stress",description:"mobs release a <strong>nail</strong> when they <strong>die</strong><br><em>nails target nearby mobs</em>",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!(tech.sporesOnDeath||tech.isExplodeMob||tech.botSpawner||tech.isMobBlockFling||tech.iceIXOnDeath),requires:"no other mob death tech",effect:()=>{tech.nailsDeathMob++},remove(){tech.nailsDeathMob=0}},{name:"zoospore vector",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Disease_vector\' class="link">zoospore vector</a>',description:"mobs produce <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> when they <strong>die</strong><br><strong>11%</strong> chance",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!(tech.nailsDeathMob||tech.isExplodeMob||tech.botSpawner||tech.isMobBlockFling||tech.iceIXOnDeath),requires:"no other mob death tech",effect(){tech.sporesOnDeath+=.11},remove(){tech.sporesOnDeath=0}},{name:"reaction inhibitor",description:"mobs spawn with <strong>11%</strong> less <strong>health</strong>",maxCount:3,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect:()=>{tech.mobSpawnWithHealth*=.89;for(let e=0;e<mob.length;e++)mob.health>tech.mobSpawnWithHealth&&(mob.health=tech.mobSpawnWithHealth)},remove(){tech.mobSpawnWithHealth=1}},{name:"decorrelation",description:"reduce <strong class='color-harm'>harm</strong> by <strong>70%</strong> after not <strong>activating</strong><br>your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isNoFireDefense=!0},remove(){tech.isNoFireDefense=!1}},{name:"anticorrelation",description:"increase <strong class='color-d'>damage</strong> by <strong>100%</strong><br>after not using your <strong class='color-g'>gun</strong> or <strong class='color-f'>field</strong> for <strong>2</strong> seconds",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isNoFireDamage=!0},remove(){tech.isNoFireDamage=!1}},{name:"scrap bots",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Scrap\' class="link">scrap bots</a>',description:"<strong>33%</strong> chance after killing a mob to build<br>a scrap <strong class='color-bot'>bot</strong> that operates for <strong>14</strong> seconds",maxCount:3,count:0,frequency:1,frequencyDefault:1,isBotTech:!0,allowed:()=>!(tech.sporesOnDeath||tech.nailsDeathMob||tech.isExplodeMob||tech.isMobBlockFling||tech.iceIXOnDeath),requires:"no other mob death tech",effect(){tech.botSpawner+=.33},remove(){tech.botSpawner=0}},{name:"scrap refit",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Scrap\' class="link">scrap refit</a>',description:"killing a mob resets your functional scrap <strong class='color-bot'>bots</strong><br>to <strong>14</strong> seconds of operation",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.botSpawner,requires:"scrap bots",effect(){tech.isBotSpawnerReset=!0},remove(){tech.isBotSpawnerReset=!1}},{name:"nail-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">nail-bot</a>',description:"a <strong class='color-bot'>bot</strong> fires <strong>nails</strong> at mobs in line of sight",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>!0,requires:"",effect(){tech.nailBotCount++,b.nailBot()},remove(){this.count&&(tech.nailBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"nail-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">nail-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>nail-bots</strong><br><strong>+500%</strong> <strong>fire rate</strong> and <strong>+40%</strong> nail <strong>velocity</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.nailBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more nail bots and no other bot upgrade",effect(){tech.isNailBotUpgrade=!0,b.convertBotsTo("nail-bot");for(let e=0;e<bullet.length;e++)"nail"===bullet[e].botType&&(bullet[e].isUpgraded=!0);tech.setBotTechFrequency(),tech.setTechFrequency("nail-bot",5)},remove(){if(this.count){for(let e=0;e<bullet.length;e++)"nail"===bullet[e].botType&&(bullet[e].isUpgraded=!1);tech.setBotTechFrequency(1)}tech.isNailBotUpgrade=!1}},{name:"foam-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">foam-bot</a>',description:"a <strong class='color-bot'>bot</strong> fires <strong>foam</strong> at nearby mobs",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>!0,requires:"",effect(){tech.foamBotCount++,b.foamBot()},remove(){this.count&&(tech.foamBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"foam-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">foam-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>foam-bots</strong><br><strong>300%</strong> increased foam <strong>size</strong> and <strong>fire rate</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.foamBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more foam bots and no other bot upgrade",effect(){tech.isFoamBotUpgrade=!0,b.convertBotsTo("foam-bot");for(let e=0;e<bullet.length;e++)"foam"===bullet[e].botType&&(bullet[e].isUpgraded=!0);tech.setBotTechFrequency(),tech.setTechFrequency("foam-bot",5)},remove(){if(this.count){for(let e=0;e<bullet.length;e++)"foam"===bullet[e].botType&&(bullet[e].isUpgraded=!1);tech.setBotTechFrequency(1)}tech.isFoamBotUpgrade=!1}},{name:"boom-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">boom-bot</a>',description:"a <strong class='color-bot'>bot</strong> <strong>defends</strong> the space around you<br>ignites an <strong class='color-e'>explosion</strong> after hitting a mob",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>!0,requires:"",effect(){tech.boomBotCount++,b.boomBot()},remove(){this.count&&(tech.boomBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"boom-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">boom-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>boom-bots</strong><br><strong>300%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.boomBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more boom bots and no other bot upgrade",effect(){tech.isBoomBotUpgrade=!0,b.convertBotsTo("boom-bot");for(let e=0;e<bullet.length;e++)"boom"===bullet[e].botType&&(bullet[e].isUpgraded=!0);tech.setBotTechFrequency(),tech.setTechFrequency("boom-bot",5)},remove(){if(this.count){for(let e=0;e<bullet.length;e++)"boom"===bullet[e].botType&&(bullet[e].isUpgraded=!1);tech.setBotTechFrequency(1)}tech.isBoomBotUpgrade=!1}},{name:"laser-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">laser-bot</a>',description:"a <strong class='color-bot'>bot</strong> uses <strong class='color-f'>energy</strong> to emit a <strong class='color-laser'>laser</strong> beam<br>that targets nearby mobs",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>m.maxEnergy>.5,requires:"maximum energy above 50",effect(){tech.laserBotCount++,b.laserBot()},remove(){this.count&&(tech.laserBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"laser-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">laser-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>laser-bots</strong><br><strong>100%</strong> improved <strong class='color-d'>damage</strong>, efficiency, and range",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.laserBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more laser bots and no other bot upgrade",effect(){tech.isLaserBotUpgrade=!0,b.convertBotsTo("laser-bot");for(let e=0;e<bullet.length;e++)"laser"===bullet[e].botType&&(bullet[e].isUpgraded=!0);tech.setBotTechFrequency(),tech.setTechFrequency("laser-bot",5)},remove(){if(this.count){for(let e=0;e<bullet.length;e++)"laser"===bullet[e].botType&&(bullet[e].isUpgraded=!1);tech.setBotTechFrequency(1)}tech.isLaserBotUpgrade=!1}},{name:"orbital-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">orbital-bot</a>',description:"a <strong class='color-bot'>bot</strong> is locked in <strong>orbit</strong> around you<br><strong>stuns</strong> and <strong class='color-d'>damages</strong> mobs on <strong>contact</strong>",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>!0,requires:"",effect(){b.orbitBot(),tech.orbitBotCount++},remove(){this.count&&(tech.orbitBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"orbital-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">orbital-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>orbital-bots</strong><br>increase <strong class='color-d'>damage</strong> by <strong>300%</strong> and <strong>radius</strong> by <strong>50%</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.orbitBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more orbital bots and no other bot upgrade",effect(){tech.isOrbitBotUpgrade=!0,b.convertBotsTo("orbital-bot");const e=190+120*tech.isOrbitBotUpgrade;for(let t=0;t<bullet.length;t++)"orbit"===bullet[t].botType&&(bullet[t].isUpgraded=!0,bullet[t].range=e,bullet[t].orbitalSpeed=Math.sqrt(.25/e));tech.setBotTechFrequency(),tech.setTechFrequency("orbital-bot",5)},remove(){if(this.count){const e=190+100*tech.isOrbitBotUpgrade;for(let t=0;t<bullet.length;t++)"orbit"===bullet[t].botType&&(bullet[t].range=e,bullet[t].orbitalSpeed=Math.sqrt(.25/e));tech.setBotTechFrequency(1)}tech.isOrbitBotUpgrade=!1}},{name:"dynamo-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">dynamo-bot</a>',description:"a <strong class='color-bot'>bot</strong> <strong class='color-d'>damages</strong> mobs while it <strong>traces</strong> your path<br>regen <strong>6</strong> <strong class='color-f'>energy</strong> per second when it's near",maxCount:9,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,allowed:()=>!0,requires:"",effect(){tech.dynamoBotCount++,b.dynamoBot()},remove(){this.count&&(tech.dynamoBotCount-=this.count,b.clearPermanentBots(),b.respawnBots())}},{name:"dynamo-bot upgrade",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">dynamo-bot upgrade</a>',description:"<strong>convert</strong> your current bots to <strong>dynamo-bots</strong><br>increase regen to <strong>20</strong> <strong class='color-f'>energy</strong> per second",maxCount:1,count:0,frequency:3,frequencyDefault:3,isBotTech:!0,allowed:()=>tech.dynamoBotCount>1&&!b.hasBotUpgrade(),requires:"2 or more dynamo bots and no other bot upgrade",effect(){tech.isDynamoBotUpgrade=!0,b.convertBotsTo("dynamo-bot");for(let e=0;e<bullet.length;e++)"dynamo"===bullet[e].botType&&(bullet[e].isUpgraded=!0);tech.setBotTechFrequency(),tech.setTechFrequency("dynamo-bot",5)},remove(){if(this.count){for(let e=0;e<bullet.length;e++)"dynamo"===bullet[e].botType&&(bullet[e].isUpgraded=!1);tech.setBotTechFrequency(1)}tech.isDynamoBotUpgrade=!1}},{name:"bot fabrication",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">bot fabrication</a>',descriptionFunction:()=>`after you collect ${powerUps.orb.research(2+Math.floor(.1666*b.totalBots()))}use them to build a<br>random <strong class='color-bot'>bot</strong> <em>(+1 cost every 6 bots)</em>`,maxCount:1,count:0,frequency:2,frequencyDefault:2,isBotTech:!0,allowed:()=>powerUps.research.count>1||build.isExperimentSelection,requires:"at least 2 research",effect(){tech.isRerollBots=!0,powerUps.research.changeRerolls(0),simulation.makeTextLog("<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>=</span> 0")},remove(){tech.isRerollBots=!1}},{name:"robotics",description:"spawn <strong>2</strong> random <strong>bots</strong><br><strong>quadruple</strong> the <strong class='flicker'>frequency</strong> of finding <strong>bot</strong> <strong class='color-m'>tech</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isBotTech:!0,allowed:()=>b.totalBots()>1||build.isExperimentSelection,requires:"at least 2 bots",effect:()=>{b.randomBot(),b.randomBot();for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isBotTech&&(tech.tech[e].frequency*=4)},remove(){if(this.count>0){b.removeBot(),b.removeBot(),b.clearPermanentBots(),b.respawnBots();for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isBotTech&&(tech.tech[e].frequency=Math.ceil(tech.tech[e].frequency/4))}}},{name:"perimeter defense",description:"reduce <strong class='color-harm'>harm</strong> by <strong>8%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,isBotTech:!0,allowed:()=>b.totalBots()>1&&!tech.isEnergyHealth,requires:"at least 2 bots",effect(){tech.isBotArmor=!0},remove(){tech.isBotArmor=!1}},{name:"network effect",description:"increase <strong class='color-d'>damage</strong> by <strong>7%</strong><br>for each of your permanent <strong class='color-bot'>bots</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,isBotTech:!0,allowed:()=>b.totalBots()>1,requires:"at least 2 bots",effect(){tech.isBotDamage=!0},remove(){tech.isBotDamage=!1}},{name:"ersatz bots",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Ersatz_good\' class="link">ersatz bots</a>',description:"<strong>double</strong> your current permanent <strong class='color-bot'>bots</strong><br>remove <strong>all</strong> <strong class='color-g'>guns</strong> in your inventory",maxCount:1,count:0,frequency:2,frequencyDefault:2,isBotTech:!0,isBadRandomOption:!0,numberOfGunsLost:0,allowed:()=>b.totalBots()>3&&!build.isExperimentSelection,requires:"NOT EXPERIMENT MODE, at least 4 bots",effect(){this.numberOfGunsLost=b.inventory.length,b.removeAllGuns(),simulation.makeGunHUD();for(let e=0;e<tech.nailBotCount;e++)b.nailBot();tech.nailBotCount*=2;for(let e=0;e<tech.laserBotCount;e++)b.laserBot();tech.laserBotCount*=2;for(let e=0;e<tech.foamBotCount;e++)b.foamBot();tech.foamBotCount*=2;for(let e=0;e<tech.boomBotCount;e++)b.boomBot();tech.boomBotCount*=2;for(let e=0;e<tech.orbitBotCount;e++)b.orbitBot();tech.orbitBotCount*=2;for(let e=0;e<tech.dynamoBotCount;e++)b.dynamoBot();tech.dynamoBotCount*=2;for(let e=0;e<tech.plasmaBotCount;e++)b.plasmaBot();tech.plasmaBotCount*=2;for(let e=0;e<tech.missileBotCount;e++)b.missileBot();tech.missileBotCount*=2},remove(){if(this.count){for(let e=0;e<this.numberOfGunsLost;e++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"gun");this.numberOfGunsLost=0,tech.nailBotCount=Math.round(tech.nailBotCount/2),tech.laserBotCount=Math.round(tech.laserBotCount/2),tech.foamBotCount=Math.round(tech.foamBotCount/2),tech.boomBotCount=Math.round(tech.boomBotCount/2),tech.orbitBotCount=Math.round(tech.orbitBotCount/2),tech.dynamoBotCount=Math.round(tech.dynamoBotCount/2),tech.plasmaBotCount=Math.round(tech.plasmaBotCount/2),tech.missileBotCount=Math.round(tech.missileBotCount/2),b.clearPermanentBots(),b.respawnBots()}}},{name:"mass driver",description:"increase <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> by <strong>300%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>"wormhole"!==m.fieldUpgrades[m.fieldMode].name,requires:"not wormhole",effect(){tech.blockDamage=.3},remove(){tech.blockDamage=.075}},{name:"inflation",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Inflation_(cosmology)\' class="link">inflation</a>',description:"<strong>throwing</strong> a <strong class='color-block'>block</strong> expands it by <strong>300%</strong><br><strong>holding</strong> a <strong class='color-block'>block</strong> reduces <strong class='color-harm'>harm</strong> by <strong>85%</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.blockDamage>.075&&"pilot wave"!==m.fieldUpgrades[m.fieldMode].name&&"wormhole"!==m.fieldUpgrades[m.fieldMode].name&&!tech.isTokamak,requires:"mass driver, not pilot wave, tokamak, wormhole",effect(){tech.isAddBlockMass=!0},remove(){tech.isAddBlockMass=!1}},{name:"restitution",description:"<strong>throwing</strong> a <strong class='color-block'>block</strong> makes it very <strong>bouncy</strong><br>increase <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> by <strong>150%</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.blockDamage>.075&&"pilot wave"!==m.fieldUpgrades[m.fieldMode].name&&"wormhole"!==m.fieldUpgrades[m.fieldMode].name&&!tech.isTokamak,requires:"mass driver, not pilot wave not tokamak, wormhole",effect(){tech.isBlockRestitution=!0},remove(){tech.isBlockRestitution=!1}},{name:"flywheel",description:"after a mob <strong>dies</strong> its <strong class='color-block'>block</strong> is <strong>flung</strong> at mobs<br>increase <strong class='color-block'>block</strong> collision <strong class='color-d'>damage</strong> by <strong>150%</strong>",maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.blockDamage>.075&&!tech.nailsDeathMob&&!tech.sporesOnDeath&&!tech.isExplodeMob&&!tech.botSpawner&&!tech.iceIXOnDeath,requires:"mass driver, no other mob death tech",effect(){tech.isMobBlockFling=!0},remove(){tech.isMobBlockFling=!1}},{name:"buckling",description:`if a <strong class='color-block'>block</strong> you threw kills a mob<br>spawn <strong>1</strong> ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.blockDamage>.075&&"pilot wave"!==m.fieldUpgrades[m.fieldMode].name&&!tech.isTokamak,requires:"mass driver, not pilot wave, tokamak",effect(){tech.isBlockPowerUps=!0},remove(){tech.isBlockPowerUps=!1}},{name:"Pauli exclusion",description:"after receiving <strong class='color-harm'>harm</strong> from a <strong>collision</strong> become<br><strong>immune</strong> to <strong class='color-harm'>harm</strong> for <strong>1</strong> extra second",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.collisionImmuneCycles+=60,m.immuneCycle<m.cycle+tech.collisionImmuneCycles&&(m.immuneCycle=m.cycle+tech.collisionImmuneCycles)},remove(){tech.collisionImmuneCycles=30}},{name:"complex spin-statistics",description:"become <strong>immune</strong> to <strong class='color-harm'>harm</strong> for <strong>1.8</strong> seconds<br>once every <strong>7</strong> seconds",maxCount:3,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.cyclicImmunity+=108},remove(){tech.cyclicImmunity=0}},{name:"NOR gate",description:"if <strong>flip-flop</strong> is in the <strong class='color-flop'>ON</strong> state<br>take <strong>0</strong> <strong class='color-harm'>harm</strong> from collisions with mobs",maxCount:1,count:0,frequency:4,frequencyDefault:4,allowed:()=>tech.isFlipFlop,requires:"flip-flop",effect(){tech.isFlipFlopHarm=!0},remove(){tech.isFlipFlopHarm=!1}},{name:"flip-flop",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Flip-flop_(electronics)\' class="link">flip-flop</a>',description:'toggle <strong class="color-flop">ON</strong> and <strong class="color-flop">OFF</strong> after a <strong>collision</strong><br>unlock advanced <strong class=\'color-m\'>tech</strong> that runs if <strong class="color-flop">ON</strong>',nameInfo:"<span id = 'tech-flip-flop'></span>",addNameInfo(){setTimeout((function(){document.getElementById("tech-flip-flop")&&(tech.isFlipFlopOn?(document.getElementById("tech-flip-flop").innerHTML=" = <strong>ON</strong>",m.eyeFillColor=m.fieldMeterColor):(document.getElementById("tech-flip-flop").innerHTML=" = <strong>OFF</strong>",m.eyeFillColor="transparent"))}),100)},maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isRelay,requires:"not relay switch",effect(){tech.isFlipFlop=!0,tech.isFlipFlopOn=!0,m.isShipMode||(m.draw=m.drawFlipFlop)},remove(){tech.isFlipFlop=!1,tech.isFlipFlopOn=!1,m.eyeFillColor="transparent"}},{name:"relay switch",description:'toggle <strong class="color-flop">ON</strong> and <strong class="color-flop">OFF</strong> after picking up a <strong>power up</strong><br>unlock advanced <strong class=\'color-m\'>tech</strong> that runs if <strong class="color-flop">ON</strong>',nameInfo:"<span id = 'tech-switch'></span>",addNameInfo(){setTimeout((function(){document.getElementById("tech-switch")&&(tech.isFlipFlopOn?(document.getElementById("tech-switch").innerHTML=" = <strong>ON</strong>",m.eyeFillColor=m.fieldMeterColor):(document.getElementById("tech-switch").innerHTML=" = <strong>OFF</strong>",m.eyeFillColor="transparent"))}),100)},maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isFlipFlop,requires:"not flip-flop",effect(){tech.isRelay=!0,tech.isFlipFlopOn=!0,m.isShipMode||(m.draw=m.drawFlipFlop)},remove(){tech.isRelay=!1,tech.isFlipFlopOn=!1,m.eyeFillColor="transparent"}},{name:"NAND gate",description:"if in the <strong class='color-flop'>ON</strong> state<br>do <strong>50%</strong> more <strong class='color-d'>damage</strong>",maxCount:1,count:0,frequency:4,frequencyDefault:4,allowed:()=>tech.isFlipFlop||tech.isRelay,requires:"ON/OFF tech",effect(){tech.isFlipFlopDamage=!0},remove(){tech.isFlipFlopDamage=!1}},{name:"transistor",description:"if <strong class='color-flop'>ON</strong> regen <strong>20</strong> <strong class='color-f'>energy</strong> per second<br>if <strong class='color-flop'>OFF</strong> drain <strong>1</strong> <strong class='color-f'>energy</strong> per second",maxCount:1,count:0,frequency:4,frequencyDefault:4,allowed:()=>tech.isFlipFlop||tech.isRelay,requires:"ON/OFF tech",effect(){tech.isFlipFlopEnergy=!0},remove(){tech.isFlipFlopEnergy=!1}},{name:"shift registers",description:"set to the <strong class='color-flop'>ON</strong> state<br>at the start of a <strong>level</strong>",maxCount:1,count:0,frequency:4,frequencyDefault:4,allowed:()=>tech.isFlipFlopEnergy||tech.isFlipFlopDamage||tech.isFlipFlopHarm||tech.relayIce,requires:"2 ON/OFF techs",effect(){tech.isFlipFlopLevelReset=!0},remove(){tech.isFlipFlopLevelReset=!1}},{name:"thermocouple",description:"if <strong>relay switch</strong> is in the <strong class='color-flop'>ON</strong> state<br>condense <strong>4-13</strong> <strong class='color-s'>ice IX</strong> crystals every second",maxCount:9,count:0,frequency:4,frequencyDefault:4,allowed:()=>tech.isRelay,requires:"relay switch",effect(){tech.relayIce++},remove(){tech.relayIce=0}},{name:"crystallizer",description:"after <strong class='color-s'>frozen</strong> mobs <strong>die</strong> they<br>shatter into <strong class='color-s'>ice IX</strong> crystals",maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.isIceCrystals||tech.isSporeFreeze||tech.isIceField||tech.isIceShot||tech.relayIce||tech.isNeedleIce||tech.blockingIce>1)&&!tech.sporesOnDeath&&!tech.isExplodeMob&&!tech.botSpawner&&!tech.isMobBlockFling&&!tech.nailsDeathMob,requires:"a localized freeze effect, no other mob death tech",effect(){tech.iceIXOnDeath++},remove(){tech.iceIXOnDeath=0}},{name:"thermoelectric effect",description:"<strong>killing</strong> mobs with <strong class='color-s'>ice IX</strong><br>generates <strong>100</strong> <strong class='color-f'>energy</strong>",maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isIceField||tech.relayIce||tech.isNeedleIce||tech.blockingIce||tech.iceIXOnDeath||tech.isIceShot,requires:"ice IX",effect(){tech.iceEnergy++},remove(){tech.iceEnergy=0}},{name:"superfluidity",description:"<strong class='color-s'>freeze</strong> effects are applied to a small area",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isIceCrystals||tech.isSporeFreeze||tech.isIceField||tech.relayIce||tech.isNeedleIce||tech.blockingIce>1||tech.iceIXOnDeath||tech.isIceShot,requires:"a localized freeze effect",effect(){tech.isAoESlow=!0},remove(){tech.isAoESlow=!1}},{name:"liquid cooling",description:"<strong class='color-s'>freeze</strong> all mobs for <strong>7</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isSlowFPS,requires:"clock gating",effect(){tech.isHarmFreeze=!0},remove(){tech.isHarmFreeze=!1}},{name:"clock gating",description:"<strong>slow</strong> <strong>time</strong> by <strong>50%</strong> after receiving <strong class='color-harm'>harm</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>20%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>simulation.fpsCapDefault>45,requires:"FPS above 45",effect(){tech.isSlowFPS=!0},remove(){tech.isSlowFPS=!1}},{name:"MACHO",description:"a massive but compact object slowly <strong>follows</strong> you<br>take <strong>66%</strong> less <strong class='color-harm'>harm</strong> inside it's <strong>halo</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect:()=>{tech.isMACHO=!0,spawn.MACHO()},remove(){tech.isMACHO=!1,tech.isHarmMACHO=!1;for(let e=0,t=mob.length;e<t;e++)mob[e].isMACHO&&(mob[e].alive=!1)}},{name:"axion",description:"while inside the <strong>MACHO</strong> <strong>75%</strong> of your total<br><strong class='color-harm'>harm</strong> reduction is added to your <strong class='color-d'>damage</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isMACHO,requires:"MACHO",effect:()=>{tech.isAxion=!0},remove(){tech.isAxion=!1}},{name:"ablative drones",description:"rebuild your broken parts as <strong>drones</strong><br>chance to occur after receiving <strong class='color-harm'>harm</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isDroneOnDamage=!0},remove(){tech.isDroneOnDamage=!1}},{name:"non-Newtonian armor",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Non-Newtonian_fluid\' class="link">non-Newtonian armor</a>',description:"for <strong>10 seconds</strong> after receiving <strong class='color-harm'>harm</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>66%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isHarmArmor=!0},remove(){tech.isHarmArmor=!1}},{name:"radiative equilibrium",description:"for <strong>10 seconds</strong> after receiving <strong class='color-harm'>harm</strong><br>increase <strong class='color-d'>damage</strong> by <strong>200%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isHarmDamage=!0},remove(){tech.isHarmDamage=!1}},{name:"CPT symmetry",description:"<strong>charge</strong>, <strong>parity</strong>, and <strong>time</strong> invert to undo <strong class='color-harm'>harm</strong><br><strong class='color-rewind'>rewind</strong> <strong>(1.5—5)</strong> seconds for <strong>(66—220)</strong> <strong class='color-f'>energy</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>m.maxEnergy>.99&&"standing wave"!==m.fieldUpgrades[m.fieldMode].name&&!tech.isEnergyHealth&&!tech.isRewindField,requires:"not standing wave, mass-energy, max energy reduction",effect(){tech.isRewindAvoidDeath=!0},remove(){tech.isRewindAvoidDeath=!1}},{name:"causality bots",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Causality\' class="link">causality bots</a>',description:"when you <strong class='color-rewind'>rewind</strong>, build several <strong class='color-bot'>bots</strong><br>that protect you for about <strong>9</strong> seconds",maxCount:3,count:0,frequency:2,frequencyDefault:2,isBotTech:!0,allowed:()=>tech.isRewindAvoidDeath||tech.isRewindField,requires:"CPT, retrocausality",effect(){tech.isRewindBot++},remove(){tech.isRewindBot=0}},{name:"causality bombs",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Causality\' class="link">causality bombs</a>',description:"when you <strong class='color-rewind'>rewind</strong> drop several <strong>grenades</strong><br>become immune to <strong class='color-harm'>harm</strong> until they <strong class='color-e'>explode</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isRewindAvoidDeath||tech.isRewindField,requires:"CPT, retrocausality",effect(){tech.isRewindGrenade=!0},remove(){tech.isRewindGrenade=!1}},{name:"piezoelectricity",description:"<strong>colliding</strong> with mobs gives you <strong>2048</strong> <strong class='color-f'>energy</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isPiezo=!0},remove(){tech.isPiezo=!1}},{name:"ground state",description:"reduce <strong class='color-harm'>harm</strong> by <strong>66%</strong><br>you <strong>no longer</strong> passively regenerate <strong class='color-f'>energy</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isCrouchRegen,requires:"not inductive coupling",effect:()=>{tech.energyRegen=0,m.fieldRegen=tech.energyRegen},remove(){tech.energyRegen=.001,m.fieldRegen=tech.energyRegen}},{name:"mass-energy equivalence",description:"<strong class='color-f'>energy</strong> protects you instead of <strong class='color-h'>health</strong><br><strong class='color-harm'>harm</strong> <strong>reduction</strong> effects provide <strong>no</strong> benefit",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!(tech.isZeno||tech.isNoHeals||tech.isPiezo||tech.isRewindAvoidDeath||tech.isTechDamage||tech.isMutualism),requires:"not Zeno, ergodicity, piezoelectricity, CPT, antiscience, mutualism",effect:()=>{m.health=0,document.getElementById("health").style.display="none",document.getElementById("health-bg").style.display="none",document.getElementById("dmg").style.backgroundColor="#0cf",tech.isEnergyHealth=!0,simulation.mobDmgColor="rgba(14, 190, 235,0.7)",m.displayHealth()},remove(){tech.isEnergyHealth&&(tech.isEnergyHealth=!1,document.getElementById("health").style.display="inline",document.getElementById("health-bg").style.display="inline",document.getElementById("dmg").style.backgroundColor="#f67",m.health=Math.max(Math.min(m.maxHealth,m.energy),.1),simulation.mobDmgColor="rgba(255,0,0,0.7)",m.displayHealth()),tech.isEnergyHealth=!1}},{name:"1st ionization energy",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Ionization_energy\' class="link">1st ionization energy</a>',description:`each ${powerUps.orb.heal()} you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>8</strong>`,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isEnergyHealth,requires:"mass-energy equivalence",effect(){tech.healGiveMaxEnergy=!0,powerUps.heal.color="#0ae";for(let e=0;e<powerUp.length;e++)"heal"===powerUp[e].name&&(powerUp[e].color=powerUps.heal.color)},remove(){tech.healGiveMaxEnergy=!1,powerUps.heal.color="#0eb";for(let e=0;e<powerUp.length;e++)"heal"===powerUp[e].name&&(powerUp[e].color=powerUps.heal.color)}},{name:"weak interaction",description:"each unused <strong>power up</strong> at the end of a <strong>level</strong><br>adds 5 <strong>maximum</strong> <strong class='color-f'>energy</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isDroneGrab,requires:"not delivery drone",effect(){tech.isExtraMaxEnergy=!0},remove(){tech.isExtraMaxEnergy=!1}},{name:"electroweak interaction",description:"unused <strong>power ups</strong> at the end of each <strong>level</strong><br>are still activated <em>(selections are random)</em>",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isExtraMaxEnergy,requires:"weak interaction",effect(){tech.isEndLevelPowerUp=!0},remove(){tech.isEndLevelPowerUp=!1}},{name:"electronegativity",description:"increase <strong class='color-d'>damage</strong> by <strong>1%</strong><br>for every <strong>9</strong> stored <strong class='color-f'>energy</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect:()=>{tech.isEnergyDamage=!0},remove(){tech.isEnergyDamage=!1}},{name:"exothermic process",description:"increase <strong class='color-d'>damage</strong> by <strong>50%</strong><br>if a mob <strong>dies</strong> drain <strong class='color-f'>energy</strong> by <strong>25%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isEnergyLoss=!0},remove(){tech.isEnergyLoss=!1}},{name:"heat engine",description:"increase <strong class='color-d'>damage</strong> by <strong>50%</strong>, but<br>reduce maximum <strong class='color-f'>energy</strong> by <strong>50</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isRewindAvoidDeath,requires:"not CPT",effect(){tech.isMaxEnergyTech=!0,m.setMaxEnergy()},remove(){tech.isMaxEnergyTech=!1,m.setMaxEnergy()}},{name:"Gibbs free energy",description:"increase <strong class='color-d'>damage</strong> by <strong>0.7%</strong><br>for each <strong class='color-f'>energy</strong> below <strong>100</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isLowEnergyDamage=!0},remove(){tech.isLowEnergyDamage=!1}},{name:"overcharge",description:"increase your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>60</strong><br><strong>+10%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.bonusEnergy+=.6,m.setMaxEnergy(),this.refundAmount+=tech.addJunkTechToPool(.1)},refundAmount:0,remove(){tech.bonusEnergy=0,m.setMaxEnergy(),this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"Maxwell's demon",description:"<strong class='color-f'>energy</strong> above your max decays <strong>95%</strong> slower<br><strong>+10%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>m.energy>m.maxEnergy||build.isExperimentSelection,requires:"energy above your max",effect(){tech.overfillDrain=.92,this.refundAmount+=tech.addJunkTechToPool(.1)},refundAmount:0,remove(){tech.overfillDrain=.7,this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"inductive coupling",description:"passive <strong class='color-f'>energy</strong> regen is increased by <strong>700%</strong><br>but you only regen when <strong>crouched</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>0!==tech.energyRegen&&!tech.isDamageAfterKillNoRegen,requires:"not ground state, predator",effect(){tech.isCrouchRegen=!0,m.regenEnergy=function(){m.immuneCycle<m.cycle&&m.crouch&&(m.energy+=7*m.fieldRegen),m.energy<0&&(m.energy=0)}},remove(){tech.isCrouchRegen=!1,m.regenEnergy=m.regenEnergyDefault}},{name:"energy conservation",description:"<strong>5%</strong> of <strong class='color-d'>damage</strong> done recovered as <strong class='color-f'>energy</strong>",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.energySiphon+=.05},remove(){tech.energySiphon=0}},{name:"waste heat recovery",description:"if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br>regen <strong>5%</strong> of max <strong class='color-f'>energy</strong> every second",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isEnergyRecovery=!0},remove(){tech.isEnergyRecovery=!1}},{name:"recycling",description:"if a mob has <strong>died</strong> in the last <strong>5 seconds</strong><br>regain <strong>1%</strong> of max <strong class='color-h'>health</strong> every second",maxCount:1,count:0,frequency:1,frequencyDefault:1,isHealTech:!0,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy equivalence",effect(){tech.isHealthRecovery=!0},remove(){tech.isHealthRecovery=!1}},{name:"predator",description:"<span style = 'font-size:91%;'>if a mob has <strong>died</strong> in the last <strong>5 seconds</strong> inhibit<br>passive <strong class='color-f'>energy</strong> regen and increase <strong class='color-d'>damage</strong> <strong>50%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isCrouchRegen,requires:"not inductive coupling",effect(){tech.isDamageAfterKillNoRegen=!0,m.regenEnergy=function(){m.immuneCycle<m.cycle&&m.lastKillCycle+300<m.cycle&&(m.energy+=m.fieldRegen),m.energy<0&&(m.energy=0)}},remove(){this.count&&(m.regenEnergy=m.regenEnergyDefault),tech.isDamageAfterKillNoRegen=!1}},{name:"torpor",description:"if a mob has <strong>not died</strong> in the last <strong>5 seconds</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>66%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isHarmReduceNoKill=!0},remove(){tech.isHarmReduceNoKill=!1}},{name:"Zeno's paradox",description:"reduce <strong class='color-harm'>harm</strong> by <strong>83%</strong>, but every <strong>5</strong> seconds<br>remove <strong>1/10</strong> of your current <strong class='color-h'>health</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isZeno=!0},remove(){tech.isZeno=!1}},{name:"negative feedback",description:"increase <strong class='color-d'>damage</strong> by <strong>5%</strong><br>for every <strong>10</strong> <strong class='color-h'>health</strong> below <strong>100</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>m.health<.6||build.isExperimentSelection,requires:"health below 60",effect(){tech.isLowHealthDmg=!0},remove(){tech.isLowHealthDmg=!1}},{name:"antiscience",description:"increase <strong class='color-d'>damage</strong> by <strong>90%</strong><br>lose <strong>11</strong> <strong class='color-h'>health</strong> when you pick up a <strong class='color-m'>tech</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){tech.isTechDamage=!0},remove(){tech.isTechDamage=!1}},{name:"enthalpy",description:"<strong class='color-h'>heal</strong> for <strong>3%</strong> of <strong class='color-d'>damage</strong> done<br>take <strong>10%</strong> more <strong class='color-harm'>harm</strong>",maxCount:9,count:0,frequency:1,frequencyDefault:1,isHealTech:!0,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy equivalence",effect(){tech.healthDrain+=.03},remove(){tech.healthDrain=0}},{name:"fluoroantimonic acid",description:"increase <strong class='color-d'>damage</strong> by <strong>35%</strong><br>when your <strong class='color-h'>health</strong> is above <strong>100</strong>",maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>m.maxHealth>1,requires:"max health above 100",effect(){tech.isAcidDmg=!0},remove(){tech.isAcidDmg=!1}},{name:"tungsten carbide",description:"increase your <strong>maximum</strong> <strong class='color-h'>health</strong> by <strong>100</strong><br><strong>landings</strong> that force you to crouch cause <strong class='color-harm'>harm</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy equivalence",effect(){tech.isFallingDamage=!0,m.setMaxHealth(),m.addHealth(1/simulation.healScale)},remove(){tech.isFallingDamage=!1,m.setMaxHealth()}},{name:"quenching",description:`over healing from ${powerUps.orb.heal()} does <strong class='color-harm'>harm</strong><br>but it also increase your <strong>maximum</strong> <strong class='color-h'>health</strong>`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isEnergyHealth&&!tech.isNoHeals,requires:"not mass-energy equivalence, ergodicity",effect(){tech.isOverHeal=!0},remove(){tech.isOverHeal=!1}},{name:"negative entropy",description:`at the start of each <strong>level</strong><br>spawn ${powerUps.orb.heal()} for every <strong>26</strong> missing health`,maxCount:1,count:0,frequency:1,frequencyDefault:1,isHealTech:!0,allowed:()=>m.health>.1&&!tech.isNoHeals,requires:"has some health, not ergodicity",effect(){tech.isHealLowHealth=!0},remove(){tech.isHealLowHealth=!1}},{name:"adiabatic healing",description:`${powerUps.orb.heal()} are <strong>100%</strong> more effective<br><strong>+5%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool`,maxCount:3,count:0,frequency:1,frequencyDefault:1,isHealTech:!0,allowed:()=>(m.health/m.maxHealth<.7||build.isExperimentSelection)&&!tech.isEnergyHealth&&!tech.isNoHeals,requires:"under 70% health, not mass-energy equivalence, ergodicity",effect(){tech.largerHeals++,this.refundAmount+=tech.addJunkTechToPool(.05);for(let e=0;e<powerUp.length;e++)"heal"===powerUp[e].name&&(powerUp[e].size=powerUps.heal.size())},refundAmount:0,remove(){tech.largerHeals=1,this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"maintenance",description:`</strong>double</strong> the <strong class='flicker'>frequency</strong> of finding <strong class='color-h'>healing</strong> <strong class='color-m'>tech</strong><br>spawn ${powerUps.orb.heal(13)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>!0,requires:"NOT EXPERIMENT MODE",effect(){for(let e=0;e<13;e++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"heal");for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isHealTech&&(tech.tech[e].frequency*=2)},remove(){}},{name:"anthropic principle",nameInfo:"<span id = 'tech-anthropic'></span>",addNameInfo(){setTimeout((function(){powerUps.research.changeRerolls(0)}),1e3)},description:`once per level, instead of <strong>dying</strong><br>use ${powerUps.orb.research(1)} and spawn ${powerUps.orb.heal(5)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,isHealTech:!0,allowed:()=>powerUps.research.count>0||build.isExperimentSelection,requires:"at least 1 research",effect(){tech.isDeathAvoid=!0,tech.isDeathAvoidedThisLevel=!1,setTimeout((function(){powerUps.research.changeRerolls(0)}),1e3)},remove(){tech.isDeathAvoid=!1}},{name:"weak anthropic principle",description:"after <strong>anthropic principle</strong> prevents your <strong>death</strong><br>add <strong>50%</strong> <strong class='color-dup'>duplication</strong> chance for that level",maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.isDeathAvoid,requires:"anthropic principle",effect(){tech.isAnthropicTech=!0,powerUps.setDupChance()},remove(){tech.isAnthropicTech=!1,powerUps.setDupChance()}},{name:"strong anthropic principle",description:"after <strong>anthropic principle</strong> prevents your <strong>death</strong><br>increase <strong class='color-d'>damage</strong> by <strong>137.03599%</strong> for that level",maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.isDeathAvoid,requires:"anthropic principle",effect(){tech.isAnthropicDamage=!0},remove(){tech.isAnthropicDamage=!1}},{name:"quantum immortality",description:"reduce <strong class='color-harm'>harm</strong> by <strong>33%</strong><br>after <strong>dying</strong>, continue in an <strong class='alt'>alternate reality</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isImmortal=!0},remove(){tech.isImmortal=!1}},{name:"non-unitary operator",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Unitary_operator\' class="link">non-unitary operator</a>',description:"reduce combat <strong>difficulty</strong> by <strong>2 levels</strong>, but<br>after a <strong>collision</strong> enter an <strong class='alt'>alternate reality</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isResearchReality&&!tech.isSwitchReality,requires:"not Ψ(t) collapse, many-worlds",effect(){tech.isCollisionRealitySwitch=!0,level.difficultyDecrease(2*simulation.difficultyMode)},remove(){tech.isCollisionRealitySwitch=!1,this.count>0&&level.difficultyIncrease(2*simulation.difficultyMode)}},{name:"many-worlds",description:`on each new <strong>level</strong> use ${powerUps.orb.research(1)} to enter an<br><strong class='alt'>alternate reality</strong> and spawn a <strong class='color-m'>tech</strong> power up`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isResearchReality&&!tech.isCollisionRealitySwitch,requires:"not Ψ(t) collapse, non-unitary",effect(){tech.isSwitchReality=!0},remove(){tech.isSwitchReality=!1}},{name:"Ψ(t) collapse",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Wave_function_collapse\' class="link">Ψ(t) collapse</a>',description:`enter an <strong class='alt'>alternate reality</strong> after you <strong class='color-r'>research</strong><br>spawn ${powerUps.orb.research(21)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isSwitchReality&&!tech.isCollisionRealitySwitch&&!tech.isJunkResearch,requires:"not many-worlds, non-unitary, pseudoscience",effect(){tech.isResearchReality=!0;for(let e=0;e<16;e++)powerUps.spawn(m.pos.x+60*Math.random(),m.pos.y+60*Math.random(),"research",!1)},remove(){tech.isResearchReality=!1}},{name:"decoherence",description:`<strong class='color-r'>researched</strong> or <strong>canceled</strong> <strong class='color-m'>tech</strong> won't <strong>reoccur</strong> <br>spawn ${powerUps.orb.research(9)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isSuperDeterminism,requires:"not superdeterminism",effect(){tech.isBanish=!0;for(let e=0;e<9;e++)powerUps.spawn(m.pos.x+40*(Math.random()-.5),m.pos.y+40*(Math.random()-.5),"research",!1)},remove(){if(tech.isBanish){tech.isBanish=!1;for(let e=0;e<tech.tech.length;e++)tech.tech[e].isBanished&&(tech.tech[e].isBanished=!1)}}},{name:"renormalization",description:`using ${powerUps.orb.research(1)} for <strong>any</strong> purpose<br>has a <strong>40%</strong> chance to spawn ${powerUps.orb.research(1)}`,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(powerUps.research.count>3||build.isExperimentSelection)&&!tech.isSuperDeterminism,requires:"at least 4 research and not superdeterminism",effect(){tech.renormalization=!0},remove(){tech.renormalization=!1}},{name:"perturbation theory",description:`<strong>66%</strong> decreased <strong><em>delay</em></strong> after firing<br>when you have no ${powerUps.orb.research(1)} in your inventory`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>0===powerUps.research.count,requires:"no research",effect(){tech.isRerollHaste=!0,tech.researchHaste=.33,b.setFireCD()},remove(){tech.isRerollHaste=!1,tech.researchHaste=1,b.setFireCD()}},{name:"ansatz",description:`after choosing a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawn ${powerUps.orb.research(2)}if you have no ${powerUps.orb.research(1)} in your inventory`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>0===powerUps.research.count&&!tech.isSuperDeterminism&&!tech.isRerollHaste&&!tech.isResearchReality,requires:"no research, not superdeterminism, Ψ(t) collapse, perturbation theory",effect:()=>{tech.isAnsatz=!0},remove(){tech.isAnsatz=!1}},{name:"Bayesian statistics",description:`increase <strong class='color-d'>damage</strong> by <strong>3.7%</strong><br>for each ${powerUps.orb.research(1)} in your inventory`,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>powerUps.research.count>5||build.isExperimentSelection,requires:"at least 6 research",effect(){tech.isRerollDamage=!0},remove(){tech.isRerollDamage=!1}},{name:"pseudoscience",description:"<span style = 'font-size:94%;'>when <strong>selecting</strong> a power up, <strong class='color-r'>research</strong> <strong>3</strong> times</span><br>for <strong>free</strong>, but add <strong>0-3%</strong> <strong class='color-j'>JUNK</strong> to the <strong class='color-m'>tech</strong> pool",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isResearchReality,requires:"not Ψ(t) collapse",effect(){tech.isJunkResearch=!0},remove(){tech.isJunkResearch=!1}},{name:"brainstorming",description:"<strong class='color-m'>tech</strong> choices <strong>randomize</strong><br>every <strong>2</strong> seconds for <strong>10</strong> seconds",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isBrainstorm=!0,tech.isBrainstormActive=!1,tech.brainStormDelay=120},remove(){tech.isBrainstorm=!1,tech.isBrainstormActive=!1}},{name:"cross disciplinary",description:"<strong class='color-m'>tech</strong> have an extra <strong class='color-f'>field</strong> or <strong class='color-g'>gun</strong> <strong>choice</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isDeterminism,requires:"not determinism",effect:()=>{tech.isExtraGunField=!0},remove(){tech.isExtraGunField=!1}},{name:"emergence",description:"<strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong> have <strong>5</strong> <strong>choices</strong><br><strong>+5%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isDeterminism,requires:"not determinism",effect:()=>{tech.isExtraChoice=!0,this.refundAmount+=tech.addJunkTechToPool(.05)},refundAmount:0,remove(){tech.isExtraChoice=!1,this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"determinism",description:"spawn <strong>5</strong> <strong class='color-m'>tech</strong>, but you have only<br> <strong>1 choice</strong> for <strong class='color-m'>tech</strong>, <strong class='color-f'>fields</strong>, and <strong class='color-g'>guns</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isBadRandomOption:!0,isNonRefundable:!0,allowed:()=>!tech.isExtraChoice&&!tech.isExtraGunField,requires:"NOT EXPERIMENT MODE, not emergence, cross disciplinary",effect:()=>{tech.isDeterminism=!0;for(let e=0;e<5;e++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"tech")},remove(){tech.isDeterminism=!1}},{name:"superdeterminism",description:`spawn <strong>5</strong> <strong class='color-m'>tech</strong>, but you have <strong>no cancel</strong><br>and ${powerUps.orb.research(1)}, no longer <strong>spawn</strong>`,maxCount:1,count:0,frequency:4,frequencyDefault:4,isBadRandomOption:!0,isNonRefundable:!0,allowed:()=>tech.isDeterminism&&!tech.isAnsatz,requires:"NOT EXPERIMENT MODE, determinism, not ansatz",effect:()=>{tech.isSuperDeterminism=!0;for(let e=0;e<5;e++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"tech")},remove(){tech.isSuperDeterminism=!1}},{name:"unified field theory",description:`spawn ${powerUps.orb.research(6)}and when <strong>paused</strong><br><strong>clicking</strong> the <strong class='color-f'>field</strong> box switches your <strong class='color-f'>field</strong>`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"not superdeterminism",effect(){tech.isPauseSwitchField=!0;for(let e=0;e<6;e++)powerUps.spawn(m.pos.x+40*(Math.random()-.5),m.pos.y+40*(Math.random()-.5),"research",!1)},remove(){tech.isPauseSwitchField&&(tech.isPauseSwitchField=!1,powerUps.research.changeRerolls(-6))}},{name:"abiogenesis",description:`at the start of a level spawn a 2nd <strong>boss</strong><br>use ${powerUps.orb.research(4)}or add <strong>49%</strong> <strong class='color-j'>JUNK</strong> to the <strong class='color-m'>tech</strong> pool`,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(build.isExperimentSelection||powerUps.research.count>3)&&!tech.isDuplicateBoss,requires:"at least 4 research and not parthenogenesis",effect(){tech.isResearchBoss=!0},remove(){tech.isResearchBoss=!1}},{name:"meta-analysis",description:`if you choose a <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> you instead get a<br>random normal <strong class='color-m'>tech</strong> and ${powerUps.orb.research(3)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isMetaAnalysis=!0},remove(){tech.isMetaAnalysis=!1}},{name:"dark patterns",description:"reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br><strong>+31%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>level.onLevel<8&&level.onLevel>0,requires:"on levels 1 through 7",effect(){level.difficultyDecrease(simulation.difficultyMode),simulation.makeTextLog("level.difficultyDecrease(simulation.difficultyMode)"),this.refundAmount+=tech.addJunkTechToPool(.31)},refundAmount:0,remove(){this.count>0&&(this.refundAmount>0&&tech.removeJunkTechFromPool(this.refundAmount),level.difficultyIncrease(simulation.difficultyMode))}},{name:"ergodicity",description:`reduce combat <strong>difficulty</strong> by <strong>2 levels</strong><br>${powerUps.orb.heal()} have <strong>no</strong> effect`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>level.onLevel>1&&!tech.isEnergyHealth,requires:"past levels 1, not mass-energy",effect(){tech.isNoHeals=!0,level.difficultyDecrease(2*simulation.difficultyMode),simulation.makeTextLog("level.difficultyDecrease(simulation.difficultyMode <span class='color-symbol'>*</span> 2)"),powerUps.heal.color="#abb";for(let e=0;e<powerUp.length;e++)"heal"===powerUp[e].name&&(powerUp[e].color=powerUps.heal.color)},remove(){if(tech.isNoHeals){powerUps.heal.color="#0eb";for(let e=0;e<powerUp.length;e++)"heal"===powerUp[e].name&&(powerUp[e].color=powerUps.heal.color)}tech.isNoHeals=!1,this.count>0&&level.difficultyIncrease(2*simulation.difficultyMode)}},{name:"bubble fusion",description:`after destroying a mob's natural <strong>shield</strong><br>spawn <strong>1-2</strong> ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!0,requires:"",effect(){tech.isShieldAmmo=!0},remove(){tech.isShieldAmmo=!1}},{name:"commodities exchange",description:`clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>5-10</strong> ${powerUps.orb.heal()}, ${powerUps.orb.ammo()}, or ${powerUps.orb.research(1)}`,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isSuperDeterminism,requires:"not superdeterminism",effect(){tech.isCancelRerolls=!0},remove(){tech.isCancelRerolls=!1}},{name:"futures exchange",description:"clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.3%</strong> power up <strong class='color-dup'>duplication</strong> chance",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()<1&&!tech.isSuperDeterminism,requires:"below 100% duplication chance, not superdeterminism",effect(){tech.isCancelDuplication=!0,powerUps.setDupChance()},remove(){tech.isCancelDuplication=!1,powerUps.setDupChance()}},{name:"replication",description:"<strong>10%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong>+30%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()<1,requires:"below 100% duplication chance",effect(){tech.duplicateChance+=.1,powerUps.setDupChance(),build.isExperimentSelection||simulation.isTextLogOpen||simulation.circleFlare(.1),this.refundAmount+=tech.addJunkTechToPool(.3)},refundAmount:0,remove(){tech.duplicateChance=0,powerUps.setDupChance(),this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"stimulated emission",description:"<strong>15%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>but, after a <strong>collision</strong> eject <strong>1</strong> <strong class='color-m'>tech</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()<1,requires:"below 100% duplication chance",effect:()=>{tech.isStimulatedEmission=!0,powerUps.setDupChance(),build.isExperimentSelection||simulation.isTextLogOpen||simulation.circleFlare(.15)},remove(){tech.isStimulatedEmission=!1,powerUps.setDupChance()}},{name:"metastability",description:"<strong>12%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong class='color-dup'>duplicates</strong> <strong class='color-e'>explode</strong> with a <strong>3</strong> second <strong>half-life</strong> ",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()<1,requires:"below 100% duplication chance",effect:()=>{tech.isPowerUpsVanish=!0,powerUps.setDupChance(),build.isExperimentSelection||simulation.isTextLogOpen||simulation.circleFlare(.12)},remove(){tech.isPowerUpsVanish=!1,powerUps.setDupChance()}},{name:"correlated damage",description:"your chance to <strong class='color-dup'>duplicate</strong> power ups<br>increases your <strong class='color-d'>damage</strong> by the same percent",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()>.15,requires:"duplication chance > 15%",effect(){tech.isDupDamage=!0},remove(){tech.isDupDamage=!1}},{name:"parthenogenesis",description:"<span style = 'font-size:90%;'> <strong>bosses</strong> have a <strong>2x</strong> chance to be <strong class='color-dup'>duplicated</strong>, but their<br><strong>health</strong> is increased by your <strong class='color-dup'>duplication</strong> chance</span>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.duplicationChance()>0&&!tech.isResearchBoss,requires:"some duplication chance, not abiogenesis",effect(){tech.isDuplicateBoss=!0},remove(){tech.isDuplicateBoss=!1}},{name:"apomixis",description:"when you reach <strong>111%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>11 bosses</strong> with <strong>111%</strong> more <strong>health</strong>",maxCount:1,count:0,frequency:10,frequencyDefault:10,isNonRefundable:!0,allowed:()=>tech.duplicationChance()>.99,requires:"duplication chance above 99%",effect(){tech.is111Duplicate=!0,tech.maxDuplicationEvent()},remove(){tech.is111Duplicate=!1}},{name:"Born rule",description:"<strong>remove</strong> all current <strong class='color-m'>tech</strong><br>spawn new <strong class='color-m'>tech</strong> to replace them",maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>tech.totalCount>6,requires:"NOT EXPERIMENT MODE, more than 6 tech",effect:()=>{for(let e=0;e<bullet.length;++e)Matter.Composite.remove(engine.world,bullet[e]);bullet=[];let e=1;for(let t=0,o=tech.tech.length;t<o;t++)tech.tech[t].isNonRefundable||(e+=tech.tech[t].count);tech.isDeterminism&&(e-=4),tech.isSuperDeterminism&&(e-=4),tech.setupAllTech(),simulation.isCheating&&tech.setCheating(),lore.techCount=0;for(let t=0;t<e;t++)powerUps.spawn(m.pos.x+100*(Math.random()-.5),m.pos.y+100*(Math.random()-.5),"tech")},remove(){}},{name:"Occam's razor",descriptionFunction(){return`randomly remove <strong>half</strong> your <strong class='color-m'>tech</strong><br>for each removed gain <strong>${100*this.damagePerRemoved}%</strong> <strong class='color-d'>damage</strong> <em>(~${50*this.damagePerRemoved*tech.totalCount}%)</em>`},maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>tech.totalCount>6,requires:"NOT EXPERIMENT MODE, more than 6 tech",removePercent:.5,damagePerRemoved:.5,effect(){let e=[];for(let t=0,o=tech.tech.length;t<o;t++)tech.tech[t].count&&!tech.tech[t].isNonRefundable&&e.push(t);e=shuffle(e);let t=0;for(let o=0,n=e.length*this.removePercent;o<n;o++)t+=tech.removeTech(e[o]);tech.OccamDamage=1+this.damagePerRemoved*t},remove(){tech.OccamDamage=0}},{name:"exchange symmetry",description:"remove <strong>1</strong> random <strong class='color-m'>tech</strong><br>spawn <strong>2</strong> new <strong class='color-g'>guns</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>tech.totalCount>3&&!tech.isSuperDeterminism,requires:"NOT EXPERIMENT MODE, at least 4 tech, not superdeterminism",effect:()=>{const e=[];for(let t=0;t<tech.tech.length;t++)tech.tech[t].count>0&&e.push(t);const t=e[Math.floor(Math.random()*e.length)];simulation.makeTextLog(`<span class='color-var'>tech</span>.removeTech("<span class='color-text'>${tech.tech[t].name}</span>")`);for(let e=0;e<tech.tech[t].count;e++)powerUps.spawn(m.pos.x,m.pos.y,"gun");powerUps.spawn(m.pos.x,m.pos.y,"gun"),tech.tech[t].count=0,tech.tech[t].remove(),tech.tech[t].isLost=!0,simulation.updateTechHUD()},remove(){}},{name:"monte carlo experiment",description:"remove <strong>1</strong> random <strong class='color-m'>tech</strong><br>spawn <strong>2</strong> <strong class='color-m'>tech</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>tech.totalCount>3&&tech.duplicationChance()>0&&!tech.isSuperDeterminism,requires:"NOT EXPERIMENT MODE, some duplication, at least 4 tech, not superdeterminism",effect:()=>{const e=tech.removeTech();for(let t=0;t<e+1;t++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"tech")},remove(){}},{name:"strange attractor",description:`use ${powerUps.orb.research(2)} to spawn <strong>1</strong> <strong class='color-m'>tech</strong><br>with <strong>double</strong> your <strong class='color-dup'>duplication</strong> chance`,maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>!tech.isSuperDeterminism&&tech.duplicationChance()>0&&powerUps.research.count>1,requires:"NOT EXPERIMENT MODE, some duplication, not super determinism",effect:()=>{powerUps.research.changeRerolls(-2),simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2<br>${powerUps.research.count}`),powerUps.directSpawn(m.pos.x,m.pos.y,"tech"),Math.random()<2*tech.duplicationChance()&&powerUps.directSpawn(m.pos.x+10,m.pos.y+5,"tech")},remove(){}},{name:"vector fields",description:"<strong>triple</strong> the <strong class='flicker'>frequency</strong> of finding <strong class='color-f'>field</strong> <strong class='color-m'>tech</strong><br>spawn a <strong class='color-f'>field</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,isNonRefundable:!0,isBadRandomOption:!0,allowed:()=>!tech.isSuperDeterminism,requires:"NOT EXPERIMENT MODE, not superdeterminism",effect(){powerUps.spawn(m.pos.x,m.pos.y,"field");for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isFieldTech&&(tech.tech[e].frequency*=3)},remove(){}},{name:"reinforcement learning",description:"increase the <strong class='flicker'>frequency</strong> of finding copies of<br>recursive <strong class='color-m'>tech</strong> you already have by <strong>1000%</strong>",maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.totalCount>9,requires:"at least 10 tech",effect:()=>{for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].count>0&&(tech.tech[e].frequency*=10)},remove(){for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].count>0&&tech.tech[e].frequency>1&&(tech.tech[e].frequency/=10)}},{name:"needle ice",description:"when <strong>needles</strong> impact walls<br>they chip off <strong>1-2</strong> freezing <strong class='color-s'>ice IX</strong> crystals",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.isNeedles||tech.isNeedleShot)&&!tech.needleTunnel,requires:"nail gun, needle gun, needle-shot, not nanowires",effect(){tech.isNeedleIce=!0},remove(){tech.isNeedleIce=!1}},{name:"ceramics",description:"<strong>needles</strong> and <strong>harpoons</strong> pierce <strong>shields</strong><br>directly <strong class='color-d'>damaging</strong> shielded mobs",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon")||tech.isNeedles||tech.isNeedleShot,requires:"nail gun, needle gun, needle-shot, harpoon",effect(){tech.isShieldPierce=!0},remove(){tech.isShieldPierce=!1}},{name:"nanowires",description:"<strong>needles</strong> tunnel through <strong class='color-block'>blocks</strong> and <strong>map</strong><br>increase needle <strong class='color-d'>damage</strong> by <strong>20%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.haveGunCheck("nail gun")&&tech.isNeedles||tech.isNeedleShot&&tech.haveGunCheck("shotgun"))&&!tech.isNeedleIce,requires:"needle gun, needle-shot, not needle ice",effect(){tech.needleTunnel=!0},remove(){tech.needleTunnel=!1}},{name:"needle gun",description:"<strong>nail gun</strong> fires <strong>3</strong> mob piercing <strong>needles</strong><br>requires <strong>3</strong> times more <strong>bullets</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("nail gun")&&!tech.nailInstantFireRate&&!tech.isIceCrystals&&!tech.isRivets&&!tech.nailRecoil,requires:"nail gun, not ice crystal, rivets, rotary cannon, or pneumatic actuator",effect(){for(tech.isNeedles=!0,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].ammo=Math.ceil(b.guns[i].ammo/3),b.guns[i].ammoPack=Math.ceil(b.guns[i].defaultAmmoPack/3),b.guns[i].chooseFireMethod(),simulation.updateGunHUD();break}},remove(){if(tech.isNeedles)for(tech.isNeedles=!1,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].chooseFireMethod(),b.guns[i].ammo=Math.ceil(3*b.guns[i].ammo),b.guns[i].ammoPack=b.guns[i].defaultAmmoPack,simulation.updateGunHUD();break}}},{name:"rivet gun",description:"<strong>nail gun</strong> slowly fires a heavy <strong>rivet</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("nail gun")&&!tech.nailInstantFireRate&&!tech.isIceCrystals&&!tech.isNeedles,requires:"nail gun, not ice crystal, needles, or pneumatic actuator",effect(){for(tech.isRivets=!0,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].chooseFireMethod();break}},remove(){if(tech.isRivets)for(tech.isRivets=!1,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].chooseFireMethod();break}}},{name:"pneumatic hammer",description:"<span style = 'font-size:95%;'><strong>rivets</strong>, <strong>slugs</strong>, <strong>needles</strong>, and <strong>nails</strong> are <strong>18%</strong> larger</span><br>increases mass and physical <strong class='color-d'>damage</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isMineDrop+tech.nailBotCount+tech.fragments+tech.nailsDeathMob+2*((tech.haveGunCheck("mine")&&!tech.isLaserMine)+tech.haveGunCheck("nail gun")+tech.isNeedleShot+tech.isNailShot+tech.isSlugShot)>1,requires:"nails, nail gun, rivets, shotgun, slug",effect(){tech.nailSize+=.18},remove(){tech.nailSize=1}},{name:"pneumatic actuator",description:"<strong>nail gun</strong> takes <strong>no</strong> time to ramp up<br>to it's shortest <strong><em>delay</em></strong> after firing",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("nail gun")&&!tech.isRivets&&!tech.isNeedles&&!tech.nailRecoil,requires:"nail gun, not rotary cannon, rivets, or needles",effect(){for(tech.nailInstantFireRate=!0,i=0,len=b.guns.length;i<len;i++)"nail gun"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.nailInstantFireRate)for(tech.nailInstantFireRate=!1,i=0,len=b.guns.length;i<len;i++)"nail gun"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"ice crystal nucleation",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Nucleation\' class="link">ice crystal nucleation</a>',description:"the <strong>nail gun</strong> uses <strong class='color-f'>energy</strong> to condense<br>unlimited <strong class='color-s'>freezing</strong> <strong>ice shards</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("nail gun")&&!tech.isRivets&&!tech.isNeedles,requires:"nail gun, not rivets, needles",effect(){for(tech.isIceCrystals=!0,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].ammoPack=1/0,b.guns[i].recordedAmmo=b.guns[i].ammo,b.guns[i].ammo=1/0,simulation.updateGunHUD();break}},remove(){if(tech.isIceCrystals)for(tech.isIceCrystals=!1,i=0,len=b.guns.length;i<len;i++)if("nail gun"===b.guns[i].name){b.guns[i].ammoPack=b.guns[i].defaultAmmoPack,b.guns[i].recordedAmmo&&(b.guns[i].ammo=b.guns[i].recordedAmmo),simulation.updateGunHUD();break}}},{name:"rotary cannon",description:"<strong>nail gun</strong> has increased muzzle <strong>speed</strong>,<br>maximum <strong>fire rate</strong>, <strong>accuracy</strong>, and <strong>recoil</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("nail gun")&&!tech.nailInstantFireRate&&!tech.isNeedles,requires:"nail gun, not pneumatic actuator, needle gun",effect(){for(tech.nailRecoil=!0,i=0,len=b.guns.length;i<len;i++)"nail gun"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.nailRecoil)for(tech.nailRecoil=!1,i=0,len=b.guns.length;i<len;i++)"nail gun"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"supercritical fission",description:"<strong>nails</strong>, <strong>needles</strong>, and <strong>rivets</strong> can <strong class='color-e'>explode</strong><br>if they strike mobs near their <strong>center</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNailShot||tech.isNeedleShot||tech.nailBotCount>1||tech.haveGunCheck("nail gun"),requires:"nail gun, nails",effect(){tech.isNailCrit=!0},remove(){tech.isNailCrit=!1}},{name:"irradiated nails",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Irradiation\' class="link">irradiated nails</a>',description:"<strong>nails</strong>, <strong>needles</strong>, and <strong>rivets</strong> are <strong class='color-p'>radioactive</strong><br>about <strong>90%</strong> more <strong class='color-d'>damage</strong> over <strong>3</strong> seconds",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isMineDrop+tech.nailBotCount+tech.fragments+tech.nailsDeathMob/2+2*((tech.haveGunCheck("mine")&&!tech.isLaserMine)+(tech.haveGunCheck("nail gun")&&!tech.isShieldPierce)+tech.isNeedleShot+tech.isNailShot)>1,requires:"nail gun, nails, rivets, not ceramic needles",effect(){tech.isNailRadiation=!0},remove(){tech.isNailRadiation=!1}},{name:"6s half-life",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Half-life\' class="link">6s half-life</a>',description:"<strong>nails</strong> are made of <strong class='color-p'>plutonium-238</strong><br>increase <strong class='color-d'>damage</strong> by <strong>100%</strong> over <strong>6</strong> seconds",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNailRadiation&&!tech.isFastRadiation,requires:"irradiated nails, not 1s half-life",effect(){tech.isSlowRadiation=!0},remove(){tech.isSlowRadiation=!1}},{name:"1s half-life",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Half-life\' class="link">1s half-life</a>',description:"<strong>nails</strong> are made of <strong class='color-p'>lithium-8</strong><br><strong class='color-d'>damage</strong> occurs after <strong>1</strong> second",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNailRadiation&&!tech.isSlowRadiation,requires:"irradiated nails, not 6s half-life",effect(){tech.isFastRadiation=!0},remove(){tech.isFastRadiation=!1}},{name:"spin-statistics",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Spin%E2%80%93statistics_theorem\' class="link">spin-statistics</a>',description:"<strong>immune</strong> to <strong class='color-harm'>harm</strong> while firing the <strong>shotgun</strong><br>shotgun has <strong>50%</strong> fewer shots",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun"),requires:"shotgun",effect(){for(tech.isShotgunImmune=!0,i=0,len=b.guns.length;i<len;i++)if("shotgun"===b.guns[i].name){b.guns[i].ammo=Math.ceil(.5*b.guns[i].ammo),b.guns[i].ammoPack=.5*b.guns[i].defaultAmmoPack;break}simulation.updateGunHUD()},remove(){if(tech.isShotgunImmune){for(tech.isShotgunImmune=!1,i=0,len=b.guns.length;i<len;i++)if("shotgun"===b.guns[i].name){b.guns[i].ammoPack=b.guns[i].defaultAmmoPack,b.guns[i].ammo=Math.ceil(2*b.guns[i].ammo);break}simulation.updateGunHUD()}}},{name:"Newton's 3rd law",description:"<strong>shotgun</strong> <strong>recoil</strong> is increased<br>decrease <strong>shotgun</strong> <strong><em>delay</em></strong> after firing by <strong>66%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isShotgunReversed,requires:"shotgun, not Noether violation",effect(){tech.isShotgunRecoil=!0},remove(){tech.isShotgunRecoil=!1}},{name:"Noether violation",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Noether%27s_theorem\' class="link">Noether violation</a>',description:"increase <strong>shotgun</strong> <strong class='color-d'>damage</strong> <strong>60%</strong><br>its <strong>recoil</strong> is increased and <strong>reversed</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isShotgunRecoil,requires:"shotgun, not Newton's 3rd law",effect(){tech.isShotgunReversed=!0},remove(){tech.isShotgunReversed=!1}},{name:"slug",description:"<strong>shotgun</strong> lobs <strong>1</strong> huge <strong>bullet</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isNailShot&&!tech.isIncendiary&&!tech.isIceShot&&!tech.isFoamShot&&!tech.isWormShot&&!tech.isNeedleShot,requires:"shotgun, not nail-shot, foam-shot, worm-shot, ice-shot, needle-shot",effect(){for(tech.isSlugShot=!0,i=0,len=b.guns.length;i<len;i++)if("shotgun"===b.guns[i].name){b.guns[i].do=function(){if(!input.field&&input.down){ctx.beginPath();const e=input.down?212:160,t={x:e*Math.cos(m.angle),y:e*Math.sin(m.angle)},o={x:m.pos.x,y:m.pos.y};for(let e=0;e<20;e++)t.x*=.9712,t.y=.977*t.y+9.87,o.x+=t.x,o.y+=t.y,ctx.lineTo(o.x,o.y);ctx.strokeStyle="rgba(68, 68, 68, 0.2)",ctx.lineWidth=2,ctx.stroke()}};break}},remove(){if(tech.isSlugShot)for(i=0,len=b.guns.length;i<len;i++)if("shotgun"===b.guns[i].name){b.guns[i].do=function(){};break}tech.isSlugShot=!1}},{name:"nail-shot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Nail_(fastener)\' class="link">nail-shot</a>',description:"<strong>shotgun</strong> fires <strong>17</strong> <strong>nails</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isIncendiary&&!tech.isSlugShot&&!tech.isIceShot&&!tech.isFoamShot&&!tech.isWormShot&&!tech.isNeedleShot,requires:"shotgun, not incendiary, slug, foam-shot, worm-shot, ice-shot, needle-shot",effect(){tech.isNailShot=!0},remove(){tech.isNailShot=!1}},{name:"needle-shot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Needle\' class="link">needle-shot</a>',description:"<strong>shotgun</strong> propels <strong>11</strong> mob piercing <strong>needles</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isNailShot&&!tech.isIncendiary&&!tech.isSlugShot&&!tech.isFoamShot&&!tech.isWormShot&&!tech.isIceShot,requires:"shotgun, not incendiary, nail-shot, slug, foam-shot, worm-shot, ice-shot",effect(){tech.isNeedleShot=!0},remove(){tech.isNeedleShot=!1}},{name:"worm-shot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Worm\' class="link">worm-shot</a>',description:"<strong>shotgun</strong> hatches <strong>3-4</strong> mob seeking <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br><em>worms benefit from spore technology</em>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isNailShot&&!tech.isIncendiary&&!tech.isSlugShot&&!tech.isIceShot&&!tech.isFoamShot&&!tech.isNeedleShot,requires:"shotgun, not incendiary, nail-shot, slug, foam-shot, ice-shot, needle-shot",effect(){tech.isWormShot=!0},remove(){tech.isWormShot=!1}},{name:"foam-shot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Foam\' class="link">foam-shot</a>',description:"<strong>shotgun</strong> sprays <strong>13</strong> sticky <strong>foam</strong> bubbles",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isNailShot&&!tech.isIncendiary&&!tech.isSlugShot&&!tech.isIceShot&&!tech.isWormShot&&!tech.isNeedleShot,requires:"shotgun, not incendiary, nail-shot, slug, worm-shot, ice-shot, needle-shot",effect(){tech.isFoamShot=!0},remove(){tech.isFoamShot=!1}},{name:"ice-shot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Ice-nine_(disambiguation)\' class="link">ice-shot</a>',description:"<strong>shotgun</strong> grows <strong>15</strong> freezing <strong class='color-s'>ice IX</strong> crystals",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("shotgun")&&!tech.isNailShot&&!tech.isIncendiary&&!tech.isSlugShot&&!tech.isFoamShot&&!tech.isWormShot&&!tech.isNeedleShot,requires:"shotgun, not incendiary, nail-shot, slug, foam-shot, worm-shot",effect(){tech.isIceShot=!0},remove(){tech.isIceShot=!1}},{name:"supertemporal",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Temporal_paradox\' class="link">supertemporal</a>',description:"fire <strong>super ball</strong> from the same point in <strong>space</strong><br> but separated by <strong>0.1</strong> seconds in <strong>time</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("super balls")&&!tech.oneSuperBall,requires:"super balls, but not the tech super ball",effect(){for(tech.superBallDelay=!0,i=0,len=b.guns.length;i<len;i++)"super balls"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.superBallDelay)for(tech.superBallDelay=!1,i=0,len=b.guns.length;i<len;i++)"super balls"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"super sized",description:"increase <strong>super ball</strong> radius by <strong>14%</strong><br>increases <strong class='color-d'>damage</strong> by about <strong>27%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("super balls"),requires:"super balls",effect(){tech.bulletSize+=.14},remove(){tech.bulletSize=1}},{name:"super duper",description:"randomly fire <strong>+0</strong>, <strong>+1</strong>, or <strong>+2</strong> extra <strong>super balls</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("super balls")&&!tech.oneSuperBall,requires:"super balls, not super ball",effect(){tech.extraSuperBalls+=3},remove(){tech.extraSuperBalls=0}},{name:"super ball",description:"fire just <strong>1 large</strong> super <strong>ball</strong><br>that <strong>stuns</strong> mobs for <strong>3</strong> second",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("super balls")&&!tech.extraSuperBalls&&!tech.superBallDelay,requires:"super balls, not super duper or supertemporal",effect(){for(tech.oneSuperBall=!0,i=0,len=b.guns.length;i<len;i++)"super balls"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.oneSuperBall)for(tech.oneSuperBall=!1,i=0,len=b.guns.length;i<len;i++)"super balls"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"phase velocity",description:"matter wave <strong>propagates</strong> faster through <strong>solids</strong><br>increase matter wave <strong class='color-d'>damage</strong> by <strong>15%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("matter wave")&&!tech.isLongitudinal,requires:"matter wave, not phonon",effect(){tech.isPhaseVelocity=!0},remove(){tech.isPhaseVelocity=!1}},{name:"bound state",description:"wave packets <strong>reflect</strong> backwards <strong>2</strong> times<br><strong>range</strong> is reduced by <strong>25%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("matter wave"),requires:"matter wave",effect(){tech.waveReflections+=2},remove(){tech.waveReflections=1}},{name:"amplitude",description:"wave packet <strong>amplitude</strong> is <strong>33%</strong> higher<br>wave <strong class='color-d'>damage</strong> is increased by <strong>50%</strong>",isGunTech:!0,maxCount:3,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("matter wave"),requires:"matter wave",effect(){tech.waveFrequency*=.66,tech.wavePacketDamage*=1.5},remove(){tech.waveFrequency=.2,tech.wavePacketDamage=1}},{name:"propagation",description:"wave packet propagation <strong>speed</strong> is <strong>20%</strong> slower<br>wave <strong class='color-d'>damage</strong> is increased by <strong>50%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("matter wave"),requires:"matter wave",effect(){tech.waveBeamSpeed*=.8,tech.waveBeamDamage+=.75},remove(){tech.waveBeamSpeed=10,tech.waveBeamDamage=1.5}},{name:"phonon",description:"matter wave emits low <strong>frequency</strong>, high <strong class='color-d'>damage</strong><br><strong>expanding arcs</strong> that propagate through <strong>solids</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("matter wave")&&!tech.isPhaseVelocity&&!tech.isBulletTeleport,requires:"matter wave, not phase velocity, uncertainty principle",effect(){for(tech.isLongitudinal=!0,i=0,len=b.guns.length;i<len;i++)if("matter wave"===b.guns[i].name){b.guns[i].chooseFireMethod(),b.guns[i].ammoPack=b.guns[i].defaultAmmoPack/8,b.guns[i].ammo=Math.ceil(b.guns[i].ammo/8),simulation.updateGunHUD();break}},remove(){if(tech.isLongitudinal)for(i=0,len=b.guns.length;i<len;i++)if("matter wave"===b.guns[i].name){tech.isLongitudinal=!1,b.guns[i].chooseFireMethod(),b.guns[i].ammoPack=b.guns[i].defaultAmmoPack,b.guns[i].ammo=Math.ceil(8*b.guns[i].ammo),simulation.updateGunHUD();break}tech.isLongitudinal=!1}},{name:"isotropic radiator",description:"<strong>matter wave</strong> expands in <strong>all</strong> directions<br><span style = 'font-size:90%;'><strong>range</strong> reduced <strong>40%</strong> and <strong class='color-d'>damage</strong> increased <strong>50%</strong></span>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isLongitudinal,requires:"matter wave, phonon",effect(){for(tech.is360Longitudinal=!0,i=0,len=b.guns.length;i<len;i++)if("matter wave"===b.guns[i].name){b.guns[i].chooseFireMethod();break}},remove(){for(tech.is360Longitudinal=!1,i=0,len=b.guns.length;i<len;i++)if("matter wave"===b.guns[i].name){b.guns[i].chooseFireMethod();break}}},{name:"cruise missile",description:"<strong>missiles</strong> travel <strong>63%</strong> slower,<br>but have a <strong>50%</strong> larger <strong class='color-e'>explosive</strong> payload",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("missiles")||tech.isMissileField||tech.missileBotCount,requires:"missiles",effect(){tech.missileSize=!0},remove(){tech.missileSize=!1}},{name:"missile-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">missile-bot</a>',description:"gain a <strong class='color-bot'>bot</strong> that fires <strong>missiles</strong> at mobs<br>remove your <strong>missile gun</strong>",isGunTech:!0,isRemoveGun:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,isBot:!0,isBotTech:!0,allowed:()=>tech.haveGunCheck("missiles",!1),requires:"missiles",effect(){tech.missileBotCount++,b.missileBot(),tech.haveGunCheck("missiles",!1)&&b.removeGun("missiles")},remove(){this.count&&(tech.missileBotCount=0,b.clearPermanentBots(),b.respawnBots(),tech.haveGunCheck("missiles",!1)||b.giveGuns("missiles"))}},{name:"MIRV",description:"fire <strong>+1</strong> <strong>missile</strong> and <strong>grenade</strong><br>decrease <strong class='color-e'>explosion</strong> <strong>radius</strong> up to <strong>10%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("missiles")||tech.missileBotCount||tech.haveGunCheck("grenades"),requires:"missiles, grenades",effect(){tech.missileCount++},remove(){tech.missileCount=1}},{name:"rocket-propelled grenade",description:"<strong>grenades</strong> rapidly <strong>accelerate</strong> forward<br>map <strong>collisions</strong> trigger an <strong class='color-e'>explosion</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("grenades"),requires:"grenades",effect(){tech.isRPG=!0,b.setGrenadeMode()},remove(){tech.isRPG=!1,b.setGrenadeMode()}},{name:"vacuum bomb",description:"<strong>grenades</strong> fire slower, <strong class='color-e'>explode</strong> bigger<br> and, <strong>suck</strong> everything towards them",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("grenades")&&!tech.isNeutronBomb,requires:"grenades, not neutron bomb",effect(){tech.isVacuumBomb=!0,b.setGrenadeMode()},remove(){tech.isVacuumBomb=!1,b.setGrenadeMode()}},{name:"chain reaction",description:"increase <strong>grenade</strong> radius and <strong class='color-d'>damage</strong> <strong>33%</strong><br><strong class='color-block'>blocks</strong> caught in <strong class='color-e'>explosions</strong> also <strong class='color-e'>explode</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isVacuumBomb&&!tech.isExplodeRadio,requires:"grenades, vacuum bomb, not iridium-192",effect(){tech.isBlockExplode=!0},remove(){tech.isBlockExplode=!1}},{name:"neutron bomb",description:"<strong>grenades</strong> are <strong class='color-p'>irradiated</strong> with <strong class='color-p'>Cf-252</strong><br>does <strong class='color-d'>damage</strong>, <strong class='color-harm'>harm</strong>, and drains <strong class='color-f'>energy</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("grenades")&&!tech.fragments&&!tech.isVacuumBomb,requires:"grenades, not fragmentation, vacuum bomb",effect(){tech.isNeutronBomb=!0,b.setGrenadeMode()},remove(){tech.isNeutronBomb=!1,b.setGrenadeMode()}},{name:"vacuum permittivity",description:"increase <strong class='color-p'>radioactive</strong> range by <strong>20%</strong><br>objects in range of the bomb are <strong>slowed</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNeutronBomb,requires:"grenades, neutron bomb",effect(){tech.isNeutronSlow=!0},remove(){tech.isNeutronSlow=!1}},{name:"radioactive contamination",description:"after a mob or shield <strong>dies</strong>,<br> leftover <strong class='color-p'>radiation</strong> <strong>spreads</strong> to a nearby mob",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNailRadiation||tech.isWormholeDamage||tech.isNeutronBomb||tech.isExplodeRadio,requires:"radiation damage source",effect(){tech.isRadioactive=!0},remove(){tech.isRadioactive=!1}},{name:"water shielding",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Radiation_protection#Radiation_shielding\' class="link">water shielding</a>',description:"<strong class='color-p'>radioactive</strong> effects on you are reduced by 75%<br><em>neutron bomb, drones, explosions, slime</em>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isNeutronBomb||tech.isDroneRadioactive||tech.isExplodeRadio,requires:"neutron bomb or irradiated drones or iridium-192",effect(){tech.isRadioactiveResistance=!0},remove(){tech.isRadioactiveResistance=!1}},{name:"iridium-192",description:"<strong class='color-e'>explosions</strong> release <strong class='color-p'>gamma radiation</strong><br><strong>100%</strong> more <strong class='color-d'>damage</strong>, but over 4 seconds",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>1===tech.explosiveRadius&&!tech.isSmallExplosion&&(tech.haveGunCheck("missiles")||tech.isIncendiary||tech.haveGunCheck("grenades")&&!tech.isNeutronBomb||tech.isPulseLaser||tech.isMissileField||tech.boomBotCount>1||tech.isTokamak),requires:"an explosive damage source, not ammonium nitrate or nitroglycerin",effect:()=>{tech.isExplodeRadio=!0},remove(){tech.isExplodeRadio=!1}},{name:"ammonium nitrate",description:"increase <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong> by <strong>30%</strong><br>increase <strong class='color-e'>explosive</strong> <strong>radius</strong> by <strong>30%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isExplodeRadio&&tech.hasExplosiveDamageCheck(),requires:"an explosive damage source, not iridium-192",effect:()=>{tech.explosiveRadius+=.3},remove(){tech.explosiveRadius=1}},{name:"nitroglycerin",description:"increase <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong> by <strong>66%</strong><br>decrease <strong class='color-e'>explosive</strong> <strong>radius</strong> by <strong>33%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isExplodeRadio&&tech.hasExplosiveDamageCheck(),requires:"an explosive damage source, not iridium-192",effect:()=>{tech.isSmallExplosion=!0},remove(){tech.isSmallExplosion=!1}},{name:"acetone peroxide",description:"increase <strong class='color-e'>explosive</strong> <strong>radius</strong> by <strong>80%</strong>, but<br>you take <strong>300%</strong> more <strong class='color-harm'>harm</strong> from <strong class='color-e'>explosions</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,isBadRandomOption:!0,allowed:()=>tech.hasExplosiveDamageCheck(),requires:"an explosive damage source",effect:()=>{tech.isExplosionHarm=!0},remove(){tech.isExplosionHarm=!1}},{name:"shock wave",description:"<strong class='color-e'>explosions</strong> <strong>stun</strong> mobs for <strong>1-2</strong> seconds<br>decrease <strong class='color-e'>explosive</strong> <strong class='color-d'>damage</strong> by <strong>30%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>!tech.isExplodeRadio&&tech.hasExplosiveDamageCheck(),requires:"an explosive damage source, not iridium-192",effect(){tech.isExplosionStun=!0},remove(){tech.isExplosionStun=!1}},{name:"controlled explosion",description:`use ${powerUps.orb.research(3)} to dynamically <strong>reduce</strong> all<br><strong class='color-e'>explosions</strong> until they do no <strong class='color-harm'>harm</strong>`,isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isImmuneExplosion&&(build.isExperimentSelection||powerUps.research.count>2)&&(tech.haveGunCheck("missiles")||tech.isMissileField||tech.missileBotCount>0||tech.isIncendiary||tech.isPulseLaser||tech.isTokamak||tech.haveGunCheck("grenades")&&!tech.isNeutronBomb),requires:"an explosive damage source, not electric reactive armor",effect:()=>{tech.isSmartRadius=!0;for(let e=0;e<3;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.isSmartRadius=!1,this.count>0&&powerUps.research.changeRerolls(3)}},{name:"electric reactive armor",description:"<strong class='color-harm'>harm</strong> from <strong class='color-e'>explosions</strong> is passively reduced<br>by <strong>5%</strong> for every <strong>10</strong> stored <strong class='color-f'>energy</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isSmartRadius&&!tech.isExplodeRadio&&tech.hasExplosiveDamageCheck(),requires:"an explosive damage source, not iridium-192",effect:()=>{tech.isImmuneExplosion=!0},remove(){tech.isImmuneExplosion=!1}},{name:"incendiary ammunition",description:"<strong>shotgun</strong>, <strong>super balls</strong>, and <strong>drones</strong><br>are loaded with <strong class='color-e'>explosives</strong>",isGunTech:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>("molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isDroneTeleport||tech.isDroneRadioactive||tech.isSporeField||tech.isMissileField||tech.isIceField)||tech.haveGunCheck("drones")&&!tech.isForeverDrones&&!tech.isDroneRadioactive&&!tech.isDroneTeleport||tech.haveGunCheck("super balls")||tech.haveGunCheck("shotgun"))&&!tech.isNailShot&&!tech.isIceShot&&!tech.isFoamShot&&!tech.isWormShot&&!tech.isNeedleShot,requires:"super balls, basic or slug shotgun, drones, not irradiated drones or burst drones",effect(){tech.isIncendiary=!0},remove(){tech.isIncendiary=!1}},{name:"fragmentation",description:"some <strong class='color-e'>detonations</strong> and collisions eject <strong>nails</strong><br><em style = 'font-size: 90%'>blocks, grenades, missiles, slugs, harpoon</em>",isGunTech:!0,maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.haveGunCheck("harpoon")||tech.haveGunCheck("grenades")&&!tech.isNeutronBomb||tech.haveGunCheck("missiles")||tech.missileBotCount||tech.haveGunCheck("shotgun")&&tech.isSlugShot||tech.blockDamage>.075,requires:"grenades, missiles, shotgun slugs, harpoon, or mass driver",effect(){tech.fragments++},remove(){tech.fragments=0}},{name:"booby trap",description:"drop a <strong>mine</strong> after picking up a <strong>power up</strong><br><strong>+53%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("mine"),requires:"mines",effect(){tech.isMineDrop=!0,tech.isMineDrop&&b.mine(m.pos,{x:0,y:0},0),this.refundAmount+=tech.addJunkTechToPool(.53)},refundAmount:0,remove(){tech.isMineDrop=!1,this.count>0&&this.refundAmount>0&&(tech.removeJunkTechFromPool(this.refundAmount),this.refundAmount=0)}},{name:"laser-mines",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Laser\' class="link">laser-mines</a>',description:"<strong>mines</strong> laid while you are <strong>crouched</strong><br>use <strong class='color-f'>energy</strong> to emit <strong>3</strong> unaimed <strong class='color-laser'>lasers</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("mine"),requires:"mines",effect(){tech.isLaserMine=!0},remove(){tech.isLaserMine=!1}},{name:"sentry",description:"instead of detonating, <strong>mines</strong> <strong>target</strong> mobs<br>with a stream of nails for about <strong>17</strong> seconds",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("mine"),requires:"mines",effect(){tech.isMineSentry=!0},remove(){tech.isMineSentry=!1}},{name:"blast mines",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Anti-personnel_mine\' class="link">blast mines</a>',description:"when a <strong>mine</strong> <strong>activates</strong><br>it <strong>stuns</strong> nearby mobs for <strong>2-4</strong> seconds",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("mine"),requires:"mines",effect(){tech.isMineStun=!0},remove(){tech.isMineStun=!1}},{name:"mycelial fragmentation",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Fungus\' class="link">mycelial fragmentation</a>',description:"<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>6</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br>during their <strong>growth</strong> phase",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("spores"),requires:"spore gun",effect(){tech.isSporeGrowth=!0},remove(){tech.isSporeGrowth=!1}},{name:"tinsellated flagella",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Zoospore#Flagella_types\' class="link">tinsellated flagella</a>',description:"<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> accelerate <strong>40% faster</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("spores")||tech.sporesOnDeath>0||tech.isSporeField,requires:"spore gun, spores",effect(){tech.isFastSpores=!0},remove(){tech.isFastSpores=!1}},{name:"cryodesiccation",description:"<strong class='color-p' style='letter-spacing: 2px;'>sporangium</strong> release <strong>2</strong> more <strong class='color-p' style='letter-spacing: 2px;'>spores</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> <strong class='color-s'>freeze</strong> mobs for <strong>1.5</strong> second",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("spores")||tech.sporesOnDeath>0||tech.isSporeField||tech.isWormShot,requires:"spore gun, spores or worms",effect(){tech.isSporeFreeze=!0},remove(){tech.isSporeFreeze=!1}},{name:"diplochory",description:"<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> use you for <strong>dispersal</strong><br>until they <strong>locate</strong> a viable host",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("spores")||tech.sporesOnDeath>0||tech.isSporeField||tech.isWormShot,requires:"spore gun, spores or worms",effect(){tech.isSporeFollow=!0},remove(){tech.isSporeFollow=!1}},{name:"mutualism",description:"increase <strong class='color-p' style='letter-spacing: 2px;'>spore</strong> <strong class='color-d'>damage</strong> by <strong>150%</strong><br><strong class='color-p' style='letter-spacing: 2px;'>spores</strong> borrow <strong>0.5</strong> <strong>health</strong> until they <strong>die</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.haveGunCheck("spores")||tech.sporesOnDeath>0||tech.isSporeField)&&!tech.isEnergyHealth||tech.isWormShot,requires:"spore gun, spores, worms, not mass-energy",effect(){tech.isMutualism=!0},remove(){tech.isMutualism=!1}},{name:"nematodes",description:"<strong class='color-p' style='letter-spacing: 2px;'>spores</strong> develop into <strong>1/2</strong> as many <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br><strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong> do <strong>250%</strong> more <strong class='color-d'>damage</strong>",isGunTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.haveGunCheck("spores")||tech.sporesOnDeath>0||tech.isSporeField||tech.isWormholeSpores,requires:"spore gun, spores",effect(){tech.isSporeWorm=!0},remove(){tech.isSporeWorm=!1}},{name:"annelids",description:"increase <strong class='color-p' style='letter-spacing: -0.8px;'>worm</strong> size and <strong class='color-d'>damage</strong><br>between <strong>10%</strong> and <strong>120%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:3,frequencyDefault:3,allowed:()=>tech.isSporeWorm||tech.isWormShot,requires:"spore gun, shotgun, worms",effect(){tech.wormSize++},remove(){tech.wormSize=0}},{name:"necrophage",description:"if <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong> <strong>kill</strong> their target<br>they reset their <strong>lifespan</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isSporeWorm||tech.isWormShot,requires:"spore gun, shotgun, worms",effect(){tech.wormSurviveDmg=!0},remove(){tech.wormSurviveDmg=!1}},{name:"anti-shear topology",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Topology\' class="link">anti-shear topology</a>',description:"some <strong>projectiles</strong> last <strong>30% longer</strong><br><em style = 'font-size: 83%'>drone, spore, missile, foam, wave, neutron, ice</em>",isGunTech:!0,maxCount:3,count:0,frequency:2,frequencyDefault:2,allowed:()=>"molecular assembler"===m.fieldUpgrades[m.fieldMode].name||tech.haveGunCheck("spores")||tech.haveGunCheck("drones")||tech.haveGunCheck("missiles")||tech.haveGunCheck("foam")||tech.haveGunCheck("matter wave")||tech.isNeutronBomb||tech.isIceField||tech.isIceShot||tech.relayIce||tech.isNeedleIce||tech.blockingIce>1||tech.isWormShot||tech.foamBotCount>1,requires:"drones, spores, missiles, foam, matter wave, neutron bomb, ice IX",effect(){tech.isBulletsLastLonger+=.3},remove(){tech.isBulletsLastLonger=1}},{name:"fault tolerance",description:"spawn <strong>8</strong> <strong>drones</strong> that last <strong>forever</strong><br>remove your <strong>drone gun</strong>",isGunTech:!0,isRemoveGun:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,allowed:()=>tech.haveGunCheck("drones",!1)&&!tech.isDroneRespawn&&1===tech.isBulletsLastLonger,requires:"drones, not drone repair, anti-shear topology",effect(){if(tech.isForeverDrones+=8,tech.haveGunCheck("drones",!1)&&b.removeGun("drones"),tech.isDroneRadioactive)for(let e=0;e<2;e++)b.droneRadioactive({x:m.pos.x+30*(Math.random()-.5),y:m.pos.y+30*(Math.random()-.5)},5),bullet[bullet.length-1].endCycle=1/0;else for(let e=0;e<8;e++)b.drone({x:m.pos.x+30*(Math.random()-.5),y:m.pos.y+30*(Math.random()-.5)},5),bullet[bullet.length-1].endCycle=1/0},remove(){tech.isForeverDrones=0,this.count&&!tech.haveGunCheck("drones",!1)&&b.giveGuns("drones")}},{name:"reduced tolerances",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Engineering_tolerance\' class="link">reduced tolerances</a>',description:`increase <strong>drones</strong> per ${powerUps.orb.ammo()} or <strong class='color-f'>energy</strong> by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>`,isGunTech:!0,maxCount:3,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isDroneRadioactive&&(tech.haveGunCheck("drones")||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isMissileField||tech.isIceField)),requires:"drones, not irradiated drones",effect(){for(tech.droneCycleReduction=Math.pow(.6,1+this.count),tech.droneEnergyReduction=Math.pow(.333,1+this.count),i=0,len=b.guns.length;i<len;i++)if("drones"===b.guns[i].name){const e=Math.pow(3,this.count+1);b.guns[i].ammoPack=b.guns[i].defaultAmmoPack*e}},remove(){for(tech.droneCycleReduction=1,tech.droneEnergyReduction=1,i=0,len=b.guns.length;i<len;i++)"drones"===b.guns[i].name&&(b.guns[i].ammoPack=b.guns[i].defaultAmmoPack)}},{name:"delivery drone",description:"if a <strong>drone</strong> picks up a <strong>power up</strong>,<br>it becomes <strong>larger</strong>, <strong>faster</strong>, and more <strong>durable</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isExtraMaxEnergy&&(tech.haveGunCheck("drones")||tech.isForeverDrones||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isMissileField||tech.isIceField)),requires:"drones, not permittivity",effect(){tech.isDroneGrab=!0},remove(){tech.isDroneGrab=!1}},{name:"drone repair",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Unmanned_aerial_vehicle\' class="link">drone repair</a>',description:"after a <strong>drone</strong> expires it <strong>redeploys</strong><br>for a <strong>25%</strong> chance to use <strong>1</strong> <strong>drone</strong> <strong class='color-ammo'>ammo</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("drones"),requires:"drones",effect(){tech.isDroneRespawn=!0},remove(){tech.isDroneRespawn=!1}},{name:"brushless motor",description:"<strong>drones</strong> rapidly <strong>rush</strong> towards their target<br>increase <strong>drone</strong> collision <strong class='color-d'>damage</strong> by <strong>33%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>(tech.haveGunCheck("drones")||tech.isForeverDrones||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isMissileField||tech.isIceField))&&!tech.isDroneRadioactive&&!tech.isIncendiary,requires:"drones, molecular assembler, not irradiated drones, incendiary",effect(){tech.isDroneTeleport=!0},remove(){tech.isDroneTeleport=!1}},{name:"axial flux motor",description:"<strong>drones</strong> can <strong>rush</strong> <strong>66%</strong> more often<br>increase <strong>drone</strong> collision <strong class='color-d'>damage</strong> by <strong>44%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isDroneTeleport,requires:"drones, brushless motor",effect(){tech.isDroneFastLook=!0},remove(){tech.isDroneFastLook=!1}},{name:"irradiated drones",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Irradiation\' class="link">irradiated drones</a>',description:`the space around <strong>drones</strong> is <strong class='color-p'>irradiated</strong><br>reduce <strong>drones</strong> per ${powerUps.orb.ammo()} or <strong class='color-f'>energy</strong> <strong>75%</strong>`,isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>1===tech.droneCycleReduction&&!tech.isIncendiary&&!tech.isDroneTeleport&&(tech.haveGunCheck("drones")||tech.isForeverDrones||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isMissileField||tech.isIceField)),requires:"drones, not reduced tolerances, incendiary, torque bursts",effect(){for(tech.isDroneRadioactive=!0,i=0,len=b.guns.length;i<len;i++)"drones"===b.guns[i].name&&(b.guns[i].ammoPack=.25*b.guns[i].defaultAmmoPack,b.guns[i].ammo=Math.ceil(.25*b.guns[i].ammo),simulation.makeGunHUD())},remove(){if(tech.isDroneRadioactive)for(tech.isDroneRadioactive=!1,i=0,len=b.guns.length;i<len;i++)"drones"===b.guns[i].name&&(b.guns[i].ammoPack=b.guns[i].defaultAmmoPack,b.guns[i].ammo=4*b.guns[i].ammo,simulation.makeGunHUD())}},{name:"beta radiation",description:"reduce the average <strong>drone</strong> lifetime by <strong>50%</strong><br>increase <strong class='color-p'>radiation</strong> <strong class='color-d'>damage</strong> by <strong>100%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isDroneRadioactive,requires:"drones irradiated drones",effect(){tech.droneRadioDamage=2},remove(){tech.droneRadioDamage=1}},{name:"orthocyclic winding",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Coil_winding_technology\' class="link">orthocyclic winding</a>',description:"<strong>drones</strong> accelerate <strong>66%</strong> faster<br>increase <strong class='color-p'>radiation</strong> <strong class='color-d'>damage</strong> by <strong>33%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isDroneRadioactive,requires:"drones, irradiated drones",effect(){tech.isFastDrones=!0},remove(){tech.isFastDrones=!1}},{name:"capacitor bank",descriptionFunction:()=>`<strong>charge</strong> effects build up almost <strong>instantly</strong><br><em style = 'font-size:97%;'>throwing <strong class='color-block'>blocks</strong>, ${tech.haveGunCheck("foam",!1)?"<strong>foam</strong>":"foam"}, ${tech.isRailGun?"<strong>railgun</strong>":"railgun"}, ${tech.isPulseLaser?"<strong>pulse</strong>":"pulse"}, ${tech.isTokamak?"<strong>tokamak</strong>":"tokamak"}</em>`,isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.blockDamage>.075||tech.haveGunCheck("foam")||tech.isRailGun||tech.isTokamak||tech.isPulseLaser,requires:"throwing blocks, foam, railgun, pulse, tokamak",effect(){tech.isCapacitor=!0},remove(){tech.isCapacitor=!1}},{name:"electrostatic induction",description:"<strong>foam</strong> bubbles are electrically charged<br>causing <strong>attraction</strong> to nearby <strong>mobs</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isBulletTeleport&&(tech.haveGunCheck("foam")||tech.foamBotCount>1||tech.isFoamShot),requires:"foam, not uncertainty",effect(){tech.isFoamAttract=!0},remove(){tech.isFoamAttract=!1}},{name:"uncertainty principle",description:"<strong>foam</strong> and <strong>wave</strong> particle <strong>positions</strong> are random<br>increase their <strong class='color-d'>damage</strong> by <strong>43%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!tech.isFoamAttract&&(tech.haveGunCheck("foam")||tech.foamBotCount>1||tech.isFoamShot)||tech.haveGunCheck("matter wave")&&!tech.isLongitudinal,requires:"foam, not electrostatic induction, matter wave, not phonon",effect(){tech.isBulletTeleport=!0},remove(){tech.isBulletTeleport=!1}},{name:"necrophoresis",description:"<strong>foam</strong> bubbles grow and split into 3 <strong>copies</strong><br> when the mob they are stuck to <strong>dies</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("foam")||tech.foamBotCount>1||tech.isFoamShot,requires:"foam",effect(){tech.isFoamGrowOnDeath=!0},remove(){tech.isFoamGrowOnDeath=!1}},{name:"aerogel",description:"<strong>foam</strong> bubbles <strong>float</strong> and dissipate <strong>50%</strong> faster<br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>150%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("foam")||tech.foamBotCount>1||tech.isFoamShot,requires:"foam",effect(){tech.isFastFoam=!0,tech.foamGravity=-3e-4},remove(){tech.isFastFoam=!1,tech.foamGravity=8e-5}},{name:"quantum foam",description:"<strong>foam</strong> gun fires <strong>0.25</strong> seconds into the <strong>future</strong><br>increase <strong>foam</strong> gun <strong class='color-d'>damage</strong> by <strong>66%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("foam"),requires:"foam",effect(){tech.foamFutureFire++},remove(){tech.foamFutureFire=0}},{name:"foam fractionation",description:"<strong>foam</strong> gun bubbles are <strong>100%</strong> larger<br>when you have below <strong>300</strong> <strong>foam</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("foam"),requires:"foam",effect(){tech.isAmmoFoamSize=!0},remove(){tech.isAmmoFoamSize=!1}},{name:"surfactant",description:"trade your <strong>foam gun</strong> for <strong>2</strong> <strong class='color-bot'>foam-bots</strong><br>and <strong>upgrade</strong> all bots to foam<br>",isGunTech:!0,isRemoveGun:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,isBot:!0,isBotTech:!0,isNonRefundable:!0,requires:"foam gun, NOT EXPERIMENT MODE, bot upgrades, fractionation, quantum foam",allowed:()=>tech.haveGunCheck("foam",!1)&&!b.hasBotUpgrade()&&!tech.isAmmoFoamSize&&!tech.foamFutureFire,effect(){tech.giveTech("foam-bot upgrade");for(let e=0;e<2;e++)b.foamBot(),tech.foamBotCount++;simulation.makeTextLog("tech.isFoamBotUpgrade = true"),tech.haveGunCheck("foam",!1)&&b.removeGun("foam")},remove(){}},{name:"filament",description:"increase the <strong>length</strong> of your <strong>harpoon</strong>'s <strong>rope</strong><br>by <strong>1%</strong> per harpoon <strong class='color-ammo'>ammo</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon"),requires:"harpoon",effect(){tech.isFilament=!0},remove(){tech.isFilament=!1}},{name:"unaaq",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Harpoon#/media/File:Harpon_Unaaq_MHNT_ETH_AC_198.jpg\' class="link">unaaq</a>',description:"increase the <strong>size</strong> of your <strong>harpoon</strong><br>by <strong>10%</strong> of the square root of harpoon <strong class='color-ammo'>ammo</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon"),requires:"harpoon",effect(){tech.isLargeHarpoon=!0},remove(){tech.isLargeHarpoon=!1}},{name:"toggling harpoon",description:"increase the <strong class='color-d'>damage</strong> of your next <strong>harpoon</strong><br>by <strong>800%</strong> after using it to collect a <strong>power up</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon"),requires:"harpoon",effect(){tech.isHarpoonPowerUp=!0},remove(){tech.isHarpoonPowerUp=!1,tech.harpoonDensity=.008}},{name:"reticulum",description:"fire <strong>+1</strong> <strong>harpoon</strong>, but <strong class='color-f'>energy</strong> cost<br>to <strong>retract</strong> also increases",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon"),requires:"harpoon",effect(){tech.extraHarpoons++},remove(){tech.extraHarpoons=0}},{name:"railgun",description:"firing the <strong>harpoon</strong> while crouched launches<br>a rod that is <strong>faster</strong>, <strong>larger</strong>, and more <strong>dense</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("harpoon"),requires:"railgun",effect(){tech.isRailGun=!0},remove(){tech.isRailGun=!1}},{name:"half-wave rectifier",description:"charging the <strong>railgun</strong> gives you <strong class='color-f'>energy</strong><br><em>instead of draining it</em>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isRailGun,requires:"harpoon, railgun",effect(){tech.isRailEnergyGain=!0},remove(){tech.isRailEnergyGain=!1}},{name:"laser diode",description:"all <strong class='color-laser'>lasers</strong> drain <strong>30%</strong> less <strong class='color-f'>energy</strong><br><em>affects laser-gun, laser-bot, laser-mines, pulse</em>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.haveGunCheck("laser")||tech.laserBotCount>1||tech.isLaserMine)&&.17===tech.laserDamage,requires:"laser, not free-electron",effect(){tech.isLaserDiode=.7,tech.laserColor="rgb(0, 11, 255)",tech.laserColorAlpha="rgba(0, 11, 255,0.5)"},remove(){tech.isLaserDiode=1,tech.laserColor="#f02",tech.laserColorAlpha="rgba(255, 0, 0, 0.5)"}},{name:"free-electron laser",description:"increase all <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong> by <strong>200%</strong><br>increase all <strong class='color-laser'>laser</strong> <strong class='color-f'>energy</strong> drain by <strong>250%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.haveGunCheck("laser")||tech.isLaserMine||tech.laserBotCount>1)&&!tech.isPulseLaser&&1===tech.isLaserDiode,requires:"laser, not pulse, diodes",effect(){tech.laserFieldDrain=.007,tech.laserDamage=.51,tech.laserColor="#83f",tech.laserColorAlpha="rgba(136, 51, 255,0.5)"},remove(){tech.laserFieldDrain=.002,tech.laserDamage=.17,tech.laserColor="#f00",tech.laserColorAlpha="rgba(255, 0, 0, 0.5)"}},{name:"relativistic momentum",description:"all <strong class='color-laser'>lasers</strong> push <strong>mobs</strong> and <strong class='color-block'>blocks</strong> away<br><em>affects laser-gun, laser-bot, and laser-mines</em>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("laser")&&!tech.isPulseLaser||tech.laserBotCount>1,requires:"laser, not pulse",effect(){tech.isLaserPush=!0},remove(){tech.isLaserPush=!1}},{name:"specular reflection",description:"<strong>+2</strong> reflection for all <strong class='color-laser'>lasers</strong><br><em>affects laser-gun, laser-bot, and laser-mines</em>",isGunTech:!0,maxCount:3,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.haveGunCheck("laser")||tech.isLaserMine||tech.laserBotCount>1)&&!tech.isWideLaser&&!tech.isPulseLaser&&!tech.historyLaser,requires:"laser, not diffuse beam, pulse, or slow light",effect(){tech.laserReflections+=2},remove(){tech.laserReflections=2}},{name:"diffraction grating",description:"<strong class='color-laser'>laser</strong> gains a <strong>diverging</strong> beam",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("laser")&&!tech.isWideLaser&&!tech.isPulseAim&&!tech.historyLaser,requires:"laser gun, not neocognitron, diffuse beam, or slow light",effect(){for(tech.beamSplitter++,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(0!==tech.beamSplitter)for(tech.beamSplitter=0,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"diffuse beam",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Diffuser_(optics)\' class="link">diffuse beam</a>',description:"<strong class='color-laser'>laser</strong> beam is <strong>wider</strong> and doesn't <strong>reflect</strong><br>increase full beam <strong class='color-d'>damage</strong> by <strong>200%</strong>",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("laser")&&tech.laserReflections<3&&!tech.beamSplitter&&!tech.isPulseLaser&&!tech.historyLaser,requires:"laser gun, not specular reflection, diffraction grating, slow light, pulse",effect(){for(0===tech.wideLaser&&(tech.wideLaser=3),tech.isWideLaser=!0,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.isWideLaser)for(tech.isWideLaser=!1,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"output coupler",description:"<strong>widen</strong> diffuse <strong class='color-laser'>laser</strong> beam by <strong>40%</strong><br>increase full beam <strong class='color-d'>damage</strong> by <strong>40%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isWideLaser,requires:"laser gun, diffuse beam",effect(){for(tech.wideLaser+=2,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){for(tech.isWideLaser?tech.wideLaser=3:tech.wideLaser=0,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"slow light",description:"<strong class='color-laser'>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br>increase total beam <strong class='color-d'>damage</strong> by <strong>300%</strong>",isGunTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("laser")&&tech.laserReflections<3&&!tech.beamSplitter&&!tech.isWideLaser,requires:"laser gun, not specular reflection, diffraction grating, diffuse beam",effect(){for(tech.historyLaser++,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.historyLaser)for(tech.historyLaser=0,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"pulse",description:"charge your <strong class='color-f'>energy</strong> and release it as a<br><strong class='color-laser'>laser</strong> pulse that initiates an <strong class='color-e'>explosion</strong> cluster",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.haveGunCheck("laser")&&tech.laserReflections<3&&!tech.isWideLaser&&.17===tech.laserDamage,requires:"laser gun, not specular reflection, diffuse, free-electron laser",effect(){for(tech.isPulseLaser=!0,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()},remove(){if(tech.isPulseLaser)for(tech.isPulseLaser=!1,i=0,len=b.guns.length;i<len;i++)"laser"===b.guns[i].name&&b.guns[i].chooseFireMethod()}},{name:"neocognitron",description:"<strong class='color-laser'>pulse</strong> automatically <strong>aims</strong> at a nearby mob",isGunTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isPulseLaser&&!tech.beamSplitter,requires:"laser gun, pulse, not diffraction grating",effect(){tech.isPulseAim=!0},remove(){tech.isPulseAim=!1}},{name:"zero point energy",description:`use ${powerUps.orb.research(2)}to increase your <strong>max</strong> <strong class='color-f'>energy</strong> by <strong>100</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>("standing wave"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name)&&(build.isExperimentSelection||powerUps.research.count>1),requires:"standing wave or pilot wave",effect(){tech.harmonicEnergy=1,m.setMaxEnergy();for(let e=0;e<2;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.harmonicEnergy=0,m.setMaxEnergy(),this.count>0&&powerUps.research.changeRerolls(2)}},{name:"spherical harmonics",description:"<strong>standing wave</strong> oscillates in a 3rd dimension<br>increasing <strong>deflecting</strong> efficiency by <strong>40%</strong>",isFieldTech:!0,maxCount:9,count:0,frequency:3,frequencyDefault:3,allowed:()=>"standing wave"===m.fieldUpgrades[m.fieldMode].name,requires:"standing wave",effect(){tech.harmonics++,m.fieldShieldingScale=1.3*Math.pow(.6,tech.harmonics-2),m.harmonicShield=m.harmonicAtomic},remove(){tech.harmonics=2,m.fieldShieldingScale=1.3*Math.pow(.6,tech.harmonics-2),m.harmonicShield=m.harmonic3Phase}},{name:"expansion",description:"using <strong>standing wave</strong> field<br>temporarily <strong>expands</strong> its <strong>radius</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"standing wave"===m.fieldUpgrades[m.fieldMode].name,requires:"standing wave",effect(){tech.isStandingWaveExpand=!0},remove(){tech.isStandingWaveExpand=!1,m.harmonicRadius=1}},{name:"bremsstrahlung",description:"<strong>deflecting</strong> does <strong class='color-d'>damage</strong> to mobs",isFieldTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>"standing wave"===m.fieldUpgrades[m.fieldMode].name||"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name,requires:"standing wave, perfect diamagnetism",effect(){tech.blockDmg+=1.75},remove(){tech.blockDmg=0}},{name:"triple point",description:"the pressure from <strong>deflecting</strong> is used<br>to condense <strong class='color-s'>ice IX</strong> crystals",isFieldTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>"standing wave"===m.fieldUpgrades[m.fieldMode].name||"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name,requires:"standing wave, perfect diamagnetism",effect(){tech.blockingIce++},remove(){tech.blockingIce=0}},{name:"flux pinning",description:"<strong>deflecting</strong> mobs with your <strong>field</strong><br><strong>stuns</strong> them for <strong>4</strong> seconds",isFieldTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name||"standing wave"===m.fieldUpgrades[m.fieldMode].name||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name,requires:"a field that can block",effect(){tech.isStunField+=240},remove(){tech.isStunField=0}},{name:"eddy current brake",description:"project a field that limits the <strong>top speed</strong> of mobs<br>field <strong>radius</strong> scales with stored <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name,requires:"perfect diamagnetism",effect(){tech.isPerfectBrake=!0},remove(){tech.isPerfectBrake=!1}},{name:"Meissner effect",description:"increase <strong>perfect diamagnetism</strong> field<br><strong>radius</strong> by <strong>55%</strong> and circular <strong>arc</strong> by <strong>22°</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name,requires:"perfect diamagnetism",effect(){tech.isBigField=!0},remove(){tech.isBigField=!1}},{name:"tessellation",description:`use ${powerUps.orb.research(2)}to reduce <strong class='color-harm'>harm</strong> by <strong>50%</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>("pilot wave"===m.fieldUpgrades[m.fieldMode].name||"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name||"negative mass"===m.fieldUpgrades[m.fieldMode].name)&&(build.isExperimentSelection||powerUps.research.count>3),requires:"perfect diamagnetism, negative mass, pilot wave",effect(){tech.isFieldHarmReduction=!0;for(let e=0;e<2;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.isFieldHarmReduction=!1,this.count>0&&powerUps.research.changeRerolls(2)}},{name:"neutronium",description:"reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong> when your <strong class='color-f'>field</strong> is active<br><strong>move</strong> and <strong>jump</strong> <strong>33%</strong> <strong>slower</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"negative mass"===m.fieldUpgrades[m.fieldMode].name&&!tech.isEnergyHealth,requires:"negative mass, not mass-energy",effect(){tech.isNeutronium=!0,tech.baseFx*=.66,tech.baseJumpForce*=.66,m.setMovement()},remove(){tech.isNeutronium=!1,tech.isFreeWormHole||(tech.baseFx=.08,tech.baseJumpForce=10.5,m.setMovement())}},{name:"annihilation",description:"<strong>touching</strong> normal mobs <strong>annihilates</strong> them<br>but drains <strong>33%</strong> of your maximum <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"negative mass"===m.fieldUpgrades[m.fieldMode].name,requires:"negative mass",effect(){tech.isAnnihilation=!0},remove(){tech.isAnnihilation=!1}},{name:"inertial mass",description:"<strong>negative mass</strong> is larger and <strong>faster</strong><br><strong class='color-block'>blocks</strong> also move <strong>horizontally</strong> with the field",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"negative mass"===m.fieldUpgrades[m.fieldMode].name,requires:"negative mass",effect(){tech.isFlyFaster=!0},remove(){tech.isFlyFaster=!1}},{name:"pair production",description:"picking up a <strong>power up</strong> gives you <strong>200</strong> <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"molecular assembler"===m.fieldUpgrades[m.fieldMode].name||"standing wave"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name,requires:"molecular assembler or pilot wave",effect:()=>{tech.isMassEnergy=!0,m.energy+=2},remove(){tech.isMassEnergy=!1}},{name:"bot manufacturing",description:`use <strong>molecular assembler</strong> and ${powerUps.orb.research(2)}<br>to build <strong>3</strong> random <strong class='color-bot'>bots</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,isBotTech:!0,isNonRefundable:!0,allowed:()=>powerUps.research.count>1&&"molecular assembler"===m.fieldUpgrades[m.fieldMode].name,requires:"NOT EXPERIMENT MODE, molecular assembler",effect:()=>{for(let e=0;e<2;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1);m.energy=.01,b.randomBot(),b.randomBot(),b.randomBot()},remove(){}},{name:"bot prototypes",description:`use ${powerUps.orb.research(3)}to build<br><strong>2</strong> random <strong class='color-bot'>bots</strong> and <strong>upgrade</strong> all <strong class='color-bot'>bots</strong> to that type`,isFieldTech:!0,maxCount:1,count:0,frequency:1,frequencyDefault:1,isBotTech:!0,isNonRefundable:!0,allowed:()=>powerUps.research.count>2&&"molecular assembler"===m.fieldUpgrades[m.fieldMode].name,requires:"NOT EXPERIMENT MODE, molecular assembler",effect:()=>{for(let e=0;e<3;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1);const e=[];e.push((()=>{tech.giveTech("nail-bot upgrade");for(let e=0;e<2;e++)b.nailBot(),tech.nailBotCount++;simulation.makeTextLog("tech.isNailBotUpgrade = true")})),e.push((()=>{tech.giveTech("foam-bot upgrade");for(let e=0;e<2;e++)b.foamBot(),tech.foamBotCount++;simulation.makeTextLog("tech.isFoamBotUpgrade = true")})),e.push((()=>{tech.giveTech("boom-bot upgrade");for(let e=0;e<2;e++)b.boomBot(),tech.boomBotCount++;simulation.makeTextLog("tech.isBoomBotUpgrade = true")})),e.push((()=>{tech.giveTech("laser-bot upgrade");for(let e=0;e<2;e++)b.laserBot(),tech.laserBotCount++;simulation.makeTextLog("tech.isLaserBotUpgrade = true")})),e.push((()=>{tech.giveTech("orbital-bot upgrade");for(let e=0;e<2;e++)b.orbitBot(),tech.orbitBotCount++;simulation.makeTextLog("tech.isOrbitalBotUpgrade = true")}));for(let t=0;t<2;t++)e.push((()=>{tech.giveTech("dynamo-bot upgrade");for(let e=0;e<2;e++)b.dynamoBot(),tech.dynamoBotCount++;simulation.makeTextLog("tech.isDynamoBotUpgrade = true")}));e[Math.floor(Math.random()*e.length)]()},remove(){}},{name:"mycelium manufacturing",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Mycelium\' class="link">mycelium manufacturing</a>',description:`use ${powerUps.orb.research(1)}to repurpose <strong>molecular assembler</strong><br>excess <strong class='color-f'>energy</strong> used to grow <strong class='color-p' style='letter-spacing: 2px;'>spores</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>(build.isExperimentSelection||powerUps.research.count>0)&&"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isMissileField||tech.isIceField||tech.isFastDrones||tech.isDroneGrab||tech.isDroneRadioactive||tech.isDroneTeleport),requires:"molecular assembler, no other manufacturing, no drone tech",effect(){if(!build.isExperimentSelection)for(let e=0;e<1;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1);tech.isSporeField=!0},remove(){tech.isSporeField=!1,this.count>0&&powerUps.research.changeRerolls(1)}},{name:"missile manufacturing",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Missile\' class="link">missile manufacturing</a>',description:`use ${powerUps.orb.research(1)}to repurpose <strong>molecular assembler</strong><br>excess <strong class='color-f'>energy</strong> used to construct <strong>missiles</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>(build.isExperimentSelection||powerUps.research.count>0)&&m.maxEnergy>.5&&"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isIceField||tech.isFastDrones||tech.isDroneGrab||tech.isDroneRadioactive||tech.isDroneTeleport),requires:"molecular assembler, no other manufacturing, no drone tech",effect(){if(!build.isExperimentSelection)for(let e=0;e<1;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1);tech.isMissileField=!0},remove(){tech.isMissileField=!1,this.count>0&&powerUps.research.changeRerolls(1)}},{name:"ice IX manufacturing",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Ice-nine_(disambiguation)\' class="link">ice IX manufacturing</a>',description:`use ${powerUps.orb.research(1)}to repurpose <strong>molecular assembler</strong><br>excess <strong class='color-f'>energy</strong> used to condense <strong class='color-s'>ice IX</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>(build.isExperimentSelection||powerUps.research.count>0)&&"molecular assembler"===m.fieldUpgrades[m.fieldMode].name&&!(tech.isSporeField||tech.isMissileField||tech.isFastDrones||tech.isDroneGrab||tech.isDroneRadioactive||tech.isDroneTeleport),requires:"molecular assembler, no other manufacturing, no drone tech",effect(){if(!build.isExperimentSelection)for(let e=0;e<1;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1);tech.isIceField=!0},remove(){tech.isIceField=!1,this.count>0&&powerUps.research.changeRerolls(1)}},{name:"degenerate matter",description:"reduce <strong class='color-harm'>harm</strong> by <strong>60%</strong> while your <strong class='color-f'>field</strong> is active",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>("plasma torch"===m.fieldUpgrades[m.fieldMode].name||"perfect diamagnetism"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name)&&!tech.isEnergyHealth,requires:"perfect diamagnetism, pilot wave, plasma, not mass-energy",effect(){tech.isHarmReduce=!0},remove(){tech.isHarmReduce=!1}},{name:"tokamak",description:"throwing a <strong class='color-block'>block</strong> converts it into <strong class='color-f'>energy</strong><br>and a pulsed fusion <strong class='color-e'>explosion</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"plasma torch"===m.fieldUpgrades[m.fieldMode].name||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name,requires:"plasma torch or molecular assembler",effect(){tech.isTokamak=!0},remove(){tech.isTokamak=!1}},{name:"plasma-bot",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Robot\' class="link">plasma-bot</a>',description:"remove your <strong>field</strong> to build a <strong class='color-bot'>bot</strong><br>that uses <strong class='color-f'>energy</strong> to emit <strong class='color-plasma'>plasma</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,isBot:!0,isBotTech:!0,allowed:()=>"plasma torch"===m.fieldUpgrades[m.fieldMode].name&&(build.isExperimentSelection||powerUps.research.count>0),requires:"plasma torch",effect(){tech.plasmaBotCount++,b.plasmaBot(),build.isExperimentSelection&&(document.getElementById("field-"+m.fieldMode).classList.remove("build-field-selected"),document.getElementById("field-0").classList.add("build-field-selected")),m.setField("field emitter")},remove(){this.count>0&&(tech.plasmaBotCount=0,b.clearPermanentBots(),b.respawnBots(),0===m.fieldMode&&(m.setField("plasma torch"),build.isExperimentSelection&&(document.getElementById("field-0").classList.remove("build-field-selected"),document.getElementById("field-"+m.fieldMode).classList.add("build-field-selected"))))}},{name:"plasma jet",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Plasma_(physics)\' class="link">plasma jet</a>',description:`use ${powerUps.orb.research(2)} to increase <strong class='color-plasma'>plasma</strong> <strong>torch</strong> range <strong>50%</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>(tech.plasmaBotCount||"plasma torch"===m.fieldUpgrades[m.fieldMode].name)&&(build.isExperimentSelection||powerUps.research.count>1),requires:"plasma torch",effect(){tech.isPlasmaRange+=.5;for(let e=0;e<2;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.isPlasmaRange=1,this.count>0&&powerUps.research.changeRerolls(2*this.count)}},{name:"extruder",description:"<strong class='color-plasma'>plasma</strong> <strong>torch</strong> <strong class='color-plasma'>extrudes</strong> a thin hot wire<br>increases <strong class='color-d'>damage</strong> and <strong class='color-f'>energy</strong> drain",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"plasma torch"===m.fieldUpgrades[m.fieldMode].name,requires:"plasma torch",effect(){tech.isExtruder=!0,m.fieldUpgrades[m.fieldMode].set()},remove(){tech.isExtruder=!1,this.count&&m.fieldUpgrades[m.fieldMode].set()}},{name:"refractory metal",description:"<strong class='color-plasma'>extrude</strong> metals at a higher <strong class='color-plasma'>temperature</strong><br>increases effective <strong>radius</strong> and <strong class='color-d'>damage</strong>",isFieldTech:!0,maxCount:9,count:0,frequency:2,frequencyDefault:2,allowed:()=>tech.isExtruder,requires:"extruder",effect(){tech.extruderRange+=50},remove(){tech.extruderRange=15}},{name:"retrocausality",description:"<strong>time dilation</strong> uses <strong class='color-f'>energy</strong> to <strong>rewind</strong> your<br><strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong> up to <strong>10 s</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>!("time dilation"!==m.fieldUpgrades[m.fieldMode].name||m.isShipMode||tech.isRewindAvoidDeath||tech.isEnergyHealth||tech.isTimeSkip||tech.isFreezeMobs),requires:"time dilation, not CPT symmetry, mass-energy, timelike, Bose Einstein condensate",effect(){tech.isRewindField=!0,m.fieldUpgrades[m.fieldMode].set(),m.wakeCheck()},remove(){tech.isRewindField=!1,this.count&&m.fieldUpgrades[m.fieldMode].set()}},{name:"timelike",description:"<strong>time dilation</strong> doubles your relative time <strong>rate</strong><br>and makes you immune to <strong class='color-harm'>harm</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"time dilation"===m.fieldUpgrades[m.fieldMode].name&&!m.isShipMode&&!tech.isRewindField,requires:"time dilation, not retrocausality",effect(){tech.isTimeSkip=!0},remove(){tech.isTimeSkip=!1}},{name:"Lorentz transformation",description:`use ${powerUps.orb.research(3)}to increase your time rate<br><strong>move</strong>, <strong>jump</strong>, and <strong>shoot</strong> <strong>50%</strong> faster`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>"time dilation"===m.fieldUpgrades[m.fieldMode].name&&(build.isExperimentSelection||powerUps.research.count>2),requires:"time dilation",effect(){tech.isFastTime=!0,m.setMovement(),b.setFireCD();for(let e=0;e<3;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.isFastTime=!1,m.setMovement(),b.setFireCD(),this.count>0&&powerUps.research.changeRerolls(3)}},{name:"time crystals",description:"<strong>quadruple</strong> your default <strong class='color-f'>energy</strong> regeneration",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"time dilation"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name,requires:"time dilation or pilot wave",effect:()=>{tech.energyRegen=.004,m.fieldRegen=tech.energyRegen},remove(){tech.energyRegen=.001,m.fieldRegen=tech.energyRegen}},{name:"no-cloning theorem",description:"<strong>40%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>after a <strong>mob</strong> <strong>dies</strong>, lose <strong>2%</strong> <strong class='color-dup'>duplication</strong> chance",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"time dilation"===m.fieldUpgrades[m.fieldMode].name||"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name,requires:"cloaking, time dilation",effect(){tech.cloakDuplication=.4,powerUps.setDupChance(),build.isExperimentSelection||simulation.isTextLogOpen||simulation.circleFlare(.4)},remove(){tech.cloakDuplication=0,powerUps.setDupChance()}},{name:"symbiosis",description:"after a <strong>mob</strong> <strong>dies</strong>, lose <strong>0.5</strong> max <strong class='color-h'>health</strong><br><strong>bosses</strong> spawn <strong>1</strong> extra <strong class='color-m'>tech</strong> after they <strong>die</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name||"time dilation"===m.fieldUpgrades[m.fieldMode].name,requires:"cloaking or time dilation",effect(){tech.isAddRemoveMaxHealth=!0},remove(){tech.isAddRemoveMaxHealth=!1}},{name:"boson composite",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Boson\' class="link">boson composite</a>',description:"<strong>intangible</strong> to <strong class='color-block'>blocks</strong> and mobs while <strong class='color-cloaked'>cloaked</strong><br>passing through <strong>shields</strong> drains your <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name,requires:"metamaterial cloaking",effect(){tech.isIntangible=!0},remove(){tech.isIntangible&&(tech.isIntangible=!1,player.collisionFilter.mask=cat.body|cat.map|cat.mob|cat.mobBullet|cat.mobShield)}},{name:"dazzler",description:"<strong class='color-cloaked'>decloaking</strong> <strong>stuns</strong> nearby mobs<br>and drains 10 <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name,requires:"metamaterial cloaking",effect(){tech.isCloakStun=!0},remove(){tech.isCloakStun=!1}},{name:"ambush",description:"metamaterial cloaking field <strong class='color-d'>damage</strong> effect<br>is increased from <span style = 'text-decoration: line-through;'>333%</span> to <strong>666%</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name,requires:"metamaterial cloaking",effect(){tech.sneakAttackDmg=7.66},remove(){tech.sneakAttackDmg=4.33}},{name:"dynamical systems",description:`use ${powerUps.orb.research(2)}to increase your <strong class='color-d'>damage</strong> by <strong>35%</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>("plasma torch"===m.fieldUpgrades[m.fieldMode].name||"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name)&&(build.isExperimentSelection||powerUps.research.count>1),requires:"cloaking, pilot wave, or plasma torch",effect(){tech.isCloakingDamage=!0;for(let e=0;e<2;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.isCloakingDamage=!1,this.count>0&&powerUps.research.changeRerolls(2)}},{name:"discrete optimization",description:"increase <strong class='color-d'>damage</strong> by <strong>40%</strong><br><strong>40%</strong> increased <strong><em>delay</em></strong> after firing",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"plasma torch"===m.fieldUpgrades[m.fieldMode].name||"metamaterial cloaking"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name||"molecular assembler"===m.fieldUpgrades[m.fieldMode].name,requires:"metamaterial cloaking, molecular assembler, plasma torch or pilot wave",effect(){tech.aimDamage=1.4,b.setFireCD()},remove(){tech.aimDamage=1,b.setFireCD()}},{name:"WIMPs",description:`at the end of each <strong>level</strong> spawn ${powerUps.orb.research(5)}<br> and a <strong class='color-harm'>harmful</strong> particle that slowly <strong>chases</strong> you`,isFieldTech:!0,maxCount:9,count:0,frequency:1,frequencyDefault:1,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name||"pilot wave"===m.fieldUpgrades[m.fieldMode].name,requires:"wormhole or pilot wave",effect:()=>{tech.wimpCount++,spawn.WIMP();for(let e=0,t=1+5*Math.random();e<t;e++)powerUps.spawn(level.exit.x+100*(Math.random()-.5),level.exit.y-100+100*(Math.random()-.5),"research",!1)},remove(){tech.wimpCount=0}},{name:"cosmic string",description:"<strong>stun</strong> and do <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong> to <strong>mobs</strong><br>if you tunnel through them with a <strong class='color-worm'>wormhole</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name,requires:"wormhole",effect(){tech.isWormholeDamage=!0},remove(){tech.isWormholeDamage=!1}},{name:"virtual particles",description:`use ${powerUps.orb.research(4)}to exploit your <strong class='color-worm'>wormhole</strong> for a<br><strong>13%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>`,isFieldTech:!0,maxCount:1,count:0,frequency:3,frequencyDefault:3,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name&&(build.isExperimentSelection||powerUps.research.count>3),requires:"wormhole",effect(){tech.wormDuplicate=.13,powerUps.setDupChance(),build.isExperimentSelection||simulation.isTextLogOpen||simulation.circleFlare(.13);for(let e=0;e<4;e++)powerUps.research.count>0&&powerUps.research.changeRerolls(-1)},remove(){tech.wormDuplicate=0,powerUps.setDupChance(),this.count>0&&powerUps.research.changeRerolls(4)}},{name:"Penrose process",description:"after a <strong class='color-block'>block</strong> falls into a <strong class='color-worm'>wormhole</strong><br>you gain <strong>63</strong> <strong class='color-f'>energy</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name,requires:"wormhole",effect(){tech.isWormholeEnergy=!0},remove(){tech.isWormholeEnergy=!1}},{name:"transdimensional spores",link:'<a target="_blank" href=\'https://en.wikipedia.org/wiki/Dimension\' class="link">transdimensional spores</a>',description:"when <strong class='color-block'>blocks</strong> fall into a <strong class='color-worm'>wormhole</strong><br>higher dimension <strong class='color-p' style='letter-spacing: 2px;'>spores</strong> are summoned",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name,requires:"wormhole",effect(){tech.isWormholeSpores=!0},remove(){tech.isWormholeSpores=!1}},{name:"geodesics",description:`your <strong>projectiles</strong> can traverse <strong class='color-worm'>wormholes</strong><br>spawn 2 <strong class='color-g'>guns</strong> and ${powerUps.orb.ammo(2)}`,isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name,requires:"wormhole",effect(){tech.isWormBullets=!0;for(let e=0;e<2;e++)powerUps.spawn(m.pos.x,m.pos.y,"gun"),powerUps.spawn(m.pos.x,m.pos.y,"ammo")},remove(){if(tech.isWormBullets){for(let e=0;e<2;e++)b.inventory.length&&b.removeGun(b.guns[b.inventory[b.inventory.length-1]].name);tech.isWormBullets=!1}}},{name:"charmed baryons",description:"<strong class='color-worm'>wormholes</strong> require <strong>zero</strong> <strong class='color-f'>energy</strong><br><strong>move</strong> and <strong>jump</strong> <strong>33%</strong> <strong>slower</strong>",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name&&!tech.isWormholeMapIgnore,requires:"wormhole, not affine connection",effect(){tech.isFreeWormHole=!0,tech.baseFx*=.66,tech.baseJumpForce*=.66,m.setMovement()},remove(){tech.isFreeWormHole=!1,tech.isNeutronium||(tech.baseFx=.08,tech.baseJumpForce=10.5,m.setMovement())}},{name:"affine connection",description:"<strong class='color-worm'>wormholes</strong> can tunnel through the <strong>map</strong><br>at <strong>200%</strong> increased <strong class='color-f'>energy</strong> cost",isFieldTech:!0,maxCount:1,count:0,frequency:2,frequencyDefault:2,allowed:()=>"wormhole"===m.fieldUpgrades[m.fieldMode].name&&!tech.isFreeWormHole,requires:"wormhole, not charmed baryons",effect(){tech.isWormholeMapIgnore=!0},remove(){tech.isWormholeMapIgnore=!1}},{name:"-ship-",description:"<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection&&!m.isShipMode&&"negative mass"!==m.fieldUpgrades[m.fieldMode].name,requires:"",effect(){m.shipMode()},remove(){}},{name:"-quantum leap-",description:"<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an <strong class='alt'>alternate</strong> version of yourself",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",interval:void 0,effect(){this.interval=setInterval((()=>{build.isExperimentSelection||(m.switchWorlds(),simulation.trails())}),2e4)},remove(){this.count>0&&clearTimeout(this.interval)}},{name:"-shields-",description:"<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){this.interval=setInterval((()=>{if(!build.isExperimentSelection)for(let e=0;e<mob.length;e++)mob[e].isShielded||mob[e].shield||!mob[e].isDropPowerUp||spawn.shield(mob[e],mob[e].position.x,mob[e].position.y,1,!0)}),5e3)},interval:void 0,remove(){this.count>0&&clearTimeout(this.interval)}},{name:"-Fourier analysis-",description:"<strong style='color: #f55;'>experiment:</strong> your aiming is random",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection&&!m.isShipMode,requires:"not ship",effect(){m.look=()=>{m.angle=2*Math.sin(.0133*m.cycle)+Math.sin(.013*m.cycle)+.5*Math.sin(.031*m.cycle)+.33*Math.sin(.03*m.cycle);m.transSmoothX=canvas.width2-m.pos.x-.8*(simulation.mouse.x-canvas.width2),m.transSmoothY=canvas.height2-m.pos.y-.8*(simulation.mouse.y-canvas.height2),m.transX+=.07*(m.transSmoothX-m.transX),m.transY+=.07*(m.transSmoothY-m.transY)}},remove(){this.count>0&&(m.look=m.lookDefault())}},{name:"-panopticon-",description:"<strong style='color: #f55;'>experiment:</strong> mobs can always see you",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){this.interval=setInterval((()=>{if(!build.isExperimentSelection)for(let e=0;e<mob.length;e++)!mob[e].shield&&mob[e].isDropPowerUp&&(mob[e].locatePlayer(),mob[e].seePlayer.yes=!0)}),1e3)},interval:void 0,remove(){this.count>0&&clearTimeout(this.interval)}},{name:"-decomposers-",description:"<strong style='color: #f55;'>experiment:</strong> after they die<br>mobs leave behind spawns",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){tech.deathSpawns=.2},remove(){tech.deathSpawns=0}},{name:"-WIMP-",description:"<strong style='color: #f55;'>experiment:</strong> <strong class='color-harm'>harmful</strong> particles slowly <strong>chase</strong> you",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){tech.wimpExperiment=5},remove(){tech.wimpExperiment=0}},{name:"-symbiosis-",description:"<strong style='color: #f55;'>experiment:</strong> if you <strong>kill</strong> a <strong>mob</strong><br>lose <strong>0.2</strong> max <strong class='color-h'>health</strong>",maxCount:1,count:0,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){tech.removeMaxHealthOnKill=.002},remove(){tech.removeMaxHealthOnKill=0}},{name:"-parthenocarpy-",description:"<strong style='color: #f55;'>experiment:</strong> spawn about 50% more mobs",maxCount:1,count:1,frequency:0,isBadRandomOption:!0,isExperimentalMode:!0,allowed:()=>build.isExperimentSelection,requires:"",effect(){tech.isMoreMobs=!0},remove(){tech.isMoreMobs=!1}},{name:"brainstorm",description:"the <strong class='color-m'>tech</strong> choice menu <strong>randomizes</strong><br>every <strong>0.5</strong> seconds for <strong>10</strong> seconds",maxCount:1,count:0,frequency:0,frequencyDefault:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){tech.isBrainstorm=!0,tech.isBrainstormActive=!1,tech.brainStormDelay=30},remove(){tech.isBrainstorm=!1,tech.isBrainstormActive=!1}},{name:"catabolysis",description:"set your <strong>maximum</strong> <strong class='color-h'>health</strong> to <strong>1</strong><br><strong>double</strong> your current <strong class='color-ammo'>ammo</strong> <strong>10</strong> times",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!tech.isFallingDamage&&!tech.isOverHeal&&!tech.isEnergyHealth,requires:"not quenching, tungsten carbide, mass-energy",effect(){m.baseHealth=.01,m.setMaxHealth();for(let e=0;e<b.guns.length;e++)b.guns[e].ammo=b.guns[e].ammo*Math.pow(2,10);simulation.updateGunHUD()},remove(){}},{name:"density",description:"<strong class='color-block'>block</strong> are <strong>10</strong> times less <strong>dense</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<body.length;e++)Matter.Body.setDensity(body[e],1e-4);level.addToWorld=()=>{for(let e=0;e<body.length;e++)body[e]===m.holdingTarget||body[e].isNoSetCollision||(body[e].collisionFilter.category=cat.body,body[e].collisionFilter.mask=cat.player|cat.map|cat.body|cat.bullet|cat.mob|cat.mobBullet),Matter.Body.setDensity(body[e],1e-4),body[e].classType="body",Composite.add(engine.world,body[e]);for(let e=0;e<map.length;e++)map[e].collisionFilter.category=cat.map,map[e].collisionFilter.mask=cat.player|cat.map|cat.body|cat.bullet|cat.powerUp|cat.mob|cat.mobBullet,Matter.Body.setStatic(map[e],!0),Composite.add(engine.world,map[e])}},remove(){this.count&&(m.look=m.lookDefault)}},{name:"palantÃr",description:"see far away lands",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){m.look=()=>{m.angle=Math.atan2(simulation.mouseInGame.y-m.pos.y,simulation.mouseInGame.x-m.pos.x);m.transSmoothX=canvas.width2-m.pos.x-2*(simulation.mouse.x-canvas.width2),m.transSmoothY=canvas.height2-m.pos.y-2*(simulation.mouse.y-canvas.height2),m.transX+=(m.transSmoothX-m.transX)*m.lookSmoothing,m.transY+=(m.transSmoothY-m.transY)*m.lookSmoothing}},remove(){this.count&&(m.look=m.lookDefault)}},{name:"motion sickness",description:"disable camera smoothing",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){m.look=()=>{m.angle=Math.atan2(simulation.mouseInGame.y-m.pos.y,simulation.mouseInGame.x-m.pos.x);const e=1.2;m.transSmoothX=canvas.width2-m.pos.x-(simulation.mouse.x-canvas.width2)*e,m.transSmoothY=canvas.height2-m.pos.y-(simulation.mouse.y-canvas.height2)*e,m.transX=canvas.width2-m.pos.x-(simulation.mouse.x-canvas.width2)*e,m.transY=canvas.height2-m.pos.y-(simulation.mouse.y-canvas.height2)*e}},remove(){this.count&&(m.look=m.lookDefault)}},{name:"planetesimals",description:'play <strong>planetesimals</strong><br><em>(an annoying asteroids game with Newtonian physics)</em><br>clearing a <strong>level</strong> in <strong>planetesimals</strong> spawns a <strong class=\'color-m\'>tech</strong> in <strong>n-gon</strong><br>but, if you <strong style="color:red;">die</strong> in <strong>planetesimals</strong> you <strong style="color:red;">die</strong> in <strong>n-gon</strong>',maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){window.open("../../planetesimals/index.html","_blank");const e=new BroadcastChannel("planetesimals");e.activated=!1,e.onmessage=function(t){"tech"===t.data&&powerUps.directSpawn(m.pos.x,m.pos.y,"tech"),"death"===t.data&&(m.death(),e.close()),"ready"!==t.data||e.activated||(e.activated=!0,e.postMessage("activate"))}},remove(){}},{name:"facsimile",description:"inserts a copy of your current level into the level list",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){level.levels.splice(level.onLevel,0,level.levels[level.onLevel])},remove(){}},{name:"negative friction",description:"when you touch walls you speed up instead of slowing down. It's kinda fun.",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){player.friction=-.4},remove(){this.count&&(player.friction=.002)}},{name:"bounce",description:"you bounce off things. It's annoying, but not that bad.",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){player.restitution=.9},remove(){this.count&&(player.restitution=0)}},{name:"mouth",description:"mobs have a non functional mouth",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){mobs.draw=()=>{ctx.lineWidth=2;let e=mob.length;for(;e--;){ctx.beginPath();const t=mob[e].vertices;ctx.moveTo(t[0].x,t[0].y);for(let e=1,o=t.length;e<o;++e)ctx.lineTo(t[e].x,t[e].y);ctx.quadraticCurveTo(mob[e].position.x,mob[e].position.y,t[0].x,t[0].y),ctx.fillStyle=mob[e].fill,ctx.strokeStyle=mob[e].stroke,ctx.fill(),ctx.stroke()}}},remove(){mobs.draw=()=>{ctx.lineWidth=2;let e=mob.length;for(;e--;){ctx.beginPath();const t=mob[e].vertices;ctx.moveTo(t[0].x,t[0].y);for(let e=1,o=t.length;e<o;++e)ctx.lineTo(t[e].x,t[e].y);ctx.lineTo(t[0].x,t[0].y),ctx.fillStyle=mob[e].fill,ctx.strokeStyle=mob[e].stroke,ctx.fill(),ctx.stroke()}}}},{name:"all-stars",description:"make all mobs look like stars",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){mobs.draw=()=>{ctx.lineWidth=2;let e=mob.length;for(;e--;){ctx.beginPath();const t=mob[e].vertices;ctx.moveTo(t[0].x,t[0].y);for(let o=1,n=t.length;o<n;++o)ctx.quadraticCurveTo(mob[e].position.x,mob[e].position.y,t[o].x,t[o].y);ctx.quadraticCurveTo(mob[e].position.x,mob[e].position.y,t[0].x,t[0].y),ctx.fillStyle=mob[e].fill,ctx.strokeStyle=mob[e].stroke,ctx.fill(),ctx.stroke()}}},remove(){mobs.draw=()=>{ctx.lineWidth=2;let e=mob.length;for(;e--;){ctx.beginPath();const t=mob[e].vertices;ctx.moveTo(t[0].x,t[0].y);for(let e=1,o=t.length;e<o;++e)ctx.lineTo(t[e].x,t[e].y);ctx.lineTo(t[0].x,t[0].y),ctx.fillStyle=mob[e].fill,ctx.strokeStyle=mob[e].stroke,ctx.fill(),ctx.stroke()}}}},{name:"true colors",description:"set all power ups to their real world colors",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){const e=shuffle([powerUps.research.color,powerUps.heal.color,powerUps.ammo.color,powerUps.ammo.color,powerUps.field.color,powerUps.gun.color]);powerUps.research.color=e[0],powerUps.heal.color=e[1],powerUps.ammo.color=e[2],powerUps.field.color=e[3],powerUps.tech.color=e[4],powerUps.gun.color=e[5];for(let t=0;t<powerUp.length;t++)switch(powerUp[t].name){case"research":powerUp[t].color=e[0];break;case"heal":powerUp[t].color=e[1];break;case"ammo":powerUp[t].color=e[2];break;case"field":powerUp[t].color=e[3];break;case"tech":powerUp[t].color=e[4];break;case"gun":powerUp[t].color=e[5]}},remove(){const e=["#f7b","#0eb","#467","#0cf","hsl(246,100%,77%)","#26a"];powerUps.research.color=e[0],powerUps.heal.color=e[1],powerUps.ammo.color=e[2],powerUps.field.color=e[3],powerUps.tech.color=e[4],powerUps.gun.color=e[5];for(let t=0;t<powerUp.length;t++)switch(powerUp[t].name){case"research":powerUp[t].color=e[0];break;case"heal":powerUp[t].color=e[1];break;case"ammo":powerUp[t].color=e[2];break;case"field":powerUp[t].color=e[3];break;case"tech":powerUp[t].color=e[4];break;case"gun":powerUp[t].color=e[5]}}},{name:"emergency broadcasting",description:"emit 2 sound sine waveforms at 853 Hz and 960 Hz<br><em>lower your volume</em>",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,isNonRefundable:!0,allowed:()=>!0,requires:"",effect:()=>{let e=function(){const e=new(window.AudioContext||window.webkitAudioContext),t=e.createOscillator(),o=e.createGain();o.gain.value=.3,t.connect(o),o.connect(e.destination),t.type="sine",t.frequency.value=853,t.start();const n=e.createOscillator(),r=e.createGain();return r.gain.value=.3,n.connect(r),r.connect(e.destination),n.type="sine",n.frequency.value=960,n.start(),e}();delay=1e3,setTimeout((()=>{e.suspend(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal"),setTimeout((()=>{e.resume(),setTimeout((()=>{e.suspend(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal"),setTimeout((()=>{e.resume(),setTimeout((()=>{e.suspend(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal"),setTimeout((()=>{e.resume(),setTimeout((()=>{e.suspend(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal"),setTimeout((()=>{e.resume(),setTimeout((()=>{e.suspend(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal"),setTimeout((()=>{e.resume(),setTimeout((()=>{e.suspend(),e.close(),powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal")}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)}),delay)},remove(){}},{name:"automatic",description:"you can't fire when moving<br>always <strong>fire</strong> when at <strong>rest</strong>",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!tech.isFireMoveLock,requires:"not Higgs mechanism",effect:()=>{tech.isAlwaysFire=!0,b.setFireMethod()},remove(){tech.isAlwaysFire&&(tech.isAlwaysFire=!1,b.setFireMethod())}},{name:"hidden variable",description:`spawn ${powerUps.orb.heal(15)}<br>but hide your <strong class='color-h'>health</strong> bar`,maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!tech.isEnergyHealth,requires:"not mass-energy",effect(){document.getElementById("health").style.display="none",document.getElementById("health-bg").style.display="none";for(let e=0;e<15;e++)powerUps.spawn(m.pos.x+160*(Math.random()-.5),m.pos.y+160*(Math.random()-.5),"heal")},remove(){}},{name:"not a bug",description:"initiate a totally safe game crash for 5 seconds",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){const e=simulation.drawCircle;simulation.drawCircle=()=>{mob[1/0].position},setTimeout((()=>{simulation.drawCircle=e,canvas.width=canvas.width}),5e3)},remove(){}},{name:"posture",description:"stand a bit taller",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"",effect(){m.yOffWhen.stand=70},remove(){m.yOffWhen.stand=49}},{name:"rhythm",description:"you oscillate up and down",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,isNonRefundable:!0,allowed:()=>!m.isShipMode,requires:"",effect(){setInterval((()=>{m.yOffWhen.stand=53+28*Math.sin(.2*simulation.cycle),m.onGround&&!m.crouch&&(m.yOffGoal=m.yOffWhen.stand)}),100)},remove(){}},{name:"spinor",description:"the direction you aim is determined by your position",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isNonRefundable:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"",effect(){m.look=function(){m.angle=((m.pos.x+m.pos.y)/100+Math.PI)%Math.PI*2-Math.PI;m.transSmoothX=canvas.width2-m.pos.x-.8*(simulation.mouse.x-canvas.width2),m.transSmoothY=canvas.height2-m.pos.y-.8*(simulation.mouse.y-canvas.height2),m.transX+=.07*(m.transSmoothX-m.transX),m.transY+=.07*(m.transSmoothY-m.transY)}},remove(){this.count&&(m.look=m.lookDefault)}},{name:"decomposers",description:"after they die <strong>mobs</strong> leave behind <strong>spawns</strong>",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isNonRefundable:!0,isJunk:!0,allowed:()=>0===tech.deathSpawns,requires:"",effect(){tech.deathSpawns=.2},remove(){tech.deathSpawns=0}},{name:"panopticon",description:"<strong>mobs</strong> can always see you",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isNonRefundable:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){setInterval((()=>{for(let e=0;e<mob.length;e++)!mob[e].shield&&mob[e].isDropPowerUp&&(mob[e].locatePlayer(),mob[e].seePlayer.yes=!0)}),1e3)},remove(){}},{name:"Fourier analysis",description:"your aiming is now controlled by this equation:<br>2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",maxCount:1,count:0,frequency:0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"not ship",effect(){m.look=()=>{m.angle=2*Math.sin(.0133*m.cycle)+Math.sin(.013*m.cycle)+.5*Math.sin(.031*m.cycle)+.33*Math.sin(.03*m.cycle);simulation.mouse.y,m.transSmoothX=canvas.width2-m.pos.x-.8*(simulation.mouse.x-canvas.width2),m.transSmoothY=canvas.height2-m.pos.y-.8*(simulation.mouse.y-canvas.height2),m.transX+=.07*(m.transSmoothX-m.transX),m.transY+=.07*(m.transSmoothY-m.transY)}},remove(){this.count&&(m.look=m.lookDefault)}},{name:"disintegrated armament",description:"spawn a <strong class='color-g'>gun</strong><br><strong>remove</strong> your active <strong class='color-g'>gun</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>b.inventory.length>0,requires:"at least 1 gun",effect(){b.inventory.length>0&&b.removeGun(b.guns[b.activeGun].name),simulation.makeGunHUD(),powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"gun")},remove(){}},{name:"probability",description:"increase the <strong class='flicker'>frequency</strong><br>of one random <strong class='color-m'>tech</strong> by <strong>100</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){let e=[];for(let t=0,o=tech.tech.length;t<o;t++)tech.tech[t].count<tech.tech[t].maxCount&&tech.tech[t].allowed()&&!tech.tech[t].isJunk&&!tech.tech.isLore&&e.push(t);if(e.length){const t=e[Math.floor(Math.random()*e.length)];tech.tech[t].frequency=100}},remove(){}},{name:"encryption",description:"secure <strong class='color-m'>tech</strong> information",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){String.prototype.shuffle=function(){for(var e=this.split(""),t=e.length-1;t>0;t--){var o=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[o],e[o]=n}return e.join("")};for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].name=tech.tech[e].name.shuffle()},remove(){}},{name:"transparency",description:"become invisible to yourself<br><em>mobs can still see you</em>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){m.draw=()=>{}},remove(){}},{name:"quantum leap",description:"become an <strong class='alt'>alternate</strong> version of yourself<br>every <strong>20</strong> seconds",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){setInterval((()=>{m.switchWorlds(),simulation.trails()}),2e4)},remove(){}},{name:"score",description:"Add a score to n-gon!",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){setInterval((()=>{let e=Math.ceil(1e3*Math.random()*Math.random()*Math.random()*Math.random()*Math.random());simulation.makeTextLog(`simulation.score <span class='color-symbol'>=</span> ${e.toFixed(0)}`)}),1e4)},remove(){}},{name:"pop-ups",description:"sign up to learn endless easy ways to win n-gon<br>that Landgreen doesn't want you to know!!!1!!",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){setInterval((()=>{alert(`The best combo is ${tech.tech[Math.floor(Math.random()*tech.tech.length)].name} with ${tech.tech[Math.floor(Math.random()*tech.tech.length)].name}!`)}),3e4)},remove(){}},{name:"music",description:"add music to n-gon",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){window.open("https://www.youtube.com/results?search_query=music","_blank")},remove(){}},{name:"performance",description:"display performance stats to n-gon",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){var e;(e=document.createElement("script")).onload=function(){var e=new Stats;document.body.appendChild(e.dom),requestAnimationFrame((function t(){e.update(),requestAnimationFrame(t)}))},e.src="https://unpkg.com/[email protected]/build/stats.min.js",document.head.appendChild(e),document.getElementById("health").style.left="86px",document.getElementById("health-bg").style.left="86px"},remove(){}},{name:"repartitioning",description:"set the <strong class='flicker'>frequency</strong> of finding normal <strong class='color-m'>tech</strong> to <strong>0</strong><br>spawn 5 <strong class='color-m'>tech</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0,t=tech.tech.length;e<t;e++)tech.tech[e].isJunk?tech.tech[e].frequency=2:tech.tech[e].frequency=0;for(let e=0;e<5;e++)powerUps.spawn(m.pos.x,m.pos.y,"tech")},remove(){}},{name:"defragment",description:"set the <strong class='flicker'>frequency</strong> of finding <strong class='color-j'>JUNK</strong> <strong class='color-m'>tech</strong> to zero",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=tech.tech.length-1;e>0;e--)tech.tech[e].isJunk&&(tech.tech[e].frequency=0)},remove(){}},{name:"ship",description:"fly around with no legs<br>reduce combat <strong>difficulty</strong> by <strong>1 level</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode&&"negative mass"!==m.fieldUpgrades[m.fieldMode].name,requires:"",effect(){m.shipMode(),level.difficultyDecrease(simulation.difficultyMode)},remove(){}},{name:"pitch",description:"oscillate the pitch of your world",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){setInterval((()=>{simulation.paused||ctx.rotate(.001*Math.sin(.01*simulation.cycle))}),16)},remove(){}},{name:"umbra",description:"produce a blue glow around everything<br>and probably some simulation lag",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){ctx.shadowColor="#06f",ctx.shadowBlur=25},remove(){}},{name:"lighter",description:'ctx.globalCompositeOperation = "lighter"',maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>"negative mass"!==m.fieldUpgrades[m.fieldMode].name,requires:"",effect(){ctx.globalCompositeOperation="lighter"},remove(){}},{name:"rewind",description:"every 5 seconds <strong class='color-rewind'>rewind</strong> <strong>2</strong> seconds<br>lasts 120 seconds",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<24;e++)setTimeout((()=>{m.rewind(120)}),5e3*e)},remove(){}},{name:"energy to mass conversion",description:"convert your <strong class='color-f'>energy</strong> into <strong class='color-block'>blocks</strong>",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0,t=40;e<t;e++)setTimeout((()=>{m.energy-=1/t;const e=body.length;where=Vector.add(m.pos,{x:400*(Math.random()-.5),y:400*(Math.random()-.5)}),spawn.bodyRect(where.x,where.y,Math.floor(15+100*Math.random()),Math.floor(15+100*Math.random())),body[e].collisionFilter.category=cat.body,body[e].collisionFilter.mask=cat.player|cat.map|cat.body|cat.bullet|cat.mob|cat.mobBullet,body[e].classType="body",Composite.add(engine.world,body[e])}),100*e)},remove(){}},{name:"level.nextLevel()",description:"advance to the next level",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){level.nextLevel()},remove(){}},{name:"expert system",description:"spawn a <strong class='color-m'>tech</strong> power up<br><strong>+64%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){powerUps.spawn(m.pos.x,m.pos.y,"tech"),tech.addJunkTechToPool(.64)},remove(){}},{name:"energy investment",description:"every 10 seconds drain your <strong class='color-f'>energy</strong><br>return it doubled 10 seconds later<br>lasts 180 seconds",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<18;e++)setTimeout((()=>{const e=m.energy;m.energy=0,setTimeout((()=>{m.energy+=2*e}),5e3)}),1e4*e)},remove(){}},{name:"missile Launching System",description:"fire missiles for the next 60 seconds",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<60;e++)setTimeout((()=>{const e={x:m.pos.x,y:m.pos.y-40};b.missile(e,-Math.PI/2+.2*(Math.random()-.5)*Math.sqrt(tech.missileCount),-2)}),1e3*e)},remove(){}},{name:"grenade production",description:"drop grenades for the next 120 seconds",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<120;e++)setTimeout((()=>{b.grenade(Vector.add(m.pos,{x:10*(Math.random()-.5),y:10*(Math.random()-.5)}),-Math.PI/2);const e=bullet[bullet.length-1];Matter.Body.setVelocity(e,{x:.1*e.velocity.x,y:.1*e.velocity.y})}),1e3*e)},remove(){}},{name:"Sleipnir",description:"grow more legs",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"",effect(){m.draw=function(){ctx.fillStyle=m.fillColor,m.walk_cycle+=m.flipLegs*m.Vx,ctx.save(),ctx.globalAlpha=m.immuneCycle<m.cycle?1:.5,ctx.translate(m.pos.x,m.pos.y);for(let e=0;e<16;e++)m.calcLeg(Math.PI*e/8,-3*e/16),m.drawLeg("#444");ctx.rotate(m.angle),ctx.beginPath(),ctx.arc(0,0,30,0,2*Math.PI),ctx.fillStyle=this.bodyGradient,ctx.fill(),ctx.arc(15,0,4,0,2*Math.PI),ctx.strokeStyle="#333",ctx.lineWidth=2,ctx.stroke(),ctx.restore(),m.yOff=.85*m.yOff+.15*m.yOffGoal}},remove(){}},{name:"diegesis",description:"indicate gun fire <strong><em>delay</em></strong><br>through a rotation of your head",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"",effect(){m.draw=function(){ctx.fillStyle=m.fillColor,m.walk_cycle+=m.flipLegs*m.Vx,ctx.save(),ctx.globalAlpha=m.immuneCycle<m.cycle?1:.5,ctx.translate(m.pos.x,m.pos.y),m.calcLeg(Math.PI,-3),m.drawLeg("#4a4a4a"),m.calcLeg(0,0),m.drawLeg("#333"),ctx.rotate(m.angle-(m.fireCDcycle!=1/0?.25*m.flipLegs*Math.pow(Math.max(m.fireCDcycle-m.cycle,0),.5):0)),ctx.beginPath(),ctx.arc(0,0,30,0,2*Math.PI),ctx.fillStyle=this.bodyGradient,ctx.fill(),ctx.arc(15,0,4,0,2*Math.PI),ctx.strokeStyle="#333",ctx.lineWidth=2,ctx.stroke(),ctx.restore(),m.yOff=.85*m.yOff+.15*m.yOffGoal}},remove(){}},{name:"pareidolia",description:"don't",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!m.isShipMode,requires:"",effect(){m.draw=function(){ctx.fillStyle=m.fillColor,m.walk_cycle+=m.flipLegs*m.Vx,ctx.save(),ctx.globalAlpha=m.immuneCycle<m.cycle?1:.7,ctx.translate(m.pos.x,m.pos.y),m.calcLeg(Math.PI,-3),m.drawLeg("#4a4a4a"),m.calcLeg(0,0),m.drawLeg("#333"),ctx.rotate(m.angle),ctx.beginPath(),ctx.arc(0,0,30,0,2*Math.PI),ctx.fillStyle=this.bodyGradient,ctx.fill(),ctx.strokeStyle="#333",ctx.lineWidth=2,m.angle>-Math.PI/2&&m.angle<Math.PI/2||ctx.scale(1,-1),ctx.stroke(),ctx.beginPath(),ctx.arc(2,-6,7,0,2*Math.PI),ctx.stroke(),ctx.beginPath(),ctx.arc(25,-6,7,.25*Math.PI,1.6*Math.PI),ctx.stroke(),ctx.beginPath(),ctx.arc(2,-10,9,1.25*Math.PI,1.75*Math.PI),ctx.stroke(),ctx.beginPath(),ctx.arc(25,-10,9,1.25*Math.PI,1.4*Math.PI),ctx.stroke(),ctx.beginPath(),ctx.arc(18,13,10,0,2*Math.PI),ctx.fillStyle=this.bodyGradient,ctx.fill(),ctx.stroke(),ctx.beginPath(),ctx.arc(18,13,6,0,2*Math.PI),ctx.fillStyle="#555",ctx.fill(),ctx.stroke(),ctx.beginPath(),ctx.arc(3,-6,3,0,2*Math.PI),ctx.fill(),ctx.stroke(),ctx.beginPath(),ctx.arc(26,-6,3,0,2*Math.PI),ctx.fill(),ctx.stroke(),ctx.restore(),m.yOff=.85*m.yOff+.15*m.yOffGoal}},remove(){}},{name:"prism",description:"you cycle through different <strong>colors</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){m.color={hue:0,sat:100,light:50},setInterval((function(){m.color.hue++,m.setFillColors()}),10)},remove(){}},{name:"assimilation",description:"all your <strong class='color-bot'>bots</strong> are converted to the <strong>same</strong> random model",maxCount:1,count:0,frequency:0,isBotTech:!0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>b.totalBots()>2,requires:"at least 3 bots",effect(){const e=b.totalBots();tech.dynamoBotCount=0,tech.nailBotCount=0,tech.laserBotCount=0,tech.orbitBotCount=0,tech.foamBotCount=0,tech.boomBotCount=0,tech.plasmaBotCount=0,tech.missileBotCount=0;for(let e=0;e<bullet.length;e++)bullet[e].botType&&(bullet[e].endCycle=0);const t=[()=>{b.nailBot(),tech.nailBotCount++},()=>{b.foamBot(),tech.foamBotCount++},()=>{b.boomBot(),tech.boomBotCount++},()=>{b.laserBot(),tech.laserBotCount++},()=>{b.orbitBot(),tech.orbitBotCount++},()=>{b.dynamoBot(),tech.dynamoBotCount++}],o=Math.floor(Math.random()*t.length);for(let n=0;n<e;n++)t[o]()},remove(){}},{name:"growth hacking",description:"increase combat <strong>difficulty</strong> by <strong>1 level</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){level.difficultyIncrease(simulation.difficultyMode)},remove(){}},{name:"stun",description:"<strong>stun</strong> all mobs for up to <strong>8</strong> seconds",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){for(let e=0;e<mob.length;e++)mobs.statusStun(mob[e],480)},remove(){}},{name:"re-arm",description:"remove all your <strong class='color-g'>guns</strong>,<br>and <strong>spawn</strong> new ones",maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>b.inventory.length>0,requires:"at least 1 gun",effect(){for(let e=0;e<b.inventory.length;e++)powerUps.spawn(m.pos.x+60*(Math.random()-.5),m.pos.y+60*(Math.random()-.5),"gun");b.inventory=[],b.activeGun=null,b.inventoryGun=0;for(let e=0,t=b.guns.length;e<t;++e)b.guns[e].have=!1,b.guns[e].ammo!==1/0&&(b.guns[e].ammo=0);simulation.makeGunHUD()},remove(){}},{name:"re-research",description:`<strong>eject</strong> all your ${powerUps.orb.research(1)}`,maxCount:9,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>powerUps.research.count>3,requires:"at least 4 research",effect(){const e=10*powerUps.research.count+100;for(let t=0;t<powerUps.research.count;t++)powerUps.directSpawn(m.pos.x+e*(Math.random()-.5),m.pos.y+e*(Math.random()-.5),"research");powerUps.research.count=0},remove(){}},{name:"quantum black hole",description:`use your <strong class='color-f'>energy</strong> and ${powerUps.orb.research(4)} to <strong>spawn</strong><br>inside the event horizon of a huge <strong>black hole</strong>`,maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>powerUps.research.count>3,requires:"at least 4 research",effect(){m.energy=0,spawn.suckerBoss(m.pos.x,m.pos.y-700),powerUps.research.changeRerolls(-4),simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>--</span><br>${powerUps.research.count}`)},remove(){}},{name:"black hole cluster",description:"spawn <strong>30</strong> nearby <strong>black holes</strong>",maxCount:1,count:0,frequency:0,isNonRefundable:!0,isExperimentHide:!0,isJunk:!0,allowed:()=>!0,requires:"",effect(){const e={x:1,y:0};for(let t=0;t<30;t++){const t=Vector.add(m.pos,Vector.mult(Vector.rotate(e,2*Math.random()*Math.PI),2e3+1200*Math.random()));spawn.sucker(t.x,t.y,140);mob[mob.length-1].locatePlayer()}},remove(){}},{name:"undefined",description:'<strong class="lore-text">this</strong>',maxCount:1,count:0,frequency:3,frequencyDefault:3,isLore:!0,isExperimentHide:!0,allowed:()=>!0,requires:"",effect(){setTimeout((()=>{lore.techCount++,lore.techCount===lore.techGoal?(this.frequency=0,this.description='<strong class="lore-text">null</strong> is open at level.final()'):(this.frequency+=2*lore.techGoal,this.description=`<em>uncaught error:</em><br><strong>${Math.max(0,lore.techGoal-lore.techCount)}</strong> more required for access to <strong class="lore-text">null</strong>`)}),1)},remove(){lore.techCount=0,this.maxCount=lore.techGoal,this.description='<strong class="lore-text">this</strong>'}}],fireRate:null,bulletSize:null,energySiphon:null,healthDrain:null,isCrouchAmmo:null,isBulletsLastLonger:null,isImmortal:null,sporesOnDeath:null,isImmuneExplosion:null,isExplodeMob:null,isDroneOnDamage:null,isAcidDmg:null,isAnnihilation:null,largerHeals:null,squirrelFx:null,isCrit:null,isLowHealthDmg:null,isFarAwayDmg:null,isEntanglement:null,isMassEnergy:null,isExtraChoice:null,laserBotCount:null,dynamoBotCount:null,nailBotCount:null,foamBotCount:null,boomBotCount:null,plasmaBotCount:null,missileBotCount:null,orbitBotCount:null,collisionImmuneCycles:null,blockDmg:null,isPiezo:null,isFastDrones:null,isFastSpores:null,oneSuperBall:null,laserReflections:null,laserDamage:null,laserFieldDrain:null,isAmmoFromHealth:null,mobSpawnWithHealth:null,isEnergyRecovery:null,isHealthRecovery:null,isEnergyLoss:null,isDeathAvoid:null,isDeathAvoidedThisLevel:null,isSporeField:null,isMissileField:null,isIceField:null,isPlasmaRange:null,isFreezeMobs:null,isIceCrystals:null,blockDamage:null,isBlockStun:null,isStunField:null,isHarmDamage:null,energyRegen:null,isVacuumBomb:null,renormalization:null,fragments:null,isEnergyDamage:null,botSpawner:null,isBotSpawnerReset:null,isSporeFollow:null,isNailRadiation:null,isEnergyHealth:null,isExplosionStun:null,restDamage:null,isRPG:null,missileCount:null,isDeterminism:null,isSuperDeterminism:null,isHarmReduce:null,nailsDeathMob:null,isSlowFPS:null,isNeutronStun:null,isAnsatz:null,isDamageFromBulletCount:null,isLaserDiode:null,isNailShot:null,slowFire:null,fastTime:null,squirrelJump:null,isFastRadiation:null,isExtraMaxEnergy:null,isAmmoForGun:null,isRapidPulse:null,isPulseAim:null,isSporeFreeze:null,isShotgunRecoil:null,isHealLowHealth:null,isAoESlow:null,isHarmArmor:null,isTurret:null,isRerollDamage:null,isHarmFreeze:null,isBotArmor:null,isRerollHaste:null,researchHaste:null,isMineDrop:null,isRerollBots:null,isNailBotUpgrade:null,isFoamBotUpgrade:null,isLaserBotUpgrade:null,isBoomBotUpgrade:null,isOrbitBotUpgrade:null,isDroneGrab:null,isOneGun:null,isDamageForGuns:null,isGunCycle:null,isFastFoam:null,isSporeGrowth:null,isStimulatedEmission:null,nailGun:null,nailInstantFireRate:null,isCapacitor:null,isEnergyNoAmmo:null,isSmallExplosion:null,isExplosionHarm:null,extraMaxHealth:null,isIntangible:null,isCloakStun:null,bonusEnergy:null,healGiveMaxEnergy:null,healMaxEnergyBonus:0,aimDamage:null,isNoFireDefense:null,isNoFireDamage:null,duplicateChance:null,beamSplitter:null,iceEnergy:null,isPerfectBrake:null,explosiveRadius:null,isWormholeEnergy:null,isWormholeDamage:null,isNailCrit:null,isFlechetteExplode:null,isWormholeSpores:null,isWormBullets:null,isWideLaser:null,wideLaser:null,isPulseLaser:null,isRadioactive:null,isRailEnergyGain:null,isMineSentry:null,isIncendiary:null,overfillDrain:null,isNeutronSlow:null,historyLaser:null,isSpeedHarm:null,isSpeedDamage:null,isTimeSkip:null,isCancelDuplication:null,cancelCount:null,isCancelRerolls:null,isBotDamage:null,isBanish:null,isMaxEnergyTech:null,isLowEnergyDamage:null,isRewindBot:null,isRewindGrenade:null,isExtruder:null,isEndLevelPowerUp:null,missileSize:null,isLaserMine:null,isAmmoFoamSize:null,isIceIX:null,isDupDamage:null,isFireRateForGuns:null,cyclicImmunity:null,isTechDamage:null,isRestHarm:null,isFireMoveLock:null,isRivets:null,isNeedles:null,isExplodeRadio:null,isPauseSwitchField:null,isShieldPierce:null,isDuplicateBoss:null,is111Duplicate:null,isDynamoBotUpgrade:null,isBlockPowerUps:null,foamFutureFire:null,isDamageAfterKillNoRegen:null,isHarmReduceNoKill:null,isSwitchReality:null,isResearchReality:null,isAnthropicDamage:null,isFlipFlop:null,isFlipFlopHarm:null,isFlipFlopOn:null,isFlipFlopLevelReset:null,isFlipFlopDamage:null,isFlipFlopEnergy:null,isRelay:null,relayIce:null,isMetaAnalysis:null,isFoamAttract:null,droneCycleReduction:null,droneEnergyReduction:null,isNoHeals:null,isAlwaysFire:null,isDroneRespawn:null,deathSpawns:null,isMobBlockFling:null,blockingIce:null,isPhaseVelocity:null,waveBeamSpeed:null,wavePacketAmplitude:null,isCollisionRealitySwitch:null,iceIXOnDeath:null,wimpCount:null,isAddBlockMass:null,isMACHO:null,isHarmMACHO:null,isSneakAttack:null,isFallingDamage:null,harmonics:null,isStandingWaveExpand:null,isTokamak:null,superBallDelay:null,isBlockExplode:null,isOverHeal:null,isDroneRadioactive:null,droneRadioDamage:null,isDroneTeleport:null,isDroneFastLook:null,isBulletTeleport:null,isResearchBoss:null,isJunkResearch:null,junkResearchNumber:null,laserColor:null,laserColorAlpha:null,isLongitudinal:null,is360Longitudinal:null,isShotgunReversed:null,wormDuplicate:null,isCloakingDamage:null,harmonicEnergy:null,isFieldHarmReduction:null,isFastTime:null,isAnthropicTech:null,isSporeWorm:null,isWormShot:null,isFoamShot:null,isIceShot:null,isNeedleShot:null,isBlockRestitution:null,isZeno:null,isFieldFree:null,wormSurviveDmg:null,isExtraGunField:null,isBigField:null,isMineStun:null,isSmartRadius:null,isFilament:null,isLargeHarpoon:null,extraHarpoons:null,ammoCap:null,isHarpoonPowerUp:null,harpoonDensity:null,isAddRemoveMaxHealth:null,removeMaxHealthOnKill:null,isSpawnExitTech:null,cloakDuplication:null,extruderRange:null,isForeverDrones:null,isMoreMobs:null,nailRecoil:null,baseJumpForce:null,baseFx:null,isNeutronium:null,isFreeWormHole:null,isRewindField:null,isCrouchRegen:null,isDarts:null,OccamDamage:null,isAxion:null,isWormholeMapIgnore:null,isLessDamageReduction:null,nailSize:null,needleTunnel:null,isBrainstorm:null,isBrainstormActive:null,brainStormDelay:null,wormSize:null,extraSuperBalls:null};