From 39c9b08b2e97f767f53c8382174ea1239e40408e Mon Sep 17 00:00:00 2001 From: landgreen Date: Thu, 13 May 2021 18:32:20 -0700 Subject: [PATCH] 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 --- .DS_Store | Bin 6148 -> 6148 bytes js/bullet.js | 18 ++-- js/engine.js | 2 +- js/index.js | 10 +-- js/level.js | 10 ++- js/mob.js | 2 - js/player.js | 7 +- js/spawn.js | 104 ++++++++++++++++++++-- js/tech.js | 245 +++++++++++++++++++++++++++++---------------------- todo.txt | 35 ++++++-- 10 files changed, 296 insertions(+), 137 deletions(-) diff --git a/.DS_Store b/.DS_Store index f15ea942a6a4c9d5640df61e430b941a578e4a6c..67ba9fe8e629a8e8841c728eb754586e7523937e 100644 GIT binary patch delta 21 ccmZoMXffEJ#msba|70CzKSqVk)y$nD08fkt&j0`b delta 21 ccmZoMXffEJ#muz+;ba|VKSqYl)y$nD08bJIw*UYD diff --git a/js/bullet.js b/js/bullet.js index 8f69c0f..08d52c3 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -1727,7 +1727,7 @@ const b = { sentry() { this.collisionFilter.mask = cat.map | cat.body | cat.mob | cat.mobBullet | cat.mobShield | cat.bullet //can now collide with other bullets this.lookFrequency = simulation.cycle + 60 - this.endCycle = simulation.cycle + 1080 + this.endCycle = simulation.cycle + 1140 this.do = function() { //overwrite the do method for this bullet this.force.y += this.mass * 0.002; //extra gravity if (simulation.cycle > this.lookFrequency) { @@ -1771,7 +1771,7 @@ const b = { if (!(simulation.cycle % this.lookFrequency)) { //find mob targets for (let i = 0, len = mob.length; i < len; ++i) { if (Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)) < 500000 && - // mob[i].isDropPowerUp && + mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0) { this.endCycle = 0 //end life if mob is near and visible @@ -1847,7 +1847,7 @@ const b = { this.lockedOn = null; let closeDist = Infinity; for (let i = 0, len = mob.length; i < len; ++i) { - if (Matter.Query.ray(map, this.position, mob[i].position).length === 0) { + if (mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) { const targetVector = Vector.sub(this.position, mob[i].position) const dist = Vector.magnitude(targetVector) * (Math.random() + 0.5); if (dist < closeDist) { @@ -1932,7 +1932,7 @@ const b = { friction: 0, frictionAir: 0.10, restitution: 0.3, - dmg: 0.29, //damage done in addition to the damage from momentum + dmg: 0.33, //damage done in addition to the damage from momentum lookFrequency: 14 + Math.floor(8 * Math.random()), endCycle: simulation.cycle + 140 * tech.isBulletsLastLonger, classType: "bullet", @@ -1951,7 +1951,7 @@ const b = { setTimeout(function() { if (!who.alive) { m.energy += tech.iceEnergy * 0.8 - m.addHealth(tech.iceEnergy * 0.04) + // m.addHealth(tech.iceEnergy * 0.04) } }, 10); } @@ -2701,7 +2701,7 @@ const b = { let target for (let i = 0, len = mob.length; i < len; i++) { const dist2 = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); - if (dist2 < 1000000 && Matter.Query.ray(map, this.position, mob[i].position).length === 0) { + if (dist2 < 1000000 && mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0) { this.cd = simulation.cycle + this.delay; target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist2) / 60)) const radius = 6 + 7 * Math.random() @@ -2868,6 +2868,7 @@ const b = { for (let i = 0, len = mob.length; i < len; ++i) { const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; if (DIST < closeDist && + mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0) { closeDist = DIST; @@ -2932,6 +2933,7 @@ const b = { for (let i = 0, len = mob.length; i < len; ++i) { const DIST = Vector.magnitude(Vector.sub(this.position, mob[i].position)) - mob[i].radius; if (DIST < closeDist && + mob[i].isDropPowerUp && Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0) { closeDist = DIST; @@ -4111,7 +4113,7 @@ const b = { name: "rail gun", description: "use energy to launch a high-speed dense rod
hold left mouse to charge, release to fire", ammo: 0, - ammoPack: 3.15, + ammoPack: 2.5, have: false, do() {}, fire() { @@ -4127,7 +4129,7 @@ const b = { if (tech.isRailAreaDamage) { mob[i].force.x += 2 * FORCE.x; mob[i].force.y += 2 * FORCE.y; - const damage = b.dmgScale * 0.13 * Math.sqrt(DEPTH) + const damage = b.dmgScale * 0.16 * Math.sqrt(DEPTH) mob[i].damage(damage); mob[i].locatePlayer(); simulation.drawList.push({ //add dmg to draw queue diff --git a/js/engine.js b/js/engine.js index 1353642..fba3d95 100644 --- a/js/engine.js +++ b/js/engine.js @@ -194,7 +194,7 @@ function collisionChecks(event) { let type = tech.isEnergyNoAmmo ? "heal" : "ammo" if (Math.random() < 0.4) { type = "heal" - } else if (Math.random() < 0.3 && !tech.isSuperDeterminism) { + } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) { type = "research" } powerUps.spawn(mob[k].position.x, mob[k].position.y, type); diff --git a/js/index.js b/js/index.js index 002e31a..14fb152 100644 --- a/js/index.js +++ b/js/index.js @@ -59,8 +59,10 @@ function getUrlVars() { return vars; } window.addEventListener('load', () => { + const set = getUrlVars() if (Object.keys(set).length !== 0) { + build.populateGrid() //trying to solve a bug with this, but maybe it doesn't help openExperimentMenu(); //add experimental selections based on url for (const property in set) { @@ -103,12 +105,8 @@ window.addEventListener('load', () => { simulation.difficultyMode = Number(set[property]) document.getElementById("difficulty-select-experiment").value = Number(set[property]) } - if (property === "level") { - document.getElementById("starting-level").value = Number(set[property]) - } - if (property === "noPower") { - document.getElementById("no-power-ups").checked = Number(set[property]) - } + if (property === "level") document.getElementById("starting-level").value = Number(set[property]) + if (property === "noPower") document.getElementById("no-power-ups").checked = Number(set[property]) } } }); diff --git a/js/level.js b/js/level.js index da69ac0..3082250 100644 --- a/js/level.js +++ b/js/level.js @@ -20,11 +20,11 @@ const level = { // b.giveGuns("laser") // tech.isExplodeRadio = true // tech.giveTech("pulse") - // for (let i = 0; i < 1; i++) tech.giveTech("crystallizer") + // for (let i = 0; i < 3; i++) tech.giveTech("amplitude") // for (let i = 0; i < 3; i++) tech.giveTech("packet length") // for (let i = 0; i < 3; i++) tech.giveTech("propagation") // for (let i = 0; i < 3; i++) tech.giveTech("bound state") - // for (let i = 0; i < 9; i++) tech.giveTech("slow light") + // for (let i = 0; i < 9; i++) tech.giveTech("WIMPs") // tech.giveTech("metastability") level.intro(); //starting level @@ -111,6 +111,12 @@ const level = { const len = Math.floor((m.maxHealth - m.health) / 0.5) for (let i = 0; i < len; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "heal", false); } + + for (let i = 0; i < tech.wimpCount; i++) { + spawn.WIMP() + for (let j = 0, len = 1 + 2 * Math.random(); j < len; j++) powerUps.spawn(level.exit.x + 100 * (Math.random() - 0.5), level.exit.y - 100 + 100 * (Math.random() - 0.5), "research", false) + } + for (let i = 0; i < tech.wimpExperiment; i++) spawn.WIMP() // if (tech.isPerpetualReroll) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "research", false); // if (tech.isPerpetualAmmo) { // for (let i = 0; i < 3; i++) powerUps.spawn(player.position.x + 60 * (Math.random() - 0.5), player.position.y + 60 * (Math.random() - 0.5), "ammo", false); diff --git a/js/mob.js b/js/mob.js index e375750..dafd5b2 100644 --- a/js/mob.js +++ b/js/mob.js @@ -50,7 +50,6 @@ const mobs = { const range2 = (180 + 170 * Math.random()) ** 2 for (let i = 0, len = mob.length; i < len; i++) { if (who !== mob[i] && Vector.magnitudeSquared(Vector.sub(who.position, mob[i].position)) < range2 + mob[i].radius) { - console.log(mob[i]) applySlow(mob[i]) } } @@ -64,7 +63,6 @@ const mobs = { } function applySlow(whom) { - console.log() if (!whom.shield && !whom.isShielded && !m.isBodiesAsleep) { if (whom.isBoss) cycles = Math.floor(cycles * 0.25) let i = whom.status.length diff --git a/js/player.js b/js/player.js index 758f841..4c29af5 100644 --- a/js/player.js +++ b/js/player.js @@ -522,7 +522,7 @@ const m = { if (tech.isSpeedHarm) dmg *= 1 - Math.min(player.speed * 0.019, 0.60) if (tech.isSlowFPS) dmg *= 0.8 // if (tech.isPiezo) dmg *= 0.85 - if (tech.isHarmReduce && m.fieldUpgrades[m.fieldMode].name === "negative mass field" && m.isFieldActive) dmg *= 0.5 + if (tech.isHarmReduce && input.field && m.fieldCDcycle < m.cycle) dmg *= 0.5 if (tech.isBotArmor) dmg *= 0.94 ** b.totalBots() if (tech.isHarmArmor && m.lastHarmCycle + 600 > m.cycle) dmg *= 0.33; if (tech.isNoFireDefense && m.cycle > m.fireCDcycle + 120) dmg *= 0.34 @@ -986,7 +986,6 @@ const m = { m.airSpeedLimit = 125 m.drop(); m.holdingMassScale = 0.5; - m.isFieldActive = false; //only being used by negative mass field m.fieldArc = 0.2; //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.calculateFieldThreshold(); //run calculateFieldThreshold after setting fieldArc, used for powerUp grab and mobPush with lookingAt(mob) m.isBodiesAsleep = true; @@ -1670,7 +1669,6 @@ const m = { m.hold = function() { m.airSpeedLimit = 125 //5 * player.mass * player.mass m.FxAir = 0.016 - m.isFieldActive = false; if (m.isHolding) { m.drawHold(m.holdingTarget); m.holding(); @@ -1680,7 +1678,6 @@ const m = { m.lookForPickUp(); const DRAIN = 0.00035 if (m.energy > DRAIN) { - m.isFieldActive = true; //used with tech.isHarmReduce m.airSpeedLimit = 400 // 7* player.mass * player.mass m.FxAir = 0.005 @@ -2986,7 +2983,7 @@ const m = { let type = tech.isEnergyNoAmmo ? "heal" : "ammo" if (Math.random() < 0.4) { type = "heal" - } else if (Math.random() < 0.3 && !tech.isSuperDeterminism) { + } else if (Math.random() < 0.23 && !tech.isSuperDeterminism) { type = "research" } powerUps.spawn(mob[k].position.x, mob[k].position.y, type); diff --git a/js/spawn.js b/js/spawn.js index 0d0073e..7246533 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -89,6 +89,83 @@ const spawn = { }, //mob templates ********************************************************************************************* //*********************************************************************************************************** + WIMP(x = level.exit.x + 300 * (Math.random() - 0.5), y = level.exit.y + 300 * (Math.random() - 0.5), radius = 75 + 25 * Math.random()) { //immortal mob that follows player + //if you have the tech it spawns at start of every level at the exit + mobs.spawn(x, y, 3, radius, "transparent"); + let me = mob[mob.length - 1]; + me.stroke = "transparent" + me.isShielded = true; //makes it immune to damage + me.leaveBody = false; + me.isDropPowerUp = false; + me.showHealthBar = false; + me.collisionFilter.mask = 0; //cat.player //| cat.body + me.chaseSpeed = 1 + 1.5 * Math.random() + + me.awake = function() { + //chase player + const sub = Vector.sub(player.position, this.position) + const where = Vector.add(this.position, Vector.mult(Vector.normalise(sub), this.chaseSpeed)) + + Matter.Body.setPosition(this, { //hold position + x: where.x, + y: where.y + }); + Matter.Body.setVelocity(this, { x: 0, y: 0 }); + + //aoe damage to player + if (m.immuneCycle < m.cycle && Vector.magnitude(Vector.sub(player.position, this.position)) < this.radius && !tech.isNeutronImmune) { + const DRAIN = 0.07 + if (m.energy > DRAIN) { + m.energy -= DRAIN + } else { + m.energy = 0; + m.damage(0.007) + simulation.drawList.push({ //add dmg to draw queue + x: this.position.x, + y: this.position.y, + radius: this.radius, + color: simulation.mobDmgColor, + time: simulation.drawTime + }); + } + } + + //aoe damage to mobs + // for (let i = 0, len = mob.length; i < len; i++) { + // if (!mob[i].isShielded && Vector.magnitude(Vector.sub(mob[i].position, this.position)) < this.radius) { + // let dmg = b.dmgScale * 0.082 + // if (Matter.Query.ray(map, mob[i].position, this.position).length > 0) dmg *= 0.25 //reduce damage if a wall is in the way + // if (mob[i].shield) dmg *= 4 //x5 to make up for the /5 that shields normally take + // mob[i].damage(dmg); + // if (tech.isNeutronSlow) { + // Matter.Body.setVelocity(mob[i], { + // x: mob[i].velocity.x * this.vacuumSlow, + // y: mob[i].velocity.y * this.vacuumSlow + // }); + // } + // } + // } + + //draw some flashy graphics + ctx.beginPath(); + ctx.arc(this.position.x, this.position.y, this.radius, 0, 2 * Math.PI); + // ctx.fillStyle = "hsla(160, 100%, 35%,0.75)" //"rgba(255,0,255,0.2)"; + // ctx.globalCompositeOperation = "lighter" + ctx.fillStyle = `rgba(25,139,170,${0.2+0.12*Math.random()})`; + ctx.fill(); + this.radius = 100 * (1 + 0.25 * Math.sin(simulation.cycle * 0.03)) + // ctx.fillStyle = "#fff"; + // ctx.globalCompositeOperation = "difference"; + // ctx.fill(); + // ctx.globalCompositeOperation = "source-over" + } + me.do = function() { //wake up 2 seconds after the player moves + if (player.speed > 1 && !m.isCloak) { + setTimeout(() => { this.do = this.awake; }, 2000); + } + this.checkStatus(); + }; + }, finalBoss(x, y, radius = 300) { mobs.spawn(x, y, 6, radius, "rgb(150,150,255)"); let me = mob[mob.length - 1]; @@ -122,22 +199,39 @@ const spawn = { if (!simulation.paused) { count++ if (count < 600) { + if (count === 1) simulation.makeTextLog(`//enter testing mode to set level.levels.length to Infinite`); if (!(count % 60)) simulation.makeTextLog(`simulation.analysis = ${(count/60- Math.random()).toFixed(3)}`); } else if (count === 600) { - simulation.makeTextLog(`simulation.analysis = 1`); + simulation.makeTextLog(`simulation.analysis = 1 //analysis complete`); } else if (count === 720) { simulation.makeTextLog(`undefined = ${lore.techCount}/${lore.techGoal}`) } else if (count === 900) { - simulation.makeTextLog(`World.clear(engine.world)`); + simulation.makeTextLog(`World.clear(engine.world) //simulation successful`); } else if (count === 1140) { - tech.isImmortal = false; - m.death() + // tech.isImmortal = false; + // m.death() + // m.alive = false; + // simulation.paused = true; + // m.health = 0; + // m.displayHealth(); + document.getElementById("health").style.display = "none" + document.getElementById("health-bg").style.display = "none" + document.getElementById("text-log").style.opacity = 0; //fade out any active text logs + document.getElementById("fade-out").style.opacity = 1; //slowly fades out + // build.shareURL(false) + setTimeout(function() { + World.clear(engine.world); + Engine.clear(engine); + simulation.splashReturn(); + }, 6000); return } } if (simulation.testing) { - simulation.makeTextLog(`level.levels.length = Infinite`); unlockExit() + setTimeout(function() { + simulation.makeTextLog(`level.levels.length = Infinite`); + }, 1500); } else { requestAnimationFrame(loop); } diff --git a/js/tech.js b/js/tech.js index 1b2e9e2..a8da14f 100644 --- a/js/tech.js +++ b/js/tech.js @@ -145,7 +145,6 @@ }, damageFromTech() { let dmg = m.fieldDamage - if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ... if (tech.isFlipFlopDamage && tech.isFlipFlopOn) dmg *= 1.45 if (tech.isAnthropicDamage && tech.isDeathAvoidedThisLevel) dmg *= 2.3703599 if (tech.isDamageAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 1.5 : 0.85 @@ -662,23 +661,24 @@ b.setFireCD(); } }, - { - name: "1-body problem", - description: "if there is exactly 1 active bullet
increase damage by 100%", - maxCount: 1, - count: 0, - frequency: 2, - allowed() { - return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall) - }, - requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale", - effect() { - tech.isOneBullet = true - }, - remove() { - tech.isOneBullet = false - } - }, + // if (tech.isOneBullet && bullet.length - b.totalBots() === 1) dmg *= 2 //3 / Math.sqrt(bullet.length + 1) //testing this tech out, seems to have too many negatives though ... + // { + // name: "1-body problem", + // description: "if there is exactly 1 active bullet
increase damage by 100%", + // maxCount: 1, + // count: 0, + // frequency: 2, + // allowed() { + // return !tech.foamBotCount && !tech.nailBotCount && m.fieldUpgrades[m.fieldMode].name !== "nano-scale manufacturing" && ((tech.haveGunCheck("missiles") && tech.missileCount === 1) || tech.haveGunCheck("rail gun") || tech.haveGunCheck("grenades") || tech.isRivets || tech.isSlugShot || tech.oneSuperBall) + // }, + // requires: "missiles, rail gun, grenades, rivets, slugs, super ball, no foam/nail bots, nano-scale", + // effect() { + // tech.isOneBullet = true + // }, + // remove() { + // tech.isOneBullet = false + // } + // }, { name: "microstates", description: "increase damage by 4%
for every 10 active bullets", @@ -887,23 +887,6 @@ tech.isExplodeMob = false; } }, - { - name: "crystallizer", - description: "after frozen mobs die
they have a chance shatter into ice IX crystals", - maxCount: 9, - count: 0, - frequency: 2, - allowed() { - return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob - }, - requires: "a localized freeze effect, no other mob death tech", - effect() { - tech.iceIXOnDeath++ - }, - remove() { - tech.iceIXOnDeath = 0 - } - }, { name: "impact shear", description: "mobs release a nail when they die
nails target nearby mobs", @@ -948,7 +931,7 @@ count: 0, frequency: 2, allowed() { - return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling + return tech.nailsDeathMob || tech.sporesOnDeath || tech.isExplodeMob || tech.botSpawner || tech.isMobBlockFling || tech.iceIXOnDeath }, requires: "any mob death tech", effect: () => { @@ -1749,38 +1732,37 @@ } }, { - name: "clock gating", - description: `slow time by 50% after receiving harm
reduce harm by 20%`, - maxCount: 1, + name: "crystallizer", + description: "after frozen mobs die
they have a chance shatter into ice IX crystals", + maxCount: 9, count: 0, frequency: 2, allowed() { - return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow + return (tech.isIceCrystals || tech.isSporeFreeze || tech.isIceField || tech.relayIce || tech.blockingIce > 1) && !tech.sporesOnDeath && !tech.isExplodeMob && !tech.botSpawner && !tech.isMobBlockFling && !tech.nailsDeathMob }, - requires: "FPS above 45", + requires: "a localized freeze effect, no other mob death tech", effect() { - tech.isSlowFPS = true; + tech.iceIXOnDeath++ }, remove() { - tech.isSlowFPS = false; + tech.iceIXOnDeath = 0 } }, { - name: "liquid cooling", - description: `freeze all mobs for 7 seconds
after receiving harm`, - maxCount: 1, + name: "thermoelectric effect", + description: "killing mobs with ice IX
generates 100 energy", + maxCount: 9, count: 0, - frequency: 4, - frequencyDefault: 4, + frequency: 2, allowed() { - return tech.isSlowFPS + return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath }, - requires: "clock gating", + requires: "ice IX", effect() { - tech.isHarmFreeze = true; + tech.iceEnergy++ }, remove() { - tech.isHarmFreeze = false; + tech.iceEnergy = 0; } }, { @@ -1817,6 +1799,41 @@ tech.isFreezeHarmImmune = false; } }, + { + name: "liquid cooling", + description: `freeze all mobs for 7 seconds
after receiving harm`, + maxCount: 1, + count: 0, + frequency: 4, + frequencyDefault: 4, + allowed() { + return tech.isSlowFPS + }, + requires: "clock gating", + effect() { + tech.isHarmFreeze = true; + }, + remove() { + tech.isHarmFreeze = false; + } + }, + { + name: "clock gating", + description: `slow time by 50% after receiving harm
reduce harm by 20%`, + maxCount: 1, + count: 0, + frequency: 2, + allowed() { + return simulation.fpsCapDefault > 45 && !tech.isRailTimeSlow + }, + requires: "FPS above 45", + effect() { + tech.isSlowFPS = true; + }, + remove() { + tech.isSlowFPS = false; + } + }, { name: "fracture analysis", description: "bullet impacts do 400% damage
to stunned mobs", @@ -2696,23 +2713,25 @@ }, remove() {} }, - // { - // name: "perpetual research", - // description: "find 1 research at the start of each level", - // maxCount: 1, - // count: 0, - // frequency: 2, - // allowed() { - // return !tech.isSuperDeterminism && !tech.isPerpetualHeal && !tech.isPerpetualAmmo && !tech.isPerpetualStun - // }, - // requires: "only 1 perpetual effect, not superdeterminism", - // effect() { - // tech.isPerpetualReroll = true - // }, - // remove() { - // tech.isPerpetualReroll = false - // } - // }, + { + name: "WIMPs", + //harmful + description: "a weak massive particle slowly chases you
spawn 2-3 research at the end of each level", + maxCount: 9, + count: 0, + frequency: 1, + frequencyDefault: 1, + allowed() { + return true + }, + requires: "", + effect: () => { + tech.wimpCount++ + }, + remove() { + tech.wimpCount = 0 + } + }, { name: "bubble fusion", description: "after destroying a mob's natural shield
spawn 1-2 heals, ammo, or research", @@ -3721,7 +3740,7 @@ }, remove() { tech.wavePacketFrequency = 0.088 //0.0968 //0.1012 //0.11 //0.088 //shorten wave packet - tech.wavePacketLength = 34 //32.7 //31.3 //28.8 //36 //how many wave packets are released // double this to emit 2 packets + tech.wavePacketLength = 35 //32.7 //31.3 //28.8 //36 //how many wave packets are released // double this to emit 2 packets tech.waveLengthRange = 130; } }, @@ -3976,7 +3995,7 @@ }, { name: "sentry", - description: "mines target mobs with nails over time
mines last about 12 seconds", + description: "mines target mobs with nails over time
mines last about 14 seconds", isGunTech: true, maxCount: 1, count: 0, @@ -4623,7 +4642,7 @@ }, { name: "flux pinning", - description: "blocking with your field
stuns mobs for +2 second", + description: "blocking with your field
stuns mobs for +2 second", isFieldTech: true, maxCount: 9, count: 0, @@ -4828,33 +4847,15 @@ tech.isIceField = false; } }, - { - name: "thermoelectric effect", - description: "killing mobs with ice IX gives 4 health
and 80 energy", - isFieldTech: true, - maxCount: 9, - count: 0, - frequency: 2, - allowed() { - return tech.isIceField || tech.relayIce || tech.blockingIce || tech.iceIXOnDeath - }, - requires: "ice IX", - effect() { - tech.iceEnergy++ - }, - remove() { - tech.iceEnergy = 0; - } - }, { name: "degenerate matter", - description: "reduce harm by 50%
while negative mass field is active", + description: "reduce harm by 50% while your field is active", isFieldTech: true, maxCount: 1, count: 0, frequency: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "negative mass field" && !tech.isEnergyHealth + return (m.fieldUpgrades[m.fieldMode].name === "pilot wave" || m.fieldUpgrades[m.fieldMode].name === "negative mass field") && !tech.isEnergyHealth }, requires: "negative mass field, not mass-energy", effect() { @@ -4872,7 +4873,7 @@ count: 0, frequency: 2, allowed() { - return m.fieldUpgrades[m.fieldMode].name === "negative mass field" || m.fieldUpgrades[m.fieldMode].name === "pilot wave" + return m.fieldUpgrades[m.fieldMode].name === "negative mass field" }, requires: "negative mass field", effect() { @@ -4961,7 +4962,7 @@ }, { name: "micro-extruder", - description: "plasma torch extrudes a thin hot wire
increases damage, and energy drain", + description: "plasma torch extrudes a thin hot wire
increases damage, energy drain, and lag", isFieldTech: true, maxCount: 1, count: 0, @@ -5176,7 +5177,7 @@ //************************************************** modes //************************************************** { - name: "ship", + name: "-ship-", description: "experiment: fly around with no legs
aim with the keyboard", maxCount: 1, count: 0, @@ -5194,7 +5195,7 @@ remove() {} }, { - name: "quantum leap", + name: "-quantum leap-", description: "experiment: every 20 seconds
become an alternate version of yourself", maxCount: 1, count: 0, @@ -5215,7 +5216,7 @@ remove() {} }, { - name: "shields", + name: "-shields-", description: "experiment: every 5 seconds
all mobs gain a shield", maxCount: 1, count: 0, @@ -5237,7 +5238,7 @@ remove() {} }, { - name: "Fourier analysis", + name: "-Fourier analysis-", description: "experiment: your aiming is random", maxCount: 1, count: 0, @@ -5262,7 +5263,7 @@ remove() {} }, { - name: "panopticon", + name: "-panopticon-", description: "experiment: mobs can always see you", maxCount: 1, count: 0, @@ -5287,7 +5288,7 @@ remove() {} }, { - name: "decomposers", + name: "-decomposers-", description: "experiment: after they die
mobs leave behind spawns", maxCount: 1, count: 0, @@ -5305,7 +5306,25 @@ tech.deathSpawns = 0 } }, - + { + name: "-WIMP-", + description: "experiment: harmful particles slowly chase you", + maxCount: 1, + count: 0, + frequency: 0, + isBadRandomOption: true, + isExperimentalMode: true, + allowed() { + return build.isExperimentSelection + }, + requires: "", + effect() { + tech.wimpExperiment = 3 + }, + remove() { + tech.wimpExperiment = 0 + } + }, //************************************************** //************************************************** JUNK //************************************************** tech @@ -5328,6 +5347,25 @@ // }, // remove() {} // }, + // { + // name: "WIMP", + // description: "harmful particles slowly chase you", + // maxCount: 1, + // count: 0, + // frequency: 0, + // isExperimentHide: true, + // isJunk: true, + // allowed() { + // return tech.wimpExperiment === 0 + // }, + // requires: "", + // effect() { + // tech.wimpExperiment = 3 + // }, + // remove() { + // tech.wimpExperiment = 0 + // } + // }, { name: "spinor", description: "the direction you aim is determined by your position", @@ -5368,7 +5406,7 @@ isNonRefundable: true, isJunk: true, allowed() { - return true + return tech.deathSpawns === 0 }, requires: "", effect() { @@ -6658,5 +6696,6 @@ wavePacketAmplitude: null, waveLengthRange: null, isCollisionRealitySwitch: null, - iceIXOnDeath: null + iceIXOnDeath: null, + wimpCount: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index d6feec7..1b05ca8 100644 --- a/todo.txt +++ b/todo.txt @@ -1,9 +1,32 @@ ******************************************************** NEXT PATCH ******************************************************** +ice-IX does 15% more damage +tech: WIMPs - an indestructible harmful particle slowly chases you + spawn 2-3 research at the end of each level +experimental mode : WIMPS chase you + +beating the final boss looks a bit less like death and a bit more like winning + also there are some text directions on how to enter endless mode (press T after you win) + +tech removed: 1-body problem ******************************************************** BUGS ******************************************************** +Why does micro-extruder lag so much anyway + +blue triangle boss can move backwards and aim away from you if set up properly + +HTML build system looks bad since tech does grey out + +The html build share system crashing some times +tech: strange attractor before at least 1 other tech + https://landgreen.github.io/sidescroller/index.html?&gun0=rail%20gun&tech18=correlated%20damage&tech20=strange%20attractor +&tech0=auto-loading%20heuristics as only tech + https://landgreen.github.io/sidescroller/index.html?&tech0=auto-loading%20heuristics +crashed on this +https://landgreen.github.io/sidescroller/index.html?&gun0=rail%20gun&tech1=mass%20driver&tech2=restitution&tech3=flywheel&tech4=Pauli%20exclusion&tech5=mass-energy%20equivalence&tech6=1st%20ionization%20energy&tech7=electrolytes&tech8=negative%20feedback&tech9=entropy%20exchange&tech10=anthropic%20principle&tech11=renormalization&tech12=Bayesian%20statistics&tech13=bubble%20fusion&tech14=replication&tech15=replication&tech16=futures%20exchange&tech17=commodities%20exchange&tech18=correlated%20damage&tech19=parthenogenesis&tech21=cardinality&tech22=half-wave%20rectifier&tech23=pair%20production&tech24=Lorentz%20transformation&tech25=time%20crystals&tech26=undefined&tech27=undefined&tech28=undefined&tech29=undefined&tech30=undefined&tech31=undefined&tech32=undefined&field=pilot%20wave&difficulty=6 + (once) CPT gun only rewound 0.25 seconds after a randomize run (non-unitary) had enough energy @@ -38,22 +61,24 @@ is there a way to check if the player is stuck inside the map or block ******************************************************** TODO ******************************************************** -tech: a slow moving immortal mob follows you forever - spawns at exit and just slowing moves towards player - benefit: +tech: MACHO - spawn a mob like WIMP that follows you and gives you a bonus + if it touches WIMP they explode + +let the player use research more like money + spend it to do things tech: use the ability for power ups to have custom code attracted to player attracted to other power ups explode if they touch? -make beating the final boss without undefined feel like winning, not like dieing - tech: picking up heal power ups when at full health does harm equal to the heal values benefit on pick up: get ammo get 1% duplication get 1% damage permanent + turned into drones + nail-gun, or .... 1s after being fired your bullets turn: