ice-IX does 15% more damage

tech: WIMPs - an indestructible harmful particle slowly chases you
  spawn 2-3 research at the end of each level
experimental mode : WIMPS chase you

beating the final boss looks a bit less like death and a bit more like winning
  also there are some text directions on how to enter endless mode (press T after you win)

tech removed: 1-body problem
This commit is contained in:
landgreen
2021-05-13 18:32:20 -07:00
parent c00199daa7
commit 39c9b08b2e
10 changed files with 296 additions and 137 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1727,7 +1727,7 @@ const b = {
sentry() { sentry() {
this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets
this.lookFrequency = simulation.cycle + 60 this.lookFrequency = simulation.cycle + 60
this.endCycle = simulation.cycle + 1080 this.endCycle = simulation.cycle + 1140
this.do = function() { //overwrite the do method for this bullet this.do = function() { //overwrite the do method for this bullet
this.force.y += this.mass * 0.002; //extra gravity this.force.y += this.mass * 0.002; //extra gravity
if (simulation.cycle > this.lookFrequency) { if (simulation.cycle > this.lookFrequency) {
@@ -1771,7 +1771,7 @@ const b = {
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 && if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 &&
// mob[i].isDropPowerUp && mob[i].isDropPowerUp &&
Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0) { Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
this.endCycle = 0 //end life if mob is near and visible this.endCycle = 0 //end life if mob is near and visible
@@ -1847,7 +1847,7 @@ const b = {
this.lockedOn = null; this.lockedOn = null;
let closeDist = Infinity; let closeDist = Infinity;
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
if (Matter.Query.ray(map, this.position, mob[i].position).length === 0) { if (mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
const targetVector = Vector.sub(this.position, mob[i].position) const targetVector = Vector.sub(this.position, mob[i].position)
const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5); const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5);
if (dist < closeDist) { if (dist < closeDist) {
@@ -1932,7 +1932,7 @@ const b = {
friction: 0, friction: 0,
frictionAir: 0.10, frictionAir: 0.10,
restitution: 0.3, restitution: 0.3,
dmg: 0.29, //damage done in addition to the damage from momentum dmg: 0.33, //damage done in addition to the damage from momentum
lookFrequency: 14 + Math.floor(8 * Math.random()), lookFrequency: 14 + Math.floor(8 * Math.random()),
endCycle: simulation.cycle + 140 * tech.isBulletsLastLonger, endCycle: simulation.cycle + 140 * tech.isBulletsLastLonger,
classType: "bullet", classType: "bullet",
@@ -1951,7 +1951,7 @@ const b = {
setTimeout(function() { setTimeout(function() {
if (!who.alive) { if (!who.alive) {
m.energy += tech.iceEnergy * 0.8 m.energy += tech.iceEnergy * 0.8
m.addHealth(tech.iceEnergy * 0.04) // m.addHealth(tech.iceEnergy * 0.04)
} }
}, 10); }, 10);
} }
@@ -2701,7 +2701,7 @@ const b = {
let target let target
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position));
if (dist2 < 1000000 && Matter.Query.ray(map, this.position, mob[i].position).length === 0) { if (dist2 < 1000000 && mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) {
this.cd = simulation.cycle + this.delay; this.cd = simulation.cycle + this.delay;
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60)) target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
const radius = 6 + 7 * Math.random() const radius = 6 + 7 * Math.random()
@@ -2868,6 +2868,7 @@ const b = {
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
if (DIST < closeDist && if (DIST < closeDist &&
mob[i].isDropPowerUp &&
Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0) { Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
closeDist = DIST; closeDist = DIST;
@@ -2932,6 +2933,7 @@ const b = {
for (let i = 0, len = mob.length; i < len; ++i) { for (let i = 0, len = mob.length; i < len; ++i) {
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
if (DIST < closeDist && if (DIST < closeDist &&
mob[i].isDropPowerUp &&
Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0) { Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
closeDist = DIST; closeDist = DIST;
@@ -4111,7 +4113,7 @@ const b = {
name: "rail gun", name: "rail gun",
description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire", description: "use <strong class='color-f'>energy</strong> to launch a high-speed <strong>dense</strong> rod<br><strong>hold</strong> left mouse to charge, <strong>release</strong> to fire",
ammo: 0, ammo: 0,
ammoPack: 3.15, ammoPack: 2.5,
have: false, have: false,
do() {}, do() {},
fire() { fire() {
@@ -4127,7 +4129,7 @@ const b = {
if (tech.isRailAreaDamage) { if (tech.isRailAreaDamage) {
mob[i].force.x += 2 * FORCE.x; mob[i].force.x += 2 * FORCE.x;
mob[i].force.y += 2 * FORCE.y; mob[i].force.y += 2 * FORCE.y;
const damage = b.dmgScale * 0.13 * Math.sqrt(DEPTH) const damage = b.dmgScale * 0.16 * Math.sqrt(DEPTH)
mob[i].damage(damage); mob[i].damage(damage);
mob[i].locatePlayer(); mob[i].locatePlayer();
simulation.drawList.push({ //add dmg to draw queue simulation.drawList.push({ //add dmg to draw queue

View File

@@ -194,7 +194,7 @@ function collisionChecks(event) {
let type = tech.isEnergyNoAmmo ? "heal" : "ammo" let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
if (Math.random() < 0.4) { if (Math.random() < 0.4) {
type = "heal" type = "heal"
} else if (Math.random() < 0.3 && !tech.isSuperDeterminism) { } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) {
type = "research" type = "research"
} }
powerUps.spawn(mob[k].position.x, mob[k].position.y, type); powerUps.spawn(mob[k].position.x, mob[k].position.y, type);

View File

@@ -59,8 +59,10 @@ function getUrlVars() {
return vars; return vars;
} }
window.addEventListener('load', () => { window.addEventListener('load', () => {
const set = getUrlVars() const set = getUrlVars()
if (Object.keys(set).length !== 0) { if (Object.keys(set).length !== 0) {
build.populateGrid() //trying to solve a bug with this, but maybe it doesn't help
openExperimentMenu(); openExperimentMenu();
//add experimental selections based on url //add experimental selections based on url
for (const property in set) { for (const property in set) {
@@ -103,12 +105,8 @@ window.addEventListener('load', () => {
simulation.difficultyMode = Number(set[property]) simulation.difficultyMode = Number(set[property])
document.getElementById("difficulty-select-experiment").value = Number(set[property]) document.getElementById("difficulty-select-experiment").value = Number(set[property])
} }
if (property === "level") { if (property === "level") document.getElementById("starting-level").value = Number(set[property])
document.getElementById("starting-level").value = Number(set[property]) if (property === "noPower") document.getElementById("no-power-ups").checked = Number(set[property])
}
if (property === "noPower") {
document.getElementById("no-power-ups").checked = Number(set[property])
}
} }
} }
}); });

View File

@@ -20,11 +20,11 @@ const level = {
// b.giveGuns("laser") // b.giveGuns("laser")
// tech.isExplodeRadio = true // tech.isExplodeRadio = true
// tech.giveTech("pulse") // tech.giveTech("pulse")
// for (let i = 0; i < 1; i++) tech.giveTech("crystallizer") // for (let i = 0; i < 3; i++) tech.giveTech("amplitude")
// for (let i = 0; i < 3; i++) tech.giveTech("packet length") // 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("propagation")
// for (let i = 0; i < 3; i++) tech.giveTech("bound state") // for (let i = 0; i < 3; i++) tech.giveTech("bound state")
// for (let i = 0; i < 9; i++) tech.giveTech("slow light") // for (let i = 0; i < 9; i++) tech.giveTech("WIMPs")
// tech.giveTech("metastability") // tech.giveTech("metastability")
level.intro(); //starting level level.intro(); //starting level
@@ -111,6 +111,12 @@ const level = {
const len = Math.floor((m.maxHealth - m.health) / 0.5) 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); 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);
} }
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)
}
for (let i = 0; i < tech.wimpExperiment; i++) spawn.WIMP()
// if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false); // if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false);
// if (tech.isPerpetualAmmo) { // if (tech.isPerpetualAmmo) {
// for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false); // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false);

View File

@@ -50,7 +50,6 @@ const mobs = {
const range2 = (180 + 170 * Math.random()) ** 2 const range2 = (180 + 170 * Math.random()) ** 2
for (let i = 0, len = mob.length; i < len; i++) { for (let i = 0, len = mob.length; i < len; i++) {
if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) { if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) {
console.log(mob[i])
applySlow(mob[i]) applySlow(mob[i])
} }
} }
@@ -64,7 +63,6 @@ const mobs = {
} }
function applySlow(whom) { function applySlow(whom) {
console.log()
if (!whom.shield && !whom.isShielded && !m.isBodiesAsleep) { if (!whom.shield && !whom.isShielded && !m.isBodiesAsleep) {
if (whom.isBoss) cycles = Math.floor(cycles * 0.25) if (whom.isBoss) cycles = Math.floor(cycles * 0.25)
let i = whom.status.length let i = whom.status.length

View File

@@ -522,7 +522,7 @@ const m = {
if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.019, 0.60) if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.019, 0.60)
if (tech.isSlowFPS) dmg *= 0.8 if (tech.isSlowFPS) dmg *= 0.8
// if (tech.isPiezo) dmg *= 0.85 // if (tech.isPiezo) dmg *= 0.85
if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.5 if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.5
if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots()
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34 if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34
@@ -986,7 +986,6 @@ const m = {
m.airSpeedLimit = 125 m.airSpeedLimit = 125
m.drop(); m.drop();
m.holdingMassScale = 0.5; m.holdingMassScale = 0.5;
m.isFieldActive = false; //only being used by negative mass field
m.fieldArc = 0.2; //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.fieldArc = 0.2; //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
m.isBodiesAsleep = true; m.isBodiesAsleep = true;
@@ -1670,7 +1669,6 @@ const m = {
m.hold = function() { m.hold = function() {
m.airSpeedLimit = 125 //5 * player.mass * player.mass m.airSpeedLimit = 125 //5 * player.mass * player.mass
m.FxAir = 0.016 m.FxAir = 0.016
m.isFieldActive = false;
if (m.isHolding) { if (m.isHolding) {
m.drawHold(m.holdingTarget); m.drawHold(m.holdingTarget);
m.holding(); m.holding();
@@ -1680,7 +1678,6 @@ const m = {
m.lookForPickUp(); m.lookForPickUp();
const DRAIN = 0.00035 const DRAIN = 0.00035
if (m.energy > DRAIN) { if (m.energy > DRAIN) {
m.isFieldActive = true; //used with tech.isHarmReduce
m.airSpeedLimit = 400 // 7* player.mass * player.mass m.airSpeedLimit = 400 // 7* player.mass * player.mass
m.FxAir = 0.005 m.FxAir = 0.005
@@ -2986,7 +2983,7 @@ const m = {
let type = tech.isEnergyNoAmmo ? "heal" : "ammo" let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
if (Math.random() < 0.4) { if (Math.random() < 0.4) {
type = "heal" type = "heal"
} else if (Math.random() < 0.3 && !tech.isSuperDeterminism) { } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) {
type = "research" type = "research"
} }
powerUps.spawn(mob[k].position.x, mob[k].position.y, type); powerUps.spawn(mob[k].position.x, mob[k].position.y, type);

View File

@@ -89,6 +89,83 @@ const spawn = {
}, },
//mob templates ********************************************************************************************* //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");
let me = mob[mob.length - 1];
me.stroke = "transparent"
me.isShielded = true; //makes it immune to damage
me.leaveBody = false;
me.isDropPowerUp = false;
me.showHealthBar = false;
me.collisionFilter.mask = 0; //cat.player //| cat.body
me.chaseSpeed = 1 + 1.5 * Math.random()
me.awake = function() {
//chase player
const sub = Vector.sub(player.position, this.position)
const where = Vector.add(this.position, Vector.mult(Vector.normalise(sub), this.chaseSpeed))
Matter.Body.setPosition(this, { //hold position
x: where.x,
y: where.y
});
Matter.Body.setVelocity(this, { x: 0, y: 0 });
//aoe damage to player
if (m.immuneCycle < m.cycle && Vector.magnitude(Vector.sub(player.position, this.position)) < this.radius && !tech.isNeutronImmune) {
const DRAIN = 0.07
if (m.energy > DRAIN) {
m.energy -= DRAIN
} else {
m.energy = 0;
m.damage(0.007)
simulation.drawList.push({ //add dmg to draw queue
x: this.position.x,
y: this.position.y,
radius: this.radius,
color: simulation.mobDmgColor,
time: simulation.drawTime
});
}
}
//aoe damage to mobs
// for (let i = 0, len = mob.length; i < len; i++) {
// if (!mob[i].isShielded && Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radius) {
// let dmg = b.dmgScale * 0.082
// if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way
// if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take
// mob[i].damage(dmg);
// if (tech.isNeutronSlow) {
// Matter.Body.setVelocity(mob[i], {
// x: mob[i].velocity.x * this.vacuumSlow,
// y: mob[i].velocity.y * this.vacuumSlow
// });
// }
// }
// }
//draw some flashy graphics
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)";
// ctx.globalCompositeOperation = "lighter"
ctx.fillStyle = `rgba(25,139,170,${0.2+0.12*Math.random()})`;
ctx.fill();
this.radius = 100 * (1 + 0.25 * Math.sin(simulation.cycle * 0.03))
// ctx.fillStyle = "#fff";
// ctx.globalCompositeOperation = "difference";
// ctx.fill();
// ctx.globalCompositeOperation = "source-over"
}
me.do = function() { //wake up 2 seconds after the player moves
if (player.speed > 1 && !m.isCloak) {
setTimeout(() => { this.do = this.awake; }, 2000);
}
this.checkStatus();
};
},
finalBoss(x, y, radius = 300) { finalBoss(x, y, radius = 300) {
mobs.spawn(x, y, 6, radius, "rgb(150,150,255)"); mobs.spawn(x, y, 6, radius, "rgb(150,150,255)");
let me = mob[mob.length - 1]; let me = mob[mob.length - 1];
@@ -122,22 +199,39 @@ const spawn = {
if (!simulation.paused) { if (!simulation.paused) {
count++ count++
if (count < 600) { if (count < 600) {
if (count === 1) simulation.makeTextLog(`<em>//enter testing mode to set level.levels.length to <strong>Infinite</strong></em>`);
if (!(count % 60)) simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> ${(count/60- Math.random()).toFixed(3)}`); if (!(count % 60)) simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> ${(count/60- Math.random()).toFixed(3)}`);
} else if (count === 600) { } else if (count === 600) {
simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> 1`); simulation.makeTextLog(`simulation.analysis <span class='color-symbol'>=</span> 1 <em>//analysis complete</em>`);
} else if (count === 720) { } else if (count === 720) {
simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/${lore.techGoal}`) simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/${lore.techGoal}`)
} else if (count === 900) { } else if (count === 900) {
simulation.makeTextLog(`World.clear(engine.world)`); simulation.makeTextLog(`World.clear(engine.world) <em>//simulation successful</em>`);
} else if (count === 1140) { } else if (count === 1140) {
tech.isImmortal = false; // tech.isImmortal = false;
m.death() // m.death()
// m.alive = false;
// simulation.paused = true;
// m.health = 0;
// m.displayHealth();
document.getElementById("health").style.display = "none"
document.getElementById("health-bg").style.display = "none"
document.getElementById("text-log").style.opacity = 0; //fade out any active text logs
document.getElementById("fade-out").style.opacity = 1; //slowly fades out
// build.shareURL(false)
setTimeout(function() {
World.clear(engine.world);
Engine.clear(engine);
simulation.splashReturn();
}, 6000);
return return
} }
} }
if (simulation.testing) { if (simulation.testing) {
simulation.makeTextLog(`level.levels.length <span class='color-symbol'>=</span> <strong>Infinite</strong>`);
unlockExit() unlockExit()
setTimeout(function() {
simulation.makeTextLog(`level.levels.length <span class='color-symbol'>=</span> <strong>Infinite</strong>`);
}, 1500);
} else { } else {
requestAnimationFrame(loop); requestAnimationFrame(loop);
} }

View File

@@ -145,7 +145,6 @@
}, },
damageFromTech() { damageFromTech() {
let dmg = m.fieldDamage let dmg = m.fieldDamage
if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45 if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45
if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.85 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.85
@@ -662,23 +661,24 @@
b.setFireCD(); b.setFireCD();
} }
}, },
{ // if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ...
name: "1-body problem", // {
description: "if there is exactly <strong>1</strong> active <strong>bullet</strong><br>increase <strong class='color-d'>damage</strong> by <strong>100%</strong>", // name: "1-body problem",
maxCount: 1, // description: "if there is exactly <strong>1</strong> active <strong>bullet</strong><br>increase <strong class='color-d'>damage</strong> by <strong>100%</strong>",
count: 0, // maxCount: 1,
frequency: 2, // count: 0,
allowed() { // frequency: 2,
return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall) // allowed() {
}, // return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall)
requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale", // },
effect() { // requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale",
tech.isOneBullet = true // effect() {
}, // tech.isOneBullet = true
remove() { // },
tech.isOneBullet = false // remove() {
} // tech.isOneBullet = false
}, // }
// },
{ {
name: "microstates", name: "microstates",
description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for every <strong>10</strong> active <strong>bullets</strong>", description: "increase <strong class='color-d'>damage</strong> by <strong>4%</strong><br>for every <strong>10</strong> active <strong>bullets</strong>",
@@ -887,23 +887,6 @@
tech.isExplodeMob = false; tech.isExplodeMob = false;
} }
}, },
{
name: "crystallizer",
description: "after <strong class='color-s'>frozen</strong> mobs <strong>die</strong><br>they have a chance shatter into <strong class='color-s'>ice IX</strong> crystals",
maxCount: 9,
count: 0,
frequency: 2,
allowed() {
return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
},
requires: "a localized freeze effect, no other mob death tech",
effect() {
tech.iceIXOnDeath++
},
remove() {
tech.iceIXOnDeath = 0
}
},
{ {
name: "impact shear", name: "impact shear",
description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br><em>nails target nearby mobs</em>", description: "mobs release a <strong>nail</strong> when they <strong>die</strong><br><em>nails target nearby mobs</em>",
@@ -948,7 +931,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath
}, },
requires: "any mob death tech", requires: "any mob death tech",
effect: () => { effect: () => {
@@ -1749,38 +1732,37 @@
} }
}, },
{ {
name: "clock gating", name: "crystallizer",
description: `<strong>slow</strong> <strong>time</strong> by <strong>50%</strong> after receiving <strong class='color-harm'>harm</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>20%</strong>`, description: "after <strong class='color-s'>frozen</strong> mobs <strong>die</strong><br>they have a chance shatter into <strong class='color-s'>ice IX</strong> crystals",
maxCount: 1, maxCount: 9,
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob
}, },
requires: "FPS above 45", requires: "a localized freeze effect, no other mob death tech",
effect() { effect() {
tech.isSlowFPS = true; tech.iceIXOnDeath++
}, },
remove() { remove() {
tech.isSlowFPS = false; tech.iceIXOnDeath = 0
} }
}, },
{ {
name: "liquid cooling", name: "thermoelectric effect",
description: `<strong class='color-s'>freeze</strong> all mobs for <strong>7</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong>`, description: "<strong>killing</strong> mobs with <strong class='color-s'>ice IX</strong><br>generates <strong>100</strong> <strong class='color-f'>energy</strong>",
maxCount: 1, maxCount: 9,
count: 0, count: 0,
frequency: 4, frequency: 2,
frequencyDefault: 4,
allowed() { allowed() {
return tech.isSlowFPS return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath
}, },
requires: "clock gating", requires: "ice IX",
effect() { effect() {
tech.isHarmFreeze = true; tech.iceEnergy++
}, },
remove() { remove() {
tech.isHarmFreeze = false; tech.iceEnergy = 0;
} }
}, },
{ {
@@ -1817,6 +1799,41 @@
tech.isFreezeHarmImmune = false; tech.isFreezeHarmImmune = false;
} }
}, },
{
name: "liquid cooling",
description: `<strong class='color-s'>freeze</strong> all mobs for <strong>7</strong> seconds<br>after receiving <strong class='color-harm'>harm</strong>`,
maxCount: 1,
count: 0,
frequency: 4,
frequencyDefault: 4,
allowed() {
return tech.isSlowFPS
},
requires: "clock gating",
effect() {
tech.isHarmFreeze = true;
},
remove() {
tech.isHarmFreeze = false;
}
},
{
name: "clock gating",
description: `<strong>slow</strong> <strong>time</strong> by <strong>50%</strong> after receiving <strong class='color-harm'>harm</strong><br>reduce <strong class='color-harm'>harm</strong> by <strong>20%</strong>`,
maxCount: 1,
count: 0,
frequency: 2,
allowed() {
return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow
},
requires: "FPS above 45",
effect() {
tech.isSlowFPS = true;
},
remove() {
tech.isSlowFPS = false;
}
},
{ {
name: "fracture analysis", name: "fracture analysis",
description: "bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs", description: "bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs",
@@ -2696,23 +2713,25 @@
}, },
remove() {} remove() {}
}, },
// { {
// name: "perpetual research", name: "WIMPs",
// description: "find <strong>1</strong> <strong class='color-r'>research</strong> at the start of each <strong>level</strong>", //<strong class='color-harm'>harmful</strong>
// maxCount: 1, description: "a weak massive particle slowly <strong>chases</strong> you<br>spawn <strong>2-3</strong> <strong class='color-r'>research</strong> at the end of each <strong>level</strong>",
// count: 0, maxCount: 9,
// frequency: 2, count: 0,
// allowed() { frequency: 1,
// return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun frequencyDefault: 1,
// }, allowed() {
// requires: "only 1 perpetual effect, not superdeterminism", return true
// effect() { },
// tech.isPerpetualReroll = true requires: "",
// }, effect: () => {
// remove() { tech.wimpCount++
// tech.isPerpetualReroll = false },
// } remove() {
// }, tech.wimpCount = 0
}
},
{ {
name: "bubble fusion", name: "bubble fusion",
description: "after destroying a mob's natural <strong>shield</strong><br>spawn <strong>1-2</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>", description: "after destroying a mob's natural <strong>shield</strong><br>spawn <strong>1-2</strong> <strong class='color-h'>heals</strong>, <strong class='color-g'>ammo</strong>, or <strong class='color-r'>research</strong>",
@@ -3721,7 +3740,7 @@
}, },
remove() { remove() {
tech.wavePacketFrequency = 0.088 //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet tech.wavePacketFrequency = 0.088 //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet
tech.wavePacketLength = 34 //32.7 //31.3 //28.8 //36 //how many wave packets are released // double this to emit 2 packets tech.wavePacketLength = 35 //32.7 //31.3 //28.8 //36 //how many wave packets are released // double this to emit 2 packets
tech.waveLengthRange = 130; tech.waveLengthRange = 130;
} }
}, },
@@ -3976,7 +3995,7 @@
}, },
{ {
name: "sentry", name: "sentry",
description: "<strong>mines</strong> <strong>target</strong> mobs with nails over time<br>mines last about <strong>12</strong> seconds", description: "<strong>mines</strong> <strong>target</strong> mobs with nails over time<br>mines last about <strong>14</strong> seconds",
isGunTech: true, isGunTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -4623,7 +4642,7 @@
}, },
{ {
name: "flux pinning", name: "flux pinning",
description: "blocking with your <strong>field</strong><br><strong>stuns</strong> mobs for <strong>+2</strong> second", description: "<strong>blocking</strong> with your <strong>field</strong><br><strong>stuns</strong> mobs for <strong>+2</strong> second",
isFieldTech: true, isFieldTech: true,
maxCount: 9, maxCount: 9,
count: 0, count: 0,
@@ -4828,33 +4847,15 @@
tech.isIceField = false; tech.isIceField = false;
} }
}, },
{
name: "thermoelectric effect",
description: "<strong>killing</strong> mobs with <strong class='color-s'>ice IX</strong> gives <strong>4</strong> <strong class='color-h'>health</strong><br>and <strong>80</strong> <strong class='color-f'>energy</strong>",
isFieldTech: true,
maxCount: 9,
count: 0,
frequency: 2,
allowed() {
return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath
},
requires: "ice IX",
effect() {
tech.iceEnergy++
},
remove() {
tech.iceEnergy = 0;
}
},
{ {
name: "degenerate matter", name: "degenerate matter",
description: "reduce <strong class='color-harm'>harm</strong> by <strong>50%</strong><br>while <strong>negative mass field</strong> is active", description: "reduce <strong class='color-harm'>harm</strong> by <strong>50%</strong> while your <strong class='color-f'>field</strong> is active",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field" && !tech.isEnergyHealth return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth
}, },
requires: "negative mass field, not mass-energy", requires: "negative mass field, not mass-energy",
effect() { effect() {
@@ -4872,7 +4873,7 @@
count: 0, count: 0,
frequency: 2, frequency: 2,
allowed() { allowed() {
return m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" return m.fieldUpgrades[m.fieldMode].name === "negative mass field"
}, },
requires: "negative mass field", requires: "negative mass field",
effect() { effect() {
@@ -4961,7 +4962,7 @@
}, },
{ {
name: "micro-extruder", name: "micro-extruder",
description: "<strong class='color-plasma'>plasma</strong> <strong>torch</strong> extrudes a thin <strong class='color-plasma'>hot</strong> wire<br>increases <strong class='color-d'>damage</strong>, and <strong class='color-f'>energy</strong> drain", description: "<strong class='color-plasma'>plasma</strong> <strong>torch</strong> extrudes a thin <strong class='color-plasma'>hot</strong> wire<br>increases <strong class='color-d'>damage</strong>, <strong class='color-f'>energy</strong> drain, and <strong>lag</strong>",
isFieldTech: true, isFieldTech: true,
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5176,7 +5177,7 @@
//************************************************** modes //************************************************** modes
//************************************************** //**************************************************
{ {
name: "ship", name: "-ship-",
description: "<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard", description: "<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5194,7 +5195,7 @@
remove() {} remove() {}
}, },
{ {
name: "quantum leap", name: "-quantum leap-",
description: "<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an alternate version of yourself", description: "<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an alternate version of yourself",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5215,7 +5216,7 @@
remove() {} remove() {}
}, },
{ {
name: "shields", name: "-shields-",
description: "<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield", description: "<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5237,7 +5238,7 @@
remove() {} remove() {}
}, },
{ {
name: "Fourier analysis", name: "-Fourier analysis-",
description: "<strong style='color: #f55;'>experiment:</strong> your aiming is random", description: "<strong style='color: #f55;'>experiment:</strong> your aiming is random",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5262,7 +5263,7 @@
remove() {} remove() {}
}, },
{ {
name: "panopticon", name: "-panopticon-",
description: "<strong style='color: #f55;'>experiment:</strong> mobs can always see you", description: "<strong style='color: #f55;'>experiment:</strong> mobs can always see you",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5287,7 +5288,7 @@
remove() {} remove() {}
}, },
{ {
name: "decomposers", name: "-decomposers-",
description: "<strong style='color: #f55;'>experiment:</strong> after they die<br>mobs leave behind spawns", description: "<strong style='color: #f55;'>experiment:</strong> after they die<br>mobs leave behind spawns",
maxCount: 1, maxCount: 1,
count: 0, count: 0,
@@ -5305,7 +5306,25 @@
tech.deathSpawns = 0 tech.deathSpawns = 0
} }
}, },
{
name: "-WIMP-",
description: "<strong style='color: #f55;'>experiment:</strong> <strong class='color-harm'>harmful</strong> particles slowly <strong>chase</strong> you",
maxCount: 1,
count: 0,
frequency: 0,
isBadRandomOption: true,
isExperimentalMode: true,
allowed() {
return build.isExperimentSelection
},
requires: "",
effect() {
tech.wimpExperiment = 3
},
remove() {
tech.wimpExperiment = 0
}
},
//************************************************** //**************************************************
//************************************************** JUNK //************************************************** JUNK
//************************************************** tech //************************************************** tech
@@ -5328,6 +5347,25 @@
// }, // },
// remove() {} // remove() {}
// }, // },
// {
// name: "WIMP",
// description: "<strong class='color-harm'>harmful</strong> particles slowly <strong>chase</strong> you",
// maxCount: 1,
// count: 0,
// frequency: 0,
// isExperimentHide: true,
// isJunk: true,
// allowed() {
// return tech.wimpExperiment === 0
// },
// requires: "",
// effect() {
// tech.wimpExperiment = 3
// },
// remove() {
// tech.wimpExperiment = 0
// }
// },
{ {
name: "spinor", name: "spinor",
description: "the direction you aim is determined by your position", description: "the direction you aim is determined by your position",
@@ -5368,7 +5406,7 @@
isNonRefundable: true, isNonRefundable: true,
isJunk: true, isJunk: true,
allowed() { allowed() {
return true return tech.deathSpawns === 0
}, },
requires: "", requires: "",
effect() { effect() {
@@ -6658,5 +6696,6 @@
wavePacketAmplitude: null, wavePacketAmplitude: null,
waveLengthRange: null, waveLengthRange: null,
isCollisionRealitySwitch: null, isCollisionRealitySwitch: null,
iceIXOnDeath: null iceIXOnDeath: null,
wimpCount: null
} }

View File

@@ -1,9 +1,32 @@
******************************************************** NEXT PATCH ******************************************************** ******************************************************** NEXT PATCH ********************************************************
ice-IX does 15% more damage
tech: WIMPs - an indestructible harmful particle slowly chases you
spawn 2-3 research at the end of each level
experimental mode : WIMPS chase you
beating the final boss looks a bit less like death and a bit more like winning
also there are some text directions on how to enter endless mode (press T after you win)
tech removed: 1-body problem
******************************************************** BUGS ******************************************************** ******************************************************** BUGS ********************************************************
Why does micro-extruder lag so much anyway
blue triangle boss can move backwards and aim away from you if set up properly
HTML build system looks bad since tech does grey out
The html build share system crashing some times
tech: strange attractor before at least 1 other tech
https://landgreen.github.io/sidescroller/index.html?&gun0=rail%20gun&tech18=correlated%20damage&tech20=strange%20attractor
&tech0=auto-loading%20heuristics as only tech
https://landgreen.github.io/sidescroller/index.html?&tech0=auto-loading%20heuristics
crashed on this
https://landgreen.github.io/sidescroller/index.html?&gun0=rail%20gun&tech1=mass%20driver&tech2=restitution&tech3=flywheel&tech4=Pauli%20exclusion&tech5=mass-energy%20equivalence&tech6=1st%20ionization%20energy&tech7=electrolytes&tech8=negative%20feedback&tech9=entropy%20exchange&tech10=anthropic%20principle&tech11=renormalization&tech12=Bayesian%20statistics&tech13=bubble%20fusion&tech14=replication&tech15=replication&tech16=futures%20exchange&tech17=commodities%20exchange&tech18=correlated%20damage&tech19=parthenogenesis&tech21=cardinality&tech22=half-wave%20rectifier&tech23=pair%20production&tech24=Lorentz%20transformation&tech25=time%20crystals&tech26=undefined&tech27=undefined&tech28=undefined&tech29=undefined&tech30=undefined&tech31=undefined&tech32=undefined&field=pilot%20wave&difficulty=6
(once) CPT gun only rewound 0.25 seconds (once) CPT gun only rewound 0.25 seconds
after a randomize run (non-unitary) after a randomize run (non-unitary)
had enough energy had enough energy
@@ -38,22 +61,24 @@ is there a way to check if the player is stuck inside the map or block
******************************************************** TODO ******************************************************** ******************************************************** TODO ********************************************************
tech: a slow moving immortal mob follows you forever tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus
spawns at exit and just slowing moves towards player if it touches WIMP they explode
benefit:
let the player use research more like money
spend it to do things
tech: use the ability for power ups to have custom code tech: use the ability for power ups to have custom code
attracted to player attracted to player
attracted to other power ups attracted to other power ups
explode if they touch? explode if they touch?
make beating the final boss without undefined feel like winning, not like dieing
tech: picking up heal power ups when at full health does harm equal to the heal values tech: picking up heal power ups when at full health does harm equal to the heal values
benefit on pick up: benefit on pick up:
get ammo get ammo
get 1% duplication get 1% duplication
get 1% damage permanent get 1% damage permanent
turned into drones
nail-gun, or .... nail-gun, or ....
1s after being fired your bullets turn: 1s after being fired your bullets turn: