decomposers
decomposers - worms reset their lifespan if they kill their target 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 labs exit platforming is a much easier since it's in the general rotation now bug fixes
This commit is contained in:
75
js/bullet.js
75
js/bullet.js
@@ -230,7 +230,7 @@ const b = {
|
|||||||
setFireCD() {
|
setFireCD() {
|
||||||
b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage
|
b.fireCDscale = tech.fireRate * tech.slowFire * tech.researchHaste * tech.aimDamage
|
||||||
if (tech.isFastTime) b.fireCDscale *= 0.5
|
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
|
if (tech.isFireMoveLock) b.fireCDscale *= 0.5
|
||||||
},
|
},
|
||||||
fireAttributes(dir, rotate = true) {
|
fireAttributes(dir, rotate = true) {
|
||||||
@@ -1859,7 +1859,11 @@ const b = {
|
|||||||
y: 100 * (Math.random() - 0.5)
|
y: 100 * (Math.random() - 0.5)
|
||||||
},
|
},
|
||||||
beforeDmg(who) {
|
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)
|
if (this.isFreeze) mobs.statusSlow(who, 90)
|
||||||
},
|
},
|
||||||
onEnd() {
|
onEnd() {
|
||||||
@@ -2545,8 +2549,8 @@ const b = {
|
|||||||
inertia: Infinity,
|
inertia: Infinity,
|
||||||
frictionAir: 0.003,
|
frictionAir: 0.003,
|
||||||
dmg: 0, //damage on impact
|
dmg: 0, //damage on impact
|
||||||
damage: (tech.isFastFoam ? 0.044 : 0.011) * (tech.isFoamTeleport ? 1.66 : 1), //damage done over time
|
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.6 : 1),
|
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
@@ -2749,7 +2753,7 @@ const b = {
|
|||||||
bullet[me].dmg = tech.isNailRadiation ? 0 : dmg
|
bullet[me].dmg = tech.isNailRadiation ? 0 : dmg
|
||||||
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
|
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.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
|
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2776,25 +2780,25 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!immune) {
|
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
|
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
|
this.immuneList.push(who.id) //remember that this needle has hit this mob once already
|
||||||
who.foundPlayer();
|
who.foundPlayer();
|
||||||
|
let dmg = b.dmgScale * 6
|
||||||
if (tech.isNailRadiation) {
|
if (tech.isNailRadiation) {
|
||||||
mobs.statusDoT(who, tech.isFastRadiation ? 12 : 3, tech.isSlowRadiation ? 240 : (tech.isFastRadiation ? 30 : 120)) // one tick every 30 cycles
|
mobs.statusDoT(who, tech.isFastRadiation ? 12 : 3, tech.isSlowRadiation ? 240 : (tech.isFastRadiation ? 30 : 120)) // one tick every 30 cycles
|
||||||
} else {
|
dmg *= 0.25
|
||||||
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
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
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) {
|
} else if (tech.isNeedles) {
|
||||||
this.fire = this.fireNeedles
|
this.fire = this.fireNeedles
|
||||||
} else if (tech.nailInstantFireRate) {
|
} else if (tech.nailInstantFireRate) {
|
||||||
this.fire = this.fireNailFireRate
|
this.fire = this.fireInstantFireRate
|
||||||
} else if (tech.nailFireRate) {
|
// } else if (tech.nailFireRate) {
|
||||||
this.fire = this.fireNailFireRate
|
// this.fire = this.fireNailFireRate
|
||||||
} else {
|
} else {
|
||||||
this.fire = this.fireNormal
|
this.fire = this.fireNormal
|
||||||
}
|
}
|
||||||
@@ -3711,7 +3715,7 @@ const b = {
|
|||||||
});
|
});
|
||||||
bullet[me].endCycle = simulation.cycle + 180
|
bullet[me].endCycle = simulation.cycle + 180
|
||||||
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
|
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
|
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
|
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);
|
b.muzzleFlash(30);
|
||||||
},
|
},
|
||||||
fireNailFireRate() {
|
// fireNailFireRate() {
|
||||||
if (this.nextFireCycle + 1 < m.cycle) this.startingHoldCycle = m.cycle //reset if not constantly firing
|
// 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
|
// 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
|
// 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
|
// 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)
|
// this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (m.crouch ? 1.35 : 3.2) / CD)
|
||||||
},
|
// },
|
||||||
fireInstantFireRate() {
|
fireInstantFireRate() {
|
||||||
m.fireCDcycle = m.cycle + Math.floor(2 * b.fireCDscale); // cool down
|
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)
|
this.baseFire(m.angle + (Math.random() - 0.5) * (Math.random() - 0.5) * (m.crouch ? 1.35 : 3.2) / 2)
|
||||||
},
|
},
|
||||||
baseFire(angle) {
|
baseFire(angle) {
|
||||||
const speed = 30 + 6 * Math.random() + 9 * tech.nailInstantFireRate
|
const speed = 30 + 6 * Math.random()
|
||||||
b.nail({
|
b.nail({
|
||||||
x: m.pos.x + 30 * Math.cos(m.angle),
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
y: m.pos.y + 30 * Math.sin(m.angle)
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
@@ -3762,14 +3766,14 @@ const b = {
|
|||||||
if (tech.isIceCrystals) {
|
if (tech.isIceCrystals) {
|
||||||
bullet[bullet.length - 1].beforeDmg = function(who) {
|
bullet[bullet.length - 1].beforeDmg = function(who) {
|
||||||
mobs.statusSlow(who, 60)
|
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
|
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (m.energy < 0.01) {
|
if (m.energy < 0.01) {
|
||||||
m.fireCDcycle = m.cycle + 60; // cool down
|
m.fireCDcycle = m.cycle + 60; // cool down
|
||||||
} else {
|
} else {
|
||||||
m.energy -= m.fieldRegen + 0.01
|
m.energy -= m.fieldRegen + 0.009
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -3778,8 +3782,8 @@ const b = {
|
|||||||
name: "shotgun",
|
name: "shotgun",
|
||||||
description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>",
|
description: "fire a wide <strong>burst</strong> of short range <strong> bullets</strong>",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 4.5,
|
ammoPack: 4.3,
|
||||||
defaultAmmoPack: 4.5,
|
defaultAmmoPack: 4.3,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
@@ -4803,9 +4807,10 @@ const b = {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (!simulation.paused) {
|
if (!simulation.paused) {
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
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 {
|
} else {
|
||||||
b.foam(position, Vector.rotate(velocity, spread), radius)
|
b.foam(position, Vector.rotate(velocity, spread), radius)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ const build = {
|
|||||||
},
|
},
|
||||||
reset() {
|
reset() {
|
||||||
simulation.startGame(true); //starts game, but pauses it
|
simulation.startGame(true); //starts game, but pauses it
|
||||||
build.isExperimentSelection = false;
|
build.isExperimentSelection = true;
|
||||||
simulation.paused = true;
|
simulation.paused = true;
|
||||||
m.setField(0)
|
m.setField(0)
|
||||||
b.inventory = []; //removes guns and ammo
|
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;
|
build.isExperimentSelection = false;
|
||||||
spawn.setSpawnList(); //gives random mobs, not starter mobs
|
spawn.setSpawnList(); //gives random mobs, not starter mobs
|
||||||
spawn.setSpawnList();
|
spawn.setSpawnList();
|
||||||
@@ -573,7 +573,6 @@ function openExperimentMenu() {
|
|||||||
document.body.style.overflowY = "scroll";
|
document.body.style.overflowY = "scroll";
|
||||||
document.body.style.overflowX = "hidden";
|
document.body.style.overflowX = "hidden";
|
||||||
document.getElementById("info").style.display = 'none'
|
document.getElementById("info").style.display = 'none'
|
||||||
build.isExperimentSelection = true
|
|
||||||
build.reset();
|
build.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
30
js/level.js
30
js/level.js
@@ -1148,17 +1148,17 @@ const level = {
|
|||||||
spawn.bodyRect(x + 500, y - 100, 125, 100, 0.25);
|
spawn.bodyRect(x + 500, y - 100, 125, 100, 0.25);
|
||||||
spawn.bodyRect(x + 200, y - 150, 100, 150, 0.25);
|
spawn.bodyRect(x + 200, y - 150, 100, 150, 0.25);
|
||||||
spawn.bodyRect(x + 1075, y - 1075, 100, 125, 0.25);
|
spawn.bodyRect(x + 1075, y - 1075, 100, 125, 0.25);
|
||||||
const density = 0.0015 + (simulation.difficultyMode < 3 ? 0.003 : 0)
|
const density = 0.0015 //+ (simulation.difficultyMode < 5 ? 0.0035 : 0)
|
||||||
const angle = 0
|
const angle = Math.PI / 2
|
||||||
const variance = Math.PI
|
const variance = 0 //Math.PI
|
||||||
const frictionAir = 0
|
const frictionAir = 0.03
|
||||||
const angularVelocity = 0.01
|
const angularVelocity = 0 //0.01
|
||||||
const spinVariance = 0.02
|
const spinVariance = 0 //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) {
|
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 + 300, y - 1000, 25, 410, density, angle + variance * (Math.random() - 0.5), frictionAir, angularVelocity + spinVariance * (Math.random() - 0.5))
|
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 - 750, 25, 410, 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 + 800, y - 1150, 25, 410, 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 - 1150, 25, 410, 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
|
let isInRoom = false
|
||||||
doCustom.push(
|
doCustom.push(
|
||||||
@@ -1205,10 +1205,10 @@ const level = {
|
|||||||
spawn.bodyRect(x + 1025, y + -50, 50, 50);
|
spawn.bodyRect(x + 1025, y + -50, 50, 50);
|
||||||
|
|
||||||
if (Math.random() > 0.5) {
|
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 angle = Math.PI / 2
|
||||||
const variance = 0.2 //Math.PI
|
const variance = 0.2 //Math.PI
|
||||||
const frictionAir = 0.012
|
const frictionAir = 0.015
|
||||||
const height = 35
|
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) {
|
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)
|
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)
|
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)
|
balance5 = level.spinner(x + 1300, y - 1145, height, 410, density, angle + variance * (Math.random() - 0.5), frictionAir)
|
||||||
} else {
|
} 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 angle = Math.PI / 2
|
||||||
const variance = Math.PI
|
const variance = Math.PI
|
||||||
const frictionAir = 0
|
const frictionAir = 0.015
|
||||||
const width = 200
|
const width = 200
|
||||||
const height = 200
|
const height = 200
|
||||||
const spinVariance = 0.05
|
const spinVariance = 0.05
|
||||||
|
|||||||
61
js/player.js
61
js/player.js
@@ -1277,11 +1277,7 @@ const m = {
|
|||||||
if (m.energy < 0) m.energy = 0;
|
if (m.energy < 0) m.energy = 0;
|
||||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
||||||
if (tech.blockingIce) {
|
if (tech.blockingIce) {
|
||||||
if (m.fieldShieldingScale) {
|
for (let i = 0; i < fieldBlockCost * 35 * tech.blockingIce; i++) b.iceIX(3, 2 * Math.PI * Math.random(), m.pos)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const unit = Vector.normalise(Vector.sub(player.position, who.position))
|
const unit = Vector.normalise(Vector.sub(player.position, who.position))
|
||||||
if (tech.blockDmg) {
|
if (tech.blockDmg) {
|
||||||
@@ -1309,41 +1305,23 @@ const m = {
|
|||||||
if (tech.isStunField) mobs.statusStun(who, tech.isStunField)
|
if (tech.isStunField) mobs.statusStun(who, tech.isStunField)
|
||||||
// m.holdingTarget = null
|
// m.holdingTarget = null
|
||||||
//knock backs
|
//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
|
||||||
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, {
|
||||||
Matter.Body.setVelocity(who, {
|
x: player.velocity.x - (15 * unit.x) / massRoot,
|
||||||
x: player.velocity.x - (15 * unit.x) / massRoot,
|
y: player.velocity.y - (15 * unit.y) / massRoot
|
||||||
y: player.velocity.y - (15 * unit.y) / massRoot
|
});
|
||||||
});
|
if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
|
||||||
if (who.isOrbital) Matter.Body.setVelocity(who, { x: 0, y: 0 });
|
|
||||||
|
|
||||||
if (m.crouch) {
|
if (m.crouch) {
|
||||||
Matter.Body.setVelocity(player, {
|
Matter.Body.setVelocity(player, {
|
||||||
x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
|
x: player.velocity.x + 0.1 * m.blockingRecoil * unit.x * massRoot,
|
||||||
y: player.velocity.y + 0.1 * m.blockingRecoil * unit.y * 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
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// mobs.statusSlow(who, tech.isStunField)
|
Matter.Body.setVelocity(player, {
|
||||||
const massRoot = Math.sqrt(Math.max(0.15, who.mass)); // masses above 12 can start to overcome the push back
|
x: player.velocity.x + m.blockingRecoil * unit.x * massRoot,
|
||||||
Matter.Body.setVelocity(who, {
|
y: player.velocity.y + m.blockingRecoil * unit.y * massRoot
|
||||||
x: player.velocity.x - (20 * unit.x) / massRoot,
|
|
||||||
y: player.velocity.y - (20 * 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) {
|
if (m.fieldCDcycle < m.cycle) {
|
||||||
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
m.fieldCDcycle = m.cycle + m.fieldBlockCD;
|
||||||
if (tech.blockingIce) {
|
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) {
|
if (tech.blockDmg) {
|
||||||
mob[i].damage(tech.blockDmg * b.dmgScale)
|
mob[i].damage(tech.blockDmg * b.dmgScale)
|
||||||
@@ -2714,7 +2695,7 @@ const m = {
|
|||||||
body.splice(i, 1);
|
body.splice(i, 1);
|
||||||
m.fieldRange *= 0.8
|
m.fieldRange *= 0.8
|
||||||
if (tech.isWormholeEnergy) m.energy += 0.63
|
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++) {
|
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
|
||||||
if (tech.isSporeWorm) {
|
if (tech.isSporeWorm) {
|
||||||
b.worm(Vector.add(m.hole.pos2, Vector.rotate({
|
b.worm(Vector.add(m.hole.pos2, Vector.rotate({
|
||||||
@@ -2748,7 +2729,7 @@ const m = {
|
|||||||
m.fieldRange *= 0.8
|
m.fieldRange *= 0.8
|
||||||
// if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2
|
// 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.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++) {
|
for (let i = 0, len = Math.ceil(3 * (tech.isSporeWorm ? 0.5 : 1) * Math.random()); i < len; i++) {
|
||||||
if (tech.isSporeWorm) {
|
if (tech.isSporeWorm) {
|
||||||
b.worm(Vector.add(m.hole.pos1, Vector.rotate({
|
b.worm(Vector.add(m.hole.pos1, Vector.rotate({
|
||||||
|
|||||||
168
js/tech.js
168
js/tech.js
@@ -172,7 +172,7 @@
|
|||||||
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
|
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
|
||||||
if (tech.isMaxEnergyTech) dmg *= 1.5
|
if (tech.isMaxEnergyTech) dmg *= 1.5
|
||||||
if (tech.isEnergyNoAmmo) dmg *= 1.6
|
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.isLowHealthDmg) dmg *= 1 + 0.5 * Math.max(0, 1 - m.health)
|
||||||
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
|
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
|
||||||
if (tech.isEnergyLoss) dmg *= 1.55;
|
if (tech.isEnergyLoss) dmg *= 1.55;
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
|
if (tech.isEnergyDamage) dmg *= 1 + m.energy / 9;
|
||||||
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.005
|
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.005
|
||||||
if (tech.isRerollDamage) dmg *= 1 + 0.042 * powerUps.research.count
|
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.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
|
||||||
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
|
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
|
||||||
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
|
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
},
|
},
|
||||||
tech: [{
|
tech: [{
|
||||||
name: "integrated armament",
|
name: "integrated armament",
|
||||||
description: `increase <strong class='color-d'>damage</strong> by <strong>30%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
|
description: `increase <strong class='color-d'>damage</strong> by <strong>23%</strong><br>your inventory can only hold 1 <strong class='color-g'>gun</strong>`,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -289,7 +289,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "arsenal",
|
name: "arsenal",
|
||||||
description: "increase <strong class='color-d'>damage</strong> by <strong>13%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
|
description: "increase <strong class='color-d'>damage</strong> by <strong>14%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -307,7 +307,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "active cooling",
|
name: "active cooling",
|
||||||
description: "<strong>15%</strong> decreased <strong><em>delay</em></strong> after firing<br>for each <strong class='color-g'>gun</strong> in your inventory",
|
description: "<strong>18%</strong> decreased <strong><em>delay</em></strong> after firing<br>for each <strong class='color-g'>gun</strong> in your inventory",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -330,8 +330,8 @@
|
|||||||
description: "spawn <strong>8</strong> <strong class='color-g'>guns</strong>, but you can't <strong>switch</strong> <strong class='color-g'>guns</strong><br><strong class='color-g'>guns</strong> cycle automatically with each new level",
|
description: "spawn <strong>8</strong> <strong class='color-g'>guns</strong>, but you can't <strong>switch</strong> <strong class='color-g'>guns</strong><br><strong class='color-g'>guns</strong> cycle automatically with each new level",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 3,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
allowed() {
|
||||||
return (tech.isDamageForGuns || tech.isFireRateForGuns) && b.inventory.length + 5 < b.guns.length
|
return (tech.isDamageForGuns || tech.isFireRateForGuns) && b.inventory.length + 5 < b.guns.length
|
||||||
},
|
},
|
||||||
@@ -1597,7 +1597,7 @@
|
|||||||
frequency: 3,
|
frequency: 3,
|
||||||
frequencyDefault: 3,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
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",
|
requires: "mass driver, not pilot wave not tokamak",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1615,7 +1615,7 @@
|
|||||||
frequency: 3,
|
frequency: 3,
|
||||||
frequencyDefault: 3,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
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",
|
requires: "mass driver, not pilot wave not tokamak",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1669,7 +1669,7 @@
|
|||||||
frequency: 3,
|
frequency: 3,
|
||||||
frequencyDefault: 3,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
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",
|
requires: "mass driver, a field that can hold things, not mass-energy",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1687,7 +1687,7 @@
|
|||||||
frequency: 3,
|
frequency: 3,
|
||||||
frequencyDefault: 3,
|
frequencyDefault: 3,
|
||||||
allowed() {
|
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",
|
requires: "mass driver, not pilot wave not tokamak",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -3539,7 +3539,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
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",
|
requires: "nail gun, not ice crystal, rivets, or pneumatic actuator",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -3597,7 +3597,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
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",
|
requires: "nail gun, not ice crystal, needles, or pneumatic actuator",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -3649,7 +3649,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
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",
|
requires: "nail gun, not powder-actuated, rivets, needles, irradiated, or fission",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -3680,7 +3680,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "pneumatic actuator",
|
name: "pneumatic actuator",
|
||||||
description: "<strong>nail gun</strong> takes <strong>45%</strong> less time to ramp up<br>to it's shortest <strong><em>delay</em></strong> after firing",
|
description: "<strong>nail gun</strong> takes <strong>no</strong> time to ramp up<br>to it's shortest <strong><em>delay</em></strong> after firing",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -3690,33 +3690,6 @@
|
|||||||
return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles
|
return tech.haveGunCheck("nail gun") && !tech.isRivets && !tech.isNeedles
|
||||||
},
|
},
|
||||||
requires: "nail gun, not rivets or needles",
|
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: "<strong>nail gun</strong> takes <strong>no</strong> time to ramp up<br>nails have a <strong>30%</strong> faster muzzle <strong>speed</strong>",
|
|
||||||
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() {
|
effect() {
|
||||||
tech.nailInstantFireRate = true
|
tech.nailInstantFireRate = true
|
||||||
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
|
||||||
@@ -3732,6 +3705,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// {
|
||||||
|
// name: "powder-actuated",
|
||||||
|
// description: "<strong>nail gun</strong> takes <strong>no</strong> time to ramp up<br>nails have a <strong>30%</strong> faster muzzle <strong>speed</strong>",
|
||||||
|
// 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",
|
name: "supercritical fission",
|
||||||
description: "<strong>nails</strong>, <strong>needles</strong>, and <strong>rivets</strong> can <strong class='color-e'>explode</strong><br>if they strike mobs near their <strong>center</strong>",
|
description: "<strong>nails</strong>, <strong>needles</strong>, and <strong>rivets</strong> can <strong class='color-e'>explode</strong><br>if they strike mobs near their <strong>center</strong>",
|
||||||
@@ -3741,9 +3741,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
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() {
|
effect() {
|
||||||
tech.isNailCrit = true
|
tech.isNailCrit = true
|
||||||
},
|
},
|
||||||
@@ -3753,14 +3753,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "irradiated nails",
|
name: "irradiated nails",
|
||||||
description: "<strong>nails</strong> and <strong>rivets</strong> are <strong class='color-p'>radioactive</strong><br>about <strong>90%</strong> more <strong class='color-d'>damage</strong> over <strong>2</strong> seconds",
|
description: "<strong>nails</strong>, <strong>needles</strong>, and <strong>rivets</strong> are <strong class='color-p'>radioactive</strong><br>about <strong>90%</strong> more <strong class='color-d'>damage</strong> over <strong>2</strong> seconds",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
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",
|
requires: "nails, rivets, not ceramic needles, not ice crystals",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -3922,6 +3922,25 @@
|
|||||||
tech.isNailShot = false;
|
tech.isNailShot = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "needle-shot",
|
||||||
|
description: "<strong>shotgun</strong> propels <strong>12</strong> mob piercing <strong>needles</strong>",
|
||||||
|
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",
|
name: "worm-shot",
|
||||||
description: "<strong>shotgun</strong> hatches <strong>3-4</strong> mob seeking <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br><em>worms benefit from spore technology</em>", //<br><strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong> seek out nearby mobs
|
description: "<strong>shotgun</strong> hatches <strong>3-4</strong> mob seeking <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong><br><em>worms benefit from spore technology</em>", //<br><strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong> seek out nearby mobs
|
||||||
@@ -3979,25 +3998,6 @@
|
|||||||
tech.isIceShot = false;
|
tech.isIceShot = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "needle-shot",
|
|
||||||
description: "<strong>shotgun</strong> propels <strong>12</strong> mob piercing <strong>needles</strong>",
|
|
||||||
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",
|
name: "super duper",
|
||||||
description: "fire <strong>1</strong> additional <strong>super ball</strong>",
|
description: "fire <strong>1</strong> additional <strong>super ball</strong>",
|
||||||
@@ -4568,7 +4568,7 @@
|
|||||||
frequency: 4,
|
frequency: 4,
|
||||||
frequencyDefault: 4,
|
frequencyDefault: 4,
|
||||||
allowed() {
|
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",
|
requires: "spores",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -4578,6 +4578,25 @@
|
|||||||
tech.isSporeWorm = false
|
tech.isSporeWorm = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "decomposer",
|
||||||
|
description: "if <strong class='color-p' style='letter-spacing: -0.8px;'>worms</strong> <strong>kill</strong> their target<br>they reset their <strong>lifespan</strong>",
|
||||||
|
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",
|
name: "reduced tolerances",
|
||||||
description: "increase <strong>drone</strong> <strong class='color-g'>ammo</strong>/<strong class='color-f'>efficiency</strong> by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>",
|
description: "increase <strong>drone</strong> <strong class='color-g'>ammo</strong>/<strong class='color-f'>efficiency</strong> by <strong>66%</strong><br>reduce the average <strong>drone</strong> lifetime by <strong>40%</strong>",
|
||||||
@@ -4757,7 +4776,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "uncertainty principle",
|
name: "uncertainty principle",
|
||||||
description: "<strong>foam</strong> bubbles randomly change <strong>position</strong><br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>66%</strong>",
|
description: "<strong>foam</strong> bubbles randomly change <strong>position</strong><br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>60%</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4795,7 +4814,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "aerogel",
|
name: "aerogel",
|
||||||
description: "<strong>foam</strong> bubbles <strong>float</strong> and dissipate <strong>40%</strong> faster<br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>300%</strong>",
|
description: "<strong>foam</strong> bubbles <strong>float</strong> and dissipate <strong>50%</strong> faster<br>increase <strong>foam</strong> <strong class='color-d'>damage</strong> per second by <strong>300%</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4807,7 +4826,7 @@
|
|||||||
requires: "foam",
|
requires: "foam",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFastFoam = true
|
tech.isFastFoam = true
|
||||||
tech.foamGravity = -0.0002
|
tech.foamGravity = -0.0003
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isFastFoam = false;
|
tech.isFastFoam = false;
|
||||||
@@ -4816,7 +4835,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "quantum foam",
|
name: "quantum foam",
|
||||||
description: "<strong>foam</strong> gun fires <strong>0.30</strong> seconds into the <strong>future</strong><br>increase <strong>foam</strong> gun <strong class='color-d'>damage</strong> by <strong>90%</strong>",
|
description: "<strong>foam</strong> gun fires <strong>0.25</strong> seconds into the <strong>future</strong><br>increase <strong>foam</strong> gun <strong class='color-d'>damage</strong> by <strong>70%</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 9,
|
maxCount: 9,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -5990,10 +6009,10 @@
|
|||||||
},
|
},
|
||||||
requires: "wormhole",
|
requires: "wormhole",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isWormSpores = true
|
tech.isWormholeSpores = true
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isWormSpores = false
|
tech.isWormholeSpores = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -7660,7 +7679,7 @@
|
|||||||
isWormholeDamage: null,
|
isWormholeDamage: null,
|
||||||
isNailCrit: null,
|
isNailCrit: null,
|
||||||
isFlechetteExplode: null,
|
isFlechetteExplode: null,
|
||||||
isWormSpores: null,
|
isWormholeSpores: null,
|
||||||
isWormBullets: null,
|
isWormBullets: null,
|
||||||
isWideLaser: null,
|
isWideLaser: null,
|
||||||
wideLaser: null,
|
wideLaser: null,
|
||||||
@@ -7774,5 +7793,6 @@
|
|||||||
isNeedleShot: null,
|
isNeedleShot: null,
|
||||||
isBlockRestitution: null,
|
isBlockRestitution: null,
|
||||||
isZeno: null,
|
isZeno: null,
|
||||||
isFieldFree: null
|
isFieldFree: null,
|
||||||
|
wormSurviveDmg: null
|
||||||
}
|
}
|
||||||
33
todo.txt
33
todo.txt
@@ -1,20 +1,28 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH ********************************************************
|
||||||
|
|
||||||
"labs" is now in the normal map rotation
|
decomposers - worms reset their lifespan if they kill their target
|
||||||
experimental mode is now endless (no gauntlet, finalBoss, ...)
|
|
||||||
fixed a bug that was giving experimental mode full life at the start
|
|
||||||
|
|
||||||
perfect diamagnetism field has a 10% larger radius and arc
|
nail tech tree reworked a bit
|
||||||
the 1/15 second cooldown after blocking with perfect diamagnetism no longer stops you from blocking
|
removed powder actuated, nail gun ramps up to full fire rate with just pneumatic actuator
|
||||||
it still disables field damage effects and player recoil after blocking (for 1/15 of a second)
|
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
|
labs exit platforming is a much easier since it's in the general rotation now
|
||||||
ergodicity - now reduces difficulty by 2 levels and prevent healing from heal power ups (was all healing)
|
|
||||||
Noether violation gives even more forward recoil
|
bug fixes
|
||||||
blinkBoss has more health, but it's much slower at easy difficulty
|
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** 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
|
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
|
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
|
get code from planetesimals
|
||||||
https://codepen.io/lilgreenland/pen/jrMvaB?editors=0010
|
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?
|
scrolling console history in pause menu?
|
||||||
pause should at least show the last in game console message
|
pause should at least show the last in game console message
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user