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() {
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.endCycle = simulation.cycle + 1080
this.endCycle = simulation.cycle + 1140
this.do = function() { //overwrite the do method for this bullet
this.force.y += this.mass * 0.002; //extra gravity
if (simulation.cycle > this.lookFrequency) {
@@ -1771,7 +1771,7 @@ const b = {
if (!(simulation.cycle % this.lookFrequency)) { //find mob targets
for (let i = 0, len = mob.length; i < len; ++i) {
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(body, this.position, mob[i].position).length === 0) {
this.endCycle = 0 //end life if mob is near and visible
@@ -1847,7 +1847,7 @@ const b = {
this.lockedOn = null;
let closeDist = Infinity;
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 dist = Vector.magnitude(targetVector) * (Math.random() + 0.5);
if (dist < closeDist) {
@@ -1932,7 +1932,7 @@ const b = {
friction: 0,
frictionAir: 0.10,
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()),
endCycle: simulation.cycle + 140 * tech.isBulletsLastLonger,
classType: "bullet",
@@ -1951,7 +1951,7 @@ const b = {
setTimeout(function() {
if (!who.alive) {
m.energy += tech.iceEnergy * 0.8
m.addHealth(tech.iceEnergy * 0.04)
// m.addHealth(tech.iceEnergy * 0.04)
}
}, 10);
}
@@ -2701,7 +2701,7 @@ const b = {
let target
for (let i = 0, len = mob.length; i < len; i++) {
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;
target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60))
const radius = 6 + 7 * Math.random()
@@ -2868,6 +2868,7 @@ const b = {
for (let i = 0, len = mob.length; i < len; ++i) {
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
if (DIST < closeDist &&
mob[i].isDropPowerUp &&
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
closeDist = DIST;
@@ -2932,6 +2933,7 @@ const b = {
for (let i = 0, len = mob.length; i < len; ++i) {
const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius;
if (DIST < closeDist &&
mob[i].isDropPowerUp &&
Matter.Query.ray(map, this.position, mob[i].position).length === 0 &&
Matter.Query.ray(body, this.position, mob[i].position).length === 0) {
closeDist = DIST;
@@ -4111,7 +4113,7 @@ const b = {
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",
ammo: 0,
ammoPack: 3.15,
ammoPack: 2.5,
have: false,
do() {},
fire() {
@@ -4127,7 +4129,7 @@ const b = {
if (tech.isRailAreaDamage) {
mob[i].force.x += 2 * FORCE.x;
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].locatePlayer();
simulation.drawList.push({ //add dmg to draw queue

View File

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

View File

@@ -59,8 +59,10 @@ function getUrlVars() {
return vars;
}
window.addEventListener('load', () => {
const set = getUrlVars()
if (Object.keys(set).length !== 0) {
build.populateGrid() //trying to solve a bug with this, but maybe it doesn't help
openExperimentMenu();
//add experimental selections based on url
for (const property in set) {
@@ -103,12 +105,8 @@ window.addEventListener('load', () => {
simulation.difficultyMode = Number(set[property])
document.getElementById("difficulty-select-experiment").value = Number(set[property])
}
if (property === "level") {
document.getElementById("starting-level").value = Number(set[property])
}
if (property === "noPower") {
document.getElementById("no-power-ups").checked = Number(set[property])
}
if (property === "level") document.getElementById("starting-level").value = 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")
// tech.isExplodeRadio = true
// 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("propagation")
// 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")
level.intro(); //starting level
@@ -111,6 +111,12 @@ const level = {
const len = Math.floor((m.maxHealth - m.health) / 0.5)
for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false);
}
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.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);

View File

@@ -50,7 +50,6 @@ const mobs = {
const range2 = (180 + 170 * Math.random()) ** 2
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) {
console.log(mob[i])
applySlow(mob[i])
}
}
@@ -64,7 +63,6 @@ const mobs = {
}
function applySlow(whom) {
console.log()
if (!whom.shield && !whom.isShielded && !m.isBodiesAsleep) {
if (whom.isBoss) cycles = Math.floor(cycles * 0.25)
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.isSlowFPS) dmg *= 0.8
// if (tech.isPiezo) dmg *= 0.85
if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.5
if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.5
if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots()
if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33;
if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34
@@ -986,7 +986,6 @@ const m = {
m.airSpeedLimit = 125
m.drop();
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.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob)
m.isBodiesAsleep = true;
@@ -1670,7 +1669,6 @@ const m = {
m.hold = function() {
m.airSpeedLimit = 125 //5 * player.mass * player.mass
m.FxAir = 0.016
m.isFieldActive = false;
if (m.isHolding) {
m.drawHold(m.holdingTarget);
m.holding();
@@ -1680,7 +1678,6 @@ const m = {
m.lookForPickUp();
const DRAIN = 0.00035
if (m.energy > DRAIN) {
m.isFieldActive = true; //used with tech.isHarmReduce
m.airSpeedLimit = 400 // 7* player.mass * player.mass
m.FxAir = 0.005
@@ -2986,7 +2983,7 @@ const m = {
let type = tech.isEnergyNoAmmo ? "heal" : "ammo"
if (Math.random() < 0.4) {
type = "heal"
} else if (Math.random() < 0.3 && !tech.isSuperDeterminism) {
} else if (Math.random() < 0.23 && !tech.isSuperDeterminism) {
type = "research"
}
powerUps.spawn(mob[k].position.x, mob[k].position.y, type);

View File

@@ -89,6 +89,83 @@ const spawn = {
},
//mob templates *********************************************************************************************
//***********************************************************************************************************
WIMP(x = level.exit.x + 300 * (Math.random() - 0.5), y = level.exit.y + 300 * (Math.random() - 0.5), radius = 75 + 25 * Math.random()) { //immortal mob that follows player
//if you have the tech it spawns at start of every level at the exit
mobs.spawn(x, y, 3, radius, "transparent");
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) {
mobs.spawn(x, y, 6, radius, "rgb(150,150,255)");
let me = mob[mob.length - 1];
@@ -122,22 +199,39 @@ const spawn = {
if (!simulation.paused) {
count++
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)}`);
} 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) {
simulation.makeTextLog(`<span class="lore-text">undefined</span> <span class='color-symbol'>=</span> ${lore.techCount}/${lore.techGoal}`)
} else if (count === 900) {
simulation.makeTextLog(`World.clear(engine.world)`);
simulation.makeTextLog(`World.clear(engine.world) <em>//simulation successful</em>`);
} else if (count === 1140) {
tech.isImmortal = false;
m.death()
// tech.isImmortal = false;
// 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
}
}
if (simulation.testing) {
simulation.makeTextLog(`level.levels.length <span class='color-symbol'>=</span> <strong>Infinite</strong>`);
unlockExit()
setTimeout(function() {
simulation.makeTextLog(`level.levels.length <span class='color-symbol'>=</span> <strong>Infinite</strong>`);
}, 1500);
} else {
requestAnimationFrame(loop);
}

View File

@@ -145,7 +145,6 @@
},
damageFromTech() {
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.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599
if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.85
@@ -662,23 +661,24 @@
b.setFireCD();
}
},
{
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>",
maxCount: 1,
count: 0,
frequency: 2,
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() {
tech.isOneBullet = true
},
remove() {
tech.isOneBullet = false
}
},
// 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>",
// maxCount: 1,
// count: 0,
// frequency: 2,
// 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() {
// tech.isOneBullet = true
// },
// remove() {
// tech.isOneBullet = false
// }
// },
{
name: "microstates",
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;
}
},
{
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",
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,
frequency: 2,
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",
effect: () => {
@@ -1749,38 +1732,37 @@
}
},
{
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,
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 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() {
tech.isSlowFPS = true;
tech.iceIXOnDeath++
},
remove() {
tech.isSlowFPS = false;
tech.iceIXOnDeath = 0
}
},
{
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,
name: "thermoelectric effect",
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: 9,
count: 0,
frequency: 4,
frequencyDefault: 4,
frequency: 2,
allowed() {
return tech.isSlowFPS
return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath
},
requires: "clock gating",
requires: "ice IX",
effect() {
tech.isHarmFreeze = true;
tech.iceEnergy++
},
remove() {
tech.isHarmFreeze = false;
tech.iceEnergy = 0;
}
},
{
@@ -1817,6 +1799,41 @@
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",
description: "bullet impacts do <strong>400%</strong> <strong class='color-d'>damage</strong><br>to <strong>stunned</strong> mobs",
@@ -2696,23 +2713,25 @@
},
remove() {}
},
// {
// name: "perpetual research",
// description: "find <strong>1</strong> <strong class='color-r'>research</strong> at the start of each <strong>level</strong>",
// maxCount: 1,
// count: 0,
// frequency: 2,
// allowed() {
// return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun
// },
// requires: "only 1 perpetual effect, not superdeterminism",
// effect() {
// tech.isPerpetualReroll = true
// },
// remove() {
// tech.isPerpetualReroll = false
// }
// },
{
name: "WIMPs",
//<strong class='color-harm'>harmful</strong>
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>",
maxCount: 9,
count: 0,
frequency: 1,
frequencyDefault: 1,
allowed() {
return true
},
requires: "",
effect: () => {
tech.wimpCount++
},
remove() {
tech.wimpCount = 0
}
},
{
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>",
@@ -3721,7 +3740,7 @@
},
remove() {
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;
}
},
@@ -3976,7 +3995,7 @@
},
{
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,
maxCount: 1,
count: 0,
@@ -4623,7 +4642,7 @@
},
{
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,
maxCount: 9,
count: 0,
@@ -4828,33 +4847,15 @@
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",
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,
maxCount: 1,
count: 0,
frequency: 2,
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",
effect() {
@@ -4872,7 +4873,7 @@
count: 0,
frequency: 2,
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",
effect() {
@@ -4961,7 +4962,7 @@
},
{
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,
maxCount: 1,
count: 0,
@@ -5176,7 +5177,7 @@
//************************************************** modes
//**************************************************
{
name: "ship",
name: "-ship-",
description: "<strong style='color: #f55;'>experiment:</strong> fly around with no legs<br>aim with the keyboard",
maxCount: 1,
count: 0,
@@ -5194,7 +5195,7 @@
remove() {}
},
{
name: "quantum leap",
name: "-quantum leap-",
description: "<strong style='color: #f55;'>experiment:</strong> every 20 seconds<br>become an alternate version of yourself",
maxCount: 1,
count: 0,
@@ -5215,7 +5216,7 @@
remove() {}
},
{
name: "shields",
name: "-shields-",
description: "<strong style='color: #f55;'>experiment:</strong> every 5 seconds<br>all mobs gain a shield",
maxCount: 1,
count: 0,
@@ -5237,7 +5238,7 @@
remove() {}
},
{
name: "Fourier analysis",
name: "-Fourier analysis-",
description: "<strong style='color: #f55;'>experiment:</strong> your aiming is random",
maxCount: 1,
count: 0,
@@ -5262,7 +5263,7 @@
remove() {}
},
{
name: "panopticon",
name: "-panopticon-",
description: "<strong style='color: #f55;'>experiment:</strong> mobs can always see you",
maxCount: 1,
count: 0,
@@ -5287,7 +5288,7 @@
remove() {}
},
{
name: "decomposers",
name: "-decomposers-",
description: "<strong style='color: #f55;'>experiment:</strong> after they die<br>mobs leave behind spawns",
maxCount: 1,
count: 0,
@@ -5305,7 +5306,25 @@
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
//************************************************** tech
@@ -5328,6 +5347,25 @@
// },
// 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",
description: "the direction you aim is determined by your position",
@@ -5368,7 +5406,7 @@
isNonRefundable: true,
isJunk: true,
allowed() {
return true
return tech.deathSpawns === 0
},
requires: "",
effect() {
@@ -6658,5 +6696,6 @@
wavePacketAmplitude: null,
waveLengthRange: null,
isCollisionRealitySwitch: null,
iceIXOnDeath: null
iceIXOnDeath: null,
wimpCount: null
}

View File

@@ -1,9 +1,32 @@
******************************************************** 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 ********************************************************
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
after a randomize run (non-unitary)
had enough energy
@@ -38,22 +61,24 @@ is there a way to check if the player is stuck inside the map or block
******************************************************** TODO ********************************************************
tech: a slow moving immortal mob follows you forever
spawns at exit and just slowing moves towards player
benefit:
tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus
if it touches WIMP they explode
let the player use research more like money
spend it to do things
tech: use the ability for power ups to have custom code
attracted to player
attracted to other power ups
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
benefit on pick up:
get ammo
get 1% duplication
get 1% damage permanent
turned into drones
nail-gun, or ....
1s after being fired your bullets turn: