replication

tech change: commodities exchange 6 -> 8 power ups on cancel
tech change: MIRV - doesn't reduce the missile size as much, has a better missile spread, and a very short fire delay

tech: replication - gain 8% duplication, but add in 10 junk tech to the pool
added several new junk tech (18 possible junk tech now)
This commit is contained in:
landgreen
2021-02-07 06:20:58 -08:00
parent 6e5d951bf1
commit dc94bf871d
10 changed files with 336 additions and 75 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -3519,33 +3519,62 @@ const b = {
if (m.crouch) { if (m.crouch) {
m.fireCDcycle = m.cycle + 10 * b.fireCD / countReduction; // cool down m.fireCDcycle = m.cycle + 10 * b.fireCD / countReduction; // cool down
const size = countReduction * (tech.missileSize ? 1.32 : 0.88) // for (let i = 0; i < tech.missileCount; i++) {
const where = { // b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction))
x: m.pos.x, // bullet[bullet.length - 1].force.x += 0.004 * countReduction * (i - (tech.missileCount - 1) / 2);
y: m.pos.y - 40 // }
}
for (let i = 0; i < tech.missileCount; i++) { if (tech.missileCount > 1) {
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, size) for (let i = 0; i < tech.missileCount; i++) {
bullet[bullet.length - 1].force.x += 0.004 * size * (i - (tech.missileCount - 1) / 2); setTimeout(() => {
const where = {
x: m.pos.x,
y: m.pos.y - 40
}
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, Math.sqrt(countReduction))
bullet[bullet.length - 1].force.x += 0.025 * countReduction * (i - (tech.missileCount - 1) / 2);
}, 20 * tech.missileCount * Math.random());
}
} else {
const where = {
x: m.pos.x,
y: m.pos.y - 40
}
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5), -2)
} }
} else { } else {
m.fireCDcycle = m.cycle + 50 * b.fireCD / countReduction; // cool down m.fireCDcycle = m.cycle + 50 * b.fireCD / countReduction; // cool down
const size = countReduction * (tech.missileSize ? 1.5 : 1)
const direction = { const direction = {
x: Math.cos(m.angle), x: Math.cos(m.angle),
y: Math.sin(m.angle) y: Math.sin(m.angle)
} }
const push = Vector.mult(Vector.perp(direction), 0.02 * size / Math.sqrt(tech.missileCount)) const push = Vector.mult(Vector.perp(direction), 0.08 * countReduction / Math.sqrt(tech.missileCount))
const where = { if (tech.missileCount > 1) {
x: m.pos.x + 40 * direction.x, for (let i = 0; i < tech.missileCount; i++) {
y: m.pos.y + 40 * direction.y setTimeout(() => {
} const where = {
for (let i = 0; i < tech.missileCount; i++) { x: m.pos.x + 40 * direction.x,
b.missile(where, m.angle, 0, size) y: m.pos.y + 40 * direction.y
bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2); }
bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2); b.missile(where, m.angle, 0, Math.sqrt(countReduction))
bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2);
bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2);
}, 40 * tech.missileCount * Math.random());
}
} else {
const where = {
x: m.pos.x + 40 * direction.x,
y: m.pos.y + 40 * direction.y
}
b.missile(where, m.angle, 0)
} }
// for (let i = 0; i < tech.missileCount; i++) {
// setTimeout(() => {
// b.missile(where, m.angle, 0, size)
// bullet[bullet.length - 1].force.x += push.x * (i - (tech.missileCount - 1) / 2);
// bullet[bullet.length - 1].force.y += push.y * (i - (tech.missileCount - 1) / 2);
// }, i * 50);
// }
} }

View File

