diff --git a/.DS_Store b/.DS_Store
index d106e0e..de36ad2 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/index.html b/index.html
index 31f687d..436e3bd 100644
--- a/index.html
+++ b/index.html
@@ -2,18 +2,6 @@
-
-
-
-
diff --git a/js/bullet.js b/js/bullet.js
index 1266d0b..f9e4253 100644
--- a/js/bullet.js
+++ b/js/bullet.js
@@ -349,7 +349,7 @@ const b = {
// radius = Math.max(0, Math.min(radius, (distanceToPlayer - 70) / b.explosionRange()))
let dist, sub, knock;
- let dmg = radius * 0.017 * (tech.isExplosionStun ? 0.7 : 1); //* 0.013 * (tech.isExplosionStun ? 0.7 : 1);
+ let dmg = radius * 0.019 * (tech.isExplosionStun ? 0.7 : 1); //* 0.013 * (tech.isExplosionStun ? 0.7 : 1);
if (tech.isExplosionHarm) radius *= 1.8 // 1/sqrt(2) radius -> area
if (tech.isSmallExplosion) {
color = "rgba(255,0,30,0.7)"
@@ -5322,7 +5322,7 @@ const b = {
do() {}, //do is set in b.setGrenadeMode()
fire() {
const countReduction = Math.pow(0.93, tech.missileCount)
- m.fireCDcycle = m.cycle + Math.floor((input.down ? 40 : 30) * b.fireCDscale / countReduction); // cool down
+ m.fireCDcycle = m.cycle + Math.floor((input.down ? 35 : 27) * b.fireCDscale / countReduction); // cool down
const where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) }
const SPREAD = input.down ? 0.12 : 0.2
let angle = m.angle - SPREAD * (tech.missileCount - 1) / 2;
diff --git a/js/index.js b/js/index.js
index f51c175..00d449a 100644
--- a/js/index.js
+++ b/js/index.js
@@ -352,7 +352,7 @@ ${simulation.isCheating ? "
lore disabled": ""}
//update tech text //disable not allowed tech
for (let i = 0, len = tech.tech.length; i < len; i++) {
const techID = document.getElementById("tech-" + i)
- if (!tech.tech[i].isExperimentHide && (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode)) {
+ if (!tech.tech[i].isExperimentHide && (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode || (localSettings.isJunkExperiment && tech.tech[i].isJunk))) {
if (tech.tech[i].allowed() || isAllowed || tech.tech[i].count > 0) {
// console.log(tech.tech[i].name, isAllowed, tech.tech[i].count, tech.haveGunCheck("nail gun"))
const isCount = tech.tech[i].count > 1 ? `(${tech.tech[i].count}x)` : "";
@@ -456,10 +456,12 @@ ${simulation.isCheating ? "
lore disabled": ""}
text += ` ${build.nameLink(b.guns[i].name)}
${b.guns[i].description}
`
}
for (let i = 0, len = tech.tech.length; i < len; i++) {
- if (!tech.tech[i].isExperimentHide) { //&& (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode)) {
- if (tech.tech[i].allowed() && (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode)) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
+ if (!tech.tech[i].isExperimentHide && (!tech.tech[i].isJunk || localSettings.isJunkExperiment)) { //&& (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode)) {
+ if (tech.tech[i].allowed() && (!tech.tech[i].isNonRefundable || tech.tech[i].isExperimentalMode || localSettings.isJunkExperiment)) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment"
if (tech.tech[i].isExperimentalMode) {
text += `${tech.tech[i].name}
${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
`
+ } else if (tech.tech[i].isJunk) {
+ text += ` ${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
`
} else {
text += ` ${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
`
}
@@ -633,16 +635,16 @@ function openExperimentMenu() {
//record settings so they can be reproduced in the experimental menu
document.getElementById("experiment-button").addEventListener("click", () => { //setup build run
- let field = 0;
- let inventory = [];
- let techList = [];
- if (!simulation.firstRun) {
- field = m.fieldMode
- inventory = [...b.inventory]
- for (let i = 0; i < tech.tech.length; i++) {
- techList.push(tech.tech[i].count)
- }
- }
+ // let field = 0;
+ // let inventory = [];
+ // let techList = [];
+ // if (!simulation.firstRun) {
+ // field = m.fieldMode
+ // inventory = [...b.inventory]
+ // for (let i = 0; i < tech.tech.length; i++) {
+ // techList.push(tech.tech[i].count)
+ // }
+ // }
openExperimentMenu();
});
@@ -1154,6 +1156,7 @@ if (localSettings) {
document.getElementById("fps-select").value = localSettings.fpsCapDefault
} else {
localSettings = {
+ isJunkExperiment: false,
isCommunityMaps: false,
difficultyMode: '2',
fpsCapDefault: 'max',
diff --git a/js/level.js b/js/level.js
index 72210ca..a06d451 100644
--- a/js/level.js
+++ b/js/level.js
@@ -20,7 +20,7 @@ const level = {
// m.setField("time dilation")
// b.giveGuns("harpoon")
// for (let i = 0; i < 9; i++) tech.giveTech("slow light")
- // tech.giveTech("boson composite")
+ // tech.giveTech("grenade production")
// for (let i = 0; i < 2; i++) powerUps.directSpawn(0, 0, "tech");
// tech.giveTech("charmed baryons")
// tech.giveTech("tinsellated flagella")
@@ -31,7 +31,7 @@ const level = {
// tech.tech[297].frequency = 100
// simulation.enableConstructMode() //used to build maps in testing mode
- // level.vats();
+ // level.pavilion();
// level.testing(); //not in rotation, used for testing
if (simulation.isTraining) { level.walk(); } else { level.intro(); }
@@ -321,7 +321,7 @@ const level = {
player.position.y < level.exit.y - 40 &&
player.velocity.y < 0.1
) {
- level.exitCount += 2
+ level.exitCount += input.down ? 8 : 2
} else if (level.exitCount > 0) {
level.exitCount -= 2
}
@@ -484,7 +484,7 @@ const level = {
const who = body[body.length] = Bodies.rectangle(x, isAtTop ? maxHeight : y, width, height, {
collisionFilter: {
category: cat.map,
- mask: cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
+ mask: cat.map | cat.player | cat.body | cat.bullet | cat.powerUp | cat.mob | cat.mobBullet
},
isNoSetCollision: true,
inertia: Infinity, //prevents rotation
@@ -2557,7 +2557,7 @@ const level = {
// spawn.slashBoss(1900, -500)
// spawn.launcherBoss(3200, -500)
// spawn.laserTargetingBoss(1700, -500)
- // spawn.powerUpBoss(3200, -500)
+ spawn.powerUpBoss(1900, -500)
// spawn.powerUpBossBaby(3200, -500)
// spawn.snakeBoss(1700, -500)
// spawn.streamBoss(3200, -500)
@@ -2575,7 +2575,7 @@ const level = {
// spawn.tetherBoss(1700, -500) //go to actual level?
// spawn.revolutionBoss(1900, -500)
// spawn.bomberBoss(1400, -500)
- spawn.cellBossCulture(1600, -500)
+ // spawn.cellBossCulture(1600, -500)
// spawn.shieldingBoss(1700, -500)
// for (let i = 0; i < 10; ++i) spawn.bodyRect(1600 + 5, -500, 30, 40);
@@ -3298,25 +3298,30 @@ const level = {
//bottom floor
//entrance
spawn.mapRect(-200, -750, 1500, 100);
- spawn.mapRect(-575, 0, 3275, 500);
- spawn.mapRect(-1275, 275, 875, 225);
+ spawn.mapRect(-575, 0, 2150, 500);
+ // spawn.mapRect(-1275, 275, 875, 225);
+ spawn.mapRect(-1275, 275, 3975, 225);
spawn.mapRect(-1050, 0, 325, 50);
spawn.mapRect(-775, 0, 50, 140);
vanish.push(level.vanish(-725, 13, 150, 25))
-
- spawn.mapRect(-200, -750, 100, 648);
- spawn.mapRect(1200, -750, 100, 648);
+ spawn.mapRect(-200, -750, 100, 600);
+ // spawn.mapRect(1200, -750, 100, 600);
vanish.push(level.vanish(-350, -225, 150, 225))
vanish.push(level.vanish(-350, -450, 150, 223))
spawn.mapRect(2475, -1800, 250, 2300);
- vanish.push(level.vanish(1300, -225, 150, 225))
- vanish.push(level.vanish(1300, -450, 150, 223))
- powerUps.spawnStartingPowerUps(550, -100);
+ // vanish.push(level.vanish(1300, -375, 150, 225))
+ // vanish.push(level.vanish(1300, -450, 150, 223))
+ // spawn.mapRect(1200, -375, 250, 50);
+ // spawn.mapRect(1200, -375, 250, 225);
+ // spawn.mapRect(1200, -375, 175, 25);
+ spawn.mapRect(1200, -750, 100, 450);
+ spawn.mapRect(1200, -375, 250, 75);
+ powerUps.spawnStartingPowerUps(550, -100);
spawn.mapRect(125, -12, 850, 50);
spawn.mapRect(175, -25, 750, 50);
-
-
+ spawn.bodyRect(1350, -175, 150, 175, 0.5);
+ spawn.bodyRect(1350, -600, 125, 225, 0.2);
//entrance
// vanish.push(level.vanish(-300, -500, 100, 25))
// vanish.push(level.vanish(-450, -200, 100, 25))
@@ -3334,14 +3339,20 @@ const level = {
spawn.mapRect(500, -1350, 525, 497);
spawn.mapRect(25, -1050, 300, 150);
}
- vanish.push(level.vanish(550, -1575, 50, 225))
- vanish.push(level.vanish(925, -1575, 50, 225))
+ if (Math.random() < 0.5) {
+ vanish.push(level.vanish(400, -1600, 175, 25))
+ vanish.push(level.vanish(950, -1600, 175, 25))
+ } else {
+ vanish.push(level.vanish(550, -1575, 50, 225))
+ vanish.push(level.vanish(925, -1575, 50, 225))
+ }
+
// vanish.push(level.vanish(575, -1575, 375, 225))
spawn.bodyRect(225, -850, 50, 100, 0.4);
spawn.mapRect(600, -1800, 325, 225);
spawn.mapRect(1900, -1500, 325, 25);
- spawn.bodyRect(1000, -1825, 250, 20, 0.2);
+ spawn.bodyRect(1050, -1825, 250, 20, 0.2);
if (Math.random() < 0.5) {
vanish.push(level.vanish(1400, -1000, 200, 25))
vanish.push(level.vanish(1625, -1250, 200, 25))
@@ -3349,9 +3360,10 @@ const level = {
vanish.push(level.vanish(1400, -1075, 175, 175))
vanish.push(level.vanish(1575, -1250, 175, 175))
}
- vanish.push(level.vanish(1100, -1800, 225, 25))
- vanish.push(level.vanish(1500, -1800, 225, 25))
- vanish.push(level.vanish(-50, -1800, 400, 25))
+ vanish.push(level.vanish(1125, -1800, 625, 25))
+
+ // vanish.push(level.vanish(1500, -1800, 225, 25))
+ vanish.push(level.vanish(-50, -1800, 450, 25))
//exit
spawn.mapRect(-1050, -1450, 700, 25);
@@ -3384,7 +3396,7 @@ const level = {
ctx.fillStyle = "#d0d3d9"
ctx.fillRect(-2500, -1800, 3575, 2100);
ctx.fillStyle = "#c0c3c9"
- ctx.fillRect(-2075, -1475, 25, 1500);
+ ctx.fillRect(-2075, -1475, 25, 1800);
ctx.fillStyle = "#cff" //exit
ctx.fillRect(550, -1800, 525, 350)
@@ -3394,6 +3406,7 @@ const level = {
level.customTopLayer = () => {
//shadow
ctx.fillStyle = "rgba(0,10,30,0.1)"
+ ctx.fillRect(-1450, -300, 150, 325);
ctx.fillRect(-1300, -650, 1500, 650)
ctx.fillRect(725, 50, 325, 225)
ctx.fillRect(-325, -950, 300, 225)
@@ -3407,7 +3420,7 @@ const level = {
ctx.fillStyle = "#d0d3d9"
ctx.fillRect(-1075, -1800, 3575, 2100);
ctx.fillStyle = "#c0c3c9"
- ctx.fillRect(2050, -1475, 25, 1500);
+ ctx.fillRect(2050, -1475, 25, 1800);
ctx.fillStyle = "#cff" //exit
ctx.fillRect(-1050, -1800, 525, 350)
@@ -3417,6 +3430,7 @@ const level = {
level.customTopLayer = () => {
//shadow
ctx.fillStyle = "rgba(0,10,30,0.1)"
+ ctx.fillRect(1300, -300, 150, 325);
ctx.fillRect(-200, -675, 1500, 700)
ctx.fillRect(500, -950, 525, 225);
ctx.fillRect(600, -1600, 325, 275);
diff --git a/js/player.js b/js/player.js
index f3773ec..cb8006d 100644
--- a/js/player.js
+++ b/js/player.js
@@ -553,6 +553,7 @@ const m = {
}
}
}
+
let history = m.history[(m.cycle - steps) % 600]
Matter.Body.setPosition(player, history.position);
Matter.Body.setVelocity(player, { x: history.velocity.x, y: history.velocity.y });
@@ -598,6 +599,7 @@ const m = {
if (isDrawPlayer) {
isDrawPlayer = false
ctx.save();
+ ctx.globalCompositeOperation = "lighter";
ctx.translate(canvas.width2, canvas.height2); //center
ctx.scale(simulation.zoom / simulation.edgeZoomOutSmooth, simulation.zoom / simulation.edgeZoomOutSmooth); //zoom in once centered
ctx.translate(-canvas.width2 + m.transX, -canvas.height2 + m.transY); //translate
diff --git a/js/simulation.js b/js/simulation.js
index 1024889..1b0989b 100644
--- a/js/simulation.js
+++ b/js/simulation.js
@@ -513,8 +513,10 @@ const simulation = {
bodies[i].force.y += bodies[i].mass * magnitude;
}
}
- addGravity(powerUp, simulation.g);
- addGravity(body, simulation.g);
+ if (!m.isBodiesAsleep) {
+ addGravity(powerUp, simulation.g);
+ addGravity(body, simulation.g);
+ }
player.force.y += player.mass * simulation.g;
},
firstRun: true,
diff --git a/js/spawn.js b/js/spawn.js
index 1024726..63b2042 100644
--- a/js/spawn.js
+++ b/js/spawn.js
@@ -1301,7 +1301,48 @@ const spawn = {
}
for (let i = 0; i < powerUp.length; i++) powerUp[i].collisionFilter.mask = cat.map | cat.powerUp
};
+
+ //steal all power ups
+ // for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) {
+ // powerUp[i].collisionFilter.mask = 0
+ // Matter.Body.setPosition(powerUp[i], this.vertices[i])
+ // Matter.Body.setVelocity(powerUp[i], {
+ // x: 0,
+ // y: 0
+ // })
+ // }
+ // me.powerUpList = []
+ // me.constrainPowerUps = function() {
+ // for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) {
+ // //remove other constraints on power up
+ // for (let i = 0, len = cons.length; i < len; ++i) {
+ // if (cons[i].bodyB === powerUp[i] || cons[i].bodyA === powerUp[i]) {
+ // Matter.Composite.remove(engine.world, cons[i]);
+ // cons.splice(i, 1);
+ // break;
+ // }
+ // }
+
+ // //add to list
+ // this.powerUpList.push(powerUp[i])
+ // //position and stop
+ // powerUp[i].collisionFilter.mask = 0
+ // Matter.Body.setPosition(powerUp[i], this.vertices[i])
+ // Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 })
+ // //add constraint
+ // cons[cons.length] = Constraint.create({
+ // pointA: this.vertices[i],
+ // bodyB: powerUp[i],
+ // stiffness: 1,
+ // damping: 1
+ // });
+ // Composite.add(engine.world, cons[cons.length - 1]);
+ // }
+ // for (let i = 0; i < this.powerUpList.length; i++) {}
+ // }
+ // me.constrainPowerUps()
me.do = function() {
+ this.stroke = `hsl(0,0%,${80 + 25 * Math.sin(simulation.cycle * 0.01)}%)`
// if (this.isInvulnerable) {
// if (this.invulnerabilityCountDown > 0) {
// this.invulnerabilityCountDown--
@@ -1318,16 +1359,19 @@ const spawn = {
// this.damageReduction = this.startingDamageReduction
// }
// }
- this.stroke = `hsl(0,0%,${80 + 25 * Math.sin(simulation.cycle * 0.01)}%)`
//steal all power ups
+ // for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) {
+ // powerUp[i].collisionFilter.mask = 0
+ // Matter.Body.setPosition(powerUp[i], this.vertices[i])
+ // Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 })
+ // }
+
for (let i = 0; i < Math.min(powerUp.length, this.vertices.length); i++) {
powerUp[i].collisionFilter.mask = 0
Matter.Body.setPosition(powerUp[i], this.vertices[i])
- Matter.Body.setVelocity(powerUp[i], {
- x: 0,
- y: 0
- })
+ Matter.Body.setVelocity(powerUp[i], { x: 0, y: 0 })
}
+
this.seePlayerCheckByDistance();
this.attraction();
this.checkStatus();
@@ -1624,25 +1668,16 @@ const spawn = {
});
}
this.seePlayerCheckByDistance()
- // if (!(simulation.cycle % this.seePlayerFreq)) {
- // if (this.distanceToPlayer2() < this.seeAtDistance2) { // ignore cloak for black holes
- // this.locatePlayer();
- // if (!this.seePlayer.yes) this.seePlayer.yes = true;
- // } else if (this.seePlayer.recall) {
- // this.lostPlayer();
- // }
- // }
this.checkStatus();
- // if (this.seePlayer.recall) {
+ //accelerate towards the player
+ if (this.seePlayer.recall) {
+ const forceMag = this.accelMag * this.mass;
+ const angle = Math.atan2(this.seePlayer.position.y - this.position.y, this.seePlayer.position.x - this.position.x);
+ this.force.x += forceMag * Math.cos(angle);
+ this.force.y += forceMag * Math.sin(angle);
+ }
//eventHorizon waves in and out
const eventHorizon = this.eventHorizon * (0.93 + 0.17 * Math.sin(simulation.cycle * 0.011))
-
- //accelerate towards the player
- const forceMag = this.accelMag * this.mass;
- const angle = Math.atan2(this.seePlayer.position.y - this.position.y, this.seePlayer.position.x - this.position.x);
- this.force.x += forceMag * Math.cos(angle);
- this.force.y += forceMag * Math.sin(angle);
-
//draw darkness
ctx.beginPath();
ctx.arc(this.position.x, this.position.y, eventHorizon * 0.25, 0, 2 * Math.PI);
@@ -1678,7 +1713,6 @@ const spawn = {
ctx.fillStyle = "rgba(0,0,0,0.3)";
ctx.fill();
}
- // }
}
},
suckerBoss(x, y, radius = 25) {
diff --git a/js/tech.js b/js/tech.js
index a33e943..c6831e4 100644
--- a/js/tech.js
+++ b/js/tech.js
@@ -605,7 +605,7 @@ const tech = {
frequency: 1,
frequencyDefault: 1,
allowed() {
- return build.isExperimentSelection
+ return true
},
requires: "",
effect() {
@@ -7323,7 +7323,6 @@ const tech = {
// count: 0,
// frequency: 0,
// isNonRefundable: true,
- // isExperimentHide: true,
// isJunk: true,
// allowed() {
// return true
@@ -7334,6 +7333,25 @@ const tech = {
// },
// remove() {}
// },
+ {
+ name: "tinker",
+ description: "permanently unlock JUNK tech in experiment mode
this effect is stored for future visits",
+ maxCount: 1,
+ count: 0,
+ frequency: 0,
+ frequencyDefault: 0,
+ isJunk: true,
+ isNonRefundable: true,
+ allowed() {
+ return !localSettings.isJunkExperiment
+ },
+ requires: "",
+ effect() {
+ localSettings.isJunkExperiment = true
+ localStorage.setItem("localSettings", JSON.stringify(localSettings)); //update local storage
+ },
+ remove() {}
+ },
{
name: "brainstorm",
description: "the tech choice menu randomizes
every 0.5 seconds for 10 seconds",
@@ -7341,7 +7359,6 @@ const tech = {
count: 0,
frequency: 0,
frequencyDefault: 0,
- isExperimentHide: true,
isJunk: true,
allowed() {
return true
@@ -7364,7 +7381,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return !tech.isFallingDamage && !tech.isOverHeal && !tech.isEnergyHealth },
requires: "not quenching, tungsten carbide, mass-energy",
@@ -7378,12 +7394,11 @@ const tech = {
},
{
name: "density",
- description: `block are 10 times less dense`,
+ description: `blocks are 10 times less dense`,
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7419,7 +7434,6 @@ const tech = {
count: 0,
frequency: 0,
// isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7449,7 +7463,6 @@ const tech = {
count: 0,
frequency: 0,
// isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7476,12 +7489,11 @@ const tech = {
},
{
name: "planetesimals",
- description: `play planetesimals
(an annoying asteroids game with Newtonian physics)
clearing a level in planetesimals spawns a tech in n-gon
but, if you die in planetesimals you die in n-gon`,
+ description: `play planetesimals (an asteroids-like game)
clear levels in planetesimals to spawn tech
if you die in planetesimals you die in n-gon`,
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7515,7 +7527,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7530,7 +7541,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7547,7 +7557,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7564,7 +7573,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7609,7 +7617,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7669,7 +7676,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7743,7 +7749,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
isNonRefundable: true,
allowed() { return true },
@@ -7838,7 +7843,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !tech.isFireMoveLock
@@ -7862,7 +7866,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !tech.isEnergyHealth
@@ -7877,12 +7880,11 @@ const tech = {
},
{
name: "not a bug",
- description: "initiate a totally safe game crash for 5 seconds",
+ description: "initiate a totally safe game crash for 10 seconds",
maxCount: 1,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -7894,7 +7896,7 @@ const tech = {
setTimeout(() => {
simulation.drawCircle = savedfunction
canvas.width = canvas.width //clears the canvas // works on chrome at least
- }, 5000);
+ }, 10000);
// for (;;) {} //freezes the tab
},
@@ -7906,7 +7908,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -7925,7 +7926,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
isNonRefundable: true,
allowed() {
@@ -7946,7 +7946,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isNonRefundable: true,
isJunk: true,
allowed() {
@@ -7976,7 +7975,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isNonRefundable: true,
isJunk: true,
allowed() {
@@ -7996,7 +7994,6 @@ const tech = {
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isNonRefundable: true,
isJunk: true,
allowed() { return true },
@@ -8039,11 +8036,10 @@ const tech = {
// },
{
name: "Fourier analysis",
- description: "your aiming is now controlled by this equation:
2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",
+ description: "your aiming is now controlled by this equation:
2sin(0.0133t) + sin(0.013t) + 0.5sin(0.031t)+ 0.33sin(0.03t)",
maxCount: 1,
count: 0,
frequency: 0,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -8071,7 +8067,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return b.inventory.length > 0
@@ -8091,7 +8086,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8121,7 +8115,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8150,7 +8143,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8166,7 +8158,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8185,7 +8176,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8204,7 +8194,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8222,7 +8211,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8238,7 +8226,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8269,7 +8256,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8292,7 +8278,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8310,7 +8295,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass"
@@ -8350,7 +8334,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8366,7 +8349,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8383,7 +8365,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return m.fieldUpgrades[m.fieldMode].name !== "negative mass"
@@ -8396,19 +8377,34 @@ const tech = {
},
{
name: "rewind",
- description: "every 5 seconds rewind 2 seconds
lasts 120 seconds",
+ description: "every 10 seconds rewind 2 seconds",
maxCount: 9,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
effect() {
- for (let i = 0; i < 24; i++) {
- setTimeout(() => { m.rewind(120) }, i * 5000);
- }
+ setInterval(() => { m.rewind(120) }, 10000);
+ // for (let i = 0; i < 24; i++) {
+ // setTimeout(() => { m.rewind(120) }, i * 5000);
+ // }
+ },
+ remove() {}
+ },
+ {
+ name: "undo",
+ description: "every 4 seconds rewind 1/2 a second",
+ maxCount: 9,
+ count: 0,
+ frequency: 0,
+ isNonRefundable: true,
+ isJunk: true,
+ allowed() { return true },
+ requires: "",
+ effect() {
+ setInterval(() => { m.rewind(30) }, 4000);
},
remove() {}
},
@@ -8419,7 +8415,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8447,7 +8442,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8463,7 +8457,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8480,7 +8473,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8499,17 +8491,16 @@ const tech = {
},
{
name: "missile Launching System",
- description: "fire missiles for the next 60 seconds",
+ description: "fire missiles for the next 120 seconds",
maxCount: 9,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
effect() {
- for (let i = 0; i < 60; i++) {
+ for (let i = 0; i < 120; i++) {
setTimeout(() => {
const where = {
x: m.pos.x,
@@ -8523,26 +8514,23 @@ const tech = {
},
{
name: "grenade production",
- description: "drop grenades for the next 120 seconds",
+ description: "drop a grenade every 2 seconds",
maxCount: 9,
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
effect() {
- for (let i = 0; i < 120; i++) {
- setTimeout(() => {
- b.grenade(Vector.add(m.pos, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) }), -Math.PI / 2) //fire different angles for each grenade
- const who = bullet[bullet.length - 1]
- Matter.Body.setVelocity(who, {
- x: who.velocity.x * 0.1,
- y: who.velocity.y * 0.1
- });
- }, i * 1000);
- }
+ setInterval(() => {
+ b.grenade(Vector.add(m.pos, { x: 10 * (Math.random() - 0.5), y: 10 * (Math.random() - 0.5) }), -Math.PI / 2) //fire different angles for each grenade
+ const who = bullet[bullet.length - 1]
+ Matter.Body.setVelocity(who, {
+ x: who.velocity.x * 0.1,
+ y: who.velocity.y * 0.1
+ });
+ }, 2000);
},
remove() {}
},
@@ -8577,7 +8565,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -8623,7 +8610,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -8664,7 +8650,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return !m.isShipMode
@@ -8733,7 +8718,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8758,7 +8742,6 @@ const tech = {
frequency: 0,
isBotTech: true,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return b.totalBots() > 2
@@ -8816,7 +8799,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8832,7 +8814,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
@@ -8848,7 +8829,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return b.inventory.length > 0
@@ -8876,7 +8856,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return powerUps.research.count > 3
@@ -8898,7 +8877,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() {
return powerUps.research.count > 3
@@ -8919,7 +8897,6 @@ const tech = {
count: 0,
frequency: 0,
isNonRefundable: true,
- isExperimentHide: true,
isJunk: true,
allowed() { return true },
requires: "",
diff --git a/todo.txt b/todo.txt
index 7f6271a..ab72189 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,16 +1,29 @@
******************************************************** NEXT PATCH **************************************************
+JUNK tech: tinker - unlock JUNK tech in experiment mode
+ this effect is stored for future visits on the same browser
+several JUNK tech text have been cleaned up
+
+your explosions do 8% more damage, but not more harm
+grenade gun fires 5% faster
+ruins/pavilion map is adjusted to be a bit easier to move around
+crouching speeds up exit door animation
+
+removed google analytics
+bug fix with power ups and frozen time
+bug fix with elevators and map collision
******************************************************** TODO ********************************************************
-mobs that are given the players location at the start can get confused if the map is reversed
- suckers
+add anticipation to more mob attacks
+ stabber
+ striker
+
+boss that fires giant bullets, that bounce around and chases you
can mob bullets damage other mob?
maybe if they switch collisions and classType === "body" or obj.classType === "bullet"
-grenade gun seems weak
-
path finding system
figure out how to get friction effects on map/body to apply to player
@@ -19,8 +32,6 @@ vertical reversed version of reservoir level, start at top and press buttons to
growBoss and cellBoss are too similar
-might have to nerf upgraded bots
-
variant of Occam's razor - remove 50% of your tech for each removed get:
2 bots?
50 energy max