diff --git a/.DS_Store b/.DS_Store
index f973175..cf66128 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 91b1c29..dcc7fcc 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -95,10 +95,10 @@ const b = {
simulation.makeTextLog(`${b.guns[b.activeGun].name}.ammo: 0`);
m.fireCDcycle = m.cycle + 30; //fire cooldown
if (tech.isAmmoFromHealth) {
- if (m.health > 0.05) {
- m.damage(0.05 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
+ if (m.health > 0.03) {
+ m.damage(0.03 / m.harmReduction()); // /m.harmReduction() undoes damage increase from difficulty
if (!(tech.isRewindAvoidDeath && m.energy > 0.66)) { //don't give ammo if CPT triggered
- for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "ammo");
+ for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + 50 * (Math.random() - 0.5), m.pos.y + 50 * (Math.random() - 0.5), "ammo");
}
}
}
@@ -2590,7 +2590,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
beforeDmg() {},
onEnd() {},
@@ -2641,7 +2641,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
beforeDmg() {},
onEnd() {},
@@ -2696,7 +2696,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
beforeDmg() {},
onEnd() {},
@@ -2757,7 +2757,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
lockedOn: null,
beforeDmg() {
@@ -2838,7 +2838,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
lockedOn: null,
explode: 0,
@@ -2922,7 +2922,7 @@ const b = {
classType: "bullet",
collisionFilter: {
category: cat.bullet,
- mask: cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield
+ mask: b.totalBots() < 50 ? cat.map | cat.body | cat.bullet | cat.mob | cat.mobBullet | cat.mobShield : cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield //if over 50 bots, they no longer collide with each other
},
lockedOn: null,
beforeDmg() {
diff --git a/js/engine.js b/js/engine.js
index ea2cdc9..b4f4ac9 100644
--- a/js/engine.js
+++ b/js/engine.js
@@ -197,7 +197,7 @@ function collisionChecks(event) {
} else if (Math.random() < 0.4 && !tech.isSuperDeterminism) {
type = "research"
}
- for (let i = 0; i < 2; i++) powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
+ powerUps.spawn(mob[k].position.x, mob[k].position.y, type);
}
const stunTime = dmg / Math.sqrt(obj.mass)
diff --git a/js/level.js b/js/level.js
index 831ab4e..614c2dd 100644
--- a/js/level.js
+++ b/js/level.js
@@ -18,13 +18,14 @@ const level = {
// m.setField("pilot wave")
// b.giveGuns("laser")
// tech.isExplodeRadio = true
- // tech.giveTech("fermions")
+ // tech.giveTech("WIMPs")
+ // tech.giveTech("MACHO")
// tech.giveTech("potential well")
// for (let i = 0; i < 3; i++) tech.giveTech("packet length")
// for (let i = 0; i < 3; i++) tech.giveTech("propagation")
// for (let i = 0; i < 3; i++) tech.giveTech("bound state")
// for (let i = 0; i < 9; i++) tech.giveTech("WIMPs")
- // tech.giveTech("metastability")
+ // tech.giveTech("attract")
level.intro(); //starting level
@@ -109,7 +110,7 @@ const level = {
const len = Math.floor((m.maxHealth - m.health) / 0.5)
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
}
-
+ if (tech.isMACHO) spawn.MACHO()
for (let i = 0; i < tech.wimpCount; i++) {
spawn.WIMP()
for (let j = 0, len = 1 + 2 * Math.random(); j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false)
@@ -1099,21 +1100,18 @@ const level = {
// spawn.starter(1900, -500, 200) //big boy
// spawn.grower(1900, -500)
// spawn.pulsarBoss(1900, -500)
- // spawn.shooterBoss(1900, -500)
+ spawn.shooterBoss(1900, -500)
// spawn.launcherBoss(1200, -500)
// spawn.laserTargetingBoss(1600, -400)
// spawn.striker(1600, -500)
// spawn.laserTargetingBoss(1700, -120)
// spawn.bomberBoss(1400, -500)
- spawn.ghoster(1800, -120)
- spawn.ghoster(1800, -120)
- spawn.ghoster(1800, -120)
- spawn.ghoster(1800, -120)
+ // spawn.ghoster(1800, -120)
// spawn.streamBoss(1600, -500)
// spawn.orbitalBoss(1600, -500)
// spawn.cellBossCulture(1600, -500)
// spawn.shieldingBoss(1600, -500)
- // spawn.beamer(1200, -500)
+ spawn.laser(1200, -500)
// spawn.shield(mob[mob.length - 1], 1800, -120, 1);
// spawn.nodeGroup(1200, -500, "pulsar")
@@ -4721,9 +4719,9 @@ const level = {
}
//Boss Spawning
- if (simulation.difficulty > 20) {
+ if (simulation.difficulty > 10) {
spawn.pulsarBoss(-400, -200);
- if (simulation.difficulty > 40) {
+ if (simulation.difficulty > 30) {
spawn.pulsarBoss(3600, -400);
if (simulation.difficulty > 60) {
spawn.pulsarBoss(4200, 1000);
diff --git a/js/player.js b/js/player.js
index f27520b..f2f45d1 100644
--- a/js/player.js
+++ b/js/player.js
@@ -513,6 +513,7 @@ const m = {
harmReduction() {
let dmg = 1
dmg *= m.fieldHarmReduction
+ if (tech.isHarmMACHO) dmg *= 0.33
if (tech.isImmortal) dmg *= 0.79
if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.50 : 1.1
if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage
@@ -1355,6 +1356,7 @@ const m = {
for (let i = 0, len = mob.length; i < len; ++i) {
if (
Vector.magnitude(Vector.sub(mob[i].position, player.position)) - mob[i].radius < m.fieldRange &&
+ !mob[i].isShielded &&
m.lookingAt(mob[i]) &&
Matter.Query.ray(map, mob[i].position, m.pos).length === 0
) {
@@ -1365,7 +1367,11 @@ const m = {
},
pushMobs360(range) { // find mobs in range in any direction
for (let i = 0, len = mob.length; i < len; ++i) {
- if (Vector.magnitude(Vector.sub(mob[i].position, m.pos)) - mob[i].radius < range && Matter.Query.ray(map, mob[i].position, m.pos).length === 0) {
+ if (
+ Vector.magnitude(Vector.sub(mob[i].position, m.pos)) - mob[i].radius < range &&
+ !mob[i].isShielded &&
+ Matter.Query.ray(map, mob[i].position, m.pos).length === 0
+ ) {
mob[i].locatePlayer();
m.pushMass(mob[i]);
}
@@ -1629,7 +1635,7 @@ const m = {
if (m.energy > m.maxEnergy - 0.02 && m.fieldCDcycle < m.cycle && !input.field && bullet.length < 200 && (m.cycle % 2)) {
if (tech.isSporeField) {
for (let i = 0; i < 30; i++) {
- m.energy -= 0.11
+ m.energy -= 0.088
if (m.energy > 0) {
b.spore(m.pos)
} else {
@@ -1638,10 +1644,10 @@ const m = {
}
}
} else if (tech.isMissileField) {
- m.energy -= 0.4;
+ m.energy -= 0.32;
b.missile({ x: m.pos.x, y: m.pos.y - 40 }, -Math.PI / 2 + 0.5 * (Math.random() - 0.5), 0, 1)
} else if (tech.isIceField) {
- m.energy -= 0.057;
+ m.energy -= 0.046;
b.iceIX(1)
} else {
m.energy -= 0.45 * tech.droneEnergyReduction;
diff --git a/js/powerup.js b/js/powerup.js
index 8fca203..98d3f86 100644
--- a/js/powerup.js
+++ b/js/powerup.js
@@ -8,15 +8,20 @@ const powerUps = {
if (tech.duplicationChance() > 0) {
if (tech.isPowerUpsVanish) {
powerUps.do = powerUps.doDuplicatesVanish
+ } else if (tech.isPowerUpsAttract) {
+ powerUps.do = powerUps.doAttractDuplicates
} else {
powerUps.do = powerUps.doDuplicates
}
tech.maxDuplicationEvent() //check to see if hitting 100% duplication
+ } else if (tech.isPowerUpsAttract) {
+ powerUps.do = powerUps.doAttract
} else {
powerUps.do = powerUps.doDefault
}
},
- doDefault() { //draw power ups
+ doDefault() {
+ //draw power ups
ctx.globalAlpha = 0.4 * Math.sin(m.cycle * 0.15) + 0.6;
for (let i = 0, len = powerUp.length; i < len; ++i) {
ctx.beginPath();
@@ -26,6 +31,19 @@ const powerUps = {
}
ctx.globalAlpha = 1;
},
+ doAttract() {
+ powerUps.doDefault();
+ //pull in
+ for (let i = 0, len = powerUp.length; i < len; ++i) {
+ const force = Vector.mult(Vector.normalise(Vector.sub(m.pos, powerUp[i].position)), 0.0015 * powerUp[i].mass)
+ powerUp[i].force.x += force.x
+ powerUp[i].force.y = force.y - simulation.g
+ }
+ },
+ doAttractDuplicates() {
+ powerUps.doDuplicates();
+ //pull in
+ },
doDuplicates() { //draw power ups but give duplicates some electricity
ctx.globalAlpha = 0.4 * Math.sin(m.cycle * 0.15) + 0.6;
for (let i = 0, len = powerUp.length; i < len; ++i) {
@@ -593,7 +611,7 @@ const powerUps = {
},
onPickUp(who) {
if (tech.isTechDamage && who.name === "tech") m.damage(0.11)
- if (tech.isMassEnergy) m.energy += 2.5;
+ if (tech.isMassEnergy) m.energy += 2;
if (tech.isMineDrop) {
if (tech.isLaserMine) {
b.laserMine(who.position)
diff --git a/js/spawn.js b/js/spawn.js
index 054a845..9c30779 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -89,9 +89,8 @@ const spawn = {
},
//mob templates *********************************************************************************************
//***********************************************************************************************************
- WIMP(x = level.exit.x + 300 * (Math.random() - 0.5), y = level.exit.y + 300 * (Math.random() - 0.5), radius = 75 + 25 * Math.random()) { //immortal mob that follows player
- //if you have the tech it spawns at start of every level at the exit
- mobs.spawn(x, y, 3, radius, "transparent");
+ MACHO(x = m.pos.x, y = m.pos.y) { //immortal mob that follows player //if you have the tech it spawns at start of every level at the player
+ mobs.spawn(x, y, 3, 0.1, "transparent");
let me = mob[mob.length - 1];
me.stroke = "transparent"
me.isShielded = true; //makes it immune to damage
@@ -99,6 +98,63 @@ const spawn = {
me.isBadTarget = true;
me.isDropPowerUp = false;
me.showHealthBar = false;
+ me.collisionFilter.category = 0;
+ me.collisionFilter.mask = 0; //cat.player //| cat.body
+ me.chaseSpeed = 3.3
+ me.isMACHO = true;
+ me.frictionAir = 0.006
+
+ me.do = function() {
+ const sine = Math.sin(simulation.cycle * 0.015)
+ this.radius = 370 * (1 + 0.1 * sine)
+ //chase player
+ const sub = Vector.sub(player.position, this.position)
+ const mag = Vector.magnitude(sub)
+ // follow physics
+ // Matter.Body.setVelocity(this, { x: 0, y: 0 });
+ // const where = Vector.add(this.position, Vector.mult(Vector.normalise(sub), this.chaseSpeed))
+ // if (mag > 10) Matter.Body.setPosition(this, { x: where.x, y: where.y });
+
+ //realistic physics
+ const force = Vector.mult(Vector.normalise(sub), 0.000000003)
+ this.force.x += force.x
+ this.force.y += force.y
+
+
+ if (mag < this.radius) { //buff to player when inside radius
+ tech.isHarmMACHO = true;
+ //draw halo
+ ctx.strokeStyle = "rgba(80,120,200,0.2)" //"rgba(255,255,0,0.2)" //ctx.strokeStyle = `rgba(0,0,255,${0.5+0.5*Math.random()})`
+ ctx.beginPath();
+ ctx.arc(m.pos.x, m.pos.y, 36, 0, 2 * Math.PI);
+ ctx.lineWidth = 10;
+ ctx.stroke();
+ // ctx.strokeStyle = "rgba(255,255,0,0.17)" //ctx.strokeStyle = `rgba(0,0,255,${0.5+0.5*Math.random()})`
+ // ctx.beginPath();
+ // ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI);
+ // ctx.lineWidth = 30;
+ // ctx.stroke();
+ } else {
+ tech.isHarmMACHO = false;
+ }
+ //draw outline
+ ctx.beginPath();
+ ctx.arc(this.position.x, this.position.y, this.radius + 15, 0, 2 * Math.PI);
+ ctx.strokeStyle = "#000"
+ ctx.lineWidth = 1;
+ ctx.stroke();
+ }
+ },
+ WIMP(x = level.exit.x + 300 * (Math.random() - 0.5), y = level.exit.y + 300 * (Math.random() - 0.5)) { //immortal mob that follows player //if you have the tech it spawns at start of every level at the exit
+ mobs.spawn(x, y, 3, 0.1, "transparent");
+ let me = mob[mob.length - 1];
+ me.stroke = "transparent"
+ me.isShielded = true; //makes it immune to damage
+ me.leaveBody = false;
+ me.isBadTarget = true;
+ me.isDropPowerUp = false;
+ me.showHealthBar = false;
+ me.collisionFilter.category = 0;
me.collisionFilter.mask = 0; //cat.player //| cat.body
me.chaseSpeed = 1 + 1.5 * Math.random()
@@ -120,7 +176,7 @@ const spawn = {
m.energy -= DRAIN
} else {
m.energy = 0;
- m.damage(0.007)
+ m.damage(0.007 * simulation.dmgScale)
simulation.drawList.push({ //add dmg to draw queue
x: this.position.x,
y: this.position.y,
@@ -147,7 +203,7 @@ const spawn = {
// }
// }
- //draw some flashy graphics
+ //draw
ctx.beginPath();
ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI);
// ctx.fillStyle = "hsla(160, 100%, 35%,0.75)" //"rgba(255,0,255,0.2)";
diff --git a/js/tech.js b/js/tech.js
index 2272214..d1f3a14 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -329,9 +329,9 @@
isNonRefundable: true,
// isExperimentHide: true,
allowed() {
- return b.inventory.length > 2
+ return b.inventory.length > 3
},
- requires: "at least 3 guns",
+ requires: "at least 4 guns",
effect() {
for (let i = 0; i < b.inventory.length; i++) {
if (Math.random() < 0.2) {
@@ -388,7 +388,7 @@
},
{
name: "catabolism",
- description: "when you fire while out of ammo
gain 4 ammo, but lose 5 health",
+ description: "when you fire while out of ammo
gain 4 ammo, but lose 3 health",
maxCount: 1,
count: 0,
frequency: 2,
@@ -1237,7 +1237,7 @@
effect() {
tech.isOrbitBotUpgrade = true
b.convertBotsTo("orbital-bot")
- const range = 190 + 60 * tech.isOrbitBotUpgrade
+ const range = 190 + 100 * tech.isOrbitBotUpgrade
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType === 'orbit') {
bullet[i].isUpgraded = true
@@ -1249,7 +1249,7 @@
},
remove() {
tech.isOrbitBotUpgrade = false
- const range = 190 + 60 * tech.isOrbitBotUpgrade
+ const range = 190 + 100 * tech.isOrbitBotUpgrade
for (let i = 0; i < bullet.length; i++) {
if (bullet[i].botType === 'orbit') {
bullet[i].range = range
@@ -1329,7 +1329,7 @@
},
{
name: "robotics",
- description: "use 1 research to spawn a random bot
quadruple the frequency of finding bot tech",
+ description: "use 1 research to spawn a random bot
quadruple the frequency of finding bot tech",
maxCount: 1,
count: 0,
frequency: 1,
@@ -1337,7 +1337,7 @@
allowed() {
return (b.totalBots() > 1 && powerUps.research.count > 0) || build.isExperimentSelection
},
- requires: "at least 2 bots, 1 research",
+ requires: "at least 2 bots",
effect: () => {
if (powerUps.research.count > 0) {
powerUps.research.changeRerolls(-1)
@@ -1489,9 +1489,9 @@
count: 0,
frequency: 2,
allowed() {
- return tech.throwChargeRate > 1
+ return tech.throwChargeRate > 1 || m.fieldUpgrades[m.fieldMode].name === "pilot wave"
},
- requires: "mass driver",
+ requires: "mass driver or pilot wave",
effect() {
tech.isBlockBullets = true
},
@@ -1519,15 +1519,15 @@
},
{
name: "restitution",
- description: "if a block you threw kills a mob
spawn 2 heals, ammo, or research",
+ description: "if a block you threw kills a mob
spawn 1 heal, ammo, or research",
maxCount: 1,
count: 0,
frequency: 3,
frequencyDefault: 3,
allowed() {
- return tech.throwChargeRate > 1 && !tech.isNoHeals && m.fieldUpgrades[m.fieldMode].name !== "pilot wave"
+ return tech.throwChargeRate > 1 && m.fieldUpgrades[m.fieldMode].name !== "pilot wave"
},
- requires: "mass driver, not ergodicity, pilot wave",
+ requires: "mass driver, not pilot wave",
effect() {
tech.isBlockPowerUps = true
},
@@ -2719,7 +2719,7 @@
{
name: "WIMPs",
//harmful
- description: "a weak massive particle slowly chases you
spawn 2-3 research at the end of each level",
+ description: "a harmful particle slowly chases you
spawn 2-3 research at the end of each level",
maxCount: 9,
count: 0,
frequency: 1,
@@ -2735,6 +2735,28 @@
tech.wimpCount = 0
}
},
+ {
+ name: "MACHO",
+ description: "a massive but compact object slowly follows you
take 66% less harm inside it's halo",
+ maxCount: 1,
+ count: 0,
+ frequency: 1,
+ frequencyDefault: 1,
+ allowed() {
+ return true
+ },
+ requires: "",
+ effect: () => {
+ tech.isMACHO = true; //this harm reduction comes from the particle toggling tech.isHarmMACHO
+ spawn.MACHO()
+ },
+ remove() {
+ tech.isMACHO = false;
+ for (let i = 0, len = mob.length; i < len; i++) {
+ if (mob[i].isMACHO) mob[i].alive = false;
+ }
+ }
+ },
{
name: "bubble fusion",
description: "after destroying a mob's natural shield
spawn 1-2 heals, ammo, or research",
@@ -2833,6 +2855,26 @@
powerUps.setDo(); //needed after adjusting duplication chance
}
},
+ // {
+ // name: "attract",
+ // description: "",
+ // maxCount: 1,
+ // count: 0,
+ // frequency: 1,
+ // frequencyDefault: 1,
+ // allowed() {
+ // return true
+ // },
+ // requires: "",
+ // effect: () => {
+ // tech.isPowerUpsAttract = true
+ // powerUps.setDo(); //needed after adjusting duplication chance
+ // },
+ // remove() {
+ // tech.isPowerUpsAttract = false
+ // powerUps.setDo(); //needed after adjusting duplication chance
+ // }
+ // },
{
name: "futures exchange",
description: "clicking × to cancel a field, tech, or gun
adds 4.3% power up duplication chance",
@@ -4606,7 +4648,7 @@
},
{
name: "flux pinning",
- description: "deflecting with your field
stuns mobs for +2 second",
+ description: "deflecting mobs with your field
stuns them for 2 seconds",
isFieldTech: true,
maxCount: 9,
count: 0,
@@ -4642,7 +4684,7 @@
},
{
name: "bot manufacturing",
- description: "use nano-scale manufacturing
to build 2 random bots",
+ description: "use nano-scale manufacturing and 2 research
to build 3 random bots",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -4652,10 +4694,13 @@
isNonRefundable: true,
// isExperimentHide: true,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
+ return powerUps.research.count > 1 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
},
requires: "nano-scale manufacturing",
effect: () => {
+ for (let i = 0; i < 2; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
m.energy = 0.01;
b.randomBot()
b.randomBot()
@@ -4664,8 +4709,8 @@
remove() {}
},
{
- name: "bot prototype",
- description: "use nano-scale manufacturing to build
a random bot and upgrade all bots to that type",
+ name: "bot prototypes",
+ description: "use nano-scale and 3 research to build
2 random bots and upgrade all bots to that type",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -4675,14 +4720,17 @@
isNonRefundable: true,
// isExperimentHide: true,
allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
+ return powerUps.research.count > 2 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing"
},
requires: "nano-scale manufacturing",
effect: () => {
- m.energy = 0.01;
+ for (let i = 0; i < 3; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
+
//fill array of available bots
const notUpgradedBots = []
- const num = 1
+ const num = 2
notUpgradedBots.push(() => {
tech.giveTech("nail-bot upgrade")
for (let i = 0; i < num; i++) {
@@ -4733,14 +4781,82 @@
simulation.makeTextLog(`tech.isDynamoBotUpgrade = true`)
})
}
-
notUpgradedBots[Math.floor(Math.random() * notUpgradedBots.length)]() //choose random function from the array and run it
},
remove() {}
},
+ {
+ name: "mycelium manufacturing",
+ description: "use 3 research to repurpose nano-scale
excess energy used to grow spores",
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ allowed() {
+ return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
+ },
+ requires: "nano-scale manufacturing, no other manufacturing",
+ effect() {
+ if (!build.isExperimentSelection) {
+ for (let i = 0; i < 3; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
+ }
+ tech.isSporeField = true;
+ },
+ remove() {
+ tech.isSporeField = false;
+ }
+ },
+ {
+ name: "missile manufacturing",
+ description: "use 3 research to repurpose nano-scale
excess energy used to construct missiles",
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ allowed() {
+ return (build.isExperimentSelection || powerUps.research.count > 2) && m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
+ },
+ requires: "nano-scale manufacturing, no other manufacturing",
+ effect() {
+ if (!build.isExperimentSelection) {
+ for (let i = 0; i < 3; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
+ }
+ tech.isMissileField = true;
+ },
+ remove() {
+ tech.isMissileField = false;
+ }
+ },
+ {
+ name: "ice IX manufacturing",
+ description: "use 3 research to repurpose nano-scale
excess energy used to condense ice IX",
+ isFieldTech: true,
+ maxCount: 1,
+ count: 0,
+ frequency: 2,
+ allowed() {
+ return (build.isExperimentSelection || powerUps.research.count > 2) && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab)
+ },
+ requires: "nano-scale manufacturing, no other manufacturing",
+ effect() {
+ if (!build.isExperimentSelection) {
+ for (let i = 0; i < 3; i++) {
+ if (powerUps.research.count > 0) powerUps.research.changeRerolls(-1)
+ }
+ }
+ tech.isIceField = true;
+ },
+ remove() {
+ tech.isIceField = false;
+ }
+ },
{
name: "pair production",
- description: "picking up a power up gives you 250 energy",
+ description: "picking up a power up gives you 200 energy",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -4751,66 +4867,12 @@
requires: "nano-scale manufacturing",
effect: () => {
tech.isMassEnergy = true // used in m.grabPowerUp
- m.energy += 3
+ m.energy += 2
},
remove() {
tech.isMassEnergy = false;
}
},
- {
- name: "mycelium manufacturing",
- description: "nano-scale manufacturing is repurposed
excess energy used to grow spores",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isMissileField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
- },
- requires: "nano-scale manufacturing, no other manufacturing",
- effect() {
- tech.isSporeField = true;
- },
- remove() {
- tech.isSporeField = false;
- }
- },
- {
- name: "missile manufacturing",
- description: "nano-scale manufacturing is repurposed
excess energy used to construct missiles",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- allowed() {
- return m.maxEnergy > 0.5 && m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isIceField || tech.isFastDrones || tech.isDroneGrab)
- },
- requires: "nano-scale manufacturing, no other manufacturing",
- effect() {
- tech.isMissileField = true;
- },
- remove() {
- tech.isMissileField = false;
- }
- },
- {
- name: "ice IX manufacturing",
- description: "nano-scale manufacturing is repurposed
excess energy used to condense ice IX",
- isFieldTech: true,
- maxCount: 1,
- count: 0,
- frequency: 2,
- allowed() {
- return m.fieldUpgrades[m.fieldMode].name === "nano-scale manufacturing" && !(tech.isSporeField || tech.isMissileField || tech.isFastDrones || tech.isDroneGrab)
- },
- requires: "nano-scale manufacturing, no other manufacturing",
- effect() {
- tech.isIceField = true;
- },
- remove() {
- tech.isIceField = false;
- }
- },
{
name: "degenerate matter",
description: "reduce harm by 60% while your field is active",
@@ -6717,5 +6779,7 @@
iceIXOnDeath: null,
wimpCount: null,
isBlockBullets: null,
- isAddBlockMass: null
+ isAddBlockMass: null,
+ isMACHO: null,
+ isHarmMACHO: null
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 5d42399..b1209a9 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,16 +1,16 @@
******************************************************** NEXT PATCH ********************************************************
-"block" is now styled text
-blocking with a shield is now called deflecting
+tech: MACHO - an object follows you and gives you harm protection when you are inside it's halo
-added 100% block damage buffs to flywheel and inelastic collision
-restitution now spawns 2 power ups (up from 1)
+several nano-scale field tech now require some research, and have been buffed
+ nano-scale mycelium, ice-IX, missile tech now consume 20% less energy to produce bullets
+ nano-scale bot tech: spawn an extra bots
-about 75 edits to tech requirement text
+some bug fixes
******************************************************** BUGS ********************************************************
-Why does micro-extruder lag so much anyway
+Why does micro-extruder lag so much
blue triangle boss can move backwards and aim away from you if set up properly
@@ -52,34 +52,33 @@ is there a way to check if the player is stuck inside the map or block
******************************************************** TODO ********************************************************
-full block build works for every level except final boss
+make nano-scale upgrades all cost research, and buff those tech
-block custom css style?
+make most future tech for guns / fields
-tech: pilot wave is projected from the player, not the mouse
- maybe also make field move slower? (adjust smoothing function)
- less energy drain?
- does damage to mobs caught in field?
+tech: mine - fire the mine into where you were in the past
+ maybe it could check all your past locations and explode there if there is something in range
-tech: wormhole through walls
+tech: increase health and harm taken
-pause should show the last in game console message
+remove air control
+ negative tech, junk , experiment?
-Make ice crystal + rivet gun/needle gun launch freezing rivets/needles with increased energy drain
-
-WIMPS are cool, but the 2-3 research isn't enough incentive?
-
-tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus
- if it touches WIMP they explode
-
-let the player use research more like money
- spend it to do things
- buff some special tech and add a research cost
+use name axion as a 3rd dark matter tech
tech: use the ability for power ups to have custom code
+ (note: this code is half way done, it just needs to be completed)
attracted to player
attracted to other power ups
explode if they touch?
+
+tech: wormhole through walls?
+
+pause should show the last in game console message
+
+general idea: let the player use research more like money
+ spend it to do things
+ buff some special tech and add a research cost
tech: picking up heal power ups when at full health does harm equal to the heal values
benefit on pick up: