diff --git a/.DS_Store b/.DS_Store index 8e6031a..3b660c6 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index b2fde2f..e17a5d3 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -2241,12 +2241,11 @@ const b = { //remove all bots techs and convert them to the new type so that tech refunds work correctly let totalTechToConvert = 0 //count how many tech need to be converted for (let i = 0; i < tech.tech.length; i++) { - if (tech.tech[i].count && tech.tech[i].isBotTech) { + if (tech.tech[i].count && tech.tech[i].isBot) { totalTechToConvert += tech.tech[i].count tech.removeTech(i) } } - console.log(totalTechToConvert) let name = "" if (type === "nailBotCount") name = "nail-bot" diff --git a/js/index.js b/js/index.js index e2d4c44..57a3b5e 100644 --- a/js/index.js +++ b/js/index.js @@ -289,9 +289,16 @@ const build = { if (tech.tech[index].count < tech.tech[index].maxCount) { if (!who.classList.contains("build-tech-selected")) who.classList.add("build-tech-selected"); tech.giveTech(index) - } else { + } else if (!tech.tech[index].isNonRefundable) { + tech.totalCount -= tech.tech[index].count tech.removeTech(index); who.classList.remove("build-tech-selected"); + } else { + who.classList.remove("build-tech-selected") + setTimeout(() => { //return energy + who.classList.add("build-tech-selected") + }, 50); + } } //update tech text //disable not allowed tech @@ -308,7 +315,6 @@ const build = {
        ${tech.tech[i].name} ${isCount}${tech.tech[i].description}` - //
//
// border: #fff solid 0px; diff --git a/js/player.js b/js/player.js index 195e976..a8f171e 100644 --- a/js/player.js +++ b/js/player.js @@ -380,15 +380,15 @@ const m = { //find what tech I could get let options = []; for (let i = 0, len = tech.tech.length; i < len; i++) { - if (tech.tech[i].count < tech.tech[i].maxCount && + if ( + tech.tech[i].count < tech.tech[i].maxCount && + tech.tech[i].allowed() && !tech.tech[i].isBadRandomOption && !tech.tech[i].isLore && - tech.tech[i].allowed() && - (!tech.tech[i].isJunk || Math.random() < 0.25)) options.push(i); - // !tech.tech[i].isNonRefundable && - // tech.tech[i].name !== "quantum immortality" && - // tech.tech[i].name !== "many-worlds" && - // tech.tech[i].name !== "perturbation theory" && + (!tech.tech[i].isJunk || Math.random() < 0.15) + ) { + for (let j = 0; j < tech.tech[i].frequency; j++) options.push(i); + } } //add a new tech from options pool if (options.length > 0) tech.giveTech(options[Math.floor(Math.random() * options.length)]) @@ -399,6 +399,7 @@ const m = { simulation.updateTechHUD(); simulation.isTextLogOpen = true; if (m.holdingTarget) m.drop(); + if (simulation.paused) build.pauseGrid() //update the build when paused }, death() { if (tech.isImmortal) { //if player has the immortality buff, spawn on the same level with randomized damage diff --git a/js/spawn.js b/js/spawn.js index c8339bb..82ca803 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -125,6 +125,7 @@ const spawn = { } else if (count === 900) { simulation.makeTextLog(`World.clear(engine.world)`); } else if (count === 1140) { + tech.isImmortal = false; m.death() return } diff --git a/js/tech.js b/js/tech.js index c3969c7..92bce6e 100644 --- a/js/tech.js +++ b/js/tech.js @@ -44,7 +44,9 @@ for (let i = 0; i < tech.tech.length; i++) { if (tech.tech[i].count < tech.tech[i].maxCount && tech.tech[i].isJunk) options.push(i); } - for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++ + if (options.length) { + for (let i = 0; i < num; i++) tech.tech[options[Math.floor(Math.random() * options.length)]].frequency++ + } // for (let i = 0; i < num; i++) { // // find an index that doesn't have dups first // let index = null @@ -164,9 +166,9 @@ count: 0, frequency: 1, allowed() { - return b.inventory.length < 2 //&& !tech.haveGunCheck("CPT gun") + return b.inventory.length === 1 //&& !tech.haveGunCheck("CPT gun") }, - requires: "no more than 1 gun", + requires: "only 1 gun", effect() { tech.isOneGun = true; for (let i = 0; i < tech.tech.length; i++) { @@ -269,7 +271,7 @@ count: 0, frequency: 1, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return b.inventory.length > 2 }, @@ -403,9 +405,9 @@ count: 0, frequency: 1, allowed() { - return true + return !m.isShipMode }, - requires: "", + requires: "not ship mode", effect: () => { tech.isFireNotMove = true; b.setFireCD(); @@ -444,9 +446,9 @@ count: 0, frequency: 1, allowed() { - return !tech.isEnergyHealth + return !tech.isEnergyHealth && !m.isShipMode }, - requires: "not mass energy", + requires: "not mass energy, not ship mode", effect: () => { tech.isFireMoveLock = true; b.setFireMethod(); @@ -786,6 +788,7 @@ maxCount: 3, count: 0, frequency: 1, + isBotTech: true, allowed() { return b.totalBots() > 0 && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob }, @@ -803,6 +806,7 @@ maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return true @@ -822,6 +826,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.nailBotCount > 1 && !b.hasBotUpgrade() }, @@ -846,6 +851,7 @@ maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return true @@ -865,6 +871,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.foamBotCount > 1 && !b.hasBotUpgrade() }, @@ -889,6 +896,7 @@ maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return true @@ -908,6 +916,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.boomBotCount > 1 && !b.hasBotUpgrade() }, @@ -932,6 +941,7 @@ maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return m.maxEnergy > 0.5 @@ -951,6 +961,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.laserBotCount > 1 && !b.hasBotUpgrade() }, @@ -975,6 +986,7 @@ maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return true @@ -994,6 +1006,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.orbitBotCount > 1 && !b.hasBotUpgrade() }, @@ -1021,13 +1034,13 @@ } } } - }, - { + }, { name: "dynamo-bot", description: "a bot damages mobs while it traces your path
regen 6 energy per second when it's near", maxCount: 9, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return true @@ -1040,13 +1053,13 @@ remove() { tech.dynamoBotCount -= this.count; } - }, - { + }, { name: "dynamo-bot upgrade", description: "convert your bots to dynamo-bots
dynamo-bots regen 24 energy per second", maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.dynamoBotCount > 1 && !b.hasBotUpgrade() }, @@ -1064,13 +1077,13 @@ if (bullet[i].botType === 'dynamo') bullet[i].isUpgraded = false } } - }, - { + }, { name: "bot fabrication", description: "anytime you collect 4 research
use them to build a random bot", maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return powerUps.research.count > 3 || build.isExperimentSelection }, @@ -1083,13 +1096,33 @@ remove() { tech.isRerollBots = false; } - }, - { + }, { + name: "robotics", + description: "use 1 research to spawn a random bot
quadruple the frequency of finding bot tech", + maxCount: 1, + count: 0, + frequency: 1, + isBotTech: true, + isNonRefundable: true, + allowed() { + return (b.totalBots() > 1 && powerUps.research.count > 0) || build.isExperimentSelection + }, + requires: "at least 2 bots, 1 research", + effect: () => { + powerUps.research.changeRerolls(-1) + b.randomBot() + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isBotTech) tech.tech[i].frequency *= 4 + } + }, + remove() {} + }, { name: "perimeter defense", description: "reduce harm by 6%
for each of your permanent bots", maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return b.totalBots() > 3 && !tech.isEnergyHealth }, @@ -1106,6 +1139,7 @@ maxCount: 1, count: 0, frequency: 1, + isBotTech: true, allowed() { return b.totalBots() > 3 }, @@ -1116,15 +1150,15 @@ remove() { tech.isBotDamage = false } - }, - { + }, { name: "bot replication", description: "duplicate your permanent bots
remove all of your guns", maxCount: 1, count: 0, frequency: 1, + isBotTech: true, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, isBadRandomOption: true, allowed() { return b.totalBots() > 3 @@ -1152,8 +1186,7 @@ tech.missileBotCount *= 2 }, remove() {} - }, - { + }, { name: "mass driver", description: "increase block collision damage by 100%
charge throws more quickly for less energy", maxCount: 1, @@ -1169,8 +1202,7 @@ remove() { tech.throwChargeRate = 1 } - }, - { + }, { name: "restitution", description: "mobs killed by collisions with blocks
spawn a heal, ammo, or research", maxCount: 1, @@ -1187,8 +1219,7 @@ remove() { tech.isBlockPowerUps = false } - }, - { + }, { name: "inelastic collision", description: "while you are holding a block
reduce harm by 85%", maxCount: 1, @@ -1205,25 +1236,7 @@ remove() { tech.isBlockHarm = false } - }, - // { - // name: "perpetual stun", - // description: "stun all mobs for up to 12 seconds
at the start of each level", - // maxCount: 1, - // count: 0, - // frequency: 1, - // allowed() { - // return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualAmmo - // }, - // requires: "only 1 perpetual effect", - // effect() { - // tech.isPerpetualStun = true - // }, - // remove() { - // tech.isPerpetualStun = false - // } - // }, - { + }, { name: "Pauli exclusion", description: `after receiving harm from a collision become
immune to harm for an extra 0.75 seconds`, maxCount: 9, @@ -1240,8 +1253,7 @@ remove() { tech.collisionImmuneCycles = 30; } - }, - { + }, { name: "complex spin-statistics", description: `become immune to harm for 1 second
once every 7 seconds`, maxCount: 3, @@ -1257,8 +1269,7 @@ remove() { tech.cyclicImmunity = 0; } - }, - { + }, { name: "flip-flop", description: `if flip-flop is ON, collisions set it to OFF
if flip-flop is OFF, collisions set it to ON`, @@ -1330,8 +1341,7 @@ tech.isFlipFlopOn = false m.eyeFillColor = 'transparent' } - }, - { + }, { name: "NOR gate", description: "if flip-flop is in the ON state
take 0 harm from collisions with mobs", maxCount: 1, @@ -1349,8 +1359,7 @@ tech.isFlipFlopHarm = false } - }, - { + }, { name: "NAND gate", description: "if flip-flop is in the ON state
do 55.5% more damage", maxCount: 1, @@ -1367,8 +1376,7 @@ remove() { tech.isFlipFlopDamage = false; } - }, - { + }, { name: "transistor", description: "if flip-flop is ON regen 22 energy per second
if flip-flop is OFF drain 3.1 energy per second", maxCount: 1, @@ -1385,8 +1393,7 @@ remove() { tech.isFlipFlopEnergy = false; } - }, - { + }, { name: "shift registers", description: "set flip-flop to the ON state
at the start of a level", maxCount: 1, @@ -1403,8 +1410,7 @@ remove() { tech.isFlipFlopLevelReset = false; } - }, - { + }, { name: "clock gating", description: `slow time by 50% after receiving harm
reduce harm by 20%`, maxCount: 1, @@ -1420,8 +1426,7 @@ remove() { tech.isSlowFPS = false; } - }, - { + }, { name: "liquid cooling", description: `freeze all mobs for 7 seconds
after receiving harm`, maxCount: 1, @@ -1438,8 +1443,7 @@ remove() { tech.isHarmFreeze = false; } - }, - { + }, { name: "osmoprotectant", description: `collisions with stunned or frozen mobs
cause you no harm`, maxCount: 1, @@ -1455,8 +1459,7 @@ remove() { tech.isFreezeHarmImmune = false; } - }, - { + }, { name: "ablative drones", description: "rebuild your broken parts as drones
chance to occur after receiving harm", maxCount: 1, @@ -1475,8 +1478,7 @@ remove() { tech.isDroneOnDamage = false; } - }, - { + }, { name: "non-Newtonian armor", description: "for 10 seconds after receiving harm
reduce harm by 66%", maxCount: 1, @@ -1492,8 +1494,7 @@ remove() { tech.isHarmArmor = false; } - }, - { + }, { name: "radiative equilibrium", description: "for 10 seconds after receiving harm
increase damage by 200%", maxCount: 1, @@ -1509,8 +1510,7 @@ remove() { tech.isHarmDamage = false; } - }, - { + }, { name: "CPT reversal", description: "charge, parity, and time invert to undo harm
rewind (1.5—5) seconds for (66—220) energy", maxCount: 1, @@ -1526,13 +1526,13 @@ remove() { tech.isRewindAvoidDeath = false; } - }, - { + }, { name: "causality bots", description: "when you rewind, build several bots
that protect you for about 9 seconds", maxCount: 3, count: 0, frequency: 1, + isBotTech: true, allowed() { return tech.isRewindAvoidDeath }, @@ -1543,8 +1543,7 @@ remove() { tech.isRewindBot = 0; } - }, - { + }, { name: "causality bombs", description: "before you rewind drop several grenades", maxCount: 1, @@ -1560,8 +1559,7 @@ remove() { tech.isRewindGrenade = false; } - }, - { + }, { name: "piezoelectricity", description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15% maxCount: 1, @@ -1578,8 +1576,7 @@ remove() { tech.isPiezo = false; } - }, - { + }, { name: "ground state", description: "reduce harm by 66%
you no longer passively regenerate energy", maxCount: 1, @@ -1597,8 +1594,7 @@ tech.energyRegen = 0.001; m.fieldRegen = tech.energyRegen; } - }, - { + }, { name: "mass-energy equivalence", description: "energy protects you instead of health
harm reduction effects provide no benefit", maxCount: 1, @@ -1625,8 +1621,7 @@ m.health = Math.max(Math.min(m.maxHealth, m.energy), 0.1); m.displayHealth(); } - }, - { + }, { name: "1st ionization energy", description: "each heal power up you collect
increases your maximum energy by 5", maxCount: 1, @@ -1651,8 +1646,7 @@ if (powerUp[i].name === "heal") powerUp[i].color = powerUps.heal.color } } - }, - { + }, { name: "electrolytes", description: "increase damage by 1%
for every 9 stored energy", maxCount: 1, @@ -1668,8 +1662,7 @@ remove() { tech.isEnergyDamage = false; } - }, - { + }, { name: "exciton-lattice", description: `increase damage by 50%, but
ammo will no longer spawn`, maxCount: 1, @@ -1685,8 +1678,7 @@ remove() { tech.isEnergyNoAmmo = false; } - }, - { + }, { name: "exothermic process", description: "increase damage by 50%
if a mob dies drain energy by 25%", maxCount: 1, @@ -1702,8 +1694,7 @@ remove() { tech.isEnergyLoss = false; } - }, - { + }, { name: "heat engine", description: `increase damage by 40%, but
reduce maximum energy by 50`, maxCount: 1, @@ -1722,8 +1713,7 @@ tech.isMaxEnergyTech = false; m.setMaxEnergy() } - }, - { + }, { name: "Gibbs free energy", description: `increase damage by 5%
for every 10 energy below 100`, maxCount: 1, @@ -1740,8 +1730,7 @@ remove() { tech.isLowEnergyDamage = false; } - }, - { + }, { name: "overcharge", description: "increase your maximum energy by 50", maxCount: 9, @@ -1761,8 +1750,7 @@ tech.bonusEnergy = 0; m.setMaxEnergy() } - }, - { + }, { name: "supercapacitor", description: "energy above your max decays 60% slower", maxCount: 1, @@ -1778,8 +1766,7 @@ remove() { tech.overfillDrain = 0.75 } - }, - { + }, { name: "energy conservation", description: "6% of damage done recovered as energy", maxCount: 9, @@ -1795,8 +1782,7 @@ remove() { tech.energySiphon = 0; } - }, - { + }, { name: "waste energy recovery", description: "if a mob has died in the last 5 seconds
regen 5% of max energy every second", maxCount: 1, @@ -1812,8 +1798,7 @@ remove() { tech.isEnergyRecovery = false; } - }, - { + }, { name: "scrap recycling", description: "if a mob has died in the last 5 seconds
regain 1% of max health every second", maxCount: 1, @@ -1830,8 +1815,7 @@ remove() { tech.isHealthRecovery = false; } - }, - { + }, { name: "dormancy", description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 50%", maxCount: 1, @@ -1847,8 +1831,7 @@ remove() { tech.isDamageAfterKill = false; } - }, - { + }, { name: "torpor", description: "if a mob has died in the last 5 seconds
reduce harm by 75% else increase it by 25%", maxCount: 1, @@ -1865,8 +1848,7 @@ remove() { tech.isHarmReduceAfterKill = false; } - }, - { + }, { name: "negative feedback", description: "increase damage by 6%
for every 10 health below 100", maxCount: 1, @@ -1898,8 +1880,7 @@ remove() { tech.isTechDamage = false; } - }, - { + }, { name: "entropy exchange", description: "heal for 3% of damage done
take 8% more harm", maxCount: 9, @@ -1916,8 +1897,7 @@ remove() { tech.healthDrain = 0; } - }, - { + }, { name: "fluoroantimonic acid", description: "increase damage by 40%
when your health is above 100", maxCount: 1, @@ -1933,8 +1913,7 @@ remove() { tech.isAcidDmg = false; } - }, - { + }, { name: "supersaturation", description: "increase your maximum health by 50", maxCount: 9, @@ -1954,8 +1933,7 @@ m.setMaxHealth(); } - }, - { + }, { name: "inductive coupling", description: "for each unused power up at the end of a level
add 3 max health (up to 51 health per level)", maxCount: 1, @@ -1973,8 +1951,7 @@ // tech.armorFromPowerUps = 0; //this is now reset in tech.setupAllTech(); m.setMaxHealth(); } - }, - { + }, { name: "transceiver chip", description: "unused power ups at the end of each level
are still activated (selections are random)", maxCount: 1, @@ -1990,8 +1967,7 @@ remove() { tech.isEndLevelPowerUp = false; } - }, - { + }, { name: "negentropy", description: `at the start of each level
spawn a heal for every 50 missing health`, maxCount: 1, @@ -2008,8 +1984,7 @@ remove() { tech.isHealLowHealth = false; } - }, - { + }, { name: "adiabatic healing", description: "heal power ups are 100% more effective", maxCount: 3, @@ -2072,8 +2047,7 @@ remove() { tech.isDeathAvoid = false; } - }, - { + }, { name: "strong anthropic principle", description: "after anthropic principle prevents your death
increase damage by 137.03599% on that level", maxCount: 1, @@ -2090,8 +2064,7 @@ remove() { tech.isAnthropicDamage = false } - }, - { + }, { name: "quantum immortality", description: "after dying, continue in an alternate reality
reduce harm by 16%", //spawn 4 research maxCount: 1, @@ -2108,8 +2081,7 @@ remove() { tech.isImmortal = false; } - }, - { + }, { name: "many-worlds", description: "each new level is an alternate reality
find 2 tech power ups in that reality", maxCount: 1, @@ -2125,8 +2097,7 @@ remove() { tech.isSwitchReality = false; } - }, - { + }, { name: "Ψ(t) collapse", description: "enter an alternate reality after you research
spawn 11 research", maxCount: 1, @@ -2143,8 +2114,7 @@ remove() { tech.isResearchReality = false; } - }, - { + }, { name: "renormalization", description: "using a research for any purpose
has a 37% chance to spawn a research", maxCount: 1, @@ -2160,8 +2130,7 @@ remove() { tech.renormalization = false; } - }, - { + }, { name: "decoherence", description: "researched or canceled tech won't reoccur
spawn 5 research", maxCount: 1, @@ -2179,8 +2148,7 @@ tech.isBanish = false powerUps.tech.banishLog = [] //reset banish log } - }, - { + }, { name: "perturbation theory", description: "66% decreased delay after firing
when you have no research in your inventory", maxCount: 1, @@ -2200,8 +2168,7 @@ tech.researchHaste = 1; b.setFireCD(); } - }, - { + }, { name: "ansatz", description: "after choosing a field, tech, or gun
if you have no research spawn 2", maxCount: 1, @@ -2217,8 +2184,7 @@ remove() { tech.manyWorlds = false; } - }, - { + }, { name: "Bayesian statistics", description: "increase damage by 3.9%
for each research in your inventory", maxCount: 1, @@ -2234,8 +2200,7 @@ remove() { tech.isRerollDamage = false; } - }, - { + }, { name: "Born rule", description: "remove all current tech
spawn new tech to replace them", maxCount: 1, @@ -2243,7 +2208,7 @@ frequency: 1, // isNonRefundable: true, isBadRandomOption: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return (tech.totalCount > 6) }, @@ -2301,8 +2266,7 @@ remove() { tech.isShieldAmmo = false; } - }, - { + }, { name: "stimulated emission", description: "20% chance to duplicate spawned power ups
after a collision, eject 1 tech", maxCount: 1, @@ -2321,13 +2285,13 @@ tech.isBayesian = false if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal } - }, - { + }, { name: "replication", description: "7% chance to duplicate spawned power ups
add 12 junk tech to the potential pool", maxCount: 9, count: 0, frequency: 1, + isNonRefundable: true, allowed() { return tech.duplicationChance() < 1 }, @@ -2342,8 +2306,7 @@ tech.duplicateChance = 0 if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal } - }, - { + }, { name: "futures exchange", description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance", maxCount: 1, @@ -2363,8 +2326,7 @@ // tech.cancelCount = 0 if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal } - }, - { + }, { name: "commodities exchange", description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research", maxCount: 1, @@ -2380,8 +2342,7 @@ remove() { tech.isCancelRerolls = false } - }, - { + }, { name: "correlated damage", description: "your chance to duplicate power ups
increases your damage by the same percent", maxCount: 1, @@ -2397,8 +2358,7 @@ remove() { tech.isDupDamage = false; } - }, - { + }, { name: "parthenogenesis", description: "each level has a chance to spawn a level boss
equal to double your duplication chance", maxCount: 1, @@ -2414,8 +2374,7 @@ remove() { tech.isDuplicateBoss = false; } - }, - { + }, { name: "apomixis", description: "after reaching 100% duplication chance
immediately spawn 4 level bosses", maxCount: 1, @@ -2432,15 +2391,14 @@ remove() { tech.is100Duplicate = false; } - }, - { + }, { name: "exchange symmetry", description: "convert 1 a random tech into 3 new guns
recursive tech lose all stacks", maxCount: 1, count: 0, frequency: 1, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return (tech.totalCount > 3) && !tech.isSuperDeterminism }, @@ -2463,15 +2421,14 @@ simulation.updateTechHUD(); }, remove() {} - }, - { + }, { name: "monte carlo experiment", description: "spawn 2 tech
remove 1 random tech", maxCount: 1, count: 0, frequency: 1, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return (tech.totalCount > 3) && !tech.isSuperDeterminism && tech.duplicationChance() > 0 }, @@ -2491,15 +2448,14 @@ simulation.updateTechHUD(); }, remove() {} - }, - { + }, { name: "strange attractor", description: `use 2 research to spawn 1 tech
with double your duplication chance`, maxCount: 1, count: 0, frequency: 1, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return !tech.isSuperDeterminism && tech.duplicationChance() > 0 && powerUps.research.count > 1 }, @@ -2514,8 +2470,7 @@ tech.duplicateChance = chanceStore }, remove() {} - }, - { + }, { name: "mine synthesis", description: "drop a mine after picking up a power up", maxCount: 1, @@ -2532,30 +2487,12 @@ remove() { tech.isMineDrop = false; } - }, - { - name: "unified field theory", - description: `in the pause menu, change your field
by clicking on your field's box`, - maxCount: 1, - count: 0, - frequency: 1, - allowed() { - return (b.inventory.length > 1) || build.isExperimentSelection && !tech.isSuperDeterminism - }, - requires: "at least 2 guns, not superdeterminism", - effect() { - tech.isGunSwitchField = true; - }, - remove() { - tech.isGunSwitchField = false; - } - }, - { + }, { name: "dark patterns", description: "reduce combat difficulty by 1 level
add 18 junk tech to the potential pool", maxCount: 1, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, count: 0, frequency: 1, allowed() { @@ -2569,8 +2506,40 @@ // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) }, remove() {} - }, - { + }, { + name: "unified field theory", + description: `in the pause menu, change your field
by clicking on your field's box`, + maxCount: 1, + count: 0, + frequency: 1, + allowed() { + return !tech.isSuperDeterminism + }, + requires: "not superdeterminism", + effect() { + tech.isGunSwitchField = true; + }, + remove() { + tech.isGunSwitchField = false; + } + }, { + name: "statistical ensemble", + description: "increase the frequency of finding copies of
recursive tech you already have by 10000%", + maxCount: 1, + count: 0, + frequency: 1, + isNonRefundable: true, + allowed() { + return tech.totalCount > 9 + }, + requires: "at least 10 tech", + effect: () => { + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].count > 0) tech.tech[i].frequency += 100 + } + }, + remove() {} + }, { name: "cardinality", description: "tech, fields, and guns have 5 choices", maxCount: 1, @@ -2586,8 +2555,7 @@ remove() { tech.isExtraChoice = false; } - }, - { + }, { name: "determinism", description: "spawn 5 tech
tech, fields, and guns have only 1 choice", maxCount: 1, @@ -2607,8 +2575,7 @@ remove() { tech.isDeterminism = false; } - }, - { + }, { name: "superdeterminism", description: "spawn 7 tech
research, guns, and fields no longer spawn", maxCount: 1, @@ -2629,10 +2596,9 @@ remove() { tech.isSuperDeterminism = false; } - }, - { + }, { name: "gun technology", - description: "double the frequency of finding gun tech
spawn a gun", + description: "double the frequency of finding gun tech
spawn a gun", maxCount: 1, count: 0, frequency: 1, @@ -2651,10 +2617,9 @@ } }, remove() {} - }, - { + }, { name: "ammo technology", - description: "double the frequency of finding gun tech
spawn 6 ammo", + description: "double the frequency of finding gun tech
spawn 6 ammo", maxCount: 1, count: 0, frequency: 1, @@ -2672,10 +2637,9 @@ } }, remove() {} - }, - { + }, { name: "field technology", - description: "double the frequency of finding field tech
spawn a field", + description: "double the frequency of finding field tech
spawn a field", maxCount: 1, count: 0, frequency: 1, @@ -2693,10 +2657,9 @@ } }, remove() {} - }, - { + }, { name: "healing technology", - description: "double the frequency of finding healing tech
spawn 12 heals", + description: "double the frequency of finding healing tech
spawn 12 heals", maxCount: 1, count: 0, frequency: 1, @@ -2761,8 +2724,7 @@ tech.isRewindGun = false } } - }, - { + }, { name: "incendiary ammunition", description: "shotgun, super balls, and drones
are loaded with explosives", isGunTech: true, @@ -2779,8 +2741,7 @@ remove() { tech.isIncendiary = false; } - }, - { + }, { name: "fragmentation", description: "some detonations and collisions eject nails
blocks, rail gun, grenades, missiles, shotgun slugs", isGunTech: true, @@ -2797,8 +2758,7 @@ remove() { tech.fragments = 0 } - }, - { + }, { name: "superfluidity", description: "freeze effects are applied to a small area", isGunTech: true, @@ -2815,8 +2775,7 @@ remove() { tech.isAoESlow = false } - }, - { + }, { name: "radioactive contamination", description: "after a mob or shield dies,
leftover radiation spreads to a nearby mob", isGunTech: true, @@ -2833,8 +2792,7 @@ remove() { tech.isRadioactive = false } - }, - { + }, { name: "anti-shear topology", description: "some bullets last 30% longer
drones, spores, missiles, foam, wave, neutron", isGunTech: true, @@ -2851,8 +2809,7 @@ remove() { tech.isBulletsLastLonger = 1; } - }, - { + }, { name: "microstates", description: "increase damage by 4%
for every 10 active bullets", isGunTech: true, @@ -2869,8 +2826,7 @@ remove() { tech.isDamageFromBulletCount = false } - }, - { + }, { name: "needle gun", description: "nail gun fires 3 mob piercing needles
requires 3 times more ammo", isGunTech: true, @@ -2907,8 +2863,7 @@ } } } - }, - { + }, { name: "ceramic needle", description: `your needles pierce shields
directly damaging shielded mobs`, isGunTech: true, @@ -2925,8 +2880,7 @@ remove() { tech.isNeedleShieldPierce = false } - }, - { + }, { name: "rivet gun", description: "nail gun slowly fires a heavy rivet", isGunTech: true, @@ -2957,8 +2911,7 @@ } } } - }, - { + }, { name: "rivet diameter", description: `your rivets are 20% larger
increases mass and physical damage`, isGunTech: true, @@ -2975,8 +2928,7 @@ remove() { tech.rivetSize = 1; } - }, - { + }, { name: "ice crystal nucleation", description: "the nail gun uses energy to condense
unlimited freezing ice shards", isGunTech: true, @@ -3012,8 +2964,7 @@ } } } - }, - { + }, { name: "pneumatic actuator", description: "nail gun takes 45% less time to ramp up
to it's shortest delay after firing", isGunTech: true, @@ -3038,8 +2989,7 @@ } } } - }, - { + }, { name: "powder-actuated", description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed", isGunTech: true, @@ -3064,8 +3014,7 @@ } } } - }, - { + }, { name: "supercritical fission", description: "nails, needles, and rivets can explode
if they strike mobs near their center", isGunTech: true, @@ -3082,8 +3031,7 @@ remove() { tech.isNailCrit = false } - }, - { + }, { name: "irradiated nails", description: "nails and rivets are radioactive
about 90% more damage over 2 seconds", isGunTech: true, @@ -3100,8 +3048,7 @@ remove() { tech.isNailRadiation = false; } - }, - { + }, { name: "4s half-life", description: "nails are made of plutonium-238
increase damage by 100% over 6 seconds", isGunTech: true, @@ -3118,8 +3065,7 @@ remove() { tech.isSlowRadiation = false; } - }, - { + }, { name: "1/2s half-life", description: "nails are made of lithium-8
damage occurs after 1/2 a second", isGunTech: true, @@ -3136,8 +3082,7 @@ remove() { tech.isFastRadiation = false; } - }, - { + }, { name: "shotgun spin-statistics", description: "immune to harm while firing the shotgun
ammo costs are doubled", isGunTech: true, @@ -3176,8 +3121,7 @@ } } } - }, - { + }, { name: "nailshot", description: "the shotgun fires a burst of nails", isGunTech: true, @@ -3194,8 +3138,7 @@ remove() { tech.isNailShot = false; } - }, - { + }, { name: "shotgun slug", description: "the shotgun fires 1 large bullet", isGunTech: true, @@ -3212,8 +3155,7 @@ remove() { tech.isSlugShot = false; } - }, - { + }, { name: "Newton's 3rd law", description: "shotgun recoil is greatly increased
and has a 66% decreased delay after firing", isGunTech: true, @@ -3230,8 +3172,7 @@ remove() { tech.isShotgunRecoil = false; } - }, - { + }, { name: "super duper", description: "fire 1 additional super ball", isGunTech: true, @@ -3248,8 +3189,7 @@ remove() { tech.superBallNumber = 4; } - }, - { + }, { name: "super ball", description: "fire just 1 large super ball
that stuns mobs for 3 second", isGunTech: true, @@ -3266,8 +3206,7 @@ remove() { tech.oneSuperBall = false; } - }, - { + }, { name: "super sized", description: `your super balls are 20% larger
increases mass and physical damage`, isGunTech: true, @@ -3284,8 +3223,7 @@ remove() { tech.bulletSize = 1; } - }, - { + }, { name: "wave packet", description: "wave beam emits two oscillating particles
decrease wave damage by 20%", isGunTech: true, @@ -3302,8 +3240,7 @@ remove() { tech.waveHelix = 1 } - }, - { + }, { name: "phase velocity", description: "the wave beam propagates faster in solids", isGunTech: true, @@ -3322,8 +3259,7 @@ tech.waveSpeedMap = 0.08 tech.waveSpeedBody = 0.25 } - }, - { + }, { name: "bound state", description: "wave beam bullets last 5x longer
bullets are bound to a region around player", isGunTech: true, @@ -3340,8 +3276,7 @@ remove() { tech.isWaveReflect = false } - }, - { + }, { name: "cruise missile", description: "missiles travel 50% slower,
but have a 50% larger explosive payload", isGunTech: true, @@ -3358,8 +3293,7 @@ remove() { tech.missileSize = false } - }, - { + }, { name: "MIRV", description: "launch +1 missile at a time
decrease size and fire rate by 10%", isGunTech: true, @@ -3376,14 +3310,14 @@ remove() { tech.missileCount = 1; } - }, - { + }, { name: "missile-bot", description: "a bot fires missiles at far away mobs", isGunTech: true, maxCount: 1, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return tech.haveGunCheck("missiles") @@ -3396,8 +3330,7 @@ remove() { tech.missileBotCount = 0; } - }, - { + }, { name: "rocket-propelled grenade", description: "grenades rapidly accelerate forward
map collisions trigger an explosion", isGunTech: true, @@ -3416,8 +3349,7 @@ tech.isRPG = false; b.setGrenadeMode() } - }, - { + }, { name: "vacuum bomb", description: "grenades fire slower, explode bigger
and, suck everything towards them", isGunTech: true, @@ -3436,8 +3368,7 @@ tech.isVacuumBomb = false; b.setGrenadeMode() } - }, - { + }, { name: "neutron bomb", description: "grenades are irradiated with Cf-252
does damage, harm, and drains energy", isGunTech: true, @@ -3456,8 +3387,7 @@ tech.isNeutronBomb = false; b.setGrenadeMode() } - }, - { + }, { name: "water shielding", description: "increase neutron bomb's range by 20%
player is immune to its harmful effects", isGunTech: true, @@ -3474,8 +3404,7 @@ remove() { tech.isNeutronImmune = false } - }, - { + }, { name: "vacuum permittivity", description: "increase neutron bomb's range by 20%
objects in range of the bomb are slowed", isGunTech: true, @@ -3492,8 +3421,7 @@ remove() { tech.isNeutronSlow = false } - }, - { + }, { name: "laser-mines", description: "mines hover in place until mobs get in range
mines use energy to emit 3 unaimed lasers", isGunTech: true, @@ -3510,8 +3438,7 @@ remove() { tech.isLaserMine = false; } - }, - { + }, { name: "mine reclamation", description: "retrieve ammo from all undetonated mines
and 20% of mines after detonation", isGunTech: true, @@ -3528,8 +3455,7 @@ remove() { tech.isMineAmmoBack = false; } - }, - { + }, { name: "sentry", description: "mines target mobs with nails over time
mines last about 12 seconds", isGunTech: true, @@ -3546,8 +3472,7 @@ remove() { tech.isMineSentry = false; } - }, - { + }, { name: "mycelial fragmentation", description: "sporangium release an extra spore
once a second during their growth phase", isGunTech: true, @@ -3564,8 +3489,7 @@ remove() { tech.isSporeGrowth = false } - }, - { + }, { name: "tinsellated flagella", description: "sporangium release 2 more spores
spores accelerate 50% faster", isGunTech: true, @@ -3582,8 +3506,7 @@ remove() { tech.isFastSpores = false } - }, - { + }, { name: "cryodesiccation", description: "sporangium release 2 more spores
spores freeze mobs for 1.5 second", //
spores do 1/3 damage @@ -3601,8 +3524,7 @@ remove() { tech.isSporeFreeze = false } - }, - { + }, { name: "diplochory", description: "spores use the player for dispersal
until they locate a viable host", isGunTech: true, @@ -3619,8 +3541,7 @@ remove() { tech.isSporeFollow = false } - }, - { + }, { name: "mutualism", description: "increase spore damage by 150%
spores borrow 0.5 health until they die", isGunTech: true, @@ -3637,8 +3558,7 @@ remove() { tech.isMutualism = false } - }, - { + }, { name: "brushless motor", description: "drones accelerate 50% faster", isGunTech: true, @@ -3655,8 +3575,7 @@ remove() { tech.isFastDrones = false } - }, - { + }, { name: "harvester", description: "after a drone picks up a power up,
it's larger, faster, and very durable", isGunTech: true, @@ -3673,8 +3592,7 @@ remove() { tech.isDroneGrab = false } - }, - { + }, { name: "necrophoresis", description: "foam bubbles grow and split into 3 copies
when the mob they are stuck to dies", isGunTech: true, @@ -3691,8 +3609,7 @@ remove() { tech.isFoamGrowOnDeath = false; } - }, - { + }, { name: "colloidal foam", description: "foam bubbles dissipate 40% faster
increase foam damage per second by 300%", isGunTech: true, @@ -3709,8 +3626,7 @@ remove() { tech.isFastFoam = false; } - }, - { + }, { name: "foam fractionation", description: "foam gun bubbles are 100% larger
when you have below 300 ammo", isGunTech: true, @@ -3727,8 +3643,7 @@ remove() { tech.isAmmoFoamSize = false; } - }, - { + }, { name: "quantum foam", description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 143%", isGunTech: true, @@ -3800,8 +3715,7 @@ remove() { tech.isRailEnergyGain = false; } - }, - { + }, { name: "dielectric polarization", description: "firing the rail gun damages nearby mobs", isGunTech: true, @@ -3818,8 +3732,7 @@ remove() { tech.isRailAreaDamage = false; } - }, - { + }, { name: "capacitor bank", description: "the rail gun no longer takes time to charge
rail gun rods are 66% less massive", isGunTech: true, @@ -3836,8 +3749,7 @@ remove() { tech.isCapacitor = false; } - }, - { + }, { name: "laser diodes", description: "all lasers drain 30% less energy
effects laser-gun, laser-bot, and laser-mines", isGunTech: true, @@ -3854,8 +3766,7 @@ remove() { tech.isLaserDiode = 1; } - }, - { + }, { name: "relativistic momentum", description: "all lasers push mobs away
effects laser-gun, laser-bot, and laser-mines", isGunTech: true, @@ -3895,8 +3806,7 @@ tech.laserDamage = 0.16; tech.laserFieldDrain = 0.0018; } - }, - { + }, { name: "diffraction grating", description: `your laser gains 2 diverging beams
decrease individual beam damage by 10%`, isGunTech: true, @@ -3921,8 +3831,7 @@ } } } - }, - { + }, { name: "diffuse beam", description: "laser beam is wider and doesn't reflect
increase full beam damage by 175%", isGunTech: true, @@ -3949,8 +3858,7 @@ } } } - }, - { + }, { name: "output coupler", description: "widen diffuse laser beam by 40%
increase full beam damage by 40%", isGunTech: true, @@ -3977,8 +3885,7 @@ if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod() } } - }, - { + }, { name: "slow light propagation", description: "laser beam is spread into your recent past
increase total beam damage by 300%", isGunTech: true, @@ -4005,8 +3912,7 @@ } } } - }, - { + }, { name: "pulse", description: "use 25% of your energy in a pulsed laser
that instantly initiates a fusion explosion", isGunTech: true, @@ -4031,8 +3937,7 @@ } } } - }, - { + }, { name: "shock wave", description: "mobs caught in pulse's explosion are stunned
for up to 2 seconds", isGunTech: true, @@ -4049,8 +3954,7 @@ remove() { tech.isPulseStun = false; } - }, - { + }, { name: "neocognitron", description: "pulse automatically aims at a nearby mob
50% decreased delay after firing", isGunTech: true, @@ -4089,8 +3993,7 @@ remove() { tech.blockDmg = 0; } - }, - { + }, { name: "frequency resonance", description: "standing wave harmonics shield is retuned
increase size and blocking efficiency by 50%", isFieldTech: true, @@ -4109,8 +4012,7 @@ m.fieldRange = 175; m.fieldShieldingScale = 1; } - }, - { + }, { name: "flux pinning", description: "blocking with your field
stuns mobs for +2 second", isFieldTech: true, @@ -4127,8 +4029,7 @@ remove() { tech.isStunField = 0; } - }, - { + }, { name: "fracture analysis", description: "bullet impacts do 400% damage
to stunned mobs", isFieldTech: true, @@ -4145,8 +4046,7 @@ remove() { tech.isCrit = false; } - }, - { + }, { name: "eddy current brake", description: "your stored energy projects a field that
limits the top speed of mobs", isFieldTech: true, @@ -4163,8 +4063,7 @@ remove() { tech.isPerfectBrake = false; } - }, - { + }, { name: "pair production", description: "picking up a power up gives you 250 energy", isFieldTech: true, @@ -4182,16 +4081,16 @@ remove() { tech.isMassEnergy = false; } - }, - { + }, { name: "bot manufacturing", description: "use nano-scale manufacturing
to build 3 random bots", isFieldTech: true, maxCount: 1, count: 0, frequency: 1, + isBotTech: true, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" }, @@ -4203,16 +4102,16 @@ b.randomBot() }, remove() {} - }, - { + }, { name: "bot prototypes", - description: "use nano-scale manufacturing to upgrade
all bots to a random type and build 2 of that bot", + description: "use nano-scale manufacturing to upgrade
all bots to a random type and build 2 bots", isFieldTech: true, maxCount: 1, count: 0, frequency: 1, + isBotTech: true, isNonRefundable: true, - isExperimentHide: true, + // isExperimentHide: true, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isNailBotUpgrade && tech.isFoamBotUpgrade && tech.isBoomBotUpgrade && tech.isLaserBotUpgrade && tech.isOrbitBotUpgrade) }, @@ -4289,8 +4188,7 @@ notUpgradedBots[Math.floor(Math.random() * notUpgradedBots.length)]() }, remove() {} - }, - { + }, { name: "mycelium manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to grow spores", isFieldTech: true, @@ -4307,8 +4205,7 @@ remove() { tech.isSporeField = false; } - }, - { + }, { name: "missile manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to construct missiles", isFieldTech: true, @@ -4325,8 +4222,7 @@ remove() { tech.isMissileField = false; } - }, - { + }, { name: "ice IX manufacturing", description: "nano-scale manufacturing is repurposed
excess energy used to synthesize ice IX", isFieldTech: true, @@ -4343,8 +4239,7 @@ remove() { tech.isIceField = false; } - }, - { + }, { name: "thermoelectric effect", description: "killing mobs with ice IX gives 4 health
and 80 energy", isFieldTech: true, @@ -4361,8 +4256,7 @@ remove() { tech.iceEnergy = 0; } - }, - { + }, { name: "degenerate matter", description: "reduce harm by 50%
while negative mass field is active", isFieldTech: true, @@ -4379,8 +4273,7 @@ remove() { tech.isHarmReduce = false; } - }, - { + }, { name: "annihilation", description: "touching normal mobs annihilates them
drains 33% of maximum energy", isFieldTech: true, @@ -4397,8 +4290,7 @@ remove() { tech.isAnnihilation = false; } - }, - { + }, { name: "Bose Einstein condensate", description: "mobs inside your field are frozen
pilot wave, negative mass, time dilation", isFieldTech: true, @@ -4451,14 +4343,14 @@ remove() { tech.isPlasmaRange = 1; } - }, - { + }, { name: "plasma-bot", description: "a bot uses energy to emit plasma
that damages and pushes mobs", isFieldTech: true, maxCount: 1, count: 0, frequency: 1, + isBot: true, isBotTech: true, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" @@ -4471,8 +4363,7 @@ remove() { tech.plasmaBotCount = 0; } - }, - { + }, { name: "micro-extruder", description: "plasma torch extrudes a thin hot wire
increases damage, and energy drain", isFieldTech: true, @@ -4489,8 +4380,7 @@ remove() { tech.isExtruder = false; } - }, - { + }, { name: "timelike world line", description: "time dilation doubles your relative time rate
and makes you immune to harm", isFieldTech: true, @@ -4509,8 +4399,7 @@ tech.isTimeSkip = false; b.setFireCD(); } - }, - { + }, { name: "Lorentz transformation", description: "permanently increase your relative time rate
move, jump, and shoot 40% faster", isFieldTech: true, @@ -4533,8 +4422,7 @@ m.setMovement(); b.setFireCD(); } - }, - { + }, { name: "time crystals", description: "quadruple your default energy regeneration", isFieldTech: true, @@ -4553,8 +4441,7 @@ tech.energyRegen = 0.001; m.fieldRegen = tech.energyRegen; } - }, - { + }, { name: "boson composite", description: "intangible to blocks and mobs while cloaked
passing through mobs drains your energy", isFieldTech: true, @@ -4571,8 +4458,7 @@ remove() { tech.isIntangible = false; } - }, - { + }, { name: "dazzler", description: "decloaking stuns nearby mobs
drains 30% of your stored energy", isFieldTech: true, @@ -4589,8 +4475,7 @@ remove() { tech.isCloakStun = false; } - }, - { + }, { name: "discrete optimization", description: "increase damage by 66%
50% increased delay after firing", isFieldTech: true, @@ -4609,8 +4494,7 @@ tech.aimDamage = 1 b.setFireCD(); } - }, - { + }, { name: "cosmic string", description: "stun and do radioactive damage to mobs
if you tunnel through them with a wormhole", isFieldTech: true, @@ -4627,8 +4511,7 @@ remove() { tech.isWormholeDamage = false } - }, - { + }, { name: "Penrose process", description: "after a block falls into a wormhole
you gain 50 energy", isFieldTech: true, @@ -4645,8 +4528,7 @@ remove() { tech.isWormholeEnergy = false } - }, - { + }, { name: "transdimensional spores", description: "when blocks fall into a wormhole
higher dimension spores are summoned", isFieldTech: true, @@ -4663,8 +4545,7 @@ remove() { tech.isWormSpores = false } - }, - { + }, { name: "traversable geodesics", description: "your bullets can traverse wormholes
spawn a gun and ammo", isFieldTech: true, @@ -4705,8 +4586,7 @@ m.shipMode() }, remove() {} - }, - { + }, { name: "quantum leap", description: "experiment: every 20 seconds
become an alternate version of yourself", maxCount: 1, @@ -4726,8 +4606,7 @@ }, 20000); //every 20 sections }, remove() {} - }, - { + }, { name: "shields", description: "experiment: every 5 seconds
all mobs gain a shield", maxCount: 1, @@ -4772,6 +4651,83 @@ // remove() {} // }, { + name: "probability", + description: "increase the frequency
of a random tech by 100", + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isExperimentHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + let options = []; //find what tech I could get + for (let i = 0, len = tech.tech.length; i < len; i++) { + if ( + tech.tech[i].count < tech.tech[i].maxCount && + tech.tech[i].allowed() && + !tech.tech[i].isJunk + ) { + for (let j = 0; j < tech.tech[i].frequency; j++) options.push(i); + } + } + const index = options[Math.floor(Math.random() * options.length)] + tech.tech[index].frequency = 100 + console.log(tech.tech[index]) + }, + remove() {} + }, + { + name: "encryption", + description: "secure tech information", + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isExperimentHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + String.prototype.shuffle = function() { + var a = this.split(""), + n = a.length; + + for (var i = n - 1; i > 0; i--) { + var j = Math.floor(Math.random() * (i + 1)); + var tmp = a[i]; + a[i] = a[j]; + a[j] = tmp; + } + return a.join(""); + } + + for (let i = 0, len = tech.tech.length; i < len; i++) tech.tech[i].name = tech.tech[i].name.shuffle() + }, + remove() {} + }, { + name: "transparency", + description: "become invisible to yourself
mobs can still see you", + maxCount: 1, + count: 0, + frequency: 0, + isNonRefundable: true, + isExperimentHide: true, + isJunk: true, + allowed() { + return true + }, + requires: "", + effect() { + m.draw = () => {} + }, + remove() {} + }, { name: "quantum leap", description: "become an alternate version of yourself
every 20 seconds", maxCount: 1, @@ -4791,10 +4747,9 @@ }, 20000); //every 30 sections }, remove() {} - }, - { + }, { name: "pop-ups", - description: "sign up to learn endless easy ways to win n-gon
that landgreen doesn't want you to know about!!!1!!", + description: "sign up to learn endless easy ways to win n-gon
that Landgreen doesn't want you to know!!!1!!", maxCount: 1, count: 0, frequency: 0, @@ -4811,8 +4766,7 @@ }, 30000); //every 30 sections }, remove() {} - }, - { + }, { name: "music", description: "add music to n-gon", maxCount: 1, @@ -4829,8 +4783,7 @@ window.open('https://www.youtube.com/results?search_query=music', '_blank') }, remove() {} - }, - { + }, { name: "performance", description: "display performance stats to n-gon", maxCount: 1, @@ -4862,10 +4815,9 @@ document.getElementById("health-bg").style.left = "86px" }, remove() {} - }, - { + }, { name: "defragment", - description: "erase all junk tech from the possible pool
probably...", + description: "set the frequency of finding junk tech to zero", maxCount: 1, count: 0, frequency: 0, @@ -4877,15 +4829,12 @@ }, requires: "", effect() { - setTimeout(() => { //have to wait a sec so that the tech that is this doesn't get removed before it is done running - for (let i = tech.tech.length - 1; i > 0; i--) { - if (tech.tech[i].isJunk && tech.tech[i] !== this) tech.tech.splice(i, 1) - } - }, 1000); + for (let i = tech.tech.length - 1; i > 0; i--) { + if (tech.tech[i].isJunk) tech.tech[i].frequency = 0 + } }, remove() {} - }, - { + }, { name: "ship", description: "fly around with no legs
reduce combat difficulty by 1 level", maxCount: 1, @@ -4942,8 +4891,7 @@ setInterval(() => { if (!simulation.paused) ctx.rotate(0.001 * Math.sin(simulation.cycle * 0.01)) }, 16); }, remove() {} - }, - { + }, { name: "umbra", description: "produce a blue glow around everything
and probably some simulation lag", maxCount: 1, @@ -4961,8 +4909,7 @@ ctx.shadowBlur = 25; }, remove() {} - }, - { + }, { name: "lighter", description: `ctx.globalCompositeOperation = "lighter"`, maxCount: 1, @@ -4979,8 +4926,7 @@ ctx.globalCompositeOperation = "lighter"; }, remove() {} - }, - { + }, { name: "rewind", description: "every 5 seconds rewind 2 seconds
lasts 120 seconds", maxCount: 9, @@ -4999,8 +4945,7 @@ } }, remove() {} - }, - { + }, { name: "energy to mass conversion", description: "convert your energy into blocks", maxCount: 9, @@ -5029,8 +4974,7 @@ }, remove() {} - }, - { + }, { name: "level.nextLevel()", description: "advance to the next level", maxCount: 9, @@ -5047,8 +4991,7 @@ level.nextLevel(); }, remove() {} - }, - { + }, { name: "expert system", description: "spawn a tech power up
add 64 junk tech to the potential pool", maxCount: 9, @@ -5066,8 +5009,7 @@ tech.addJunkTechToPool(64) }, remove() {} - }, - { + }, { name: "energy investment", description: "every 10 seconds drain your energy
return it doubled 10 seconds later
lasts 180 seconds", maxCount: 9, @@ -5092,8 +5034,7 @@ } }, remove() {} - }, - { + }, { name: "missile Launching System", description: "fire missiles for the next 60 seconds", maxCount: 9, @@ -5118,8 +5059,7 @@ } }, remove() {} - }, - { + }, { name: "grenade production", description: "drop grenades for the next 120 seconds", maxCount: 9, @@ -5218,10 +5158,9 @@ } }, remove() {} - }, - { + }, { name: "diegesis", - description: "indicate gun fire delay through a rotation of your head", + description: "indicate gun fire delay
through a rotation of your head", maxCount: 1, count: 0, frequency: 0, @@ -5262,8 +5201,7 @@ } }, remove() {} - }, - { + }, { name: "pareidolia", description: "don't", maxCount: 1, @@ -5334,8 +5272,7 @@ } }, remove() {} - }, - { + }, { name: "prism", description: "you cycle through different colors", maxCount: 1, @@ -5360,13 +5297,13 @@ }, 10); }, remove() {} - }, - { + }, { name: "assimilation", description: "all your bots are converted to the same random model", maxCount: 1, count: 0, frequency: 0, + isBotTech: true, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5418,8 +5355,7 @@ for (let i = 0; i < total; i++) bots[index]() }, remove() {} - }, - { + }, { name: "growth hacking", description: "increase combat difficulty by 1 level", maxCount: 1, @@ -5436,8 +5372,7 @@ level.difficultyIncrease(simulation.difficultyMode) }, remove() {} - }, - { + }, { name: "stun", description: "stun all mobs for up to 8 seconds", maxCount: 9, @@ -5454,8 +5389,7 @@ for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 480) }, remove() {} - }, - { + }, { name: "re-arm", description: "eject all your guns", maxCount: 9, @@ -5482,8 +5416,7 @@ simulation.makeGunHUD(); //update gun HUD }, remove() {} - }, - { + }, { name: "re-research", description: "eject all your research", maxCount: 9, @@ -5501,10 +5434,9 @@ powerUps.research.count = 0 }, remove() {} - }, - { + }, { name: "quantum black hole", - description: "use all your energy to
spawn inside the event horizon of a huge black hole", + description: "use all your energy to spawn
inside the event horizon of a huge black hole", maxCount: 9, count: 0, frequency: 0, @@ -5520,8 +5452,7 @@ spawn.suckerBoss(m.pos.x, m.pos.y - 1000) }, remove() {} - }, - { + }, { name: "black hole cluster", description: "spawn 2 research
spawn 40 nearby black holes", maxCount: 9, diff --git a/style.css b/style.css index 8fd7362..e3550e1 100644 --- a/style.css +++ b/style.css @@ -714,6 +714,29 @@ summary { } +.flicker { + animation: flicker 4s linear infinite; +} + +@keyframes flicker { + 0% { + opacity: 1; + } + + 80% { + opacity: 1; + } + + 90% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + + .box { padding: 3px 8px 3px 8px; border: 2px solid #444; diff --git a/todo.txt b/todo.txt index 438061b..81bf5bd 100644 --- a/todo.txt +++ b/todo.txt @@ -1,14 +1,5 @@ ******************************************************** NEXT PATCH ******************************************************** -some tech now has 2x,3x,4x frequency of showing up - (most tech is at 1x, a few are at 2x if they have a rare requirement to unlock) -reworked junk and lore tech systems - (might be some new bugs) - -tech that used to just summon a power up now also increases tech frequency -removed the 4 perpetual techs - -maybe fixed immune boss bug on detours level ******************************************************** BUGS ******************************************************** @@ -54,6 +45,9 @@ use the floor of portal sensor on the player? to unstuck player ******************************************************** TODO ******************************************************** +mob - grows after taking damage +mob - attack outwardly after taking damage + tech- foam is attracted to mobs use a gravitational attraction model? could foam be attracted to other foam bullets too?