orbital armor

finalBoss pushes away things between every phase
  it's much smaller in black hole phase and very hard to hit

timeBoss, shooterBoss, orbitalBoss, laserTargetingBoss have "orbital armor"
  orbitals have less health and move a bit slower
  orbitalBoss is slower and has more health
blinkBoss does much less collision damage
laserTargetingBoss does 2.5x damage but it's laser is only on 1/2 the time

URL builds share what mode molecular assembler is on
This commit is contained in:
landgreen
2022-07-19 18:55:27 -07:00
parent b7adeb0617
commit f3a115b237
6 changed files with 206 additions and 179 deletions

View File

@@ -3040,7 +3040,7 @@ const b = {
lockedOn: null, lockedOn: null,
delay: 50, delay: 50,
cd: simulation.cycle + 10, cd: simulation.cycle + 10,
dmg: radius * (tech.isMutualism ? 2.5 : 1), dmg: 0, //radius * (tech.isMutualism ? 2.5 : 1),
setDamage() { //dmg is set to zero after doing damage once, and set back to normal after jumping 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 this.dmg = radius * (tech.isMutualism ? 2.5 : 1) //damage done in addition to the damage from momentum //spores do 7 dmg, worms do 18
}, },
@@ -5587,6 +5587,7 @@ const b = {
const angle = m.angle + 0.2 * (Math.random() - 0.5) const angle = m.angle + 0.2 * (Math.random() - 0.5)
const speed = (input.down ? 33 : 20) * (1 + 0.1 * Math.random()) const speed = (input.down ? 33 : 20) * (1 + 0.1 * Math.random())
b.flea(where, { x: speed * Math.cos(angle), y: speed * Math.sin(angle) }) b.flea(where, { x: speed * Math.cos(angle), y: speed * Math.sin(angle) })
bullet[bullet.length - 1].setDamage()
} }
} else if (tech.isSporeWorm) { } 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 where = { x: m.pos.x + 35 * Math.cos(m.angle), y: m.pos.y + 35 * Math.sin(m.angle) }

View File

