blast mines
tech: blast mines - mines stun when they activate laser mines only fire if crouching (so you can fire normal mines when energy is low) mines now includes the radius of the mob when calculating mobs in range so it will detonate from the final boss from farther away mines have a small random chance to detonate from targets up to 40% father away time dilation field drains less energy for the first few seconds, but linearly ramps up energy drain as you stay frozen in time unfreezing time returns you the normal drain rate in half the time to ramp up this should be a buff for all situations, except someone who has a huge external source of energy 360 wave beam has reduced mob slow effect
This commit is contained in:
201
js/bullet.js
201
js/bullet.js
@@ -717,7 +717,7 @@ const b = {
|
|||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
||||||
Matter.Body.setDensity(bullet[me], 0.0005);
|
Matter.Body.setDensity(bullet[me], 0.0005);
|
||||||
bullet[me].explodeRad = 275;
|
bullet[me].explodeRad = 300;
|
||||||
bullet[me].onEnd = function() {
|
bullet[me].onEnd = function() {
|
||||||
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
||||||
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
||||||
@@ -742,7 +742,7 @@ const b = {
|
|||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
||||||
Matter.Body.setDensity(bullet[me], 0.0005);
|
Matter.Body.setDensity(bullet[me], 0.0005);
|
||||||
bullet[me].explodeRad = 300;
|
bullet[me].explodeRad = 305;
|
||||||
bullet[me].onEnd = function() {
|
bullet[me].onEnd = function() {
|
||||||
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
||||||
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
||||||
@@ -777,7 +777,7 @@ const b = {
|
|||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
bullet[me] = Bodies.circle(where.x, where.y, 15, b.fireAttributes(angle, false));
|
||||||
Matter.Body.setDensity(bullet[me], 0.0005);
|
Matter.Body.setDensity(bullet[me], 0.0005);
|
||||||
bullet[me].explodeRad = 333 + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
|
bullet[me].explodeRad = 350 + Math.floor(Math.random() * 50) + tech.isBlockExplode * 110
|
||||||
bullet[me].onEnd = function() {
|
bullet[me].onEnd = function() {
|
||||||
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
||||||
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 4)
|
||||||
@@ -853,7 +853,7 @@ const b = {
|
|||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.circle(where.x, where.y, 20, b.fireAttributes(angle, false));
|
bullet[me] = Bodies.circle(where.x, where.y, 20, b.fireAttributes(angle, false));
|
||||||
Matter.Body.setDensity(bullet[me], 0.0003);
|
Matter.Body.setDensity(bullet[me], 0.0003);
|
||||||
bullet[me].explodeRad = 333 + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
|
bullet[me].explodeRad = 350 + Math.floor(Math.random() * 50) + tech.isBlockExplode * 100
|
||||||
bullet[me].onEnd = function() {
|
bullet[me].onEnd = function() {
|
||||||
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
b.explosion(this.position, this.explodeRad); //makes bullet do explosive damage at end
|
||||||
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 6)
|
if (tech.fragments) b.targetedNail(this.position, tech.fragments * 6)
|
||||||
@@ -1044,7 +1044,7 @@ const b = {
|
|||||||
//aoe damage to mobs
|
//aoe damage to mobs
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius + mob[i].radius) {
|
if (Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.damageRadius + mob[i].radius) {
|
||||||
let dmg = b.dmgScale * 0.09
|
let dmg = b.dmgScale * 0.1
|
||||||
if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way
|
if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way
|
||||||
if (mob[i].shield) dmg *= 3 //to make up for the /5 that shields normally take
|
if (mob[i].shield) dmg *= 3 //to make up for the /5 that shields normally take
|
||||||
mob[i].damage(dmg);
|
mob[i].damage(dmg);
|
||||||
@@ -1587,6 +1587,20 @@ const b = {
|
|||||||
ctx.globalAlpha = 1;
|
ctx.globalAlpha = 1;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
AoEStunEffect(where, range, cycles = 100 + 80 * Math.random()) {
|
||||||
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
|
if (mob[i].alive && !mob[i].isShielded && !mob[i].shield && !mob[i].isBadTarget) {
|
||||||
|
if (Vector.magnitude(Vector.sub(where, mob[i].position)) - mob[i].radius < range) mobs.statusStun(mob[i], cycles)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
simulation.drawList.push({
|
||||||
|
x: where.x,
|
||||||
|
y: where.y,
|
||||||
|
radius: range,
|
||||||
|
color: "rgba(0,0,0,0.1)",
|
||||||
|
time: 15
|
||||||
|
});
|
||||||
|
},
|
||||||
laserMine(position, velocity = { x: 0, y: -8 }) {
|
laserMine(position, velocity = { x: 0, y: -8 }) {
|
||||||
const me = bullet.length;
|
const me = bullet.length;
|
||||||
bullet[me] = Bodies.polygon(position.x, position.y, 3, 25, {
|
bullet[me] = Bodies.polygon(position.x, position.y, 3, 25, {
|
||||||
@@ -1624,15 +1638,17 @@ const b = {
|
|||||||
if (!(simulation.cycle % this.lookFrequency) && m.energy > this.drain) { //find mob targets
|
if (!(simulation.cycle % this.lookFrequency) && m.energy > this.drain) { //find mob targets
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (
|
if (
|
||||||
Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 2000000 &&
|
Vector.magnitude(Vector.sub(this.position, mob[i].position)) < 1300 &&
|
||||||
!mob[i].isBadTarget &&
|
!mob[i].isBadTarget &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
) {
|
) {
|
||||||
|
b.AoEStunEffect(this.position, 1300);
|
||||||
this.do = this.laserSpin
|
this.do = this.laserSpin
|
||||||
this.endCycle = simulation.cycle + 360
|
this.endCycle = simulation.cycle + 360
|
||||||
// if (this.angularSpeed < 0.01) this.torque += this.inertia * this.torqueMagnitude * 5 //spin
|
// if (this.angularSpeed < 0.01) this.torque += this.inertia * this.torqueMagnitude * 5 //spin
|
||||||
this.isArmed = true
|
this.isArmed = true
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1708,11 +1724,7 @@ const b = {
|
|||||||
});
|
});
|
||||||
Matter.Body.setAngularVelocity(this, 0)
|
Matter.Body.setAngularVelocity(this, 0)
|
||||||
}
|
}
|
||||||
if (tech.isMineSentry) {
|
this.arm();
|
||||||
this.sentry();
|
|
||||||
} else {
|
|
||||||
this.arm();
|
|
||||||
}
|
|
||||||
|
|
||||||
//sometimes the mine can't attach to map and it just needs to be reset
|
//sometimes the mine can't attach to map and it just needs to be reset
|
||||||
const that = this
|
const that = this
|
||||||
@@ -1736,41 +1748,47 @@ const b = {
|
|||||||
this.stillCount++
|
this.stillCount++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.stillCount > 25) {
|
if (this.stillCount > 25) this.arm();
|
||||||
if (tech.isMineSentry) {
|
|
||||||
this.sentry();
|
|
||||||
} else {
|
|
||||||
this.arm();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sentry() {
|
|
||||||
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
|
||||||
this.lookFrequency = simulation.cycle + 60
|
|
||||||
this.endCycle = simulation.cycle + 1620
|
|
||||||
this.do = function() { //overwrite the do method for this bullet
|
|
||||||
this.force.y += this.mass * 0.002; //extra gravity
|
|
||||||
if (simulation.cycle > this.lookFrequency) {
|
|
||||||
this.lookFrequency = 8 + Math.floor(3 * Math.random())
|
|
||||||
this.do = function() { //overwrite the do method for this bullet
|
|
||||||
this.force.y += this.mass * 0.002; //extra gravity
|
|
||||||
if (!(simulation.cycle % this.lookFrequency) && !m.isBodiesAsleep) { //find mob targets
|
|
||||||
this.endCycle -= 8
|
|
||||||
b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false, 2) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
|
|
||||||
if (!(simulation.cycle % (this.lookFrequency * 6))) {
|
|
||||||
simulation.drawList.push({
|
|
||||||
x: this.position.x,
|
|
||||||
y: this.position.y,
|
|
||||||
radius: 8,
|
|
||||||
color: "#fe0",
|
|
||||||
time: 4
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
// sentry() {
|
||||||
|
// this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
||||||
|
// this.lookFrequency = simulation.cycle + 60
|
||||||
|
// this.do = function() { //overwrite the do method for this bullet
|
||||||
|
// this.force.y += this.mass * 0.002; //extra gravity
|
||||||
|
// if (simulation.cycle > this.lookFrequency) {
|
||||||
|
// const random = 300 * Math.random
|
||||||
|
// for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
|
// if (
|
||||||
|
// !mob[i].isBadTarget &&
|
||||||
|
// Vector.magnitude(Vector.sub(this.position, mob[i].position)) < 700 + mob[i].radius + random &&
|
||||||
|
// Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
|
// Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
|
// ) {
|
||||||
|
|
||||||
|
// this.lookFrequency = 8 + Math.floor(3 * Math.random())
|
||||||
|
// this.endCycle = simulation.cycle + 900
|
||||||
|
// this.do = function() { //overwrite the do method for this bullet
|
||||||
|
// this.force.y += this.mass * 0.002; //extra gravity
|
||||||
|
// if (!(simulation.cycle % this.lookFrequency) && !m.isBodiesAsleep) { //find mob targets
|
||||||
|
// // this.endCycle -= 8
|
||||||
|
// b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false, 2) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
|
||||||
|
// if (!(simulation.cycle % (this.lookFrequency * 6))) {
|
||||||
|
// simulation.drawList.push({
|
||||||
|
// x: this.position.x,
|
||||||
|
// y: this.position.y,
|
||||||
|
// radius: 8,
|
||||||
|
// color: "#fe0",
|
||||||
|
// time: 4
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// },
|
||||||
arm() {
|
arm() {
|
||||||
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
|
||||||
this.lookFrequency = simulation.cycle + 60
|
this.lookFrequency = simulation.cycle + 60
|
||||||
@@ -1789,13 +1807,41 @@ const b = {
|
|||||||
this.do = function() { //overwrite the do method for this bullet
|
this.do = function() { //overwrite the do method for this bullet
|
||||||
this.force.y += this.mass * 0.002; //extra gravity
|
this.force.y += this.mass * 0.002; //extra gravity
|
||||||
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
|
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
|
||||||
|
const random = 300 * Math.random()
|
||||||
for (let i = 0, len = mob.length; i < len; ++i) {
|
for (let i = 0, len = mob.length; i < len; ++i) {
|
||||||
if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 &&
|
if (
|
||||||
!mob[i].isBadTarget &&
|
!mob[i].isBadTarget &&
|
||||||
|
Vector.magnitude(Vector.sub(this.position, mob[i].position)) < 700 + mob[i].radius + random &&
|
||||||
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
|
||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0
|
||||||
this.endCycle = 0 //end life if mob is near and visible
|
) {
|
||||||
if (Math.random() < 0.8) isAmmoBack = false; //20% chance to get ammo back after detonation
|
b.AoEStunEffect(this.position, 700 + mob[i].radius + random);
|
||||||
|
if (tech.isMineSentry) {
|
||||||
|
this.lookFrequency = 8 + Math.floor(3 * Math.random())
|
||||||
|
this.endCycle = simulation.cycle + 900
|
||||||
|
this.do = function() { //overwrite the do method for this bullet
|
||||||
|
this.force.y += this.mass * 0.002; //extra gravity
|
||||||
|
if (!(simulation.cycle % this.lookFrequency) && !m.isBodiesAsleep) { //find mob targets
|
||||||
|
b.targetedNail(this.position, 1, 45 + 5 * Math.random(), 1100, false, 2) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
|
||||||
|
if (!(simulation.cycle % (this.lookFrequency * 6))) {
|
||||||
|
simulation.drawList.push({
|
||||||
|
x: this.position.x,
|
||||||
|
y: this.position.y,
|
||||||
|
radius: 8,
|
||||||
|
color: "#fe0",
|
||||||
|
time: 4
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
this.endCycle = 0 //end life if mob is near and visible
|
||||||
|
if (Math.random() < 0.8) isAmmoBack = false; //20% chance to get ammo back after detonation
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1805,8 +1851,7 @@ const b = {
|
|||||||
},
|
},
|
||||||
onEnd() {
|
onEnd() {
|
||||||
if (this.isArmed) {
|
if (this.isArmed) {
|
||||||
b.targetedNail(this.position, 22, 40 + 10 * Math.random(), 1200, true, 1.9) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
|
b.targetedNail(this.position, tech.isMineSentry ? 7 : 22, 40 + 10 * Math.random(), 1200, true, 1.9) //targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4) {
|
||||||
|
|
||||||
}
|
}
|
||||||
if (tech.isMineAmmoBack && (!this.isArmed || Math.random() < 0.2)) { //get ammo back from tech.isMineAmmoBack
|
if (tech.isMineAmmoBack && (!this.isArmed || Math.random() < 0.2)) { //get ammo back from tech.isMineAmmoBack
|
||||||
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
|
||||||
@@ -2382,7 +2427,7 @@ const b = {
|
|||||||
this.radioRadius = this.radioRadius * 0.993 + 0.007 * this.maxRadioRadius //smooth radius towards max
|
this.radioRadius = this.radioRadius * 0.993 + 0.007 * this.maxRadioRadius //smooth radius towards max
|
||||||
//aoe damage to player
|
//aoe damage to player
|
||||||
if (Vector.magnitude(Vector.sub(player.position, this.position)) < this.radioRadius) {
|
if (Vector.magnitude(Vector.sub(player.position, this.position)) < this.radioRadius) {
|
||||||
const DRAIN = tech.isRadioactiveResistance ? 0.0023 * 0.25 : 0.0023
|
const DRAIN = tech.isRadioactiveResistance ? 0.002 * 0.25 : 0.002
|
||||||
if (m.energy > DRAIN) {
|
if (m.energy > DRAIN) {
|
||||||
if (m.immuneCycle < m.cycle) m.energy -= DRAIN
|
if (m.immuneCycle < m.cycle) m.energy -= DRAIN
|
||||||
} else {
|
} else {
|
||||||
@@ -2724,7 +2769,12 @@ const b = {
|
|||||||
const targets = [] //target nearby mobs
|
const targets = [] //target nearby mobs
|
||||||
for (let i = 0, len = mob.length; i < len; i++) {
|
for (let i = 0, len = mob.length; i < len; i++) {
|
||||||
const dist = Vector.magnitude(Vector.sub(position, mob[i].position));
|
const dist = Vector.magnitude(Vector.sub(position, mob[i].position));
|
||||||
if (dist < range && Matter.Query.ray(map, position, mob[i].position).length === 0 && Matter.Query.ray(body, position, mob[i].position).length === 0) {
|
if (
|
||||||
|
dist < range + mob[i].radius &&
|
||||||
|
(!mob[i].isBadTarget) && //|| mob[i].isMobBullet
|
||||||
|
Matter.Query.ray(map, position, mob[i].position).length === 0 &&
|
||||||
|
Matter.Query.ray(body, position, mob[i].position).length === 0
|
||||||
|
) {
|
||||||
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
|
targets.push(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, dist / 60))) //predict where the mob will be in a few cycles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3830,11 +3880,11 @@ const b = {
|
|||||||
let knock, spread
|
let knock, spread
|
||||||
if (m.crouch) {
|
if (m.crouch) {
|
||||||
spread = 0.65
|
spread = 0.65
|
||||||
m.fireCDcycle = m.cycle + Math.floor(55 * b.fireCDscale) // cool down
|
m.fireCDcycle = m.cycle + Math.floor(60 * b.fireCDscale) // cool down
|
||||||
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(58 * b.fireCDscale)) m.immuneCycle = m.cycle + Math.floor(58 * b.fireCDscale); //player is immune to damage for 30 cycles
|
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(60 * b.fireCDscale)) m.immuneCycle = m.cycle + Math.floor(60 * b.fireCDscale); //player is immune to damage for 30 cycles
|
||||||
knock = 0.01
|
knock = 0.01
|
||||||
} else {
|
} else {
|
||||||
m.fireCDcycle = m.cycle + Math.floor(45 * b.fireCDscale) // cool down
|
m.fireCDcycle = m.cycle + Math.floor(47 * b.fireCDscale) // cool down
|
||||||
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(47 * b.fireCDscale)) m.immuneCycle = m.cycle + Math.floor(47 * b.fireCDscale); //player is immune to damage for 30 cycles
|
if (tech.isShotgunImmune && m.immuneCycle < m.cycle + Math.floor(47 * b.fireCDscale)) m.immuneCycle = m.cycle + Math.floor(47 * b.fireCDscale); //player is immune to damage for 30 cycles
|
||||||
spread = 1.3
|
spread = 1.3
|
||||||
knock = 0.1
|
knock = 0.1
|
||||||
@@ -4198,8 +4248,8 @@ const b = {
|
|||||||
}
|
}
|
||||||
if (!mob[j].isShielded) {
|
if (!mob[j].isShielded) {
|
||||||
Matter.Body.setVelocity(mob[j], { //friction
|
Matter.Body.setVelocity(mob[j], { //friction
|
||||||
x: mob[j].velocity.x * 0.93,
|
x: mob[j].velocity.x * 0.95,
|
||||||
y: mob[j].velocity.y * 0.93
|
y: mob[j].velocity.y * 0.95
|
||||||
});
|
});
|
||||||
//draw vibes
|
//draw vibes
|
||||||
let vertices = mob[j].vertices;
|
let vertices = mob[j].vertices;
|
||||||
@@ -4585,20 +4635,37 @@ const b = {
|
|||||||
name: "mine",
|
name: "mine",
|
||||||
description: "toss a <strong>proximity</strong> mine that <strong>sticks</strong> to walls<br>fires <strong>nails</strong> at mobs within range",
|
description: "toss a <strong>proximity</strong> mine that <strong>sticks</strong> to walls<br>fires <strong>nails</strong> at mobs within range",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 1.5,
|
ammoPack: 1.4,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
if (tech.isLaserMine) { //laser mine
|
|
||||||
const speed = m.crouch ? 50 : 20
|
if (m.crouch) {
|
||||||
const velocity = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
if (tech.isLaserMine) {
|
||||||
b.laserMine(m.pos, velocity)
|
const speed = 40
|
||||||
} else { //normal mines
|
const velocity = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
||||||
|
b.laserMine(m.pos, velocity)
|
||||||
|
} else {
|
||||||
|
const pos = {
|
||||||
|
x: m.pos.x + 30 * Math.cos(m.angle),
|
||||||
|
y: m.pos.y + 30 * Math.sin(m.angle)
|
||||||
|
}
|
||||||
|
let speed = 36
|
||||||
|
if (Matter.Query.point(map, pos).length > 0) { //don't fire if mine will spawn inside map
|
||||||
|
speed = -2
|
||||||
|
}
|
||||||
|
b.mine(pos, {
|
||||||
|
x: speed * Math.cos(m.angle),
|
||||||
|
y: speed * Math.sin(m.angle)
|
||||||
|
}, 0, tech.isMineAmmoBack)
|
||||||
|
}
|
||||||
|
m.fireCDcycle = m.cycle + Math.floor(50 * b.fireCDscale); // cool down
|
||||||
|
} else {
|
||||||
const pos = {
|
const pos = {
|
||||||
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)
|
||||||
}
|
}
|
||||||
let speed = m.crouch ? 36 : 22
|
let speed = 23
|
||||||
if (Matter.Query.point(map, pos).length > 0) { //don't fire if mine will spawn inside map
|
if (Matter.Query.point(map, pos).length > 0) { //don't fire if mine will spawn inside map
|
||||||
speed = -2
|
speed = -2
|
||||||
}
|
}
|
||||||
@@ -4606,8 +4673,8 @@ const b = {
|
|||||||
x: speed * Math.cos(m.angle),
|
x: speed * Math.cos(m.angle),
|
||||||
y: speed * Math.sin(m.angle)
|
y: speed * Math.sin(m.angle)
|
||||||
}, 0, tech.isMineAmmoBack)
|
}, 0, tech.isMineAmmoBack)
|
||||||
|
m.fireCDcycle = m.cycle + Math.floor(25 * b.fireCDscale); // cool down
|
||||||
}
|
}
|
||||||
m.fireCDcycle = m.cycle + Math.floor((m.crouch ? 50 : 25) * b.fireCDscale); // cool down
|
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
name: "spores",
|
name: "spores",
|
||||||
@@ -4838,7 +4905,7 @@ const b = {
|
|||||||
name: "rail gun",
|
name: "rail gun",
|
||||||
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
|
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
|
||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 4.1,
|
ammoPack: 3.5,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {},
|
||||||
fire() {
|
fire() {
|
||||||
|
|||||||
14
js/level.js
14
js/level.js
@@ -15,9 +15,9 @@ const level = {
|
|||||||
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(30) //30 is near max on hard //60 is near max on why
|
||||||
// simulation.isHorizontalFlipped = true
|
// simulation.isHorizontalFlipped = true
|
||||||
// tech.isFieldFree = true
|
// tech.isFieldFree = true
|
||||||
// m.setField("perfect diamagnetism")
|
// m.setField("time dilation")
|
||||||
// b.giveGuns("drones")
|
// b.giveGuns("mine")
|
||||||
// tech.giveTech("Meissner effect")
|
// tech.giveTech("laser-mines")
|
||||||
// b.giveGuns("nail gun")
|
// b.giveGuns("nail gun")
|
||||||
// tech.giveTech("Lenz's law")
|
// tech.giveTech("Lenz's law")
|
||||||
// for (let i = 0; i < 9; i++) tech.giveTech("MIRV")
|
// for (let i = 0; i < 9; i++) tech.giveTech("MIRV")
|
||||||
@@ -113,24 +113,24 @@ const level = {
|
|||||||
difficultyIncrease(num = 1) {
|
difficultyIncrease(num = 1) {
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
simulation.difficulty++
|
simulation.difficulty++
|
||||||
b.dmgScale *= 0.915; //damage done by player decreases each level
|
b.dmgScale *= 0.914; //damage done by player decreases each level
|
||||||
if (simulation.accelScale < 5) simulation.accelScale *= 1.02 //mob acceleration increases each level
|
if (simulation.accelScale < 5) simulation.accelScale *= 1.02 //mob acceleration increases each level
|
||||||
if (simulation.lookFreqScale > 0.2) simulation.lookFreqScale *= 0.98 //mob cycles between looks decreases each level
|
if (simulation.lookFreqScale > 0.2) simulation.lookFreqScale *= 0.98 //mob cycles between looks decreases each level
|
||||||
if (simulation.CDScale > 0.2) simulation.CDScale *= 0.97 //mob CD time decreases each level
|
if (simulation.CDScale > 0.2) simulation.CDScale *= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
simulation.dmgScale = 0.39 * simulation.difficulty //damage done by mobs increases each level
|
simulation.dmgScale = 0.4 * simulation.difficulty //damage done by mobs increases each level
|
||||||
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
|
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055) //a higher denominator makes for lower heals // m.health += heal * simulation.healScale;
|
||||||
},
|
},
|
||||||
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
|
difficultyDecrease(num = 1) { //used in easy mode for simulation.reset()
|
||||||
for (let i = 0; i < num; i++) {
|
for (let i = 0; i < num; i++) {
|
||||||
simulation.difficulty--
|
simulation.difficulty--
|
||||||
b.dmgScale /= 0.915; //damage done by player decreases each level
|
b.dmgScale /= 0.914; //damage done by player decreases each level
|
||||||
if (simulation.accelScale > 0.2) simulation.accelScale /= 1.02 //mob acceleration increases each level
|
if (simulation.accelScale > 0.2) simulation.accelScale /= 1.02 //mob acceleration increases each level
|
||||||
if (simulation.lookFreqScale < 5) simulation.lookFreqScale /= 0.98 //mob cycles between looks decreases each level
|
if (simulation.lookFreqScale < 5) simulation.lookFreqScale /= 0.98 //mob cycles between looks decreases each level
|
||||||
if (simulation.CDScale < 5) simulation.CDScale /= 0.97 //mob CD time decreases each level
|
if (simulation.CDScale < 5) simulation.CDScale /= 0.97 //mob CD time decreases each level
|
||||||
}
|
}
|
||||||
if (simulation.difficulty < 1) simulation.difficulty = 0;
|
if (simulation.difficulty < 1) simulation.difficulty = 0;
|
||||||
simulation.dmgScale = 0.39 * simulation.difficulty //damage done by mobs increases each level
|
simulation.dmgScale = 0.4 * simulation.difficulty //damage done by mobs increases each level
|
||||||
if (simulation.dmgScale < 0.1) simulation.dmgScale = 0.1;
|
if (simulation.dmgScale < 0.1) simulation.dmgScale = 0.1;
|
||||||
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055)
|
simulation.healScale = 1 / (1 + simulation.difficulty * 0.055)
|
||||||
},
|
},
|
||||||
|
|||||||
43
js/player.js
43
js/player.js
@@ -490,7 +490,7 @@ const m = {
|
|||||||
harmReduction() {
|
harmReduction() {
|
||||||
let dmg = 1
|
let dmg = 1
|
||||||
dmg *= m.fieldHarmReduction
|
dmg *= m.fieldHarmReduction
|
||||||
if (tech.isZeno) dmg *= 0.16
|
if (tech.isZeno) dmg *= 0.17
|
||||||
if (tech.isFieldHarmReduction) dmg *= 0.5
|
if (tech.isFieldHarmReduction) dmg *= 0.5
|
||||||
if (tech.isHarmMACHO) dmg *= 0.33
|
if (tech.isHarmMACHO) dmg *= 0.33
|
||||||
if (tech.isImmortal) dmg *= 0.66
|
if (tech.isImmortal) dmg *= 0.66
|
||||||
@@ -1949,7 +1949,7 @@ const m = {
|
|||||||
m.energy -= 0.04;
|
m.energy -= 0.04;
|
||||||
b.iceIX(1)
|
b.iceIX(1)
|
||||||
} else if (tech.isDroneRadioactive) {
|
} else if (tech.isDroneRadioactive) {
|
||||||
m.energy -= 0.85;
|
m.energy -= 0.8;
|
||||||
b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25)
|
b.droneRadioactive({ x: m.pos.x + 30 * Math.cos(m.angle) + 10 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 10 * (Math.random() - 0.5) }, 25)
|
||||||
} else {
|
} else {
|
||||||
m.energy -= 0.45 * tech.droneEnergyReduction;
|
m.energy -= 0.45 * tech.droneEnergyReduction;
|
||||||
@@ -2038,6 +2038,7 @@ const m = {
|
|||||||
// m.fieldMeterColor = "#000"
|
// m.fieldMeterColor = "#000"
|
||||||
m.fieldFire = true;
|
m.fieldFire = true;
|
||||||
m.isBodiesAsleep = false;
|
m.isBodiesAsleep = false;
|
||||||
|
m.drain = 0.0005
|
||||||
m.hold = function() {
|
m.hold = function() {
|
||||||
if (m.isHolding) {
|
if (m.isHolding) {
|
||||||
m.wakeCheck();
|
m.wakeCheck();
|
||||||
@@ -2048,10 +2049,10 @@ const m = {
|
|||||||
m.grabPowerUp();
|
m.grabPowerUp();
|
||||||
m.lookForPickUp(180);
|
m.lookForPickUp(180);
|
||||||
|
|
||||||
const DRAIN = 0.0013
|
m.drain += 0.0000025
|
||||||
if (m.energy > DRAIN) {
|
if (m.energy > m.drain) {
|
||||||
m.energy -= DRAIN;
|
m.energy -= m.drain;
|
||||||
if (m.energy < DRAIN) {
|
if (m.energy < m.drain) {
|
||||||
m.fieldCDcycle = m.cycle + 120;
|
m.fieldCDcycle = m.cycle + 120;
|
||||||
m.energy = 0;
|
m.energy = 0;
|
||||||
m.wakeCheck();
|
m.wakeCheck();
|
||||||
@@ -2076,19 +2077,6 @@ const m = {
|
|||||||
sleep(mob);
|
sleep(mob);
|
||||||
sleep(body);
|
sleep(body);
|
||||||
sleep(bullet);
|
sleep(bullet);
|
||||||
// for (let i = 0, len = cons.length; i < len; i++) {
|
|
||||||
// Matter.Body.setVelocity(cons[i].bodyB, {
|
|
||||||
// x: 0,
|
|
||||||
// y: 0
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
//doesn't really work, just slows down constraints
|
|
||||||
// for (let i = 0, len = cons.length; i < len; i++) {
|
|
||||||
// if (cons[i].stiffness !== 0) {
|
|
||||||
// cons[i].storeStiffness = cons[i].stiffness;
|
|
||||||
// cons[i].stiffness = 0;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
simulation.cycle--; //pause all functions that depend on game cycle increasing
|
simulation.cycle--; //pause all functions that depend on game cycle increasing
|
||||||
if (tech.isTimeSkip) {
|
if (tech.isTimeSkip) {
|
||||||
@@ -2097,32 +2085,17 @@ const m = {
|
|||||||
m.cycle++;
|
m.cycle++;
|
||||||
simulation.gravity();
|
simulation.gravity();
|
||||||
if (tech.isFireMoveLock && input.fire) {
|
if (tech.isFireMoveLock && input.fire) {
|
||||||
// Matter.Body.setVelocity(player, {
|
|
||||||
// x: 0,
|
|
||||||
// y: -55 * player.mass * simulation.g //undo gravity before it is added
|
|
||||||
// });
|
|
||||||
player.force.x = 0
|
player.force.x = 0
|
||||||
player.force.y = 0
|
player.force.y = 0
|
||||||
}
|
}
|
||||||
Engine.update(engine, simulation.delta);
|
Engine.update(engine, simulation.delta);
|
||||||
m.move();
|
m.move();
|
||||||
simulation.checks();
|
simulation.checks();
|
||||||
// mobs.loop();
|
|
||||||
// m.draw();
|
|
||||||
m.walk_cycle += m.flipLegs * m.Vx;
|
m.walk_cycle += m.flipLegs * m.Vx;
|
||||||
// m.hold();
|
|
||||||
// m.energy += DRAIN; // 1 to undo the energy drain from time speed up, 0.5 to cut energy drain in half
|
|
||||||
|
|
||||||
b.fire();
|
b.fire();
|
||||||
// b.bulletRemove();
|
|
||||||
b.bulletDo();
|
b.bulletDo();
|
||||||
simulation.isTimeSkipping = false;
|
simulation.isTimeSkipping = false;
|
||||||
}
|
}
|
||||||
// simulation.cycle--; //pause all functions that depend on game cycle increasing
|
|
||||||
// if (tech.isTimeSkip && !simulation.isTimeSkipping) { //speed up the rate of time
|
|
||||||
// simulation.timeSkip(1)
|
|
||||||
// m.energy += 1.5 * DRAIN; //x1 to undo the energy drain from time speed up, x1.5 to cut energy drain in half
|
|
||||||
// }
|
|
||||||
} else { //holding, but field button is released
|
} else { //holding, but field button is released
|
||||||
m.wakeCheck();
|
m.wakeCheck();
|
||||||
}
|
}
|
||||||
@@ -2130,9 +2103,11 @@ const m = {
|
|||||||
m.wakeCheck();
|
m.wakeCheck();
|
||||||
m.pickUp();
|
m.pickUp();
|
||||||
} else {
|
} else {
|
||||||
|
if (m.drain > 0.0005) m.drain -= 0.000005 //return drain to base level
|
||||||
m.wakeCheck();
|
m.wakeCheck();
|
||||||
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
m.holdingTarget = null; //clears holding target (this is so you only pick up right after the field button is released and a hold target exists)
|
||||||
}
|
}
|
||||||
|
// console.log(m.drain.toFixed(6))
|
||||||
m.drawFieldMeter()
|
m.drawFieldMeter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -568,7 +568,7 @@ const powerUps = {
|
|||||||
// if (powerUps.research.count) text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"><div class="circle-grid research"></div> research <span class="research-select">${powerUps.research.count}</span></div></div>`
|
// if (powerUps.research.count) text += `<div class="choose-grid-module" onclick="powerUps.research.use('tech')"><div class="grid-title"><div class="circle-grid research"></div> research <span class="research-select">${powerUps.research.count}</span></div></div>`
|
||||||
|
|
||||||
if (tech.isExtraGunField) {
|
if (tech.isExtraGunField) {
|
||||||
if (Math.random() > 0.5) {
|
if (Math.random() > 0.5 && b.inventory.length < b.guns.length) {
|
||||||
//bonus gun in tech menu
|
//bonus gun in tech menu
|
||||||
let choiceGun = powerUps.gun.pick(b.guns)
|
let choiceGun = powerUps.gun.pick(b.guns)
|
||||||
powerUps.gun.choiceLog.push(choiceGun)
|
powerUps.gun.choiceLog.push(choiceGun)
|
||||||
@@ -693,8 +693,8 @@ const powerUps = {
|
|||||||
powerUps.research.currentRerollCount = 0
|
powerUps.research.currentRerollCount = 0
|
||||||
if (tech.isTechDamage && who.name === "tech") m.damage(0.11)
|
if (tech.isTechDamage && who.name === "tech") m.damage(0.11)
|
||||||
if (tech.isMassEnergy) m.energy += 2;
|
if (tech.isMassEnergy) m.energy += 2;
|
||||||
if (tech.isMineDrop) {
|
if (tech.isMineDrop && b.length < 150) {
|
||||||
if (tech.isLaserMine) {
|
if (tech.isLaserMine && m.crouch) {
|
||||||
b.laserMine(who.position)
|
b.laserMine(who.position)
|
||||||
} else {
|
} else {
|
||||||
b.mine(who.position, { x: 0, y: 0 }, 0, tech.isMineAmmoBack)
|
b.mine(who.position, { x: 0, y: 0 }, 0, tech.isMineAmmoBack)
|
||||||
|
|||||||
60
js/tech.js
60
js/tech.js
@@ -2,9 +2,9 @@
|
|||||||
totalCount: null,
|
totalCount: null,
|
||||||
setupAllTech() {
|
setupAllTech() {
|
||||||
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
for (let i = 0, len = tech.tech.length; i < len; i++) {
|
||||||
tech.tech[i].remove();
|
|
||||||
tech.tech[i].isLost = false
|
|
||||||
tech.tech[i].count = 0
|
tech.tech[i].count = 0
|
||||||
|
tech.tech[i].isLost = false
|
||||||
|
tech.tech[i].remove();
|
||||||
if (tech.tech[i].isJunk) {
|
if (tech.tech[i].isJunk) {
|
||||||
tech.tech[i].frequency = 0
|
tech.tech[i].frequency = 0
|
||||||
} else if (tech.tech[i].frequencyDefault) {
|
} else if (tech.tech[i].frequencyDefault) {
|
||||||
@@ -670,7 +670,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isExplosionStun
|
return tech.isStunField || tech.oneSuperBall || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isExplosionStun || tech.isMineStun
|
||||||
},
|
},
|
||||||
requires: "a stun effect",
|
requires: "a stun effect",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -1937,7 +1937,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isStunField || tech.isExplosionStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot
|
return tech.isStunField || tech.isExplosionStun || tech.isMineStun || tech.oneSuperBall || tech.isHarmFreeze || tech.isIceField || tech.relayIce || tech.isIceCrystals || tech.isSporeFreeze || tech.isAoESlow || tech.isFreezeMobs || tech.isCloakStun || tech.orbitBotCount > 1 || tech.isWormholeDamage || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot
|
||||||
},
|
},
|
||||||
requires: "a freezing or stunning effect",
|
requires: "a freezing or stunning effect",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -2478,7 +2478,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Zeno's paradox",
|
name: "Zeno's paradox",
|
||||||
description: "reduce <strong class='color-harm'>harm</strong> by <strong>84%</strong>, but every <strong>5</strong> seconds<br>remove <strong>1/10</strong> of your current <strong class='color-h'>health</strong>",
|
description: "reduce <strong class='color-harm'>harm</strong> by <strong>83%</strong>, but every <strong>5</strong> seconds<br>remove <strong>1/10</strong> of your current <strong class='color-h'>health</strong>",
|
||||||
// description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>",
|
// description: "every <strong>5</strong> seconds remove <strong>1/10</strong> of your <strong class='color-h'>health</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>90%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -4417,16 +4417,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "laser-mines",
|
name: "laser-mines",
|
||||||
description: "<strong>mines</strong> hover in place until <strong>mobs</strong> get in range<br><strong>mines</strong> use <strong class='color-f'>energy</strong> to emit <strong>3</strong> unaimed <strong class='color-laser'>lasers</strong>",
|
description: "<strong>mines</strong> laid while you are <strong>crouched</strong><br>use <strong class='color-f'>energy</strong> to emit <strong>3</strong> unaimed <strong class='color-laser'>lasers</strong>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineSentry
|
return tech.haveGunCheck("mine")
|
||||||
},
|
},
|
||||||
requires: "mines, not sentry",
|
requires: "mines",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isLaserMine = true;
|
tech.isLaserMine = true;
|
||||||
},
|
},
|
||||||
@@ -4443,9 +4443,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("mine") && !tech.isMineSentry
|
return tech.haveGunCheck("mine") && !tech.isMineDrop
|
||||||
},
|
},
|
||||||
requires: "mine, not sentry",
|
requires: "mine, not bobby trap",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isMineAmmoBack = true;
|
tech.isMineAmmoBack = true;
|
||||||
},
|
},
|
||||||
@@ -4455,16 +4455,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "sentry",
|
name: "sentry",
|
||||||
description: "<strong>mines</strong> <strong>target</strong> mobs with nails over time<br>mines last about <strong>14</strong> seconds",
|
description: "instead of detonating, <strong>mines</strong> <strong>target</strong> mobs<br>with a stream of nails for about <strong>14</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.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine
|
return tech.haveGunCheck("mine")
|
||||||
},
|
},
|
||||||
requires: "mines, not mine reclamation, laser-mines",
|
requires: "mines",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isMineSentry = true;
|
tech.isMineSentry = true;
|
||||||
},
|
},
|
||||||
@@ -4473,24 +4473,43 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "booby trap",
|
name: "blast mines",
|
||||||
description: "drop a <strong>mine</strong> after picking up a <strong>power up</strong><br><strong>+23</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",
|
description: "when a <strong>mine</strong> <strong>activates</strong><br>it <strong>stuns</strong> nearby mobs for up to <strong>3</strong> seconds",
|
||||||
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.isMineSentry === true || tech.isLaserMine === true || tech.isMineAmmoBack === true
|
return tech.haveGunCheck("mine")
|
||||||
},
|
},
|
||||||
requires: "some mine tech",
|
requires: "mines",
|
||||||
|
effect() {
|
||||||
|
tech.isMineStun = true;
|
||||||
|
},
|
||||||
|
remove() {
|
||||||
|
tech.isMineStun = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "booby trap",
|
||||||
|
description: "drop a <strong>mine</strong> after picking up a <strong>power up</strong><br><strong>+30</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",
|
||||||
|
maxCount: 1,
|
||||||
|
count: 0,
|
||||||
|
frequency: 2,
|
||||||
|
frequencyDefault: 2,
|
||||||
|
allowed() {
|
||||||
|
return tech.haveGunCheck("mine") && !tech.isMineAmmoBack
|
||||||
|
},
|
||||||
|
requires: "mines, not mine reclamation",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isMineDrop = true;
|
tech.isMineDrop = true;
|
||||||
if (tech.isMineDrop) b.mine(m.pos, { x: 0, y: 0 }, 0, tech.isMineAmmoBack)
|
if (tech.isMineDrop) b.mine(m.pos, { x: 0, y: 0 }, 0, tech.isMineAmmoBack)
|
||||||
tech.addJunkTechToPool(23)
|
tech.addJunkTechToPool(30)
|
||||||
},
|
},
|
||||||
remove() {
|
remove() {
|
||||||
tech.isMineDrop = false;
|
tech.isMineDrop = false;
|
||||||
if (this.count > 0) tech.removeJunkTechFromPool(13)
|
if (this.count > 0) tech.removeJunkTechFromPool(30)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -7878,5 +7897,6 @@
|
|||||||
isFieldFree: null,
|
isFieldFree: null,
|
||||||
wormSurviveDmg: null,
|
wormSurviveDmg: null,
|
||||||
isExtraGunField: null,
|
isExtraGunField: null,
|
||||||
isBigField: null
|
isBigField: null,
|
||||||
|
isMineStun: null
|
||||||
}
|
}
|
||||||
33
todo.txt
33
todo.txt
@@ -1,22 +1,24 @@
|
|||||||
******************************************************** NEXT PATCH ********************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
tech: blast mines - mines stun when they activate
|
||||||
|
|
||||||
perfect diamagnetism can maintain after you deactivate the field with out tech: Lenz's law
|
laser mines only fire if crouching (so you can fire normal mines when energy is low)
|
||||||
starting perfect diamagnetism is a bit smaller
|
mines now includes the radius of the mob when calculating mobs in range
|
||||||
tech: Meissner effect - makes perfect diamagnetism much bigger
|
so it will detonate from the final boss from farther away
|
||||||
|
mines have a small random chance to detonate from targets up to 40% father away
|
||||||
|
|
||||||
plasma-bot removes plasma field
|
time dilation field drains less energy for the first few seconds, but linearly ramps up energy drain as you stay frozen in time
|
||||||
plasma-bot uses much less energy and does a bit more damage
|
unfreezing time returns you the normal drain rate in half the time to ramp up
|
||||||
plasma jet requires 1 research, increases range 50% (was 30%)
|
this should be a buff for all situations, except someone who has a huge external source of energy
|
||||||
tech microextruder does 30% more damage and uses 10% more energy
|
|
||||||
|
360 wave beam has reduced mob slow effect
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
plasma bot removes your field
|
look into 360 wave beam lag
|
||||||
buff plasma bot? (not sure you need to)
|
|
||||||
spawn a field power up?
|
mines stun mobs in range
|
||||||
no need it will show up on next boss
|
|
||||||
requires not plasma wire tech
|
tech: shrapnel - nails have an larger randomized 3 point shape triangle shape and they do more damage
|
||||||
can tokamak work outside plasma field?
|
|
||||||
|
|
||||||
mob: spawning seekers on death
|
mob: spawning seekers on death
|
||||||
|
|
||||||
@@ -36,9 +38,6 @@ make the player get a buff after using wormhole
|
|||||||
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
|
||||||
|
|
||||||
pink seeker boss is cool as heck, make an alt version of it
|
|
||||||
snake tail is cool, make an alt version of it
|
|
||||||
|
|
||||||
block shattering
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user