From 9e98ceb4e14f3d7c1471de169d49fb7d9e64eae9 Mon Sep 17 00:00:00 2001 From: landgreen Date: Tue, 2 Mar 2021 04:24:23 -0800 Subject: [PATCH] frequency 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 --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 48 +-- js/engine.js | 2 +- js/index.js | 12 +- js/level.js | 34 +- js/player.js | 34 +- js/powerup.js | 13 +- js/spawn.js | 70 +--- js/tech.js | 868 +++++++++++++++++++++++++++++++++----------------- todo.txt | 16 +- 10 files changed, 677 insertions(+), 420 deletions(-) diff --git a/.DS_Store b/.DS_Store index 1d04de965b59973a0d6da8e6a4e6069274eb01ef..8e6031ab83dbd4a74474a859ba20bbe39b28e4af 100644 GIT binary patch delta 22 dcmZoMXffEJ#mqF>ezFd;FO$%R&DG4EA^=cU2KxX2 delta 22 dcmZoMXffEJ#mrQ*cd`z%FO%?v&DG4EA^=pu2SWe= diff --git a/js/bullet.js b/js/bullet.js index 879bab5..b2fde2f 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -3922,48 +3922,34 @@ const b = { ammoPack: 36, have: false, fire() { + m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down + const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12 + const SPEED = 18 - radius * 0.4; + const dir = m.angle + 0.15 * (Math.random() - 0.5) + const velocity = { + x: SPEED * Math.cos(dir), + y: SPEED * Math.sin(dir) + } + const position = { + x: m.pos.x + 30 * Math.cos(m.angle), + y: m.pos.y + 30 * Math.sin(m.angle) + } if (tech.foamFutureFire) { - m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down - const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12 - const SPEED = 18 - radius * 0.4; - const dir = m.angle + 0.2 * (Math.random() - 0.5) - const velocity = { - x: SPEED * Math.cos(dir), - y: SPEED * Math.sin(dir) - } - const position = { - x: m.pos.x + 30 * Math.cos(m.angle), - y: m.pos.y + 30 * Math.sin(m.angle) - } simulation.drawList.push({ //add dmg to draw queue x: position.x, y: position.y, radius: 5, color: "rgba(0,0,0,0.1)", - time: 18 * tech.foamFutureFire + time: 15 * tech.foamFutureFire }); - setTimeout(() => { if (!simulation.paused) { - b.foam(position, velocity, radius) - bullet[bullet.length - 1].damage = (1 + 1.53 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage + b.foam(position, Vector.rotate(velocity, 0.5 * (Math.random() - 0.5)), radius) + bullet[bullet.length - 1].damage = (1 + 1.43 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage } - }, 300 * tech.foamFutureFire); - + }, 250 * tech.foamFutureFire); } else { - m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 15 : 5) * b.fireCD); // cool down - const radius = (m.crouch ? 10 + 5 * Math.random() : 4 + 6 * Math.random()) + (tech.isAmmoFoamSize && this.ammo < 300) * 12 - const SPEED = 18 - radius * 0.4; - const dir = m.angle + 0.2 * (Math.random() - 0.5) - const velocity = { - x: SPEED * Math.cos(dir), - y: SPEED * Math.sin(dir) - } - const position = { - x: m.pos.x + 30 * Math.cos(m.angle), - y: m.pos.y + 30 * Math.sin(m.angle) - } - b.foam(position, velocity, radius) + b.foam(position, Vector.rotate(velocity, 0.5 * (Math.random() - 0.5)), radius) } } }, diff --git a/js/engine.js b/js/engine.js index 762e2df..55e33f3 100644 --- a/js/engine.js +++ b/js/engine.js @@ -138,7 +138,7 @@ function collisionChecks(event) { y: mob[k].velocity.y - 8 * Math.sin(angle) }); - if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) { + if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) { m.energy -= 0.33 * m.maxEnergy m.immuneCycle = 0; //player doesn't go immune to collision damage mob[k].death(); diff --git a/js/index.js b/js/index.js index 46fcccd..e2d4c44 100644 --- a/js/index.js +++ b/js/index.js @@ -485,7 +485,9 @@ const build = { removeOne(); } simulation.isCheating = true; - tech.removeLoreTechFromPool(); + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isLore) tech.tech[i].frequency = 0; + } document.body.style.cursor = "none"; document.body.style.overflow = "hidden" document.getElementById("experiment-grid").style.display = "none" @@ -766,7 +768,13 @@ window.addEventListener("keydown", function(event) { if (simulation.isConstructionMode) document.getElementById("construct").style.display = 'inline' if (!simulation.isCheating) { simulation.isCheating = true; - tech.removeLoreTechFromPool(); + lore.techCount = 0; + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isLore) { + tech.tech[i].frequency = 0; + tech.tech[i].count = 0; + } + } } simulation.makeTextLog( ` diff --git a/js/level.js b/js/level.js index 593e011..c1a5df1 100644 --- a/js/level.js +++ b/js/level.js @@ -12,7 +12,7 @@ const level = { start() { if (level.levelsCleared === 0) { //this code only runs on the first level // simulation.enableConstructMode() //used to build maps in testing mode - // level.difficultyIncrease(5) + // level.difficultyIncrease(25) // simulation.zoomScale = 1000; // simulation.setZoom(); // m.setField("nano-scale manufacturing") @@ -56,7 +56,6 @@ const level = { // level.basement(); //fan level // level.stronghold() //fan level - for (let i = 0; i < 150; i++) tech.addLoreTechToPool(); // powerUps.directSpawn(simulation.mouseInGame.x, simulation.mouseInGame.y, "tech"); // tech.giveTech("undefined") // lore.techCount = 7 @@ -101,16 +100,16 @@ const level = { const len = Math.floor((m.maxHealth - m.health) / 0.5) for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false); } - if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false); - if (tech.isPerpetualAmmo) { - for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false); - } - if (tech.isPerpetualHeal) { - for (let i = 0; i < 2; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false); - } - if (tech.isPerpetualStun) { - for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780) - } + // if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false); + // if (tech.isPerpetualAmmo) { + // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false); + // } + // if (tech.isPerpetualHeal) { + // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false); + // } + // if (tech.isPerpetualStun) { + // for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780) + // } if (tech.isFlipFlopHarm && tech.isFlipFlopLevelReset && !tech.isFlipFlopOn) { tech.isFlipFlopOn = true simulation.makeTextLog(`tech.isFlipFlopOn = true`); @@ -4027,7 +4026,11 @@ const level = { // if (simulation.difficulty > 4) spawn.nodeGroup(8000, 630, "spawns", 8, 20, 105); // } else { spawn.randomLevelBoss(8000, 630, ["shooterBoss", "launcherBoss", "laserTargetingBoss", "spiderBoss", "laserBoss", "bomberBoss", "orbitalBoss"]); - let me = mob[mob.length - 1]; + //find level boss index + let me + for (let i = 0, len = mob.length; i < len; i++) { + if (mob[i].isBoss) me = mob[i] + } me.onDeath = function() { this.removeCons(); //remove constraint spawnCouloirEnHaut() @@ -4036,7 +4039,10 @@ const level = { // } } else { spawn.randomLevelBoss(8000, 630, ["shooterBoss"]); - let me = mob[mob.length - 1]; + let me + for (let i = 0, len = mob.length; i < len; i++) { + if (mob[i].isBoss) me = mob[i] + } me.onDeath = function() { spawnCouloirEnHaut() doorSortieSalle.isOpen = false; diff --git a/js/player.js b/js/player.js index 6bff2f6..195e976 100644 --- a/js/player.js +++ b/js/player.js @@ -310,22 +310,30 @@ const m = { //remove all tech and count current tech total let totalTech = 0; for (let i = 0, len = tech.tech.length; i < len; i++) { - if ( - !tech.tech[i].isNonRefundable && - !tech.tech[i].isLore && - tech.tech[i].name !== "many-worlds" && - tech.tech[i].name !== "decoherence" - ) { - totalTech += tech.tech[i].count - tech.tech[i].remove(); - tech.tech[i].isLost = false - tech.tech[i].count = 0 + if (!tech.tech[i].isLore) { + if (tech.tech[i].isJunk) { + tech.tech[i].frequency = 0 + } else if (tech.tech[i].frequencyDefault) { + tech.tech[i].frequency = tech.tech[i].frequencyDefault + } else { + tech.tech[i].frequency = 1 + } + if ( + !tech.tech[i].isNonRefundable && + tech.tech[i].name !== "many-worlds" && + tech.tech[i].name !== "decoherence" + ) { + totalTech += tech.tech[i].count + tech.tech[i].remove(); + tech.tech[i].isLost = false + tech.tech[i].count = 0 + } } } // lore.techCount = 0; // tech.removeLoreTechFromPool(); // tech.addLoreTechToPool(); - tech.removeJunkTechFromPool(); + // tech.removeJunkTechFromPool(); tech.armorFromPowerUps = 0; tech.totalCount = 0; const randomBotCount = b.totalBots() @@ -508,7 +516,7 @@ const m = { if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34 if (tech.energyRegen === 0) dmg *= 0.34 - if (tech.isTurret && m.crouch) dmg *= 0.5; + if (tech.isTurret && m.crouch) dmg *= 0.55; if (tech.isFireMoveLock && input.fire) dmg *= 0.4; if (tech.isEntanglement && b.inventory[0] === b.activeGun) { for (let i = 0, len = b.inventory.length; i < len; i++) dmg *= 0.87 // 1 - 0.15 @@ -2833,7 +2841,7 @@ const m = { y: mob[k].velocity.y - 8 * Math.sin(angle) }); - if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) { + if (tech.isAnnihilation && !mob[k].shield && !mob[k].isShielded && !mob[k].isBoss && mob[k].dropPowerUp && m.energy > 0.34 * m.maxEnergy) { m.energy -= 0.33 * m.maxEnergy m.immuneCycle = 0; //player doesn't go immune to collision damage mob[k].death(); diff --git a/js/powerup.js b/js/powerup.js index 3909137..4dda1de 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -288,18 +288,14 @@ const powerUps = { let options = []; for (let i = 0; i < tech.tech.length; i++) { if (tech.tech[i].count < tech.tech[i].maxCount && i !== skip1 && i !== skip2 && i !== skip3 && i !== skip4 && tech.tech[i].allowed()) { - options.push(i); + for (let j = 0, len = tech.tech[i].frequency; j < len; j++) options.push(i); } } powerUps.tech.lastTotalChoices = options.length //this is recorded so that banish can know how many tech were available - if (tech.isBanish) { //remove banished tech from last selection for (let i = 0; i < powerUps.tech.banishLog.length; i++) { for (let j = 0; j < options.length; j++) { - if (powerUps.tech.banishLog[i] === options[j]) { - options.splice(j, 1) - break - } + if (powerUps.tech.banishLog[i] === options[j]) options.splice(j, 1) } } } else { //remove repeats from last selection @@ -308,10 +304,7 @@ const powerUps = { for (let i = 0; i < totalChoices; i++) { //repeat for each choice from the last selection if (options.length > totalChoices) { for (let j = 0, len = options.length; j < len; j++) { - if (powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i] === options[j]) { - options.splice(j, 1) //remove previous choice from option pool - break - } + if (powerUps.tech.choiceLog[powerUps.tech.choiceLog.length - 1 - i] === options[j]) options.splice(j, 1) //remove previous choice from option pool } } } diff --git a/js/spawn.js b/js/spawn.js index 6fd415f..c8339bb 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -105,13 +105,12 @@ const spawn = { level.levels.push("null") level.exit.x = 5500; level.exit.y = -330; - simulation.makeTextLog(`undefined= ${lore.techCount}/${lore.techGoal}
level.levels.push("null")`); + simulation.makeTextLog(`undefined= ${lore.techCount}/${lore.techGoal}
level.levels.push("null")`); //remove block map element so exit is clear Matter.World.remove(engine.world, map[map.length - 1]); map.splice(map.length - 1, 1); simulation.draw.setPaths(); //redraw map draw path - } else { - //reset game + } else { //reset game let count = 0 function loop() { @@ -133,50 +132,15 @@ const spawn = { if (!simulation.testing) requestAnimationFrame(loop); } requestAnimationFrame(loop); - - // setTimeout(() => { - // if (simulation.paused || simulation.testing) isEnding = false - // simulation.makeTextLog(`simulation.complete()`); - // let delay = 2000 - // for (let i = 0; i < 1; i += 0.01 + 0.2 * Math.random() * Math.random()) { - // setTimeout(function() { - // if (!simulation.paused && !simulation.testing) simulation.makeTextLog(`simulation.analysis = ${(i).toFixed(3)}`); - // }, delay); - // delay += 1000 - // } - // setTimeout(function() { - // if (isEnding) simulation.makeTextLog(`simulation.analysis = 1`); - // setTimeout(() => { - // if (isEnding) simulation.makeTextLog(`undefined= ${lore.techCount}/10`); - // setTimeout(() => { - // if (isEnding) { - // if (isEnding) simulation.makeTextLog(`World.clear(engine.world)`); - // setTimeout(() => { if (isEnding) m.death() }, 4000); - // } - // }, 3000); - // }, 2000); - // }, delay); - // }, 5000); } - //ramp up damage - for (let i = 0; i < 3; i++) level.difficultyIncrease(simulation.difficultyMode) - - //set game to the next highest difficulty level if not on why - // if (simulation.difficultyMode < 6) { - // if (simulation.difficultyMode === 0) { - // simulation.difficultyMode = 1 - // } else if (simulation.difficultyMode === 1) { - // simulation.difficultyMode = 2 - // } else if (simulation.difficultyMode === 2) { - // simulation.difficultyMode = 4 - // } else { - // simulation.difficultyMode = 6 - // } - // document.getElementById("difficulty-select").value = simulation.difficultyMode - // localSettings.difficultyMode = simulation.difficultyMode - // localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage - // simulation.makeTextLog(`simulation.difficultyMode++`); - // } + // for (let i = 0; i < 3; i++) + level.difficultyIncrease(simulation.difficultyMode) //ramp up damage + //remove power Ups, to avoid spamming console + function removeAll(array) { + for (let i = 0; i < array.length; ++i) Matter.World.remove(engine.world, array[i]); + } + removeAll(powerUp); + powerUp = []; //pull in particles for (let i = 0, len = body.length; i < len; ++i) { @@ -186,12 +150,7 @@ const spawn = { } //damage all mobs for (let i = 0, len = mob.length; i < len; ++i) { - if (mob[i] !== this) { - mob[i].damage(Infinity, true); - - // const velocity = Vector.mult(Vector.normalise(Vector.sub(this.position, mob[i].position)), -65) - // Matter.Body.setVelocity(mob[i], Vector.add(mob[i].velocity, velocity)); - } + if (mob[i] !== this) mob[i].damage(Infinity, true); } //draw stuff @@ -204,7 +163,6 @@ const spawn = { time: 5 * (len - i + 1) }); } - }; me.onDamage = function() {}; me.cycle = 420; @@ -1242,7 +1200,6 @@ const spawn = { }; me.awake = function() { this.checkStatus(); - //health bar needs to be here because the position is being set const h = this.radius * 0.3; const w = this.radius * 2; @@ -1267,8 +1224,8 @@ const spawn = { ctx.setLineDash([125 * Math.random(), 125 * Math.random()]); // ctx.lineDashOffset = 6*(simulation.cycle % 215); if (this.distanceToPlayer() < this.laserRange) { - if (m.energy > 0.003) m.energy -= 0.003 - if (m.immuneCycle < m.cycle && m.energy < 0.1) m.damage(0.0003 * simulation.dmgScale); + if (m.energy > 0.002) m.energy -= 0.002 + if (m.immuneCycle < m.cycle) m.damage(0.0001 * simulation.dmgScale); ctx.beginPath(); ctx.moveTo(eye.x, eye.y); ctx.lineTo(m.pos.x, m.pos.y); @@ -1295,7 +1252,6 @@ const spawn = { Matter.Body.setPosition(this, { x: history.position.x, y: history.position.y - history.yOff + 24.2859 }) //bullets move with player } } - me.do = function() { if (this.seePlayer.recall || (!(simulation.cycle % this.seePlayerFreq) && this.distanceToPlayer2() < this.seeAtDistance2 && !m.isCloak)) { setTimeout(() => { diff --git a/js/tech.js b/js/tech.js index 27dcca8..c3969c7 100644 --- a/js/tech.js +++ b/js/tech.js @@ -5,11 +5,18 @@ tech.tech[i].remove(); tech.tech[i].isLost = false tech.tech[i].count = 0 + if (tech.tech[i].isJunk) { + tech.tech[i].frequency = 0 + } else if (tech.tech[i].frequencyDefault) { + tech.tech[i].frequency = tech.tech[i].frequencyDefault + } else { + tech.tech[i].frequency = 1 + } } lore.techCount = 0; - tech.removeJunkTechFromPool(); - tech.removeLoreTechFromPool(); - tech.addLoreTechToPool(); + // tech.removeJunkTechFromPool(); + // tech.removeLoreTechFromPool(); + // tech.addLoreTechToPool(); tech.armorFromPowerUps = 0; tech.totalCount = 0; simulation.updateTechHUD(); @@ -27,33 +34,38 @@ // who.innerHTML = "removed" // // who.style.display = "none" // }, - removeLoreTechFromPool() { - for (let i = tech.tech.length - 1; i > 0; i--) { - if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) - } - }, + // removeLoreTechFromPool() { + // for (let i = tech.tech.length - 1; i > 0; i--) { + // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) + // } + // }, addJunkTechToPool(num = 1) { - for (let i = 0; i < num; i++) { - // find an index that doesn't have dups first - let index = null - for (let i = 0; i < tech.junk.length; i++) { - if (tech.junk[i].numberInPool === 0) { - index = i - break - } - } - if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add + let options = []; + 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++ + // for (let i = 0; i < num; i++) { + // // find an index that doesn't have dups first + // let index = null + // for (let i = 0; i < tech.junk.length; i++) { + // if (tech.junk[i].numberInPool === 0) { + // index = i + // break + // } + // } + // if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add - tech.junk[index].numberInPool++ - tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool - if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += ` - ${(tech.junk[index].numberInPool + 9).toString(36)}` //give it a unique name so it can be found - } - }, - removeJunkTechFromPool() { - for (let i = tech.tech.length - 1; i > 0; i--) { - if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1) - } + // tech.junk[index].numberInPool++ + // tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool + // if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += ` - ${(tech.junk[index].numberInPool + 9).toString(36)}` //give it a unique name so it can be found + // } }, + // removeJunkTechFromPool() { + // for (let i = tech.tech.length - 1; i > 0; i--) { + // if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1) + // } + // }, giveTech(index = 'random') { if (index === 'random') { let options = []; @@ -150,6 +162,7 @@ description: `increase damage by 25%
your inventory can only hold 1 gun`, maxCount: 1, count: 0, + frequency: 1, allowed() { return b.inventory.length < 2 //&& !tech.haveGunCheck("CPT gun") }, @@ -178,6 +191,7 @@ description: "while your firstgun is equipped
reduce harm by 13% for each of your guns", maxCount: 1, count: 0, + frequency: 1, allowed() { return b.inventory.length > 1 && !tech.isEnergyHealth }, @@ -198,6 +212,7 @@ description: "increase damage by 17%
for each gun in your inventory", maxCount: 1, count: 0, + frequency: 1, allowed() { return b.inventory.length > 1 }, @@ -214,6 +229,7 @@ description: "17% decreased delay after firing
for each gun in your inventory", maxCount: 1, count: 0, + frequency: 1, allowed() { return b.inventory.length > 1 }, @@ -232,6 +248,7 @@ description: "spawn 6guns, but you can't switchguns
guns cycle automatically with each new level", maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, allowed() { return (tech.isDamageForGuns || tech.isFireRateForGuns) && (b.inventory.length + 5) < b.guns.length @@ -250,6 +267,7 @@ description: "for every gun in your inventory spawn a
heal, research, field, ammo, or tech", maxCount: 1, //random power up count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, allowed() { @@ -278,6 +296,7 @@ description: "ammo power ups give 200%ammo
but ammo is only added to your current gun", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyNoAmmo }, @@ -294,6 +313,7 @@ description: "double your current ammo for all guns", maxCount: 9, count: 0, + frequency: 1, isNonRefundable: true, allowed() { return tech.isAmmoForGun @@ -312,6 +332,7 @@ description: "when you fire while out of ammo
gain 3ammo, but lose 5health", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth && !tech.isEnergyNoAmmo }, @@ -323,27 +344,29 @@ tech.isAmmoFromHealth = false; } }, - { - name: "perpetual ammo", - description: "find 2ammo at the start of each level", - maxCount: 1, - count: 0, - allowed() { - return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualReroll && !tech.isPerpetualStun && !tech.isEnergyNoAmmo - }, - requires: "only 1 perpetual effect, not exciton lattice", - effect() { - tech.isPerpetualAmmo = true - }, - remove() { - tech.isPerpetualAmmo = false - } - }, + // { + // name: "perpetual ammo", + // description: "find 3ammo at the start of each level", + // maxCount: 1, + // count: 0, + // frequency: 1, + // allowed() { + // return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualReroll && !tech.isPerpetualStun && !tech.isEnergyNoAmmo + // }, + // requires: "only 1 perpetual effect, not exciton lattice", + // effect() { + // tech.isPerpetualAmmo = true + // }, + // remove() { + // tech.isPerpetualAmmo = false + // } + // }, { name: "desublimated ammunition", description: "use 50% less ammo when crouching", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -357,9 +380,11 @@ }, { name: "gun turret", - description: "reduce harm by 50% when crouching", + description: "reduce harm by 55% when crouching", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isCrouchAmmo && !tech.isEnergyHealth }, @@ -376,6 +401,7 @@ description: "66% decreased delay after firing
you can only fire when at rest", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -398,6 +424,8 @@ description: "increase damage by 33% when at rest", maxCount: 9, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isFireNotMove }, @@ -414,6 +442,7 @@ description: "while firing your position is locked
and harm is reduced by 60%", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth }, @@ -434,6 +463,7 @@ description: "move and jump about 30% faster
take 5% more harm", maxCount: 9, count: 0, + frequency: 1, allowed() { return true }, @@ -454,6 +484,7 @@ description: "moving at high speeds reduces harm
by up to 50%", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.Fx > 0.016 && !tech.isEnergyHealth }, @@ -470,6 +501,7 @@ description: "moving at high speeds increases damage
by up to 33%", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.Fx > 0.016 }, @@ -486,6 +518,7 @@ // description: "reduce harm by 50% when at rest", // maxCount: 1, // count: 0, + // frequency: 1, // allowed() { // return tech.isFireNotMove || tech.isFireMoveLock // }, @@ -502,6 +535,7 @@ description: "increase damage by up to 33%
at a distance of 40 steps from the target", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -518,6 +552,7 @@ description: "increase damage by 20%
20% increased delay after firing", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -535,6 +570,7 @@ description: "30% decreased delay after firing", maxCount: 9, count: 0, + frequency: 1, allowed() { return true }, @@ -553,6 +589,7 @@ description: "explosions release gamma radiation
100% more damage, but over 4 seconds", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.explosiveRadius === 1 && !tech.isSmallExplosion && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) }, @@ -569,6 +606,7 @@ description: "increase explosivedamage by 20%
increase explosiveradius by 20%", maxCount: 9, count: 0, + frequency: 1, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) }, @@ -585,6 +623,7 @@ description: "increase explosivedamage by 60%
decrease explosiveradius by 20%", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isExplodeRadio && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) }, @@ -601,6 +640,7 @@ description: "increase explosiveradius by 80%, but
you take 400% more harm from explosions", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isRewindGrenade && (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField) }, @@ -618,6 +658,7 @@ description: "harm from explosions is passively reduced
by 7% for every 10 stored energy", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isMissileField || tech.isExplodeMob || tech.isPulseLaser }, @@ -634,6 +675,7 @@ description: "mobs explode when they die
be careful", maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("missiles") || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("vacuum bomb") || tech.isPulseLaser || tech.isMissileField || tech.boomBotCount > 1) && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isBotSpawner }, @@ -650,6 +692,7 @@ description: "mobs produce spores when they die
9% chance", maxCount: 9, count: 0, + frequency: 1, allowed() { return !tech.nailsDeathMob && !tech.isExplodeMob && !tech.isBotSpawner }, @@ -669,6 +712,7 @@ description: "mobs release a nail when they die
nails target nearby mobs", maxCount: 9, count: 0, + frequency: 1, allowed() { return !tech.sporesOnDeath && !tech.isExplodeMob && !tech.isBotSpawner }, @@ -685,6 +729,7 @@ description: "mobs spawn with 11% less health", maxCount: 3, count: 0, + frequency: 1, allowed() { return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.isBotSpawner }, @@ -706,6 +751,7 @@ description: "reduce harm by 66%
after not using your gun or field for 2 seconds", maxCount: 1, count: 0, + frequency: 1, allowed() { return (b.totalBots() > 1 || tech.haveGunCheck("drones") || tech.haveGunCheck("mine") || tech.haveGunCheck("spores") || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing") && !tech.isEnergyHealth }, @@ -722,6 +768,7 @@ description: "increase damage by 100%
after not using your gun or field for 2 seconds", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNoFireDefense }, @@ -738,6 +785,7 @@ description: "20% chance to build a bot after killing a mob
the bot lasts for about 20 seconds", maxCount: 3, count: 0, + frequency: 1, allowed() { return b.totalBots() > 0 && !tech.sporesOnDeath && !tech.nailsDeathMob && !tech.isExplodeMob }, @@ -754,6 +802,7 @@ description: "a bot fires nails at mobs in line of sight", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return true @@ -772,6 +821,7 @@ description: "convert all your bots to nail-bots
500% increased nail-bot fire rate", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.nailBotCount > 1 && !b.hasBotUpgrade() }, @@ -795,6 +845,7 @@ description: "a bot fires foam at nearby mobs", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return true @@ -813,6 +864,7 @@ description: "convert all your bots to foam-bots
250% increased foam size and fire rate", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.foamBotCount > 1 && !b.hasBotUpgrade() }, @@ -836,6 +888,7 @@ description: "a botdefends the space around you
ignites an explosion after hitting a mob", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return true @@ -854,6 +907,7 @@ description: "convert all your bots to boom-bots
250% increased explosiondamage and size", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.boomBotCount > 1 && !b.hasBotUpgrade() }, @@ -877,6 +931,7 @@ description: "a bot uses energy to emit a laser beam
that targets nearby mobs", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return m.maxEnergy > 0.5 @@ -895,6 +950,7 @@ description: "convert all your bots to laser-bots
75% improved damage, efficiency, and range", // 400% increased laser-botlaserdamage", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.laserBotCount > 1 && !b.hasBotUpgrade() }, @@ -918,6 +974,7 @@ description: "a bot is locked in orbit around you
stuns and damages mobs on contact", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return true @@ -936,6 +993,7 @@ description: "convert all your bots to orbital-bots
increase damage by 200% and radius by 30%", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.orbitBotCount > 1 && !b.hasBotUpgrade() }, @@ -969,6 +1027,7 @@ description: "a botdamages mobs while it traces your path
regen 6energy per second when it's near", maxCount: 9, count: 0, + frequency: 1, isBotTech: true, allowed() { return true @@ -987,6 +1046,7 @@ description: "convert your bots to dynamo-bots
dynamo-bots regen24energy per second", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.dynamoBotCount > 1 && !b.hasBotUpgrade() }, @@ -1010,6 +1070,7 @@ description: "anytime you collect 4research
use them to build a random bot", maxCount: 1, count: 0, + frequency: 1, allowed() { return powerUps.research.count > 3 || build.isExperimentSelection }, @@ -1028,6 +1089,7 @@ description: "reduce harm by 6%
for each of your permanent bots", maxCount: 1, count: 0, + frequency: 1, allowed() { return b.totalBots() > 3 && !tech.isEnergyHealth }, @@ -1043,6 +1105,7 @@ description: "increase damage by 6%
for each of your permanent bots", maxCount: 1, count: 0, + frequency: 1, allowed() { return b.totalBots() > 3 }, @@ -1059,6 +1122,7 @@ description: "duplicate your permanent bots
remove all of your guns", maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, isBadRandomOption: true, @@ -1094,6 +1158,7 @@ description: "increase block collision damage by 100%
charge throws more quickly for less energy", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name !== "wormhole" }, @@ -1110,6 +1175,8 @@ description: "mobs killed by collisions with blocks
spawn a heal, ammo, or research", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.throwChargeRate > 1 }, @@ -1126,10 +1193,12 @@ description: "while you are holding a block
reduce harm by 85%", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { - return tech.throwChargeRate > 1 + return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" }, - requires: "mass driver", + requires: "mass driver, a field that can hold things", effect() { tech.isBlockHarm = true }, @@ -1137,27 +1206,29 @@ 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, - allowed() { - return !tech.isPerpetualReroll && !tech.isPerpetualHeal && !tech.isPerpetualAmmo - }, - requires: "only 1 perpetual effect", - effect() { - tech.isPerpetualStun = true - }, - remove() { - tech.isPerpetualStun = 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, count: 0, + frequency: 1, allowed() { return true }, @@ -1175,6 +1246,7 @@ description: `become immune to harm for 1 second
once every 7 seconds`, maxCount: 3, count: 0, + frequency: 1, allowed() { return true //tech.collisionImmuneCycles > 30 }, @@ -1188,8 +1260,8 @@ }, { name: "flip-flop", - description: `collisions set flip-flop to OFF when ON -
collisions set flip-flop to ON when OFF`, + description: `if flip-flop is ON, collisions set it to OFF +
if flip-flop is OFF, collisions set it to ON`, // description: `collisions toggle flip-flop ON and OFF //
ON: 0 collision harm, OFF: 25% extra harm`, // on your next collision take 0harm @@ -1209,6 +1281,7 @@ }, maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -1255,6 +1328,7 @@ remove() { tech.isFlipFlop = false tech.isFlipFlopOn = false + m.eyeFillColor = 'transparent' } }, { @@ -1262,6 +1336,8 @@ description: "if flip-flop is in the ON state
take 0harm from collisions with mobs", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isFlipFlop }, @@ -1279,6 +1355,8 @@ description: "if flip-flop is in the ON state
do 55.5% more damage", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isFlipFlop }, @@ -1295,6 +1373,8 @@ description: "if flip-flop is ON regen 22energy per second
if flip-flop is OFF drain 3.1energy per second", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isFlipFlop }, @@ -1311,6 +1391,8 @@ description: "set flip-flop to the ON state
at the start of a level", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isFlipFlopEnergy || tech.isFlipFlopDamage || tech.isFlipFlopHarm }, @@ -1327,6 +1409,7 @@ description: `slowtime by 50% after receiving harm
reduce harm by 20%`, maxCount: 1, count: 0, + frequency: 1, allowed() { return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow }, @@ -1343,6 +1426,8 @@ description: `freeze all mobs for 7 seconds
after receiving harm`, maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isSlowFPS }, @@ -1359,6 +1444,7 @@ description: `collisions with stunned or frozen mobs
cause you noharm`, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isStunField || tech.isPulseStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage }, @@ -1375,6 +1461,7 @@ description: "rebuild your broken parts as drones
chance to occur after receiving harm", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.harmReduction() < 1 }, @@ -1394,6 +1481,7 @@ description: "for 10 seconds after receiving harm
reduce harm by 66%", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth && m.harmReduction() < 1 }, @@ -1410,6 +1498,7 @@ description: "for 10 seconds after receiving harm
increase damage by 200%", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.harmReduction() < 1 }, @@ -1426,6 +1515,7 @@ description: "charge, parity, and time invert to undo harm
rewind(1.5—5) seconds for (66—220)energy", maxCount: 1, count: 0, + frequency: 1, allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" || m.maxEnergy > 1) return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave harmonics" && !tech.isEnergyHealth && !tech.isRewindGun }, @@ -1442,6 +1532,7 @@ description: "when you rewind, build several bots
that protect you for about 9 seconds", maxCount: 3, count: 0, + frequency: 1, allowed() { return tech.isRewindAvoidDeath }, @@ -1458,6 +1549,7 @@ description: "before you rewind drop several grenades", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isExplosionHarm && tech.isRewindAvoidDeath }, @@ -1474,6 +1566,7 @@ description: "colliding with mobs gives you 2048energy", //
reduce harm by 15% maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth && (m.harmReduction() < 1 || tech.isFlipFlopHarm) }, @@ -1491,6 +1584,7 @@ description: "reduce harm by 66%
you no longer passively regenerate energy", maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth }, @@ -1509,6 +1603,7 @@ description: "energy protects you instead of health
harmreduction effects provide no benefit", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyLoss && !tech.isPiezo && !tech.isRewindAvoidDeath && !tech.isRewindGun && !tech.isSpeedHarm && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && !tech.isHealLowHealth && !tech.isTechDamage }, @@ -1536,6 +1631,7 @@ description: "each healpower up you collect
increases your maximumenergy by 5", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isEnergyHealth }, @@ -1561,6 +1657,7 @@ description: "increase damage by 1%
for every 9 stored energy", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.maxEnergy > 1 || tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 }, @@ -1577,6 +1674,7 @@ description: `increase damage by 50%, but
ammo will no longer spawn`, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("nail gun") && tech.isIceCrystals) || tech.haveGunCheck("laser") || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -1593,6 +1691,7 @@ description: "increase damage by 50%
if a mob dies drain energy by 25%", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth }, @@ -1609,6 +1708,8 @@ description: `increase damage by 40%, but
reduce maximum energy by 50`, maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isEnergyLoss && m.maxEnergy < 1.1 && !tech.isSporeField && !tech.isRewindAvoidDeath }, @@ -1627,6 +1728,8 @@ description: `increase damage by 5%
for every 10energy below 100`, maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isEnergyLoss && m.maxEnergy < 1.1 }, @@ -1643,6 +1746,7 @@ description: "increase your maximumenergy by 50", maxCount: 9, count: 0, + frequency: 1, allowed() { return m.maxEnergy > 0.99 }, @@ -1663,6 +1767,7 @@ description: "energy above your max decays 60% slower", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isEnergyRecovery || tech.isPiezo || tech.energySiphon > 0 || tech.isRailEnergyGain || tech.isWormholeEnergy || tech.iceEnergy > 0 }, @@ -1679,6 +1784,7 @@ description: "6% of damage done recovered as energy", maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.damageFromTech() > 1 }, @@ -1695,10 +1801,11 @@ description: "if a mob has died in the last 5 seconds
regen 5% of max energy every second", maxCount: 1, count: 0, + frequency: 1, allowed() { - return m.maxEnergy > 0.99 && !tech.isHealthRecovery + return m.maxEnergy > 0.99 }, - requires: "max energy >= 1, not scrap recycling", + requires: "max energy >= 1", effect() { tech.isEnergyRecovery = true; }, @@ -1711,10 +1818,12 @@ description: "if a mob has died in the last 5 seconds
regain 1% of max health every second", maxCount: 1, count: 0, + frequency: 1, + isHealTech: true, allowed() { - return !tech.isEnergyHealth && !tech.isEnergyRecovery + return !tech.isEnergyHealth }, - requires: "not mass-energy equivalence, waste energy recovery", + requires: "not mass-energy equivalence", effect() { tech.isHealthRecovery = true; }, @@ -1727,6 +1836,7 @@ description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 50%", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -1743,6 +1853,8 @@ description: "if a mob has died in the last 5 seconds
reduce harm by 75% else increase it by 25%", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isDamageAfterKill }, @@ -1759,6 +1871,7 @@ description: "increase damage by 6%
for every 10health below 100", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.health < 0.5 || build.isExperimentSelection }, @@ -1774,6 +1887,7 @@ description: "increase damage by 100%
lose 11health when you pick up a tech", maxCount: 1, count: 0, + frequency: 1, allowed() { return (m.harmReduction() < 1 || tech.healthDrain || tech.isLowHealthDmg || tech.isHealthRecovery || tech.isHealLowHealth || tech.largerHeals > 1 || tech.isPerpetualHeal) && !tech.isEnergyHealth }, @@ -1790,6 +1904,8 @@ description: "heal for 3% of damage done
take 8% more harm", maxCount: 9, count: 0, + frequency: 1, + isHealTech: true, allowed() { return !tech.isEnergyHealth && tech.damageFromTech() > 1 }, @@ -1806,6 +1922,7 @@ description: "increase damage by 40%
when your health is above 100", maxCount: 1, count: 0, + frequency: 1, allowed() { return m.maxHealth > 1; }, @@ -1822,6 +1939,7 @@ description: "increase your maximumhealth by 50", maxCount: 9, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth }, @@ -1842,6 +1960,7 @@ description: "for each unused power up at the end of a level
add 3 maxhealth(up to 51 health per level)", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isEnergyHealth && !tech.isDroneGrab }, @@ -1860,6 +1979,7 @@ description: "unused power ups at the end of each level
are still activated (selections are random)", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isArmorFromPowerUps }, @@ -1876,6 +1996,8 @@ description: `at the start of each level
spawn a heal for every 50 missing health`, maxCount: 1, count: 0, + frequency: 1, + isHealTech: true, allowed() { return m.maxHealth > 1 || tech.isArmorFromPowerUps }, @@ -1892,8 +2014,10 @@ description: "healpower ups are 100% more effective", maxCount: 3, count: 0, + frequency: 1, + isHealTech: true, allowed() { - return (m.health < 0.7 || build.isExperimentSelection) && !tech.isEnergyHealth + return (m.health < 0.75 || build.isExperimentSelection) && !tech.isEnergyHealth }, requires: "not mass-energy equivalence", effect() { @@ -1903,22 +2027,24 @@ tech.largerHeals = 1; } }, - { - name: "perpetual heals", - description: "find 2heals at the start of each level", - maxCount: 1, - count: 0, - allowed() { - return !tech.isPerpetualReroll && !tech.isPerpetualAmmo && !tech.isPerpetualStun - }, - requires: "only 1 perpetual effect", - effect() { - tech.isPerpetualHeal = true - }, - remove() { - tech.isPerpetualHeal = false - } - }, + // { + // name: "perpetual heals", + // description: "find 3heals at the start of each level", + // maxCount: 1, + // count: 0, + // frequency: 1, + // isHealTech: true, + // allowed() { + // return !tech.isPerpetualReroll && !tech.isPerpetualAmmo && !tech.isPerpetualStun + // }, + // requires: "only 1 perpetual effect", + // effect() { + // tech.isPerpetualHeal = true + // }, + // remove() { + // tech.isPerpetualHeal = false + // } + // }, { name: "anthropic principle", nameInfo: "", @@ -1930,6 +2056,8 @@ description: "once per level use 1research to avoid dying
and spawn 6heal power ups", maxCount: 1, count: 0, + frequency: 1, + isHealTech: true, allowed() { return powerUps.research.count > 0 || build.isExperimentSelection }, @@ -1950,6 +2078,8 @@ description: "after anthropic principle prevents your death
increase damage by 137.03599% on that level", maxCount: 1, count: 0, + frequency: 2, + frequencyDefault: 2, allowed() { return tech.isDeathAvoid }, @@ -1966,6 +2096,7 @@ description: "after dying, continue in an alternate reality
reduce harm by 16%", //spawn 4research maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isSwitchReality && !tech.isResearchReality }, @@ -1983,6 +2114,7 @@ description: "each new level is an alternate reality
find 2tech power ups in that reality", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isImmortal && !tech.isResearchReality }, @@ -1995,10 +2127,11 @@ } }, { - name: "decoherence", + name: "Ψ(t) collapse", description: "enter an alternate reality after you research
spawn 11research", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isImmortal && !tech.isSwitchReality }, @@ -2016,6 +2149,7 @@ description: "using a research for any purpose
has a 37% chance to spawn a research", maxCount: 1, count: 0, + frequency: 1, allowed() { return (powerUps.research.count > 1 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste }, @@ -2028,10 +2162,11 @@ } }, { - name: "erase", + name: "decoherence", description: "researched or canceledtech won't reoccur
spawn 5research", maxCount: 1, count: 0, + frequency: 1, allowed() { return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism }, @@ -2046,10 +2181,11 @@ } }, { - name: "Ψ(t) collapse", + name: "perturbation theory", description: "66% decreased delay after firing
when you have no research in your inventory", maxCount: 1, count: 0, + frequency: 1, allowed() { return powerUps.research.count === 0 && !tech.manyWorlds }, @@ -2070,6 +2206,7 @@ description: "after choosing a field, tech, or gun
if you have no research spawn 2", maxCount: 1, count: 0, + frequency: 1, allowed() { return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste }, @@ -2086,6 +2223,7 @@ description: "increase damage by 3.9%
for each research in your inventory", maxCount: 1, count: 0, + frequency: 1, allowed() { return powerUps.research.count > 4 || build.isExperimentSelection }, @@ -2102,6 +2240,7 @@ description: "remove all current tech
spawn new tech to replace them", maxCount: 1, count: 0, + frequency: 1, // isNonRefundable: true, isBadRandomOption: true, isExperimentHide: true, @@ -2121,7 +2260,7 @@ if (tech.isSuperDeterminism) count -= 2 //remove the bonus tech tech.setupAllTech(); // remove all tech - tech.addLoreTechToPool(); + // tech.addLoreTechToPool(); for (let i = 0; i < count; i++) { // spawn new tech power ups powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech"); } @@ -2129,27 +2268,29 @@ }, remove() {} }, - { - name: "perpetual research", - description: "find 1research at the start of each level", - maxCount: 1, - count: 0, - allowed() { - return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun - }, - requires: "only 1 perpetual effect, not superdeterminism", - effect() { - tech.isPerpetualReroll = true - }, - remove() { - tech.isPerpetualReroll = false - } - }, + // { + // name: "perpetual research", + // description: "find 1research at the start of each level", + // maxCount: 1, + // count: 0, + // frequency: 1, + // allowed() { + // return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun + // }, + // requires: "only 1 perpetual effect, not superdeterminism", + // effect() { + // tech.isPerpetualReroll = true + // }, + // remove() { + // tech.isPerpetualReroll = false + // } + // }, { name: "bubble fusion", description: "after destroying a mob's natural shield
spawn 1-2heals, ammo, or research", maxCount: 1, count: 0, + frequency: 1, allowed() { return true }, @@ -2166,6 +2307,7 @@ description: "20% chance to duplicate spawned power ups
after a collision, eject 1tech", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() < 1 }, @@ -2185,6 +2327,7 @@ description: "7% chance to duplicate spawned power ups
add 12 junk tech to the potential pool", maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() < 1 }, @@ -2205,6 +2348,7 @@ description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() < 1 && !tech.isDeterminism && (level.levelsCleared < 5 || Math.random() < 0.5) }, @@ -2225,6 +2369,7 @@ description: "clicking × to cancel a field, tech, or gun
spawns 8heals, ammo, and research", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isCancelDuplication }, @@ -2241,6 +2386,7 @@ description: "your chance to duplicate power ups
increases your damage by the same percent", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() > 0.15 }, @@ -2257,6 +2403,7 @@ description: "each level has a chance to spawn a level boss
equal to double your duplication chance", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() > 0 }, @@ -2273,6 +2420,7 @@ description: "after reaching 100%duplication chance
immediately spawn 4 level bosses", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isDuplicateBoss }, @@ -2290,6 +2438,7 @@ 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, allowed() { @@ -2320,6 +2469,7 @@ description: "spawn 2tech
remove 1 random tech", maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, allowed() { @@ -2347,6 +2497,7 @@ description: `use 2research to spawn 1tech
with double your duplication chance`, maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, allowed() { @@ -2369,6 +2520,7 @@ description: "drop a mine after picking up a power up", maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.duplicationChance() > 0 }, @@ -2386,6 +2538,7 @@ 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 }, @@ -2404,6 +2557,7 @@ isNonRefundable: true, isExperimentHide: true, count: 0, + frequency: 1, allowed() { return level.onLevel < 8 && level.onLevel > 0 }, @@ -2421,6 +2575,7 @@ description: "tech, fields, and guns have 5choices", maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isDeterminism }, @@ -2437,6 +2592,7 @@ description: "spawn 5tech
tech, fields, and guns have only 1 choice", maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isBadRandomOption: true, allowed() { @@ -2457,6 +2613,8 @@ description: "spawn 7tech
research, guns, and fields no longer spawn", maxCount: 1, count: 0, + frequency: 3, + frequencyDefault: 3, isNonRefundable: true, isBadRandomOption: true, allowed() { @@ -2472,6 +2630,91 @@ tech.isSuperDeterminism = false; } }, + { + name: "gun technology", + description: "double the frequency of finding guntech
spawn a gun", + maxCount: 1, + count: 0, + frequency: 1, + isNonRefundable: true, + // isExperimentHide: true, + // isBadRandomOption: true, + allowed() { + return !tech.isSuperDeterminism + }, + requires: "not superdeterminism", + effect() { + powerUps.spawn(m.pos.x, m.pos.y, "gun"); + // this.count-- + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 2 + } + }, + remove() {} + }, + { + name: "ammo technology", + description: "double the frequency of finding guntech
spawn 6ammo", + maxCount: 1, + count: 0, + frequency: 1, + isNonRefundable: true, + // isExperimentHide: true, + // isBadRandomOption: true, + allowed() { + return !tech.isEnergyNoAmmo + }, + requires: "not exciton lattice", + effect() { + for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo"); + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isGunTech) tech.tech[i].frequency *= 2 + } + }, + remove() {} + }, + { + name: "field technology", + description: "double the frequency of finding fieldtech
spawn a field", + maxCount: 1, + count: 0, + frequency: 1, + isNonRefundable: true, + // isExperimentHide: true, + // isBadRandomOption: true, + allowed() { + return !tech.isSuperDeterminism + }, + requires: "not superdeterminism", + effect() { + powerUps.spawn(m.pos.x, m.pos.y, "field"); + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 2 + } + }, + remove() {} + }, + { + name: "healing technology", + description: "double the frequency of finding healingtech
spawn 12heals", + maxCount: 1, + count: 0, + frequency: 1, + isNonRefundable: true, + // isExperimentHide: true, + // isBadRandomOption: true, + allowed() { + return true + }, + requires: "", + effect() { + for (let i = 0; i < 12; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); + for (let i = 0, len = tech.tech.length; i < len; i++) { + if (tech.tech[i].isHealTech) tech.tech[i].frequency *= 200 + } + }, + remove() {} + }, //************************************************** //************************************************** gun //************************************************** tech @@ -2482,6 +2725,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (b.totalBots() > 3 || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth && !tech.isRewindAvoidDeath //build.isExperimentSelection || }, @@ -2524,6 +2768,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return ((m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) || tech.haveGunCheck("drones") || tech.haveGunCheck("super balls") || tech.haveGunCheck("shotgun")) && !tech.isNailShot }, @@ -2541,6 +2786,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || tech.haveGunCheck("rail gun") || (tech.haveGunCheck("shotgun") && tech.isSlugShot) || tech.throwChargeRate > 1 }, @@ -2558,6 +2804,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField }, @@ -2575,6 +2822,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNailRadiation || tech.isWormholeDamage || tech.isNeutronBomb || tech.isExplodeRadio }, @@ -2592,6 +2840,7 @@ isGunTech: true, maxCount: 3, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || tech.haveGunCheck("spores") || tech.haveGunCheck("drones") || tech.haveGunCheck("missiles") || tech.haveGunCheck("foam") || tech.haveGunCheck("wave beam") || tech.isNeutronBomb }, @@ -2609,6 +2858,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isBulletsLastLonger > 1 }, @@ -2626,6 +2876,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.isNailRadiation }, @@ -2663,6 +2914,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNeedles && !tech.isNailRadiation }, @@ -2680,6 +2932,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isNeedles }, @@ -2711,6 +2964,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.isRivets }, @@ -2728,6 +2982,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isRivets && !tech.isNeedles && !tech.isNailRadiation && !tech.isNailCrit }, @@ -2764,6 +3019,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles }, @@ -2789,6 +3045,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals }, @@ -2814,6 +3071,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.isNailShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) && !tech.isIceCrystals }, @@ -2831,6 +3089,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals }, @@ -2848,6 +3107,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNailRadiation && !tech.isFastRadiation }, @@ -2865,6 +3125,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNailRadiation && !tech.isSlowRadiation }, @@ -2882,6 +3143,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("shotgun") }, @@ -2921,6 +3183,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isSlugShot }, @@ -2938,6 +3201,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("shotgun") && !tech.isNailShot }, @@ -2955,6 +3219,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("shotgun") }, @@ -2972,6 +3237,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("super balls") && !tech.oneSuperBall }, @@ -2989,6 +3255,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("super balls") && tech.superBallNumber === 4 }, @@ -3006,6 +3273,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("super balls") }, @@ -3023,6 +3291,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("wave beam") }, @@ -3040,6 +3309,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("wave beam") && !tech.isWaveReflect }, @@ -3059,6 +3329,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("wave beam") && tech.waveSpeedMap !== 3 }, @@ -3076,6 +3347,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("missiles") || tech.isMissileField }, @@ -3093,6 +3365,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("missiles") }, @@ -3110,6 +3383,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, isBotTech: true, allowed() { return tech.haveGunCheck("missiles") @@ -3129,6 +3403,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("grenades") }, @@ -3148,6 +3423,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("grenades") && !tech.isNeutronBomb }, @@ -3167,6 +3443,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("grenades") && !tech.fragments && !tech.isVacuumBomb }, @@ -3186,6 +3463,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNeutronBomb }, @@ -3203,6 +3481,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isNeutronBomb }, @@ -3220,6 +3499,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineSentry }, @@ -3237,6 +3517,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("mine") && !tech.isMineSentry }, @@ -3254,6 +3535,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine }, @@ -3271,6 +3553,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("spores") }, @@ -3288,6 +3571,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -3306,6 +3590,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -3323,6 +3608,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField }, @@ -3340,6 +3626,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField) && !tech.isEnergyHealth }, @@ -3357,6 +3644,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField)) }, @@ -3374,6 +3662,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return !tech.isArmorFromPowerUps && (tech.haveGunCheck("drones") || (m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isIceField))) }, @@ -3391,6 +3680,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("foam") || tech.foamBotCount > 1 }, @@ -3408,8 +3698,9 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { - return tech.haveGunCheck("foam") || tech.foamBotCount > 2 + return tech.haveGunCheck("foam") || tech.foamBotCount > 1 }, requires: "foam", effect() { @@ -3425,6 +3716,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("foam") }, @@ -3438,10 +3730,11 @@ }, { name: "quantum foam", - description: "foam gun fires 0.3 seconds into the future
increase foam gun damage by 153%", + description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 143%", isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("foam") }, @@ -3459,6 +3752,7 @@ // description: "increase foamdamage by 200%
foam dissipates 50% faster", // maxCount: 1, // count: 0, + // frequency: 1, // allowed() { // return tech.haveGunCheck("foam") || tech.foamBotCount > 2 // }, @@ -3475,6 +3769,7 @@ // description: "slow time while charging the rail gun
charging no longer drains energy", // maxCount: 1, // count: 0, + // frequency: 1, // allowed() { // return simulation.fpsCapDefault > 45 && tech.haveGunCheck("rail gun") && !tech.isSlowFPS && !tech.isCapacitor // }, @@ -3494,6 +3789,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("rail gun") }, @@ -3511,6 +3807,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("rail gun") }, @@ -3528,6 +3825,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("rail gun") }, @@ -3545,6 +3843,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") || tech.laserBotCount > 1 || tech.isLaserMine }, @@ -3562,6 +3861,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") || tech.laserBotCount > 1 }, @@ -3580,6 +3880,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return (tech.haveGunCheck("laser") || tech.isLaserMine || tech.laserBotCount > 1) && !tech.isWideLaser && !tech.isPulseLaser && !tech.historyLaser }, @@ -3601,6 +3902,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") && !tech.isWideLaser && !tech.isPulseAim && !tech.historyLaser }, @@ -3626,6 +3928,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.historyLaser }, @@ -3653,6 +3956,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") && tech.isWideLaser }, @@ -3680,6 +3984,7 @@ isGunTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.beamSplitter && !tech.isPulseLaser && !tech.isWideLaser }, @@ -3707,6 +4012,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.haveGunCheck("laser") && tech.laserReflections < 3 && !tech.isWideLaser && !tech.historyLaser }, @@ -3732,6 +4038,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isPulseLaser }, @@ -3749,6 +4056,7 @@ isGunTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isPulseLaser && !tech.beamSplitter }, @@ -3770,6 +4078,7 @@ isFieldTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" }, @@ -3787,6 +4096,7 @@ isFieldTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" }, @@ -3806,6 +4116,7 @@ isFieldTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "standing wave harmonics" || m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" }, @@ -3823,6 +4134,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isPerpetualStun }, @@ -3840,6 +4152,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" }, @@ -3857,6 +4170,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -3875,6 +4189,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, allowed() { @@ -3895,6 +4210,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, isNonRefundable: true, isExperimentHide: true, allowed() { @@ -3980,6 +4296,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) }, @@ -3997,6 +4314,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab) }, @@ -4014,6 +4332,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab) }, @@ -4031,6 +4350,7 @@ isFieldTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return tech.isIceField }, @@ -4048,6 +4368,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "negative mass field" }, @@ -4061,10 +4382,11 @@ }, { name: "annihilation", - description: "after touching mobs, they are annihilated
drains 33% of maximum energy", + description: "touching normal mobs annihilates them
drains 33% of maximum energy", isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -4082,6 +4404,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "time dilation field" }, @@ -4099,6 +4422,7 @@ // isFieldTech: true, // maxCount: 1, // count: 0, + // frequency: 1, // allowed() { // return m.fieldUpgrades[m.fieldMode].name === "plasma torch" && !tech.isEnergyHealth // }, @@ -4116,6 +4440,7 @@ isFieldTech: true, maxCount: 9, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" }, @@ -4133,6 +4458,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, isBotTech: true, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" @@ -4152,6 +4478,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "plasma torch" }, @@ -4169,6 +4496,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "time dilation field" }, @@ -4188,6 +4516,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "time dilation field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -4211,6 +4540,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return (m.fieldUpgrades[m.fieldMode].name === "time dilation field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0; }, @@ -4230,6 +4560,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" }, @@ -4247,6 +4578,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" }, @@ -4264,6 +4596,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" }, @@ -4283,6 +4616,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -4300,6 +4634,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -4317,6 +4652,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -4334,6 +4670,7 @@ isFieldTech: true, maxCount: 1, count: 0, + frequency: 1, allowed() { return m.fieldUpgrades[m.fieldMode].name === "wormhole" }, @@ -4348,104 +4685,15 @@ } }, //************************************************** - //************************************************** spawn power up - //************************************************** tech + //************************************************** experimental + //************************************************** modes //************************************************** - { - name: "heals", - description: "spawn 6heals", - maxCount: 9, - count: 0, - isNonRefundable: true, - isExperimentHide: true, - isBadRandomOption: true, - allowed() { - return true - }, - requires: "", - effect() { - for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal"); - this.count-- - }, - remove() {} - }, - { - name: "ammo", - description: "spawn 6ammo", - maxCount: 9, - count: 0, - isNonRefundable: true, - isExperimentHide: true, - isBadRandomOption: true, - allowed() { - return !tech.isEnergyNoAmmo - }, - requires: "not exciton lattice", - effect() { - for (let i = 0; i < 6; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "ammo"); - this.count-- - }, - remove() {} - }, - { - name: "research", - description: "spawn 4research", - maxCount: 9, - count: 0, - isNonRefundable: true, - isExperimentHide: true, - isBadRandomOption: true, - allowed() { - return !tech.isSuperDeterminism - }, - requires: "not superdeterminism", - effect() { - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "research"); - this.count-- - }, - remove() {} - }, - { - name: "gun", - description: "spawn a gun", - maxCount: 9, - count: 0, - isNonRefundable: true, - isExperimentHide: true, - isBadRandomOption: true, - allowed() { - return !tech.isSuperDeterminism - }, - requires: "not superdeterminism", - effect() { - powerUps.spawn(m.pos.x, m.pos.y, "gun"); - this.count-- - }, - remove() {} - }, - { - name: "field", - description: "spawn a field", - maxCount: 9, - count: 0, - isNonRefundable: true, - isExperimentHide: true, - isBadRandomOption: true, - allowed() { - return !tech.isSuperDeterminism - }, - requires: "not superdeterminism", - effect() { - powerUps.spawn(m.pos.x, m.pos.y, "field"); - this.count-- - }, - remove() {} - }, { name: "ship", description: "experiment: fly around with no legs
aim with the keyboard", maxCount: 1, count: 0, + frequency: 0, isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, @@ -4463,6 +4711,7 @@ description: "experiment: every 20 seconds
become an alternate version of yourself", maxCount: 1, count: 0, + frequency: 0, isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, @@ -4483,6 +4732,7 @@ description: "experiment: every 5 seconds
all mobs gain a shield", maxCount: 1, count: 0, + frequency: 0, isNonRefundable: true, isBadRandomOption: true, isExperimentalMode: true, @@ -4499,45 +4749,16 @@ }, remove() {} }, - ], - addLoreTechToPool() { //adds lore tech to tech pool - if (!simulation.isCheating) { - tech.tech.push({ - name: `undefined`, - description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`, - maxCount: 1, - count: 0, - isLore: true, - isNonRefundable: true, - isExperimentHide: true, - allowed() { - return true - }, - requires: "", - effect() { - setTimeout(() => { //a short delay, I can't remember why - lore.techCount++ - if (lore.techCount > lore.techGoal - 1) { - tech.removeLoreTechFromPool(); - } else { - for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech - if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool` - } - for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool() - } - }, 1); - }, - remove() {} - }) - } - }, - junk: [ + //************************************************** + //************************************************** JUNK + //************************************************** tech + //************************************************** // { // name: "junk", // description: "", // maxCount: 9, // count: 0, - // numberInPool: 0, + // frequency: 0, // isNonRefundable: true, // isExperimentHide: true, // isJunk: true, @@ -4555,7 +4776,7 @@ description: "become an alternate version of yourself
every 20 seconds", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4576,7 +4797,7 @@ description: "sign up to learn endless easy ways to win n-gon
that landgreen doesn't want you to know about!!!1!!", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4596,7 +4817,7 @@ description: "add music to n-gon", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4614,7 +4835,7 @@ description: "display performance stats to n-gon", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4647,7 +4868,7 @@ description: "erase all junk tech from the possible pool
probably...", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4669,7 +4890,7 @@ description: "fly around with no legs
reduce combat difficulty by 1 level", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4688,7 +4909,7 @@ // description: "reduce block density and friction for this level", // maxCount: 9, // count: 0, - // numberInPool: 0, + // frequency: 0, // isNonRefundable: true, // isExperimentHide: true, // isJunk: true, @@ -4709,7 +4930,7 @@ description: "oscillate the pitch of your world", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4727,7 +4948,7 @@ description: "produce a blue glow around everything
and probably some simulation lag", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4746,7 +4967,7 @@ description: `ctx.globalCompositeOperation = "lighter"`, maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4764,7 +4985,7 @@ description: "every 5 seconds rewind2 seconds
lasts 120 seconds", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4784,7 +5005,7 @@ description: "convert your energy into blocks", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4814,7 +5035,7 @@ description: "advance to the next level", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4832,7 +5053,7 @@ description: "spawn a tech power up
add 64 junk tech to the potential pool", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4851,7 +5072,7 @@ description: "every 10 seconds drain your energy
return it doubled 10 seconds later
lasts 180 seconds", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4877,7 +5098,7 @@ description: "fire missiles for the next 60 seconds", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4903,7 +5124,7 @@ description: "drop grenades for the next 120 seconds", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -4925,36 +5146,36 @@ }, remove() {} }, - { - name: "inverted input", - description: "left input becomes right and up input becomes down", - maxCount: 9, - count: 0, - numberInPool: 0, - isNonRefundable: true, - isExperimentHide: true, - isJunk: true, - allowed() { - return true - }, - requires: "", - effect() { - const left = input.key.left - input.key.left = input.key.right - input.key.right = left + // { + // name: "inverted input", + // description: "left input becomes right and up input becomes down", + // maxCount: 9, + // count: 0, + // frequency: 0, + // isNonRefundable: true, + // isExperimentHide: true, + // isJunk: true, + // allowed() { + // return true + // }, + // requires: "", + // effect() { + // const left = input.key.left + // input.key.left = input.key.right + // input.key.right = left - const up = input.key.up - input.key.up = input.key.down - input.key.down = up - }, - remove() {} - }, + // const up = input.key.up + // input.key.up = input.key.down + // input.key.down = up + // }, + // remove() {} + // }, { name: "Sleipnir", description: "grow more legs", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5003,7 +5224,7 @@ description: "indicate gun fire delay through a rotation of your head", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5047,7 +5268,7 @@ description: "don't", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5119,7 +5340,7 @@ description: "you cycle through different colors", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5145,7 +5366,7 @@ description: "all your bots are converted to the same random model", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5203,7 +5424,7 @@ description: "increase combat difficulty by 1 level", maxCount: 1, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5221,7 +5442,7 @@ description: "stun all mobs for up to 8 seconds", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5239,7 +5460,7 @@ description: "eject all your guns", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5267,7 +5488,7 @@ description: "eject all your research", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5286,7 +5507,7 @@ description: "use all your energy to
spawn inside the event horizon of a huge black hole", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5305,7 +5526,7 @@ description: "spawn 2research
spawn 40 nearby black holes", maxCount: 9, count: 0, - numberInPool: 0, + frequency: 0, isNonRefundable: true, isExperimentHide: true, isJunk: true, @@ -5326,7 +5547,84 @@ }, remove() {} }, + //************************************************** + //************************************************** undefined / lore + //************************************************** tech + //************************************************** + { + name: `undefined`, + // description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`, + description: `this`, + maxCount: 1, + count: 0, + frequency: 1, + isLore: true, + isNonRefundable: true, + isExperimentHide: true, + allowed() { + return true + }, + requires: "", + effect() { + setTimeout(() => { //a short delay, I can't remember why + lore.techCount++ + if (lore.techCount === lore.techGoal) { + // tech.removeLoreTechFromPool(); + this.frequency = 0; + this.description = `null is open` + } else { + this.frequency += lore.techGoal + // for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech + // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool` + // } + // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool() + this.description = `uncaught error:
${lore.techGoal-lore.techCount} more required for access to null` + } + }, 1); + }, + remove() { + this.maxCount = lore.techGoal + } + } ], + // addLoreTechToPool() { //adds lore tech to tech pool + // if (!simulation.isCheating) { + // tech.tech.push({ + // name: `undefined`, + // description: `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool`, + // maxCount: 1, + // count: 0, + // frequency: 1, + // isLore: true, + // isNonRefundable: true, + // isExperimentHide: true, + // allowed() { + // return true + // }, + // requires: "", + // effect() { + // setTimeout(() => { //a short delay, I can't remember why + // lore.techCount++ + // if (lore.techCount > lore.techGoal - 1) { + // // tech.removeLoreTechFromPool(); + // for (let i = tech.tech.length - 1; i > 0; i--) { + // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) + // } + // } else { + // for (let i = 0; i < tech.tech.length; i++) { //set name for all unchosen copies of this tech + // if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech[i].description = `${lore.techCount+1}/${lore.techGoal}
add copies of this to the potential tech pool` + // } + // for (let i = 0, len = 10; i < len; i++) tech.addLoreTechToPool() + // } + // }, 1); + // }, + // remove() {} + // }) + // } + // }, + // junk: [ + + // ], //variables use for gun tech upgrades fireRate: null, bulletSize: null, diff --git a/todo.txt b/todo.txt index 1db2f81..438061b 100644 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,14 @@ ******************************************************** NEXT PATCH ******************************************************** -tech: flip-flip - does nothing, except toggle on collisions -tech: NOR gate - when flip-flip is ON take 0 harm from collisions -tech: NAND gate - when flip-flip is ON do 55.5% damage -tech: transistor - when flip-flop is ON regen 22 energy/s, when OFF drain 3.1 energy /s -tech: shift registers - set flip-flop to ON with a new level +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 ******************************************************** @@ -50,8 +54,6 @@ use the floor of portal sensor on the player? to unstuck player ******************************************************** TODO ******************************************************** -flip-flop: 13% dup chance while ON - tech- foam is attracted to mobs use a gravitational attraction model? could foam be attracted to other foam bullets too?