@@ -97,7 +97,7 @@ const level = {
powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false); powerUps.spawn(m.pos.x + 60 * (Math.random() - 0.5), m.pos.y + 60 * (Math.random() - 0.5), "heal", false);
} }
if (tech.isPerpetualStun) { if (tech.isPerpetualStun) {
for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 600) for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 780)
} }
if (tech.isGunCycle) { if (tech.isGunCycle) {
b.inventoryGun++; b.inventoryGun++;

View File

@@ -502,7 +502,7 @@ const m = {
if (tech.isSlowFPS) dmg *= 0.8 if (tech.isSlowFPS) dmg *= 0.8
if (tech.isPiezo) dmg *= 0.85 if (tech.isPiezo) dmg *= 0.85
if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.6 if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.6
if (tech.isBotArmor) dmg *= 0.97 ** tech.totalBots() if (tech.isBotArmor) dmg *= 0.96 ** tech.totalBots()
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.6 if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.6
if (tech.energyRegen === 0) dmg *= 0.4 if (tech.energyRegen === 0) dmg *= 0.4
@@ -605,7 +605,7 @@ const m = {
simulation.fpsInterval = 1000 / simulation.fpsCap; simulation.fpsInterval = 1000 / simulation.fpsCap;
m.defaultFPSCycle = m.cycle m.defaultFPSCycle = m.cycle
if (tech.isRewindBot) { if (tech.isRewindBot) {
const len = steps * 0.042 * tech.isRewindBot const len = steps * 0.052 * tech.isRewindBot
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
const where = m.history[Math.abs(m.cycle - i * 40) % 600].position //spread out spawn locations along past history const where = m.history[Math.abs(m.cycle - i * 40) % 600].position //spread out spawn locations along past history
b.randomBot({ b.randomBot({

View File

@@ -38,7 +38,7 @@ const powerUps = {
if (isCanceled) { if (isCanceled) {
if (tech.isCancelDuplication) tech.cancelCount++ if (tech.isCancelDuplication) tech.cancelCount++
if (tech.isCancelRerolls) { if (tech.isCancelRerolls) {
for (let i = 0; i < 6; i++) { for (let i = 0; i < 8; i++) {
let spawnType = (m.health < 0.25 || tech.isEnergyNoAmmo) ? "heal" : "ammo" let spawnType = (m.health < 0.25 || tech.isEnergyNoAmmo) ? "heal" : "ammo"
if (Math.random() < 0.33) { if (Math.random() < 0.33) {
spawnType = "heal" spawnType = "heal"

View File

@@ -324,7 +324,7 @@ const simulation = {
// <path d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#7ce" stroke="none" /> --> // <path d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#7ce" stroke="none" /> -->
// SVGleftMouse: '<svg viewBox="750 0 200 765" class="mouse-icon" width="40px" height = "60px" stroke-linecap="round" stroke-linejoin="round" stroke-width="25px" stroke="#000" fill="none"> <path fill="#fff" stroke="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M832.41,106.64 V323.55 H651.57 V256.64 c0-82.5,67.5-150,150-150 Z" fill="#149" stroke="none" /> <path fill="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M657 317 h 340 h-170 v-207" /> <ellipse fill="#fff" cx="827.57" cy="218.64" rx="29" ry="68" /> </svg>', // SVGleftMouse: '<svg viewBox="750 0 200 765" class="mouse-icon" width="40px" height = "60px" stroke-linecap="round" stroke-linejoin="round" stroke-width="25px" stroke="#000" fill="none"> <path fill="#fff" stroke="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M832.41,106.64 V323.55 H651.57 V256.64 c0-82.5,67.5-150,150-150 Z" fill="#149" stroke="none" /> <path fill="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M657 317 h 340 h-170 v-207" /> <ellipse fill="#fff" cx="827.57" cy="218.64" rx="29" ry="68" /> </svg>',
// SVGrightMouse: '<svg viewBox="750 0 200 765" class="mouse-icon" width="40px" height = "60px" stroke-linecap="round" stroke-linejoin="round" stroke-width="25px" stroke="#000" fill="none"> <path fill="#fff" stroke="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#0cf" stroke="none" /> <path fill="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M657 317 h 340 h-170 v-207" /> <ellipse fill="#fff" cx="827.57" cy="218.64" rx="29" ry="68" /> </svg>', // SVGrightMouse: '<svg viewBox="750 0 200 765" class="mouse-icon" width="40px" height = "60px" stroke-linecap="round" stroke-linejoin="round" stroke-width="25px" stroke="#000" fill="none"> <path fill="#fff" stroke="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M827,112 h30 a140,140,0,0,1,140,140 v68 h-167 z" fill="#0cf" stroke="none" /> <path fill="none" d="M827,112 h30 a140,140,0,0,1,140,140 v268 a140,140,0,0,1-140,140 h-60 a140,140,0,0,1-140-140v-268 a140,140,0,0,1,140-140h60" /> <path d="M657 317 h 340 h-170 v-207" /> <ellipse fill="#fff" cx="827.57" cy="218.64" rx="29" ry="68" /> </svg>',
makeTextLog(text, time = 120) { makeTextLog(text, time = 180) {
if (simulation.isTextLogOpen && !build.isExperimentSelection) { if (simulation.isTextLogOpen && !build.isExperimentSelection) {
if (simulation.lastLogTime > m.cycle) { //if there is an older message if (simulation.lastLogTime > m.cycle) { //if there is an older message
document.getElementById("text-log").innerHTML = document.getElementById("text-log").innerHTML + '<br>' + text; document.getElementById("text-log").innerHTML = document.getElementById("text-log").innerHTML + '<br>' + text;
@@ -359,9 +359,9 @@ const simulation = {
}, },
switchGun() { switchGun() {
if (tech.isGunSwitchField) { if (tech.isGunSwitchField) {
const energy = m.energy // const energy = m.energy
// m.energy = energy //field swap sets energy to max, this undoes that
m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
m.energy = energy //field swap sets energy to max, this undoes that
//update text to show next field //update text to show next field
for (let i = tech.tech.length - 1; i > 0; i--) { for (let i = tech.tech.length - 1; i > 0; i--) {

View File

@@ -232,7 +232,7 @@ const spawn = {
this.eventHorizon = 750 this.eventHorizon = 750
this.spawnInterval = 600 this.spawnInterval = 600
this.rotateVelocity = 0.001 * (player.position.x > this.position.x ? 1 : -1) //rotate so that the player can get away this.rotateVelocity = 0.001 * (player.position.x > this.position.x ? 1 : -1) //rotate so that the player can get away
if (!this.isShielded) spawn.shield(this, x, y, 1); //regen shield here ? // if (!this.isShielded) spawn.shield(this, x, y, 1); //regen shield here ?
this.modeDo = this.modeAll this.modeDo = this.modeAll
} }
// } // }

View File

@@ -24,6 +24,23 @@ const tech = {
if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1) if (tech.tech[i].isLore && tech.tech[i].count === 0) tech.tech.splice(i, 1)
} }
}, },
addJunkTechToPool(num = 1) {
for (let i = 0; i < num; i++) {
// find an index that doesn't have dups first
let index = null
for (let i = 0; i < tech.junk.length; i++) {
if (tech.junk[i].numberInPool === 0) {
index = i
break
}
}
if (index === null) index = Math.floor(Math.random() * tech.junk.length) //or just pick a random junk tech to add
tech.junk[index].numberInPool++
tech.tech.push(Object.assign({}, tech.junk[index])) // push a "clone" of the tech.junk into the pool
if (tech.junk[index].numberInPool > 1) tech.tech[tech.tech.length - 1].name += `(${tech.junk[index].numberInPool})` //give it a unique name so it can be found
}
},
removeJunkTechFromPool() { removeJunkTechFromPool() {
for (let i = tech.tech.length - 1; i > 0; i--) { for (let i = tech.tech.length - 1; i > 0; i--) {
if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1) if (tech.tech[i].isJunk && tech.tech[i].count === 0) tech.tech.splice(i, 1)
@@ -89,7 +106,7 @@ const tech = {
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5 if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.4 if (tech.isMaxEnergyTech) dmg *= 1.4
if (tech.isEnergyNoAmmo) dmg *= 1.5 if (tech.isEnergyNoAmmo) dmg *= 1.5
if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length if (tech.isDamageForGuns) dmg *= 1 + 0.15 * b.inventory.length
if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health) if (tech.isLowHealthDmg) dmg *= 1 + 0.6 * Math.max(0, 1 - m.health)
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isEnergyLoss) dmg *= 1.5; if (tech.isEnergyLoss) dmg *= 1.5;
@@ -101,7 +118,7 @@ const tech = {
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25 if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.66 if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 1.66
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013) if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.4, player.speed * 0.013)
if (tech.isBotDamage) dmg *= 1 + 0.02 * tech.totalBots() if (tech.isBotDamage) dmg *= 1 + 0.04 * tech.totalBots()
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
@@ -162,7 +179,7 @@ const tech = {
}, },
{ {
name: "arsenal", name: "arsenal",
description: "increase <strong class='color-d'>damage</strong> by <strong>13%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory", description: "increase <strong class='color-d'>damage</strong> by <strong>15%</strong><br>for each <strong class='color-g'>gun</strong> in your inventory",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -981,7 +998,7 @@ const tech = {
}, },
{ {
name: "perimeter defense", name: "perimeter defense",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>3%</strong><br>for each of your permanent <strong>bots</strong>", description: "reduce <strong class='color-harm'>harm</strong> by <strong>4%</strong><br>for each of your permanent <strong>bots</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -996,7 +1013,7 @@ const tech = {
} }
}, { }, {
name: "network effect", name: "network effect",
description: "increase <strong class='color-d'>damage</strong> by <strong>2%</strong><br>for each of your permanent <strong>bots</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for each of your permanent <strong>bots</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1074,7 +1091,7 @@ const tech = {
}, },
{ {
name: "perpetual stun", name: "perpetual stun",
description: "<strong>stun</strong> all mobs for up to <strong>10</strong> seconds<br>at the start of each <strong>level</strong>", description: "<strong>stun</strong> all mobs for up to <strong>12</strong> seconds<br>at the start of each <strong>level</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1763,31 +1780,32 @@ const tech = {
if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal
} }
}, },
// { {
// name: "stimulated emission", name: "replication",
// description: "<strong>6%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br><em>duplication chance can't exceed 100%</em>", description: "<strong>8%</strong> chance to <strong class='color-dup'>duplicate</strong> spawned <strong>power ups</strong><br>add <strong>10</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
// maxCount: 9, maxCount: 9,
// count: 0, count: 0,
// allowed() { allowed() {
// return tech.duplicationChance() < 1 return tech.duplicationChance() < 1
// }, },
// requires: "below 100% duplication chance", requires: "below 100% duplication chance",
// effect() { effect() {
// tech.duplicateChance += 0.06 tech.duplicateChance += 0.08
// simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw
// }, tech.addJunkTechToPool(10)
// remove() { },
// tech.duplicateChance = 0 remove() {
// if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal tech.duplicateChance = 0
// } if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal
// }, }
},
{ {
name: "futures exchange", name: "futures exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel 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 cancel 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",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return tech.duplicationChance() < 1 && !tech.isDeterminism return tech.duplicationChance() < 1 && !tech.isDeterminism && (level.levelsCleared < 5 || Math.random() < 0.5)
}, },
requires: "below 100% duplication chance, not determinism", requires: "below 100% duplication chance, not determinism",
effect() { effect() {
@@ -1803,7 +1821,7 @@ const tech = {
}, },
{ {
name: "commodities exchange", name: "commodities exchange",
description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>6</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, and <strong class='color-r'>research</strong>", description: "clicking <strong style = 'font-size:150%;'>×</strong> to cancel a <strong class='color-f'>field</strong>, <strong class='color-m'>tech</strong>, or <strong class='color-g'>gun</strong><br>spawns <strong>8</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, and <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
@@ -1897,9 +1915,7 @@ const tech = {
} }
const choose = have[Math.floor(Math.random() * have.length)] const choose = have[Math.floor(Math.random() * have.length)]
simulation.makeTextLog(`<span class='color-var'>tech</span>.remove("<span class='color-text'>${tech.tech[choose].name}</span>")`) simulation.makeTextLog(`<span class='color-var'>tech</span>.remove("<span class='color-text'>${tech.tech[choose].name}</span>")`)
for (let i = 0; i < tech.tech[choose].count; i++) { for (let i = 0; i < tech.tech[choose].count; i++) powerUps.spawn(m.pos.x, m.pos.y, "tech");
powerUps.spawn(m.pos.x, m.pos.y, "tech");
}
powerUps.spawn(m.pos.x, m.pos.y, "tech"); powerUps.spawn(m.pos.x, m.pos.y, "tech");
tech.tech[choose].count = 0; tech.tech[choose].count = 0;
tech.tech[choose].remove(); // remove a random tech form the list of tech you have tech.tech[choose].remove(); // remove a random tech form the list of tech you have
@@ -1924,7 +1940,7 @@ const tech = {
simulation.makeTextLog(`<span class='color-var'>m</span>.<span class='color-r'>research</span> <span class='color-symbol'>-=</span> 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}`) <br>${powerUps.research.count}`)
const chanceStore = tech.duplicateChance const chanceStore = tech.duplicateChance
tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.04 + m.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance tech.duplicateChance = (tech.isBayesian ? 0.2 : 0) + tech.cancelCount * 0.045 + m.duplicateChance + tech.duplicateChance * 2 //increase duplication chance to simulate doubling all 3 sources of duplication chance
powerUps.spawn(m.pos.x, m.pos.y, "tech"); powerUps.spawn(m.pos.x, m.pos.y, "tech");
tech.duplicateChance = chanceStore tech.duplicateChance = chanceStore
}, },
@@ -1981,7 +1997,7 @@ const tech = {
}, },
{ {
name: "dark patterns", name: "dark patterns",
description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>several</strong> junk <strong class='color-m'>tech</strong> to the potential pool", description: "reduce combat <strong>difficulty</strong> by <strong>1 level</strong><br>add <strong>16</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 1, maxCount: 1,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
@@ -1992,7 +2008,9 @@ const tech = {
requires: "no research, and in the first 5 levels", requires: "no research, and in the first 5 levels",
effect() { effect() {
level.difficultyDecrease(simulation.difficultyMode) level.difficultyDecrease(simulation.difficultyMode)
for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i]) simulation.makeTextLog(`simulation.difficultyMode<span class='color-symbol'>--</span>`)
tech.addJunkTechToPool(16)
// for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
}, },
remove() {} remove() {}
}, },
@@ -2966,7 +2984,7 @@ const tech = {
maxCount: 1, maxCount: 1,
count: 0, count: 0,
allowed() { allowed() {
return (tech.haveGunCheck("mine") && !tech.isMineAmmoBack && !tech.isLaserMine) || tech.isMineDrop return (tech.haveGunCheck("mine") || tech.isMineDrop) && !tech.isMineAmmoBack && !tech.isLaserMine
}, },
requires: "mines, not mine reclamation, laser-mines", requires: "mines, not mine reclamation, laser-mines",
effect() { effect() {
@@ -3280,12 +3298,12 @@ const tech = {
effect() { effect() {
tech.laserReflections++; tech.laserReflections++;
tech.laserDamage += 0.08; //base is 0.12 tech.laserDamage += 0.08; //base is 0.12
tech.laserFieldDrain += 0.0008 //base is 0.002 tech.laserFieldDrain += 0.0009 //base is 0.002
}, },
remove() { remove() {
tech.laserReflections = 2; tech.laserReflections = 2;
tech.laserDamage = 0.16; tech.laserDamage = 0.16;
tech.laserFieldDrain = 0.0016; tech.laserFieldDrain = 0.0018;
} }
}, },
{ {
@@ -4166,6 +4184,7 @@ const tech = {
// description: "", // description: "",
// maxCount: 9, // maxCount: 9,
// count: 0, // count: 0,
// numberInPool: 0,
// isNonRefundable: true, // isNonRefundable: true,
// isCustomHide: true, // isCustomHide: true,
// isJunk: true, // isJunk: true,
@@ -4178,11 +4197,159 @@ const tech = {
// }, // },
// remove() {} // remove() {}
// }, // },
{
name: "energy to mass conversion",
description: "convert your <strong class='color-f'>energy</strong> into blocks",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0, len = Math.floor(m.energy * 40); i < len; i++) {
setTimeout(() => {
m.energy -= 1 / len
const index = body.length
where = Vector.add(m.pos, { x: 400 * (Math.random() - 0.5), y: 400 * (Math.random() - 0.5) })
spawn.bodyRect(where.x, where.y, Math.floor(15 + 100 * Math.random()), Math.floor(15 + 100 * Math.random()));
body[index].collisionFilter.category = cat.body;
body[index].collisionFilter.mask = cat.player | cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet
body[index].classType = "body";
World.add(engine.world, body[index]); //add to world
}, i * 100);
}
},
remove() {}
},
{
name: "level.nextLevel()",
description: "teleport to the start of the next level",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
simulation.clearTimeouts();
level.nextLevel();
},
remove() {}
},
{
name: "expert system",
description: "spawn a <strong class='color-m'>tech</strong> power up<br>add <strong>64</strong> junk <strong class='color-m'>tech</strong> to the potential pool",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
powerUps.spawn(m.pos.x, m.pos.y, "tech");
tech.addJunkTechToPool(64)
},
remove() {}
},
{
name: "energy investment",
description: "every 10 seconds drain your <strong class='color-f'>energy</strong> and return it doubled 10 seconds later<br>lasts 180 seconds",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 18; i++) {
setTimeout(() => { //drain energy
const energy = m.energy
m.energy = 0
setTimeout(() => { //return energy
m.energy += 2 * energy
}, 5000);
}, i * 10000);
}
},
remove() {}
},
{
name: "missile Launching System",
description: "fire missiles for the next 60 seconds",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 60; i++) {
setTimeout(() => {
const where = {
x: m.pos.x,
y: m.pos.y - 40
}
b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2)
}, i * 1000);
}
},
remove() {}
},
{
name: "grenade production",
description: "drop grenades for the next 120 seconds",
maxCount: 9,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
for (let i = 0; i < 120; i++) {
setTimeout(() => {
b.grenade(Vector.add(m.pos, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) }), -Math.PI / 2) //fire different angles for each grenade
const who = bullet[bullet.length - 1]
Matter.Body.setVelocity(who, {
x: who.velocity.x * 0.1,
y: who.velocity.y * 0.1
});
}, i * 1000);
}
},
remove() {}
},
{ {
name: "inverted input", name: "inverted input",
description: "left input becomes right and up input becomes down", description: "left input becomes right and up input becomes down",
maxCount: 9, maxCount: 9,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4206,6 +4373,7 @@ const tech = {
description: "grow more legs", description: "grow more legs",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4249,11 +4417,56 @@ const tech = {
}, },
remove() {} remove() {}
}, },
{
name: "diegesis",
description: "indicate gun fire delay through a rotation of your head",
maxCount: 1,
count: 0,
numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
allowed() {
return true
},
requires: "",
effect() {
m.draw = function() {
ctx.fillStyle = m.fillColor;
m.walk_cycle += m.flipLegs * m.Vx;
ctx.save();
ctx.globalAlpha = (m.immuneCycle < m.cycle) ? 1 : 0.5
ctx.translate(m.pos.x, m.pos.y);
m.calcLeg(Math.PI, -3);
m.drawLeg("#4a4a4a");
m.calcLeg(0, 0);
m.drawLeg("#333");
ctx.rotate(m.angle - (m.fireCDcycle != Infinity ? m.flipLegs * 0.25 * Math.pow(Math.max(m.fireCDcycle - m.cycle, 0), 0.5) : 0));
ctx.beginPath();
ctx.arc(0, 0, 30, 0, 2 * Math.PI);
let grd = ctx.createLinearGradient(-30, 0, 30, 0);
grd.addColorStop(0, m.fillColorDark);
grd.addColorStop(1, m.fillColor);
ctx.fillStyle = grd;
ctx.fill();
ctx.arc(15, 0, 4, 0, 2 * Math.PI);
ctx.strokeStyle = "#333";
ctx.lineWidth = 2;
ctx.stroke();
ctx.restore();
m.yOff = m.yOff * 0.85 + m.yOffGoal * 0.15; //smoothly move leg height towards height goal
}
},
remove() {}
},
{ {
name: "pareidolia", name: "pareidolia",
description: "don't", description: "don't",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4325,6 +4538,7 @@ const tech = {
description: "you cycle through different <strong>colors</strong>", description: "you cycle through different <strong>colors</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4350,6 +4564,7 @@ const tech = {
description: "all your <strong>bots</strong> are converted to the <strong>same</strong> random model", description: "all your <strong>bots</strong> are converted to the <strong>same</strong> random model",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4407,6 +4622,7 @@ const tech = {
description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong>", description: "increase combat <strong>difficulty</strong> by <strong>1 level</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4421,9 +4637,10 @@ const tech = {
}, },
{ {
name: "stun", name: "stun",
description: "<strong>stun</strong> all mobs for up to <strong>10</strong> seconds", description: "<strong>stun</strong> all mobs for up to <strong>8</strong> seconds",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4432,7 +4649,7 @@ const tech = {
}, },
requires: "", requires: "",
effect() { effect() {
for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 600) for (let i = 0; i < mob.length; i++) mobs.statusStun(mob[i], 480)
}, },
remove() {} remove() {}
}, },
@@ -4441,6 +4658,7 @@ const tech = {
description: "<strong>eject</strong> all your <strong class='color-g'>guns</strong>", description: "<strong>eject</strong> all your <strong class='color-g'>guns</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4468,6 +4686,7 @@ const tech = {
description: "<strong>eject</strong> all your <strong class='color-r'>research</strong>", description: "<strong>eject</strong> all your <strong class='color-r'>research</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4486,6 +4705,7 @@ const tech = {
description: "use all your <strong class='color-f'>energy</strong> to <strong>spawn</strong> inside the event horizon of a huge <strong>black hole</strong>", description: "use all your <strong class='color-f'>energy</strong> to <strong>spawn</strong> inside the event horizon of a huge <strong>black hole</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,
@@ -4504,6 +4724,7 @@ const tech = {
description: "spawn <strong>2</strong> <strong class='color-r'>research</strong><br><strong>spawn</strong> 40 nearby <strong>black holes</strong>", description: "spawn <strong>2</strong> <strong class='color-r'>research</strong><br><strong>spawn</strong> 40 nearby <strong>black holes</strong>",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
numberInPool: 0,
isNonRefundable: true, isNonRefundable: true,
isCustomHide: true, isCustomHide: true,
isJunk: true, isJunk: true,

View File

@@ -451,7 +451,7 @@ summary {
font-size: 1.15em; font-size: 1.15em;
color: #555; color: #555;
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
transition: opacity 0.5s; transition: opacity 0.25s;
pointer-events: none; pointer-events: none;
user-select: none; user-select: none;
} }

View File

@@ -1,18 +1,14 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
blocking uses 33% less energy
tech: stimulated emission removed tech change: commodities exchange 6 -> 8 power ups on cancel
tech: Bayesian statistics renamed stimulated emission tech change: MIRV - doesn't reduce the missile size as much, has a better missile spread, and a very short fire delay
tech: futures exchange gives 4.5% per cancel (up from 4%)
new level boss: follows you like the dynamo-bot, but is not friend tech: replication - gain 8% duplication, but add in 10 junk tech to the pool
will not spawn if you have a dynamo-bot added several new junk tech (18 possible junk tech now)
(probably will be rebalanced in next patch)
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
make mobs that spawn other mobs limit spawns to line of sight use the floor of portal sensor on the player? to unstuck player
orange mobs
(only once on my computer) once every 7 second check isn't running code (only once on my computer) once every 7 second check isn't running code
power ups don't teleport to exit power ups don't teleport to exit
@@ -38,6 +34,22 @@ make mobs that spawn other mobs limit spawns to line of sight
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
tech fire gun in the future
laser doesn't work because of draw, needs to be a bullet
foam? shotgun?
const where = {
x: m.pos.x + 20 * Math.cos(m.angle),
y: m.pos.y + 20 * Math.sin(m.angle)
}
setTimeout(() => {
}, 1000);
historyBoss needs legs?
unified field theory is too weak
fill energy make immune to damage on swap?
tech: when you switch guns switch a random bot to a different bot. If the bot you had was upgraded the new one will be too. tech: when you switch guns switch a random bot to a different bot. If the bot you had was upgraded the new one will be too.
or switch all bots or switch all bots
@@ -45,7 +57,6 @@ tech: buff block throwing
require +100% damage for blocks require +100% damage for blocks
works with pilot wave? works with pilot wave?
lore: a tutorial / lore intro lore: a tutorial / lore intro
needs to be optional so it doesn't slow experienced players needs to be optional so it doesn't slow experienced players
put something on the intro map put something on the intro map