@@ -152,6 +152,12 @@ window.addEventListener('load', () => {
} }
if (property === "level") document.getElementById("starting-level").value = Math.max(Number(set[property]) - 1, 0) if (property === "level") document.getElementById("starting-level").value = Math.max(Number(set[property]) - 1, 0)
if (property === "noPower") document.getElementById("no-power-ups").checked = Number(set[property]) if (property === "noPower") document.getElementById("no-power-ups").checked = Number(set[property])
if (property === "molMode") {
simulation.molecularMode = Number(set[property])
const i = 4 //update experiment text
m.fieldUpgrades[i].description = m.fieldUpgrades[i].setDescription()
document.getElementById(`field-${i}`).innerHTML = `<div class="grid-title"><div class="circle-grid field"></div> &nbsp; ${build.nameLink(m.fieldUpgrades[i].name)}</div> ${m.fieldUpgrades[i].description}`
}
// if (property === "seed") { // if (property === "seed") {
// document.getElementById("seed").placeholder = Math.initialSeed = String(set[property]) // document.getElementById("seed").placeholder = Math.initialSeed = String(set[property])
// Math.seed = Math.abs(Math.hash(Math.initialSeed)) // Math.seed = Math.abs(Math.hash(Math.initialSeed))
@@ -590,6 +596,13 @@ ${simulation.isCheating ? "<br><br><em>lore disabled</em>": ""}
} }
} }
} }
url += `&molMode=${encodeURIComponent(simulation.molecularMode)}`
// if (property === "molMode") {
// simulation.molecularMode = Number(set[property])
// m.fieldUpgrades[i].description = m.fieldUpgrades[i].setDescription()
// document.getElementById(`field-${i}`).innerHTML = `<div class="grid-title"><div class="circle-grid field"></div> &nbsp; ${build.nameLink(m.fieldUpgrades[i].name)}</div> ${m.fieldUpgrades[i].description}`
// }
url += `&field=${encodeURIComponent(m.fieldUpgrades[m.fieldMode].name.trim())}` url += `&field=${encodeURIComponent(m.fieldUpgrades[m.fieldMode].name.trim())}`
url += `&difficulty=${simulation.difficultyMode}` url += `&difficulty=${simulation.difficultyMode}`
if (isCustom) { if (isCustom) {

View File

@@ -36,7 +36,7 @@ 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, "tech");
// for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research"); // for (let i = 0; i < 10; i++) powerUps.directSpawn(450, -50, "research");
// spawn.starter(1900, -500, 200) // spawn.starter(1900, -500, 200)
// spawn.powerUpBossBaby(1900, -500) // spawn.laserTargetingBoss(1900, -500)
// for (let i = 0; i < 10; ++i) spawn.grower(1900, -500) // for (let i = 0; i < 10; ++i) spawn.grower(1900, -500)
// level.testing(); //not in rotation, used for testing // 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 < 7; ++i) powerUps.directSpawn(m.pos.x + 50 * Math.random(), m.pos.y + 50 * Math.random(), "research");
@@ -2902,11 +2902,11 @@ const level = {
for (let i = 0; i < 9; ++i) powerUps.spawn(-1800 + 550 * Math.random(), -1700, "ammo") for (let i = 0; i < 9; ++i) powerUps.spawn(-1800 + 550 * Math.random(), -1700, "ammo")
for (let i = 0; i < 3; ++i) powerUps.spawn(-1800 + 550 * Math.random(), -1700, "heal"); for (let i = 0; i < 3; ++i) powerUps.spawn(-1800 + 550 * Math.random(), -1700, "heal");
const scale = Math.pow(simulation.difficulty, 0.7) //hard around 30, why around 54 const scale = Math.pow(simulation.difficulty, 0.7) //hard around 30, why around 54
if (Math.random() < 0.07 && simulation.difficulty > 30) { if (Math.random() < 0.07 && simulation.difficulty > 35) {
for (let i = 0, len = scale * 0.25 / 5; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15 for (let i = 0, len = scale * 0.25 / 6; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15
for (let i = 0, len = scale * 0.1 / 5; i < len; ++i) spawn.bounceBoss(-1327 - 200 * i, -1525, 80, false); for (let i = 0, len = scale * 0.1 / 6; i < len; ++i) spawn.bounceBoss(-1327 - 200 * i, -1525, 80, false);
for (let i = 0, len = scale * 0.15 / 5; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false) for (let i = 0, len = scale * 0.15 / 6; i < len; ++i) spawn.sprayBoss(-1327 - 200 * i, -1525, 30, false)
for (let i = 0, len = scale * 0.26 / 5; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false); for (let i = 0, len = scale * 0.26 / 6; i < len; ++i) spawn.mineBoss(-1327 - 200 * i, -1525, 50, false);
} else { } else {
if (Math.random() < 0.25) { if (Math.random() < 0.25) {
for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15 for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.timeBoss(-1327 - 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15
@@ -2982,11 +2982,11 @@ const level = {
for (let i = 0; i < 9; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "ammo") for (let i = 0; i < 9; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "ammo")
for (let i = 0; i < 3; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "heal"); for (let i = 0; i < 3; ++i) powerUps.spawn(1200 + 550 * Math.random(), -1700, "heal");
const scale = Math.pow(simulation.difficulty, 0.7) //hard around 30, why around 54 const scale = Math.pow(simulation.difficulty, 0.7) //hard around 30, why around 54
if (Math.random() < 0.07 && simulation.difficulty > 30) { if (Math.random() < 0.07 && simulation.difficulty > 35) {
for (let i = 0, len = scale * 0.25 / 5; i < len; ++i) spawn.timeBoss(1487 + 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15 for (let i = 0, len = scale * 0.25 / 6; i < len; ++i) spawn.timeBoss(1487 + 200 * i, -1525, 60, false); //spawn 1-2 at difficulty 15
for (let i = 0, len = scale * 0.1 / 5; i < len; ++i) spawn.bounceBoss(1487 + 200 * i, -1525, 80, false); for (let i = 0, len = scale * 0.1 / 6; i < len; ++i) spawn.bounceBoss(1487 + 200 * i, -1525, 80, false);
for (let i = 0, len = scale * 0.15 / 5; i < len; ++i) spawn.sprayBoss(1487 + 200 * i, -1525, 30, false) for (let i = 0, len = scale * 0.15 / 6; i < len; ++i) spawn.sprayBoss(1487 + 200 * i, -1525, 30, false)
for (let i = 0, len = scale * 0.26 / 5; i < len; ++i) spawn.mineBoss(1487 + 200 * i, -1525, 50, false); for (let i = 0, len = scale * 0.26 / 6; i < len; ++i) spawn.mineBoss(1487 + 200 * i, -1525, 50, false);
} else { } else {
if (Math.random() < 0.25) { if (Math.random() < 0.25) {
for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.timeBoss(1487 + 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15 for (let i = 0, len = scale * 0.25; i < len; ++i) spawn.timeBoss(1487 + 200 * i, -1525, 80, false); //spawn 1-2 at difficulty 15

View File

@@ -339,8 +339,8 @@ const spawn = {
me.memory = Infinity; me.memory = Infinity;
me.hasRunDeathScript = false me.hasRunDeathScript = false
me.locatePlayer(); me.locatePlayer();
const density = 0.2 // const density = 0.2
Matter.Body.setDensity(me, density); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.2); //extra dense //normal is 0.001 //makes effective life much larger
// spawn.shield(me, x, y, 1); // spawn.shield(me, x, y, 1);
me.onDeath = function() { me.onDeath = function() {
if (!this.hasRunDeathScript) { if (!this.hasRunDeathScript) {
@@ -477,21 +477,28 @@ const spawn = {
} }
}; };
me.onDamage = function() {}; me.onDamage = function() {};
me.cycle = 420; me.cycle = 660;
me.endCycle = 780; me.endCycle = 780;
me.totalCycles = 0 me.totalCycles = 0
me.mode = 0; me.mode = 0;
me.damageReduction = 0.25 //reset on each new mode me.damageReduction = 0.25 //reset on each new mode
me.pushAway = function(magX = 0.13, magY = 0.05) {
for (let i = 0, len = body.length; i < len; ++i) { //push blocks away horizontally
body[i].force.x += magX * body[i].mass * (body[i].position.x > this.position.x ? 1 : -1)
body[i].force.y -= magY * body[i].mass
}
for (let i = 0, len = bullet.length; i < len; ++i) { //push blocks away horizontally
bullet[i].force.x += magX * bullet[i].mass * (bullet[i].position.x > this.position.x ? 1 : -1)
bullet[i].force.y -= magY * bullet[i].mass
}
for (let i = 0, len = powerUp.length; i < len; ++i) { //push blocks away horizontally
powerUp[i].force.x += magX * powerUp[i].mass * (powerUp[i].position.x > this.position.x ? 1 : -1)
powerUp[i].force.y -= magY * powerUp[i].mass
}
player.force.x += magX * player.mass * (player.position.x > this.position.x ? 1 : -1)
player.force.y -= magY * player.mass
}
me.do = function() { me.do = function() {
// this.armor();
// Matter.Body.setPosition(this, {
// x: x,
// y: y
// });
// Matter.Body.setVelocity(this, {
// x: 0,
// y: 0
// });
this.modeDo(); //this does different things based on the mode this.modeDo(); //this does different things based on the mode
this.checkStatus(); this.checkStatus();
this.cycle++; //switch modes÷ if time isn't paused this.cycle++; //switch modes÷ if time isn't paused
@@ -501,30 +508,23 @@ const spawn = {
this.cycle = 0; this.cycle = 0;
this.mode++ this.mode++
this.damageReduction = 0.25 this.damageReduction = 0.25
if (this.totalCycles > 180) this.pushAway();
if (this.mode > 2) { if (this.mode > 2) {
this.mode = 0; this.mode = 0;
this.fill = "#50f"; this.fill = "#50f";
this.rotateVelocity = Math.abs(this.rotateVelocity) * (player.position.x > this.position.x ? 1 : -1) //rotate so that the player can get away this.rotateVelocity = Math.abs(this.rotateVelocity) * (player.position.x > this.position.x ? 1 : -1) //rotate so that the player can get away
this.modeDo = this.modeLasers this.modeDo = this.modeLasers
//push blocks and player away, since this is the end of suck, and suck causes blocks to fall on the boss and stun it //push blocks and player away, since this is the end of suck, and suck causes blocks to fall on the boss and stun it
Matter.Body.scale(this, 10, 10); Matter.Body.scale(this, 1000, 1000);
Matter.Body.setDensity(me, density); //extra dense //normal is 0.001 //makes effective life much larger
if (!this.isShielded) spawn.shield(this, this.position.x, this.position.y, 1); // regen shield to also prevent stun if (!this.isShielded) spawn.shield(this, this.position.x, this.position.y, 1); // regen shield to also prevent stun
for (let i = 0, len = body.length; i < len; ++i) { //push blocks away horizontally
if (body[i].position.x > this.position.x) {
body[i].force.x = 0.5
} else {
body[i].force.x = -0.5
}
}
} else if (this.mode === 1) { } else if (this.mode === 1) {
this.fill = "#50f"; // this.fill = "rgb(150,150,255)"; this.fill = "#50f"; // this.fill = "rgb(150,150,255)";
this.modeDo = this.modeSpawns this.modeDo = this.modeSpawns
} else if (this.mode === 2) { } else if (this.mode === 2) {
this.fill = "#000"; this.fill = "#000";
this.modeDo = this.modeSuck this.modeDo = this.modeSuck
Matter.Body.scale(this, 0.1, 0.1); Matter.Body.scale(this, 0.001, 0.001);
Matter.Body.setDensity(me, 100 * density); //extra dense //normal is 0.001 //makes effective life much larger this.damageReduction = 0.000025
} }
if (tech.isGunCycle) { if (tech.isGunCycle) {
b.inventoryGun++; b.inventoryGun++;
@@ -533,10 +533,11 @@ const spawn = {
} }
} }
} else if (this.mode !== 3) { //all three modes at once } else if (this.mode !== 3) { //all three modes at once
this.pushAway();
this.cycle = 0; this.cycle = 0;
Matter.Body.setDensity(me, 10 * density); //extra dense //normal is 0.001 //makes effective life much larger this.damageReduction = 0.15
if (this.mode === 2) { if (this.mode === 2) {
Matter.Body.scale(this, 5, 5); Matter.Body.scale(this, 500, 500);
} else { } else {
Matter.Body.scale(this, 0.5, 0.5); Matter.Body.scale(this, 0.5, 0.5);
} }
@@ -577,7 +578,7 @@ const spawn = {
}); });
} }
if (!(this.cycle % 2 * this.spawnInterval) && mob.length < 40) { if (!(this.cycle % 2 * this.spawnInterval) && mob.length < 40) {
const len = (this.totalCycles / 600 + simulation.difficulty / 2 - 30) / 15 const len = (this.totalCycles / 1000 + simulation.difficulty / 2 - 30) / 15
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
spawn.randomLevelBoss(3000 * (simulation.isHorizontalFlipped ? -1 : 1) + 2000 * (Math.random() - 0.5), -1100 + 200 * (Math.random() - 0.5)) spawn.randomLevelBoss(3000 * (simulation.isHorizontalFlipped ? -1 : 1) + 2000 * (Math.random() - 0.5), -1100 + 200 * (Math.random() - 0.5))
} }
@@ -2667,10 +2668,13 @@ const spawn = {
} }
}, },
laserTargetingBoss(x, y, radius = 80) { laserTargetingBoss(x, y, radius = 80) {
const color = "#05f" const color = "#07f"
mobs.spawn(x, y, 3, radius, color); mobs.spawn(x, y, 3, radius, color);
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.004); //extra dense //normal is 0.001 //makes effective life much larger
me.damageReduction = 0.1 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
Matter.Body.rotate(me, Math.random() * Math.PI * 2); Matter.Body.rotate(me, Math.random() * Math.PI * 2);
me.accelMag = 0.00018 * Math.sqrt(simulation.accelScale); me.accelMag = 0.00018 * Math.sqrt(simulation.accelScale);
@@ -2682,18 +2686,15 @@ const spawn = {
me.friction = 0; me.friction = 0;
me.lookTorque = 0.000001 * (Math.random() > 0.5 ? -1 : 1); me.lookTorque = 0.000001 * (Math.random() > 0.5 ? -1 : 1);
me.fireDir = { x: 0, y: 0 } me.fireDir = { x: 0, y: 0 }
Matter.Body.setDensity(me, 0.008); //extra dense //normal is 0.001 //makes effective life much larger
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
spawn.spawnOrbitals(me, radius + 200 + 300 * Math.random()) // spawn.spawnOrbitals(me, radius + 50 + 100 * Math.random())
me.onHit = function() { for (let i = 0, len = 2 + 0.3 * Math.sqrt(simulation.difficulty); i < len; i++) spawn.spawnOrbitals(me, radius + 40 + 10 * i, 1);
//run this function on hitting player // me.onHit = function() { };
// this.explode();
};
// spawn.shield(me, x, y, 1); //not working, not sure why // spawn.shield(me, x, y, 1); //not working, not sure why
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
}; };
me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.laserInterval = 100
me.do = function() { me.do = function() {
// this.armor(); // this.armor();
this.seePlayerByLookingAt(); this.seePlayerByLookingAt();
@@ -2702,10 +2703,7 @@ const spawn = {
if (this.seePlayer.recall) { if (this.seePlayer.recall) {
//set direction to turn to fire //set direction to turn to fire
if (!(simulation.cycle % this.seePlayerFreq)) { if (!(simulation.cycle % this.seePlayerFreq)) this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position));
this.fireDir = Vector.normalise(Vector.sub(this.seePlayer.position, this.position));
// this.fireDir.y -= Math.abs(this.seePlayer.position.x - this.position.x) / 1600; //gives the bullet an arc
}
//rotate towards fireAngle //rotate towards fireAngle
const angle = this.angle + Math.PI / 2; const angle = this.angle + Math.PI / 2;
@@ -2716,12 +2714,7 @@ const spawn = {
} else if (c < -threshold) { } else if (c < -threshold) {
this.torque -= 0.000004 * this.inertia; this.torque -= 0.000004 * this.inertia;
} }
// if (Math.abs(c) < 0.3) { if (simulation.cycle % this.laserInterval > this.laserInterval / 2) {
// const mag = 0.05
// this.force.x += mag * Math.cos(this.angle)
// this.force.y += mag * Math.sin(this.angle)
// }
const vertexCollision = function(v1, v1End, domain) { const vertexCollision = function(v1, v1End, domain) {
for (let i = 0; i < domain.length; ++i) { for (let i = 0; i < domain.length; ++i) {
let vertices = domain[i].vertices; let vertices = domain[i].vertices;
@@ -2762,7 +2755,6 @@ const spawn = {
} }
} }
}; };
const seeRange = 8000; const seeRange = 8000;
best = { best = {
x: null, x: null,
@@ -2782,12 +2774,12 @@ const spawn = {
// hitting player // hitting player
if ((best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) { if ((best.who === playerBody || best.who === playerHead) && m.immuneCycle < m.cycle) {
const dmg = 0.002 * simulation.dmgScale; const dmg = 0.006 * simulation.dmgScale;
m.damage(dmg); m.damage(dmg);
//draw damage //draw damage
ctx.fillStyle = color; ctx.fillStyle = color;
ctx.beginPath(); ctx.beginPath();
ctx.arc(best.x, best.y, dmg * 10000, 0, 2 * Math.PI); ctx.arc(best.x, best.y, dmg * 1500, 0, 2 * Math.PI);
ctx.fill(); ctx.fill();
} }
//draw beam //draw beam
@@ -2800,6 +2792,17 @@ const spawn = {
ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]); ctx.setLineDash([50 + 120 * Math.random(), 50 * Math.random()]);
ctx.stroke(); ctx.stroke();
ctx.setLineDash([]); ctx.setLineDash([]);
ctx.beginPath();
ctx.arc(this.vertices[1].x, this.vertices[1].y, 1 + 0.3 * (this.laserInterval - simulation.cycle % this.laserInterval), 0, 2 * Math.PI); //* this.fireCycle / this.fireDelay
ctx.fillStyle = color;
ctx.fill();
} else {
ctx.beginPath();
ctx.arc(this.vertices[1].x, this.vertices[1].y, 1 + 0.3 * (simulation.cycle % this.laserInterval), 0, 2 * Math.PI); //* this.fireCycle / this.fireDelay
ctx.fillStyle = color;
ctx.fill();
}
} }
}; };
}, },
@@ -2959,8 +2962,9 @@ const spawn = {
mobs.spawn(x, y, 5, 50, "rgb(0,235,255)"); //"rgb(221,102,119)" mobs.spawn(x, y, 5, 50, "rgb(0,235,255)"); //"rgb(221,102,119)"
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
Matter.Body.rotate(me, Math.PI * 0.1); Matter.Body.rotate(me, Math.PI * 0.1);
Matter.Body.setDensity(me, 0.018); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.003); //extra dense //normal is 0.001 //makes effective life much larger
me.isBoss = true; me.isBoss = true;
me.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.frictionStatic = 0; me.frictionStatic = 0;
me.friction = 0; me.friction = 0;
@@ -2994,7 +2998,6 @@ const spawn = {
} }
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
} }
me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.do = function() { me.do = function() {
// this.armor(); // this.armor();
this.seePlayerByHistory() this.seePlayerByHistory()
@@ -3695,13 +3698,13 @@ const spawn = {
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
me.inertia = Infinity; //no rotation me.inertia = Infinity; //no rotation
me.burstFireFreq = 22 + Math.floor(15 * simulation.CDScale) me.burstFireFreq = 22 + Math.floor(13 * simulation.CDScale)
me.burstTotalPhases = 3.5 + Math.floor(1.5 / simulation.CDScale) me.burstTotalPhases = 3 + Math.floor(1.4 / simulation.CDScale)
me.frictionStatic = 0; me.frictionStatic = 0;
me.friction = 0; me.friction = 0;
me.frictionAir = 0; me.frictionAir = 0;
me.restitution = 1 me.restitution = 1
spawn.spawnOrbitals(me, radius + 50 + 125 * Math.random(), 1) // spawn.spawnOrbitals(me, radius + 50 + 125 * Math.random(), 1)
Matter.Body.setDensity(me, 0.002 + 0.0001 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.002 + 0.0001 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.damageReduction = 0.09 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0.09 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.startingDamageReduction = me.damageReduction me.startingDamageReduction = me.damageReduction
@@ -3744,8 +3747,8 @@ const spawn = {
if (this.speed < 0.01) { if (this.speed < 0.01) {
Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(Vector.sub(player.position, this.position)), 0.1)); Matter.Body.setVelocity(this, Vector.mult(Vector.normalise(Vector.sub(player.position, this.position)), 0.1));
} else { } else {
if (Math.abs(this.velocity.y) < 10) Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.05 }); if (Math.abs(this.velocity.y) < 9) Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.03 });
if (Math.abs(this.velocity.x) < 8) Matter.Body.setVelocity(this, { x: this.velocity.x * 1.05, y: this.velocity.y }); if (Math.abs(this.velocity.x) < 7) Matter.Body.setVelocity(this, { x: this.velocity.x * 1.03, y: this.velocity.y });
} }
} }
me.burstFire = function() { me.burstFire = function() {
@@ -3798,10 +3801,10 @@ const spawn = {
// Matter.Body.rotate(me, 2 * Math.PI * Math.random()); // Matter.Body.rotate(me, 2 * Math.PI * Math.random());
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.001); //normal is 0.001 Matter.Body.setDensity(me, 0.001); //normal is 0.001
me.inertia = Infinity;
me.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0.04 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.startingDamageReduction = me.damageReduction me.startingDamageReduction = me.damageReduction
me.isInvulnerable = false me.isInvulnerable = false
me.inertia = Infinity;
me.frictionAir = 0.01 me.frictionAir = 0.01
me.restitution = 1 me.restitution = 1
me.friction = 0 me.friction = 0
@@ -3858,10 +3861,10 @@ const spawn = {
// this.isInvulnerable = true // this.isInvulnerable = true
// this.damageReduction = 0 // this.damageReduction = 0
} else { } else {
if (Math.abs(this.velocity.y) < 11) { if (Math.abs(this.velocity.y) < 10) {
Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.03 }); Matter.Body.setVelocity(this, { x: this.velocity.x, y: this.velocity.y * 1.03 });
} }
if (Math.abs(this.velocity.x) < 8) { if (Math.abs(this.velocity.x) < 7) {
Matter.Body.setVelocity(this, { x: this.velocity.x * 1.03, y: this.velocity.y }); Matter.Body.setVelocity(this, { x: this.velocity.x * 1.03, y: this.velocity.y });
} }
} }
@@ -3926,7 +3929,7 @@ const spawn = {
this.death(); this.death();
//hit player //hit player
if (Vector.magnitude(Vector.sub(this.position, player.position)) < this.explodeRange && m.immuneCycle < m.cycle) { if (Vector.magnitude(Vector.sub(this.position, player.position)) < this.explodeRange && m.immuneCycle < m.cycle) {
m.damage(0.015 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1)); m.damage(0.01 * simulation.dmgScale * (tech.isRadioactiveResistance ? 0.25 : 1));
m.energy -= 0.15 * (tech.isRadioactiveResistance ? 0.25 : 1) m.energy -= 0.15 * (tech.isRadioactiveResistance ? 0.25 : 1)
if (m.energy < 0) m.energy = 0 if (m.energy < 0) m.energy = 0
} }
@@ -3954,9 +3957,9 @@ const spawn = {
Matter.Body.rotate(me, 2 * Math.PI * Math.random()); Matter.Body.rotate(me, 2 * Math.PI * Math.random());
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.003); //normal is 0.001 Matter.Body.setDensity(me, 0.003); //normal is 0.001
me.inertia = Infinity;
me.damageReduction = 0.1 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0.1 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.startingDamageReduction = me.damageReduction me.startingDamageReduction = me.damageReduction
me.inertia = Infinity;
me.isInvulnerable = false me.isInvulnerable = false
me.frictionAir = 0.01 me.frictionAir = 0.01
me.restitution = 1 me.restitution = 1
@@ -4036,7 +4039,7 @@ const spawn = {
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.001); //normal is 0.001 Matter.Body.setDensity(me, 0.001); //normal is 0.001
me.inertia = Infinity; me.inertia = Infinity;
me.damageReduction = 0.06 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1) me.damageReduction = 0.05 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.startingDamageReduction = me.damageReduction me.startingDamageReduction = me.damageReduction
me.isInvulnerable = false me.isInvulnerable = false
me.frictionAir = 0.01 me.frictionAir = 0.01
@@ -4045,8 +4048,8 @@ const spawn = {
me.collisionFilter.mask = cat.bullet | cat.player | cat.body | cat.map | cat.mob me.collisionFilter.mask = cat.bullet | cat.player | cat.body | cat.map | cat.mob
Matter.Body.setVelocity(me, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) }); Matter.Body.setVelocity(me, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) });
me.seePlayer.recall = 1; me.seePlayer.recall = 1;
spawn.spawnOrbitals(me, radius + 25, 1) // for (let i = 0; i < 4; i++) spawn.spawnOrbitals(me, radius + 25, 1)
for (let i = 0, len = 2 + 0.3 * Math.sqrt(simulation.difficulty); i < len; i++) spawn.spawnOrbitals(me, radius + 10 + 10 * i, 1);
// me.skipRate = 1 + Math.floor(simulation.difficulty*0.02) // me.skipRate = 1 + Math.floor(simulation.difficulty*0.02)
// spawn.shield(me, x, y, 1); // spawn.shield(me, x, y, 1);
@@ -4054,7 +4057,7 @@ const spawn = {
if (this.health < this.nextHealthThreshold) { if (this.health < this.nextHealthThreshold) {
this.health = this.nextHealthThreshold - 0.01 this.health = this.nextHealthThreshold - 0.01
this.nextHealthThreshold = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25 this.nextHealthThreshold = Math.floor(this.health * 4) / 4 //0.75,0.5,0.25
this.invulnerableCount = 300 + simulation.difficulty * 4 //how long does invulnerable time last this.invulnerableCount = 420 + simulation.difficulty * 5 //how long does invulnerable time last
this.isInvulnerable = true this.isInvulnerable = true
this.damageReduction = 0 this.damageReduction = 0
// requestAnimationFrame(() => { simulation.timePlayerSkip(300) }); //wrapping in animation frame prevents errors, probably // requestAnimationFrame(() => { simulation.timePlayerSkip(300) }); //wrapping in animation frame prevents errors, probably
@@ -4091,7 +4094,10 @@ const spawn = {
} }
//time dilation //time dilation
if (!simulation.isTimeSkipping) { if (!simulation.isTimeSkipping) {
requestAnimationFrame(() => { simulation.timePlayerSkip(3) }); //wrapping in animation frame prevents errors, probably requestAnimationFrame(() => {
simulation.timePlayerSkip(2)
m.walk_cycle += m.flipLegs * m.Vx //makes the legs look like they are moving fast
}); //wrapping in animation frame prevents errors, probably
// if (!(simulation.cycle % 10)) // if (!(simulation.cycle % 10))
//draw invulnerable //draw invulnerable
@@ -4121,7 +4127,7 @@ const spawn = {
mobs.spawn(x, y, sides, radius, "rgb(255,0,155)"); mobs.spawn(x, y, sides, radius, "rgb(255,0,155)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.stroke = "transparent"; me.stroke = "transparent";
Matter.Body.setDensity(me, 0.00003); //normal is 0.001 Matter.Body.setDensity(me, 0.00001); //normal is 0.001
me.timeLeft = 360 + Math.floor(180 * Math.random()) me.timeLeft = 360 + Math.floor(180 * Math.random())
me.inertia = Infinity; me.inertia = Infinity;
me.damageReduction = 1 me.damageReduction = 1
@@ -4676,35 +4682,28 @@ const spawn = {
}, 2000); //add in a delay in case the level gets flipped left right }, 2000); //add in a delay in case the level gets flipped left right
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.008 + 0.0003 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front me.vertices = Matter.Vertices.rotate(me.vertices, Math.PI, me.position); //make the pointy side of triangle the front
me.isVerticesChange = true me.isVerticesChange = true
me.memory = 240; me.memory = 240;
// me.homePosition = {
// x: x,
// y: y
// };
me.fireFreq = 0.025; me.fireFreq = 0.025;
me.noseLength = 0; me.noseLength = 0;
me.fireAngle = 0; me.fireAngle = 0;
me.accelMag = 0.005 * simulation.accelScale; me.accelMag = 0.005 * simulation.accelScale;
me.frictionAir = 0.05; me.frictionAir = 0.05;
me.lookTorque = 0.000006 * (Math.random() > 0.5 ? -1 : 1); me.lookTorque = 0.000006 * (Math.random() > 0.5 ? -1 : 1);
me.fireDir = { me.fireDir = { x: 0, y: 0 };
x: 0,
y: 0
};
setTimeout(() => { setTimeout(() => {
spawn.spawnOrbitals(me, radius + 25, 1); // spawn.spawnOrbitals(me, radius + 200 + 50 * Math.random(), 1);
spawn.spawnOrbitals(me, radius + 75, 1); for (let i = 0, len = 3 + 0.5 * Math.sqrt(simulation.difficulty); i < len; i++) spawn.spawnOrbitals(me, radius + 40 + 10 * i, 1);
}, 100); //have to wait a sec so the tether constraint doesn't attach to an orbital }, 100); //have to wait a sec so the tether constraint doesn't attach to an orbital
Matter.Body.setDensity(me, 0.008 + 0.0003 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.onDeath = function() { me.onDeath = function() {
if (isSpawnBossPowerUp) powerUps.spawnBossPowerUp(this.position.x, this.position.y) if (isSpawnBossPowerUp) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
// this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed // this.vertices = Matter.Vertices.hull(Matter.Vertices.clockwiseSort(this.vertices)) //helps collisions functions work better after vertex have been changed
}; };
me.damageReduction = 0.25 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.do = function() { me.do = function() {
// this.armor(); // this.armor();
this.seePlayerByLookingAt(); this.seePlayerByLookingAt();
@@ -5961,8 +5960,9 @@ const spawn = {
if (Math.random() < chance) { if (Math.random() < chance) {
// simulation.difficulty = 50 // simulation.difficulty = 50
const len = Math.floor(Math.min(15, 3 + Math.sqrt(simulation.difficulty))) // simulation.difficulty = 40 on hard mode level 10 const len = Math.floor(Math.min(15, 3 + Math.sqrt(simulation.difficulty))) // simulation.difficulty = 40 on hard mode level 10
const speed = (0.007 + 0.003 * Math.random() + 0.004 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1) const speed = (0.003 + 0.004 * Math.random() + 0.002 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1)
for (let i = 0; i < len; i++) spawn.orbital(who, radius, i / len * 2 * Math.PI, speed) const offSet = 6.28 * Math.random()
for (let i = 0; i < len; i++) spawn.orbital(who, radius, i / len * 2 * Math.PI + offSet, speed)
} }
}, },
orbital(who, radius, phase, speed) { orbital(who, radius, phase, speed) {
@@ -5970,7 +5970,7 @@ const spawn = {
mobs.spawn(who.position.x, who.position.y, 8, 12, "rgb(255,0,150)"); mobs.spawn(who.position.x, who.position.y, 8, 12, "rgb(255,0,150)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.stroke = "transparent"; me.stroke = "transparent";
Matter.Body.setDensity(me, 0.1); //normal is 0.001 Matter.Body.setDensity(me, 0.01); //normal is 0.001
me.leaveBody = false; me.leaveBody = false;
me.isDropPowerUp = false; me.isDropPowerUp = false;
me.isBadTarget = true; me.isBadTarget = true;
@@ -5996,7 +5996,7 @@ const spawn = {
//damage player //damage player
if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) { if (Matter.Query.collides(this, [player]).length > 0 && !(m.isCloak && tech.isIntangible) && m.immuneCycle < m.cycle) {
m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles m.immuneCycle = m.cycle + tech.collisionImmuneCycles; //player is immune to damage for 30 cycles
const dmg = 0.035 * simulation.dmgScale const dmg = 0.03 * simulation.dmgScale
m.damage(dmg); m.damage(dmg);
simulation.drawList.push({ //add dmg to draw queue simulation.drawList.push({ //add dmg to draw queue
x: this.position.x, x: this.position.x,
@@ -6016,17 +6016,19 @@ const spawn = {
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
me.isBoss = true; me.isBoss = true;
Matter.Body.setDensity(me, 0.0017 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger Matter.Body.setDensity(me, 0.0017 + 0.0002 * Math.sqrt(simulation.difficulty)); //extra dense //normal is 0.001 //makes effective life much larger
me.damageReduction = 0.1 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.stroke = "transparent"; //used for drawGhost me.stroke = "transparent"; //used for drawGhost
me.seeAtDistance2 = 2000000; me.seeAtDistance2 = 2000000;
me.collisionFilter.mask = cat.bullet | cat.player | cat.body | cat.map me.collisionFilter.mask = cat.bullet | cat.player | cat.body | cat.map
me.memory = Infinity; me.memory = Infinity;
me.frictionAir = 0.04; me.frictionAir = 0.04;
me.accelMag = 0.0007 * simulation.accelScale me.accelMag = 0.0002 + 0.00015 * simulation.accelScale
spawn.shield(me, x, y, 1); spawn.shield(me, x, y, 1);
const rangeInnerVsOuter = Math.random() const rangeInnerVsOuter = Math.random()
let speed = (0.009 + 0.0011 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1) let speed = (0.006 + 0.001 * Math.sqrt(simulation.difficulty)) * ((Math.random() < 0.5) ? 1 : -1)
let range = radius + 300 + 200 * rangeInnerVsOuter + nodes * 7 let range = radius + 350 + 200 * rangeInnerVsOuter + nodes * 7
for (let i = 0; i < nodes; i++) spawn.orbital(me, range, i / nodes * 2 * Math.PI, speed) for (let i = 0; i < nodes; i++) spawn.orbital(me, range, i / nodes * 2 * Math.PI, speed)
const orbitalIndexes = [] //find indexes for all the current nodes const orbitalIndexes = [] //find indexes for all the current nodes
for (let i = 0; i < nodes; i++) orbitalIndexes.push(mob.length - 1 - i) for (let i = 0; i < nodes; i++) orbitalIndexes.push(mob.length - 1 - i)
@@ -6037,10 +6039,11 @@ const spawn = {
for (let j = 0; j < nodes; j++) { for (let j = 0; j < nodes; j++) {
for (let i = 0, len = subNodes; i < len; i++) spawn.orbital(mob[orbitalIndexes[j]], range, i / len * 2 * Math.PI, speed) for (let i = 0, len = subNodes; i < len; i++) spawn.orbital(mob[orbitalIndexes[j]], range, i / len * 2 * Math.PI, speed)
} }
for (let i = 0, len = 3 + 0.5 * Math.sqrt(simulation.difficulty); i < len; i++) spawn.spawnOrbitals(me, radius + 40 + 10 * i, 1);
me.onDeath = function() { me.onDeath = function() {
powerUps.spawnBossPowerUp(this.position.x, this.position.y) powerUps.spawnBossPowerUp(this.position.x, this.position.y)
}; };
me.damageReduction = 0.18 / (tech.isScaleMobsWithDuplication ? 1 + tech.duplicationChance() : 1)
me.do = function() { me.do = function() {
this.seePlayerByHistory(); this.seePlayerByHistory();
this.checkStatus(); this.checkStatus();

View File

@@ -234,25 +234,25 @@ const tech = {
if (tech.isEnergyLoss) dmg *= 1.55 if (tech.isEnergyLoss) dmg *= 1.55
if (tech.OccamDamage) dmg *= tech.OccamDamage if (tech.OccamDamage) dmg *= tech.OccamDamage
if (tech.isTechDebt) dmg *= Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount) if (tech.isTechDebt) dmg *= Math.max(41 / (tech.totalCount + 21), 4 - 0.15 * tech.totalCount)
if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.harmReduction()
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555 if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.555
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance()) if (tech.isDupDamage) dmg *= 1 + Math.min(1, tech.duplicationChance())
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length if (tech.isDamageForGuns) dmg *= 1 + 0.13 * b.inventory.length
if (tech.isLowHealthDmg) dmg *= 1 + Math.max(0, 1 - m.health) * 0.5 if (tech.isLowHealthDmg) dmg *= 1 + Math.max(0, 1 - m.health) * 0.5
if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3; if (tech.isHarmDamage && m.lastHarmCycle + 600 > m.cycle) dmg *= 3;
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
if (tech.isAcidDmg && m.health > 1) dmg *= 1.35; if (tech.isAcidDmg && m.health > 1) dmg *= 1.35;
if (tech.isRerollDamage) dmg *= 1 + 0.038 * powerUps.research.count
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage if (tech.restDamage > 1 && player.speed < 1) dmg *= tech.restDamage
if (tech.isLowEnergyDamage) dmg *= 1 + 0.7 * Math.max(0, 1 - m.energy)
if (tech.isEnergyDamage) dmg *= 1 + m.energy * 0.125; if (tech.isEnergyDamage) dmg *= 1 + m.energy * 0.125;
if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007 if (tech.isDamageFromBulletCount) dmg *= 1 + bullet.length * 0.007
if (tech.isRerollDamage) dmg *= 1 + 0.038 * powerUps.research.count
if (tech.isOneGun && b.inventory.length < 2) dmg *= 1.25
if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2 if (tech.isNoFireDamage && m.cycle > m.fireCDcycle + 120) dmg *= 2
if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165) if (tech.isSpeedDamage) dmg *= 1 + Math.min(0.66, player.speed * 0.0165)
if (tech.isBotDamage) dmg *= 1 + 0.06 * b.totalBots()
if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.6 if (tech.isDamageAfterKillNoRegen && m.lastKillCycle + 300 > m.cycle) dmg *= 1.6
if (m.isSneakAttack && m.cycle > m.lastKillCycle + 240) dmg *= tech.sneakAttackDmg if (m.isSneakAttack && m.cycle > m.lastKillCycle + 240) dmg *= tech.sneakAttackDmg
if (tech.isAxion && tech.isHarmMACHO) dmg *= 2 - m.harmReduction()
return dmg * tech.slowFire * tech.aimDamage return dmg * tech.slowFire * tech.aimDamage
}, },
duplicationChance() { duplicationChance() {
@@ -4255,7 +4255,7 @@ const tech = {
frequency: 1, frequency: 1,
frequencyDefault: 1, frequencyDefault: 1,
allowed() { allowed() {
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) 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 === 3) || (tech.haveGunCheck("drones") && !tech.isForeverDrones && !tech.isDroneRadioactive && !tech.isDroneTeleport)
}, },
requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane", requires: "shotgun, super balls, rivets, drones, not irradiated drones, burst drones, polyurethane",
effect() { effect() {

View File

@@ -1,36 +1,46 @@
******************************************************** NEXT PATCH ************************************************** ******************************************************** NEXT PATCH **************************************************
siphonaptera makes shotgun fire fleas finalBoss pushes away things between every phase
colony 37% -> 50% more stuff in sporangium it's much smaller in black hole phase and very hard to hit
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 timeBoss, shooterBoss, orbitalBoss, laserTargetingBoss have "orbital armor"
orbitals have less health and move a bit slower
orbitalBoss is slower and has more health
blinkBoss does much less collision damage
laserTargetingBoss does 2.5x damage but it's laser is only on 1/2 the time
bug fixes URL builds share what mode molecular assembler is on
mob stun graphics is more consistent and less like mob invincibility
*********************************************************** TODO ***************************************************** *********************************************************** TODO *****************************************************
make final Boss hidden for the mob spawning phase?
tech for molecular assembler that generates research?
show damage and defense in game?
defense and damage without difficulty included?
update every: 15 cycles?, 30?, 10?
make a m.damage variable that stores the player damage for all slow changing tech
update m.damage variable when:
new tech
flipFlip triggers
duplicationChance changes
add or remove guns
player health changes
research changes
bot count changes
tech ______ effect that last until you get hit tech ______ effect that last until you get hit
field or bots can check your health every cycle and see if it lower field or bots can check your health every cycle and see if it lower
if it's high update the health check value if it's high update the health check value
effect: effect:
+damage until getting hit for cloaking field +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
make plasma ball power up and block pick up still work when you have no no energy 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? make a unique CD var for plasma ball?
wormhole tech: entropic gravity - gain defense for each research tech: entropic gravity - gain defense for each research
requires wormhole or negative mass field or pilot wave requires wormhole or pilot wave or negative mass field?
testChamber2 testChamber2
mechanics mechanics