diff --git a/.DS_Store b/.DS_Store
index c4ede1b..d511f6e 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index c340e9f..db275bc 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -230,7 +230,7 @@ const b = {
setFireCD() {
b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage
if (tech.isFastTime) b.fireCDscale *= 0.5
- if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.85, b.inventory.length)
+ if (tech.isFireRateForGuns) b.fireCDscale *= Math.pow(0.82, b.inventory.length)
if (tech.isFireMoveLock) b.fireCDscale *= 0.5
},
fireAttributes(dir, rotate = true) {
@@ -1859,7 +1859,11 @@ const b = {
y: 100 * (Math.random() - 0.5)
},
beforeDmg(who) {
- this.endCycle = 0; //bullet ends cycle after doing damage
+ if (tech.wormSurviveDmg && who.alive) {
+ this.endCycle = simulation.cycle + Math.floor((600 + Math.floor(Math.random() * 420)) * tech.isBulletsLastLonger); //bullet ends cycle resets
+ } else {
+ this.endCycle = 0; //bullet ends cycle after doing damage
+ }
if (this.isFreeze) mobs.statusSlow(who, 90)
},
onEnd() {
@@ -2545,8 +2549,8 @@ const b = {
inertia: Infinity,
frictionAir: 0.003,
dmg: 0, //damage on impact
- damage: (tech.isFastFoam ? 0.044 : 0.011) * (tech.isFoamTeleport ? 1.66 : 1), //damage done over time
- scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.6 : 1),
+ damage: (tech.isFastFoam ? 0.044 : 0.011) * (tech.isFoamTeleport ? 1.60 : 1), //damage done over time
+ scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
classType: "bullet",
collisionFilter: {
category: cat.bullet,
@@ -2749,7 +2753,7 @@ const b = {
bullet[me].dmg = tech.isNailRadiation ? 0 : dmg
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
if (tech.isNailRadiation) mobs.statusDoT(who, dmg * (tech.isFastRadiation ? 2.6 : 0.65), tech.isSlowRadiation ? 240 : (tech.isFastRadiation ? 30 : 120)) // one tick every 30 cycles
- if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.975) {
+ if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.94) {
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
}
};
@@ -2776,25 +2780,25 @@ const b = {
}
}
if (!immune) {
- if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.975) {
+ if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.94) {
b.explosion(this.position, 220 + 50 * Math.random()); //makes bullet do explosive damage at end
}
this.immuneList.push(who.id) //remember that this needle has hit this mob once already
who.foundPlayer();
+ let dmg = b.dmgScale * 6
if (tech.isNailRadiation) {
mobs.statusDoT(who, tech.isFastRadiation ? 12 : 3, tech.isSlowRadiation ? 240 : (tech.isFastRadiation ? 30 : 120)) // one tick every 30 cycles
- } else {
- let dmg = b.dmgScale * 6
- if (tech.isCrit && who.isStunned) dmg *= 4
- who.damage(dmg, tech.isNeedleShieldPierce);
- simulation.drawList.push({ //add dmg to draw queue
- x: this.position.x,
- y: this.position.y,
- radius: Math.log(2 * dmg + 1.1) * 40,
- color: simulation.playerDmgColor,
- time: simulation.drawTime
- });
+ dmg *= 0.25
}
+ if (tech.isCrit && who.isStunned) dmg *= 4
+ who.damage(dmg, tech.isNeedleShieldPierce);
+ simulation.drawList.push({ //add dmg to draw queue
+ x: this.position.x,
+ y: this.position.y,
+ radius: Math.log(2 * dmg + 1.1) * 40,
+ color: simulation.playerDmgColor,
+ time: simulation.drawTime
+ });
}
}
}
@@ -3661,9 +3665,9 @@ const b = {
} else if (tech.isNeedles) {
this.fire = this.fireNeedles
} else if (tech.nailInstantFireRate) {
- this.fire = this.fireNailFireRate
- } else if (tech.nailFireRate) {
- this.fire = this.fireNailFireRate
+ this.fire = this.fireInstantFireRate
+ // } else if (tech.nailFireRate) {
+ // this.fire = this.fireNailFireRate
} else {
this.fire = this.fireNormal
}
@@ -3711,7 +3715,7 @@ const b = {
});
bullet[me].endCycle = simulation.cycle + 180
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
- if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.975) {
+ if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.94) {
b.explosion(this.position, 300 + 30 * Math.random()); //makes bullet do explosive damage at end
}
if (tech.isNailRadiation) mobs.statusDoT(who, 7 * (tech.isFastRadiation ? 1.4 : 0.35), tech.isSlowRadiation ? 240 : (tech.isFastRadiation ? 30 : 120)) // one tick every 30 cycles
@@ -3738,20 +3742,20 @@ const b = {
};
b.muzzleFlash(30);
},
- fireNailFireRate() {
- if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
- const CD = Math.max(7.5 - 0.06 * (m.cycle - this.startingHoldCycle), 2) //CD scales with cycles fire is held down
- this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
+ // fireNailFireRate() {
+ // if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
+ // const CD = Math.max(7.5 - 0.06 * (m.cycle - this.startingHoldCycle), 2) //CD scales with cycles fire is held down
+ // this.nextFireCycle = m.cycle + CD * b.fireCDscale //predict next fire cycle if the fire button is held down
- m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
- this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (m.crouch ? 1.35 : 3.2) / CD)
- },
+ // m.fireCDcycle = m.cycle + Math.floor(CD * b.fireCDscale); // cool down
+ // this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (m.crouch ? 1.35 : 3.2) / CD)
+ // },
fireInstantFireRate() {
m.fireCDcycle = m.cycle + Math.floor(2 * b.fireCDscale); // cool down
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (m.crouch ? 1.35 : 3.2) / 2)
},
baseFire(angle) {
- const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate
+ const speed = 30 + 6 * Math.random()
b.nail({
x: m.pos.x + 30 * Math.cos(m.angle),
y: m.pos.y + 30 * Math.sin(m.angle)
@@ -3762,14 +3766,14 @@ const b = {
if (tech.isIceCrystals) {
bullet[bullet.length - 1].beforeDmg = function(who) {
mobs.statusSlow(who, 60)
- if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.975) {
+ if (tech.isNailCrit && !who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.94) {
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
}
};
if (m.energy < 0.01) {
m.fireCDcycle = m.cycle + 60; // cool down
} else {
- m.energy -= m.fieldRegen + 0.01
+ m.energy -= m.fieldRegen + 0.009
}
}
},
@@ -3778,8 +3782,8 @@ const b = {
name: "shotgun",
description: "fire a wide burst of short range bullets",
ammo: 0,
- ammoPack: 4.5,
- defaultAmmoPack: 4.5,
+ ammoPack: 4.3,
+ defaultAmmoPack: 4.3,
have: false,
do() {},
fire() {
@@ -4803,9 +4807,10 @@ const b = {
setTimeout(() => {
if (!simulation.paused) {
b.foam(position, Vector.rotate(velocity, spread), radius)
- bullet[bullet.length - 1].damage = (1 + 0.9 * tech.foamFutureFire) * (tech.isFastFoam ? 0.048 : 0.012) //double damage
+ // (tech.isFastFoam ? 0.044 : 0.011) * (tech.isFoamTeleport ? 1.60 : 1)
+ bullet[bullet.length - 1].damage *= (1 + 0.75 * tech.foamFutureFire)
}
- }, 300 * tech.foamFutureFire);
+ }, 250 * tech.foamFutureFire);
} else {
b.foam(position, Vector.rotate(velocity, spread), radius)
}
diff --git a/js/index.js b/js/index.js
index f6fb5a8..b762ecf 100644
--- a/js/index.js
+++ b/js/index.js
@@ -466,7 +466,7 @@ const build = {
},
reset() {
simulation.startGame(true); //starts game, but pauses it
- build.isExperimentSelection = false;
+ build.isExperimentSelection = true;
simulation.paused = true;
m.setField(0)
b.inventory = []; //removes guns and ammo
@@ -527,7 +527,7 @@ const build = {
});
},
- startExperiment() {
+ startExperiment() { //start playing the game after exiting the experiment menu
build.isExperimentSelection = false;
spawn.setSpawnList(); //gives random mobs, not starter mobs
spawn.setSpawnList();
@@ -573,7 +573,6 @@ function openExperimentMenu() {
document.body.style.overflowY = "scroll";
document.body.style.overflowX = "hidden";
document.getElementById("info").style.display = 'none'
- build.isExperimentSelection = true
build.reset();
}
diff --git a/js/level.js b/js/level.js
index 155bd83..871fd6b 100644
--- a/js/level.js
+++ b/js/level.js
@@ -1148,17 +1148,17 @@ const level = {
spawn.bodyRect(x + 500, y - 100, 125, 100, 0.25);
spawn.bodyRect(x + 200, y - 150, 100, 150, 0.25);
spawn.bodyRect(x + 1075, y - 1075, 100, 125, 0.25);
- const density = 0.0015 + (simulation.difficultyMode < 3 ? 0.003 : 0)
- const angle = 0
- const variance = Math.PI
- const frictionAir = 0
- const angularVelocity = 0.01
- const spinVariance = 0.02
- balance1 = level.spinner(x + 225, y - 565, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
- balance2 = level.spinner(x + 300, y - 1000, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
- balance3 = level.spinner(x + 650, y - 750, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
- balance4 = level.spinner(x + 800, y - 1150, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
- balance5 = level.spinner(x + 1250, y - 1150, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ const density = 0.0015 //+ (simulation.difficultyMode < 5 ? 0.0035 : 0)
+ const angle = Math.PI / 2
+ const variance = 0 //Math.PI
+ const frictionAir = 0.03
+ const angularVelocity = 0 //0.01
+ const spinVariance = 0 //0.02
+ balance1 = level.spinner(x + 200, y - 500, 25, 350, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5)) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
+ balance2 = level.spinner(x + 200, y - 950, 25, 350, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance3 = level.spinner(x + 650, y - 650, 25, 350, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance4 = level.spinner(x + 750, y - 1050, 25, 350, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
+ balance5 = level.spinner(x + 1250, y - 1100, 25, 350, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
let isInRoom = false
doCustom.push(
@@ -1205,10 +1205,10 @@ const level = {
spawn.bodyRect(x + 1025, y + -50, 50, 50);
if (Math.random() > 0.5) {
- const density = 0.0012 + (simulation.difficultyMode < 3 ? 0.002 : 0)
+ const density = 0.0012 //+ (simulation.difficultyMode < 5 ? 0.003 : 0)
const angle = Math.PI / 2
const variance = 0.2 //Math.PI
- const frictionAir = 0.012
+ const frictionAir = 0.015
const height = 35
balance1 = level.spinner(x + 1300, y - 450, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir) // spinner(x, y, width, height, density = 0.001, angle=0,frictionAir=0.001,angularVelocity=0) {
balance3 = level.spinner(x + 750, y - 600, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
@@ -1216,10 +1216,10 @@ const level = {
balance4 = level.spinner(x + 850, y - 1100, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
balance5 = level.spinner(x + 1300, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
} else {
- const density = 0.001 + (simulation.difficultyMode < 3 ? 0.002 : 0)
+ const density = 0.001 //+ (simulation.difficultyMode < 5 ? 0.003 : 0)
const angle = Math.PI / 2
const variance = Math.PI
- const frictionAir = 0
+ const frictionAir = 0.015
const width = 200
const height = 200
const spinVariance = 0.05
diff --git a/js/player.js b/js/player.js
index 1b60bc2..ef23e2e 100644
--- a/js/player.js
+++ b/js/player.js
@@ -1277,11 +1277,7 @@ const m = {
if (m.energy < 0) m.energy = 0;
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
if (tech.blockingIce) {
- if (m.fieldShieldingScale) {
- for (let i = 0; i < fieldBlockCost * 35 * tech.blockingIce; i++) b.iceIX(3, m.angle + Math.random() - 0.5, m.pos)
- } else {
- for (let i = 0; i < tech.blockingIce; i++) b.iceIX(10, m.angle + Math.random() - 0.5, m.pos)
- }
+ for (let i = 0; i < fieldBlockCost * 35 * tech.blockingIce; i++) b.iceIX(3, 2 * Math.PI * Math.random(), m.pos)
}
const unit = Vector.normalise(Vector.sub(player.position, who.position))
if (tech.blockDmg) {
@@ -1309,41 +1305,23 @@ const m = {
if (tech.isStunField) mobs.statusStun(who, tech.isStunField)
// m.holdingTarget = null
//knock backs
- if (m.fieldShieldingScale > 0) {
- const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back
- Matter.Body.setVelocity(who, {
- x: player.velocity.x - (15 * unit.x) / massRoot,
- y: player.velocity.y - (15 * unit.y) / massRoot
- });
- if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
+ const massRoot = Math.sqrt(Math.min(12, Math.max(0.15, who.mass))); // masses above 12 can start to overcome the push back
+ Matter.Body.setVelocity(who, {
+ x: player.velocity.x - (15 * unit.x) / massRoot,
+ y: player.velocity.y - (15 * unit.y) / massRoot
+ });
+ if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
- if (m.crouch) {
- Matter.Body.setVelocity(player, {
- x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
- y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot
- });
- } else {
- Matter.Body.setVelocity(player, {
- x: player.velocity.x + m.blockingRecoil * unit.x * massRoot,
- y: player.velocity.y + m.blockingRecoil * unit.y * massRoot
- });
- }
+ if (m.crouch) {
+ Matter.Body.setVelocity(player, {
+ x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
+ y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * massRoot
+ });
} else {
- // mobs.statusSlow(who, tech.isStunField)
- const massRoot = Math.sqrt(Math.max(0.15, who.mass)); // masses above 12 can start to overcome the push back
- Matter.Body.setVelocity(who, {
- x: player.velocity.x - (20 * unit.x) / massRoot,
- y: player.velocity.y - (20 * unit.y) / massRoot
+ Matter.Body.setVelocity(player, {
+ x: player.velocity.x + m.blockingRecoil * unit.x * massRoot,
+ y: player.velocity.y + m.blockingRecoil * unit.y * massRoot
});
- if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
-
- if (who.isDropPowerUp && player.speed < 12) {
- const massRootCap = Math.sqrt(Math.min(10, Math.max(0.4, who.mass))); // masses above 12 can start to overcome the push back
- Matter.Body.setVelocity(player, {
- x: 0.9 * player.velocity.x + 0.6 * unit.x * massRootCap,
- y: 0.9 * player.velocity.y + 0.6 * unit.y * massRootCap
- });
- }
}
}
},
@@ -1616,7 +1594,10 @@ const m = {
if (m.fieldCDcycle < m.cycle) {
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
if (tech.blockingIce) {
- for (let i = 0; i < tech.blockingIce; i++) b.iceIX(10, m.fieldAngle + Math.random() - 0.5, m.fieldPosition)
+ for (let i = 0; i < tech.blockingIce; i++) {
+ const angle = m.fieldAngle + 1.55 * (Math.random() - 0.5)
+ b.iceIX(10, angle, Vector.add(m.fieldPosition, { x: m.fieldRange * Math.cos(angle), y: m.fieldRange * Math.sin(angle) }))
+ }
}
if (tech.blockDmg) {
mob[i].damage(tech.blockDmg * b.dmgScale)
@@ -2714,7 +2695,7 @@ const m = {
body.splice(i, 1);
m.fieldRange *= 0.8
if (tech.isWormholeEnergy) m.energy += 0.63
- if (tech.isWormSpores) { //pandimensionalspermia
+ if (tech.isWormholeSpores) { //pandimensionalspermia
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
if (tech.isSporeWorm) {
b.worm(Vector.add(m.hole.pos2, Vector.rotate({
@@ -2748,7 +2729,7 @@ const m = {
m.fieldRange *= 0.8
// if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2
if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.63
- if (tech.isWormSpores) { //pandimensionalspermia
+ if (tech.isWormholeSpores) { //pandimensionalspermia
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
if (tech.isSporeWorm) {
b.worm(Vector.add(m.hole.pos1, Vector.rotate({
diff --git a/js/tech.js b/js/tech.js
index 5a86fbf..905ecd3 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -172,7 +172,7 @@
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.5
if (tech.isEnergyNoAmmo) dmg *= 1.6
- if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length
+ if (tech.isDamageForGuns) dmg *= 1 + 0.14 * b.inventory.length
if (tech.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - m.health)
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isEnergyLoss) dmg *= 1.55;
@@ -181,7 +181,7 @@
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.005
if (tech.isRerollDamage) dmg *= 1 + 0.042 * powerUps.research.count
- if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.3
+ if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.23
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
@@ -237,7 +237,7 @@
},
tech: [{
name: "integrated armament",
- description: `increase damage by 30%
your inventory can only hold 1 gun`,
+ description: `increase damage by 23%
your inventory can only hold 1 gun`,
maxCount: 1,
count: 0,
frequency: 2,
@@ -289,7 +289,7 @@
},
{
name: "arsenal",
- description: "increase damage by 13%
for each gun in your inventory",
+ description: "increase damage by 14%
for each gun in your inventory",
maxCount: 1,
count: 0,
frequency: 2,
@@ -307,7 +307,7 @@
},
{
name: "active cooling",
- description: "15% decreased delay after firing
for each gun in your inventory",
+ description: "18% decreased delay after firing
for each gun in your inventory",
maxCount: 1,
count: 0,
frequency: 2,
@@ -330,8 +330,8 @@
description: "spawn 8 guns, but you can't switch guns
guns cycle automatically with each new level",
maxCount: 1,
count: 0,
- frequency: 2,
- frequencyDefault: 2,
+ frequency: 3,
+ frequencyDefault: 3,
allowed() {
return (tech.isDamageForGuns || tech.isFireRateForGuns) && b.inventory.length + 5 < b.guns.length
},
@@ -1597,7 +1597,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -1615,7 +1615,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -1669,7 +1669,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isEnergyHealth
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isEnergyHealth
},
requires: "mass driver, a field that can hold things, not mass-energy",
effect() {
@@ -1687,7 +1687,7 @@
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isBlockExplosion
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name === "pilot wave" && !tech.isBlockExplosion
},
requires: "mass driver, not pilot wave not tokamak",
effect() {
@@ -3539,7 +3539,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isRivets
+ return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isRivets
},
requires: "nail gun, not ice crystal, rivets, or pneumatic actuator",
effect() {
@@ -3597,7 +3597,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("nail gun") && !tech.nailFireRate && !tech.isIceCrystals && !tech.isNeedles
+ return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isNeedles
},
requires: "nail gun, not ice crystal, needles, or pneumatic actuator",
effect() {
@@ -3649,7 +3649,7 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isRivets && !tech.isNeedles && !tech.isNailRadiation && !tech.isNailCrit
+ return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles // && !tech.isNailRadiation && !tech.isNailCrit
},
requires: "nail gun, not powder-actuated, rivets, needles, irradiated, or fission",
effect() {
@@ -3680,7 +3680,7 @@
},
{
name: "pneumatic actuator",
- description: "nail gun takes 45% less time to ramp up
to it's shortest delay after firing",
+ description: "nail gun takes no time to ramp up
to it's shortest delay after firing",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -3690,33 +3690,6 @@
return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles
},
requires: "nail gun, not rivets or needles",
- effect() {
- tech.nailFireRate = true
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "nail gun") b.guns[i].chooseFireMethod()
- }
- },
- remove() {
- if (tech.nailFireRate) {
- tech.nailFireRate = false
- for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
- if (b.guns[i].name === "nail gun") b.guns[i].chooseFireMethod()
- }
- }
- }
- },
- {
- name: "powder-actuated",
- description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed",
- isGunTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals
- },
- requires: "nail gun and pneumatic actuator not ice crystal nucleation",
effect() {
tech.nailInstantFireRate = true
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -3732,6 +3705,33 @@
}
}
},
+ // {
+ // name: "powder-actuated",
+ // description: "nail gun takes no time to ramp up
nails have a 30% faster muzzle speed",
+ // isGunTech: true,
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 2,
+ // frequencyDefault: 2,
+ // allowed() {
+ // return tech.haveGunCheck("nail gun") && tech.nailFireRate && !tech.isIceCrystals
+ // },
+ // requires: "nail gun and pneumatic actuator not ice crystal nucleation",
+ // effect() {
+ // tech.nailInstantFireRate = true
+ // for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
+ // if (b.guns[i].name === "nail gun") b.guns[i].chooseFireMethod()
+ // }
+ // },
+ // remove() {
+ // if (tech.nailInstantFireRate) {
+ // tech.nailInstantFireRate = false
+ // for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
+ // if (b.guns[i].name === "nail gun") b.guns[i].chooseFireMethod()
+ // }
+ // }
+ // }
+ // },
{
name: "supercritical fission",
description: "nails, needles, and rivets can explode
if they strike mobs near their center",
@@ -3741,9 +3741,9 @@
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.isNailShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun")) && !tech.isIceCrystals
+ return (tech.isNailShot || tech.isNeedleShot || tech.nailBotCount > 1 || tech.haveGunCheck("nail gun"))
},
- requires: "nails, not ice crystal nucleation",
+ requires: "nails",
effect() {
tech.isNailCrit = true
},
@@ -3753,14 +3753,14 @@
},
{
name: "irradiated nails",
- description: "nails and rivets are radioactive
about 90% more damage over 2 seconds",
+ description: "nails, needles, and rivets are radioactive
about 90% more damage over 2 seconds",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + tech.isNailShot + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce)) * 2 > 1) && !tech.isIceCrystals
+ return tech.isMineDrop + tech.nailBotCount + tech.fragments + tech.nailsDeathMob / 2 + ((tech.haveGunCheck("mine") && !tech.isLaserMine) + (tech.haveGunCheck("nail gun") && !tech.isNeedleShieldPierce) + tech.isNeedleShot + tech.isNailShot) * 2 > 1
},
requires: "nails, rivets, not ceramic needles, not ice crystals",
effect() {
@@ -3922,6 +3922,25 @@
tech.isNailShot = false;
}
},
+ {
+ name: "needle-shot",
+ description: "shotgun propels 12 mob piercing needles",
+ isGunTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ frequencyDefault: 2,
+ allowed() {
+ return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isFoamShot && !tech.isWormShot && !tech.isIceShot
+ },
+ requires: "shotgun, not incendiary, nail-shot, slug, foam-shot, worm-shot, ice-shot",
+ effect() {
+ tech.isNeedleShot = true;
+ },
+ remove() {
+ tech.isNeedleShot = false;
+ }
+ },
{
name: "worm-shot",
description: "shotgun hatches 3-4 mob seeking worms
worms benefit from spore technology", //
worms seek out nearby mobs
@@ -3979,25 +3998,6 @@
tech.isIceShot = false;
}
},
- {
- name: "needle-shot",
- description: "shotgun propels 12 mob piercing needles",
- isGunTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- frequencyDefault: 2,
- allowed() {
- return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isSlugShot && !tech.isFoamShot && !tech.isWormShot && !tech.isIceShot
- },
- requires: "shotgun, not incendiary, nail-shot, slug, foam-shot, worm-shot, ice-shot",
- effect() {
- tech.isNeedleShot = true;
- },
- remove() {
- tech.isNeedleShot = false;
- }
- },
{
name: "super duper",
description: "fire 1 additional super ball",
@@ -4568,7 +4568,7 @@
frequency: 4,
frequencyDefault: 4,
allowed() {
- return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormSpores
+ return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || tech.isSporeField || tech.isWormholeSpores
},
requires: "spores",
effect() {
@@ -4578,6 +4578,25 @@
tech.isSporeWorm = false
}
},
+ {
+ name: "decomposer",
+ description: "if worms kill their target
they reset their lifespan",
+ isGunTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 3,
+ frequencyDefault: 3,
+ allowed() {
+ return tech.isSporeWorm || tech.isWormShot
+ },
+ requires: "worms",
+ effect() {
+ tech.wormSurviveDmg = true
+ },
+ remove() {
+ tech.wormSurviveDmg = false
+ }
+ },
{
name: "reduced tolerances",
description: "increase drone ammo/efficiency by 66%
reduce the average drone lifetime by 40%",
@@ -4757,7 +4776,7 @@
},
{
name: "uncertainty principle",
- description: "foam bubbles randomly change position
increase foam damage per second by 66%",
+ description: "foam bubbles randomly change position
increase foam damage per second by 60%",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -4795,7 +4814,7 @@
},
{
name: "aerogel",
- description: "foam bubbles float and dissipate 40% faster
increase foam damage per second by 300%",
+ description: "foam bubbles float and dissipate 50% faster
increase foam damage per second by 300%",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -4807,7 +4826,7 @@
requires: "foam",
effect() {
tech.isFastFoam = true
- tech.foamGravity = -0.0002
+ tech.foamGravity = -0.0003
},
remove() {
tech.isFastFoam = false;
@@ -4816,7 +4835,7 @@
},
{
name: "quantum foam",
- description: "foam gun fires 0.30 seconds into the future
increase foam gun damage by 90%",
+ description: "foam gun fires 0.25 seconds into the future
increase foam gun damage by 70%",
isGunTech: true,
maxCount: 9,
count: 0,
@@ -5990,10 +6009,10 @@
},
requires: "wormhole",
effect() {
- tech.isWormSpores = true
+ tech.isWormholeSpores = true
},
remove() {
- tech.isWormSpores = false
+ tech.isWormholeSpores = false
}
},
{
@@ -7660,7 +7679,7 @@
isWormholeDamage: null,
isNailCrit: null,
isFlechetteExplode: null,
- isWormSpores: null,
+ isWormholeSpores: null,
isWormBullets: null,
isWideLaser: null,
wideLaser: null,
@@ -7774,5 +7793,6 @@
isNeedleShot: null,
isBlockRestitution: null,
isZeno: null,
- isFieldFree: null
+ isFieldFree: null,
+ wormSurviveDmg: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 534504f..4f10cac 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,20 +1,28 @@
******************************************************** NEXT PATCH ********************************************************
-"labs" is now in the normal map rotation
-experimental mode is now endless (no gauntlet, finalBoss, ...)
-fixed a bug that was giving experimental mode full life at the start
+decomposers - worms reset their lifespan if they kill their target
-perfect diamagnetism field has a 10% larger radius and arc
-the 1/15 second cooldown after blocking with perfect diamagnetism no longer stops you from blocking
- it still disables field damage effects and player recoil after blocking (for 1/15 of a second)
+nail tech tree reworked a bit
+ removed powder actuated, nail gun ramps up to full fire rate with just pneumatic actuator
+ needles and ice crystal nucleation can get supercritical fission and irradiated nails now
+ supercritical fission crits easier
-mass-energy now works with catabolism by removing max energy to make ammo
-ergodicity - now reduces difficulty by 2 levels and prevent healing from heal power ups (was all healing)
-Noether violation gives even more forward recoil
-blinkBoss has more health, but it's much slower at easy difficulty
+labs exit platforming is a much easier since it's in the general rotation now
+
+bug fixes
******************************************************** TODO ********************************************************
+make
+
+buff nail gun
+
+buff missiles?
+ maybe they can release grenades after they explode, like CPT grenades?
+
+move the bonus tech on intro to the right so players don't have to backtrack as much
+ maybe draw something in the background to explain where the tech is coming from
+
using wormhole makes you immune to harm and drains energy until you run out
disable incoming energy, by saving current energy and just setting energy in the next cycle to be lower then the saved value
@@ -24,11 +32,6 @@ block shattering
get code from planetesimals
https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010
-mob that grows or gets a shield when player is near
- and charges when player is near
- charge triggers an escape mode
- mob wonders and drops eggs that hatch into seekers if no player around
-
scrolling console history in pause menu?
pause should at least show the last in game console message