diff --git a/.DS_Store b/.DS_Store index 906e7a9..f0113c0 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/js/bullet.js b/js/bullet.js index 98fd86f..183f54b 100644 --- a/js/bullet.js +++ b/js/bullet.js @@ -2457,19 +2457,16 @@ const b = { this.force = Vector.mult(Vector.normalise(Vector.sub(m.pos, this.position)), this.mass * this.acceleration) } else { //close to player Matter.Body.setVelocity(this, Vector.add(Vector.mult(this.velocity, 0.90), Vector.mult(player.velocity, 0.17))); //add player's velocity - if (this.lastLookCycle < simulation.cycle && !m.isCloak) { - this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 13 : 80) - let target + this.lastLookCycle = simulation.cycle + (this.isUpgraded ? 15 : 80) for (let i = 0, len = mob.length; i < len; i++) { const dist = Vector.magnitudeSquared(Vector.sub(this.position, mob[i].position)); if (dist < 3000000 && //1400*1400 Matter.Query.ray(map, this.position, mob[i].position).length === 0 && Matter.Query.ray(body, this.position, mob[i].position).length === 0 && !mob[i].isShielded) { - target = Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)) - const SPEED = 50 - const unit = Vector.normalise(Vector.sub(target, this.position)) + const SPEED = 45 + const unit = Vector.normalise(Vector.sub(Vector.add(mob[i].position, Vector.mult(mob[i].velocity, Math.sqrt(dist) / 60)), this.position)) b.nail(this.position, Vector.mult(unit, SPEED), 0.4) this.force = Vector.mult(unit, -0.01 * this.mass) break; @@ -2577,7 +2574,7 @@ const b = { const radius = 6 + 7 * Math.random() const SPEED = 29 - radius * 0.5; //(m.crouch ? 32 : 20) - radius * 0.7; const velocity = Vector.mult(Vector.normalise(Vector.sub(target, this.position)), SPEED) - b.foam(this.position, velocity, radius + 8 * this.isUpgraded) + b.foam(this.position, velocity, radius + 7 * this.isUpgraded) break; } } @@ -2690,7 +2687,7 @@ const b = { lookFrequency: 43 + Math.floor(7 * Math.random()) - 10 * tech.isBoomBotUpgrade, acceleration: 0.005 * (1 + 0.5 * Math.random()), attackAcceleration: 0.012 + 0.005 * tech.isBoomBotUpgrade, - range: 500 * (1 + 0.1 * Math.random()) + 400 * tech.isBoomBotUpgrade, + range: 500 * (1 + 0.1 * Math.random()) + 300 * tech.isBoomBotUpgrade, endCycle: Infinity, classType: "bullet", collisionFilter: { diff --git a/js/index.js b/js/index.js index 7884b4e..46fcccd 100644 --- a/js/index.js +++ b/js/index.js @@ -300,6 +300,7 @@ const build = { if (!tech.tech[i].isExperimentHide) { if (tech.tech[i].allowed() || isAllowed || tech.tech[i].count > 0) { const isCount = tech.tech[i].count > 1 ? `(${tech.tech[i].count}x)` : ""; + if (tech.tech[i].isFieldTech) { techID.innerHTML = `
@@ -321,6 +322,8 @@ const build = { } else if (tech.tech[i].isJunk) { // text += `
  ${tech.tech[i].name} ${isCount}
${tech.tech[i].description}
` techID.innerHTML = `
  ${tech.tech[i].name} ${isCount}
${tech.tech[i].description}` + } else if (tech.tech[i].isExperimentalMode) { + techID.innerHTML = `${tech.tech[i].description}` } else { techID.innerHTML = `
  ${tech.tech[i].name} ${isCount}
${tech.tech[i].description}` } @@ -385,12 +388,14 @@ const build = { for (let i = 0, len = tech.tech.length; i < len; i++) { if (!tech.tech[i].isExperimentHide) { - if (!tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment" - text += `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}
` - // } else if (tech.tech[i].count > 1) { - // text += `
  ${tech.tech[i].name} (${tech.tech[i].count}x)
${tech.tech[i].description}
` + if (tech.tech[i].allowed()) { // || tech.tech[i].name === "+1 cardinality") { //|| tech.tech[i].name === "leveraged investment" + if (tech.tech[i].isExperimentalMode) { + text += `
${tech.tech[i].description}
` + } else { + text += `
  ${tech.tech[i].name}
${tech.tech[i].description}
` + } } else { - text += `
  ${tech.tech[i].name}
${tech.tech[i].description}
` + text += `
${tech.tech[i].name}
requires: ${tech.tech[i].requires}
` } } } diff --git a/js/level.js b/js/level.js index 665b89f..dd19012 100644 --- a/js/level.js +++ b/js/level.js @@ -113,6 +113,7 @@ const level = { if (tech.isSwitchReality) { simulation.makeTextLog(`simulation.amplitude = ${Math.random()}`); m.switchWorlds() + simulation.trails() for (let i = 0; i < 2; i++) powerUps.spawn(m.pos.x + Math.random() * 10, m.pos.y + Math.random() * 10, "tech", false); } }, @@ -1098,7 +1099,8 @@ const level = { // spawn.streamBoss(1600, -500) // spawn.cellBossCulture(1600, -500) // spawn.cellBossCulture(1600, -500) - spawn.orbitalBoss(1600, -500) + // simulation.difficulty = 66 + // spawn.orbitalBoss(1600, -500) // spawn.beamer(1200, -500) // spawn.shield(mob[mob.length - 1], 1800, -120, 1); @@ -1436,62 +1438,7 @@ const level = { spawn.wireHead(); } } else { - // const say = [] - // if (localSettings.runCount > 200) { //experienced - // say.push( - // "I've been here before...", - // "How many times have I done this?", - // ) - // } else if (localSettings.runCount < 20) { //new - // say.push( - // "Am I still alive?", - // "And I'm back here again...", - // "Is this another simulation?", - // "I'm alive...", - // "Last time was a simulation. Is this one a simulation too?", - // ) - // } - // if (simulation.difficultyMode < 4 && localSettings.levelsClearedLastGame > 10) { //too easy - // say.push( - // "That felt too easy.
Maybe I should increase the difficulty of the simulation.", - // "That was fun, but maybe I should increase the difficulty of the simulation.", - // "I should increase the difficulty of the simulation, that didn't feel realistic.", - // ) - // } else if (simulation.difficultyMode > 3 && localSettings.levelsClearedLastGame > 10) { //great run on a hard or why - // say.push( - // "What do I do after I escape?", - // "I'm almost ready to stop these simulations and actually escape.", - // "I think I'm getting closer to something, but what?", - // "I'm getting stronger.", - // "What happens after I escape?", - // "I found a good combination of technology last time." - // ) - // } else { //resolve - // say.push( - // "I'll try some different techs this time.", - // "I've got to escape.", - // "I'll find a way out.", - // "I keep forgetting that these are just simulated escapes." - // ) - // } - // simulation.makeTextLog(say[Math.floor(say.length * Math.random())], 1000) - - const swapPeriod = 150 - const len = 30 - for (let i = 0; i < len; i++) { - setTimeout(function() { - simulation.wipe = function() { //set wipe to have trails - ctx.fillStyle = `rgba(221,221,221,${i*i*0.0005 +0.0025})`; - ctx.fillRect(0, 0, canvas.width, canvas.height); - } - }, (i) * swapPeriod); - } - - setTimeout(function() { - simulation.wipe = function() { //set wipe to normal - ctx.clearRect(0, 0, canvas.width, canvas.height); - } - }, len * swapPeriod); + simulation.trails() } } powerUps.spawnStartingPowerUps(2300, -150); diff --git a/js/player.js b/js/player.js index 06bde88..c0ede58 100644 --- a/js/player.js +++ b/js/player.js @@ -310,7 +310,11 @@ const m = { //remove all tech and count current tech total let totalTech = 0; for (let i = 0, len = tech.tech.length; i < len; i++) { - if (!tech.tech[i].isNonRefundable && tech.tech[i].name !== "quantum immortality" && tech.tech[i].name !== "many-worlds") { + if ( + !tech.tech[i].isNonRefundable && + tech.tech[i].name !== "many-worlds" && + tech.tech[i].name !== "perturbation theory" + ) { totalTech += tech.tech[i].count tech.tech[i].remove(); tech.tech[i].isLost = false @@ -323,6 +327,11 @@ const m = { tech.addLoreTechToPool(); tech.armorFromPowerUps = 0; tech.totalCount = 0; + const randomBotCount = b.totalBots() + b.zeroBotCount() + //remove all bullets, respawn bots + for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); + bullet = []; //randomize health m.health = 0.7 + Math.random() @@ -332,16 +341,11 @@ const m = { //randomize field m.setField(Math.ceil(Math.random() * (m.fieldUpgrades.length - 1))) - - //track how ammo/ ammoPack count + //track ammo/ ammoPack count let ammoCount = 0 for (let i = 0, len = b.inventory.length; i < len; i++) { if (b.guns[b.inventory[i]].ammo !== Infinity) ammoCount += b.guns[b.inventory[i]].ammo / b.guns[b.inventory[i]].ammoPack } - - //remove all bullets - for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); - bullet = []; //removes guns and ammo b.inventory = []; b.activeGun = null; @@ -353,7 +357,7 @@ const m = { //give random guns for (let i = 0; i < totalGuns; i++) b.giveGuns() - //randomize ammo based on ammo/ammopack count + //randomize ammo based on ammo/ammoPack count for (let i = 0, len = b.inventory.length; i < len; i++) { if (b.guns[b.inventory[i]].ammo !== Infinity) b.guns[b.inventory[i]].ammo = Math.max(0, Math.floor(ammoCount / b.inventory.length * b.guns[b.inventory[i]].ammoPack * (1.05 + 0.5 * (Math.random() - 0.5)))) } @@ -364,18 +368,19 @@ const m = { let options = []; for (let i = 0, len = tech.tech.length; i < len; i++) { if (tech.tech[i].count < tech.tech[i].maxCount && - !tech.tech[i].isNonRefundable && - tech.tech[i].name !== "quantum immortality" && - tech.tech[i].name !== "many-worlds" && - tech.tech[i].name !== "Born rule" && - tech.tech[i].name !== "determinism" && - tech.tech[i].allowed() - ) options.push(i); + !tech.tech[i].isBadRandomOption && + tech.tech[i].allowed() && + (!tech.tech[i].isJunk || Math.random() < 0.25)) options.push(i); + // !tech.tech[i].isNonRefundable && + // tech.tech[i].name !== "quantum immortality" && + // tech.tech[i].name !== "many-worlds" && + // tech.tech[i].name !== "perturbation theory" && } //add a new tech from options pool if (options.length > 0) tech.giveTech(options[Math.floor(Math.random() * options.length)]) } - + b.respawnBots(); + for (let i = 0; i < randomBotCount; i++) b.randomBot() simulation.makeGunHUD(); //update gun HUD simulation.updateTechHUD(); simulation.isTextLogOpen = true; @@ -384,9 +389,9 @@ const m = { if (tech.isImmortal) { //if player has the immortality buff, spawn on the same level with randomized damage //remove immortality tech - for (let i = 0; i < tech.tech.length; i++) { - if (tech.tech[i].name === "quantum immortality") tech.removeTech(i) - } + // for (let i = 0; i < tech.tech.length; i++) { + // if (tech.tech[i].name === "quantum immortality") tech.removeTech(i) + // } simulation.wipe = function() { //set wipe to have trails ctx.fillStyle = "rgba(255,255,255,0)"; @@ -483,7 +488,7 @@ const m = { harmReduction() { let dmg = 1 dmg *= m.fieldHarmReduction - + if (tech.isImmortal) dmg *= 0.84 if (tech.isHarmReduceAfterKill) dmg *= (m.lastKillCycle + 300 > m.cycle) ? 0.33 : 1.33 if (tech.healthDrain) dmg *= 1 + 2.667 * tech.healthDrain //tech.healthDrain = 0.03 at one stack //cause more damage if (tech.squirrelFx !== 1) dmg *= 1 + (tech.squirrelFx - 1) / 5 //cause more damage diff --git a/js/powerup.js b/js/powerup.js index cdb0839..92c7863 100644 --- a/js/powerup.js +++ b/js/powerup.js @@ -111,6 +111,11 @@ const powerUps = { document.getElementById("tech-anthropic").innerHTML = `-${powerUps.research.count}` } if (tech.renormalization && Math.random() < 0.37 && amount < 0) powerUps.spawn(m.pos.x, m.pos.y, "research"); + if (tech.isResearchReality && amount < 0) { + m.switchWorlds() + simulation.trails() + simulation.makeTextLog(`simulation.amplitude = ${Math.random()}`); + } if (tech.isRerollHaste) { if (powerUps.research.count === 0) { tech.researchHaste = 0.66; diff --git a/js/simulation.js b/js/simulation.js index f13a1cc..9edb2ee 100644 --- a/js/simulation.js +++ b/js/simulation.js @@ -444,6 +444,24 @@ const simulation = { restoreCamera() { ctx.restore(); }, + trails() { + const swapPeriod = 150 + const len = 30 + for (let i = 0; i < len; i++) { + setTimeout(function() { + simulation.wipe = function() { //set wipe to have trails + ctx.fillStyle = `rgba(221,221,221,${i*i*0.0005 +0.0025})`; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + }, (i) * swapPeriod); + } + + setTimeout(function() { + simulation.wipe = function() { //set wipe to normal + ctx.clearRect(0, 0, canvas.width, canvas.height); + } + }, len * swapPeriod); + }, wipe() { ctx.clearRect(0, 0, canvas.width, canvas.height); }, diff --git a/js/spawn.js b/js/spawn.js index 3a6c6ea..b6ba4b9 100644 --- a/js/spawn.js +++ b/js/spawn.js @@ -2726,7 +2726,7 @@ const spawn = { me.seeAtDistance2 = 2000000; me.accelMag = Math.floor(10 * (Math.random() + 4.5)) * 0.00001 * simulation.accelScale; me.frictionAir = 0.005; - me.accelMag = 0.00017 * simulation.accelScale; + me.accelMag = 0.00016 * simulation.accelScale; me.memory = Infinity; me.collisionFilter.mask = cat.player | cat.bullet spawn.shield(me, x, y, 1); diff --git a/js/tech.js b/js/tech.js index 4c7c1f5..50b2896 100644 --- a/js/tech.js +++ b/js/tech.js @@ -768,7 +768,7 @@ }, { name: "nail-bot upgrade", - description: "convert all your permanent bots to nail-bots
500% increased nail-bot fire rate", + description: "convert all your bots to nail-bots
500% increased nail-bot fire rate", maxCount: 1, count: 0, allowed() { @@ -809,7 +809,7 @@ }, { name: "foam-bot upgrade", - description: "convert all your permanent bots to foam-bots
250% increased foam-bot size and fire rate", + description: "convert all your bots to foam-bots
250% increased foam size and fire rate", maxCount: 1, count: 0, allowed() { @@ -850,7 +850,7 @@ }, { name: "boom-bot upgrade", - description: "convert all your permanent bots to boom-bots
250% increased explosion damage and size", + description: "convert all your bots to boom-bots
250% increased explosion damage and size", maxCount: 1, count: 0, allowed() { @@ -891,7 +891,7 @@ }, { name: "laser-bot upgrade", - description: "convert all your permanent bots to laser-bots
400% increased laser-bot laser damage", + description: "convert all your bots to laser-bots
400% increased laser-bot laser damage", maxCount: 1, count: 0, allowed() { @@ -932,7 +932,7 @@ }, { name: "orbital-bot upgrade", - description: "convert all your permanent bots to orbital-bots
increase damage by 200% and radius by 30%", + description: "convert all your bots to orbital-bots
increase damage by 200% and radius by 30%", maxCount: 1, count: 0, allowed() { @@ -983,7 +983,7 @@ }, { name: "dynamo-bot upgrade", - description: "convert your permanent bots to dynamo-bots
dynamo-bots regen 24 energy per second", + description: "convert your bots to dynamo-bots
dynamo-bots regen 24 energy per second", maxCount: 1, count: 0, allowed() { @@ -1060,6 +1060,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return b.totalBots() > 3 }, @@ -1809,16 +1810,16 @@ }, { name: "quantum immortality", - description: "after dying, continue in an alternate reality
spawn 4 research", + description: "after dying, continue in an alternate reality
reduce harm by 16%", //spawn 4 research maxCount: 1, count: 0, allowed() { - return powerUps.research.count > 1 || build.isExperimentSelection + return !tech.isSwitchReality && !tech.isResearchReality }, - requires: "at least 2 research", + requires: "not many-worlds, perturbation theory", effect() { tech.isImmortal = true; - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + Math.random() * 10, m.pos.y + Math.random() * 10, "research", false); + // for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x + Math.random() * 10, m.pos.y + Math.random() * 10, "research", false); }, remove() { tech.isImmortal = false; @@ -1826,13 +1827,13 @@ }, { name: "many-worlds", - description: "on each new level enter an alternate reality
find 2 tech power ups in that reality", + description: "each new level is an alternate reality
find 2 tech power ups in that reality", maxCount: 1, count: 0, allowed() { - return tech.isImmortal + return !tech.isImmortal && !tech.isResearchReality }, - requires: "quantum immortality", + requires: "not quantum immortality, perturbation theory", effect() { tech.isSwitchReality = true; }, @@ -1840,6 +1841,157 @@ tech.isSwitchReality = false; } }, + { + name: "decoherence", + description: "enter an alternate reality after you research
spawn 9 research immediately", + maxCount: 1, + count: 0, + allowed() { + return !tech.isImmortal && !tech.isSwitchReality + }, + requires: "not quantum immortality, many-worlds", + effect() { + tech.isResearchReality = true; + for (let i = 0; i < 9; i++) powerUps.spawn(m.pos.x + Math.random() * 10, m.pos.y + Math.random() * 10, "research", false); + }, + remove() { + tech.isResearchReality = false; + } + }, + { + name: "renormalization", + description: "using a research for any purpose
has a 37% chance to spawn a research", + maxCount: 1, + count: 0, + allowed() { + return (powerUps.research.count > 1 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste + }, + requires: "not superdeterminism or Ψ(t) collapse
at least 2 research", + effect() { + tech.renormalization = true; + }, + remove() { + tech.renormalization = false; + } + }, + { + name: "erase", + description: "researched or canceled tech won't reoccur
spawn 5 research", + maxCount: 1, + count: 0, + allowed() { + return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism + }, + requires: "not determinism, at least 3 research", + effect() { + tech.isBanish = true + for (let i = 0; i < 5; i++) powerUps.spawn(m.pos.x, m.pos.y, "research", false); + }, + remove() { + tech.isBanish = false + powerUps.tech.banishLog = [] //reset banish log + } + }, + { + name: "Ψ(t) collapse", + description: "66% decreased delay after firing
when you have no research in your inventory", + maxCount: 1, + count: 0, + allowed() { + return powerUps.research.count === 0 && !tech.manyWorlds + }, + requires: "no research", + effect() { + tech.isRerollHaste = true; + tech.researchHaste = 0.33; + b.setFireCD(); + }, + remove() { + tech.isRerollHaste = false; + tech.researchHaste = 1; + b.setFireCD(); + } + }, + { + name: "ansatz", + description: "after choosing a field, tech, or gun
if you have no research spawn 2", + maxCount: 1, + count: 0, + allowed() { + return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste + }, + requires: "not superdeterminism or Ψ(t) collapse
no research", + effect: () => { + tech.manyWorlds = true; + }, + remove() { + tech.manyWorlds = false; + } + }, + { + name: "Bayesian statistics", + description: "increase damage by 3.9%
for each research in your inventory", + maxCount: 1, + count: 0, + allowed() { + return powerUps.research.count > 4 || build.isExperimentSelection + }, + requires: "at least 5 research", + effect() { + tech.isRerollDamage = true; + }, + remove() { + tech.isRerollDamage = false; + } + }, + { + name: "Born rule", + description: "remove all current tech
spawn new tech to replace them", + maxCount: 1, + count: 0, + // isNonRefundable: true, + isBadRandomOption: true, + isExperimentHide: true, + allowed() { + return (tech.totalCount > 6) + }, + requires: "more than 6 tech", + effect: () => { + //remove active bullets //to get rid of bots + for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); + bullet = []; + let count = 0 //count tech + for (let i = 0, len = tech.tech.length; i < len; i++) { // spawn new tech power ups + if (!tech.tech[i].isNonRefundable) count += tech.tech[i].count + } + if (tech.isDeterminism) count -= 3 //remove the bonus tech + if (tech.isSuperDeterminism) count -= 2 //remove the bonus tech + + tech.setupAllTech(); // remove all tech + tech.addLoreTechToPool(); + for (let i = 0; i < count; i++) { // spawn new tech power ups + powerUps.spawn(m.pos.x, m.pos.y, "tech"); + } + //have state is checked in m.death() + }, + remove() {} + }, + { + name: "perpetual research", + description: "find 1 research at the start of each level", + maxCount: 1, + count: 0, + 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: "bubble fusion", description: "after destroying a mob's shield
spawn 1-2 heals, ammo, or research", @@ -2133,6 +2285,7 @@ maxCount: 1, count: 0, isNonRefundable: true, + isBadRandomOption: true, allowed() { return !tech.isExtraChoice && !tech.isCancelDuplication && !tech.isCancelRerolls }, @@ -2152,6 +2305,7 @@ maxCount: 1, count: 0, isNonRefundable: true, + isBadRandomOption: true, allowed() { return tech.isDeterminism && !tech.manyWorlds && !tech.isGunSwitchField }, @@ -2166,139 +2320,6 @@ tech.isSuperDeterminism = false; } }, - { - name: "Ψ(t) collapse", - description: "66% decreased delay after firing
when you have no research in your inventory", - maxCount: 1, - count: 0, - allowed() { - return powerUps.research.count === 0 && !tech.manyWorlds - }, - requires: "no research", - effect() { - tech.isRerollHaste = true; - tech.researchHaste = 0.33; - b.setFireCD(); - }, - remove() { - tech.isRerollHaste = false; - tech.researchHaste = 1; - b.setFireCD(); - } - }, - { - name: "ansatz", - description: "after choosing a field, tech, or gun
if you have no research spawn 2", - maxCount: 1, - count: 0, - allowed() { - return powerUps.research.count === 0 && !tech.isSuperDeterminism && !tech.isRerollHaste - }, - requires: "not superdeterminism or Ψ(t) collapse
no research", - effect: () => { - tech.manyWorlds = true; - }, - remove() { - tech.manyWorlds = false; - } - }, - { - name: "renormalization", - description: "using a research for any purpose
has a 37% chance to spawn a research", - maxCount: 1, - count: 0, - allowed() { - return (powerUps.research.count > 1 || build.isExperimentSelection) && !tech.isSuperDeterminism && !tech.isRerollHaste - }, - requires: "not superdeterminism or Ψ(t) collapse
at least 2 research", - effect() { - tech.renormalization = true; - }, - remove() { - tech.renormalization = false; - } - }, - { - name: "erase", - description: "researched or canceled tech won't reoccur
spawn 4 research", - maxCount: 1, - count: 0, - allowed() { - return (powerUps.research.count > 2 || build.isExperimentSelection) && !tech.isDeterminism - }, - requires: "not determinism, at least 3 research", - effect() { - tech.isBanish = true - for (let i = 0; i < 4; i++) powerUps.spawn(m.pos.x, m.pos.y, "research", false); - }, - remove() { - tech.isBanish = false - powerUps.tech.banishLog = [] //reset banish log - } - }, - { - name: "Bayesian statistics", - description: "increase damage by 3.9%
for each research in your inventory", - maxCount: 1, - count: 0, - allowed() { - return powerUps.research.count > 4 || build.isExperimentSelection - }, - requires: "at least 5 research", - effect() { - tech.isRerollDamage = true; - }, - remove() { - tech.isRerollDamage = false; - } - }, - { - name: "Born rule", - description: "remove all current tech
spawn new tech to replace them", - maxCount: 1, - count: 0, - // isNonRefundable: true, - isExperimentHide: true, - allowed() { - return (tech.totalCount > 6) - }, - requires: "more than 6 tech", - effect: () => { - //remove active bullets //to get rid of bots - for (let i = 0; i < bullet.length; ++i) Matter.World.remove(engine.world, bullet[i]); - bullet = []; - let count = 0 //count tech - for (let i = 0, len = tech.tech.length; i < len; i++) { // spawn new tech power ups - if (!tech.tech[i].isNonRefundable) count += tech.tech[i].count - } - if (tech.isDeterminism) count -= 3 //remove the bonus tech - if (tech.isSuperDeterminism) count -= 2 //remove the bonus tech - - tech.setupAllTech(); // remove all tech - tech.addLoreTechToPool(); - for (let i = 0; i < count; i++) { // spawn new tech power ups - powerUps.spawn(m.pos.x, m.pos.y, "tech"); - } - //have state is checked in m.death() - }, - remove() {} - }, - { - name: "perpetual research", - description: "find 1 research at the start of each level", - maxCount: 1, - count: 0, - 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 - } - }, //************************************************** //************************************************** gun //************************************************** tech @@ -3718,7 +3739,7 @@ }, { name: "bot prototypes", - description: "use nano-scale manufacturing to upgrade
all bots of a random type and build 2 of that bot", + description: "use nano-scale manufacturing to upgrade
all bots to a random type and build 2 of that bot", isFieldTech: true, maxCount: 1, count: 0, @@ -4052,7 +4073,7 @@ } }, { - name: "phase decoherence", + name: "boson composite", description: "intangible to blocks and mobs while cloaked
passing through mobs drains your energy", isFieldTech: true, maxCount: 1, @@ -4185,6 +4206,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return true }, @@ -4202,6 +4224,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return !tech.isEnergyNoAmmo }, @@ -4219,6 +4242,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return !tech.isSuperDeterminism }, @@ -4236,6 +4260,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return !tech.isSuperDeterminism }, @@ -4253,6 +4278,7 @@ count: 0, isNonRefundable: true, isExperimentHide: true, + isBadRandomOption: true, allowed() { return !tech.isSuperDeterminism }, @@ -4265,12 +4291,14 @@ }, { name: "ship", - description: "experimental mode: fly around with no legs", + description: "experimental mode: fly around with no legs
aim by rotating with keyboard", maxCount: 1, count: 0, isNonRefundable: true, + isBadRandomOption: true, + isExperimentalMode: true, allowed() { - return !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" && build.isExperimentSelection + return build.isExperimentSelection && !m.isShipMode && m.fieldUpgrades[m.fieldMode].name !== "negative mass field" }, requires: "", effect() { @@ -4278,6 +4306,26 @@ }, remove() {} }, + { + name: "quantum leap", + description: "experimental mode: every 20 seconds
become an alternate version of yourself", + maxCount: 1, + count: 0, + isNonRefundable: true, + isBadRandomOption: true, + isExperimentalMode: true, + allowed() { + return build.isExperimentSelection + }, + requires: "", + effect() { + setInterval(() => { + m.switchWorlds() + simulation.trails() + }, 20000); //every 20 sections + }, + remove() {} + }, ], addLoreTechToPool() { //adds lore tech to tech pool if (!simulation.isCheating) { @@ -4330,7 +4378,7 @@ // remove() {} // }, { - name: "sliders", + name: "quantum leap", description: "become an alternate version of yourself
every 20 seconds", maxCount: 1, count: 0, @@ -4345,6 +4393,7 @@ effect() { setInterval(() => { m.switchWorlds() + simulation.trails() }, 20000); //every 30 sections }, remove() {} @@ -5306,5 +5355,6 @@ foamFutureFire: null, isDamageAfterKill: null, isHarmReduceAfterKill: null, - isSwitchReality: null + isSwitchReality: null, + isResearchReality: null } \ No newline at end of file diff --git a/todo.txt b/todo.txt index e0d07ed..c3a93e5 100644 --- a/todo.txt +++ b/todo.txt @@ -1,14 +1,11 @@ ******************************************************** NEXT PATCH ******************************************************** -many worlds renamed to ansatz -new tech many-worlds: at the start of each new level switch realities - -removed tech: electroactive polymers - convert bots to the same type on weapon swap -all bot upgrades convert current bots to the upgraded type - only one bot upgrade allowed +tech: decoherence - switch realities after you research, spawn 9 research power ups ******************************************************** BUGS ******************************************************** +ship mode can old exit a level in the top part of the exit + use the floor of portal sensor on the player? to unstuck player (only once on my computer) once every 7 second check isn't running code @@ -339,10 +336,6 @@ redblobgames.com/articles/visibility https://github.com/Silverwolf90/2d-visibility/tree/master/src could apply to explosions, neutron bomb, player LOS -possible names for tech - holonomy - parallel transport of a vector leads to movement (applies to curved space) - Hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other. - have a mob apply a positive status effect on other mobs, heal? make it yellow @@ -369,10 +362,11 @@ n-gon outreach ideas ******************************************************** LORE ******************************************************** -cool names for tech - strange loop, perturbation theory - -voice singing with pitch? +possible names for tech + strange loop + perturbation theory + holonomy - parallel transport of a vector leads to movement (applies to curved space) + hypergolic - A hypergolic propellant combination used in a rocket engine is one whose components spontaneously ignite when they come into contact with each other. chapter 1: bot can hear audio and learns testing mode