From 53392df55ea0d3f508f226f23ecae6988cbcc649 Mon Sep 17 00:00:00 2001 From: landgreen Date: Sat, 22 Jan 2022 07:39:05 -0800 Subject: [PATCH] tinker 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 --- .DS_Store | Bin 6148 -> 6148 bytes index.html | 12 ----- js/bullet.js | 4 +- js/index.js | 29 +++++----- js/level.js | 62 +++++++++++++--------- js/player.js | 2 + js/simulation.js | 6 ++- js/spawn.js | 78 +++++++++++++++++++-------- js/tech.js | 135 ++++++++++++++++++++--------------------------- todo.txt | 23 +++++--- 10 files changed, 191 insertions(+), 160 deletions(-) diff --git a/.DS_Store b/.DS_Store index d106e0e18699e566fa314bff20f64d9f5e67463c..de36ad27121008112da126ab86a5b99268b90933 100644 GIT binary patch delta 21 ccmZoMXffEJ#mwaQa - - - - 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].link}
${tech.tech[i].descriptionFunction ? tech.tech[i].descriptionFunction() :tech.tech[i].description}
` } else { text += `
  ${tech.tech[i].link}
${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