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?