diff --git a/.DS_Store b/.DS_Store
index e8e965f..392d3dc 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index ed1ac9b..98bdbf8 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -3519,33 +3519,62 @@ const b = {
if (m.crouch) {
m.fireCDcycle = m.cycle + 10 * b.fireCD / countReduction; // cool down
- const size = countReduction * (tech.missileSize ? 1.32 : 0.88)
- const where = {
- x: m.pos.x,
- y: m.pos.y - 40
- }
- for (let i = 0; i < tech.missileCount; i++) {
- b.missile(where, -Math.PI / 2 + 0.2 * (Math.random() - 0.5) * Math.sqrt(tech.missileCount), -2, size)
- bullet[bullet.length - 1].force.x += 0.004 * size * (i - (tech.missileCount - 1) / 2);
+ // for (let i = 0; i < tech.missileCount; i++) {
+ // 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.004 * countReduction * (i - (tech.missileCount - 1) / 2);
+ // }
+
+ if (tech.missileCount > 1) {
+ for (let i = 0; i < tech.missileCount; 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, 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 {
m.fireCDcycle = m.cycle + 50 * b.fireCD / countReduction; // cool down
-
- const size = countReduction * (tech.missileSize ? 1.5 : 1)
const direction = {
x: Math.cos(m.angle),
y: Math.sin(m.angle)
}
- const push = Vector.mult(Vector.perp(direction), 0.02 * size / Math.sqrt(tech.missileCount))
- const where = {
- x: m.pos.x + 40 * direction.x,
- y: m.pos.y + 40 * direction.y
- }
- for (let i = 0; i < tech.missileCount; i++) {
- 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);
+ const push = Vector.mult(Vector.perp(direction), 0.08 * countReduction / Math.sqrt(tech.missileCount))
+ if (tech.missileCount > 1) {
+ for (let i = 0; i < tech.missileCount; i++) {
+ setTimeout(() => {
+ const where = {
+ x: m.pos.x + 40 * direction.x,
+ y: m.pos.y + 40 * direction.y
+ }
+ 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);
+ // }
}
diff --git a/js/level.js b/js/level.js
index 32fcdec..c8f2a79 100644
--- a/js/level.js
+++ b/js/level.js
@@ -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);
}
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) {
b.inventoryGun++;
diff --git a/js/player.js b/js/player.js
index a168577..5568105 100644
--- a/js/player.js
+++ b/js/player.js
@@ -502,7 +502,7 @@ const m = {
if (tech.isSlowFPS) dmg *= 0.8
if (tech.isPiezo) dmg *= 0.85
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.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.6
if (tech.energyRegen === 0) dmg *= 0.4
@@ -605,7 +605,7 @@ const m = {
simulation.fpsInterval = 1000 / simulation.fpsCap;
m.defaultFPSCycle = m.cycle
if (tech.isRewindBot) {
- const len = steps * 0.042 * tech.isRewindBot
+ const len = steps * 0.052 * tech.isRewindBot
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
b.randomBot({
diff --git a/js/powerup.js b/js/powerup.js
index ac81a12..7e9e878 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -38,7 +38,7 @@ const powerUps = {
if (isCanceled) {
if (tech.isCancelDuplication) tech.cancelCount++
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"
if (Math.random() < 0.33) {
spawnType = "heal"
diff --git a/js/simulation.js b/js/simulation.js
index 15aaf9d..5074ef6 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -324,7 +324,7 @@ const simulation = {
// -->
// SVGleftMouse: '',
// SVGrightMouse: '',
- makeTextLog(text, time = 120) {
+ makeTextLog(text, time = 180) {
if (simulation.isTextLogOpen && !build.isExperimentSelection) {
if (simulation.lastLogTime > m.cycle) { //if there is an older message
document.getElementById("text-log").innerHTML = document.getElementById("text-log").innerHTML + '
' + text;
@@ -359,9 +359,9 @@ const simulation = {
},
switchGun() {
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.energy = energy //field swap sets energy to max, this undoes that
//update text to show next field
for (let i = tech.tech.length - 1; i > 0; i--) {
diff --git a/js/spawn.js b/js/spawn.js
index faff7a6..a6ac7dd 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -232,7 +232,7 @@ const spawn = {
this.eventHorizon = 750
this.spawnInterval = 600
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
}
// }
diff --git a/js/tech.js b/js/tech.js
index eaca70b..df07070 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -24,6 +24,23 @@ const tech = {
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() {
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)
@@ -89,7 +106,7 @@ const tech = {
if (tech.isLowEnergyDamage) dmg *= 1 + Math.max(0, 1 - m.energy) * 0.5
if (tech.isMaxEnergyTech) dmg *= 1.4
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.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isEnergyLoss) dmg *= 1.5;
@@ -101,7 +118,7 @@ const tech = {
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
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.isBotDamage) dmg *= 1 + 0.02 * tech.totalBots()
+ if (tech.isBotDamage) dmg *= 1 + 0.04 * tech.totalBots()
return dmg * tech.slowFire * tech.aimDamage
},
duplicationChance() {
@@ -162,7 +179,7 @@ const tech = {
},
{
name: "arsenal",
- description: "increase damage by 13%
for each gun in your inventory",
+ description: "increase damage by 15%
for each gun in your inventory",
maxCount: 1,
count: 0,
allowed() {
@@ -981,7 +998,7 @@ const tech = {
},
{
name: "perimeter defense",
- description: "reduce harm by 3%
for each of your permanent bots",
+ description: "reduce harm by 4%
for each of your permanent bots",
maxCount: 1,
count: 0,
allowed() {
@@ -996,7 +1013,7 @@ const tech = {
}
}, {
name: "network effect",
- description: "increase damage by 2%
for each of your permanent bots",
+ description: "increase damage by 4%
for each of your permanent bots",
maxCount: 1,
count: 0,
allowed() {
@@ -1074,7 +1091,7 @@ const tech = {
},
{
name: "perpetual stun",
- description: "stun all mobs for up to 10 seconds
at the start of each level",
+ description: "stun all mobs for up to 12 seconds
at the start of each level",
maxCount: 1,
count: 0,
allowed() {
@@ -1763,31 +1780,32 @@ const tech = {
if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal
}
},
- // {
- // name: "stimulated emission",
- // description: "6% chance to duplicate spawned power ups
duplication chance can't exceed 100%",
- // maxCount: 9,
- // count: 0,
- // allowed() {
- // return tech.duplicationChance() < 1
- // },
- // requires: "below 100% duplication chance",
- // effect() {
- // tech.duplicateChance += 0.06
- // simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw
- // },
- // remove() {
- // tech.duplicateChance = 0
- // if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal
- // }
- // },
+ {
+ name: "replication",
+ description: "8% chance to duplicate spawned power ups
add 10 junk tech to the potential pool",
+ maxCount: 9,
+ count: 0,
+ allowed() {
+ return tech.duplicationChance() < 1
+ },
+ requires: "below 100% duplication chance",
+ effect() {
+ tech.duplicateChance += 0.08
+ simulation.draw.powerUp = simulation.draw.powerUpBonus //change power up draw
+ tech.addJunkTechToPool(10)
+ },
+ remove() {
+ tech.duplicateChance = 0
+ if (tech.duplicationChance() === 0) simulation.draw.powerUp = simulation.draw.powerUpNormal
+ }
+ },
{
name: "futures exchange",
description: "clicking × to cancel a field, tech, or gun
adds 4.5% power up duplication chance",
maxCount: 1,
count: 0,
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",
effect() {
@@ -1803,7 +1821,7 @@ const tech = {
},
{
name: "commodities exchange",
- description: "clicking × to cancel a field, tech, or gun
spawns 6 heals, ammo, and research",
+ description: "clicking × to cancel a field, tech, or gun
spawns 8 heals, ammo, and research",
maxCount: 1,
count: 0,
allowed() {
@@ -1897,9 +1915,7 @@ const tech = {
}
const choose = have[Math.floor(Math.random() * have.length)]
simulation.makeTextLog(`tech.remove("${tech.tech[choose].name}")`)
- for (let i = 0; i < tech.tech[choose].count; i++) {
- powerUps.spawn(m.pos.x, m.pos.y, "tech");
- }
+ 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");
tech.tech[choose].count = 0;
tech.tech[choose].remove(); // remove a random tech form the list of tech you have
@@ -1924,7 +1940,7 @@ const tech = {
simulation.makeTextLog(`m.research -= 2
${powerUps.research.count}`)
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");
tech.duplicateChance = chanceStore
},
@@ -1981,7 +1997,7 @@ const tech = {
},
{
name: "dark patterns",
- description: "reduce combat difficulty by 1 level
add several junk tech to the potential pool",
+ description: "reduce combat difficulty by 1 level
add 16 junk tech to the potential pool",
maxCount: 1,
isNonRefundable: true,
isCustomHide: true,
@@ -1992,7 +2008,9 @@ const tech = {
requires: "no research, and in the first 5 levels",
effect() {
level.difficultyDecrease(simulation.difficultyMode)
- for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
+ simulation.makeTextLog(`simulation.difficultyMode--`)
+ tech.addJunkTechToPool(16)
+ // for (let i = 0; i < tech.junk.length; i++) tech.tech.push(tech.junk[i])
},
remove() {}
},
@@ -2966,7 +2984,7 @@ const tech = {
maxCount: 1,
count: 0,
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",
effect() {
@@ -3280,12 +3298,12 @@ const tech = {
effect() {
tech.laserReflections++;
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() {
tech.laserReflections = 2;
tech.laserDamage = 0.16;
- tech.laserFieldDrain = 0.0016;
+ tech.laserFieldDrain = 0.0018;
}
},
{
@@ -4166,6 +4184,7 @@ const tech = {
// description: "",
// maxCount: 9,
// count: 0,
+ // numberInPool: 0,
// isNonRefundable: true,
// isCustomHide: true,
// isJunk: true,
@@ -4178,11 +4197,159 @@ const tech = {
// },
// remove() {}
// },
+ {
+ name: "energy to mass conversion",
+ description: "convert your energy 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 tech power up
add 64 junk tech 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 energy and return it doubled 10 seconds later
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",
description: "left input becomes right and up input becomes down",
maxCount: 9,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4206,6 +4373,7 @@ const tech = {
description: "grow more legs",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4249,11 +4417,56 @@ const tech = {
},
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",
description: "don't",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4325,6 +4538,7 @@ const tech = {
description: "you cycle through different colors",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4350,6 +4564,7 @@ const tech = {
description: "all your bots are converted to the same random model",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4407,6 +4622,7 @@ const tech = {
description: "increase combat difficulty by 1 level",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4421,9 +4637,10 @@ const tech = {
},
{
name: "stun",
- description: "stun all mobs for up to 10 seconds",
+ description: "stun all mobs for up to 8 seconds",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4432,7 +4649,7 @@ const tech = {
},
requires: "",
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() {}
},
@@ -4441,6 +4658,7 @@ const tech = {
description: "eject all your guns",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4468,6 +4686,7 @@ const tech = {
description: "eject all your research",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4486,6 +4705,7 @@ const tech = {
description: "use all your energy to spawn inside the event horizon of a huge black hole",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
@@ -4504,6 +4724,7 @@ const tech = {
description: "spawn 2 research
spawn 40 nearby black holes",
maxCount: 1,
count: 0,
+ numberInPool: 0,
isNonRefundable: true,
isCustomHide: true,
isJunk: true,
diff --git a/style.css b/style.css
index b14932e..8ff6cf7 100644
--- a/style.css
+++ b/style.css
@@ -451,7 +451,7 @@ summary {
font-size: 1.15em;
color: #555;
background-color: rgba(255, 255, 255, 0.5);
- transition: opacity 0.5s;
+ transition: opacity 0.25s;
pointer-events: none;
user-select: none;
}
diff --git a/todo.txt b/todo.txt
index 6fba6fe..42d0f7e 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,18 +1,14 @@
******************************************************** NEXT PATCH ********************************************************
-blocking uses 33% less energy
-tech: stimulated emission removed
-tech: Bayesian statistics renamed stimulated emission
-tech: futures exchange gives 4.5% per cancel (up from 4%)
+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
-new level boss: follows you like the dynamo-bot, but is not friend
- will not spawn if you have a dynamo-bot
- (probably will be rebalanced in next patch)
+tech: replication - gain 8% duplication, but add in 10 junk tech to the pool
+added several new junk tech (18 possible junk tech now)
******************************************************** BUGS ********************************************************
-make mobs that spawn other mobs limit spawns to line of sight
- orange mobs
+use the floor of portal sensor on the player? to unstuck player
(only once on my computer) once every 7 second check isn't running code
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
******************************************************** 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.
or switch all bots
@@ -45,7 +57,6 @@ tech: buff block throwing
require +100% damage for blocks
works with pilot wave?
-
lore: a tutorial / lore intro
needs to be optional so it doesn't slow experienced players
put something on the intro map