diff --git a/.DS_Store b/.DS_Store
index 3302d7b..f347eb7 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 5716f52..fbb9097 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -10,7 +10,11 @@ const b = {
if (tech.isFireMoveLock) {
b.fire = b.fireFloat
} else if (tech.isFireNotMove) {
- b.fire = b.fireNotMove
+ if (tech.isAlwaysFire) {
+ b.fire = b.fireNotMoveAlwaysFire
+ } else {
+ b.fire = b.fireNotMove
+ }
} else {
b.fire = b.fireNormal
}
@@ -19,92 +23,40 @@ const b = {
fireNormal() {
if (input.fire && m.fireCDcycle < m.cycle && (!input.field || m.fieldFire) && b.inventory.length) {
if (b.guns[b.activeGun].ammo > 0) {
- b.guns[b.activeGun].fire();
- if (tech.isCrouchAmmo && m.crouch) {
- if (tech.isCrouchAmmo % 2) {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
- tech.isCrouchAmmo++ //makes the no ammo toggle off and on
- } else {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
+ b.fireWithAmmo()
} else {
- if (tech.isAmmoFromHealth) {
- if (m.health > 0.05) {
- m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
- if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
- }
- }
- } else {
- simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
- }
- m.fireCDcycle = m.cycle + 30; //fire cooldown
+ b.outOfAmmo()
}
if (m.holdingTarget) m.drop();
}
},
- fireNotMove() {
- //added && player.speed < 0.5 && m.onGround *************************
+ fireNotMove() { //added && player.speed < 0.5 && m.onGround
if (input.fire && m.fireCDcycle < m.cycle && (!input.field || m.fieldFire) && b.inventory.length && player.speed < 0.5 && m.onGround && Math.abs(m.yOff - m.yOffGoal) < 1) {
if (b.guns[b.activeGun].ammo > 0) {
- b.guns[b.activeGun].fire();
- if (tech.isCrouchAmmo && m.crouch) {
- if (tech.isCrouchAmmo % 2) {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
- tech.isCrouchAmmo++ //makes the no ammo toggle off and on
- } else {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
+ b.fireWithAmmo()
} else {
- if (tech.isAmmoFromHealth) {
- if (m.health > 0.05) {
- m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
- if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
- }
- }
- } else {
- simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
- }
- m.fireCDcycle = m.cycle + 30; //fire cooldown
+ b.outOfAmmo()
}
if (m.holdingTarget) m.drop();
}
},
- fireFloat() {
- //added && player.speed < 0.5 && m.onGround *************************
+ fireNotMoveAlwaysFire() { //added && player.speed < 0.5 && m.onGround //removed input.fire && (!input.field || m.fieldFire)
+ if (m.fireCDcycle < m.cycle && b.inventory.length && player.speed < 0.5 && m.onGround && Math.abs(m.yOff - m.yOffGoal) < 1) {
+ if (b.guns[b.activeGun].ammo > 0) {
+ b.fireWithAmmo()
+ } else {
+ b.outOfAmmo()
+ }
+ if (m.holdingTarget) m.drop();
+ }
+ },
+ fireFloat() { //added && player.speed < 0.5 && m.onGround
if (input.fire && (!input.field || m.fieldFire) && b.inventory.length) {
if (m.fireCDcycle < m.cycle) {
if (b.guns[b.activeGun].ammo > 0) {
- b.guns[b.activeGun].fire();
- if (tech.isCrouchAmmo && m.crouch) {
- if (tech.isCrouchAmmo % 2) {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
- tech.isCrouchAmmo++ //makes the no ammo toggle off and on
- } else {
- b.guns[b.activeGun].ammo--;
- simulation.updateGunHUD();
- }
+ b.fireWithAmmo()
} else {
- if (tech.isAmmoFromHealth) {
- if (m.health > 0.05) {
- m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
- if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
- }
- }
- } else {
- simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
- }
- m.fireCDcycle = m.cycle + 30; //fire cooldown
+ b.outOfAmmo()
}
if (m.holdingTarget) m.drop();
}
@@ -116,6 +68,31 @@ const b = {
player.force.y = 0
}
},
+ fireWithAmmo() { //triggers after firing when you have ammo
+ b.guns[b.activeGun].fire();
+ if (tech.isCrouchAmmo && m.crouch) {
+ if (tech.isCrouchAmmo % 2) {
+ b.guns[b.activeGun].ammo--;
+ simulation.updateGunHUD();
+ }
+ tech.isCrouchAmmo++ //makes the no ammo toggle off and on
+ } else {
+ b.guns[b.activeGun].ammo--;
+ simulation.updateGunHUD();
+ }
+ },
+ outOfAmmo() { //triggers after firing when you have NO ammo
+ simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
+ m.fireCDcycle = m.cycle + 30; //fire cooldown
+ if (tech.isAmmoFromHealth) {
+ if (m.health > 0.05) {
+ m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
+ if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
+ for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
+ }
+ }
+ }
+ },
giveGuns(gun = "random", ammoPacks = 10) {
if (tech.isOneGun) b.removeAllGuns();
if (gun === "random") {
@@ -2049,8 +2026,8 @@ const b = {
deathCycles: 110 + RADIUS * 5,
isImproved: false,
beforeDmg(who) {
- if (tech.isIncendiary) {
- const max = Math.max(Math.min(this.endCycle - simulation.cycle, 1500), 0)
+ if (tech.isIncendiary && simulation.cycle + this.deathCycles < this.endCycle) {
+ const max = Math.max(Math.min(this.endCycle - simulation.cycle - this.deathCycles, 1500), 0)
b.explosion(this.position, max * 0.08 + this.isImproved * 100 + 60 * Math.random()); //makes bullet do explosive damage at end
this.endCycle -= max
} else {
@@ -2067,12 +2044,23 @@ const b = {
}
}
},
- onEnd() {},
+ onEnd() {
+ if (tech.isDroneRespawn) {
+ const who = b.guns[b.activeGun]
+ if (who.name === "drones" && who.ammo > 0 && mob.length) {
+ b.drone({ x: this.position.x, y: this.position.y }, 0)
+ if (Math.random() < 0.33) {
+ b.guns[b.activeGun].ammo--;
+ simulation.updateGunHUD();
+ }
+ }
+ }
+ },
do() {
if (simulation.cycle + this.deathCycles > this.endCycle) { //fall shrink and die
this.force.y += this.mass * 0.0012;
this.restitution = 0.2;
- const scale = 0.99;
+ const scale = 0.995;
Matter.Body.scale(this, scale, scale);
} else {
this.force.y += this.mass * 0.0002;
diff --git a/js/mob.js b/js/mob.js
index 41e0d8e..90e0d50 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -917,7 +917,6 @@ const mobs = {
this.torque -= 0.000004 * this.inertia;
} else if (this.noseLength > 1.5 && dot > 0 && dot < 0.03) {
//fire
- console.log(dot)
spawn.bullet(this.vertices[1].x, this.vertices[1].y, 9 + Math.ceil(this.radius / 15));
const v = 15;
Matter.Body.setVelocity(mob[mob.length - 1], {
diff --git a/js/player.js b/js/player.js
index de766c9..3972933 100644
--- a/js/player.js
+++ b/js/player.js
@@ -513,7 +513,7 @@ const m = {
let dmg = 1
dmg *= m.fieldHarmReduction
if (tech.isImmortal) dmg *= 0.79
- if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.25 : 1.25
+ if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.50 : 1.1
if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage
if (tech.isBlockHarm && m.isHolding) dmg *= 0.15
@@ -1487,6 +1487,8 @@ const m = {
// m.fieldHarmReduction = 0.80;
m.fieldBlockCD = 0;
m.fieldHarmReduction = 0.8;
+ m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance
+ m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance)
m.hold = function() {
if (m.isHolding) {
m.drawHold(m.holdingTarget);
diff --git a/js/powerup.js b/js/powerup.js
index f31035b..d1e20ad 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -187,7 +187,7 @@ const powerUps = {
if (tech.isAmmoForGun && b.inventory.length > 0 && b.activeGun) {
const target = b.guns[b.activeGun]
if (target.ammo !== Infinity) {
- const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(0.7 * Math.random() * target.ammoPack)
+ const ammoAdded = Math.ceil(Math.random() * target.ammoPack) + Math.ceil(0.7 * Math.random() * target.ammoPack) * (tech.isAlwaysFire ? 3 : 1)
target.ammo += ammoAdded
simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`)
}
@@ -195,7 +195,7 @@ const powerUps = {
for (let i = 0, len = b.inventory.length; i < len; i++) {
const target = b.guns[b.inventory[i]]
if (target.ammo !== Infinity) {
- const ammoAdded = Math.ceil(Math.random() * target.ammoPack)
+ const ammoAdded = Math.ceil(Math.random() * target.ammoPack) * (tech.isAlwaysFire ? 3 : 1)
target.ammo += ammoAdded
simulation.makeTextLog(`${target.name}.ammo += ${ammoAdded}`)
}
diff --git a/js/simulation.js b/js/simulation.js
index fceb6f1..5788659 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -563,6 +563,7 @@ const simulation = {
b.setFireMethod()
b.setFireCD();
// simulation.updateTechHUD();
+ powerUps.tech.choiceLog = []
powerUps.totalPowerUps = 0;
powerUps.research.count = 0;
m.setFillColors();
@@ -785,7 +786,7 @@ const simulation = {
// }
// },
checks() {
- if (!(m.cycle % 60)) { //once a second
+ if (!(simulation.cycle % 60) && !m.isBodiesAsleep) { //once a second
//energy overfill
if (m.energy > m.maxEnergy) m.energy = m.maxEnergy + (m.energy - m.maxEnergy) * tech.overfillDrain //every second energy above max energy loses 25%
if (tech.isFlipFlopEnergy) {
@@ -839,7 +840,7 @@ const simulation = {
// }
// }
- if (m.lastKillCycle + 300 > m.cycle) { //effects active for 5 seconds after killing a mob
+ if (m.lastKillCycle + 300 > simulation.cycle) { //effects active for 5 seconds after killing a mob
if (tech.isEnergyRecovery) m.energy += m.maxEnergy * 0.05
if (tech.isHealthRecovery) m.addHealth(0.01 * m.maxHealth)
}
diff --git a/js/tech.js b/js/tech.js
index cdfa004..ba3b1f1 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -126,7 +126,7 @@
if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
- if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.66
+ if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.75
if (tech.isTechDamage) dmg *= 2
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
@@ -450,6 +450,27 @@
}
}
},
+ {
+ name: "automatic",
+ description: "always fire when at rest
ammo power ups give 250% ammo",
+ maxCount: 1,
+ count: 0,
+ frequency: 4,
+ allowed() {
+ return tech.isFireNotMove && !tech.isFireMoveLock
+ },
+ requires: "inertial frame, not Higgs mechanism",
+ effect: () => {
+ tech.isAlwaysFire = true;
+ b.setFireMethod();
+ },
+ remove() {
+ if (tech.isAlwaysFire) {
+ tech.isAlwaysFire = false
+ b.setFireMethod();
+ }
+ }
+ },
{
name: "dead reckoning",
description: "increase damage by 33% when at rest",
@@ -475,9 +496,9 @@
count: 0,
frequency: 2,
allowed() {
- return !tech.isEnergyHealth && !m.isShipMode
+ return !tech.isEnergyHealth && !m.isShipMode && !tech.isAlwaysFire
},
- requires: "not mass energy, not ship mode",
+ requires: "not mass energy, not ship mode, not automatic",
effect: () => {
tech.isFireMoveLock = true;
b.setFireMethod();
@@ -1167,7 +1188,8 @@
}
}
}
- }, {
+ },
+ {
name: "dynamo-bot",
description: "a bot damages mobs while it traces your path
regen 6 energy per second when it's near",
maxCount: 9,
@@ -1186,7 +1208,8 @@
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,
@@ -1210,7 +1233,8 @@
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,
@@ -1229,7 +1253,8 @@
remove() {
tech.isRerollBots = false;
}
- }, {
+ },
+ {
name: "robotics",
description: "use 1 research to spawn a random bot
quadruple the frequency of finding bot tech",
maxCount: 1,
@@ -1256,7 +1281,8 @@
}
}
}
- }, {
+ },
+ {
name: "perimeter defense",
description: "reduce harm by 6%
for each of your permanent bots",
maxCount: 1,
@@ -1273,7 +1299,8 @@
remove() {
tech.isBotArmor = false
}
- }, {
+ },
+ {
name: "network effect",
description: "increase damage by 6%
for each of your permanent bots",
maxCount: 1,
@@ -1290,7 +1317,8 @@
remove() {
tech.isBotDamage = false
}
- }, {
+ },
+ {
name: "ersatz bots",
description: "double your permanent bots
remove all of your guns",
maxCount: 1,
@@ -1325,7 +1353,8 @@
tech.missileBotCount *= 2
},
remove() {}
- }, {
+ },
+ {
name: "mass driver",
description: "increase block collision damage by 100%
charge throws more quickly for less energy",
maxCount: 1,
@@ -1341,7 +1370,8 @@
remove() {
tech.throwChargeRate = 1
}
- }, {
+ },
+ {
name: "restitution",
description: "mobs killed by collisions with blocks
spawn a heal, ammo, or research",
maxCount: 1,
@@ -1358,7 +1388,8 @@
remove() {
tech.isBlockPowerUps = false
}
- }, {
+ },
+ {
name: "inelastic collision",
description: "while you are holding a block
reduce harm by 85%",
maxCount: 1,
@@ -1375,7 +1406,8 @@
remove() {
tech.isBlockHarm = false
}
- }, {
+ },
+ {
name: "Pauli exclusion",
description: `after receiving harm from a collision become
immune to harm for an extra 0.75 seconds`,
maxCount: 9,
@@ -1392,7 +1424,8 @@
remove() {
tech.collisionImmuneCycles = 30;
}
- }, {
+ },
+ {
name: "complex spin-statistics",
description: `become immune to harm for 1 second
once every 7 seconds`,
maxCount: 3,
@@ -1536,7 +1569,8 @@
remove() {
tech.isFlipFlopDamage = false;
}
- }, {
+ },
+ {
name: "transistor",
description: "if ON regen 22 energy per second
if OFF drain 3.1 energy per second",
maxCount: 1,
@@ -1553,7 +1587,8 @@
remove() {
tech.isFlipFlopEnergy = false;
}
- }, {
+ },
+ {
name: "shift registers",
description: "set to the ON state
at the start of a level",
maxCount: 1,
@@ -1587,7 +1622,8 @@
remove() {
tech.isSlowFPS = false;
}
- }, {
+ },
+ {
name: "liquid cooling",
description: `freeze all mobs for 7 seconds
after receiving harm`,
maxCount: 1,
@@ -1604,7 +1640,8 @@
remove() {
tech.isHarmFreeze = false;
}
- }, {
+ },
+ {
name: "osmoprotectant",
description: `collisions with stunned or frozen mobs
cause you no harm`,
maxCount: 1,
@@ -1657,7 +1694,8 @@
remove() {
tech.isDroneOnDamage = false;
}
- }, {
+ },
+ {
name: "non-Newtonian armor",
description: "for 10 seconds after receiving harm
reduce harm by 66%",
maxCount: 1,
@@ -1673,7 +1711,8 @@
remove() {
tech.isHarmArmor = false;
}
- }, {
+ },
+ {
name: "radiative equilibrium",
description: "for 10 seconds after receiving harm
increase damage by 200%",
maxCount: 1,
@@ -1689,7 +1728,8 @@
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,
@@ -1705,7 +1745,8 @@
remove() {
tech.isRewindAvoidDeath = false;
}
- }, {
+ },
+ {
name: "causality bots",
description: "when you rewind, build several bots
that protect you for about 9 seconds",
maxCount: 3,
@@ -1722,7 +1763,8 @@
remove() {
tech.isRewindBot = 0;
}
- }, {
+ },
+ {
name: "causality bombs",
description: "before you rewind drop several grenades",
maxCount: 1,
@@ -1738,7 +1780,8 @@
remove() {
tech.isRewindGrenade = false;
}
- }, {
+ },
+ {
name: "piezoelectricity",
description: "colliding with mobs gives you 2048 energy", //
reduce harm by 15%
maxCount: 1,
@@ -1755,7 +1798,8 @@
remove() {
tech.isPiezo = false;
}
- }, {
+ },
+ {
name: "ground state",
description: "reduce harm by 66%
you no longer passively regenerate energy",
maxCount: 1,
@@ -1773,7 +1817,8 @@
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,
@@ -1802,7 +1847,8 @@
simulation.mobDmgColor = "rgba(255,0,0,0.7)"
m.displayHealth();
}
- }, {
+ },
+ {
name: "1st ionization energy",
description: "each heal power up you collect
increases your maximum energy by 5",
maxCount: 1,
@@ -1827,7 +1873,8 @@
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,
@@ -1843,7 +1890,8 @@
remove() {
tech.isEnergyDamage = false;
}
- }, {
+ },
+ {
name: "exciton-lattice",
description: `increase damage by 50%, but
ammo will no longer spawn`,
maxCount: 1,
@@ -1859,7 +1907,8 @@
remove() {
tech.isEnergyNoAmmo = false;
}
- }, {
+ },
+ {
name: "exothermic process",
description: "increase damage by 50%
if a mob dies drain energy by 25%",
maxCount: 1,
@@ -1875,7 +1924,8 @@
remove() {
tech.isEnergyLoss = false;
}
- }, {
+ },
+ {
name: "heat engine",
description: `increase damage by 40%, but
reduce maximum energy by 50`,
maxCount: 1,
@@ -1894,7 +1944,8 @@
tech.isMaxEnergyTech = false;
m.setMaxEnergy()
}
- }, {
+ },
+ {
name: "Gibbs free energy",
description: `increase damage by 5%
for every 10 energy below 100`,
maxCount: 1,
@@ -1911,7 +1962,8 @@
remove() {
tech.isLowEnergyDamage = false;
}
- }, {
+ },
+ {
name: "overcharge",
description: "increase your maximum energy by 50",
maxCount: 9,
@@ -1931,7 +1983,8 @@
tech.bonusEnergy = 0;
m.setMaxEnergy()
}
- }, {
+ },
+ {
name: "supercapacitor",
description: "energy above your max decays 60% slower",
maxCount: 1,
@@ -1947,7 +2000,8 @@
remove() {
tech.overfillDrain = 0.75
}
- }, {
+ },
+ {
name: "energy conservation",
description: "6% of damage done recovered as energy",
maxCount: 9,
@@ -1963,7 +2017,8 @@
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,
@@ -1980,7 +2035,8 @@
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,
@@ -1998,9 +2054,10 @@
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 33%",
+ description: "if a mob has died in the last 5 seconds
increase damage by 50% else decrease it by 25%",
maxCount: 1,
count: 0,
frequency: 2,
@@ -2014,9 +2071,10 @@
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%",
+ description: "if a mob has died in the last 5 seconds
reduce harm by 50% else increase it by 10%",
maxCount: 1,
count: 0,
frequency: 4,
@@ -2031,7 +2089,8 @@
remove() {
tech.isHarmReduceAfterKill = false;
}
- }, {
+ },
+ {
name: "negative feedback",
description: "increase damage by 6%
for every 10 health below 100",
maxCount: 1,
@@ -2047,7 +2106,8 @@
remove() {
tech.isLowHealthDmg = false;
}
- }, {
+ },
+ {
name: "antiscience",
description: "increase damage by 100%
lose 11 health when you pick up a tech",
maxCount: 1,
@@ -2063,7 +2123,8 @@
remove() {
tech.isTechDamage = false;
}
- }, {
+ },
+ {
name: "entropy exchange",
description: "heal for 3% of damage done
take 8% more harm",
maxCount: 9,
@@ -2080,7 +2141,8 @@
remove() {
tech.healthDrain = 0;
}
- }, {
+ },
+ {
name: "fluoroantimonic acid",
description: "increase damage by 40%
when your health is above 100",
maxCount: 1,
@@ -2096,7 +2158,8 @@
remove() {
tech.isAcidDmg = false;
}
- }, {
+ },
+ {
name: "supersaturation",
description: "increase your maximum health by 50",
maxCount: 9,
@@ -2117,7 +2180,8 @@
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,
@@ -2136,7 +2200,8 @@
// 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,
@@ -2152,7 +2217,8 @@
remove() {
tech.isEndLevelPowerUp = false;
}
- }, {
+ },
+ {
name: "negentropy",
description: `at the start of each level
spawn a heal for every 50 missing health`,
maxCount: 1,
@@ -2169,7 +2235,8 @@
remove() {
tech.isHealLowHealth = false;
}
- }, {
+ },
+ {
name: "adiabatic healing",
description: "heal power ups are 100% more effective",
maxCount: 3,
@@ -2253,7 +2320,8 @@
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,
@@ -2270,7 +2338,8 @@
remove() {
tech.isAnthropicDamage = false
}
- }, {
+ },
+ {
name: "quantum immortality",
description: "after dying, continue in an alternate reality
reduce harm by 23%", //spawn 4 research
maxCount: 1,
@@ -2287,7 +2356,8 @@
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,
@@ -2304,7 +2374,8 @@
remove() {
tech.isSwitchReality = false;
}
- }, {
+ },
+ {
name: "Ψ(t) collapse",
description: "enter an alternate reality after you research
spawn 11 research",
maxCount: 1,
@@ -2322,7 +2393,8 @@
remove() {
tech.isResearchReality = false;
}
- }, {
+ },
+ {
name: "decoherence",
description: "researched or canceled tech won't reoccur
spawn 5 research",
maxCount: 1,
@@ -2340,7 +2412,8 @@
tech.isBanish = false
powerUps.tech.banishLog = [] //reset banish log
}
- }, {
+ },
+ {
name: "renormalization",
description: "using a research for any purpose
has a 37% chance to spawn a research",
maxCount: 1,
@@ -2356,7 +2429,8 @@
remove() {
tech.renormalization = false;
}
- }, {
+ },
+ {
name: "perturbation theory",
description: "66% decreased delay after firing
when you have no research in your inventory",
maxCount: 1,
@@ -2376,7 +2450,8 @@
tech.researchHaste = 1;
b.setFireCD();
}
- }, {
+ },
+ {
name: "ansatz",
description: "after choosing a field, tech, or gun
if you have no research spawn 2",
maxCount: 1,
@@ -2392,7 +2467,8 @@
remove() {
tech.isAnsatz = false;
}
- }, {
+ },
+ {
name: "Bayesian statistics",
description: "increase damage by 3.9%
for each research in your inventory",
maxCount: 1,
@@ -2408,7 +2484,8 @@
remove() {
tech.isRerollDamage = false;
}
- }, {
+ },
+ {
name: "Born rule",
description: "remove all current tech
spawn new tech to replace them",
maxCount: 1,
@@ -2557,7 +2634,8 @@
// 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,
@@ -2573,7 +2651,8 @@
remove() {
tech.isCancelRerolls = false
}
- }, {
+ },
+ {
name: "correlated damage",
description: "your chance to duplicate power ups
increases your damage by the same percent",
maxCount: 1,
@@ -2589,7 +2668,8 @@
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,
@@ -2605,7 +2685,8 @@
remove() {
tech.isDuplicateBoss = false;
}
- }, {
+ },
+ {
name: "apomixis",
description: "after reaching 100% duplication chance
immediately spawn 4 level bosses",
maxCount: 1,
@@ -2622,7 +2703,8 @@
remove() {
tech.is100Duplicate = false;
}
- }, {
+ },
+ {
name: "exchange symmetry",
description: "convert 1 a random tech into 3 new guns
recursive tech lose all stacks",
maxCount: 1,
@@ -2653,7 +2735,8 @@
simulation.updateTechHUD();
},
remove() {}
- }, {
+ },
+ {
name: "monte carlo experiment",
description: "spawn 2 tech
remove 1 random tech",
maxCount: 1,
@@ -2671,7 +2754,8 @@
for (let i = 0; i < removeTotal + 1; i++) powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "tech");
},
remove() {}
- }, {
+ },
+ {
name: "strange attractor",
description: `use 2 research to spawn 1 tech
with double your duplication chance`,
maxCount: 1,
@@ -2694,7 +2778,8 @@
tech.duplicateChance = chanceStore
},
remove() {}
- }, {
+ },
+ {
name: "mine synthesis",
description: "drop a mine after picking up a power up",
maxCount: 1,
@@ -2712,7 +2797,8 @@
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,
@@ -2822,7 +2908,8 @@
remove() {
tech.isExtraChoice = false;
}
- }, {
+ },
+ {
name: "determinism",
description: "spawn 6 tech, but you have no cancel
and 1 choice for tech, fields, and guns",
maxCount: 1,
@@ -2843,7 +2930,8 @@
tech.isDeterminism = false;
for (let i = 0; i < 6; i++) powerUps.removeRandomTech()
}
- }, {
+ },
+ {
name: "superdeterminism",
description: "spawn 5 tech
research, guns, and fields no longer spawn",
maxCount: 1,
@@ -2889,7 +2977,8 @@
level.difficultyIncrease(simulation.difficultyMode)
}
}
- }, {
+ },
+ {
name: "ergodicity",
description: "reduce combat difficulty by 2 levels
all healing has no effect",
maxCount: 1,
@@ -2966,7 +3055,8 @@
tech.isRewindGun = false
}
}
- }, {
+ },
+ {
name: "needle gun",
description: "nail gun fires 3 mob piercing needles
requires 3 times more ammo",
isGunTech: true,
@@ -3003,7 +3093,8 @@
}
}
}
- }, {
+ },
+ {
name: "ceramic needles",
description: `your needles pierce shields
directly damaging shielded mobs`,
isGunTech: true,
@@ -3020,7 +3111,8 @@
remove() {
tech.isNeedleShieldPierce = false
}
- }, {
+ },
+ {
name: "rivet gun",
description: "nail gun slowly fires a heavy rivet",
isGunTech: true,
@@ -3051,7 +3143,8 @@
}
}
}
- }, {
+ },
+ {
name: "rivet diameter",
description: `your rivets are 20% larger
increases mass and physical damage`,
isGunTech: true,
@@ -3068,7 +3161,8 @@
remove() {
tech.rivetSize = 1;
}
- }, {
+ },
+ {
name: "ice crystal nucleation",
description: "the nail gun uses energy to condense
unlimited freezing ice shards",
isGunTech: true,
@@ -3104,7 +3198,8 @@
}
}
}
- }, {
+ },
+ {
name: "pneumatic actuator",
description: "nail gun takes 45% less time to ramp up
to it's shortest delay after firing",
isGunTech: true,
@@ -3129,7 +3224,8 @@
}
}
}
- }, {
+ },
+ {
name: "powder-actuated",
description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed",
isGunTech: true,
@@ -3154,7 +3250,8 @@
}
}
}
- }, {
+ },
+ {
name: "supercritical fission",
description: "nails, needles, and rivets can explode
if they strike mobs near their center",
isGunTech: true,
@@ -3171,7 +3268,8 @@
remove() {
tech.isNailCrit = false
}
- }, {
+ },
+ {
name: "irradiated nails",
description: "nails and rivets are radioactive
about 90% more damage over 2 seconds",
isGunTech: true,
@@ -3188,7 +3286,8 @@
remove() {
tech.isNailRadiation = false;
}
- }, {
+ },
+ {
name: "4s half-life",
description: "nails are made of plutonium-238
increase damage by 100% over 6 seconds",
isGunTech: true,
@@ -3205,7 +3304,8 @@
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,
@@ -3222,7 +3322,8 @@
remove() {
tech.isFastRadiation = false;
}
- }, {
+ },
+ {
name: "shotgun spin-statistics",
description: "immune to harm while firing the shotgun
ammo costs are doubled",
isGunTech: true,
@@ -3261,7 +3362,8 @@
}
}
}
- }, {
+ },
+ {
name: "nailshot",
description: "the shotgun fires a burst of nails",
isGunTech: true,
@@ -3278,7 +3380,8 @@
remove() {
tech.isNailShot = false;
}
- }, {
+ },
+ {
name: "shotgun slug",
description: "the shotgun fires 1 large bullet",
isGunTech: true,
@@ -3295,7 +3398,8 @@
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,
@@ -3312,7 +3416,8 @@
remove() {
tech.isShotgunRecoil = false;
}
- }, {
+ },
+ {
name: "super duper",
description: "fire 1 additional super ball",
isGunTech: true,
@@ -3329,7 +3434,8 @@
remove() {
tech.superBallNumber = 4;
}
- }, {
+ },
+ {
name: "super ball",
description: "fire just 1 large super ball
that stuns mobs for 3 second",
isGunTech: true,
@@ -3346,7 +3452,8 @@
remove() {
tech.oneSuperBall = false;
}
- }, {
+ },
+ {
name: "super sized",
description: `your super balls are 20% larger
increases mass and physical damage`,
isGunTech: true,
@@ -3363,7 +3470,8 @@
remove() {
tech.bulletSize = 1;
}
- }, {
+ },
+ {
name: "wave packet",
description: "wave beam emits two oscillating particles
decrease wave damage by 20%",
isGunTech: true,
@@ -3380,7 +3488,8 @@
remove() {
tech.waveHelix = 1
}
- }, {
+ },
+ {
name: "phase velocity",
description: "the wave beam propagates faster in solids",
isGunTech: true,
@@ -3399,7 +3508,8 @@
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,
@@ -3416,7 +3526,8 @@
remove() {
tech.isWaveReflect = false
}
- }, {
+ },
+ {
name: "cruise missile",
description: "missiles travel 50% slower,
but have a 50% larger explosive payload",
isGunTech: true,
@@ -3433,7 +3544,8 @@
remove() {
tech.missileSize = false
}
- }, {
+ },
+ {
name: "MIRV",
description: "launch +1 missile at a time
decrease size and fire rate by 10%",
isGunTech: true,
@@ -3450,7 +3562,8 @@
remove() {
tech.missileCount = 1;
}
- }, {
+ },
+ {
name: "missile-bot",
description: "a bot fires missiles at far away mobs",
isGunTech: true,
@@ -3470,7 +3583,8 @@
remove() {
tech.missileBotCount = 0;
}
- }, {
+ },
+ {
name: "rocket-propelled grenade",
description: "grenades rapidly accelerate forward
map collisions trigger an explosion",
isGunTech: true,
@@ -3489,7 +3603,8 @@
tech.isRPG = false;
b.setGrenadeMode()
}
- }, {
+ },
+ {
name: "vacuum bomb",
description: "grenades fire slower, explode bigger
and, suck everything towards them",
isGunTech: true,
@@ -3508,7 +3623,8 @@
tech.isVacuumBomb = false;
b.setGrenadeMode()
}
- }, {
+ },
+ {
name: "neutron bomb",
description: "grenades are irradiated with Cf-252
does damage, harm, and drains energy",
isGunTech: true,
@@ -3527,7 +3643,8 @@
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,
@@ -3544,7 +3661,8 @@
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,
@@ -3561,7 +3679,8 @@
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,
@@ -3578,7 +3697,8 @@
remove() {
tech.isLaserMine = false;
}
- }, {
+ },
+ {
name: "mine reclamation",
description: "retrieve ammo from all undetonated mines
and 20% of mines after detonation",
isGunTech: true,
@@ -3595,7 +3715,8 @@
remove() {
tech.isMineAmmoBack = false;
}
- }, {
+ },
+ {
name: "sentry",
description: "mines target mobs with nails over time
mines last about 12 seconds",
isGunTech: true,
@@ -3612,7 +3733,8 @@
remove() {
tech.isMineSentry = false;
}
- }, {
+ },
+ {
name: "mycelial fragmentation",
description: "sporangium release an extra spore
once a second during their growth phase",
isGunTech: true,
@@ -3629,7 +3751,8 @@
remove() {
tech.isSporeGrowth = false
}
- }, {
+ },
+ {
name: "tinsellated flagella",
description: "sporangium release 2 more spores
spores accelerate 50% faster",
isGunTech: true,
@@ -3646,7 +3769,8 @@
remove() {
tech.isFastSpores = false
}
- }, {
+ },
+ {
name: "cryodesiccation",
description: "sporangium release 2 more spores
spores freeze mobs for 1.5 second",
//
spores do 1/3 damage
@@ -3664,7 +3788,8 @@
remove() {
tech.isSporeFreeze = false
}
- }, {
+ },
+ {
name: "diplochory",
description: "spores use the player for dispersal
until they locate a viable host",
isGunTech: true,
@@ -3681,7 +3806,8 @@
remove() {
tech.isSporeFollow = false
}
- }, {
+ },
+ {
name: "mutualism",
description: "increase spore damage by 150%
spores borrow 0.5 health until they die",
isGunTech: true,
@@ -3698,7 +3824,8 @@
remove() {
tech.isMutualism = false
}
- }, {
+ },
+ {
name: "brushless motor",
description: "drones accelerate 50% faster",
isGunTech: true,
@@ -3715,7 +3842,8 @@
remove() {
tech.isFastDrones = false
}
- }, {
+ },
+ {
name: "delivery drone",
description: "if a drone picks up a power up,
it becomes larger, faster, and more durable",
isGunTech: true,
@@ -3732,9 +3860,10 @@
remove() {
tech.isDroneGrab = false
}
- }, {
+ },
+ {
name: "reduced tolerances",
- description: "reduce all drone production costs by 66%
reduce the average drone lifetime by 40%",
+ description: "reduce drone energy/ammo costs by 66%
reduce the average drone lifetime by 40%",
isGunTech: true,
maxCount: 3,
count: 0,
@@ -3757,7 +3886,26 @@
if (b.guns[i].name === "drones") b.guns[i].ammoPack = b.guns[i].defaultAmmoPack
}
}
- }, {
+ },
+ {
+ name: "drone repair",
+ description: "broken drones repair if the drone gun is active
repairing has a 33% chance to use an ammo",
+ isGunTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ allowed() {
+ return tech.haveGunCheck("drones")
+ },
+ requires: "drone gun",
+ effect() {
+ tech.isDroneRespawn = true
+ },
+ remove() {
+ tech.isDroneRespawn = false
+ }
+ },
+ {
name: "necrophoresis",
description: "foam bubbles grow and split into 3 copies
when the mob they are stuck to dies",
isGunTech: true,
@@ -3774,7 +3922,8 @@
remove() {
tech.isFoamGrowOnDeath = false;
}
- }, {
+ },
+ {
name: "colloidal foam",
description: "foam bubbles dissipate 40% faster
increase foam damage per second by 300%",
isGunTech: true,
@@ -3809,7 +3958,8 @@
remove() {
tech.isFoamAttract = false
}
- }, {
+ },
+ {
name: "quantum foam",
description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 127%",
isGunTech: true,
@@ -3826,7 +3976,8 @@
remove() {
tech.foamFutureFire = 0;
}
- }, {
+ },
+ {
name: "foam fractionation",
description: "foam gun bubbles are 100% larger
when you have below 300 ammo",
isGunTech: true,
@@ -3898,7 +4049,8 @@
remove() {
tech.isRailEnergyGain = false;
}
- }, {
+ },
+ {
name: "dielectric polarization",
description: "firing the rail gun damages nearby mobs",
isGunTech: true,
@@ -3915,7 +4067,8 @@
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,
@@ -3932,7 +4085,8 @@
remove() {
tech.isCapacitor = false;
}
- }, {
+ },
+ {
name: "laser diodes",
description: "all lasers drain 30% less energy
effects laser-gun, laser-bot, and laser-mines",
isGunTech: true,
@@ -3949,7 +4103,8 @@
remove() {
tech.isLaserDiode = 1;
}
- }, {
+ },
+ {
name: "relativistic momentum",
description: "all lasers push mobs away
effects laser-gun, laser-bot, and laser-mines",
isGunTech: true,
@@ -3989,7 +4144,8 @@
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,
@@ -4014,7 +4170,8 @@
}
}
}
- }, {
+ },
+ {
name: "diffuse beam",
description: "laser beam is wider and doesn't reflect
increase full beam damage by 200%",
isGunTech: true,
@@ -4041,7 +4198,8 @@
}
}
}
- }, {
+ },
+ {
name: "output coupler",
description: "widen diffuse laser beam by 40%
increase full beam damage by 40%",
isGunTech: true,
@@ -4068,7 +4226,8 @@
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,
@@ -4095,7 +4254,8 @@
}
}
}
- }, {
+ },
+ {
name: "pulse",
description: "use 25% of your energy in a pulsed laser
that instantly initiates a fusion explosion",
isGunTech: true,
@@ -4120,7 +4280,8 @@
}
}
}
- }, {
+ },
+ {
name: "shock wave",
description: "mobs caught in pulse's explosion are stunned
for up to 2 seconds",
isGunTech: true,
@@ -4137,7 +4298,8 @@
remove() {
tech.isPulseStun = false;
}
- }, {
+ },
+ {
name: "neocognitron",
description: "pulse automatically aims at a nearby mob
50% decreased delay after firing",
isGunTech: true,
@@ -4176,7 +4338,8 @@
remove() {
tech.blockDmg = 0;
}
- }, {
+ },
+ {
name: "frequency resonance",
description: "standing wave harmonics shield is retuned
increase size and blocking efficiency by 50%",
isFieldTech: true,
@@ -4188,14 +4351,17 @@
},
requires: "standing wave harmonics",
effect() {
- m.fieldRange += 175 * 0.25
- m.fieldShieldingScale *= 0.5
+ tech.frequencyResonance = this.count + 1 // +1 because count updates later
+ m.fieldRange = 175 + 175 * 0.25 * tech.frequencyResonance
+ m.fieldShieldingScale = Math.pow(0.5, tech.frequencyResonance)
},
remove() {
m.fieldRange = 175;
m.fieldShieldingScale = 1;
+ tech.frequencyResonance = 0
}
- }, {
+ },
+ {
name: "flux pinning",
description: "blocking with your field
stuns mobs for +2 second",
isFieldTech: true,
@@ -4212,7 +4378,8 @@
remove() {
tech.isStunField = 0;
}
- }, {
+ },
+ {
name: "fracture analysis",
description: "bullet impacts do 400% damage
to stunned mobs",
isFieldTech: true,
@@ -4229,7 +4396,8 @@
remove() {
tech.isCrit = false;
}
- }, {
+ },
+ {
name: "eddy current brake",
description: "your stored energy projects a field that
limits the top speed of mobs",
isFieldTech: true,
@@ -4246,7 +4414,8 @@
remove() {
tech.isPerfectBrake = false;
}
- }, {
+ },
+ {
name: "pair production",
description: "picking up a power up gives you 250 energy",
isFieldTech: true,
@@ -4264,7 +4433,8 @@
remove() {
tech.isMassEnergy = false;
}
- }, {
+ },
+ {
name: "bot manufacturing",
description: "use nano-scale manufacturing
to build 3 random bots",
isFieldTech: true,
@@ -4286,7 +4456,8 @@
b.randomBot()
},
remove() {}
- }, {
+ },
+ {
name: "bot prototypes",
description: "use nano-scale manufacturing to upgrade
all bots to a random type and build 2 bots",
isFieldTech: true,
@@ -4373,7 +4544,8 @@
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,
@@ -4390,7 +4562,8 @@
remove() {
tech.isSporeField = false;
}
- }, {
+ },
+ {
name: "missile manufacturing",
description: "nano-scale manufacturing is repurposed
excess energy used to construct missiles",
isFieldTech: true,
@@ -4407,7 +4580,8 @@
remove() {
tech.isMissileField = false;
}
- }, {
+ },
+ {
name: "ice IX manufacturing",
description: "nano-scale manufacturing is repurposed
excess energy used to condense ice IX",
isFieldTech: true,
@@ -4424,7 +4598,8 @@
remove() {
tech.isIceField = false;
}
- }, {
+ },
+ {
name: "thermoelectric effect",
description: "killing mobs with ice IX gives 4 health
and 80 energy",
isFieldTech: true,
@@ -4441,7 +4616,8 @@
remove() {
tech.iceEnergy = 0;
}
- }, {
+ },
+ {
name: "degenerate matter",
description: "reduce harm by 50%
while negative mass field is active",
isFieldTech: true,
@@ -4458,7 +4634,8 @@
remove() {
tech.isHarmReduce = false;
}
- }, {
+ },
+ {
name: "annihilation",
description: "touching normal mobs annihilates them
drains 33% of maximum energy",
isFieldTech: true,
@@ -4475,7 +4652,8 @@
remove() {
tech.isAnnihilation = false;
}
- }, {
+ },
+ {
name: "Bose Einstein condensate",
description: "mobs inside your field are frozen
pilot wave, negative mass, time dilation",
isFieldTech: true,
@@ -4567,7 +4745,8 @@
remove() {
tech.isExtruder = false;
}
- }, {
+ },
+ {
name: "timelike world line",
description: "time dilation doubles your relative time rate
and makes you immune to harm",
isFieldTech: true,
@@ -4586,7 +4765,8 @@
tech.isTimeSkip = false;
b.setFireCD();
}
- }, {
+ },
+ {
name: "Lorentz transformation",
description: "permanently increase your relative time rate
move, jump, and shoot 40% faster",
isFieldTech: true,
@@ -4609,7 +4789,8 @@
m.setMovement();
b.setFireCD();
}
- }, {
+ },
+ {
name: "time crystals",
description: "quadruple your default energy regeneration",
isFieldTech: true,
@@ -4628,7 +4809,8 @@
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,
@@ -4645,7 +4827,8 @@
remove() {
tech.isIntangible = false;
}
- }, {
+ },
+ {
name: "dazzler",
description: "decloaking stuns nearby mobs
drains 30% of your stored energy",
isFieldTech: true,
@@ -4662,7 +4845,8 @@
remove() {
tech.isCloakStun = false;
}
- }, {
+ },
+ {
name: "discrete optimization",
description: "increase damage by 66%
50% increased delay after firing",
isFieldTech: true,
@@ -4681,7 +4865,8 @@
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,
@@ -4698,7 +4883,8 @@
remove() {
tech.isWormholeDamage = false
}
- }, {
+ },
+ {
name: "Penrose process",
description: "after a block falls into a wormhole
you gain 63 energy",
isFieldTech: true,
@@ -4715,7 +4901,8 @@
remove() {
tech.isWormholeEnergy = false
}
- }, {
+ },
+ {
name: "transdimensional spores",
description: "when blocks fall into a wormhole
higher dimension spores are summoned",
isFieldTech: true,
@@ -4732,7 +4919,8 @@
remove() {
tech.isWormSpores = false
}
- }, {
+ },
+ {
name: "traversable geodesics",
description: "your bullets can traverse wormholes
spawn a gun and ammo",
isFieldTech: true,
@@ -4773,7 +4961,8 @@
m.shipMode()
},
remove() {}
- }, {
+ },
+ {
name: "quantum leap",
description: "experiment: every 20 seconds
become an alternate version of yourself",
maxCount: 1,
@@ -4793,7 +4982,8 @@
}, 20000); //every 20 sections
},
remove() {}
- }, {
+ },
+ {
name: "shields",
description: "experiment: every 5 seconds
all mobs gain a shield",
maxCount: 1,
@@ -4967,7 +5157,8 @@
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,
@@ -4984,7 +5175,8 @@
m.draw = () => {}
},
remove() {}
- }, {
+ },
+ {
name: "quantum leap",
description: "become an alternate version of yourself
every 20 seconds",
maxCount: 1,
@@ -5004,7 +5196,8 @@
}, 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!!!1!!",
maxCount: 1,
@@ -5023,7 +5216,8 @@
}, 30000); //every 30 sections
},
remove() {}
- }, {
+ },
+ {
name: "music",
description: "add music to n-gon",
maxCount: 1,
@@ -5040,7 +5234,8 @@
window.open('https://www.youtube.com/results?search_query=music', '_blank')
},
remove() {}
- }, {
+ },
+ {
name: "performance",
description: "display performance stats to n-gon",
maxCount: 1,
@@ -5072,7 +5267,8 @@
document.getElementById("health-bg").style.left = "86px"
},
remove() {}
- }, {
+ },
+ {
name: "repartitioning",
description: "set the frequency of finding normal tech to 0
spawn 5 tech",
maxCount: 1,
@@ -5096,7 +5292,8 @@
for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech");
},
remove() {}
- }, {
+ },
+ {
name: "defragment",
description: "set the frequency of finding JUNK tech to zero",
maxCount: 1,
@@ -5115,7 +5312,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "ship",
description: "fly around with no legs
reduce combat difficulty by 1 level",
maxCount: 1,
@@ -5172,7 +5370,8 @@
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,
@@ -5190,7 +5389,8 @@
ctx.shadowBlur = 25;
},
remove() {}
- }, {
+ },
+ {
name: "lighter",
description: `ctx.globalCompositeOperation = "lighter"`,
maxCount: 1,
@@ -5207,7 +5407,8 @@
ctx.globalCompositeOperation = "lighter";
},
remove() {}
- }, {
+ },
+ {
name: "rewind",
description: "every 5 seconds rewind 2 seconds
lasts 120 seconds",
maxCount: 9,
@@ -5226,7 +5427,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "energy to mass conversion",
description: "convert your energy into blocks",
maxCount: 9,
@@ -5255,7 +5457,8 @@
},
remove() {}
- }, {
+ },
+ {
name: "level.nextLevel()",
description: "advance to the next level",
maxCount: 9,
@@ -5272,7 +5475,8 @@
level.nextLevel();
},
remove() {}
- }, {
+ },
+ {
name: "expert system",
description: "spawn a tech power up
add 64 JUNK tech to the potential pool",
maxCount: 9,
@@ -5290,7 +5494,8 @@
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,
@@ -5315,7 +5520,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "missile Launching System",
description: "fire missiles for the next 60 seconds",
maxCount: 9,
@@ -5340,7 +5546,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "grenade production",
description: "drop grenades for the next 120 seconds",
maxCount: 9,
@@ -5439,7 +5646,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "diegesis",
description: "indicate gun fire delay
through a rotation of your head",
maxCount: 1,
@@ -5482,7 +5690,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "pareidolia",
description: "don't",
maxCount: 1,
@@ -5553,7 +5762,8 @@
}
},
remove() {}
- }, {
+ },
+ {
name: "prism",
description: "you cycle through different colors",
maxCount: 1,
@@ -5578,7 +5788,8 @@
}, 10);
},
remove() {}
- }, {
+ },
+ {
name: "assimilation",
description: "all your bots are converted to the same random model",
maxCount: 1,
@@ -5636,7 +5847,8 @@
for (let i = 0; i < total; i++) bots[index]()
},
remove() {}
- }, {
+ },
+ {
name: "growth hacking",
description: "increase combat difficulty by 1 level",
maxCount: 1,
@@ -5653,7 +5865,8 @@
level.difficultyIncrease(simulation.difficultyMode)
},
remove() {}
- }, {
+ },
+ {
name: "stun",
description: "stun all mobs for up to 8 seconds",
maxCount: 9,
@@ -5670,7 +5883,8 @@
for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 480)
},
remove() {}
- }, {
+ },
+ {
name: "re-arm",
description: "eject all your guns",
maxCount: 9,
@@ -5697,7 +5911,8 @@
simulation.makeGunHUD(); //update gun HUD
},
remove() {}
- }, {
+ },
+ {
name: "re-research",
description: "eject all your research",
maxCount: 9,
@@ -5715,7 +5930,8 @@
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",
maxCount: 9,
@@ -5733,7 +5949,8 @@
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,
@@ -6054,4 +6271,7 @@
droneCycleReduction: null,
droneEnergyReduction: null,
isNoHeals: null,
+ frequencyResonance: null,
+ isAlwaysFire: null,
+ isDroneRespawn: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 26f9ced..c31fcd5 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,16 +1,9 @@
******************************************************** NEXT PATCH ********************************************************
-added new graphics to several maps
+tech: automatic - always fire, but get 2.5x ammo
+ requires inertial frame
-to level developers: level.fillBG and level.fill no longer work,
-you should draw backgrounds directly in level.custom like this:
-level.custom = () => {
- ctx.fillStyle = "rgba(0,255,255,0.1)";
- ctx.fillRect(6400, -550, 300, 350);
- level.playerExitCheck();
- level.exit.draw();
- level.enter.draw();
-};
+tech: drone repair - while drones are your active gun, drones respawn with a 50% chance to consume ammo
******************************************************** BUGS ********************************************************
@@ -43,19 +36,14 @@ fix door.isOpen actually meaning isClosed?
******************************************************** TODO ********************************************************
+flipflop, but toggles after a kill
+
tech shotgun - crouching makes your spread very small
remove spread reduction on nail shot
doesn't apply to slug
add water drops to sewers
-move power ups in front of blocks, make blocks not transparent?
-
-consider adding canvas path shadows to levels in level.custom for non squared lighting
- convert all level.BG into canvas draw in level.custom
- draw exit and entrance in level
-
-
new level: procedural generation
several small rooms are linked by portals
the portals have a randomized pattern