diff --git a/js/bullet.js b/js/bullet.js
index a890479..a7facb4 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -3040,17 +3040,14 @@ const b = {
lockedOn: null,
delay: 50,
cd: simulation.cycle + 10,
- dmg: 0,
+ dmg: radius * (tech.isMutualism ? 2.5 : 1),
setDamage() { //dmg is set to zero after doing damage once, and set back to normal after jumping
this.dmg = radius * (tech.isMutualism ? 2.5 : 1) //damage done in addition to the damage from momentum //spores do 7 dmg, worms do 18
},
beforeDmg(who) {
- // this.endCycle = 0
Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(Vector.sub(this.position, who.position)), 10 + 10 * Math.random())); //push away from target
-
this.endCycle -= 180
this.cd = simulation.cycle + this.delay;
- // this.collisionFilter.mask = cat.map
if (tech.isSporeFreeze) mobs.statusSlow(who, 90)
if (tech.isSpawnBulletsOnDeath && who.alive && who.isDropPowerUp) {
setTimeout(() => {
@@ -3075,29 +3072,8 @@ const b = {
},
gravity: 0.002 + 0.002 * tech.isSporeFollow,
do() {
- // if (true && this.lockedOn && this.cd < simulation.cycle) { //blink towards mobs
- // //needs it's own cooldown variables
- // // this.cd = simulation.cycle + this.delay;
-
- // const sub = Vector.sub(this.lockedOn.position, this.position);
- // const distMag = Vector.magnitude(sub);
- // if (distMag < 500) {
- // const unit = Vector.normalise(sub)
- // Matter.Body.setVelocity(this, Vector.mult(unit, Math.max(20, this.speed * 1.5)));
- // ctx.beginPath();
- // ctx.moveTo(this.position.x, this.position.y);
- // Matter.Body.translate(this, Vector.mult(unit, Math.min(350, distMag - this.lockedOn.radius + 10)));
- // ctx.lineTo(this.position.x, this.position.y);
- // ctx.lineWidth = radius * 2;
- // ctx.strokeStyle = "rgba(0,0,0,0.5)";
- // ctx.stroke();
- // }
- // }
-
this.force.y += this.gravity * this.mass
if (this.cd < simulation.cycle && (Matter.Query.collides(this, map).length || Matter.Query.collides(this, body).length)) { //if on the ground and not on jump cooldown //
- // this.collisionFilter.mask = cat.map | cat.mob | cat.mobBullet | cat.mobShield
-
this.cd = simulation.cycle + this.delay;
this.lockedOn = null; //find a target
let closeDist = Infinity;
@@ -3160,7 +3136,6 @@ const b = {
drone(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1) {
const me = bullet.length;
const THRUST = 0.0015
- // const FRICTION = tech.isFastDrones ? 0.008 : 0.0005
const dir = m.angle + 0.4 * (Math.random() - 0.5);
const RADIUS = (4.5 + 3 * Math.random())
bullet[me] = Bodies.polygon(where.x, where.y, 8, RADIUS, {
@@ -3170,7 +3145,6 @@ const b = {
frictionAir: 0,
restitution: 1,
density: 0.0005, // 0.001 is normal density
- //total 0.24 + 0.3 average
dmg: 0.34 + 0.12 * tech.isDroneTeleport + 0.15 * tech.isDroneFastLook, //damage done in addition to the damage from momentum
lookFrequency: (tech.isDroneFastLook ? 20 : 70) + Math.floor(17 * Math.random()),
endCycle: simulation.cycle + Math.floor((950 + 400 * Math.random()) * tech.isBulletsLastLonger * tech.droneCycleReduction) + 5 * RADIUS + Math.max(0, 150 - bullet.length),
@@ -3749,7 +3723,7 @@ const b = {
inertia: Infinity,
frictionAir: 0.003,
dmg: 0, //damage on impact
- damage: tech.foamDamage * (tech.isFastFoam ? 2.5 : 1) * (tech.isBulletTeleport ? 1.47 : 1), //damage done over time
+ damage: tech.foamDamage * (tech.isFastFoam ? 2.8 : 1) * (tech.isBulletTeleport ? 1.53 : 1), //damage done over time
scale: 1 - 0.006 / tech.isBulletsLastLonger * (tech.isFastFoam ? 1.65 : 1),
classType: "bullet",
collisionFilter: {
@@ -3816,9 +3790,9 @@ const b = {
Matter.Body.setPosition(this, Vector.add(Vector.add(rotate, this.target.velocity), this.target.position))
}
if (this.target.isBoss) {
- if (this.target.speed > 8) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.98))
+ if (this.target.speed > 7.5) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.98))
} else {
- if (this.target.speed > 4) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.95))
+ if (this.target.speed > 3.5) Matter.Body.setVelocity(this.target, Vector.mult(this.target.velocity, 0.95))
}
Matter.Body.setAngularVelocity(this.target, this.target.angularVelocity * 0.9);
@@ -5606,10 +5580,18 @@ const b = {
}, dmg)
}
}
+ } else if (tech.isSporeFlea) {
+ const where = { x: m.pos.x + 35 * Math.cos(m.angle), y: m.pos.y + 35 * Math.sin(m.angle) }
+ const number = 4 * (tech.isShotgunReversed ? 1.6 : 1)
+ for (let i = 0; i < number; i++) {
+ const angle = m.angle + 0.2 * (Math.random() - 0.5)
+ const speed = (input.down ? 33 : 20) * (1 + 0.1 * Math.random())
+ b.flea(where, { x: speed * Math.cos(angle), y: speed * Math.sin(angle) })
+ }
} else if (tech.isSporeWorm) {
const where = { x: m.pos.x + 35 * Math.cos(m.angle), y: m.pos.y + 35 * Math.sin(m.angle) }
const spread = (input.down ? 0.02 : 0.07)
- const number = 3 * (tech.isShotgunReversed ? 1.6 : 1) + Math.random()
+ const number = 4 * (tech.isShotgunReversed ? 1.6 : 1)
let angle = m.angle - (number - 1) * spread * 0.5
for (let i = 0; i < number; i++) {
b.worm(where)
@@ -6349,7 +6331,7 @@ const b = {
bullet[me].maxRadius = 30;
bullet[me].restitution = 0.3;
bullet[me].minDmgSpeed = 0;
- bullet[me].totalSpores = 8 + 2 * tech.isSporeFreeze + 3 * tech.isSporeZooid
+ bullet[me].totalSpores = 8 + 2 * tech.isSporeFreeze + 4 * tech.isSporeColony
bullet[me].stuck = function() {};
bullet[me].beforeDmg = function() {};
bullet[me].do = function() {
@@ -6481,7 +6463,7 @@ const b = {
]
for (len = this.totalSpores; count < len; count++) {
- if (tech.isSporeZooid && Math.random() < 0.5) {
+ if (tech.isSporeColony && Math.random() < 0.5) {
things[Math.floor(Math.random() * things.length)]()
} else if (tech.isSporeFlea) {
things[2]()
diff --git a/js/index.js b/js/index.js
index 381303b..a509545 100644
--- a/js/index.js
+++ b/js/index.js
@@ -358,7 +358,27 @@ ${simulation.isCheating ? "
lore disabled": ""}
document.getElementById("field-" + m.fieldMode).classList.remove("build-field-selected");
m.setField(index)
who.classList.add("build-field-selected");
+ } else if (m.fieldMode === 4) {
+ const i = 4 //update experiment text
+ simulation.molecularMode++
+ if (simulation.molecularMode > i - 1) simulation.molecularMode = 0
+ m.fieldUpgrades[i].description = m.fieldUpgrades[i].setDescription()
+ document.getElementById(`field-${i}`).innerHTML = `
${build.nameLink(m.fieldUpgrades[i].name)}
${m.fieldUpgrades[i].description}`
}
+
+ // if (m.fieldMode === 4 && simulation.molecularMode < 3) {
+ // simulation.molecularMode++
+ // m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
+ // } else {
+ // m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
+
+ // if (m.fieldMode === 4) {
+ // simulation.molecularMode = 0
+ // m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
+ // }
+ // }
+
+
} else if (type === "tech") {
if (tech.tech[index].count < tech.tech[index].maxCount) {
// if (!tech.tech[index].isLore && !tech.tech[index].isNonRefundable && !who.classList.contains("build-tech-selected")) who.classList.add("build-tech-selected");
@@ -920,7 +940,16 @@ window.addEventListener("keydown", function(event) {
if (tech.isPauseSwitchField || simulation.testing) {
document.getElementById("pause-field").addEventListener("click", () => {
const energy = m.energy
- m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
+ if (m.fieldMode === 4 && simulation.molecularMode < 3) {
+ simulation.molecularMode++
+ m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
+ } else {
+ m.setField((m.fieldMode === m.fieldUpgrades.length - 1) ? 1 : m.fieldMode + 1) //cycle to next field
+ if (m.fieldMode === 4) {
+ simulation.molecularMode = 0
+ m.fieldUpgrades[4].description = m.fieldUpgrades[4].setDescription()
+ }
+ }
m.energy = energy
document.getElementById("pause-field").innerHTML = ` ${m.fieldUpgrades[m.fieldMode].name}
${m.fieldUpgrades[m.fieldMode].description}`
});
@@ -1125,18 +1154,18 @@ document.body.addEventListener("mousemove", (e) => {
document.body.addEventListener("mouseup", (e) => {
// input.fire = false;
// console.log(e)
- if (e.which === 3) {
- input.field = false;
- } else {
+ if (e.button === 0) {
input.fire = false;
+ } else if (e.button === 2) {
+ input.field = false;
}
});
document.body.addEventListener("mousedown", (e) => {
- if (e.which === 3) {
- input.field = true;
- } else {
+ if (e.button === 0) {
input.fire = true;
+ } else if (e.button === 2) {
+ input.field = true;
}
});
diff --git a/js/level.js b/js/level.js
index 686627b..0decdab 100644
--- a/js/level.js
+++ b/js/level.js
@@ -24,9 +24,9 @@ const level = {
// powerUps.research.changeRerolls(100)
// tech.tech[297].frequency = 100
// b.guns[0].ammo = 10000
- // m.setField("molecular assembler") //molecular assembler time dilation
- // b.giveGuns("spores")
- // tech.giveTech("K-selection")
+ // m.setField("perfect diamagnetism") //molecular assembler time dilation perfect diamagnetism
+ // b.giveGuns("shotgun") //0 nail gun 1 shotgun 2 super balls 3 matter wave 4 missiles 5 grenades 6 spores 7 drones 8 foam 9 harpoon 10 mine 11 laser
+ // tech.giveTech("siphonaptera")
// tech.giveTech("fleas")
// tech.giveTech("colony")
// tech.giveTech("mycelium manufacturing")
@@ -36,7 +36,8 @@ const level = {
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research");
// spawn.starter(1900, -500, 200)
- // for (let i = 0; i < 10; ++i) spawn.hopBullet(1900, -500)
+ // spawn.powerUpBossBaby(1900, -500)
+ // for (let i = 0; i < 10; ++i) spawn.grower(1900, -500)
// level.testing(); //not in rotation, used for testing
// for (let i = 0; i < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
// for (let i = 0; i < 4; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "tech");
diff --git a/js/mob.js b/js/mob.js
index 1217e20..1c349a1 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -172,7 +172,6 @@ const mobs = {
ctx.lineTo(who.vertices[j].x, who.vertices[j].y);
}
ctx.lineTo(who.vertices[0].x, who.vertices[0].y);
- ctx.stroke();
ctx.fill();
},
endEffect() {
diff --git a/js/player.js b/js/player.js
index 11074e9..c6183f1 100644
--- a/js/player.js
+++ b/js/player.js
@@ -2020,8 +2020,11 @@ const m = {
},
{
name: "molecular assembler",
- description: `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second`,
+ description: `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second`,
// simulation.molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones
+ setDescription() {
+ return `excess energy used to build ${simulation.molecularMode === 0 ? "spores" : simulation.molecularMode === 1 ? "missiles" : simulation.molecularMode === 2 ? "ice IX" : "drones"}
use energy to deflect mobs
generate 12 energy per second`
+ },
effect: () => {
m.fieldMeterColor = "#ff0"
m.eyeFillColor = m.fieldMeterColor
diff --git a/js/simulation.js b/js/simulation.js
index abf14a2..e55f06f 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -191,7 +191,7 @@ const simulation = {
accelScale: null, //set in levels.setDifficulty
CDScale: null, //set in levels.setDifficulty
isNoPowerUps: false,
- molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones
+ molecularMode: Math.floor(4 * Math.random()), //0 spores, 1 missile, 2 ice IX, 3 drones //randomize molecular assembler field type
// dropFPS(cap = 40, time = 15) {
// simulation.fpsCap = cap
// simulation.fpsInterval = 1000 / simulation.fpsCap;
@@ -577,7 +577,6 @@ const simulation = {
},
firstRun: true,
splashReturn() {
-
document.getElementById("previous-seed").innerHTML = `previous seed: ${Math.initialSeed}
`
document.getElementById("seed").value = Math.initialSeed = Math.seed //randomize initial seed
@@ -1425,15 +1424,16 @@ const simulation = {
const dx = Math.max(25, round(simulation.mouseInGame.x) - x)
const dy = Math.max(25, round(simulation.mouseInGame.y) - y)
- if (e.which === 2) {
+ if (e.button === 2) {
if (level.isProcedural) {
simulation.outputMapString(`spawn.randomMob(x+${x}, y+${y}, 0);`);
} else {
simulation.outputMapString(`spawn.randomMob(${x}, ${y}, 0);`);
}
-
+ } else if (e.button === 4) {
+ simulation.outputMapString(`${Math.floor(simulation.constructMouseDownPosition.x)}, ${Math.floor(simulation.constructMouseDownPosition.y)}`);
} else if (simulation.mouseInGame.x > simulation.constructMouseDownPosition.x && simulation.mouseInGame.y > simulation.constructMouseDownPosition.y) { //make sure that the width and height are positive
- if (e.which === 1) { //add map
+ if (e.button === 1) { //add map
if (level.isProcedural) {
simulation.outputMapString(`spawn.mapRect(x+${x}, y+${y}, ${dx}, ${dy});`);
} else {
@@ -1449,7 +1449,7 @@ const simulation = {
Composite.add(engine.world, map[len]); //add to world
simulation.draw.setPaths() //update map graphics
- } else if (e.which === 3) { //add body
+ } else if (e.button === 3) { //add body
if (level.isProcedural) {
simulation.outputMapString(`spawn.bodyRect(x+${x}, y+${y}, ${dx}, ${dy});`);
} else {
diff --git a/js/tech.js b/js/tech.js
index a9c8fc3..28c4031 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -221,7 +221,7 @@ const tech = {
}
},
hasExplosiveDamageCheck() {
- return tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
+ return tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isBoomBotUpgrade || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb)
},
damageFromTech() {
let dmg = 1 //m.fieldDamage
@@ -884,7 +884,6 @@ const tech = {
name: "anti-shear topology",
link: `anti-shear topology`,
description: "+30% projectile duration", //
drone spore worm flea missile foam wave neutron ice",
- isGunTech: true,
maxCount: 3,
count: 0,
frequency: 1,
@@ -3087,26 +3086,11 @@ const tech = {
},
remove() {
tech.isDeterminism = false;
- // if (this.count > 0) {
- // for (let i = 0; i < 5; i++) {
- // const numberRemoved = tech.removeTech()
- // console.log(numberRemoved)
- // if (numberRemoved === 0) { //if the player didn't remove a power up then remove 1 tech for the map
- // for (let j = powerUp.length - 1; j > -1; j--) {
- // if (powerUp[j].name === "tech") {
- // Matter.Composite.remove(engine.world, powerUp[j]);
- // powerUp.splice(j, 1);
- // break;
- // }
- // }
- // }
- // }
- // }
}
},
{
name: "superdeterminism",
- description: `spawn 5 tech
you have no cancel and ${powerUps.orb.research(1)}, no longer spawn`,
+ description: `spawn 5 tech
you have no cancel and ${powerUps.orb.research(1)} no longer spawn`,
maxCount: 1,
count: 0,
frequency: 4,
@@ -3124,10 +3108,6 @@ const tech = {
},
remove() {
tech.isSuperDeterminism = false;
- // tech.isSuperDeterminism = false;
- // if (this.count) {
- // for (let i = 0; i < 5; i++) tech.removeTech()
- // }
}
},
{
@@ -3156,22 +3136,6 @@ const tech = {
}
}
},
-
-
- // for (let i = 0, len = tech.tech.length; i < len; i++) {
- // if (tech.tech[i].isFieldTech) tech.tech[i].frequency *= 3
- // }
- // },
- // remove() {
- // // powerUps.research.changeRerolls(-6)
- // // if (this.count > 1) {
- // // for (let i = 0, len = tech.tech.length; i < len; i++) {
- // // if (tech.tech[i].isFieldTech) tech.tech[i].frequency /= 3
- // // }
- // // }
-
-
-
{
name: "paradigm shift",
description: `clicking tech while paused ejects them
16% chance to fail`,
@@ -3211,10 +3175,7 @@ const tech = {
},
{
name: "technical debt", // overengineering
- // description: `increase damage by 300% minus 10% for tech you have learned(${4 - 0.1 * tech.totalCount})`,
- // description: `increase damage by 300%, but reduce damage
by 10% for tech you have learned`,
descriptionFunction() {
- // return `increase damage by 300% minus 15%
for each tech you have learned (${Math.floor(100*(4 - 0.14 * tech.totalCount))-100}%)`
return `+300% damage –15% damage
for each tech you have learned (${Math.floor(100*(Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) ))-100}%)`
},
maxCount: 1,
@@ -3777,7 +3738,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.nailRecoil) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm)) && !tech.isRivets && !tech.isIncendiary && !tech.isIceCrystals && !tech.isIceShot
+ return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate && !tech.nailRecoil) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea)) && !tech.isRivets && !tech.isIncendiary && !tech.isIceCrystals && !tech.isIceShot
},
requires: "nail gun, shotgun, not ice crystal, rivets, rotary cannon, or pneumatic, incendiary, nail-shot, rivets, foam-shot, worm-shot, ice-shot",
effect() {
@@ -3816,7 +3777,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm)) && !tech.isNeedles && !tech.isIceCrystals && !tech.isIceShot
+ return ((tech.haveGunCheck("nail gun") && !tech.nailInstantFireRate) || (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea)) && !tech.isNeedles && !tech.isIceCrystals && !tech.isIceShot
},
requires: "nail gun, shotgun, not ice crystal, needles, or pneumatic actuator",
effect() {
@@ -4140,7 +4101,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles
+ return tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles
},
requires: "shotgun, not incendiary, rivets, foam-shot, worm-shot, ice-shot, needles",
effect() {
@@ -4160,7 +4121,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isSporeWorm && !tech.isNeedles
+ return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles
},
requires: "shotgun, not incendiary, nail-shot, rivet, worm-shot, ice-shot, needle",
effect() {
@@ -4180,7 +4141,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles
+ return tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIncendiary && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles
},
requires: "shotgun, not incendiary, nail-shot, rivet, foam-shot, worm-shot",
effect() {
@@ -4199,7 +4160,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
},
requires: "a freeze effect",
effect() {
@@ -4218,7 +4179,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1
},
requires: "a freeze effect",
effect() {
@@ -4237,7 +4198,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
+ return (tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.isIceShot || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
},
requires: "a localized freeze effect, no other mob death tech",
effect() {
@@ -4256,7 +4217,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return simulation.molecularMode === 2 || tech.relayIce || tech.isNeedleIce || tech.blockingIce || tech.iceIXOnDeath || tech.isIceShot
+ return (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce || tech.iceIXOnDeath || tech.isIceShot
},
requires: "ice IX",
effect() {
@@ -4275,7 +4236,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.isIceCrystals || tech.isSporeFreeze || simulation.molecularMode === 2 || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot
+ return tech.isIceCrystals || tech.isSporeFreeze || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 2) || tech.relayIce || tech.isNeedleIce || tech.blockingIce > 1 || tech.iceIXOnDeath || tech.isIceShot
},
requires: "a localized freeze effect",
effect() {
@@ -4294,7 +4255,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport)
+ return (tech.haveGunCheck("shotgun") && !tech.isNailShot && !tech.isIceShot && !tech.isRivets && !tech.isFoamShot && !tech.isSporeWorm && !tech.isSporeFlea && !tech.isNeedles) || (tech.haveGunCheck("super balls") && !tech.isFoamBall) || (tech.isRivets && !tech.isNailCrit) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport)
},
requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane",
effect() {
@@ -4577,7 +4538,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || simulation.molecularMode === 1 || tech.missileBotCount
+ return (tech.haveGunCheck("missiles") && tech.missileFireCD === 45) || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount
},
requires: "missiles",
effect() {
@@ -4596,9 +4557,9 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.haveGunCheck("missiles") || simulation.molecularMode === 1) && tech.isMissileBig
+ return (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1)) && tech.isMissileBig
},
- requires: "missiles, cruse missile",
+ requires: "missiles, cruise missile",
effect() {
tech.isMissileBiggest = true
},
@@ -4683,7 +4644,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || simulation.molecularMode === 1 || tech.isBoomBotUpgrade || tech.isTokamak)
+ return tech.explosiveRadius === 1 && !tech.isSmallExplosion && !tech.isBlockExplode && !tech.fragments && (tech.haveGunCheck("missiles") || tech.missileBotCount || tech.isIncendiary || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.isPulseLaser || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.isBoomBotUpgrade || tech.isTokamak)
},
requires: "an explosive damage source, not ammonium nitrate, nitroglycerin, chain reaction, fragmentation",
effect: () => {
@@ -4702,7 +4663,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075)
+ return !tech.isExplodeRadio && ((tech.haveGunCheck("harpoon") && !tech.isFoamBall) || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb) || tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount || tech.isRivets || tech.blockDamage > 0.075)
},
requires: "grenades, missiles, rivets, harpoon, or mass driver, not iridium-192, not polyurethane foam",
effect() {
@@ -4798,7 +4759,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || simulation.molecularMode === 1 || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb))
+ return !tech.isImmuneExplosion && (build.isExperimentSelection || powerUps.research.count > 3) && (tech.haveGunCheck("missiles") || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 1) || tech.missileBotCount > 0 || tech.isIncendiary || tech.isPulseLaser || tech.isTokamak || (tech.haveGunCheck("grenades") && !tech.isNeutronBomb))
},
requires: "an explosive damage source, not electric reactive armor",
effect: () => {
@@ -4841,7 +4802,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("grenades") || simulation.molecularMode === 1
+ return tech.haveGunCheck("missiles") || tech.missileBotCount || tech.haveGunCheck("grenades")
},
requires: "missiles, grenades",
effect() {
@@ -5154,7 +5115,7 @@ const tech = {
},
{
name: "colony",
- description: "+38% sporangium discharge
38% chance to discharge something different",
+ description: "+50% sporangium discharge
40% chance to discharge something different",
link: `colony`,
isGunTech: true,
maxCount: 1,
@@ -5166,10 +5127,10 @@ const tech = {
},
requires: "spores",
effect() {
- tech.isSporeZooid = true
+ tech.isSporeColony = true
},
remove() {
- tech.isSporeZooid = false
+ tech.isSporeColony = false
}
},
{
@@ -5182,7 +5143,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || tech.isSporeWorm || tech.isSporeFlea
+ return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
},
requires: "spores",
effect() {
@@ -5202,7 +5163,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || tech.isSporeWorm || tech.isSporeFlea
+ return tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || tech.isSporeWorm || tech.isSporeFlea
},
requires: "spores",
effect() {
@@ -5222,7 +5183,7 @@ const tech = {
frequency: 2,
frequencyDefault: 2,
allowed() {
- return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0) && !tech.isEnergyHealth || tech.isSporeWorm || tech.isSporeFlea
+ return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0)) && !tech.isEnergyHealth || tech.isSporeWorm || tech.isSporeFlea
},
requires: "spores, not mass-energy",
effect() {
@@ -5234,14 +5195,14 @@ const tech = {
},
{
name: "siphonaptera",
- description: "sporangium hatch fleas", //
spore tech applies to fleas
+ description: "shotgun and sporangium hatch fleas", //
spore tech applies to fleas
isGunTech: true,
maxCount: 1,
count: 0,
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0) && !tech.isSporeWorm
+ return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeWorm
},
requires: "spores, not worms",
effect() {
@@ -5261,7 +5222,7 @@ const tech = {
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || simulation.molecularMode === 0 || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea
+ return (tech.haveGunCheck("spores") || tech.sporesOnDeath > 0 || (m.fieldUpgrades[m.fieldMode].name === "molecular assembler" && simulation.molecularMode === 0) || (tech.haveGunCheck("shotgun") && !tech.isIncendiary && !tech.isRivets && !tech.isIceShot && !tech.isFoamShot && !tech.isNeedles && !tech.isNailShot)) && !tech.isSporeFlea
},
requires: "spores, not fleas",
effect() {
@@ -5582,7 +5543,7 @@ const tech = {
},
{
name: "uncertainty principle",
- description: "foam and wave positions are erratic
+47% foam and wave damage",
+ description: "foam and wave positions are erratic
+53% foam and wave damage",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5620,7 +5581,7 @@ const tech = {
},
{
name: "aerogel",
- description: "–50% foam duration and foam bubbles float
+150% foam damage",
+ description: "–50% foam duration and foam bubbles float
+180% foam damage",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -5641,7 +5602,7 @@ const tech = {
},
{
name: "surface tension",
- description: "+41% foam damage",
+ description: "+43% foam damage",
isGunTech: true,
maxCount: 9,
count: 0,
@@ -5652,7 +5613,7 @@ const tech = {
},
requires: "foam",
effect() {
- tech.foamDamage += 0.011 * 0.41
+ tech.foamDamage += 0.011 * 0.43
},
remove() {
tech.foamDamage = 0.011;
@@ -6048,7 +6009,7 @@ const tech = {
},
{
name: "laser diode",
- description: "+33% laser energy efficiency",
+ description: "+40% laser energy efficiency",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6059,7 +6020,7 @@ const tech = {
},
requires: "laser, not free-electron",
effect() {
- tech.isLaserDiode = 0.66; //100%-37%
+ tech.isLaserDiode = 0.6; //100%-40%
tech.laserColor = "rgb(0, 11, 255)"
tech.laserColorAlpha = "rgba(0, 11, 255,0.5)"
},
@@ -6071,7 +6032,7 @@ const tech = {
},
{
name: "free-electron laser",
- description: "+200% laser damage
–250% laser energy efficiency",
+ description: "+225% laser damage
–250% laser energy efficiency",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -6083,7 +6044,7 @@ const tech = {
requires: "laser, not pulse, diodes",
effect() {
tech.laserFieldDrain = 0.0063 //base is 0.002
- tech.laserDamage = 0.48; //base is 0.16
+ tech.laserDamage = 0.52; //base is 0.16, 0.16 * (1 + 2.25)
tech.laserColor = "#83f"
tech.laserColorAlpha = "rgba(136, 51, 255,0.5)"
},
@@ -7348,7 +7309,7 @@ const tech = {
frequency: 3,
frequencyDefault: 3,
allowed() {
- return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 3)
+ return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass" || m.fieldUpgrades[m.fieldMode].name === "time dilation" || m.fieldUpgrades[m.fieldMode].name === "wormhole") && (build.isExperimentSelection || powerUps.research.count > 6)
},
requires: "wormhole, time dilation, negative mass, pilot wave",
effect() {
@@ -10388,5 +10349,5 @@ const tech = {
isMicroTransactions: null,
isLaserLens: null,
laserCrit: null,
- isSporeZooid: null,
+ isSporeColony: null,
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index 184bd2c..497df36 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,24 +1,31 @@
******************************************************** NEXT PATCH **************************************************
-molecular fabricator defaults to random type on game load
- spores, missile, ice IX, drones
-
-renamed fleas -> siphonaptera
+siphonaptera makes shotgun fire fleas
+colony 37% -> 50% more stuff in sporangium
+foam bullets have a +7% slow effect
+ about +7% damage for some foam tech
+laser diode 33% -> 40% less energy cost
+free-electron laser 200% -> 225% damage
+extra clicks in experiment and unified field theory pause now switches molecular fab types
+bug fixes
+ mob stun graphics is more consistent and less like mob invincibility
*********************************************************** TODO *****************************************************
+tech ______ effect that last until you get hit
+ field or bots can check your health every cycle and see if it lower
+ if it's high update the health check value
+ effect:
+ +damage until getting hit for cloaking field
+
fleas
add very short (2 cycle) delay after each landing -> hop
zero velocity while on short delay? try it?
flea tech:
add a delay to flea jumping also +dmg
-improve mob invincible graphic
- opacity oscillates from 100% to 0%?
- make different from stun
-
make plasma ball power up and block pick up still work when you have no no energy
make a unique CD var for plasma ball?
@@ -37,7 +44,7 @@ testChamber2
for cube
button that activates a laser beam that hits a target and opens a door
in order to enter the door you need to place the cube on the button to activate the laser
- cube has to fly through a portal in oder to get to the button
+ cube has to fly through a portal in order to get to the button
you can't use your body
story:
you pick up the cube early on and have to get it to a button
@@ -55,16 +62,6 @@ testChamber2
mitosis: after needle,bullets or rivets hit a surface split off into two smaller less damaging versions that have their velocity reset -firerate
-tech: florescence
-Hitting a mob makes it emit lasers from its vertices
- all laser but pulse?
- should trigger a global cd so it can't occur more then once per cycle
-
-tech spawn bots that last until you get hit
- bots can check you health every cycle and see if it lower
- it it's high update the health check value
- JUNK?
-
after killing a mob go invulnerable for 1 second
critical hit with laser, harpoon, nails, needle, rivet