iridescence

tech: iridescence - laser does 100% damage to mobs hit near their center
tech: lens - laser does extra damage if you fire through a lens that revolves around you
  tech: arc length - increase the size of the lens

virtual particles costs 4->6 research for 11% duplication
quantum eraser has less duplication chance at higher difficulty modes
community map temple updates

bug fixes
This commit is contained in:
landgreen
2022-07-02 16:47:19 -07:00
parent b0d455935f
commit 59085ef2af
5 changed files with 1672 additions and 195 deletions

View File

@@ -2384,18 +2384,30 @@ const b = {
}; };
const laserHitMob = function() { const laserHitMob = function() {
if (best.who.alive) { if (best.who.alive) {
best.who.damage(damage);
best.who.locatePlayer(); best.who.locatePlayer();
if (best.who.damageReduction) { if (best.who.damageReduction) {
simulation.drawList.push({ //add dmg to draw queue if ( //crit
x: path[path.length - 1].x, tech.laserCrit && !best.who.shield &&
y: path[path.length - 1].y, Vector.dot(Vector.normalise(Vector.sub(best.who.position, path[path.length - 1])), Vector.normalise(Vector.sub(path[path.length - 1], path[path.length - 2]))) > 0.99 - 0.6 / best.who.radius
// radius: Math.sqrt(damage) * 100 * mob[k].damageReduction, ) {
// radius: 600 * damage * best.who.damageReduction, damage *= 2
radius: Math.sqrt(2000 * damage * best.who.damageReduction) + 2, simulation.drawList.push({ //add dmg to draw queue
color: tech.laserColorAlpha, x: path[path.length - 1].x,
time: simulation.drawTime y: path[path.length - 1].y,
}); radius: Math.sqrt(2500 * damage * best.who.damageReduction) + 5,
color: `hsla(${60 + 283*Math.random()},100%,70%,0.5)`, // random hue, but not red
time: 16
});
} else {
simulation.drawList.push({ //add dmg to draw queue
x: path[path.length - 1].x,
y: path[path.length - 1].y,
radius: Math.sqrt(2000 * damage * best.who.damageReduction) + 2,
color: tech.laserColorAlpha,
time: simulation.drawTime
});
}
best.who.damage(damage);
} }
if (tech.isLaserPush) { //push mobs away if (tech.isLaserPush) { //push mobs away
const index = path.length - 1 const index = path.length - 1
@@ -3878,7 +3890,7 @@ const b = {
bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech bullet[me].beforeDmg = function(who) { //beforeDmg is rewritten with ice crystal tech
if (tech.isNailRadiation) mobs.statusDoT(who, dmg * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles if (tech.isNailRadiation) mobs.statusDoT(who, dmg * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
} }
} }
@@ -3912,7 +3924,7 @@ const b = {
} }
if (!immune) { if (!immune) {
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 220 + 50 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 220 + 50 * Math.random()); //makes bullet do explosive damage at end
} }
} else if (tech.isCritKill) b.crit(who, this) } else if (tech.isCritKill) b.crit(who, this)
@@ -3970,7 +3982,7 @@ const b = {
} }
if (!immune) { if (!immune) {
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 220 + 50 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 220 + 50 * Math.random()); //makes bullet do explosive damage at end
} }
} else if (tech.isCritKill) b.crit(who, this) } else if (tech.isCritKill) b.crit(who, this)
@@ -5117,7 +5129,7 @@ const b = {
b.explosion(this.position, 100 + (Math.random() - 0.5) * 20); //makes bullet do explosive damage at end b.explosion(this.position, 100 + (Math.random() - 0.5) * 20); //makes bullet do explosive damage at end
} }
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 300 + 40 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 300 + 40 * Math.random()); //makes bullet do explosive damage at end
} }
} else if (tech.isCritKill) b.crit(who, this) } else if (tech.isCritKill) b.crit(who, this)
@@ -5203,7 +5215,7 @@ const b = {
b.explosion(this.position, 100 + (Math.random() - 0.5) * 20); //makes bullet do explosive damage at end b.explosion(this.position, 100 + (Math.random() - 0.5) * 20); //makes bullet do explosive damage at end
} }
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 300 + 40 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 300 + 40 * Math.random()); //makes bullet do explosive damage at end
} }
} else if (tech.isCritKill) b.crit(who, this) } else if (tech.isCritKill) b.crit(who, this)
@@ -5292,7 +5304,7 @@ const b = {
mobs.statusSlow(who, 60) mobs.statusSlow(who, 60)
if (tech.isNailRadiation) mobs.statusDoT(who, 1 * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles if (tech.isNailRadiation) mobs.statusDoT(who, 1 * (tech.isFastRadiation ? 1.3 : 0.44), tech.isSlowRadiation ? 360 : (tech.isFastRadiation ? 60 : 180)) // one tick every 30 cycles
if (tech.isNailCrit) { if (tech.isNailCrit) {
if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 2 / who.radius) { if (!who.shield && Vector.dot(Vector.normalise(Vector.sub(who.position, this.position)), Vector.normalise(this.velocity)) > 0.97 - 1 / who.radius) {
b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, 150 + 30 * Math.random()); //makes bullet do explosive damage at end
} }
} }
@@ -7009,19 +7021,52 @@ const b = {
have: false, have: false,
charge: 0, charge: 0,
isStuckOn: false, isStuckOn: false,
angle: 0,
arcRange: 0.78, //1.57,
isInsideArc(angle) {
const mod = (a, n) => {
return a - Math.floor(a / n) * n
}
let diff = mod(angle - this.angle + Math.PI, 2 * Math.PI) - Math.PI
return Math.abs(diff) < this.arcRange
},
lensDamage: 1,
lens() {
this.stuckOn();
this.angle += 0.02
if (this.isInsideArc(m.angle)) {
this.lensDamage = 2.5 //150% damage increase
} else {
this.lensDamage = 1
}
const radius = 60
ctx.beginPath();
ctx.arc(m.pos.x, m.pos.y, radius, this.angle - this.arcRange, this.angle + this.arcRange);
ctx.strokeStyle = '#fff' //'rgba(255,255,255,0.9)' //'hsl(189, 100%, 95%)' //tech.laserColor
ctx.lineWidth = (this.lensDamage > 1) ? 10 : 2 //3
ctx.stroke();
// const a = { x: radius * Math.cos(this.angle + this.arcRange), y: radius * Math.sin(this.angle + this.arcRange) }
// const b = Vector.add(m.pos, a)
// ctx.lineTo(b.x, b.y)
// ctx.fillStyle = '#fff'
// ctx.fill()
},
stuckOn() {
if (tech.isStuckOn) {
if (this.isStuckOn) {
if (!input.fire) this.fire();
if (m.energy < tech.laserFieldDrain * tech.isLaserDiode) this.isStuckOn = false
} else if (input.fire) {
this.isStuckOn = true
}
}
},
do() {}, do() {},
fire() {}, fire() {},
chooseFireMethod() { chooseFireMethod() {
this.do = () => { this.lensDamage = 1
if (tech.isStuckOn) { if (tech.isLaserLens) this.do = this.lens
if (this.isStuckOn) {
if (!input.fire) this.fire();
if (m.energy < tech.laserFieldDrain * tech.isLaserDiode) this.isStuckOn = false
} else if (input.fire) {
this.isStuckOn = true
}
}
};
if (tech.isPulseLaser) { if (tech.isPulseLaser) {
this.fire = () => { this.fire = () => {
const drain = 0.01 * tech.isLaserDiode * (tech.isCapacitor ? 10 : 1) const drain = 0.01 * tech.isLaserDiode * (tech.isCapacitor ? 10 : 1)
@@ -7037,6 +7082,7 @@ const b = {
const len = 1 + tech.historyLaser const len = 1 + tech.historyLaser
const spacing = Math.ceil(30 - 2 * tech.historyLaser) const spacing = Math.ceil(30 - 2 * tech.historyLaser)
this.do = () => { this.do = () => {
if (tech.isLaserLens) this.lens()
if (this.charge > 0) { if (this.charge > 0) {
//draw charge level //draw charge level
const mag = 4.1 * Math.sqrt(this.charge) const mag = 4.1 * Math.sqrt(this.charge)
@@ -7056,7 +7102,7 @@ const b = {
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
const history = m.history[(m.cycle - i * spacing) % 600] const history = m.history[(m.cycle - i * spacing) % 600]
const off = history.yOff - 24.2859 const off = history.yOff - 24.2859
b.pulse(1.65 * this.charge, history.angle, { x: history.position.x, y: history.position.y - off }) b.pulse(1.65 * this.charge * this.lensDamage, history.angle, { x: history.position.x, y: history.position.y - off })
} }
} }
this.charge = 0; this.charge = 0;
@@ -7065,6 +7111,7 @@ const b = {
}; };
} else { } else {
this.do = () => { this.do = () => {
if (tech.isLaserLens) this.lens()
if (this.charge > 0) { if (this.charge > 0) {
//draw charge level //draw charge level
ctx.beginPath(); ctx.beginPath();
@@ -7081,7 +7128,7 @@ const b = {
const angle = m.angle - tech.beamSplitter * divergence / 2 const angle = m.angle - tech.beamSplitter * divergence / 2
for (let i = 0; i < 1 + tech.beamSplitter; i++) b.pulse(this.charge, angle + i * divergence) for (let i = 0; i < 1 + tech.beamSplitter; i++) b.pulse(this.charge, angle + i * divergence)
} else { } else {
b.pulse(1.8 * this.charge, m.angle) b.pulse(1.8 * this.charge * this.lensDamage, m.angle)
} }
} }
this.charge = 0; this.charge = 0;
@@ -7118,12 +7165,10 @@ const b = {
b.laser(where, { b.laser(where, {
x: where.x + 3000 * Math.cos(m.angle), x: where.x + 3000 * Math.cos(m.angle),
y: where.y + 3000 * Math.sin(m.angle) y: where.y + 3000 * Math.sin(m.angle)
}, tech.laserDamage / b.fireCDscale); }, tech.laserDamage / b.fireCDscale * this.lensDamage);
} }
}, },
firePulse() { firePulse() {},
},
fireSplit() { fireSplit() {
if (m.energy < tech.laserFieldDrain) { if (m.energy < tech.laserFieldDrain) {
m.fireCDcycle = m.cycle + 100; // cool down if out of energy m.fireCDcycle = m.cycle + 100; // cool down if out of energy
@@ -7133,7 +7178,7 @@ const b = {
// const divergence = input.down ? 0.15 : 0.2 // const divergence = input.down ? 0.15 : 0.2
// const scale = Math.pow(0.9, tech.beamSplitter) // const scale = Math.pow(0.9, tech.beamSplitter)
// const pushScale = scale * scale // const pushScale = scale * scale
let dmg = tech.laserDamage / b.fireCDscale // * scale //Math.pow(0.9, tech.laserDamage) let dmg = tech.laserDamage / b.fireCDscale * this.lensDamage // * scale //Math.pow(0.9, tech.laserDamage)
const where = { const where = {
x: m.pos.x + 20 * Math.cos(m.angle), x: m.pos.x + 20 * Math.cos(m.angle),
y: m.pos.y + 20 * Math.sin(m.angle) y: m.pos.y + 20 * Math.sin(m.angle)
@@ -7166,7 +7211,7 @@ const b = {
x: 7.5 * Math.cos(m.angle - Math.PI / 2), x: 7.5 * Math.cos(m.angle - Math.PI / 2),
y: 7.5 * Math.sin(m.angle - Math.PI / 2) y: 7.5 * Math.sin(m.angle - Math.PI / 2)
} }
const dmg = 0.70 * tech.laserDamage / b.fireCDscale // 3.5 * 0.55 = 200% more damage const dmg = 0.70 * tech.laserDamage / b.fireCDscale * this.lensDamage // 3.5 * 0.55 = 200% more damage
const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) } const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) }
const eye = { const eye = {
x: m.pos.x + 15 * Math.cos(m.angle), x: m.pos.x + 15 * Math.cos(m.angle),
@@ -7177,6 +7222,9 @@ const b = {
ctx.globalAlpha = 0.5; ctx.globalAlpha = 0.5;
ctx.beginPath(); ctx.beginPath();
if (Matter.Query.ray(map, eye, where).length === 0 && Matter.Query.ray(body, eye, where).length === 0) { if (Matter.Query.ray(map, eye, where).length === 0 && Matter.Query.ray(body, eye, where).length === 0) {
// this.isInsideArc(m.angle) ? 8 : 3
//where = {x: m.pos.x + 20 * Math.cos(m.angle),y: m.pos.y + 20 * Math.sin(m.angle)}, whereEnd = {x: where.x + 3000 * Math.cos(m.angle),y: where.y + 3000 * Math.sin(m.angle)}, dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1) {
b.laser(eye, { b.laser(eye, {
x: eye.x + range.x, x: eye.x + range.x,
y: eye.y + range.y y: eye.y + range.y
@@ -7218,7 +7266,7 @@ const b = {
} else { } else {
m.fireCDcycle = m.cycle m.fireCDcycle = m.cycle
m.energy -= m.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode / b.fireCDscale m.energy -= m.fieldRegen + tech.laserFieldDrain * tech.isLaserDiode / b.fireCDscale
const dmg = 0.4 * tech.laserDamage / b.fireCDscale // 3.5 * 0.55 = 200% more damage const dmg = 0.4 * tech.laserDamage / b.fireCDscale * this.lensDamage // 3.5 * 0.55 = 200% more damage
const spacing = Math.ceil(4 - 0.3 * tech.historyLaser) const spacing = Math.ceil(4 - 0.3 * tech.historyLaser)
ctx.beginPath(); ctx.beginPath();
b.laser({ b.laser({

File diff suppressed because it is too large Load Diff

View File

@@ -3297,7 +3297,7 @@ const m = {
Matter.Composite.remove(engine.world, body[i]); Matter.Composite.remove(engine.world, body[i]);
body.splice(i, 1); body.splice(i, 1);
m.fieldRange *= 0.8 m.fieldRange *= 0.8
if (tech.isWormholeEnergy) m.energy += 0.53 if (tech.isWormholeEnergy) m.energy += 0.5
if (tech.isWormholeWorms) { //pandimensional spermia if (tech.isWormholeWorms) { //pandimensional spermia
b.worm(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) b.worm(Vector.add(m.hole.pos2, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random())))
Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -10)); Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), -10));
@@ -3320,7 +3320,7 @@ const m = {
body.splice(i, 1); body.splice(i, 1);
m.fieldRange *= 0.8 m.fieldRange *= 0.8
// if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2 // if (tech.isWormholeEnergy && m.energy < m.maxEnergy * 2) m.energy = m.maxEnergy * 2
if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.53 if (tech.isWormholeEnergy && m.immuneCycle < m.cycle) m.energy += 0.5
if (tech.isWormholeWorms) { //pandimensional spermia if (tech.isWormholeWorms) { //pandimensional spermia
b.worm(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random()))) b.worm(Vector.add(m.hole.pos1, Vector.rotate({ x: m.fieldRange * 0.4, y: 0 }, 2 * Math.PI * Math.random())))
Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5)); Matter.Body.setVelocity(bullet[bullet.length - 1], Vector.mult(Vector.rotate(m.hole.unit, Math.PI / 2), 5));

View File

@@ -256,7 +256,7 @@ const tech = {
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication) return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + 0.05 * tech.isExtraGunField + m.duplicateChance + tech.fieldDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0) + tech.isQuantumEraserDuplication * (1 - 0.01 * (simulation.difficultyMode ** 2)))
}, },
isScaleMobsWithDuplication: false, isScaleMobsWithDuplication: false,
maxDuplicationEvent() { maxDuplicationEvent() {
@@ -812,7 +812,7 @@ const tech = {
{ {
name: "microstates", name: "microstates",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Microstate_(statistical_mechanics)' class="link">microstates</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Microstate_(statistical_mechanics)' class="link">microstates</a>`,
description: "for each active <strong>bullets / bots</strong><br><strong>+0.7%</strong> <strong class='color-d'>damage</strong>", description: "for each active <strong>bullet / bot</strong><br><strong>+0.7%</strong> <strong class='color-d'>damage</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3998,7 +3998,7 @@ const tech = {
}, },
{ {
name: "supercritical fission", name: "supercritical fission",
description: "if bullets strike mobs near their <strong>center</strong><br>they can <strong class='color-e'>explode</strong> <em style = 'font-size:95%;'>(nails, needles, rivets)</em>", description: "if <strong>nails</strong>, <strong>needles</strong>, or <strong>rivets</strong> strike mobs<br>near their <strong>center</strong> they can <strong class='color-e'>explode</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5867,7 +5867,7 @@ const tech = {
allowed() { allowed() {
return tech.haveGunCheck("harpoon") && !tech.isFilament && !tech.isHarpoonPowerUp && !tech.isRailGun && !tech.isFireMoveLock return tech.haveGunCheck("harpoon") && !tech.isFilament && !tech.isHarpoonPowerUp && !tech.isRailGun && !tech.isFireMoveLock
}, },
requires: "harpoon, not railgun, UHMWPE, toggling harpoon, Higgs mechanism", requires: "harpoon, not railgun, UHMWPE, induction furnace, Higgs mechanism",
effect() { effect() {
tech.isGrapple = true; tech.isGrapple = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun for (i = 0, len = b.guns.length; i < len; i++) { //find which gun
@@ -6061,7 +6061,7 @@ const tech = {
effect() { effect() {
let techGiven = 0 let techGiven = 0
for (let j = 0; j < 3; j++) { for (let j = 0; j < 3; j++) {
const names = ["laser diode", "free-electron laser", "relativistic momentum", "specular reflection", "diffraction grating", "diffuse beam", "output coupler", "slow light"] const names = ["lens", "arc length", "laser diode", "free-electron laser", "relativistic momentum", "specular reflection", "diffraction grating", "diffuse beam", "output coupler", "slow light"]
//convert names into indexes //convert names into indexes
const options = [] const options = []
for (let i = 0; i < names.length; i++) { for (let i = 0; i < names.length; i++) {
@@ -6089,7 +6089,7 @@ const tech = {
} }
if (techGiven > 0) { if (techGiven > 0) {
tech.isStuckOn = true tech.isStuckOn = true
} else { } else { //eject if none found
simulation.makeTextLog(`0 <span class='color-var'>tech</span> found <em>//optical amplifier</em>`); simulation.makeTextLog(`0 <span class='color-var'>tech</span> found <em>//optical amplifier</em>`);
const loop = () => { const loop = () => {
if (!simulation.paused && m.alive) { if (!simulation.paused && m.alive) {
@@ -6157,7 +6157,7 @@ const tech = {
}, },
{ {
name: "relativistic momentum", name: "relativistic momentum",
description: "all <strong class='color-laser'>lasers</strong> push <strong>mobs</strong> and <strong class='color-block'>blocks</strong><br><em>affects laser-gun, laser-bot, and laser-mines</em>", description: "<strong class='color-laser'>lasers</strong> push <strong>mobs</strong> and <strong class='color-block'>blocks</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6174,9 +6174,69 @@ const tech = {
tech.isLaserPush = false; tech.isLaserPush = false;
} }
}, },
{
name: "iridescence",
// description: "if a <strong class='color-laser'>laser</strong> hits a mob at a low angle of illumination<br><strong>+66%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
description: "if mobs are struck near their <strong>center</strong><br><strong>+66%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
isGunTech: true,
maxCount: 3,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (tech.haveGunCheck("laser") && !tech.isPulseLaser) || tech.isLaserBotUpgrade || tech.isLaserMine
},
requires: "laser, not pulse",
effect() {
tech.laserCrit = true;
},
remove() {
tech.laserCrit = false;
}
},
{
name: "lens",
description: "if directed through a revolving <strong><span style='font-size: 125%;'>π</span> / 4</strong> circular arc<br><strong>+150%</strong> <strong class='color-laser'>laser</strong> gun <strong class='color-d'>damage</strong>",
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.haveGunCheck("laser")
},
requires: "laser",
effect() {
tech.isLaserLens = true
b.guns[11].chooseFireMethod()
},
remove() {
tech.isLaserLens = false
b.guns[11].chooseFireMethod()
}
},
{
name: "arc length",
description: "increase the circular arc of your <strong class='color-laser'>laser</strong> <strong>lens</strong><br>by <strong>+<span style='font-size: 125%;'>π</span> / 4</strong>",
isGunTech: true,
maxCount: 3,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return tech.isLaserLens && tech.haveGunCheck("laser")
},
requires: "laser gun, lens",
effect() {
b.guns[11].arcRange += 0.78
},
remove() {
b.guns[11].arcRange = 0.78
}
},
{ {
name: "specular reflection", name: "specular reflection",
description: "<strong>+2</strong> <strong class='color-laser'>laser</strong> reflections<br><em>affects laser-gun, laser-bot, and laser-mines</em>", description: "<strong>+2</strong> <strong class='color-laser'>laser</strong> beam reflections",
isGunTech: true, isGunTech: true,
maxCount: 3, maxCount: 3,
count: 0, count: 0,
@@ -6195,7 +6255,7 @@ const tech = {
}, },
{ {
name: "diffraction grating", name: "diffraction grating",
description: `<strong>+1</strong> angled <strong class='color-laser'>laser</strong> gun beam`, description: `<strong>+1</strong> <strong class='color-laser'>laser</strong> gun beam`,
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -6207,23 +6267,19 @@ const tech = {
requires: "laser gun, not neocognitron, diffuse beam, or slow light", requires: "laser gun, not neocognitron, diffuse beam, or slow light",
effect() { effect() {
tech.beamSplitter++ tech.beamSplitter++
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
}, },
remove() { remove() {
if (tech.beamSplitter !== 0) { if (tech.beamSplitter !== 0) {
tech.beamSplitter = 0 tech.beamSplitter = 0
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
} }
} }
}, },
{ {
name: "diffuse beam", name: "diffuse beam",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Diffuser_(optics)' class="link">diffuse beam</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Diffuser_(optics)' class="link">diffuse beam</a>`,
description: "<strong class='color-laser'>laser</strong> beam is <strong>wider</strong> and doesn't <strong>reflect</strong><br><strong>+220%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>", description: "<strong class='color-laser'>laser</strong> gun beam is <strong>wider</strong> and doesn't <strong>reflect</strong><br><strong>+220%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6236,23 +6292,19 @@ const tech = {
effect() { effect() {
if (tech.wideLaser === 0) tech.wideLaser = 3 if (tech.wideLaser === 0) tech.wideLaser = 3
tech.isWideLaser = true; tech.isWideLaser = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
}, },
remove() { remove() {
if (tech.isWideLaser) { if (tech.isWideLaser) {
// tech.wideLaser = 0 // tech.wideLaser = 0
tech.isWideLaser = false; tech.isWideLaser = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
} }
} }
}, },
{ {
name: "output coupler", name: "output coupler",
description: "<strong>+30%</strong> <strong class='color-laser'>laser</strong> beam <strong>width</strong><br><strong>+30%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>", description: "<strong>+30%</strong> <strong class='color-laser'>laser</strong> gun beam <strong>width</strong><br><strong>+30%</strong> <strong class='color-laser'>laser</strong> <strong class='color-d'>damage</strong>",
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -6264,9 +6316,7 @@ const tech = {
requires: "laser gun, diffuse beam", requires: "laser gun, diffuse beam",
effect() { effect() {
tech.wideLaser += 2 tech.wideLaser += 2
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
}, },
remove() { remove() {
if (tech.isWideLaser) { if (tech.isWideLaser) {
@@ -6274,14 +6324,12 @@ const tech = {
} else { } else {
tech.wideLaser = 0 tech.wideLaser = 0
} }
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
} }
}, },
{ {
name: "slow light", name: "slow light",
description: "<strong class='color-laser'>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br><strong>+300%</strong> total beam <strong class='color-d'>damage</strong>", description: "<strong class='color-laser'>laser</strong> gun beam is <strong>spread</strong> into your recent <strong>past</strong><br><strong>+300%</strong> total beam <strong class='color-d'>damage</strong>",
isGunTech: true, isGunTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -6294,17 +6342,13 @@ const tech = {
effect() { effect() {
// this.description = `add 5 more <strong>laser</strong> beams into into your past` // this.description = `add 5 more <strong>laser</strong> beams into into your past`
tech.historyLaser++ tech.historyLaser++
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
}, },
remove() { remove() {
// this.description = "<strong>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br>increase total beam <strong class='color-d'>damage</strong> by <strong>300%</strong>" // this.description = "<strong>laser</strong> beam is <strong>spread</strong> into your recent <strong>past</strong><br>increase total beam <strong class='color-d'>damage</strong> by <strong>300%</strong>"
if (tech.historyLaser) { if (tech.historyLaser) {
tech.historyLaser = 0 tech.historyLaser = 0
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
} }
} }
}, },
@@ -6322,16 +6366,12 @@ const tech = {
requires: "laser gun, not specular reflection, diffuse, free-electron laser, optical amplifier", requires: "laser gun, not specular reflection, diffuse, free-electron laser, optical amplifier",
effect() { effect() {
tech.isPulseLaser = true; tech.isPulseLaser = true;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
}, },
remove() { remove() {
if (tech.isPulseLaser) { if (tech.isPulseLaser) {
tech.isPulseLaser = false; tech.isPulseLaser = false;
for (i = 0, len = b.guns.length; i < len; i++) { //find which gun b.guns[11].chooseFireMethod()
if (b.guns[i].name === "laser") b.guns[i].chooseFireMethod()
}
} }
} }
}, },
@@ -6918,25 +6958,6 @@ const tech = {
// tech.isPlasmaRange = 1; // tech.isPlasmaRange = 1;
// } // }
// }, // },
{
name: "degenerate matter",
description: "if your <strong class='color-f'>field</strong> is active<br><strong>+75%</strong> <strong class='color-defense'>defense</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth
},
requires: "plasma torch, perfect diamagnetism, pilot wave, not mass-energy",
effect() {
tech.isHarmReduce = true
},
remove() {
tech.isHarmReduce = false;
}
},
{ {
name: "tokamak", name: "tokamak",
description: "throwing a <strong class='color-block'>block</strong> converts it into <strong class='color-f'>energy</strong><br>and a pulsed fusion <strong class='color-e'>explosion</strong>", description: "throwing a <strong class='color-block'>block</strong> converts it into <strong class='color-f'>energy</strong><br>and a pulsed fusion <strong class='color-e'>explosion</strong>",
@@ -6956,6 +6977,25 @@ const tech = {
tech.isTokamak = false; tech.isTokamak = false;
} }
}, },
{
name: "degenerate matter",
description: "if your <strong class='color-f'>field</strong> is active<br><strong>+75%</strong> <strong class='color-defense'>defense</strong>",
isFieldTech: true,
maxCount: 1,
count: 0,
frequency: 2,
frequencyDefault: 2,
allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "plasma torch" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "pilot wave") && !tech.isEnergyHealth
},
requires: "plasma torch, perfect diamagnetism, pilot wave, not mass-energy",
effect() {
tech.isHarmReduce = true
},
remove() {
tech.isHarmReduce = false;
}
},
{ {
name: "plasma-bot", name: "plasma-bot",
link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">plasma-bot</a>`, link: `<a target="_blank" href='https://en.wikipedia.org/wiki/Robot' class="link">plasma-bot</a>`,
@@ -7195,6 +7235,8 @@ const tech = {
}, },
{ {
name: "quantum eraser", name: "quantum eraser",
descriptionFunction() { return `<span style = 'font-size:90%;'>for each mob left <strong>alive</strong> after you exit a <strong>level</strong><br><strong>kill</strong> a mob as they spawn at <strong>${100-simulation.difficultyMode**2}%</strong> <strong class='color-dup'>duplication</strong></span>` },
description: `<span style = 'font-size:90%;'>for each mob left <strong>alive</strong> after you exit a <strong>level</strong><br><strong>kill</strong> a mob as they spawn at <strong>100%</strong> <strong class='color-dup'>duplication</strong></span>`, description: `<span style = 'font-size:90%;'>for each mob left <strong>alive</strong> after you exit a <strong>level</strong><br><strong>kill</strong> a mob as they spawn at <strong>100%</strong> <strong class='color-dup'>duplication</strong></span>`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
@@ -7366,8 +7408,8 @@ const tech = {
isFieldTech: true, isFieldTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 2,
frequencyDefault: 1, frequencyDefault: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation" return m.fieldUpgrades[m.fieldMode].name === "wormhole" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation"
}, },
@@ -7383,33 +7425,33 @@ const tech = {
}, },
{ {
name: "virtual particles", name: "virtual particles",
description: `use ${powerUps.orb.research(4)}to exploit your <strong class='color-f'>field</strong> for a<br><strong>+12%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>`, description: `use ${powerUps.orb.research(6)}to exploit your <strong class='color-f'>field</strong> for a<br><strong>+11%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 3) return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 3)
}, },
requires: "wormhole, time dilation, negative mass", requires: "wormhole, time dilation, negative mass, pilot wave",
effect() { effect() {
tech.fieldDuplicate = 0.12 tech.fieldDuplicate = 0.11
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection && !simulation.isTextLogOpen) simulation.circleFlare(0.13); if (!build.isExperimentSelection && !simulation.isTextLogOpen) simulation.circleFlare(0.13);
for (let i = 0; i < 4; i++) { for (let i = 0; i < 6; i++) {
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
} }
}, },
remove() { remove() {
tech.fieldDuplicate = 0 tech.fieldDuplicate = 0
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (this.count > 0) powerUps.research.changeRerolls(4) if (this.count > 0) powerUps.research.changeRerolls(6)
} }
}, },
{ {
name: "Penrose process", name: "Penrose process",
description: "after a <strong class='color-block'>block</strong> falls into a <strong class='color-worm'>wormhole</strong><br><strong>+53</strong> <strong class='color-f'>energy</strong>", description: "after a <strong class='color-block'>block</strong> falls into a <strong class='color-worm'>wormhole</strong><br><strong>+50</strong> <strong class='color-f'>energy</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -7448,7 +7490,7 @@ const tech = {
}, },
{ {
name: "geodesics", name: "geodesics",
description: `your <strong>projectiles</strong> can traverse <strong class='color-worm'>wormholes</strong><br>spawn 2 <strong class='color-g'>guns</strong> and ${powerUps.orb.ammo(4)}`, description: `your <strong>bullets</strong> can traverse <strong class='color-worm'>wormholes</strong><br>spawn 2 <strong class='color-g'>guns</strong> and ${powerUps.orb.ammo(4)}`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -7474,7 +7516,7 @@ const tech = {
}, },
{ {
name: "cosmic string", name: "cosmic string",
description: "after tunneling through mobs with a <strong class='color-worm'>wormhole</strong><br><strong>stun</strong> then and do <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong>", description: "after <strong>tunneling</strong> through mobs with a <strong class='color-worm'>wormhole</strong><br><strong>stun</strong> then and do <strong class='color-p'>radioactive</strong> <strong class='color-d'>damage</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -10429,5 +10471,7 @@ const tech = {
isQuantumEraserDuplication: null, isQuantumEraserDuplication: null,
quantumEraserCount: null, quantumEraserCount: null,
isPhononBlock: null, isPhononBlock: null,
isMicroTransactions: null isMicroTransactions: null,
isLaserLens: null,
laserCrit: null
} }

View File

@@ -1,33 +1,38 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
tech: iridescence - laser does 100% damage to mobs hit near their center
tech: lens - laser does extra damage if you fire through a lens that revolves around you
tech: arc length - increase the size of the lens
tech: resonance - when a block gets vibrated by phonon, it has a chance to spin towards mobs virtual particles costs 4->6 research for 11% duplication
cross disciplinary gives 4% duplication quantum eraser has less duplication chance at higher difficulty modes
boson composite lets you move through elevators again community map temple updates
JUNK tech: microtransactions - buy in-game skins for 1 research anytime you choose a tech
bug fixes bug fixes
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
make buying skins from microtransactions have a lasting effect with a local storage list give laser gun _____ if you fire in an angle range
add a dropdown menu to choose in settings draw angle range as a slowly rotation circle arc around player
maybe just one at a time effect:
bonus damage
extra beams
extra reflections
JUNK tech micro transactions laser tech: critical hits do _______ damage?
all tech selection menus include the option to buy skins for 1 research name? polarized light, iridescence
improve mob invincible graphic
opacity oscillates from 100% to 0%?
make different from stun
hopBossMom hopBossMom
spawns lots of small hopBullets spawns lots of small hopBullets
drops eggs, that hatch into hopBullets drops eggs, that hatch into hopBullets
like sporangium like sporangium
normally runs away from player, but goes closer to drop eggs normally runs away from player, but goes closer to drop eggs
level element: exploding barrels
improve mob invincible graphic
opacity oscillates from 100% to 0%?
make different from stun
junk tech give strange CSS to a keyword junk tech give strange CSS to a keyword
@keyframes bounce-munch { @keyframes bounce-munch {
@@ -38,14 +43,6 @@ junk tech give strange CSS to a keyword
make plasma ball power up and block pick up still work when you have no no energy make plasma ball power up and block pick up still work when you have no no energy
make a unique CD var for plasma ball? make a unique CD var for plasma ball?
give laser gun _____ if you fire in an angle range
draw angle range as a slowly rotation circle arc around player
effect:
bonus damage
extra beams
extra reflections
wormhole tech: entropic gravity - gain defense for each research wormhole tech: entropic gravity - gain defense for each research
requires wormhole or negative mass field or pilot wave requires wormhole or negative mass field or pilot wave