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:
67
js/bullet.js
67
js/bullet.js
@@ -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);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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++;
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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--) {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
|
|||||||
295
js/tech.js
295
js/tech.js
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
31
todo.txt
31
todo.txt
@@ -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
|
||||||
@@ -37,6 +33,22 @@ make mobs that spawn other mobs limit spawns to line of sight
|
|||||||
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
(repeatable almost every time) bug - mines spawn extra mines when fired at thin map wall while jumping
|
||||||
|
|
||||||
******************************************************** 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
|
||||||
|
|||||||
Reference in New Issue
Block a user