const mod = { totalCount: null, setupAllMods() { for (let i = 0, len = mod.mods.length; i < len; i++) { mod.mods[i].remove(); mod.mods[i].count = 0 if (mod.mods[i].isLost) mod.mods[i].isLost = false; } mod.armorFromPowerUps = 0; mod.totalCount = 0; game.updateModHUD(); }, removeMod(index) { mod.mods[index].remove(); mod.mods[index].count = 0; game.updateModHUD(); }, giveMod(index = 'random') { if (index === 'random') { let options = []; for (let i = 0; i < mod.mods.length; i++) { if (mod.mods[i].count < mod.mods[i].maxCount && mod.mods[i].allowed()) options.push(i); } // give a random mod from the mods I don't have if (options.length > 0) { let newMod = options[Math.floor(Math.random() * options.length)] mod.giveMod(newMod) } } else { if (isNaN(index)) { //find index by name let found = false; for (let i = 0; i < mod.mods.length; i++) { if (index === mod.mods[i].name) { index = i; found = true; break; } } if (!found) return //if name not found don't give any mod } if (mod.mods[index].isLost) mod.mods[index].isLost = false; //give specific mod mod.mods[index].effect(); //give specific mod mod.mods[index].count++ mod.totalCount++ //used in power up randomization game.updateModHUD(); } }, // giveBasicMod(index = 'random') { // // if (isNaN(index)) { //find index by name // // let found = false; // // for (let i = 0; i < mod.mods.length; i++) { // // if (index === mod.mods[i].name) { // // index = i; // // found = true; // // break; // // } // // } // // if (!found) return //if name not found don't give any mod // // } // mod.basicMods[index].effect(); //give specific mod // mod.mods[index].count++ // mod.totalCount++ //used in power up randomization // game.updateModHUD(); // }, haveGunCheck(name) { if ( !build.isCustomSelection && b.inventory.length > 2 && name !== b.guns[b.activeGun].name && Math.random() > 2 / (b.inventory.length + mod.isGunCycle * 3) //lower chance of mods specific to a gun if you have lots of guns ) { return false } for (i = 0, len = b.inventory.length; i < len; i++) { if (b.guns[b.inventory[i]].name === name) return true } return false }, damageFromMods() { let dmg = mech.fieldDamage // if (mod.aimDamage>1) if (mod.isEnergyNoAmmo) dmg *= 1.4 if (mod.isDamageForGuns) dmg *= 1 + 0.07 * b.inventory.length if (mod.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - mech.health) if (mod.isHarmDamage && mech.lastHarmCycle + 600 > mech.cycle) dmg *= 2; if (mod.isEnergyLoss) dmg *= 1.43; if (mod.isAcidDmg && mech.health > 1) dmg *= 1.4; if (mod.restDamage > 1 && player.speed < 1) dmg *= mod.restDamage if (mod.isEnergyDamage) dmg *= 1 + mech.energy / 5.5; if (mod.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.0038 if (mod.isRerollDamage) dmg *= 1 + 0.05 * powerUps.reroll.rerolls if (mod.isOneGun && b.inventory.length < 2) dmg *= 1.25 return dmg * mod.slowFire * mod.aimDamage }, totalBots() { return mod.foamBotCount + mod.nailBotCount + mod.laserBotCount + mod.boomBotCount + mod.plasmaBotCount }, mods: [{ name: "integrated armament", description: "increase damage by 25%
your inventory can only hold 1 gun", maxCount: 1, count: 0, allowed() { return b.inventory.length < 2 }, requires: "no more than 1 gun", effect() { mod.isOneGun = true; }, remove() { mod.isOneGun = false; } }, { name: "capacitor", description: "increase damage by 1%
for every 5.5% stored energy", maxCount: 1, count: 0, allowed() { return mech.maxEnergy > 1 || mod.isEnergyRecovery || mod.isPiezo || mod.energySiphon > 0 }, requires: "increased energy regen or max energy", effect: () => { mod.isEnergyDamage = true }, remove() { mod.isEnergyDamage = false; } }, { name: "exciton-lattice", description: `increase damage by 40%, but
ammo will no longer spawn`, maxCount: 1, count: 0, allowed() { return (mod.haveGunCheck("nail gun") && mod.isIceCrystals) || mod.haveGunCheck("laser") || mod.haveGunCheck("pulse") || mech.fieldUpgrades[mech.fieldMode].name === "plasma torch" || mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || mech.fieldUpgrades[mech.fieldMode].name === "pilot wave" }, requires: "energy based damage", effect() { mod.isEnergyNoAmmo = true; }, remove() { mod.isEnergyNoAmmo = false; } }, { name: "acute stress response", description: "increase damage by 43%
if a mob dies drain stored energy by 25%", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.isEnergyLoss = true; }, remove() { mod.isEnergyLoss = false; } }, { name: "rest frame", description: "increase damage by 25%
when not moving", maxCount: 6, count: 0, allowed() { return true }, requires: "", effect: () => { mod.restDamage += 0.25 }, remove() { mod.restDamage = 1; } }, { name: "kinetic bombardment", description: "increase damage by up to 33%
at a distance of 40 steps from the target", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.isFarAwayDmg = true; //used in mob.damage() }, remove() { mod.isFarAwayDmg = false; } }, { name: "fluoroantimonic acid", description: "increase damage by 40%
when your base health is above 100%", maxCount: 1, count: 0, allowed() { return mech.maxHealth > 1; }, requires: "health above 100%", effect() { mod.isAcidDmg = true; }, remove() { mod.isAcidDmg = false; } }, { name: "negative feedback", description: "increase damage by 6%
for every 10% missing base health", maxCount: 1, count: 0, allowed() { return mech.health < 0.6 || build.isCustomSelection }, requires: "health below 60%", effect() { mod.isLowHealthDmg = true; //used in mob.damage() }, remove() { mod.isLowHealthDmg = false; } }, { name: "radiative equilibrium", description: "for 10 seconds after receiving harm
increase damage by 100%", maxCount: 1, count: 0, allowed() { return mech.harmReduction() < 1 }, requires: "some harm reduction", effect() { mod.isHarmDamage = true; }, remove() { mod.isHarmDamage = false; } }, { name: "perturbation theory", description: "increase damage by 5%
for each of your rerolls", maxCount: 1, count: 0, allowed() { return powerUps.reroll.rerolls > 3 || build.isCustomSelection }, requires: "at least 4 rerolls", effect() { mod.isRerollDamage = true; }, remove() { mod.isRerollDamage = false; } }, { name: "Ψ(t) collapse", description: "50% decreased delay after firing
if you have no rerolls", maxCount: 1, count: 0, allowed() { return powerUps.reroll.rerolls === 0 && !mod.manyWorlds }, requires: "no rerolls", effect() { mod.isRerollHaste = true; mod.rerollHaste = 0.5; b.setFireCD(); }, remove() { mod.isRerollHaste = false; mod.rerollHaste = 1; b.setFireCD(); } }, { name: "electrostatic discharge", description: "increase damage by 20%
20% increased delay after firing", maxCount: 1, count: 0, allowed() { return true }, effect() { mod.slowFire = 1.2 b.setFireCD(); }, remove() { mod.slowFire = 1; b.setFireCD(); } }, { name: "auto-loading heuristics", description: "25% decreased delay after firing", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.fireRate *= 0.75 b.setFireCD(); }, remove() { mod.fireRate = 1; b.setFireCD(); } }, { name: "mass driver", description: "increase block collision damage by 100%
charge throws more quickly for less energy", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.throwChargeRate = 2 }, remove() { mod.throwChargeRate = 1 } }, { name: "reaction inhibitor", description: "mobs spawn with 12% less health", maxCount: 3, count: 0, allowed() { return true }, requires: "", effect: () => { mod.mobSpawnWithHealth *= 0.88 //set all mobs at full health to 0.85 for (let i = 0; i < mob.length; i++) { if (mob.health > mod.mobSpawnWithHealth) mob.health = mod.mobSpawnWithHealth } }, remove() { mod.mobSpawnWithHealth = 1; } }, { name: "zoospore vector", description: "mobs produce spores when they die
9% chance", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.sporesOnDeath += 0.09; for (let i = 0; i < 10; i++) { b.spore(mech.pos) } }, remove() { mod.sporesOnDeath = 0; } }, { name: "impact shear", description: "mobs release a nail when they die
nails target nearby mobs", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect: () => { mod.nailsDeathMob++ }, remove() { mod.nailsDeathMob = 0; } }, { name: "thermal runaway", description: "mobs explode when they die
be careful", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect: () => { mod.isExplodeMob = true; }, remove() { mod.isExplodeMob = false; } }, { name: "trinitrotoluene", description: "increase explosive damage by 50%
decrease explosive area by 71%", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("missiles") || mod.haveGunCheck("flak") || mod.haveGunCheck("grenades") || mod.haveGunCheck("vacuum bomb") || mod.haveGunCheck("pulse") || mod.isMissileField || mod.boomBotCount > 1; }, requires: "an explosive damage source", effect: () => { mod.isSmallExplosion = true; }, remove() { mod.isSmallExplosion = false; } }, { name: "ammonium nitrate", description: "increase explosive area by 60%, but
you take 300% more harm from explosions", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("missiles") || mod.haveGunCheck("flak") || mod.haveGunCheck("grenades") || mod.haveGunCheck("vacuum bomb") || mod.haveGunCheck("pulse") || mod.isMissileField }, requires: "an explosive damage source", effect: () => { mod.isExplosionHarm = true; }, remove() { mod.isExplosionHarm = false; } }, { name: "electric reactive armor", // description: "explosions do no harm
while your energy is above 98%", description: "harm from explosions is passively reduced
by 6% for every 10 stored energy", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("missiles") || mod.haveGunCheck("flak") || mod.haveGunCheck("grenades") || mod.haveGunCheck("vacuum bomb") || mod.isMissileField || mod.isExplodeMob }, requires: "an explosive damage source", effect: () => { mod.isImmuneExplosion = true; }, remove() { mod.isImmuneExplosion = false; } }, { name: "scrap bots", description: "11% chance to build a bot after killing a mob
the bot only functions until the end of the level", maxCount: 6, count: 0, allowed() { return mod.totalBots() > 0 }, requires: "a bot", effect() { mod.isBotSpawner += 0.11; }, remove() { mod.isBotSpawner = 0; } }, { name: "bot fabrication", description: "anytime you collect 4 rerolls
use them to build a random bot", maxCount: 1, count: 0, allowed() { return powerUps.reroll.rerolls > 3 || build.isCustomSelection }, requires: "at least 4 rerolls", effect() { mod.isRerollBots = true; powerUps.reroll.changeRerolls(0) }, remove() { mod.isRerollBots = false; } }, { name: "nail-bot", description: "a bot fires nails at targets in line of sight", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.nailBotCount++; b.nailBot(); }, remove() { mod.nailBotCount = 0; } }, { name: "nail-bot upgrade", description: "100% increased nail-bot fire rate
applies to all current and future nail-bots", maxCount: 1, count: 0, allowed() { return mod.nailBotCount > 1 }, requires: "2 or more nail bots", effect() { mod.isNailBotUpgrade = true for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'nail') bullet[i].isUpgraded = true } }, remove() { mod.isNailBotUpgrade = false for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'nail') bullet[i].isUpgraded = false } } }, { name: "foam-bot", description: "a bot fires foam at targets in line of sight", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.foamBotCount++; b.foamBot(); }, remove() { mod.foamBotCount = 0; } }, { name: "foam-bot upgrade", description: "100% increased foam-bot foam size
applies to all current and future foam-bots", maxCount: 1, count: 0, allowed() { return mod.foamBotCount > 1 }, requires: "2 or more foam bots", effect() { mod.isFoamBotUpgrade = true for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'foam') bullet[i].isUpgraded = true } }, remove() { mod.isFoamBotUpgrade = false for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'foam') bullet[i].isUpgraded = false } } }, { name: "boom-bot", description: "a bot defends the space around you
ignites an explosion after hitting a mob", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.boomBotCount++; b.boomBot(); }, remove() { mod.boomBotCount = 0; } }, { name: "boom-bot upgrade", description: "100% increased boom-bot explosion size
applies to all current and future boom-bots", maxCount: 1, count: 0, allowed() { return mod.boomBotCount > 1 }, requires: "2 or more boom bots", effect() { mod.isBoomBotUpgrade = true for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'boom') bullet[i].isUpgraded = true } }, remove() { mod.isBoomBotUpgrade = false for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'boom') bullet[i].isUpgraded = false } } }, { name: "laser-bot", description: "a bot defends the space around you
uses a short range laser that drains energy", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.laserBotCount++; b.laserBot(); }, remove() { mod.laserBotCount = 0; } }, { name: "laser-bot upgrade", description: "100% increased laser-bot damage
applies to all current and future laser-bots", maxCount: 1, count: 0, allowed() { return mod.laserBotCount > 1 }, requires: "2 or more laser bots", effect() { mod.isLaserBotUpgrade = true for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'laser') bullet[i].isUpgraded = true } }, remove() { mod.isLaserBotUpgrade = false for (let i = 0; i < bullet.length; i++) { if (bullet[i].botType = 'laser') bullet[i].isUpgraded = false } } }, { name: "perimeter defense", description: "reduce harm by 4%
for each of your permanent bots", maxCount: 1, count: 0, allowed() { return mod.totalBots() > 4 && !mod.isEnergyHealth }, requires: "5 or more bots", effect() { mod.isBotArmor = true }, remove() { mod.isBotArmor = false } }, { name: "bot replication", description: "duplicate your permanent bots
remove all of your guns", maxCount: 1, count: 0, // isNonRefundable: true, isCustomHide: true, allowed() { return mod.totalBots() > 3 }, requires: "at least 3 bots", effect() { b.removeAllGuns(); game.makeGunHUD(); //double bots for (let i = 0; i < mod.nailBotCount; i++) { b.nailBot(); } mod.nailBotCount *= 2 for (let i = 0; i < mod.laserBotCount; i++) { b.laserBot(); } mod.laserBotCount *= 2 for (let i = 0; i < mod.foamBotCount; i++) { b.foamBot(); } mod.foamBotCount *= 2 for (let i = 0; i < mod.boomBotCount; i++) { b.boomBot(); } mod.boomBotCount *= 2 for (let i = 0; i < mod.plasmaBotCount; i++) { b.plasmaBot(); } mod.plasmaBotCount *= 2 }, remove() {} }, { name: "ablative drones", description: "rebuild your broken parts as drones
chance to occur after receiving harm", maxCount: 1, count: 0, allowed() { return mech.harmReduction() < 1 }, requires: "some harm reduction", effect() { mod.isDroneOnDamage = true; for (let i = 0; i < 4; i++) { b.drone() //spawn drone } }, remove() { mod.isDroneOnDamage = false; } }, { name: "mine synthesis", description: "drop a mine after picking up a power up", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.isMineDrop = true; }, remove() { mod.isMineDrop = false; } }, { name: "squirrel-cage rotor", description: "jump higher and move faster", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { // good with melee builds, content skipping builds mod.squirrelFx += 0.2; mod.squirrelJump += 0.09; mech.setMovement() }, remove() { mod.squirrelFx = 1; mod.squirrelJump = 1; mech.setMovement() } }, { name: "Pauli exclusion", description: `immune to harm for 1 second
after receiving harm from a collision`, maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.collisionImmuneCycles += 55; mech.immuneCycle = mech.cycle + mod.collisionImmuneCycles; //player is immune to collision damage for 30 cycles }, remove() { mod.collisionImmuneCycles = 25; } }, { name: "non-Newtonian armor", description: "for 10 seconds after receiving harm
reduce harm by 50%", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth && mech.harmReduction() < 1 }, requires: "some harm reduction", effect() { mod.isHarmArmor = true; }, remove() { mod.isHarmArmor = false; } }, { name: "clock gating", description: `slow time by 50% after receiving harm
reduce harm by 15%`, maxCount: 1, count: 0, allowed() { return game.fpsCapDefault > 45 && !mod.isRailTimeSlow }, requires: "FPS above 45", effect() { mod.isSlowFPS = true; }, remove() { mod.isSlowFPS = false; } }, { name: "liquid cooling", description: `freeze all mobs for 4 seconds
after receiving harm`, maxCount: 1, count: 0, allowed() { return mod.isSlowFPS }, requires: "clock gating", effect() { mod.isHarmFreeze = true; }, remove() { mod.isHarmFreeze = false; } }, { name: "osmoprotectant", description: `collisions with stunned or frozen mobs
cause you no harm`, maxCount: 1, count: 0, allowed() { return mod.isStunField || mod.isPulseStun || mod.isNeutronStun || mod.oneSuperBall || mod.isHarmFreeze || mod.isIceField || mod.isIceCrystals || mod.isSporeFreeze || mod.isAoESlow || mod.isFreezeMobs || mod.isPilotFreeze || mod.haveGunCheck("ice IX") || mod.isCloakStun }, requires: "a freezing or stunning effect", effect() { mod.isFreezeHarmImmune = true; }, remove() { mod.isFreezeHarmImmune = false; } }, { name: "piezoelectricity", description: "colliding with mobs fills your energy
reduce harm by 15%", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.isPiezo = true; mech.energy = mech.maxEnergy; }, remove() { mod.isPiezo = false; } }, { name: "ground state", description: "reduce harm by 50%
you no longer passively regenerate energy", maxCount: 1, count: 0, allowed() { return mod.isPiezo }, requires: "piezoelectricity", effect: () => { mod.energyRegen = 0; mech.fieldRegen = mod.energyRegen; }, remove() { mod.energyRegen = 0.001; mech.fieldRegen = mod.energyRegen; } }, { name: "mass-energy equivalence", description: "energy protects you instead of health
harm reduction effects provide no benefit", maxCount: 1, count: 0, allowed() { return !mod.isPiezo }, requires: "not piezoelectricity
or acute stress response", effect: () => { mech.health = 0 // mech.displayHealth(); document.getElementById("health").style.display = "none" document.getElementById("health-bg").style.display = "none" document.getElementById("dmg").style.backgroundColor = "#0cf"; mod.isEnergyHealth = true; mech.displayHealth(); }, remove() { mod.isEnergyHealth = false; document.getElementById("health").style.display = "inline" document.getElementById("health-bg").style.display = "inline" document.getElementById("dmg").style.backgroundColor = "#f67"; mech.health = Math.min(mech.maxHealth, mech.energy); mech.displayHealth(); } }, { name: "1st ionization energy", description: "each heal power up you collect
increases your maximum energy by 4%", maxCount: 1, count: 0, allowed() { return mod.isEnergyHealth }, requires: "mass-energy equivalence", effect() { mod.healGiveMaxEnergy = true; //mod.healMaxEnergyBonus given from heal power up powerUps.heal.color = "#0ae" for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color } }, remove() { mod.healGiveMaxEnergy = false; mod.healMaxEnergyBonus = 0 powerUps.heal.color = "#0eb" for (let i = 0; i < powerUp.length; i++) { //find active heal power ups and adjust color live if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color } } }, { name: "overcharge", description: "increase your maximum energy by 50%", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { // mech.maxEnergy += 0.5 // mech.energy += 0.5 mod.bonusEnergy += 0.5 mech.setMaxEnergy() }, remove() { mod.bonusEnergy = 0; mech.setMaxEnergy() } }, { name: "energy conservation", description: "10% of damage done recovered as energy", maxCount: 9, count: 0, allowed() { return true }, requires: "", effect() { mod.energySiphon += 0.1; }, remove() { mod.energySiphon = 0; } }, { name: "waste energy recovery", description: "if a mob has died in the last 5 seconds
regen 6% of max energy every second", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.isEnergyRecovery = true; }, remove() { mod.isEnergyRecovery = false; } }, { name: "scrap recycling", description: "if a mob has died in the last 5 seconds
heal 1% of max health every second", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.isHealthRecovery = true; }, remove() { mod.isHealthRecovery = false; } }, { name: "entropy exchange", description: "heal for 1% of damage done", maxCount: 9, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.healthDrain += 0.01; }, remove() { mod.healthDrain = 0; } }, { name: "supersaturation", description: "increase your maximum health by 50%", maxCount: 9, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.bonusHealth += 0.5 mech.addHealth(0.50) mech.setMaxHealth(); }, remove() { mod.bonusHealth = 0 mech.setMaxHealth(); } }, { name: "crystallized armor", description: "increase maximum health by 5% for each
unused power up at the end of a level", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.isArmorFromPowerUps = true; //tracked by mod.armorFromPowerUps }, remove() { mod.isArmorFromPowerUps = false; // mod.armorFromPowerUps = 0; //this is now reset in mod.setupAllMods(); mech.setMaxHealth(); } }, { name: "negentropy", description: `at the start of each level
spawn a heal for every 50% missing health`, maxCount: 1, count: 0, allowed() { return mech.maxHealth > 1 || mod.isArmorFromPowerUps }, requires: "increased max health", effect() { mod.isHealLowHealth = true; }, remove() { mod.isHealLowHealth = false; } }, { name: "adiabatic healing", description: "heal power ups are 100% more effective", maxCount: 3, count: 0, allowed() { return (mech.health < 0.7 || build.isCustomSelection) && !mod.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { mod.largerHeals++; }, remove() { mod.largerHeals = 1; } }, { name: "anthropic principle", nameInfo: "", addNameInfo() { setTimeout(function () { powerUps.reroll.changeRerolls(0) }, 1000); }, description: "instead of dying consume a reroll
and spawn 4 heal power ups", maxCount: 1, count: 0, allowed() { return powerUps.reroll.rerolls > 0 || build.isCustomSelection }, requires: "at least 1 reroll", effect() { mod.isDeathAvoid = true; setTimeout(function () { powerUps.reroll.changeRerolls(0) }, 1000); }, remove() { mod.isDeathAvoid = false; } }, { name: "bubble fusion", description: "after destroying a mob's shield
spawn 1-2 heals, ammo, or rerolls", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.isShieldAmmo = true; }, remove() { mod.isShieldAmmo = false; } }, { name: "Bayesian statistics", description: "17% chance to duplicate spawned power ups
after a collision, eject one of your mods", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect: () => { mod.isBayesian = true //change power up draw game.draw.powerUp = function () { for (let i = 0, len = powerUp.length; i < len; ++i) { ctx.globalAlpha = 0.4 * Math.sin(mech.cycle * 0.15) + 0.6; for (let i = 0, len = powerUp.length; i < len; ++i) { ctx.beginPath(); ctx.arc(powerUp[i].position.x, powerUp[i].position.y, powerUp[i].size, 0, 2 * Math.PI); ctx.fillStyle = powerUp[i].color; ctx.fill(); } ctx.globalAlpha = 1; if (powerUp[i].isBayesian && Math.random() < 0.1) { //draw electricity const mag = 5 + powerUp[i].size / 5 let unit = Vector.rotate({ x: mag, y: mag }, 2 * Math.PI * Math.random()) let path = { x: powerUp[i].position.x + unit.x, y: powerUp[i].position.y + unit.y } ctx.beginPath(); ctx.moveTo(path.x, path.y); for (let i = 0; i < 6; i++) { unit = Vector.rotate(unit, 3 * (Math.random() - 0.5)) path = Vector.add(path, unit) ctx.lineTo(path.x, path.y); } ctx.lineWidth = 0.5 + 2 * Math.random(); ctx.strokeStyle = "#000" ctx.stroke(); } } // ctx.globalAlpha = 1; } }, remove() { mod.isBayesian = false game.draw.powerUp = game.draw.powerUpNormal } }, { name: "entanglement", nameInfo: "", addNameInfo() { setTimeout(function () { game.boldActiveGunHUD(); }, 1000); }, description: "while your first gun is equipped
reduce harm by 13% for each of your guns", maxCount: 1, count: 0, allowed() { return b.inventory.length > 1 && !mod.isEnergyHealth }, requires: "at least 2 guns", effect() { mod.isEntanglement = true setTimeout(function () { game.boldActiveGunHUD(); }, 1000); }, remove() { mod.isEntanglement = false; } }, { name: "arsenal", description: "increase damage by 7%
for each gun in your inventory", maxCount: 1, count: 0, allowed() { return b.inventory.length > 1 }, requires: "at least 2 guns", effect() { mod.isDamageForGuns = true; }, remove() { mod.isDamageForGuns = false; } }, { name: "generalist", description: "spawn 5 guns, but you can't switch guns
guns cycle automatically with each new level", maxCount: 1, count: 0, isNonRefundable: true, allowed() { return mod.isDamageForGuns }, requires: "arsenal", effect() { mod.isGunCycle = true; for (let i = 0; i < 5; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); } }, remove() { mod.isGunCycle = false; } }, { name: "logistics", description: "ammo power ups give 200% ammo
but ammo is only added to your current gun", maxCount: 1, count: 0, allowed() { return !mod.isEnergyNoAmmo }, requires: "not exciton-lattice", effect() { mod.isAmmoForGun = true; }, remove() { mod.isAmmoForGun = false; } }, { name: "supply chain", description: "double your current ammo for all guns", maxCount: 9, count: 0, isNonRefundable: true, allowed() { return mod.isAmmoForGun }, requires: "logistics", effect() { for (let i = 0; i < b.guns.length; i++) { if (b.guns[i].have) b.guns[i].ammo = Math.floor(2 * b.guns[i].ammo) } game.makeGunHUD(); }, remove() {} }, { name: "catabolism", description: "gain ammo when you fire while out of ammo
drains 2% of max health", maxCount: 1, count: 0, allowed() { return !mod.isEnergyHealth && !mod.isEnergyNoAmmo }, requires: "not mass-energy equivalence
not exciton-lattice", effect: () => { mod.isAmmoFromHealth = 0.023; }, remove() { mod.isAmmoFromHealth = 0; } }, { name: "desublimated ammunition", description: "use 50% less ammo when crouching", maxCount: 1, count: 0, allowed() { return true }, requires: "", effect() { mod.isCrouchAmmo = true }, remove() { mod.isCrouchAmmo = false; } }, { name: "gun turret", description: "reduce harm by 40% when crouching", maxCount: 1, count: 0, allowed() { return mod.isCrouchAmmo && !mod.isEnergyHealth }, requires: "desublimated ammunition
not mass-energy equivalence", effect() { mod.isTurret = true }, remove() { mod.isTurret = false; } }, { name: "cardinality", description: "mods, fields, and guns have 5 choices", maxCount: 1, count: 0, allowed() { return !mod.isDeterminism }, requires: "not determinism", effect: () => { mod.isExtraChoice = true; }, remove() { mod.isExtraChoice = false; } }, { name: "determinism", description: "spawn 4 mods
mods, fields, and guns have only 1 choice", maxCount: 1, count: 0, isNonRefundable: true, allowed() { return !mod.isExtraChoice }, requires: "not cardinality", effect: () => { mod.isDeterminism = true; for (let i = 0; i < 4; i++) { //if you change the six also change it in Born rule powerUps.spawn(mech.pos.x, mech.pos.y, "mod"); } }, remove() { mod.isDeterminism = false; } }, { name: "superdeterminism", description: "spawn 3 mods
rerolls, guns, and fields no longer spawn", maxCount: 1, count: 0, isNonRefundable: true, allowed() { return mod.isDeterminism && !mod.manyWorlds }, requires: "determinism", effect: () => { mod.isSuperDeterminism = true; for (let i = 0; i < 3; i++) { //if you change the six also change it in Born rule powerUps.spawn(mech.pos.x, mech.pos.y, "mod"); } }, remove() { mod.isSuperDeterminism = false; } }, { name: "many-worlds", description: "if you have no rerolls spawn one
after choosing a mod, field, or gun", maxCount: 1, count: 0, allowed() { return !mod.isSuperDeterminism && !mod.isRerollHaste }, requires: "not superdeterminism or Ψ(t) collapse", effect: () => { mod.manyWorlds = true; }, remove() { mod.manyWorlds = false; } }, { name: "renormalization", description: "consuming a reroll for any purpose
has a 37% chance to spawn a reroll", maxCount: 1, count: 0, allowed() { return !mod.isSuperDeterminism && !mod.isRerollHaste }, requires: "not superdeterminism or Ψ(t) collapse", effect() { mod.renormalization = true; }, remove() { mod.renormalization = false; } }, { name: "quantum immortality", description: "after dying, continue in an alternate reality
spawn 5 rerolls", maxCount: 1, count: 0, allowed() { return powerUps.reroll.rerolls > 1 || build.isCustomSelection }, requires: "at least 2 rerolls", effect() { mod.isImmortal = true; for (let i = 0; i < 5; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "reroll", false); } }, remove() { mod.isImmortal = false; } }, { name: "Born rule", description: "remove all current mods
spawn new mods to replace them", maxCount: 1, count: 0, // isNonRefundable: true, isCustomHide: true, allowed() { return (mod.totalCount > 6) }, requires: "more than 6 mods", effect: () => { //remove active bullets //to get rid of bots for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); bullet = []; let count = 0 //count mods for (let i = 0, len = mod.mods.length; i < len; i++) { // spawn new mods power ups if (!mod.mods[i].isNonRefundable) count += mod.mods[i].count } if (mod.isDeterminism) count -= 3 //remove the bonus mods if (mod.isSuperDeterminism) count -= 2 //remove the bonus mods mod.setupAllMods(); // remove all mods for (let i = 0; i < count; i++) { // spawn new mods power ups powerUps.spawn(mech.pos.x, mech.pos.y, "mod"); } //have state is checked in mech.death() }, remove() {} }, { name: "reallocation", description: "convert 1 random mod into 2 new guns
recursive mods lose all stacks", maxCount: 1, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return (mod.totalCount > 0) && !mod.isSuperDeterminism }, requires: "at least 1 mod", effect: () => { const have = [] //find which mods you have for (let i = 0; i < mod.mods.length; i++) { if (mod.mods[i].count > 0) have.push(i) } const choose = have[Math.floor(Math.random() * have.length)] game.makeTextLog(`
  ${mod.mods[choose].name} removed by reallocation`, 300) for (let i = 0; i < 2 * mod.mods[choose].count; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); } mod.mods[choose].count = 0; mod.mods[choose].remove(); // remove a random mod form the list of mods you have mod.mods[choose].isLost = true game.updateModHUD(); }, remove() {} }, //************************************************** //************************************************** gun //************************************************** mods //************************************************** { name: "Lorentzian topology", description: "your bullets last 33% longer", maxCount: 3, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" || mod.haveGunCheck("spores") || mod.haveGunCheck("drones") || mod.haveGunCheck("super balls") || mod.haveGunCheck("foam") || mod.haveGunCheck("wave beam") || mod.haveGunCheck("ice IX") || mod.haveGunCheck("neutron bomb") }, requires: "drones, spores, super balls, foam
wave beam, ice IX, neutron bomb", effect() { mod.isBulletsLastLonger += 0.33 }, remove() { mod.isBulletsLastLonger = 1; } }, { name: "microstates", description: "increase damage by 4%
for every 10 active bullets", maxCount: 1, count: 0, allowed() { return mod.isBulletsLastLonger > 1 }, requires: "Lorentzian topology", effect() { mod.isDamageFromBulletCount = true }, remove() { mod.isDamageFromBulletCount = false } }, { name: "pneumatic actuator", description: "nail gun takes 45% less time to ramp up
to it's shortest delay after firing", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("nail gun") }, requires: "nail gun", effect() { mod.nailFireRate = true }, remove() { mod.nailFireRate = false } }, { name: "powder-actuated", description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("nail gun") && mod.nailFireRate && !mod.isIceCrystals }, requires: "nail gun", effect() { mod.nailInstantFireRate = true }, remove() { mod.nailInstantFireRate = false } }, { name: "ice crystal nucleation", description: "the nail gun uses energy to condense
unlimited freezing ice shards", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("nail gun") && !mod.nailInstantFireRate }, requires: "nail gun", effect() { mod.isIceCrystals = true; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "nail gun") { b.guns[i].ammoPack = Infinity b.guns[i].recordedAmmo = b.guns[i].ammo b.guns[i].ammo = Infinity game.updateGunHUD(); break; } } }, remove() { mod.isIceCrystals = false; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "nail gun") { b.guns[i].ammoPack = b.guns[i].defaultAmmoPack; b.guns[i].ammo = b.guns[i].recordedAmmo game.updateGunHUD(); break; } } } }, { name: "shotgun spin-statistics", description: "immune to harm while firing the shotgun
ammo costs are doubled", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("shotgun") }, requires: "shotgun", effect() { mod.isShotgunImmune = true; //cut current ammo by 1/2 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "shotgun") { b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 0.5); break; } } game.updateGunHUD(); for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "shotgun") { b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * 0.5 break; } } }, remove() { mod.isShotgunImmune = false; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "shotgun") { b.guns[i].ammoPack = b.guns[i].defaultAmmoPack; break; } } } }, { name: "nailshot", description: "the shotgun fires nails
effective at a distance", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("shotgun") }, requires: "shotgun", effect() { mod.isNailShot = true; }, remove() { mod.isNailShot = false; } }, { name: "Newton's 3rd law", description: "the shotgun fires 66% faster
recoil is greatly increased", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("shotgun") }, requires: "shotgun", effect() { mod.isShotgunRecoil = true; }, remove() { mod.isShotgunRecoil = false; } }, { name: "super duper", description: "fire 2 additional super balls", maxCount: 9, count: 0, allowed() { return mod.haveGunCheck("super balls") && !mod.oneSuperBall }, requires: "super balls", effect() { mod.superBallNumber += 2 }, remove() { mod.superBallNumber = 4; } }, { name: "super ball", description: "fire one large super ball
that stuns mobs for 3 second", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("super balls") && mod.superBallNumber === 4 }, requires: "super balls", effect() { mod.oneSuperBall = true; }, remove() { mod.oneSuperBall = false; } }, { name: "super sized", description: `your super balls are 22% larger
increases mass and physical damage`, count: 0, maxCount: 9, allowed() { return mod.haveGunCheck("super balls") }, requires: "super balls", effect() { mod.bulletSize += 0.2 }, remove() { mod.bulletSize = 1; } }, { name: "flechettes cartridges", description: "flechettes release three needles in each shot
ammo costs are tripled", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("flechettes") }, requires: "flechettes", effect() { mod.isFlechetteMultiShot = true; //cut current ammo by 1/3 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flechettes") b.guns[i].ammo = Math.ceil(b.guns[i].ammo / 3); } //cut ammo packs by 1/3 for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flechettes") b.guns[i].ammoPack = Math.ceil(b.guns[i].defaultAmmoPack / 3); } game.updateGunHUD(); }, remove() { mod.isFlechetteMultiShot = false; for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flechettes") b.guns[i].ammo = Math.ceil(b.guns[i].ammo * 3); } for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flechettes") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack; } game.updateGunHUD(); } }, { name: "6s half-life", description: "flechette needles made of plutonium-238
increase damage by 100% over 6 seconds", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("flechettes") && !mod.isFastDot }, requires: "flechettes", effect() { mod.isSlowDot = true; }, remove() { mod.isSlowDot = false; } }, { name: "1/2s half-life", description: "flechette needles made of lithium-8
flechette damage occurs after 1/2 a second", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("flechettes") && !mod.isSlowDot }, requires: "flechettes", effect() { mod.isFastDot = true; }, remove() { mod.isFastDot = false; } }, { name: "piercing needles", description: "needles penetrate mobs and blocks
potentially hitting multiple targets", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("flechettes") }, requires: "flechettes", effect() { mod.pierce = true; }, remove() { mod.pierce = false; } }, { name: "wave packet", description: "wave beam emits two oscillating particles
decrease wave damage by 33%", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("wave beam") }, requires: "wave beam", effect() { mod.waveHelix = 2 }, remove() { mod.waveHelix = 1 } }, { name: "phase velocity", description: "the wave beam propagates faster in solids", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("wave beam") && !mod.isWaveReflect }, requires: "wave beam", effect() { mod.waveSpeedMap = 3 //needs to be 3 to stop bound state require check mod.waveSpeedBody = 1.9 }, remove() { mod.waveSpeedMap = 0.08 mod.waveSpeedBody = 0.25 } }, { name: "bound state", description: "wave beam bullets last 5x longer
bullets are bound to a region around player", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("wave beam") && mod.waveSpeedMap !== 3 }, requires: "wave beam", effect() { mod.isWaveReflect = true }, remove() { mod.isWaveReflect = false } }, { name: "recursion", description: "after missiles explode they have a
30% chance to launch a larger missile", maxCount: 6, count: 0, allowed() { return mod.haveGunCheck("missiles") || mod.isMissileField }, requires: "missiles", effect() { mod.recursiveMissiles++ }, remove() { mod.recursiveMissiles = 0; } }, { name: "MIRV", description: "launch 3 small missiles instead of 1
1.5x increase in delay after firing", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("missiles") }, requires: "missiles", effect() { mod.is3Missiles = true; }, remove() { mod.is3Missiles = false; } }, { name: "optimized shell packing", description: "flak ammo drops contain 3x more shells", maxCount: 3, count: 0, allowed() { return mod.haveGunCheck("flak") }, requires: "flak", effect() { for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flak") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack * (3 * (1 + this.count)); } }, remove() { for (i = 0, len = b.guns.length; i < len; i++) { //find which gun if (b.guns[i].name === "flak") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack; } } }, { name: "fragmentation grenade", description: "grenades are loaded with 5 nails
on detonation nails are ejected towards mobs", maxCount: 9, count: 0, allowed() { return mod.haveGunCheck("grenades") }, requires: "grenades", effect() { mod.grenadeFragments += 5 }, remove() { mod.grenadeFragments = 0 } }, { name: "rocket-propelled grenade", description: "grenades rapidly accelerate forward
map collisions trigger an explosion", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("grenades") }, requires: "grenades", effect() { mod.isRPG = true; }, remove() { mod.isRPG = false; } }, { name: "electromagnetic pulse", description: "vacuum bomb's explosion removes
80% of shields and 100% of energy", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("vacuum bomb") }, requires: "vacuum bomb", effect() { mod.isVacuumShield = true; }, remove() { mod.isVacuumShield = false; } }, { name: "water shielding", description: "increase neutron bomb's range by 20%
player is immune to its harmful effects", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("neutron bomb") }, requires: "neutron bomb", effect() { mod.isNeutronImmune = true }, remove() { mod.isNeutronImmune = false } }, { name: "inertial confinement", description: "neutron bomb's detonation
stuns nearby mobs for 1.5 seconds", maxCount: 3, count: 0, allowed() { return mod.haveGunCheck("neutron bomb") }, requires: "neutron bomb", effect() { mod.isNeutronStun += 90; }, remove() { mod.isNeutronStun = 0; } }, { name: "mine reclamation", description: "retrieve ammo from all undetonated mines
and 20% of mines after detonation", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("mine") }, requires: "mine", effect() { mod.isMineAmmoBack = true; }, remove() { mod.isMineAmmoBack = false; } }, { name: "irradiated nails", description: "nails are made with a cobalt-60 alloy
85% radioactive damage over 2 seconds", maxCount: 1, count: 0, allowed() { return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + (mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot + mod.haveGunCheck("nail gun")) * 2 > 1 }, requires: "nails", effect() { mod.isNailPoison = true; }, remove() { mod.isNailPoison = false; } }, { name: "railroad ties", description: "nails are 70% larger
increases physical damage by about 25%", maxCount: 1, count: 0, allowed() { return mod.nailBotCount + mod.grenadeFragments + mod.nailsDeathMob / 2 + (mod.haveGunCheck("mine") + mod.isRailNails + mod.isNailShot + mod.haveGunCheck("nail gun")) * 2 > 1 }, requires: "nails", effect() { mod.biggerNails += 0.7 }, remove() { mod.biggerNails = 1 } }, { name: "mycelial fragmentation", description: "sporangium release an extra spore
once a second during their growth phase", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("spores") }, requires: "spores", effect() { mod.isSporeGrowth = true }, remove() { mod.isSporeGrowth = false } }, { name: "tinsellated flagella", description: "sporangium release 2 more spores
spores accelerate 50% faster", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField }, requires: "spores", effect() { mod.isFastSpores = true }, remove() { mod.isFastSpores = false } }, { name: "cryodesiccation", description: "sporangium release 2 more spores
spores freeze mobs for 1 second", //
spores do 1/3 damage maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField }, requires: "spores", effect() { mod.isSporeFreeze = true }, remove() { mod.isSporeFreeze = false } }, { name: "diplochory", description: "spores use the player for dispersal
until they locate a viable host", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField }, requires: "spores", effect() { mod.isSporeFollow = true }, remove() { mod.isSporeFollow = false } }, { name: "mutualism", description: "increase spore damage by 100%
spores borrow 1% health until they die", maxCount: 1, count: 0, allowed() { return (mod.haveGunCheck("spores") || mod.sporesOnDeath > 0 || mod.isSporeField) && !mod.isEnergyHealth }, requires: "spores", effect() { mod.isMutualism = true }, remove() { mod.isMutualism = false } }, { name: "brushless motor", description: "drones accelerate 50% faster", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("drones") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(mod.isSporeField || mod.isMissileField || mod.isIceField)) }, requires: "drones", effect() { mod.isFastDrones = true }, remove() { mod.isFastDrones = false } }, { name: "harvester", description: "after a drone picks up a power up,
it's larger, faster, and very durable", maxCount: 1, count: 0, allowed() { return !mod.isArmorFromPowerUps && (mod.haveGunCheck("drones") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(mod.isSporeField || mod.isMissileField || mod.isIceField))) }, requires: "drones", effect() { mod.isDroneGrab = true }, remove() { mod.isDroneGrab = false } }, { name: "superfluidity", description: "freeze effects apply to mobs near it's target", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("ice IX") || mod.isIceCrystals || mod.isSporeFreeze || mod.isIceField }, requires: "a freeze effect", effect() { mod.isAoESlow = true }, remove() { mod.isAoESlow = false } }, { name: "heavy water", description: "ice IX is synthesized with an extra neutron
does radioactive damage over 5 seconds", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("ice IX") || (mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && mod.isIceField) }, requires: "ice IX", effect() { mod.isHeavyWater = true }, remove() { mod.isHeavyWater = false; } }, { name: "necrophoresis", description: "foam bullets grow and split into 3 copies
when the mob they are stuck to dies", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("foam") || mod.foamBotCount > 1 }, requires: "foam", effect() { mod.isFoamGrowOnDeath = true }, remove() { mod.isFoamGrowOnDeath = false; } }, { name: "colloidal foam", description: "increase foam damage by 200%
foam dissipates 40% faster", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("foam") || mod.foamBotCount > 2 }, requires: "foam", effect() { mod.isFastFoam = true }, remove() { mod.isFastFoam = false; } }, // { // name: "foam size", // description: "increase foam damage by 200%
foam dissipates 50% faster", // maxCount: 1, // count: 0, // allowed() { // return mod.haveGunCheck("foam") || mod.foamBotCount > 2 // }, // requires: "foam", // effect() { // mod.isLargeFoam = true // }, // remove() { // mod.isLargeFoam = false; // } // }, { name: "frame-dragging", description: "slow time while charging the rail gun
charging no longer drains energy", maxCount: 1, count: 0, allowed() { return game.fpsCapDefault > 45 && mod.haveGunCheck("rail gun") && !mod.isSlowFPS && !mod.isCapacitor }, requires: "rail gun and FPS above 45", effect() { mod.isRailTimeSlow = true; }, remove() { mod.isRailTimeSlow = false; game.fpsCap = game.fpsCapDefault game.fpsInterval = 1000 / game.fpsCap; } }, { name: "capacitor bank", description: "the rail gun no longer takes time to charge
rail gun rods are 66% less massive", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("rail gun") && !mod.isRailTimeSlow }, requires: "rail gun", effect() { mod.isCapacitor = true; }, remove() { mod.isCapacitor = false; } }, { name: "fragmenting projectiles", description: "rail gun rods fragment into nails
after hitting mobs at high speeds", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("rail gun") }, requires: "rail gun", effect() { mod.isRailNails = true; }, remove() { mod.isRailNails = false; } }, { name: "laser diodes", description: "lasers drain 37% less energy
effects laser gun, pulse gun, and laser-bot", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("pulse") || mod.haveGunCheck("laser") || mod.laserBotCount > 1 }, requires: "laser", effect() { mod.isLaserDiode = 0.63; //100%-37% }, remove() { mod.isLaserDiode = 1; } }, { name: "specular reflection", description: "laser beams gain 1 reflection
50% laser damage and energy drain", maxCount: 9, count: 0, allowed() { return mod.haveGunCheck("laser") }, requires: "laser", effect() { mod.laserReflections++; mod.laserDamage += 0.06; //base is 0.12 mod.laserFieldDrain += 0.0008 //base is 0.002 }, remove() { mod.laserReflections = 2; mod.laserDamage = 0.12; mod.laserFieldDrain = 0.0016; } }, // { // name: "waste heat recovery", // description: "laser damage grows by 400% as you fire
but you periodically eject your health", // maxCount: 1, // count: 0, // allowed() { // return mod.haveGunCheck("laser") && !mod.isEnergyHealth // }, // requires: "laser
not mass-energy equivalence", // effect() { // mod.isLaserHealth = true; // }, // remove() { // mod.isLaserHealth = false // } // }, { name: "shock wave", description: "mobs caught in pulse's explosion are stunned
for up to 2 seconds", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("pulse") }, requires: "pulse", effect() { mod.isPulseStun = true; }, remove() { mod.isPulseStun = false; } }, { name: "neocognitron", description: "pulse automatically aims at a nearby mob
50% decreased delay after firing", maxCount: 1, count: 0, allowed() { return mod.haveGunCheck("pulse") }, requires: "pulse", effect() { mod.isPulseAim = true; }, remove() { mod.isPulseAim = false; } }, //************************************************** //************************************************** field //************************************************** mods //************************************************** { name: "flux pinning", description: "blocking with perfect diamagnetism
stuns mobs for +1 second", maxCount: 9, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "perfect diamagnetism" }, requires: "perfect diamagnetism", effect() { mod.isStunField += 60; }, remove() { mod.isStunField = 0; } }, { name: "fracture analysis", description: "bullet impacts do 400% damage
to stunned mobs", maxCount: 1, count: 0, allowed() { return mod.isStunField || mod.oneSuperBall || mod.isCloakStun }, requires: "flux pinning or super ball
or flashbang", effect() { mod.isCrit = true; }, remove() { mod.isCrit = false; } }, { name: "timelike world line", description: "time dilation doubles your relative time rate
and makes you immune to harm", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "time dilation field" }, requires: "time dilation field", effect() { mod.isTimeSkip = true; b.setFireCD(); }, remove() { mod.isTimeSkip = false; b.setFireCD(); } }, { name: "Lorentz transformation", description: "permanently increase your relative time rate
move, jump, and shoot 33% faster", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "time dilation field" }, requires: "time dilation field", effect() { mod.fastTime = 1.33; mod.fastTimeJump = 1.09; mech.setMovement(); b.setFireCD(); }, remove() { mod.fastTime = 1; mod.fastTimeJump = 1; mech.setMovement(); b.setFireCD(); } }, { name: "plasma jet", description: "increase plasma torch's range by 27%", maxCount: 9, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "plasma torch" }, requires: "plasma torch", effect() { mod.isPlasmaRange += 0.27; }, remove() { mod.isPlasmaRange = 1; } }, { name: "plasma-bot", description: "a bot uses energy to emit short range plasma
that damages and pushes mobs", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "plasma torch" }, requires: "plasma torch", effect() { mod.plasmaBotCount++; b.plasmaBot(); }, remove() { mod.plasmaBotCount = 0; } }, { name: "degenerate matter", description: "reduce harm by 40%
while negative mass field is active", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "negative mass field" }, requires: "negative mass field", effect() { mod.isHarmReduce = true }, remove() { mod.isHarmReduce = false; // if (mech.fieldUpgrades[mech.fieldMode].name === "negative mass field") mech.setField("negative mass field") //reset harm reduction } }, { name: "annihilation", description: "after touching mobs, they are annihilated
drains 33% of maximum energy", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "negative mass field" }, requires: "negative mass field", effect() { mod.isAnnihilation = true }, remove() { mod.isAnnihilation = false; } }, { name: "negative temperature", description: "negative mass field uses energy
to freeze each mob caught in it's effect", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "negative mass field" }, requires: "negative mass field", effect() { mod.isFreezeMobs = true; }, remove() { mod.isFreezeMobs = false; } }, { name: "bremsstrahlung radiation", description: "blocking with standing wave harmonics
does damage to mobs", maxCount: 9, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics" }, requires: "standing wave harmonics", effect() { mod.blockDmg += 0.66 //if you change this value also update the for loop in the electricity graphics in mech.pushMass }, remove() { mod.blockDmg = 0; } }, { name: "frequency resonance", description: "standing wave harmonics shield is retuned
increase size and blocking efficiency by 40%", maxCount: 9, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "standing wave harmonics" }, requires: "standing wave harmonics", effect() { mech.fieldRange += 175 * 0.17 mech.fieldShieldingScale *= 0.6 }, remove() { mech.fieldRange = 175; mech.fieldShieldingScale = 1; } }, { name: "pair production", description: "power ups overfill your energy
temporarily gain 3x your maximum energy", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" }, requires: "nano-scale manufacturing", effect: () => { mod.isMassEnergy = true // used in mech.grabPowerUp mech.energy = mech.maxEnergy * 3 }, remove() { mod.isMassEnergy = false; } }, { name: "mycelium manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to grow spores", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(mod.isMissileField || mod.isIceField || mod.isFastDrones || mod.isDroneGrab) }, requires: "nano-scale manufacturing", effect() { mod.isSporeField = true; }, remove() { mod.isSporeField = false; } }, { name: "missile manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to construct missiles", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(mod.isSporeField || mod.isIceField || mod.isFastDrones || mod.isDroneGrab) }, requires: "nano-scale manufacturing", effect() { mod.isMissileField = true; }, remove() { mod.isMissileField = false; } }, { name: "ice IX manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to synthesize ice IX", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "nano-scale manufacturing" && !(mod.isSporeField || mod.isMissileField || mod.isFastDrones || mod.isDroneGrab) }, requires: "nano-scale manufacturing", effect() { mod.isIceField = true; }, remove() { mod.isIceField = false; } }, { name: "phase decoherence", description: "become intangible while cloaked
but, passing through mobs drains your energy", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "metamaterial cloaking" }, requires: "metamaterial cloaking", effect() { mod.isIntangible = true; }, remove() { mod.isIntangible = false; } }, { name: "dazzler", description: "decloaking stuns nearby mobs
drains 30% of your stored energy", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "metamaterial cloaking" }, requires: "metamaterial cloaking", effect() { mod.isCloakStun = true; }, remove() { mod.isCloakStun = false; } }, { name: "discrete optimization", description: "increase damage by 50%
50% increased delay after firing", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "metamaterial cloaking" }, requires: "metamaterial cloaking", effect() { mod.aimDamage = 1.5 b.setFireCD(); }, remove() { mod.aimDamage = 1 b.setFireCD(); } }, { name: "Bose Einstein condensate", description: "mobs in superposition with the pilot wave
are frozen for 2 seconds", maxCount: 1, count: 0, allowed() { return mech.fieldUpgrades[mech.fieldMode].name === "pilot wave" }, requires: "pilot wave", effect() { mod.isPilotFreeze = true }, remove() { mod.isPilotFreeze = false } }, { name: "heals", description: "spawn 6 heal power ups", maxCount: 9, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return true }, requires: "", effect() { for (let i = 0; i < 6; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "heal"); } this.count-- }, remove() {} }, { name: "ammo", description: "spawn 6 ammo power ups", maxCount: 9, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return true }, requires: "", effect() { for (let i = 0; i < 6; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "ammo"); } this.count-- }, remove() {} }, { name: "rerolls", description: "spawn 5 reroll power ups", maxCount: 9, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return !mod.isSuperDeterminism }, requires: "not superdeterminism", effect() { for (let i = 0; i < 5; i++) { powerUps.spawn(mech.pos.x, mech.pos.y, "reroll"); } this.count-- }, remove() {} }, { name: "gun", description: "spawn a gun power up", maxCount: 9, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return !mod.isSuperDeterminism }, requires: "not superdeterminism", effect() { powerUps.spawn(mech.pos.x, mech.pos.y, "gun"); this.count-- }, remove() {} }, { name: "field", description: "spawn a field power up", maxCount: 9, count: 0, isNonRefundable: true, isCustomHide: true, allowed() { return !mod.isSuperDeterminism }, requires: "not superdeterminism", effect() { powerUps.spawn(mech.pos.x, mech.pos.y, "field"); this.count-- }, remove() {} }, ], //variables use for gun mod upgrades 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, nailBotCount: null, foamBotCount: null, boomBotCount: null, plasmaBotCount: null, collisionImmuneCycles: null, blockDmg: null, isPiezo: null, isFastDrones: null, isFastSpores: null, superBallNumber: null, oneSuperBall: null, laserReflections: null, laserDamage: null, laserFieldDrain: null, isAmmoFromHealth: null, mobSpawnWithHealth: null, isEnergyRecovery: null, isHealthRecovery: null, isEnergyLoss: null, isDeathAvoid: null, waveSpeedMap: null, waveSpeedBody: null, isSporeField: null, isMissileField: null, isIceField: null, isFlechetteMultiShot: null, isMineAmmoBack: null, isPlasmaRange: null, isRailNails: null, isFreezeMobs: null, recursiveMissiles: null, isIceCrystals: null, throwChargeRate: null, isBlockStun: null, isStunField: null, isHarmDamage: null, isHeavyWater: null, energyRegen: null, isVacuumShield: null, renormalization: null, grenadeFragments: null, isEnergyDamage: null, isBotSpawner: null, waveHelix: null, isSporeFollow: null, isNailPoison: null, isEnergyHealth: null, isPulseStun: null, isPilotFreeze: null, restDamage: null, isRPG: null, is3Missiles: null, isDeterminism: null, isSuperDeterminism: null, isHarmReduce: null, nailsDeathMob: null, isSlowFPS: null, isNeutronStun: null, manyWorlds: null, isDamageFromBulletCount: null, isLaserDiode: null, isNailShot: null, slowFire: null, fastTime: null, squirrelJump: null, fastTimeJump: null, isFastDot: null, isArmorFromPowerUps: 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, rerollHaste: null, isMineDrop: null, isRerollBots: null, isRailTimeSlow: null, isNailBotUpgrade: null, isFoamBotUpgrade: null, isLaserBotUpgrade: null, isBoomBotUpgrade: null, isDroneGrab: null, isOneGun: null, isDamageForGuns: null, isGunCycle: null, isFastFoam: null, isSporeGrowth: null, isBayesian: null, nailGun: null, nailInstantFireRate: null, isCapacitor: null, isEnergyNoAmmo: null, isFreezeHarmImmune: null, isSmallExplosion: null, isExplosionHarm: null, armorFromPowerUps: null, bonusHealth: null, isIntangible: null, isCloakStun: null, bonusEnergy: null, healGiveMaxEnergy: null, healMaxEnergyBonus: null, aimDamage: null }