diff --git a/.DS_Store b/.DS_Store
index f15ea94..67ba9fe 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/js/bullet.js b/js/bullet.js
index 8f69c0f..08d52c3 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -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 energy to launch a high-speed dense rod
hold left mouse to charge, release 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
diff --git a/js/engine.js b/js/engine.js
index 1353642..fba3d95 100644
--- a/js/engine.js
+++ b/js/engine.js
@@ -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);
diff --git a/js/index.js b/js/index.js
index 002e31a..14fb152 100644
--- a/js/index.js
+++ b/js/index.js
@@ -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])
}
}
});
diff --git a/js/level.js b/js/level.js
index da69ac0..3082250 100644
--- a/js/level.js
+++ b/js/level.js
@@ -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);
diff --git a/js/mob.js b/js/mob.js
index e375750..dafd5b2 100644
--- a/js/mob.js
+++ b/js/mob.js
@@ -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
diff --git a/js/player.js b/js/player.js
index 758f841..4c29af5 100644
--- a/js/player.js
+++ b/js/player.js
@@ -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);
diff --git a/js/spawn.js b/js/spawn.js
index 0d0073e..7246533 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -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(`//enter testing mode to set level.levels.length to Infinite`);
if (!(count % 60)) simulation.makeTextLog(`simulation.analysis = ${(count/60- Math.random()).toFixed(3)}`);
} else if (count === 600) {
- simulation.makeTextLog(`simulation.analysis = 1`);
+ simulation.makeTextLog(`simulation.analysis = 1 //analysis complete`);
} else if (count === 720) {
simulation.makeTextLog(`undefined = ${lore.techCount}/${lore.techGoal}`)
} else if (count === 900) {
- simulation.makeTextLog(`World.clear(engine.world)`);
+ simulation.makeTextLog(`World.clear(engine.world) //simulation successful`);
} 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 = Infinite`);
unlockExit()
+ setTimeout(function() {
+ simulation.makeTextLog(`level.levels.length = Infinite`);
+ }, 1500);
} else {
requestAnimationFrame(loop);
}
diff --git a/js/tech.js b/js/tech.js
index 1b2e9e2..a8da14f 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -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 1 active bullet
increase damage by 100%",
- 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 1 active bullet
increase damage by 100%",
+ // 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 damage by 4%
for every 10 active bullets",
@@ -887,23 +887,6 @@
tech.isExplodeMob = false;
}
},
- {
- name: "crystallizer",
- description: "after frozen mobs die
they have a chance shatter into ice IX 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 nail when they die
nails target nearby mobs",
@@ -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: `slow time by 50% after receiving harm
reduce harm by 20%`,
- maxCount: 1,
+ name: "crystallizer",
+ description: "after frozen mobs die
they have a chance shatter into ice IX 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: `freeze all mobs for 7 seconds
after receiving harm`,
- maxCount: 1,
+ name: "thermoelectric effect",
+ description: "killing mobs with ice IX
generates 100 energy",
+ 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: `freeze all mobs for 7 seconds
after receiving harm`,
+ 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: `slow time by 50% after receiving harm
reduce harm by 20%`,
+ 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 400% damage
to stunned mobs",
@@ -2696,23 +2713,25 @@
},
remove() {}
},
- // {
- // name: "perpetual research",
- // description: "find 1 research at the start of each level",
- // 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",
+ //harmful
+ description: "a weak massive particle slowly chases you
spawn 2-3 research at the end of each level",
+ 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 shield
spawn 1-2 heals, ammo, or research",
@@ -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: "mines target mobs with nails over time
mines last about 12 seconds",
+ description: "mines target mobs with nails over time
mines last about 14 seconds",
isGunTech: true,
maxCount: 1,
count: 0,
@@ -4623,7 +4642,7 @@
},
{
name: "flux pinning",
- description: "blocking with your field
stuns mobs for +2 second",
+ description: "blocking with your field
stuns mobs for +2 second",
isFieldTech: true,
maxCount: 9,
count: 0,
@@ -4828,33 +4847,15 @@
tech.isIceField = false;
}
},
- {
- name: "thermoelectric effect",
- description: "killing mobs with ice IX gives 4 health
and 80 energy",
- 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 harm by 50%
while negative mass field is active",
+ description: "reduce harm by 50% while your field 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: "plasma torch extrudes a thin hot wire
increases damage, and energy drain",
+ description: "plasma torch extrudes a thin hot wire
increases damage, energy drain, and lag",
isFieldTech: true,
maxCount: 1,
count: 0,
@@ -5176,7 +5177,7 @@
//************************************************** modes
//**************************************************
{
- name: "ship",
+ name: "-ship-",
description: "experiment: fly around with no legs
aim with the keyboard",
maxCount: 1,
count: 0,
@@ -5194,7 +5195,7 @@
remove() {}
},
{
- name: "quantum leap",
+ name: "-quantum leap-",
description: "experiment: every 20 seconds
become an alternate version of yourself",
maxCount: 1,
count: 0,
@@ -5215,7 +5216,7 @@
remove() {}
},
{
- name: "shields",
+ name: "-shields-",
description: "experiment: every 5 seconds
all mobs gain a shield",
maxCount: 1,
count: 0,
@@ -5237,7 +5238,7 @@
remove() {}
},
{
- name: "Fourier analysis",
+ name: "-Fourier analysis-",
description: "experiment: your aiming is random",
maxCount: 1,
count: 0,
@@ -5262,7 +5263,7 @@
remove() {}
},
{
- name: "panopticon",
+ name: "-panopticon-",
description: "experiment: mobs can always see you",
maxCount: 1,
count: 0,
@@ -5287,7 +5288,7 @@
remove() {}
},
{
- name: "decomposers",
+ name: "-decomposers-",
description: "experiment: after they die
mobs leave behind spawns",
maxCount: 1,
count: 0,
@@ -5305,7 +5306,25 @@
tech.deathSpawns = 0
}
},
-
+ {
+ name: "-WIMP-",
+ description: "experiment: harmful particles slowly chase 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: "harmful particles slowly chase 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
}
\ No newline at end of file
diff --git a/todo.txt b/todo.txt
index d6feec7..1b05ca8 100644
--- a/todo.txt
+++ b/todo.txt
@@ -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: