block throwing trajectory
block throwing and mines when crouched now have trajectory prediction, like grenades all bot upgrades are about 20% better Ψ(t) collapse gives 16->21 research spores and drones have up to 20% shorter life span when the number of active bullets is high 1st ionization energy gives 7 -> 8 max energy per heal permittivity renamed weak interaction weak interaction gives 4 -> 5 max energy per unused power up transceiver renamed electroweak interaction fixed about 70 different requirement text situations
This commit is contained in:
133
js/bullet.js
133
js/bullet.js
@@ -1112,18 +1112,20 @@ const b = {
|
|||||||
b.guns[gunIndex].do = function() {}
|
b.guns[gunIndex].do = function() {}
|
||||||
} else {
|
} else {
|
||||||
if (gunIndex) b.guns[gunIndex].do = function() {
|
if (gunIndex) b.guns[gunIndex].do = function() {
|
||||||
const cycles = 80
|
if (!input.field) {
|
||||||
const speed = input.down ? 35 : 20 //input.down ? 43 : 32
|
const cycles = 80
|
||||||
const g = input.down ? 0.137 : 0.135
|
const speed = input.down ? 35 : 20 //input.down ? 43 : 32
|
||||||
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
const g = input.down ? 0.137 : 0.135
|
||||||
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
||||||
ctx.lineWidth = 2
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
||||||
ctx.beginPath()
|
ctx.lineWidth = 2
|
||||||
for (let i = 1, len = 19; i < len + 1; i++) {
|
ctx.beginPath()
|
||||||
const time = cycles * i / len
|
for (let i = 1, len = 19; i < len + 1; i++) {
|
||||||
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + g * time * time)
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + g * time * time)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
}
|
}
|
||||||
ctx.stroke()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (tech.isRPG) {
|
} else if (tech.isRPG) {
|
||||||
@@ -1136,32 +1138,36 @@ const b = {
|
|||||||
} else if (tech.isVacuumBomb) {
|
} else if (tech.isVacuumBomb) {
|
||||||
b.grenade = grenadeVacuum
|
b.grenade = grenadeVacuum
|
||||||
if (gunIndex) b.guns[gunIndex].do = function() {
|
if (gunIndex) b.guns[gunIndex].do = function() {
|
||||||
const cycles = Math.floor(input.down ? 50 : 30) //30
|
if (!input.field) {
|
||||||
const speed = input.down ? 44 : 35
|
const cycles = Math.floor(input.down ? 50 : 30) //30
|
||||||
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
const speed = input.down ? 44 : 35
|
||||||
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
|
||||||
ctx.lineWidth = 2
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
||||||
ctx.beginPath()
|
ctx.lineWidth = 2
|
||||||
for (let i = 1.6, len = 19; i < len + 1; i++) {
|
ctx.beginPath()
|
||||||
const time = cycles * i / len
|
for (let i = 1.6, len = 19; i < len + 1; i++) {
|
||||||
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
}
|
}
|
||||||
ctx.stroke()
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
b.grenade = grenadeDefault
|
b.grenade = grenadeDefault
|
||||||
if (gunIndex) b.guns[gunIndex].do = function() {
|
if (gunIndex) b.guns[gunIndex].do = function() {
|
||||||
const cycles = Math.floor(input.down ? 120 : 80) //30
|
if (!input.field) {
|
||||||
const speed = input.down ? 43 : 32
|
const cycles = Math.floor(input.down ? 120 : 80) //30
|
||||||
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
const speed = input.down ? 43 : 32
|
||||||
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
||||||
ctx.lineWidth = 2
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
||||||
ctx.beginPath()
|
ctx.lineWidth = 2
|
||||||
for (let i = 0.5, len = 19; i < len + 1; i++) {
|
ctx.beginPath()
|
||||||
const time = cycles * i / len
|
for (let i = 0.5, len = 19; i < len + 1; i++) {
|
||||||
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
}
|
}
|
||||||
ctx.stroke()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2481,7 +2487,7 @@ const b = {
|
|||||||
//total 0.24 + 0.3 average
|
//total 0.24 + 0.3 average
|
||||||
dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum
|
dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum
|
||||||
lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()),
|
lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()),
|
||||||
endCycle: simulation.cycle + Math.floor((950 + 420 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 140 + RADIUS * 5,
|
endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - b.length),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
@@ -2686,7 +2692,7 @@ const b = {
|
|||||||
restitution: 0.4 + 0.199 * Math.random(),
|
restitution: 0.4 + 0.199 * Math.random(),
|
||||||
dmg: 0, //0.24 damage done in addition to the damage from momentum and radiation
|
dmg: 0, //0.24 damage done in addition to the damage from momentum and radiation
|
||||||
lookFrequency: 120 + Math.floor(23 * Math.random()),
|
lookFrequency: 120 + Math.floor(23 * Math.random()),
|
||||||
endCycle: simulation.cycle + Math.floor((900 + 120 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 140 + RADIUS * 5,
|
endCycle: simulation.cycle + Math.floor((900 + 110 * Math.random()) * tech.isBulletsLastLonger / tech.droneRadioDamage) + 5 * RADIUS + Math.max(0, 150 - 2 * b.length),
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
category: cat.bullet,
|
category: cat.bullet,
|
||||||
@@ -2700,7 +2706,7 @@ const b = {
|
|||||||
isImproved: false,
|
isImproved: false,
|
||||||
radioRadius: 0,
|
radioRadius: 0,
|
||||||
maxRadioRadius: 300 + Math.floor(100 * Math.random()),
|
maxRadioRadius: 300 + Math.floor(100 * Math.random()),
|
||||||
beforeDmg(who) {
|
beforeDmg() {
|
||||||
// const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting
|
// const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) //move away from target after hitting
|
||||||
// Matter.Body.setVelocity(this, {
|
// Matter.Body.setVelocity(this, {
|
||||||
// x: unit.x,
|
// x: unit.x,
|
||||||
@@ -3361,11 +3367,11 @@ const b = {
|
|||||||
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250 && m.immuneCycle < m.cycle) { //give energy
|
if (Vector.magnitude(Vector.sub(this.position, player.position)) < 250 && m.immuneCycle < m.cycle) { //give energy
|
||||||
Matter.Body.setAngularVelocity(this, this.spin)
|
Matter.Body.setAngularVelocity(this, this.spin)
|
||||||
if (this.isUpgraded) {
|
if (this.isUpgraded) {
|
||||||
m.energy += 0.08
|
m.energy += 0.1
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
x: this.position.x,
|
x: this.position.x,
|
||||||
y: this.position.y,
|
y: this.position.y,
|
||||||
radius: 8,
|
radius: 10,
|
||||||
color: m.fieldMeterColor,
|
color: m.fieldMeterColor,
|
||||||
time: simulation.drawTime
|
time: simulation.drawTime
|
||||||
});
|
});
|
||||||
@@ -3464,10 +3470,16 @@ const b = {
|
|||||||
Matter.Query.ray(body, this.position, mob[i].position).length === 0 &&
|
Matter.Query.ray(body, this.position, mob[i].position).length === 0 &&
|
||||||
!mob[i].isShielded
|
!mob[i].isShielded
|
||||||
) {
|
) {
|
||||||
const SPEED = 35
|
|
||||||
const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position))
|
const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position))
|
||||||
b.nail(this.position, Vector.mult(unit, SPEED))
|
if (this.isUpgraded) {
|
||||||
this.force = Vector.mult(unit, -0.01 * this.mass)
|
const SPEED = 50
|
||||||
|
b.nail(this.position, Vector.mult(unit, SPEED))
|
||||||
|
this.force = Vector.mult(unit, -0.018 * this.mass)
|
||||||
|
} else {
|
||||||
|
const SPEED = 35
|
||||||
|
b.nail(this.position, Vector.mult(unit, SPEED))
|
||||||
|
this.force = Vector.mult(unit, -0.01 * this.mass)
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3565,7 +3577,7 @@ const b = {
|
|||||||
restitution: 0.6 * (1 + 0.5 * Math.random()),
|
restitution: 0.6 * (1 + 0.5 * Math.random()),
|
||||||
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
dmg: 0, // 0.14 //damage done in addition to the damage from momentum
|
||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 60 + Math.floor(17 * Math.random()) - 35 * tech.isFoamBotUpgrade,
|
lookFrequency: 60 + Math.floor(17 * Math.random()) - 40 * tech.isFoamBotUpgrade,
|
||||||
cd: 0,
|
cd: 0,
|
||||||
delay: 100,
|
delay: 100,
|
||||||
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
||||||
@@ -3593,7 +3605,7 @@ const b = {
|
|||||||
this.cd = simulation.cycle + this.delay;
|
this.cd = simulation.cycle + this.delay;
|
||||||
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
|
||||||
const radius = 6 + 7 * Math.random()
|
const radius = 6 + 7 * Math.random()
|
||||||
const SPEED = 29 - radius * 0.5; //(input.down ? 32 : 20) - radius * 0.7;
|
const SPEED = 29 - radius * 0.4; //(input.down ? 32 : 20) - radius * 0.7;
|
||||||
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
|
const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED)
|
||||||
b.foam(this.position, velocity, radius + 7 * this.isUpgraded)
|
b.foam(this.position, velocity, radius + 7 * this.isUpgraded)
|
||||||
break;
|
break;
|
||||||
@@ -3627,10 +3639,10 @@ const b = {
|
|||||||
dmg: 0, //damage done in addition to the damage from momentum
|
dmg: 0, //damage done in addition to the damage from momentum
|
||||||
minDmgSpeed: 2,
|
minDmgSpeed: 2,
|
||||||
lookFrequency: 40 + Math.floor(7 * Math.random()) - 10 * tech.isLaserBotUpgrade,
|
lookFrequency: 40 + Math.floor(7 * Math.random()) - 10 * tech.isLaserBotUpgrade,
|
||||||
range: (700 + 400 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
|
range: (700 + 450 * tech.isLaserBotUpgrade) * (1 + 0.1 * Math.random()),
|
||||||
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,
|
drainThreshold: tech.isEnergyHealth ? 0.6 : 0.4,
|
||||||
drain: (0.5 - 0.42 * tech.isLaserBotUpgrade) * tech.laserFieldDrain * tech.isLaserDiode,
|
drain: (0.5 - 0.43 * tech.isLaserBotUpgrade) * tech.laserFieldDrain * tech.isLaserDiode,
|
||||||
laserDamage: 0.85 + 0.65 * tech.isLaserBotUpgrade,
|
laserDamage: 0.85 + 0.7 * tech.isLaserBotUpgrade,
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
@@ -3739,7 +3751,7 @@ const b = {
|
|||||||
lookFrequency: 43 + Math.floor(7 * Math.random()) - 10 * tech.isBoomBotUpgrade,
|
lookFrequency: 43 + Math.floor(7 * Math.random()) - 10 * tech.isBoomBotUpgrade,
|
||||||
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
acceleration: 0.005 * (1 + 0.5 * Math.random()),
|
||||||
attackAcceleration: 0.012 + 0.005 * tech.isBoomBotUpgrade,
|
attackAcceleration: 0.012 + 0.005 * tech.isBoomBotUpgrade,
|
||||||
range: 500 * (1 + 0.1 * Math.random()) + 300 * tech.isBoomBotUpgrade,
|
range: 500 * (1 + 0.1 * Math.random()) + 320 * tech.isBoomBotUpgrade,
|
||||||
endCycle: Infinity,
|
endCycle: Infinity,
|
||||||
classType: "bullet",
|
classType: "bullet",
|
||||||
collisionFilter: {
|
collisionFilter: {
|
||||||
@@ -3750,7 +3762,7 @@ const b = {
|
|||||||
explode: 0,
|
explode: 0,
|
||||||
beforeDmg() {
|
beforeDmg() {
|
||||||
if (this.lockedOn) {
|
if (this.lockedOn) {
|
||||||
const explosionRadius = Math.min(136 + 180 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30)
|
const explosionRadius = Math.min(136 + 200 * this.isUpgraded, Vector.magnitude(Vector.sub(this.position, m.pos)) - 30)
|
||||||
if (explosionRadius > 60) {
|
if (explosionRadius > 60) {
|
||||||
this.explode = explosionRadius
|
this.explode = explosionRadius
|
||||||
//
|
//
|
||||||
@@ -4025,7 +4037,7 @@ const b = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
range: 190 + 100 * tech.isOrbitBotUpgrade, //range is set in bot upgrade too! //150 + (80 + 100 * tech.isOrbitBotUpgrade) * Math.random(), // + 5 * tech.orbitBotCount,
|
range: 190 + 120 * tech.isOrbitBotUpgrade, //range is set in bot upgrade too!
|
||||||
orbitalSpeed: 0,
|
orbitalSpeed: 0,
|
||||||
phase: 2 * Math.PI * Math.random(),
|
phase: 2 * Math.PI * Math.random(),
|
||||||
do() {
|
do() {
|
||||||
@@ -4038,7 +4050,7 @@ const b = {
|
|||||||
for (let i = 0; i < q.length; i++) {
|
for (let i = 0; i < q.length; i++) {
|
||||||
if (!q[i].isShielded) {
|
if (!q[i].isShielded) {
|
||||||
mobs.statusStun(q[i], 180)
|
mobs.statusStun(q[i], 180)
|
||||||
const dmg = 0.4 * b.dmgScale * (this.isUpgraded ? 3.5 : 1) * (tech.isCrit ? 4 : 1)
|
const dmg = 0.4 * b.dmgScale * (this.isUpgraded ? 4 : 1) * (tech.isCrit ? 4 : 1)
|
||||||
q[i].damage(dmg);
|
q[i].damage(dmg);
|
||||||
if (q[i].alive) q[i].foundPlayer();
|
if (q[i].alive) q[i].foundPlayer();
|
||||||
simulation.drawList.push({ //add dmg to draw queue
|
simulation.drawList.push({ //add dmg to draw queue
|
||||||
@@ -5091,7 +5103,7 @@ const b = {
|
|||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 5,
|
ammoPack: 5,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {}, //do is set in b.setGrenadeMode()
|
||||||
fire() {
|
fire() {
|
||||||
const countReduction = Math.pow(0.93, tech.missileCount)
|
const countReduction = Math.pow(0.93, tech.missileCount)
|
||||||
m.fireCDcycle = m.cycle + Math.floor((input.down ? 40 : 30) * b.fireCDscale / countReduction); // cool down
|
m.fireCDcycle = m.cycle + Math.floor((input.down ? 40 : 30) * b.fireCDscale / countReduction); // cool down
|
||||||
@@ -5109,7 +5121,21 @@ const b = {
|
|||||||
ammo: 0,
|
ammo: 0,
|
||||||
ammoPack: 1.25,
|
ammoPack: 1.25,
|
||||||
have: false,
|
have: false,
|
||||||
do() {},
|
do() {
|
||||||
|
if (!input.field && input.down && !tech.isLaserMine) {
|
||||||
|
const cycles = 60 //30
|
||||||
|
const speed = 40
|
||||||
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
||||||
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
|
||||||
|
ctx.lineWidth = 2
|
||||||
|
ctx.beginPath()
|
||||||
|
for (let i = 1.5, len = 19; i < len + 1; i++) {
|
||||||
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
||||||
|
}
|
||||||
|
ctx.stroke()
|
||||||
|
}
|
||||||
|
},
|
||||||
fire() {
|
fire() {
|
||||||
if (input.down) {
|
if (input.down) {
|
||||||
if (tech.isLaserMine) {
|
if (tech.isLaserMine) {
|
||||||
@@ -5145,7 +5171,7 @@ const b = {
|
|||||||
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false));
|
bullet[me] = Bodies.polygon(m.pos.x + 30 * Math.cos(m.angle), m.pos.y + 30 * Math.sin(m.angle), 20, 4.5, b.fireAttributes(dir, false));
|
||||||
b.fireProps(input.down ? 45 : 25, input.down ? 30 : 16, dir, me); //cd , speed
|
b.fireProps(input.down ? 45 : 25, input.down ? 30 : 16, dir, me); //cd , speed
|
||||||
Matter.Body.setDensity(bullet[me], 0.000001);
|
Matter.Body.setDensity(bullet[me], 0.000001);
|
||||||
bullet[me].endCycle = simulation.cycle + 600;
|
bullet[me].endCycle = simulation.cycle + 480 + Math.max(0, 120 - 2 * b.length);
|
||||||
bullet[me].frictionAir = 0;
|
bullet[me].frictionAir = 0;
|
||||||
bullet[me].friction = 0.5;
|
bullet[me].friction = 0.5;
|
||||||
bullet[me].radius = 4.5;
|
bullet[me].radius = 4.5;
|
||||||
@@ -5899,7 +5925,7 @@ const b = {
|
|||||||
ctx.moveTo(history.position.x, history.position.y - off);
|
ctx.moveTo(history.position.x, history.position.y - off);
|
||||||
ctx.ellipse(history.position.x, history.position.y - off, mag, mag * 0.65, history.angle, 0, 2 * Math.PI)
|
ctx.ellipse(history.position.x, history.position.y - off, mag, mag * 0.65, history.angle, 0, 2 * Math.PI)
|
||||||
}
|
}
|
||||||
ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
|
ctx.fillStyle = tech.isLaserDiode === 1 ? `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})` : `rgba(0,0,255,${0.09 * Math.sqrt(this.charge)})`;
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
//fire
|
//fire
|
||||||
if (!input.fire) {
|
if (!input.fire) {
|
||||||
@@ -5921,7 +5947,8 @@ const b = {
|
|||||||
//draw charge level
|
//draw charge level
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.arc(m.pos.x, m.pos.y, 4.2 * Math.sqrt(this.charge), 0, 2 * Math.PI);
|
ctx.arc(m.pos.x, m.pos.y, 4.2 * Math.sqrt(this.charge), 0, 2 * Math.PI);
|
||||||
ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
|
// ctx.fillStyle = `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})`;
|
||||||
|
ctx.fillStyle = tech.isLaserDiode === 1 ? `rgba(255,0,0,${0.09 * Math.sqrt(this.charge)})` : `rgba(0,0,255,${0.09 * Math.sqrt(this.charge)})`;
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
//fire
|
//fire
|
||||||
if (!input.fire) {
|
if (!input.fire) {
|
||||||
|
|||||||
15
js/level.js
15
js/level.js
@@ -16,9 +16,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
|
||||||
// m.setField("metamaterial cloaking")
|
// m.setField("metamaterial cloaking")
|
||||||
b.giveGuns("laser")
|
// b.giveGuns("mine")
|
||||||
// tech.giveTech("spherical harmonics")
|
// tech.giveTech("spherical harmonics")
|
||||||
tech.giveTech("relative permittivity")
|
// tech.giveTech("relative permittivity")
|
||||||
// tech.giveTech("causality bombs")
|
// tech.giveTech("causality bombs")
|
||||||
// for (let i = 0; i < 2; i++) tech.giveTech("refractory metal")
|
// for (let i = 0; i < 2; i++) tech.giveTech("refractory metal")
|
||||||
// tech.giveTech("antiscience")
|
// tech.giveTech("antiscience")
|
||||||
@@ -26,11 +26,6 @@ const level = {
|
|||||||
// for (let i = 0; i < 2; i++) tech.giveTech("laser-bot")
|
// for (let i = 0; i < 2; i++) tech.giveTech("laser-bot")
|
||||||
// tech.isCancelDuplication = true
|
// tech.isCancelDuplication = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
level.intro(); //starting level
|
level.intro(); //starting level
|
||||||
// level.testing(); //not in rotation, used for testing
|
// level.testing(); //not in rotation, used for testing
|
||||||
// level.template(); //not in rotation, blank start new map development
|
// level.template(); //not in rotation, blank start new map development
|
||||||
@@ -2316,9 +2311,9 @@ const level = {
|
|||||||
spawn.mapRect(4850, -275, 50, 175);
|
spawn.mapRect(4850, -275, 50, 175);
|
||||||
// level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why
|
// level.difficultyIncrease(40) //30 is near max on hard //60 is near max on why
|
||||||
// spawn.starter(1900, -500, 200) //big boy
|
// spawn.starter(1900, -500, 200) //big boy
|
||||||
// spawn.blockGroup(1900, -500)
|
spawn.historyBoss(1700, -500)
|
||||||
|
spawn.shooterBoss(3200, -500)
|
||||||
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
|
||||||
// spawn.laserBombingBoss(1900, -500)
|
|
||||||
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
// for (let i = 0; i < 5; i++) spawn.focuser(1900, -500)
|
||||||
// spawn.slashBoss(1900, -500)
|
// spawn.slashBoss(1900, -500)
|
||||||
// spawn.sucker(1900, -500)
|
// spawn.sucker(1900, -500)
|
||||||
@@ -2337,7 +2332,7 @@ const level = {
|
|||||||
// spawn.nodeGroup(1200, -500, "grenadier")
|
// spawn.nodeGroup(1200, -500, "grenadier")
|
||||||
// spawn.nodeGroup(1800, -500, "grenadier")
|
// spawn.nodeGroup(1800, -500, "grenadier")
|
||||||
// spawn.nodeGroup(1200, 0, "grenadier")
|
// spawn.nodeGroup(1200, 0, "grenadier")
|
||||||
spawn.blinkBoss(1200, -500)
|
// spawn.blinkBoss(1200, -500)
|
||||||
// spawn.suckerBoss(2900, -500)
|
// spawn.suckerBoss(2900, -500)
|
||||||
// spawn.randomMob(1600, -500)
|
// spawn.randomMob(1600, -500)
|
||||||
},
|
},
|
||||||
|
|||||||
20
js/player.js
20
js/player.js
@@ -1157,6 +1157,19 @@ const m = {
|
|||||||
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
|
ctx.lineTo(m.holdingTarget.vertices[i + 1].x, m.holdingTarget.vertices[i + 1].y);
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
}
|
}
|
||||||
|
//trajectory path prediction
|
||||||
|
const cycles = 30
|
||||||
|
const charge = Math.min(m.throwCharge / 5, 1)
|
||||||
|
const speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
||||||
|
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
|
||||||
|
ctx.beginPath()
|
||||||
|
for (let i = 1, len = 10; i < len + 1; i++) {
|
||||||
|
const time = cycles * i / len
|
||||||
|
ctx.lineTo(m.pos.x + time * v.x, m.pos.y + time * v.y + 0.34 * time * time)
|
||||||
|
}
|
||||||
|
ctx.strokeStyle = "rgba(68, 68, 68, 0.15)" //color.map
|
||||||
|
ctx.lineWidth = 2
|
||||||
|
ctx.stroke()
|
||||||
} else {
|
} else {
|
||||||
m.drop()
|
m.drop()
|
||||||
}
|
}
|
||||||
@@ -1203,21 +1216,16 @@ const m = {
|
|||||||
const charge = Math.min(m.throwCharge / 5, 1)
|
const charge = Math.min(m.throwCharge / 5, 1)
|
||||||
//***** scale throw speed with the first number, 80 *****
|
//***** scale throw speed with the first number, 80 *****
|
||||||
let speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
let speed = 80 * charge * Math.min(0.85, 0.8 / Math.pow(m.holdingTarget.mass, 0.25));
|
||||||
|
|
||||||
if (Matter.Query.collides(m.holdingTarget, map).length !== 0) {
|
if (Matter.Query.collides(m.holdingTarget, map).length !== 0) {
|
||||||
speed *= 0.7 //drop speed by 30% if touching map
|
speed *= 0.7 //drop speed by 30% if touching map
|
||||||
if (Matter.Query.ray(map, m.holdingTarget.position, m.pos).length !== 0) speed = 0 //drop to zero if the center of the block can't see the center of the player through the map
|
if (Matter.Query.ray(map, m.holdingTarget.position, m.pos).length !== 0) speed = 0 //drop to zero if the center of the block can't see the center of the player through the map
|
||||||
//|| Matter.Query.ray(body, m.holdingTarget.position, m.pos).length > 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m.throwCharge = 0;
|
m.throwCharge = 0;
|
||||||
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds
|
m.throwCycle = m.cycle + 180 //used to detect if a block was thrown in the last 3 seconds
|
||||||
Matter.Body.setVelocity(m.holdingTarget, {
|
Matter.Body.setVelocity(m.holdingTarget, {
|
||||||
x: player.velocity.x * 0.5 + Math.cos(m.angle) * speed,
|
x: player.velocity.x * 0.5 + Math.cos(m.angle) * speed,
|
||||||
y: player.velocity.y * 0.5 + Math.sin(m.angle) * speed
|
y: player.velocity.y * 0.5 + Math.sin(m.angle) * speed
|
||||||
});
|
});
|
||||||
//player recoil //stronger in x-dir to prevent jump hacking
|
|
||||||
|
|
||||||
Matter.Body.setVelocity(player, {
|
Matter.Body.setVelocity(player, {
|
||||||
x: player.velocity.x - Math.cos(m.angle) * speed / (m.crouch ? 30 : 10) * Math.sqrt(m.holdingTarget.mass),
|
x: player.velocity.x - Math.cos(m.angle) * speed / (m.crouch ? 30 : 10) * Math.sqrt(m.holdingTarget.mass),
|
||||||
y: player.velocity.y - Math.sin(m.angle) * speed / 30 * Math.sqrt(m.holdingTarget.mass)
|
y: player.velocity.y - Math.sin(m.angle) * speed / 30 * Math.sqrt(m.holdingTarget.mass)
|
||||||
@@ -1958,7 +1966,7 @@ const m = {
|
|||||||
// m.fieldMeterColor = "#0c5"
|
// m.fieldMeterColor = "#0c5"
|
||||||
// m.eyeFillColor = m.fieldMeterColor
|
// m.eyeFillColor = m.fieldMeterColor
|
||||||
m.hold = function() {
|
m.hold = function() {
|
||||||
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 150 && (m.cycle % 2)) {
|
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) {
|
||||||
if (tech.isSporeField) {
|
if (tech.isSporeField) {
|
||||||
if (tech.isSporeWorm) {
|
if (tech.isSporeWorm) {
|
||||||
if (m.energy > 0.16) {
|
if (m.energy > 0.16) {
|
||||||
|
|||||||
110
js/tech.js
110
js/tech.js
@@ -535,26 +535,30 @@
|
|||||||
{
|
{
|
||||||
name: "desublimated ammunition",
|
name: "desublimated ammunition",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Deposition_(phase_transition)' class="link">desublimated ammunition</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Deposition_(phase_transition)' class="link">desublimated ammunition</a>`,
|
||||||
description: "every other <strong>crouched</strong> shot uses no <strong class='color-ammo'>ammo</strong><br><strong>+6%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",
|
description: `use ${powerUps.orb.research(1)} to produce bullets from air molecules<br>every other <strong>crouched</strong> shot uses no <strong class='color-ammo'>ammo</strong>`,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
frequencyDefault: 1,
|
frequencyDefault: 1,
|
||||||
allowed() {
|
allowed() {
|
||||||
return true
|
return build.isExperimentSelection || powerUps.research.count > 0
|
||||||
},
|
},
|
||||||
requires: "",
|
requires: "",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isCrouchAmmo = true
|
tech.isCrouchAmmo = true
|
||||||
this.refundAmount += tech.addJunkTechToPool(0.06)
|
for (let i = 0; i < 1; i++) {
|
||||||
|
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
|
||||||
|
}
|
||||||
|
// this.refundAmount += tech.addJunkTechToPool(0.06)
|
||||||
},
|
},
|
||||||
refundAmount: 0,
|
// refundAmount: 0,
|
||||||
remove() {
|
remove() {
|
||||||
tech.isExtraChoice = false;
|
tech.isExtraChoice = false;
|
||||||
if (this.count > 0 && this.refundAmount > 0) {
|
if (this.count > 0) powerUps.research.changeRerolls(1)
|
||||||
tech.removeJunkTechFromPool(this.refundAmount)
|
// if (this.count > 0 && this.refundAmount > 0) {
|
||||||
this.refundAmount = 0
|
// tech.removeJunkTechFromPool(this.refundAmount)
|
||||||
}
|
// this.refundAmount = 0
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -567,7 +571,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (tech.isCrouchAmmo && !tech.isEnergyHealth) || tech.isCrouchRegen
|
return (tech.isCrouchAmmo && !tech.isEnergyHealth) || tech.isCrouchRegen
|
||||||
},
|
},
|
||||||
requires: "relative permittivity, desublimated ammunition, not mass-energy",
|
requires: "inductive coupling, desublimated ammunition, not mass-energy",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isTurret = true
|
tech.isTurret = true
|
||||||
},
|
},
|
||||||
@@ -1184,7 +1188,7 @@
|
|||||||
{
|
{
|
||||||
name: "nail-bot upgrade",
|
name: "nail-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot upgrade</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">nail-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> all your bots to <strong>nail-bots</strong><br><strong>500%</strong> increased nail-bot <strong>fire rate</strong>",
|
description: "<strong>convert</strong> your current bots to <strong>nail-bots</strong><br><strong>+500%</strong> <strong>fire rate</strong> and <strong>+40%</strong> nail <strong>velocity</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1193,7 +1197,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.nailBotCount > 1 && !b.hasBotUpgrade()
|
return tech.nailBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more nail bots and only 1 bot upgrade",
|
requires: "2 or more nail bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNailBotUpgrade = true
|
tech.isNailBotUpgrade = true
|
||||||
b.convertBotsTo("nail-bot")
|
b.convertBotsTo("nail-bot")
|
||||||
@@ -1242,7 +1246,7 @@
|
|||||||
{
|
{
|
||||||
name: "foam-bot upgrade",
|
name: "foam-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot upgrade</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">foam-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> all your bots to <strong>foam-bots</strong><br><strong>250%</strong> increased foam <strong>size</strong> and <strong>fire rate</strong>",
|
description: "<strong>convert</strong> your current bots to <strong>foam-bots</strong><br><strong>300%</strong> increased foam <strong>size</strong> and <strong>fire rate</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1251,7 +1255,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.foamBotCount > 1 && !b.hasBotUpgrade()
|
return tech.foamBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more foam bots and only 1 bot upgrade",
|
requires: "2 or more foam bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFoamBotUpgrade = true
|
tech.isFoamBotUpgrade = true
|
||||||
b.convertBotsTo("foam-bot")
|
b.convertBotsTo("foam-bot")
|
||||||
@@ -1299,8 +1303,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "boom-bot upgrade",
|
name: "boom-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">boom-bot upgrade-bot</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">boom-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> all your bots to <strong>boom-bots</strong><br><strong>250%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size",
|
description: "<strong>convert</strong> your current bots to <strong>boom-bots</strong><br><strong>300%</strong> increased <strong class='color-e'>explosion</strong> <strong class='color-d'>damage</strong> and size",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1309,7 +1313,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.boomBotCount > 1 && !b.hasBotUpgrade()
|
return tech.boomBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more boom bots and only 1 bot upgrade",
|
requires: "2 or more boom bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBoomBotUpgrade = true
|
tech.isBoomBotUpgrade = true
|
||||||
b.convertBotsTo("boom-bot")
|
b.convertBotsTo("boom-bot")
|
||||||
@@ -1358,7 +1362,7 @@
|
|||||||
{
|
{
|
||||||
name: "laser-bot upgrade",
|
name: "laser-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">laser-bot upgrade</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">laser-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> all your bots to <strong>laser-bots</strong><br><strong>75%</strong> improved <strong class='color-d'>damage</strong>, efficiency, and range", // <strong>400%</strong> increased <strong>laser-bot</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
|
description: "<strong>convert</strong> your current bots to <strong>laser-bots</strong><br><strong>100%</strong> improved <strong class='color-d'>damage</strong>, efficiency, and range", // <strong>400%</strong> increased <strong>laser-bot</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1367,7 +1371,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.laserBotCount > 1 && !b.hasBotUpgrade()
|
return tech.laserBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more laser bots and only 1 bot upgrade",
|
requires: "2 or more laser bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isLaserBotUpgrade = true
|
tech.isLaserBotUpgrade = true
|
||||||
b.convertBotsTo("laser-bot")
|
b.convertBotsTo("laser-bot")
|
||||||
@@ -1416,7 +1420,7 @@
|
|||||||
{
|
{
|
||||||
name: "orbital-bot upgrade",
|
name: "orbital-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">orbital-bot upgrade</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">orbital-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> all your bots to <strong>orbital-bots</strong><br>increase <strong class='color-d'>damage</strong> by <strong>250%</strong> and <strong>radius</strong> by <strong>40%</strong>",
|
description: "<strong>convert</strong> your current bots to <strong>orbital-bots</strong><br>increase <strong class='color-d'>damage</strong> by <strong>300%</strong> and <strong>radius</strong> by <strong>50%</strong>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1425,11 +1429,11 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.orbitBotCount > 1 && !b.hasBotUpgrade()
|
return tech.orbitBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more orbital bots and only 1 bot upgrade",
|
requires: "2 or more orbital bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isOrbitBotUpgrade = true
|
tech.isOrbitBotUpgrade = true
|
||||||
b.convertBotsTo("orbital-bot")
|
b.convertBotsTo("orbital-bot")
|
||||||
const range = 190 + 100 * tech.isOrbitBotUpgrade
|
const range = 190 + 120 * tech.isOrbitBotUpgrade
|
||||||
for (let i = 0; i < bullet.length; i++) {
|
for (let i = 0; i < bullet.length; i++) {
|
||||||
if (bullet[i].botType === 'orbit') {
|
if (bullet[i].botType === 'orbit') {
|
||||||
bullet[i].isUpgraded = true
|
bullet[i].isUpgraded = true
|
||||||
@@ -1483,7 +1487,7 @@
|
|||||||
{
|
{
|
||||||
name: "dynamo-bot upgrade",
|
name: "dynamo-bot upgrade",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">dynamo-bot upgrade</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">dynamo-bot upgrade</a>`,
|
||||||
description: "<strong>convert</strong> your bots to <strong>dynamo-bots</strong><br>increase regen to <strong>16</strong> <strong class='color-f'>energy</strong> per second",
|
description: "<strong>convert</strong> your current bots to <strong>dynamo-bots</strong><br>increase regen to <strong>19</strong> <strong class='color-f'>energy</strong> per second",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 3,
|
frequency: 3,
|
||||||
@@ -1492,7 +1496,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.dynamoBotCount > 1 && !b.hasBotUpgrade()
|
return tech.dynamoBotCount > 1 && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
requires: "2 or more dynamo bots and only 1 bot upgrade",
|
requires: "2 or more dynamo bots and no other bot upgrade",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isDynamoBotUpgrade = true
|
tech.isDynamoBotUpgrade = true
|
||||||
b.convertBotsTo("dynamo-bot")
|
b.convertBotsTo("dynamo-bot")
|
||||||
@@ -1692,7 +1696,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak
|
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak
|
||||||
},
|
},
|
||||||
requires: "mass driver, not pilot wave, tokamak",
|
requires: "mass driver, not pilot wave, tokamak, wormhole",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isAddBlockMass = true
|
tech.isAddBlockMass = true
|
||||||
},
|
},
|
||||||
@@ -1710,7 +1714,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak
|
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && m.fieldUpgrades[m.fieldMode].name !== "wormhole" && !tech.isTokamak
|
||||||
},
|
},
|
||||||
requires: "mass driver, not pilot wave not tokamak",
|
requires: "mass driver, not pilot wave not tokamak, wormhole",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBlockRestitution = true
|
tech.isBlockRestitution = true
|
||||||
},
|
},
|
||||||
@@ -1782,7 +1786,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && !tech.isTokamak
|
return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave" && !tech.isTokamak
|
||||||
},
|
},
|
||||||
requires: "mass driver, not pilot wave not tokamak",
|
requires: "mass driver, not pilot wave, tokamak",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isBlockPowerUps = true
|
tech.isBlockPowerUps = true
|
||||||
},
|
},
|
||||||
@@ -2210,7 +2214,7 @@
|
|||||||
allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1)
|
allowed() { //&& (m.fieldUpgrades[m.fieldMode].name !== "molecular assembler" || m.maxEnergy > 1)
|
||||||
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindField //&& !tech.isRewindGun
|
return m.maxEnergy > 0.99 && m.fieldUpgrades[m.fieldMode].name !== "standing wave" && !tech.isEnergyHealth && !tech.isRewindField //&& !tech.isRewindGun
|
||||||
},
|
},
|
||||||
requires: "not standing wave, mass-energy, max energy reduction, CPT gun",
|
requires: "not standing wave, mass-energy, max energy reduction",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isRewindAvoidDeath = true;
|
tech.isRewindAvoidDeath = true;
|
||||||
},
|
},
|
||||||
@@ -2284,7 +2288,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth
|
return (tech.iceEnergy || tech.isWormholeEnergy || tech.isPiezo || tech.isRailEnergyGain || tech.energySiphon || tech.isEnergyRecovery || tech.dynamoBotCount || tech.isFlipFlopEnergy || tech.isTokamak) && tech.energyRegen !== 0.004 && !tech.isEnergyHealth && !tech.isCrouchRegen
|
||||||
},
|
},
|
||||||
requires: "a way to regen extra energy, not time crystals",
|
requires: "a way to regen extra energy, not time crystals",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
@@ -2331,7 +2335,7 @@
|
|||||||
{
|
{
|
||||||
name: "1st ionization energy",
|
name: "1st ionization energy",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ionization_energy' class="link">1st ionization energy</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Ionization_energy' class="link">1st ionization energy</a>`,
|
||||||
description: `each ${powerUps.orb.heal()} you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>7</strong>`,
|
description: `each ${powerUps.orb.heal()} you collect<br>increases your <strong>maximum</strong> <strong class='color-f'>energy</strong> by <strong>8</strong>`,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 2,
|
frequency: 2,
|
||||||
@@ -2357,8 +2361,8 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "permittivity",
|
name: "weak interaction",
|
||||||
description: "each unused <strong>power up</strong> at the end of a <strong>level</strong><br>adds 4 <strong>maximum</strong> <strong class='color-f'>energy</strong>", // <em>(up to 51 health per level)</em>",
|
description: "each unused <strong>power up</strong> at the end of a <strong>level</strong><br>adds 5 <strong>maximum</strong> <strong class='color-f'>energy</strong>", // <em>(up to 51 health per level)</em>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
@@ -2366,7 +2370,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return !tech.isDroneGrab
|
return !tech.isDroneGrab
|
||||||
},
|
},
|
||||||
requires: "not drone harvester",
|
requires: "not delivery drone",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth
|
tech.isExtraMaxEnergy = true; //tracked by tech.extraMaxHealth
|
||||||
},
|
},
|
||||||
@@ -2375,7 +2379,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "transceiver",
|
name: "electroweak interaction",
|
||||||
description: "unused <strong>power ups</strong> at the end of each <strong>level</strong><br>are still activated <em>(selections are random)</em>",
|
description: "unused <strong>power ups</strong> at the end of each <strong>level</strong><br>are still activated <em>(selections are random)</em>",
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -2384,7 +2388,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.isExtraMaxEnergy
|
return tech.isExtraMaxEnergy
|
||||||
},
|
},
|
||||||
requires: "permittivity",
|
requires: "weak interaction",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isEndLevelPowerUp = true;
|
tech.isEndLevelPowerUp = true;
|
||||||
},
|
},
|
||||||
@@ -2956,7 +2960,7 @@
|
|||||||
{
|
{
|
||||||
name: "Ψ(t) collapse",
|
name: "Ψ(t) collapse",
|
||||||
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Wave_function_collapse' class="link">Ψ(t) collapse</a>`,
|
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Wave_function_collapse' class="link">Ψ(t) collapse</a>`,
|
||||||
description: `enter an <strong class='alt'>alternate reality</strong> after you <strong class='color-r'>research</strong><br>spawn ${powerUps.orb.research(16)}`,
|
description: `enter an <strong class='alt'>alternate reality</strong> after you <strong class='color-r'>research</strong><br>spawn ${powerUps.orb.research(21)}`,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
@@ -3062,9 +3066,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return powerUps.research.count > 4 || build.isExperimentSelection
|
return powerUps.research.count > 3 || build.isExperimentSelection
|
||||||
},
|
},
|
||||||
requires: "at least 5 research",
|
requires: "at least 4 research",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isRerollDamage = true;
|
tech.isRerollDamage = true;
|
||||||
},
|
},
|
||||||
@@ -3330,7 +3334,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.duplicationChance() > 0.99
|
return tech.duplicationChance() > 0.99
|
||||||
},
|
},
|
||||||
requires: "duplication chance above 33%",
|
requires: "duplication chance above 99%",
|
||||||
effect() {
|
effect() {
|
||||||
tech.is111Duplicate = true;
|
tech.is111Duplicate = true;
|
||||||
tech.maxDuplicationEvent()
|
tech.maxDuplicationEvent()
|
||||||
@@ -3769,7 +3773,7 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.nailRecoil && !tech.nailRecoil
|
return tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.isIceCrystals && !tech.isRivets && !tech.nailRecoil
|
||||||
},
|
},
|
||||||
requires: "nail gun, not ice crystal, rivets, rotary cannon, or pneumatic actuator",
|
requires: "nail gun, not ice crystal, rivets, rotary cannon, or pneumatic actuator",
|
||||||
effect() {
|
effect() {
|
||||||
@@ -4847,7 +4851,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("drones", false) || tech.isForeverDrones
|
return tech.haveGunCheck("drones", false) || tech.isForeverDrones
|
||||||
},
|
},
|
||||||
requires: "drone gun",
|
requires: "drone gun or fault tolerance",
|
||||||
effect() {
|
effect() {
|
||||||
const num = 8
|
const num = 8
|
||||||
tech.isForeverDrones += num
|
tech.isForeverDrones += num
|
||||||
@@ -5181,7 +5185,7 @@
|
|||||||
isBot: true,
|
isBot: true,
|
||||||
isBotTech: true,
|
isBotTech: true,
|
||||||
isNonRefundable: true,
|
isNonRefundable: true,
|
||||||
requires: "NOT EXPERIMENT MODE, foam gun",
|
requires: "NOT EXPERIMENT MODE, foam gun, no other bot upgrades",
|
||||||
allowed() {
|
allowed() {
|
||||||
return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade()
|
return tech.haveGunCheck("foam", false) && !b.hasBotUpgrade()
|
||||||
},
|
},
|
||||||
@@ -5377,7 +5381,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "laser diode",
|
name: "laser diode",
|
||||||
description: "all <strong class='color-laser'>lasers</strong> drain <strong>30%</strong> less <strong class='color-f'>energy</strong><br><em>affects laser-gun, laser-bot, and laser-mines</em>",
|
description: "all <strong class='color-laser'>lasers</strong> drain <strong>30%</strong> less <strong class='color-f'>energy</strong><br><em>affects laser-gun, laser-bot, laser-mines, pulse</em>",
|
||||||
isGunTech: true,
|
isGunTech: true,
|
||||||
maxCount: 1,
|
maxCount: 1,
|
||||||
count: 0,
|
count: 0,
|
||||||
@@ -5824,9 +5828,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth && !tech.isFreeWormHole
|
return m.fieldUpgrades[m.fieldMode].name === "negative mass" && !tech.isEnergyHealth
|
||||||
},
|
},
|
||||||
requires: "wormhole or negative mass, not mass-energy, charmed baryon",
|
requires: "negative mass, not mass-energy",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isNeutronium = true
|
tech.isNeutronium = true
|
||||||
tech.baseFx *= 0.66
|
tech.baseFx *= 0.66
|
||||||
@@ -6152,7 +6156,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
|
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
|
||||||
},
|
},
|
||||||
requires: "plasma torch",
|
requires: "plasma torch or molecular assembler",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isTokamak = true;
|
tech.isTokamak = true;
|
||||||
},
|
},
|
||||||
@@ -6368,7 +6372,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0
|
return (m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && tech.energyRegen !== 0
|
||||||
},
|
},
|
||||||
requires: "time dilation, not ground state",
|
requires: "time dilation or pilot wave, not ground state",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
tech.energyRegen = 0.004;
|
tech.energyRegen = 0.004;
|
||||||
m.fieldRegen = tech.energyRegen;
|
m.fieldRegen = tech.energyRegen;
|
||||||
@@ -6389,7 +6393,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking")
|
return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking")
|
||||||
},
|
},
|
||||||
requires: "cloaking, wormhole or time dilation and below 100% duplication chance",
|
requires: "cloaking, time dilation, or pilot wave",
|
||||||
effect() {
|
effect() {
|
||||||
tech.cloakDuplication = 0.4
|
tech.cloakDuplication = 0.4
|
||||||
powerUps.setDupChance(); //needed after adjusting duplication chance
|
powerUps.setDupChance(); //needed after adjusting duplication chance
|
||||||
@@ -6411,7 +6415,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "time dilation"
|
return m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "time dilation"
|
||||||
},
|
},
|
||||||
requires: "metamaterial cloaking",
|
requires: "cloaking or time dilation",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isAddRemoveMaxHealth = true
|
tech.isAddRemoveMaxHealth = true
|
||||||
},
|
},
|
||||||
@@ -6536,7 +6540,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1)
|
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && (build.isExperimentSelection || powerUps.research.count > 1)
|
||||||
},
|
},
|
||||||
requires: "metamaterial cloaking pilot wave or plasma torch",
|
requires: "cloaking, pilot wave, or plasma torch",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isCloakingDamage = true
|
tech.isCloakingDamage = true
|
||||||
for (let i = 0; i < 2; i++) {
|
for (let i = 0; i < 2; i++) {
|
||||||
@@ -6559,7 +6563,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
|
return m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "metamaterial cloaking" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "molecular assembler"
|
||||||
},
|
},
|
||||||
requires: "metamaterial cloaking, plasma torch or pilot wave",
|
requires: "metamaterial cloaking, molecular assembler, plasma torch or pilot wave",
|
||||||
effect() {
|
effect() {
|
||||||
tech.aimDamage = 1.40
|
tech.aimDamage = 1.40
|
||||||
b.setFireCD();
|
b.setFireCD();
|
||||||
@@ -6599,7 +6603,7 @@
|
|||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
|
return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
|
||||||
},
|
},
|
||||||
requires: "wormhole",
|
requires: "wormhole or pilot wave",
|
||||||
effect: () => {
|
effect: () => {
|
||||||
tech.wimpCount++
|
tech.wimpCount++
|
||||||
spawn.WIMP()
|
spawn.WIMP()
|
||||||
@@ -6730,9 +6734,9 @@
|
|||||||
frequency: 2,
|
frequency: 2,
|
||||||
frequencyDefault: 2,
|
frequencyDefault: 2,
|
||||||
allowed() {
|
allowed() {
|
||||||
return m.fieldUpgrades[m.fieldMode].name === "wormhole" && !tech.isNeutronium
|
return m.fieldUpgrades[m.fieldMode].name === "wormhole"
|
||||||
},
|
},
|
||||||
requires: "wormhole, not neutronium",
|
requires: "wormhole",
|
||||||
effect() {
|
effect() {
|
||||||
tech.isFreeWormHole = true
|
tech.isFreeWormHole = true
|
||||||
tech.baseFx *= 0.66
|
tech.baseFx *= 0.66
|
||||||
|
|||||||
38
todo.txt
38
todo.txt
@@ -1,38 +1,32 @@
|
|||||||
******************************************************** NEXT PATCH **************************************************
|
******************************************************** NEXT PATCH **************************************************
|
||||||
|
|
||||||
tech: inductive coupling - regen is increased by 500%, but you only regen when crouched
|
block throwing and mines when crouched now have trajectory prediction, like grenades
|
||||||
|
|
||||||
tech gun turret gives 55% -> 60% harm reduction
|
all bot upgrades are about 20% better
|
||||||
also I fixed a bug where it was giving 45% not 55%
|
Ψ(t) collapse gives 16->21 research
|
||||||
|
spores and drones have up to 20% shorter life span when the number of active bullets is high
|
||||||
|
|
||||||
old tech inductive coupling is renamed: permittivity
|
1st ionization energy gives 7 -> 8 max energy per heal
|
||||||
permittivity gives 3 -> 4 max energy per unused power up
|
permittivity renamed weak interaction
|
||||||
1st ionization energy gives 6 -> 7 max energy per heal
|
weak interaction gives 4 -> 5 max energy per unused power up
|
||||||
|
transceiver renamed electroweak interaction
|
||||||
tech expansion - no longer costs energy to expand standing wave field
|
fixed about 70 different requirement text situations
|
||||||
|
|
||||||
JUNK tech planetesimals now can spawn tech in n-gon
|
|
||||||
or kill the player in n-gon
|
|
||||||
|
|
||||||
******************************************************** TODO ********************************************************
|
******************************************************** TODO ********************************************************
|
||||||
|
|
||||||
|
need a mine tech that mines there be fewer mines
|
||||||
|
disables booby trap
|
||||||
|
makes mines do more damage
|
||||||
|
|
||||||
|
tech: after bullets hit a mob, the mob takes 1% more damage
|
||||||
|
this.damageReduction *= 1.01
|
||||||
|
|
||||||
tech: open a new tab for n-gon, spawn things in the original game based on events in new game
|
tech: open a new tab for n-gon, spawn things in the original game based on events in new game
|
||||||
if you die in new die in original?
|
if you die in new die in original?
|
||||||
new is n-gon classic?
|
new is n-gon classic?
|
||||||
make a JUNK tech?
|
make a JUNK tech?
|
||||||
if you die in original open a tab with a new n-gon that starts on a random level with a random load out. if you clear the level you come back to life in the original?
|
if you die in original open a tab with a new n-gon that starts on a random level with a random load out. if you clear the level you come back to life in the original?
|
||||||
|
|
||||||
|
|
||||||
give all duplicated power ups a half life that scales with the duplication chance
|
|
||||||
metastability reduces the half life
|
|
||||||
how to communicate the half-life?
|
|
||||||
|
|
||||||
tech: after bullets hit a mob, the mob takes 1% more damage
|
|
||||||
this.damageReduction *= 1.01
|
|
||||||
|
|
||||||
make CPT gun a tech for time dilation field
|
|
||||||
tech: CPT - time dilation field rewinds your health velocity and position
|
|
||||||
|
|
||||||
bug - death while paused crashes game?
|
bug - death while paused crashes game?
|
||||||
|
|
||||||
tech: aerodynamic heating - railgun rods super heat the air around it doing AoE damage
|
tech: aerodynamic heating - railgun rods super heat the air around it doing AoE damage
|
||||||
|
|||||||
Reference in New Issue
Block a user