WIMPs
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:
18
js/bullet.js
18
js/bullet.js
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
10
js/index.js
10
js/index.js
@@ -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])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
10
js/level.js
10
js/level.js
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
104
js/spawn.js
104
js/spawn.js
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
245
js/tech.js
245
js/tech.js
@@ -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
|
||||||
}
|
}
|
||||||
35
todo.txt
35
todo.txt
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user