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:
landgreen
2021-11-07 21:09:29 -08:00
parent d77dde462e
commit 95fcdb10b8
6 changed files with 172 additions and 144 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1112,6 +1112,7 @@ 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() {
if (!input.field) {
const cycles = 80 const cycles = 80
const speed = input.down ? 35 : 20 //input.down ? 43 : 32 const speed = input.down ? 35 : 20 //input.down ? 43 : 32
const g = input.down ? 0.137 : 0.135 const g = input.down ? 0.137 : 0.135
@@ -1126,6 +1127,7 @@ const b = {
ctx.stroke() ctx.stroke()
} }
} }
}
} else if (tech.isRPG) { } else if (tech.isRPG) {
b.guns[gunIndex].do = function() {} b.guns[gunIndex].do = function() {}
if (tech.isVacuumBomb) { if (tech.isVacuumBomb) {
@@ -1136,6 +1138,7 @@ 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() {
if (!input.field) {
const cycles = Math.floor(input.down ? 50 : 30) //30 const cycles = Math.floor(input.down ? 50 : 30) //30
const speed = input.down ? 44 : 35 const speed = input.down ? 44 : 35
const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } const v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) }
@@ -1148,9 +1151,11 @@ const b = {
} }
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() {
if (!input.field) {
const cycles = Math.floor(input.down ? 120 : 80) //30 const cycles = Math.floor(input.down ? 120 : 80) //30
const speed = input.down ? 43 : 32 const speed = input.down ? 43 : 32
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 v = { x: speed * Math.cos(m.angle), y: speed * Math.sin(m.angle) } //m.Vy / 2 + removed to make the path less jerky
@@ -1164,6 +1169,7 @@ const b = {
ctx.stroke() ctx.stroke()
} }
} }
}
}, },
harpoon(where, target, angle = m.angle, harpoonLength = 1, isReturn = false, totalCycles = 15) { harpoon(where, target, angle = m.angle, harpoonLength = 1, isReturn = false, totalCycles = 15) {
const me = bullet.length; const me = bullet.length;
@@ -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))
if (this.isUpgraded) {
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)) b.nail(this.position, Vector.mult(unit, SPEED))
this.force = Vector.mult(unit, -0.01 * this.mass) 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) {

View File

@@ -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)
}, },

View File

@@ -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) {

View File

@@ -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

View File

@@ -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