grenade trajectory graphic

grenades display their trajectory, to help you aim
  I'm might get rid of it, but for now we'll try it out

several duplication tech give slightly lower duplication chance
strange attractor now properly includes all your tech in duplication chance (it wasn't updated for recent duplication tech)
This commit is contained in:
landgreen
2021-11-03 21:01:26 -07:00
parent 4aca8d0917
commit b5738e2480
8 changed files with 123 additions and 50 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -741,6 +741,7 @@ const b = {
bullet[me].endCycle = simulation.cycle + Math.floor(input.down ? 120 : 80); bullet[me].endCycle = simulation.cycle + Math.floor(input.down ? 120 : 80);
bullet[me].restitution = 0.4; bullet[me].restitution = 0.4;
bullet[me].do = function() { bullet[me].do = function() {
// console.log(this.mass * 0.0025)
this.force.y += this.mass * 0.0025; //extra gravity for harder arcs this.force.y += this.mass * 0.0025; //extra gravity for harder arcs
}; };
Composite.add(engine.world, bullet[me]); //add bullet to world Composite.add(engine.world, bullet[me]); //add bullet to world
@@ -794,6 +795,7 @@ const b = {
this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion this.endCycle = 0; //bullet ends cycle after doing damage //this also triggers explosion
}; };
speed = input.down ? 46 : 32 speed = input.down ? 46 : 32
Matter.Body.setVelocity(bullet[me], { Matter.Body.setVelocity(bullet[me], {
x: m.Vx / 2 + speed * Math.cos(angle), x: m.Vx / 2 + speed * Math.cos(angle),
y: m.Vy / 2 + speed * Math.sin(angle) y: m.Vy / 2 + speed * Math.sin(angle)
@@ -917,6 +919,8 @@ const b = {
} }
}; };
speed = 35 speed = 35
// speed = input.down ? 43 : 32
bullet[me].endCycle = simulation.cycle + 70; bullet[me].endCycle = simulation.cycle + 70;
if (input.down) { if (input.down) {
speed += 9 speed += 9
@@ -950,6 +954,8 @@ const b = {
Matter.Body.scale(bullet[me], SCALE, SCALE); Matter.Body.scale(bullet[me], SCALE, SCALE);
speed = input.down ? 25 : 15 speed = input.down ? 25 : 15
// speed = input.down ? 43 : 32
Matter.Body.setVelocity(bullet[me], { Matter.Body.setVelocity(bullet[me], {
x: m.Vx / 2 + speed * Math.cos(angle), x: m.Vx / 2 + speed * Math.cos(angle),
y: m.Vy / 2 + speed * Math.sin(angle) y: m.Vy / 2 + speed * Math.sin(angle)
@@ -1092,9 +1098,36 @@ const b = {
} }
} }
} }
let gunIndex = null
for (let i = 0, len = b.guns.length; i < len; i++) {
if (b.guns[i].name === "grenades") {
gunIndex = i
}
}
if (tech.isNeutronBomb) { if (tech.isNeutronBomb) {
b.grenade = grenadeNeutron b.grenade = grenadeNeutron
if (tech.isRPG) {
b.guns[gunIndex].do = function() {}
} else {
if (gunIndex) b.guns[gunIndex].do = function() {
const cycles = 80
const speed = input.down ? 35 : 20 //input.down ? 43 : 32
const g = input.down ? 0.137 : 0.135
const v = { x: m.Vx / 2 + speed * Math.cos(m.angle), y: m.Vy / 2 + speed * Math.sin(m.angle) }
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
ctx.lineWidth = 2
ctx.beginPath()
for (let i = 1, 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 + g * time * time)
}
ctx.stroke()
}
}
} else if (tech.isRPG) { } else if (tech.isRPG) {
b.guns[gunIndex].do = function() {}
if (tech.isVacuumBomb) { if (tech.isVacuumBomb) {
b.grenade = grenadeRPGVacuum b.grenade = grenadeRPGVacuum
} else { } else {
@@ -1102,8 +1135,34 @@ const b = {
} }
} else if (tech.isVacuumBomb) { } else if (tech.isVacuumBomb) {
b.grenade = grenadeVacuum b.grenade = grenadeVacuum
if (gunIndex) b.guns[gunIndex].do = function() {
const cycles = Math.floor(input.down ? 50 : 30) //30
const speed = input.down ? 44 : 35
const v = { x: m.Vx / 2 + speed * Math.cos(m.angle), y: m.Vy / 2 + speed * Math.sin(m.angle) }
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
ctx.lineWidth = 2
ctx.beginPath()
for (let i = 1.6, 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()
}
} else { } else {
b.grenade = grenadeDefault b.grenade = grenadeDefault
if (gunIndex) b.guns[gunIndex].do = function() {
const cycles = Math.floor(input.down ? 120 : 80) //30
const speed = input.down ? 43 : 32
const v = { x: m.Vx / 2 + speed * Math.cos(m.angle), y: m.Vy / 2 + speed * Math.sin(m.angle) }
ctx.strokeStyle = "rgba(68, 68, 68, 0.2)" //color.map
ctx.lineWidth = 2
ctx.beginPath()
for (let i = 0.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()
}
} }
}, },
harpoon(where, target, angle = m.angle, harpoonLength = 1, isReturn = false, totalCycles = 15) { harpoon(where, target, angle = m.angle, harpoonLength = 1, isReturn = false, totalCycles = 15) {
@@ -2437,7 +2496,14 @@ const b = {
if (tech.isIncendiary && simulation.cycle + this.deathCycles < this.endCycle) { if (tech.isIncendiary && simulation.cycle + this.deathCycles < this.endCycle) {
const max = Math.max(Math.min(this.endCycle - simulation.cycle - this.deathCycles, 1500), 0) const max = Math.max(Math.min(this.endCycle - simulation.cycle - this.deathCycles, 1500), 0)
b.explosion(this.position, max * 0.1 + this.isImproved * 110 + 60 * Math.random()); //makes bullet do explosive damage at end b.explosion(this.position, max * 0.1 + this.isImproved * 110 + 60 * Math.random()); //makes bullet do explosive damage at end
if (tech.isForeverDrones) {
this.endCycle = 0
b.drone({ x: m.pos.x + 30 * (Math.random() - 0.5), y: m.pos.y + 30 * (Math.random() - 0.5) }, 5)
bullet[bullet.length - 1].endCycle = Infinity
} else {
this.endCycle -= max this.endCycle -= max
}
} else { } else {
//move away from target after hitting //move away from target after hitting
const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20) const unit = Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), -20)

View File

@@ -223,7 +223,7 @@ const build = {
<strong class='color-d'>damage</strong> increase: ${((tech.damageFromTech()-1)*100).toFixed(0)}% <strong class='color-d'>damage</strong> increase: ${((tech.damageFromTech()-1)*100).toFixed(0)}%
<br><strong class='color-harm'>harm</strong> reduction: ${harm.toFixed(harm > 90 ? 2 : 0)}% <br><strong class='color-harm'>harm</strong> reduction: ${harm.toFixed(harm > 90 ? 2 : 0)}%
<br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}% <br><strong><em>fire delay</em></strong> decrease: ${((1-b.fireCDscale)*100).toFixed(b.fireCDscale < 0.1 ? 2 : 0)}%
<br><strong class='color-dup'>duplication</strong> chance: ${(Math.min(1,tech.duplicationChance())*100).toFixed(0)}% <br><strong class='color-dup'>duplication</strong> chance: ${(tech.duplicationChance()*100).toFixed(0)}%
${botText} ${botText}
<br> <br>
<br><strong class='color-m'>tech</strong>: ${tech.totalCount} &nbsp; <strong class='color-r'>research</strong>: ${powerUps.research.count} <br><strong class='color-m'>tech</strong>: ${tech.totalCount} &nbsp; <strong class='color-r'>research</strong>: ${powerUps.research.count}

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("time dilation") // m.setField("time dilation")
// b.giveGuns("harpoon") // b.giveGuns("grenades")
// tech.giveTech("retrocausality") // tech.giveTech("neutron bomb")
// tech.giveTech("causality bots") // tech.giveTech("vacuum bomb")
// 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")

View File

@@ -1167,7 +1167,7 @@ const mobs = {
} }
} }
if (tech.cloakDuplication && !this.isBoss) { if (tech.cloakDuplication && !this.isBoss) {
tech.cloakDuplication -= 0.01 tech.cloakDuplication -= 0.02
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
} }
} else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) { } else if (tech.isShieldAmmo && this.shield && !this.isExtraShield) {

View File

@@ -2379,10 +2379,10 @@ const spawn = {
this.checkStatus(); this.checkStatus();
}; };
}, },
pulsarBoss(x, y, radius = 90) { pulsarBoss(x, y, radius = 90, isNonCollide = false) {
mobs.spawn(x, y, 3, radius, "#a0f"); mobs.spawn(x, y, 3, radius, "#a0f");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
if (isNonCollide) me.collisionFilter.mask = cat.bullet | cat.player
setTimeout(() => { //fix mob in place, but allow rotation setTimeout(() => { //fix mob in place, but allow rotation
me.constraint = Constraint.create({ me.constraint = Constraint.create({
pointA: { pointA: {

View File

@@ -234,18 +234,21 @@
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
return Math.max(0, (tech.isPowerUpsVanish ? 0.13 : 0) + (tech.isStimulatedEmission ? 0.17 : 0) + tech.cancelCount * 0.045 + tech.duplicateChance + m.duplicateChance + tech.wormDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.5 : 0)) return Math.max(0, (tech.isPowerUpsVanish ? 0.12 : 0) + (tech.isStimulatedEmission ? 0.15 : 0) + tech.cancelCount * 0.04 + tech.duplicateChance + m.duplicateChance + tech.wormDuplicate + tech.cloakDuplication + (tech.isAnthropicTech && tech.isDeathAvoidedThisLevel ? 0.45 : 0))
}, },
isScaleMobsWithDuplication: false, isScaleMobsWithDuplication: false,
maxDuplicationEvent() { maxDuplicationEvent() {
if (tech.is100Duplicate && tech.duplicationChance() > 0.99) { if (tech.is111Duplicate && tech.duplicationChance() > 1.11) {
tech.is100Duplicate = false tech.is111Duplicate = false
const range = 500 const range = 1300
tech.isScaleMobsWithDuplication = true tech.isScaleMobsWithDuplication = true
for (let i = 0, len = 8; i < len; i++) { for (let i = 0, len = 9; i < len; i++) {
const angle = 2 * Math.PI * i / len const angle = 2 * Math.PI * i / len
spawn.randomLevelBoss(m.pos.x + range * Math.cos(angle), m.pos.y + range * Math.sin(angle), spawn.nonCollideBossList); spawn.randomLevelBoss(m.pos.x + range * Math.cos(angle), m.pos.y + range * Math.sin(angle), spawn.nonCollideBossList);
} }
spawn.historyBoss(0, 0)
spawn.pulsarBoss(level.exit.x, level.exit.y, 70, true)
spawn.blockBoss(level.enter.x, level.enter.y)
tech.isScaleMobsWithDuplication = false tech.isScaleMobsWithDuplication = false
} }
}, },
@@ -2850,15 +2853,15 @@
}, },
{ {
name: "weak anthropic principle", name: "weak anthropic principle",
description: "after <strong>anthropic principle</strong> prevents your <strong>death</strong><br>add <strong>50%</strong> <strong class='color-dup'>duplication</strong> chance for that level", description: "after <strong>anthropic principle</strong> prevents your <strong>death</strong><br>add <strong>45%</strong> <strong class='color-dup'>duplication</strong> chance for that level",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return tech.isDeathAvoid && tech.duplicationChance() < 0.66 return tech.isDeathAvoid
}, },
requires: "anthropic principle, below 66% duplication chance", requires: "anthropic principle",
effect() { effect() {
tech.isAnthropicTech = true tech.isAnthropicTech = true
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
@@ -3154,7 +3157,7 @@
}, },
{ {
name: "replication", name: "replication",
description: "<strong>10%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong>+30%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool", description: "<strong>10%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong>+40%</strong> <strong class='color-j'>JUNK</strong> to the potential <strong class='color-m'>tech</strong> pool",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3167,7 +3170,7 @@
tech.duplicateChance += 0.1 tech.duplicateChance += 0.1
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection) simulation.circleFlare(0.1); if (!build.isExperimentSelection) simulation.circleFlare(0.1);
this.refundAmount += tech.addJunkTechToPool(0.3) this.refundAmount += tech.addJunkTechToPool(0.4)
}, },
refundAmount: 0, refundAmount: 0,
remove() { remove() {
@@ -3181,7 +3184,7 @@
}, },
{ {
name: "stimulated emission", name: "stimulated emission",
description: "<strong>17%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>but, after a <strong>collision</strong> eject <strong>1</strong> <strong class='color-m'>tech</strong>", description: "<strong>15%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>but, after a <strong>collision</strong> eject <strong>1</strong> <strong class='color-m'>tech</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3192,8 +3195,8 @@
requires: "below 100% duplication chance", requires: "below 100% duplication chance",
effect: () => { effect: () => {
tech.isStimulatedEmission = true tech.isStimulatedEmission = true
powerUps.setDupChance(0.17); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection) simulation.circleFlare(0.17); if (!build.isExperimentSelection) simulation.circleFlare(0.15);
}, },
remove() { remove() {
tech.isStimulatedEmission = false tech.isStimulatedEmission = false
@@ -3202,7 +3205,7 @@
}, },
{ {
name: "metastability", name: "metastability",
description: "<strong>13%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong class='color-dup'>duplicates</strong> <strong class='color-e'>explode</strong> with a <strong>3</strong> second <strong>half-life</strong> ", description: "<strong>12%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><strong class='color-dup'>duplicates</strong> <strong class='color-e'>explode</strong> with a <strong>3</strong> second <strong>half-life</strong> ",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3214,7 +3217,7 @@
effect: () => { effect: () => {
tech.isPowerUpsVanish = true tech.isPowerUpsVanish = true
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection) simulation.circleFlare(0.13); if (!build.isExperimentSelection) simulation.circleFlare(0.12);
}, },
remove() { remove() {
tech.isPowerUpsVanish = false tech.isPowerUpsVanish = false
@@ -3223,7 +3226,7 @@
}, },
{ {
name: "futures exchange", name: "futures exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4.5%</strong> power up <strong class='color-dup'>duplication</strong> chance", description: "clicking <strong style = 'font-size:150%;'>×</strong> to <strong>cancel</strong> a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>adds <strong>4%</strong> power up <strong class='color-dup'>duplication</strong> chance",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 1, frequency: 1,
@@ -3297,21 +3300,21 @@
}, },
{ {
name: "apomixis", name: "apomixis",
description: `when you reach <strong>100%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>8 bosses</strong> with <strong>100%</strong> more <strong>health</strong>`, description: `when you reach <strong>111%</strong> <strong class='color-dup'>duplication</strong><br>spawn <strong>11 bosses</strong> with <strong>111%</strong> more <strong>health</strong>`,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 10,
frequencyDefault: 2, frequencyDefault: 10,
allowed() { allowed() {
return tech.duplicationChance() > 0.33 return tech.duplicationChance() > 0.99
}, },
requires: "duplication chance above 33%", requires: "duplication chance above 33%",
effect() { effect() {
tech.is100Duplicate = true; tech.is111Duplicate = true;
tech.maxDuplicationEvent() tech.maxDuplicationEvent()
}, },
remove() { remove() {
tech.is100Duplicate = false; tech.is111Duplicate = false;
} }
}, },
{ {
@@ -3381,10 +3384,8 @@
effect: () => { effect: () => {
powerUps.research.changeRerolls(-2) powerUps.research.changeRerolls(-2)
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2<br>${powerUps.research.count}`) simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 2<br>${powerUps.research.count}`)
const chanceStore = tech.duplicateChance powerUps.directSpawn(m.pos.x, m.pos.y, "tech");
tech.duplicateChance = (tech.isStimulatedEmission ? 0.2 : 0) + tech.cancelCount * 0.045 + m.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance if (Math.random() < tech.duplicationChance() * 2) powerUps.directSpawn(m.pos.x + 10, m.pos.y + 5, "tech");
powerUps.spawn(m.pos.x, m.pos.y, "tech");
tech.duplicateChance = chanceStore
}, },
remove() {} remove() {}
}, },
@@ -5778,9 +5779,9 @@
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return (m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "negative mass") && (build.isExperimentSelection || powerUps.research.count > 3) return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "perfect diamagnetism" || m.fieldUpgrades[m.fieldMode].name === "negative mass") && (build.isExperimentSelection || powerUps.research.count > 3)
}, },
requires: "perfect diamagnetism or negative mass", requires: "perfect diamagnetism, negative mass, pilot wave",
effect() { effect() {
tech.isFieldHarmReduction = true tech.isFieldHarmReduction = true
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
@@ -6266,7 +6267,7 @@
// }, // },
{ {
name: "retrocausality", name: "retrocausality",
description: "<strong>time dilation</strong> uses <strong class='color-f'>energy</strong> to <strong>rewind</strong> your<br><strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong> up to <strong>10</strong> s", description: "<strong>time dilation</strong> uses <strong class='color-f'>energy</strong> to <strong>rewind</strong> your<br><strong class='color-h'>health</strong>, <strong>velocity</strong>, and <strong>position</strong> up to <strong>10 s</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6316,9 +6317,9 @@
frequency: 3, frequency: 3,
frequencyDefault: 3, frequencyDefault: 3,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "time dilation" && (build.isExperimentSelection || powerUps.research.count > 2) return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "time dilation") && (build.isExperimentSelection || powerUps.research.count > 2)
}, },
requires: "time dilation", requires: "time dilation, pilot wave",
effect() { effect() {
tech.isFastTime = true tech.isFastTime = true
m.setMovement(); m.setMovement();
@@ -6357,7 +6358,7 @@
}, },
{ {
name: "no-cloning theorem", name: "no-cloning theorem",
description: `<strong>38%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>after a <strong>mob</strong> <strong>dies</strong>, lose <strong>1%</strong> <strong class='color-dup'>duplication</strong> chance`, description: `<strong>40%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>after a <strong>mob</strong> <strong>dies</strong>, lose <strong>2%</strong> <strong class='color-dup'>duplication</strong> chance`,
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -6368,9 +6369,9 @@
}, },
requires: "cloaking, wormhole or time dilation and below 100% duplication chance", requires: "cloaking, wormhole or time dilation and below 100% duplication chance",
effect() { effect() {
tech.cloakDuplication = 0.38 tech.cloakDuplication = 0.4
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection) simulation.circleFlare(0.38); if (!build.isExperimentSelection) simulation.circleFlare(0.4);
}, },
remove() { remove() {
tech.cloakDuplication = 0 tech.cloakDuplication = 0
@@ -6607,20 +6608,20 @@
}, },
{ {
name: "virtual particles", name: "virtual particles",
description: `use ${powerUps.orb.research(4)}to exploit your <strong>wormhole</strong> for a<br><strong>14%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong>`, description: `use ${powerUps.orb.research(4)}to exploit your <strong>wormhole</strong> for a<br><strong>13%</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 === "wormhole" && (build.isExperimentSelection || powerUps.research.count > 3) && tech.duplicationChance() < 1 return m.fieldUpgrades[m.fieldMode].name === "wormhole" && (build.isExperimentSelection || powerUps.research.count > 3)
}, },
requires: "wormhole, below 100% duplication chance", requires: "wormhole",
effect() { effect() {
tech.wormDuplicate = 0.14 tech.wormDuplicate = 0.13
powerUps.setDupChance(); //needed after adjusting duplication chance powerUps.setDupChance(); //needed after adjusting duplication chance
if (!build.isExperimentSelection) simulation.circleFlare(0.14); if (!build.isExperimentSelection) simulation.circleFlare(0.13);
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1) if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
} }
@@ -8727,7 +8728,7 @@
isGunSwitchField: null, isGunSwitchField: null,
isNeedleShieldPierce: null, isNeedleShieldPierce: null,
isDuplicateBoss: null, isDuplicateBoss: null,
is100Duplicate: null, is111Duplicate: null,
isDynamoBotUpgrade: null, isDynamoBotUpgrade: null,
isBlockPowerUps: null, isBlockPowerUps: null,
isBlockHarm: null, isBlockHarm: null,

View File

@@ -1,11 +1,17 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
number of undefined tech needed to get lore is now lower at higher difficulty modes grenades display their trajectory, to help you aim
I'm might get rid of it, but for now we'll try it out
bug fixes several duplication tech give slightly lower duplication chance
strange attractor now properly includes all your tech in duplication chance (it wasn't updated for recent duplication tech)
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
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 tech: after bullets hit a mob, the mob takes 1% more damage
this.damageReduction *= 1.01 this.damageReduction *= 1.01